[PATCH 2/4] ntoskrnl.exe/tests: Add some tests for IRP return values.
Zebediah Figura
z.figura12 at gmail.com
Tue Aug 6 22:48:42 CDT 2019
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/ntoskrnl.exe/tests/driver.c | 21 +++++++++
dlls/ntoskrnl.exe/tests/driver.h | 1 +
dlls/ntoskrnl.exe/tests/ntoskrnl.c | 71 ++++++++++++++++++++++++++++++
3 files changed, 93 insertions(+)
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index 125cf9b67b..3c5c1ace5c 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -1688,6 +1688,24 @@ static NTSTATUS get_fscontext(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *inf
return STATUS_SUCCESS;
}
+static NTSTATUS return_status(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
+{
+ char *buffer = irp->AssociatedIrp.SystemBuffer;
+ NTSTATUS ret;
+
+ if (!buffer)
+ return STATUS_ACCESS_VIOLATION;
+
+ if (stack->Parameters.DeviceIoControl.InputBufferLength < sizeof(DWORD)
+ || stack->Parameters.DeviceIoControl.OutputBufferLength < 3)
+ return STATUS_BUFFER_TOO_SMALL;
+
+ ret = *(DWORD *)irp->AssociatedIrp.SystemBuffer;
+ memcpy(buffer, "ghi", 3);
+ *info = 3;
+ return ret;
+}
+
static NTSTATUS test_load_driver_ioctl(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
{
BOOL *load = irp->AssociatedIrp.SystemBuffer;
@@ -1758,6 +1776,9 @@ static NTSTATUS WINAPI driver_IoControl(DEVICE_OBJECT *device, IRP *irp)
case IOCTL_WINETEST_GET_FSCONTEXT:
status = get_fscontext(irp, stack, &irp->IoStatus.Information);
break;
+ case IOCTL_WINETEST_RETURN_STATUS:
+ status = return_status(irp, stack, &irp->IoStatus.Information);
+ break;
case IOCTL_WINETEST_DETACH:
IoDetachDevice(lower_device);
status = STATUS_SUCCESS;
diff --git a/dlls/ntoskrnl.exe/tests/driver.h b/dlls/ntoskrnl.exe/tests/driver.h
index a468cbda9e..313d554a37 100644
--- a/dlls/ntoskrnl.exe/tests/driver.h
+++ b/dlls/ntoskrnl.exe/tests/driver.h
@@ -32,6 +32,7 @@
#define IOCTL_WINETEST_GET_CREATE_COUNT CTL_CODE(FILE_DEVICE_UNKNOWN, 0x807, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_WINETEST_GET_CLOSE_COUNT CTL_CODE(FILE_DEVICE_UNKNOWN, 0x808, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_WINETEST_GET_FSCONTEXT CTL_CODE(FILE_DEVICE_UNKNOWN, 0x809, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_WINETEST_RETURN_STATUS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80a, METHOD_BUFFERED, FILE_ANY_ACCESS)
static const char teststr[] = "Wine is not an emulator";
diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
index dfd0cb3ba6..c701cf21d8 100644
--- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
@@ -21,6 +21,8 @@
*/
#include <stdio.h>
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
#include "windows.h"
#include "winsvc.h"
#include "winioctl.h"
@@ -388,6 +390,74 @@ static void test_file_handles(void)
ok(count == 3, "got %u\n", count);
}
+static void test_return_status(void)
+{
+ NTSTATUS status;
+ char buffer[7];
+ DWORD ret_size;
+ BOOL ret;
+
+ strcpy(buffer, "abcdef");
+ status = STATUS_SUCCESS;
+ SetLastError(0xdeadbeef);
+ ret = DeviceIoControl(device, IOCTL_WINETEST_RETURN_STATUS, &status,
+ sizeof(status), buffer, sizeof(buffer), &ret_size, NULL);
+ ok(ret, "ioctl failed\n");
+ ok(GetLastError() == 0xdeadbeef, "got error %u\n", GetLastError());
+ ok(!strcmp(buffer, "ghidef"), "got buffer %s\n", buffer);
+ ok(ret_size == 3, "got size %u\n", ret_size);
+
+ strcpy(buffer, "abcdef");
+ status = STATUS_TIMEOUT;
+ SetLastError(0xdeadbeef);
+ ret = DeviceIoControl(device, IOCTL_WINETEST_RETURN_STATUS, &status,
+ sizeof(status), buffer, sizeof(buffer), &ret_size, NULL);
+ todo_wine ok(ret, "ioctl failed\n");
+ todo_wine ok(GetLastError() == 0xdeadbeef, "got error %u\n", GetLastError());
+ ok(!strcmp(buffer, "ghidef"), "got buffer %s\n", buffer);
+ ok(ret_size == 3, "got size %u\n", ret_size);
+
+ strcpy(buffer, "abcdef");
+ status = 0x0eadbeef;
+ SetLastError(0xdeadbeef);
+ ret = DeviceIoControl(device, IOCTL_WINETEST_RETURN_STATUS, &status,
+ sizeof(status), buffer, sizeof(buffer), &ret_size, NULL);
+ todo_wine ok(ret, "ioctl failed\n");
+ todo_wine ok(GetLastError() == 0xdeadbeef, "got error %u\n", GetLastError());
+ ok(!strcmp(buffer, "ghidef"), "got buffer %s\n", buffer);
+ ok(ret_size == 3, "got size %u\n", ret_size);
+
+ strcpy(buffer, "abcdef");
+ status = 0x4eadbeef;
+ SetLastError(0xdeadbeef);
+ ret = DeviceIoControl(device, IOCTL_WINETEST_RETURN_STATUS, &status,
+ sizeof(status), buffer, sizeof(buffer), &ret_size, NULL);
+ todo_wine ok(ret, "ioctl failed\n");
+ todo_wine ok(GetLastError() == 0xdeadbeef, "got error %u\n", GetLastError());
+ ok(!strcmp(buffer, "ghidef"), "got buffer %s\n", buffer);
+ ok(ret_size == 3, "got size %u\n", ret_size);
+
+ strcpy(buffer, "abcdef");
+ status = 0x8eadbeef;
+ SetLastError(0xdeadbeef);
+ ret = DeviceIoControl(device, IOCTL_WINETEST_RETURN_STATUS, &status,
+ sizeof(status), buffer, sizeof(buffer), &ret_size, NULL);
+ ok(!ret, "ioctl succeeded\n");
+ ok(GetLastError() == ERROR_MR_MID_NOT_FOUND, "got error %u\n", GetLastError());
+ todo_wine ok(!strcmp(buffer, "ghidef"), "got buffer %s\n", buffer);
+ todo_wine ok(ret_size == 3, "got size %u\n", ret_size);
+
+ strcpy(buffer, "abcdef");
+ status = 0xceadbeef;
+ SetLastError(0xdeadbeef);
+ ret = DeviceIoControl(device, IOCTL_WINETEST_RETURN_STATUS, &status,
+ sizeof(status), buffer, sizeof(buffer), &ret_size, NULL);
+ ok(!ret, "ioctl succeeded\n");
+ ok(GetLastError() == ERROR_MR_MID_NOT_FOUND, "got error %u\n", GetLastError());
+ ok(!strcmp(buffer, "abcdef"), "got buffer %s\n", buffer);
+ todo_wine ok(ret_size == 3, "got size %u\n", ret_size);
+}
+
static void test_driver3(void)
{
char filename[MAX_PATH];
@@ -440,6 +510,7 @@ START_TEST(ntoskrnl)
test_overlapped();
test_load_driver(service2);
test_file_handles();
+ test_return_status();
/* We need a separate ioctl to call IoDetachDevice(); calling it in the
* driver unload routine causes a live-lock. */
--
2.22.0
More information about the wine-devel
mailing list