ntdll/kernel32: #31

Eric Pouech pouech-eric at wanadoo.fr
Sat Jun 21 09:43:42 CDT 2003


(I intentionally didn't send the #30 yet, because it depends on 
application of #29)

- started implementing ntdll.NtDeviceIoControlFile and made 
kernel32.DeviceIoControl call it
- changed cdrom ioctl function's prototype to stick to 
ntdll.NtDeviceIoControlFile signature

A+
-- 
Eric Pouech
-------------- next part --------------
diff -u -N -r -x '*~' -x '.#*' -x CVS dlls/ntdll30/cdrom.c dlls/ntdll/cdrom.c
--- dlls/ntdll30/cdrom.c	2003-06-14 09:21:27.000000000 +0200
+++ dlls/ntdll/cdrom.c	2003-06-14 09:20:39.000000000 +0200
@@ -615,12 +615,14 @@
 #ifdef ENOMEDIUM
     case ENOMEDIUM:
 #endif
-	    return STATUS_NO_MEDIA_IN_DEVICE;
+        return STATUS_NO_MEDIA_IN_DEVICE;
     case EPERM:
-	    return STATUS_ACCESS_DENIED;
+        return STATUS_ACCESS_DENIED;
     case EINVAL:
-	    return STATUS_INVALID_PARAMETER;
+        return STATUS_INVALID_PARAMETER;
     /* case EBADF: Bad file descriptor */
+    case EOPNOTSUPP:
+        return STATUS_NOT_SUPPORTED;
     }
     FIXME("Unmapped error code %d: %s\n", errno, strerror(errno));
     return STATUS_IO_DEVICE_ERROR;
@@ -1684,20 +1686,23 @@
  *
  *
  */
-NTSTATUS CDROM_DeviceIoControl(DWORD clientID, HANDLE hDevice, DWORD dwIoControlCode,
+NTSTATUS CDROM_DeviceIoControl(DWORD clientID, HANDLE hDevice, 
+                               HANDLE hEvent, PIO_APC_ROUTINE UserApcRoutine,
+                               PVOID UserApcContext, 
+                               PIO_STATUS_BLOCK piosb, 
+                               ULONG dwIoControlCode,
                                LPVOID lpInBuffer, DWORD nInBufferSize,
-                               LPVOID lpOutBuffer, DWORD nOutBufferSize,
-                               LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped)
+                               LPVOID lpOutBuffer, DWORD nOutBufferSize)
 {
     DWORD       sz;
     NTSTATUS    status = STATUS_SUCCESS;
     int         dev;
 
-    TRACE("%lx[%c] %s %lx %ld %lx %ld %lx %lx\n",
+    TRACE("%lx[%c] %s %lx %ld %lx %ld %p\n",
           (DWORD)hDevice, 'A' + LOWORD(clientID), iocodex(dwIoControlCode), (DWORD)lpInBuffer, nInBufferSize,
-          (DWORD)lpOutBuffer, nOutBufferSize, (DWORD)lpBytesReturned, (DWORD)lpOverlapped);
+          (DWORD)lpOutBuffer, nOutBufferSize, piosb);
 
-    if (lpBytesReturned) *lpBytesReturned = 0;
+    piosb->Information = 0;
 
     if ((status = CDROM_Open(hDevice, clientID, &dev))) goto error;
 
@@ -1889,13 +1894,10 @@
         break;
     }
  error:
-    if (lpOverlapped)
-    {
-        lpOverlapped->Internal = status;
-        lpOverlapped->InternalHigh = sz;
-        NtSetEvent(lpOverlapped->hEvent, NULL);
-    }
-    if (lpBytesReturned) *lpBytesReturned = sz;
+    piosb->u.Status = status;
+    piosb->Information = sz;
+    if (hEvent) NtSetEvent(hEvent, NULL);
+
     CDROM_Close(clientID);
     return status;
 }
diff -u -N -r -x '*~' -x '.#*' -x CVS dlls/ntdll30/file.c dlls/ntdll/file.c
--- dlls/ntdll30/file.c	2003-06-21 14:34:32.000000000 +0200
+++ dlls/ntdll/file.c	2003-06-21 16:37:18.000000000 +0200
@@ -392,6 +392,7 @@
           hFile,hEvent,apc,apc_user,io_status,buffer,length,offset,key);
 
     io_status->Information = 0;
+
     io_status->u.Status = FILE_GetUnixHandleType( hFile, GENERIC_READ, &type, &flags, &unix_handle );
     if (io_status->u.Status) return io_status->u.Status;
 
@@ -644,22 +645,51 @@
  *		NtDeviceIoControlFile			[NTDLL.@]
  *		ZwDeviceIoControlFile			[NTDLL.@]
  */
