kernel32: Use NT instead of Unix calls to identify VxD pseudo-files.

This commit is contained in:
Alexandre Julliard 2006-10-31 20:23:56 +01:00
parent 4934b7ae79
commit 7472ffd8d2
1 changed files with 14 additions and 25 deletions

View File

@ -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;
} }
} }