Module: wine Branch: master Commit: 7472ffd8d26ac21059a476ceae77441dfa3c61c3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7472ffd8d26ac21059a476ceae...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Oct 31 20:23:56 2006 +0100
kernel32: Use NT instead of Unix calls to identify VxD pseudo-files.
---
dlls/kernel32/vxd.c | 39 ++++++++++++++------------------------- 1 files changed, 14 insertions(+), 25 deletions(-)
diff --git a/dlls/kernel32/vxd.c b/dlls/kernel32/vxd.c index bdb93e4..b08c020 100644 --- a/dlls/kernel32/vxd.c +++ b/dlls/kernel32/vxd.c @@ -52,11 +52,10 @@ typedef DWORD (WINAPI *VxDCallProc)(DWOR
struct vxd_module { - dev_t dev; - ino_t ino; - HANDLE handle; - HMODULE module; - DeviceIoProc proc; + LARGE_INTEGER index; + HANDLE handle; + HMODULE module; + DeviceIoProc proc; };
struct vxdcall_service @@ -134,30 +133,24 @@ static HANDLE open_vxd_handle( LPCWSTR n /* retrieve the DeviceIoControl function for a Vxd given a file handle */ static DeviceIoProc get_vxd_proc( HANDLE handle ) { - struct stat st; 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) { SetLastError( RtlNtStatusToDosError(status) ); 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 );
for (i = 0; i < MAX_VXD_MODULES; i++) { 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 ); goto done; @@ -230,8 +223,8 @@ HANDLE VXD_Open( LPCWSTR filenameW, DWOR } if (!vxd_modules[i].module) /* new one, register it */ { - struct stat st; - int fd; + IO_STATUS_BLOCK io; + FILE_INTERNAL_INFORMATION info;
/* get a file handle to the dummy file */ if (!(handle = open_vxd_handle( name ))) @@ -239,16 +232,12 @@ HANDLE VXD_Open( LPCWSTR filenameW, DWOR FreeLibrary( module ); goto done; } - wine_server_handle_to_fd( handle, 0, &fd, NULL ); - if (fstat( fd, &st ) != -1) - { - vxd_modules[i].dev = st.st_dev; - vxd_modules[i].ino = st.st_ino; - } + if (!NtQueryInformationFile( handle, &io, &info, sizeof(info), FileInternalInformation )) + vxd_modules[i].index = info.IndexNumber; + vxd_modules[i].module = module; vxd_modules[i].handle = handle; vxd_modules[i].proc = (DeviceIoProc)GetProcAddress( module, "DeviceIoControl" ); - wine_server_release_fd( handle, fd ); goto done; } }