-NTSTATUS WINAPI NtDeviceIoControlFile(
-	IN HANDLE DeviceHandle,
-	IN HANDLE Event OPTIONAL,
-	IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
-	IN PVOID UserApcContext OPTIONAL,
-	OUT PIO_STATUS_BLOCK IoStatusBlock,
-	IN ULONG IoControlCode,
-	IN PVOID InputBuffer,
-	IN ULONG InputBufferSize,
-	OUT PVOID OutputBuffer,
-	IN ULONG OutputBufferSize)
-{
-	FIXME("(%p,%p,%p,%p,%p,0x%08lx,%p,0x%08lx,%p,0x%08lx): empty stub\n",
-	DeviceHandle, Event, UserApcRoutine, UserApcContext,
-	IoStatusBlock, IoControlCode, InputBuffer, InputBufferSize, OutputBuffer, OutputBufferSize);
-	return 0;
+NTSTATUS WINAPI NtDeviceIoControlFile(HANDLE DeviceHandle, HANDLE hEvent,
+                                      PIO_APC_ROUTINE UserApcRoutine, 
+                                      PVOID UserApcContext,
+                                      PIO_STATUS_BLOCK IoStatusBlock,
+                                      ULONG IoControlCode,
+                                      PVOID InputBuffer,
+                                      ULONG InputBufferSize,
+                                      PVOID OutputBuffer,
+                                      ULONG OutputBufferSize)
+{
+    DWORD               clientID = 0;
+    char                str[3];
+
+    TRACE("(%p,%p,%p,%p,%p,0x%08lx,%p,0x%08lx,%p,0x%08lx)\n",
+          DeviceHandle, hEvent, UserApcRoutine, UserApcContext,
+          IoStatusBlock, IoControlCode, 
+          InputBuffer, InputBufferSize, OutputBuffer, OutputBufferSize);
+
+    /* FIXME: clientID hack should disappear */
+    SERVER_START_REQ( get_device_id )
+    {
+        req->handle = DeviceHandle;
+        if (!wine_server_call( req )) clientID = reply->id;
+    }
+    SERVER_END_REQ;
+
+    if (!clientID) return STATUS_INVALID_PARAMETER;
+    strcpy(str,  "A:");
+    str[0] += LOBYTE(clientID);
+    
+    /* FIXME: should use the NTDLL equivalent */
+    if (GetDriveTypeA(str) == DRIVE_CDROM)
+    {
+        return CDROM_DeviceIoControl(clientID, DeviceHandle, hEvent, 
+                                     UserApcRoutine, UserApcContext, 
+                                     IoStatusBlock, IoControlCode,
+                                     InputBuffer, InputBufferSize,
+                                     OutputBuffer, OutputBufferSize);
+    }
+    
+    FIXME("Unimplemented dwIoControlCode=%08lx\n", IoControlCode);
+    IoStatusBlock->u.Status = STATUS_NOT_IMPLEMENTED;
+    IoStatusBlock->Information = 0;
+    if (hEvent) NtSetEvent(hEvent, NULL);
+    return STATUS_NOT_IMPLEMENTED;
 }
 
 /******************************************************************************
diff -u -N -r -x '*~' -x '.#*' -x CVS dlls/ntdll30/ntdll_misc.h dlls/ntdll/ntdll_misc.h
--- dlls/ntdll30/ntdll_misc.h	2003-06-21 14:30:39.000000000 +0200
+++ dlls/ntdll/ntdll_misc.h	2003-06-21 16:21:23.000000000 +0200
@@ -49,4 +49,15 @@
 {
     return NtCurrentTeb()->Peb->ProcessParameters;
 }
+
+/* Device IO */
+/* ntdll/cdrom.c.c */
+extern NTSTATUS CDROM_DeviceIoControl(DWORD clientID, HANDLE hDevice, 
+                                      HANDLE hEvent, PIO_APC_ROUTINE UserApcRoutine,
+                                      PVOID UserApcContext, 
+                                      PIO_STATUS_BLOCK piosb, 
+                                      ULONG IoControlCode,
+                                      LPVOID lpInBuffer, DWORD nInBufferSize,
+                                      LPVOID lpOutBuffer, DWORD nOutBufferSize);
+
 #endif
diff -u -N -r -x '*~' -x '.#*' -x CVS include30/file.h include/file.h
--- include30/file.h	2003-06-14 09:22:25.000000000 +0200
+++ include/file.h	2003-06-14 09:20:47.000000000 +0200
@@ -118,10 +118,4 @@
 /* win32/device.c */
 extern HANDLE DEVICE_Open( LPCWSTR filename, DWORD access, LPSECURITY_ATTRIBUTES sa );
 
-/* ntdll/cdrom.c.c */
-extern NTSTATUS CDROM_DeviceIoControl(DWORD clientID, HANDLE hDevice, DWORD dwIoControlCode,
-                                      LPVOID lpInBuffer, DWORD nInBufferSize,
-                                      LPVOID lpOutBuffer, DWORD nOutBufferSize,
-                                      LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);
-
 #endif  /* __WINE_FILE_H */
diff -u -N -r -x '*~' -x '.#*' -x CVS win3230/device.c win32/device.c
--- win3230/device.c	2003-06-21 14:31:04.000000000 +0200
+++ win32/device.c	2003-06-21 16:36:06.000000000 +0200
@@ -433,63 +433,33 @@
 		}
 	}
 	else
