Alexandre Julliard : kernel32: Moved the DeviceIoControl function to file.c .
Alexandre Julliard
julliard at winehq.org
Fri Oct 9 09:24:10 CDT 2009
Module: wine
Branch: master
Commit: 42c5215133ac904999895e40ed422c2397c6b020
URL: http://source.winehq.org/git/wine.git/?a=commit;h=42c5215133ac904999895e40ed422c2397c6b020
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Oct 8 19:38:38 2009 +0200
kernel32: Moved the DeviceIoControl function to file.c.
---
dlls/kernel32/file.c | 77 +++++++++++++++++++++++++++++++++++
dlls/kernel32/kernel_private.h | 3 +
dlls/kernel32/vxd.c | 87 +---------------------------------------
3 files changed, 82 insertions(+), 85 deletions(-)
diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c
index 5432c31..e6d83bc 100644
--- a/dlls/kernel32/file.c
+++ b/dlls/kernel32/file.c
@@ -2310,6 +2310,83 @@ DWORD WINAPI GetCompressedFileSizeA( LPCSTR name, LPDWORD size_high )
/***********************************************************************
+ * OpenVxDHandle (KERNEL32.@)
+ *
+ * This function is supposed to return the corresponding Ring 0
+ * ("kernel") handle for a Ring 3 handle in Win9x.
+ * Evidently, Wine will have problems with this. But we try anyway,
+ * maybe it helps...
+ */
+HANDLE WINAPI OpenVxDHandle(HANDLE hHandleRing3)
+{
+ FIXME( "(%p), stub! (returning Ring 3 handle instead of Ring 0)\n", hHandleRing3);
+ return hHandleRing3;
+}
+
+
+/****************************************************************************
+ * DeviceIoControl (KERNEL32.@)
+ */
+BOOL WINAPI DeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode,
+ LPVOID lpvInBuffer, DWORD cbInBuffer,
+ LPVOID lpvOutBuffer, DWORD cbOutBuffer,
+ LPDWORD lpcbBytesReturned,
+ LPOVERLAPPED lpOverlapped)
+{
+ NTSTATUS status;
+
+ TRACE( "(%p,%x,%p,%d,%p,%d,%p,%p)\n",
+ hDevice,dwIoControlCode,lpvInBuffer,cbInBuffer,
+ lpvOutBuffer,cbOutBuffer,lpcbBytesReturned,lpOverlapped );
+
+ /* Check if this is a user defined control code for a VxD */
+
+ if (HIWORD( dwIoControlCode ) == 0 && (GetVersion() & 0x80000000))
+ {
+ DeviceIoProc proc = VXD_get_proc( hDevice );
+ if (proc) return proc( dwIoControlCode, lpvInBuffer, cbInBuffer,
+ lpvOutBuffer, cbOutBuffer, lpcbBytesReturned, lpOverlapped );
+ }
+
+ /* Not a VxD, let ntdll handle it */
+
+ if (lpOverlapped)
+ {
+ LPVOID cvalue = ((ULONG_PTR)lpOverlapped->hEvent & 1) ? NULL : lpOverlapped;
+ lpOverlapped->Internal = STATUS_PENDING;
+ lpOverlapped->InternalHigh = 0;
+ if (HIWORD(dwIoControlCode) == FILE_DEVICE_FILE_SYSTEM)
+ status = NtFsControlFile(hDevice, lpOverlapped->hEvent,
+ NULL, cvalue, (PIO_STATUS_BLOCK)lpOverlapped,
+ dwIoControlCode, lpvInBuffer, cbInBuffer,
+ lpvOutBuffer, cbOutBuffer);
+ else
+ status = NtDeviceIoControlFile(hDevice, lpOverlapped->hEvent,
+ NULL, cvalue, (PIO_STATUS_BLOCK)lpOverlapped,
+ dwIoControlCode, lpvInBuffer, cbInBuffer,
+ lpvOutBuffer, cbOutBuffer);
+ if (lpcbBytesReturned) *lpcbBytesReturned = lpOverlapped->InternalHigh;
+ }
+ else
+ {
+ IO_STATUS_BLOCK iosb;
+
+ if (HIWORD(dwIoControlCode) == FILE_DEVICE_FILE_SYSTEM)
+ status = NtFsControlFile(hDevice, NULL, NULL, NULL, &iosb,
+ dwIoControlCode, lpvInBuffer, cbInBuffer,
+ lpvOutBuffer, cbOutBuffer);
+ else
+ status = NtDeviceIoControlFile(hDevice, NULL, NULL, NULL, &iosb,
+ dwIoControlCode, lpvInBuffer, cbInBuffer,
+ lpvOutBuffer, cbOutBuffer);
+ if (lpcbBytesReturned) *lpcbBytesReturned = iosb.Information;
+ }
+ if (status) SetLastError( RtlNtStatusToDosError(status) );
+ return !status;
+}
+
+
+/***********************************************************************
* OpenFile (KERNEL32.@)
*/
HFILE WINAPI OpenFile( LPCSTR name, OFSTRUCT *ofs, UINT mode )
diff --git a/dlls/kernel32/kernel_private.h b/dlls/kernel32/kernel_private.h
index 1de1163..ec8dbda 100644
--- a/dlls/kernel32/kernel_private.h
+++ b/dlls/kernel32/kernel_private.h
@@ -93,6 +93,9 @@ extern DWORD MODULE_GetBinaryType( HANDLE hfile, void **res_start, void **res_en
extern BOOL NLS_IsUnicodeOnlyLcid(LCID);
+/* vxd.c */
+typedef BOOL (WINAPI *DeviceIoProc)(DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPOVERLAPPED);
+extern DeviceIoProc VXD_get_proc( HANDLE handle );
extern HANDLE VXD_Open( LPCWSTR filename, DWORD access, LPSECURITY_ATTRIBUTES sa );
/* environ.c */
diff --git a/dlls/kernel32/vxd.c b/dlls/kernel32/vxd.c
index deb9560..d8b8dc3 100644
--- a/dlls/kernel32/vxd.c
+++ b/dlls/kernel32/vxd.c
@@ -39,6 +39,7 @@
#include "winerror.h"
#include "winternl.h"
#include "winioctl.h"
+#include "kernel_private.h"
#include "kernel16_private.h"
#include "wine/library.h"
#include "wine/unicode.h"
@@ -47,7 +48,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(vxd);
-typedef BOOL (WINAPI *DeviceIoProc)(DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPOVERLAPPED);
typedef DWORD (WINAPI *VxDCallProc)(DWORD, CONTEXT86 *);
struct vxd_module
@@ -134,7 +134,7 @@ static HANDLE open_vxd_handle( LPCWSTR name )
}
/* retrieve the DeviceIoControl function for a Vxd given a file handle */
-static DeviceIoProc get_vxd_proc( HANDLE handle )
+DeviceIoProc VXD_get_proc( HANDLE handle )
{
DeviceIoProc ret = NULL;
int status, i;
@@ -299,86 +299,3 @@ void WINAPI __regs_VxDCall( DWORD service, CONTEXT86 *context )
#ifdef DEFINE_REGS_ENTRYPOINT
DEFINE_REGS_ENTRYPOINT( VxDCall, 1 )
#endif
-
-
-/***********************************************************************
- * OpenVxDHandle (KERNEL32.@)
- *
- * This function is supposed to return the corresponding Ring 0
- * ("kernel") handle for a Ring 3 handle in Win9x.
- * Evidently, Wine will have problems with this. But we try anyway,
- * maybe it helps...
- */
-HANDLE WINAPI OpenVxDHandle(HANDLE hHandleRing3)
-{
- FIXME( "(%p), stub! (returning Ring 3 handle instead of Ring 0)\n", hHandleRing3);
- return hHandleRing3;
-}
-
-
-/****************************************************************************
- * DeviceIoControl (KERNEL32.@)
- * This is one of those big ugly nasty procedure which can do
- * a million and one things when it comes to devices. It can also be
- * used for VxD communication.
- *
- * A return value of FALSE indicates that something has gone wrong which
- * GetLastError can decipher.
- */
-BOOL WINAPI DeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode,
- LPVOID lpvInBuffer, DWORD cbInBuffer,
- LPVOID lpvOutBuffer, DWORD cbOutBuffer,
- LPDWORD lpcbBytesReturned,
- LPOVERLAPPED lpOverlapped)
-{
- NTSTATUS status;
-
- TRACE( "(%p,%x,%p,%d,%p,%d,%p,%p)\n",
- hDevice,dwIoControlCode,lpvInBuffer,cbInBuffer,
- lpvOutBuffer,cbOutBuffer,lpcbBytesReturned,lpOverlapped );
-
- /* Check if this is a user defined control code for a VxD */
-
- if (HIWORD( dwIoControlCode ) == 0 && (GetVersion() & 0x80000000))
- {
- DeviceIoProc proc = get_vxd_proc( hDevice );
- if (proc) return proc( dwIoControlCode, lpvInBuffer, cbInBuffer,
- lpvOutBuffer, cbOutBuffer, lpcbBytesReturned, lpOverlapped );
- }
-
- /* Not a VxD, let ntdll handle it */
-
- if (lpOverlapped)
- {
- LPVOID cvalue = ((ULONG_PTR)lpOverlapped->hEvent & 1) ? NULL : lpOverlapped;
- lpOverlapped->Internal = STATUS_PENDING;
- lpOverlapped->InternalHigh = 0;
- if (HIWORD(dwIoControlCode) == FILE_DEVICE_FILE_SYSTEM)
- status = NtFsControlFile(hDevice, lpOverlapped->hEvent,
- NULL, cvalue, (PIO_STATUS_BLOCK)lpOverlapped,
- dwIoControlCode, lpvInBuffer, cbInBuffer,
- lpvOutBuffer, cbOutBuffer);
- else
- status = NtDeviceIoControlFile(hDevice, lpOverlapped->hEvent,
- NULL, cvalue, (PIO_STATUS_BLOCK)lpOverlapped,
- dwIoControlCode, lpvInBuffer, cbInBuffer,
- lpvOutBuffer, cbOutBuffer);
- if (lpcbBytesReturned) *lpcbBytesReturned = lpOverlapped->InternalHigh;
- }
- else
- {
- IO_STATUS_BLOCK iosb;
-
- if (HIWORD(dwIoControlCode) == FILE_DEVICE_FILE_SYSTEM)
- status = NtFsControlFile(hDevice, NULL, NULL, NULL, &iosb,
- dwIoControlCode, lpvInBuffer, cbInBuffer,
- lpvOutBuffer, cbOutBuffer);
- else
- status = NtDeviceIoControlFile(hDevice, NULL, NULL, NULL, &iosb,
- dwIoControlCode, lpvInBuffer, cbInBuffer,
- lpvOutBuffer, cbOutBuffer);
- if (lpcbBytesReturned) *lpcbBytesReturned = iosb.Information;
- }
- if (status) SetLastError( RtlNtStatusToDosError(status) );
- return !status;
-}
More information about the wine-cvs
mailing list