[PATCH 1/4] Handle FSCTL in NtDeviceIoControlFile.
Alex Xu (Hello71)
alex_y_xu at yahoo.ca
Sun Jul 25 10:49:38 CDT 2021
DeviceIoControl check was added in [0]. At that time,
NtDeviceIoControlFile only supported CDROM. Now, NtDeviceIoControlFile
handles almost all IOCTLs except files, so it doesn't make sense to
split this handling.
[0] e5131213f63e6d9bcdeaffe9651ad6cdccec0196
---
dlls/kernel32/file.c | 25 +++++++------------------
dlls/kernelbase/file.c | 8 ++------
dlls/ntdll/unix/file.c | 4 ++++
3 files changed, 13 insertions(+), 24 deletions(-)
diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c
index 92022063ecc..4ea6bf4c986 100644
--- a/dlls/kernel32/file.c
+++ b/dlls/kernel32/file.c
@@ -423,30 +423,19 @@ BOOL WINAPI DeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode,
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);
+ 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);
+ status = NtDeviceIoControlFile(hDevice, NULL, NULL, NULL, &iosb,
+ dwIoControlCode, lpvInBuffer, cbInBuffer,
+ lpvOutBuffer, cbOutBuffer);
if (lpcbBytesReturned) *lpcbBytesReturned = iosb.Information;
}
return set_ntstatus( status );
diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c
index e0a75c2ad08..e770bf030ad 100644
--- a/dlls/kernelbase/file.c
+++ b/dlls/kernelbase/file.c
@@ -4105,12 +4105,8 @@ BOOL WINAPI DECLSPEC_HOTPATCH DeviceIoControl( HANDLE handle, DWORD code, void *
overlapped->InternalHigh = 0;
}
- if (HIWORD(code) == FILE_DEVICE_FILE_SYSTEM)
- status = NtFsControlFile( handle, event, NULL, cvalue, piosb, code,
- in_buff, in_count, out_buff, out_count );
- else
- status = NtDeviceIoControlFile( handle, event, NULL, cvalue, piosb, code,
- in_buff, in_count, out_buff, out_count );
+ status = NtDeviceIoControlFile( handle, event, NULL, cvalue, piosb, code,
+ in_buff, in_count, out_buff, out_count );
if (returned) *returned = piosb->Information;
return set_ntstatus( status );
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
index 10cbd64be70..250fe10180b 100644
--- a/dlls/ntdll/unix/file.c
+++ b/dlls/ntdll/unix/file.c
@@ -5727,6 +5727,10 @@ NTSTATUS WINAPI NtDeviceIoControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUT
switch (device)
{
+ case FILE_DEVICE_FILE_SYSTEM:
+ status = NtFsControlFile( handle, event, apc, apc_context, io, code,
+ in_buffer, in_size, out_buffer, out_size );
+ break;
case FILE_DEVICE_BEEP:
case FILE_DEVICE_NETWORK:
status = sock_ioctl( handle, event, apc, apc_context, io, code, in_buffer, in_size, out_buffer, out_size );
--
2.32.0
More information about the wine-devel
mailing list