-	{
-                char str[3];
+	{       
+            NTSTATUS            status;
 
-                strcpy(str,  "A:");
-                str[0] += LOBYTE(clientID);
-                if (GetDriveTypeA(str) == DRIVE_CDROM)
-                {
-                    NTSTATUS status;
-                    status = CDROM_DeviceIoControl(clientID, hDevice, dwIoControlCode, lpvInBuffer, cbInBuffer,
-                                                   lpvOutBuffer, cbOutBuffer, lpcbBytesReturned,
-                                                   lpOverlapped);
-                    if (status) SetLastError(RtlNtStatusToDosError(status));
-                    return !status;
-                }
-                else switch( dwIoControlCode )
-		{
-		case FSCTL_DELETE_REPARSE_POINT:
-		case FSCTL_DISMOUNT_VOLUME:
-		case FSCTL_GET_COMPRESSION:
-		case FSCTL_GET_REPARSE_POINT:
-		case FSCTL_LOCK_VOLUME:
-		case FSCTL_QUERY_ALLOCATED_RANGES:
-		case FSCTL_SET_COMPRESSION:
-		case FSCTL_SET_REPARSE_POINT:
-		case FSCTL_SET_SPARSE:
-		case FSCTL_SET_ZERO_DATA:
-		case FSCTL_UNLOCK_VOLUME:
-		case IOCTL_DISK_CHECK_VERIFY:
-		case IOCTL_DISK_EJECT_MEDIA:
-		case IOCTL_DISK_FORMAT_TRACKS:
-		case IOCTL_DISK_GET_DRIVE_GEOMETRY:
-		case IOCTL_DISK_GET_DRIVE_LAYOUT:
-		case IOCTL_DISK_GET_MEDIA_TYPES:
-		case IOCTL_DISK_GET_PARTITION_INFO:
-		case IOCTL_DISK_LOAD_MEDIA:
-		case IOCTL_DISK_MEDIA_REMOVAL:
-		case IOCTL_DISK_PERFORMANCE:
-		case IOCTL_DISK_REASSIGN_BLOCKS:
-		case IOCTL_DISK_SET_DRIVE_LAYOUT:
-		case IOCTL_DISK_SET_PARTITION_INFO:
-		case IOCTL_DISK_VERIFY:
-		case IOCTL_SERIAL_LSRMST_INSERT:
-		case IOCTL_STORAGE_CHECK_VERIFY:
-		case IOCTL_STORAGE_EJECT_MEDIA:
-		case IOCTL_STORAGE_GET_MEDIA_TYPES:
-		case IOCTL_STORAGE_LOAD_MEDIA:
-		case IOCTL_STORAGE_MEDIA_REMOVAL:
-    			FIXME( "unimplemented dwIoControlCode=%08lx\n", dwIoControlCode);
-    			SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
-    			return FALSE;
-    			break;
-		default:
-    			FIXME( "ignored dwIoControlCode=%08lx\n",dwIoControlCode);
-    			SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
-    			return FALSE;
-    			break;
-		}
+            if (lpOverlapped)
+            {
+                status = NtDeviceIoControlFile(hDevice, lpOverlapped->hEvent, 
+                                               NULL, NULL, 
+                                               (PIO_STATUS_BLOCK)lpOverlapped,
+                                               dwIoControlCode, 
+                                               lpvInBuffer, cbInBuffer,
+                                               lpvOutBuffer, cbOutBuffer);
+                if (status) SetLastError(RtlNtStatusToDosError(status));
+                if (lpcbBytesReturned) *lpcbBytesReturned = lpOverlapped->InternalHigh;
+                return !status;
+            }
+            else
+            {
+                IO_STATUS_BLOCK     iosb;
+
+                status = NtDeviceIoControlFile(hDevice, NULL, NULL, NULL, &iosb,
+                                               dwIoControlCode, 
+                                               lpvInBuffer, cbInBuffer,
+                                               lpvOutBuffer, cbOutBuffer);
+                if (status) SetLastError(RtlNtStatusToDosError(status));
+                if (lpcbBytesReturned) *lpcbBytesReturned = iosb.Information;
+                return !status;
+            }
 	}
    	return FALSE;
 }


More information about the wine-patches mailing list