kernel32: Use NT instead of Unix calls to identify VxD pseudo-files.
This commit is contained in:
parent
4934b7ae79
commit
7472ffd8d2
|
@ -52,11 +52,10 @@ typedef DWORD (WINAPI *VxDCallProc)(DWORD, CONTEXT86 *);
|
||||||
|
|
||||||
struct vxd_module
|
struct vxd_module
|
||||||
{
|
{
|
||||||
dev_t dev;
|
LARGE_INTEGER index;
|
||||||
ino_t ino;
|
HANDLE handle;
|
||||||
HANDLE handle;
|
HMODULE module;
|
||||||
HMODULE module;
|
DeviceIoProc proc;
|
||||||
DeviceIoProc proc;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct vxdcall_service
|
struct vxdcall_service
|
||||||
|
@ -134,30 +133,24 @@ static HANDLE open_vxd_handle( LPCWSTR name )
|
||||||
/* retrieve the DeviceIoControl function for a Vxd given a file handle */
|
/* retrieve the DeviceIoControl function for a Vxd given a file handle */
|
||||||
static DeviceIoProc get_vxd_proc( HANDLE handle )
|
static DeviceIoProc get_vxd_proc( HANDLE handle )
|
||||||
{
|
{
|
||||||
struct stat st;
|
|
||||||
DeviceIoProc ret = NULL;
|
DeviceIoProc ret = NULL;
|
||||||
int status, i, fd;
|
int status, i;
|
||||||
|
IO_STATUS_BLOCK io;
|
||||||
|
FILE_INTERNAL_INFORMATION info;
|
||||||
|
|
||||||
status = wine_server_handle_to_fd( handle, 0, &fd, NULL );
|
status = NtQueryInformationFile( handle, &io, &info, sizeof(info), FileInternalInformation );
|
||||||
if (status)
|
if (status)
|
||||||
{
|
{
|
||||||
SetLastError( RtlNtStatusToDosError(status) );
|
SetLastError( RtlNtStatusToDosError(status) );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (fstat( fd, &st ) == -1)
|
|
||||||
{
|
|
||||||
wine_server_release_fd( handle, fd );
|
|
||||||
SetLastError( ERROR_INVALID_HANDLE );
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
wine_server_release_fd( handle, fd );
|
|
||||||
|
|
||||||
RtlEnterCriticalSection( &vxd_section );
|
RtlEnterCriticalSection( &vxd_section );
|
||||||
|
|
||||||
for (i = 0; i < MAX_VXD_MODULES; i++)
|
for (i = 0; i < MAX_VXD_MODULES; i++)
|
||||||
{
|
{
|
||||||
if (!vxd_modules[i].module) break;
|
if (!vxd_modules[i].module) break;
|
||||||
if (vxd_modules[i].dev == st.st_dev && vxd_modules[i].ino == st.st_ino)
|
if (vxd_modules[i].index.QuadPart == info.IndexNumber.QuadPart)
|
||||||
{
|
{
|
||||||
if (!(ret = vxd_modules[i].proc)) SetLastError( ERROR_INVALID_FUNCTION );
|
if (!(ret = vxd_modules[i].proc)) SetLastError( ERROR_INVALID_FUNCTION );
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -230,8 +223,8 @@ HANDLE VXD_Open( LPCWSTR filenameW, DWORD access, SECURITY_ATTRIBUTES *sa )
|
||||||
}
|
}
|
||||||
if (!vxd_modules[i].module) /* new one, register it */
|
if (!vxd_modules[i].module) /* new one, register it */
|
||||||
{
|
{
|
||||||
struct stat st;
|
IO_STATUS_BLOCK io;
|
||||||
int fd;
|
FILE_INTERNAL_INFORMATION info;
|
||||||
|
|
||||||
/* get a file handle to the dummy file */
|
/* get a file handle to the dummy file */
|
||||||
if (!(handle = open_vxd_handle( name )))
|
if (!(handle = open_vxd_handle( name )))
|
||||||
|
@ -239,16 +232,12 @@ HANDLE VXD_Open( LPCWSTR filenameW, DWORD access, SECURITY_ATTRIBUTES *sa )
|
||||||
FreeLibrary( module );
|
FreeLibrary( module );
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
wine_server_handle_to_fd( handle, 0, &fd, NULL );
|
if (!NtQueryInformationFile( handle, &io, &info, sizeof(info), FileInternalInformation ))
|
||||||
if (fstat( fd, &st ) != -1)
|
vxd_modules[i].index = info.IndexNumber;
|
||||||
{
|
|
||||||
vxd_modules[i].dev = st.st_dev;
|
|
||||||
vxd_modules[i].ino = st.st_ino;
|
|
||||||
}
|
|
||||||
vxd_modules[i].module = module;
|
vxd_modules[i].module = module;
|
||||||
vxd_modules[i].handle = handle;
|
vxd_modules[i].handle = handle;
|
||||||
vxd_modules[i].proc = (DeviceIoProc)GetProcAddress( module, "DeviceIoControl" );
|
vxd_modules[i].proc = (DeviceIoProc)GetProcAddress( module, "DeviceIoControl" );
|
||||||
wine_server_release_fd( handle, fd );
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue