[KMTESTS]
authorThomas Faber <thomas.faber@reactos.org>
Sun, 21 Apr 2013 18:53:51 +0000 (18:53 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Sun, 21 Apr 2013 18:53:51 +0000 (18:53 +0000)
- Add KmtSendWStringToDriver to easily send unicode strings to special-purpose drivers
- Add TESTENTRY_NO_EXCLUSIVE_DEVICE flag for non-exclusive devices in special-purpose drivers
ROSTESTS-104

svn path=/trunk/; revision=58812

rostests/kmtests/include/kmt_test.h
rostests/kmtests/kmtest/support.c
rostests/kmtests/kmtest_drv/kmtest_standalone.c

index a756b92..d9ed2d8 100644 (file)
@@ -66,6 +66,7 @@ typedef enum
     TESTENTRY_NO_CREATE_DEVICE = 1,
     TESTENTRY_NO_REGISTER_DISPATCH = 2,
     TESTENTRY_NO_REGISTER_UNLOAD = 4,
+    TESTENTRY_NO_EXCLUSIVE_DEVICE = 8,
 } KMT_TESTENTRY_FLAGS;
 
 NTSTATUS TestEntry(IN PDRIVER_OBJECT DriverObject, IN PCUNICODE_STRING RegistryPath, OUT PCWSTR *DeviceName, IN OUT INT *Flags);
@@ -98,6 +99,7 @@ VOID KmtCloseDriver(VOID);
 
 DWORD KmtSendToDriver(IN DWORD ControlCode);
 DWORD KmtSendStringToDriver(IN DWORD ControlCode, IN PCSTR String);
+DWORD KmtSendWStringToDriver(IN DWORD ControlCode, IN PCWSTR String);
 DWORD KmtSendBufferToDriver(IN DWORD ControlCode, IN OUT PVOID Buffer OPTIONAL, IN DWORD InLength, IN OUT PDWORD OutLength);
 #else /* if !defined KMT_KERNEL_MODE && !defined KMT_USER_MODE */
 #error either KMT_KERNEL_MODE or KMT_USER_MODE must be defined
index 4883382..c45c4e4 100644 (file)
@@ -187,6 +187,31 @@ KmtSendStringToDriver(
     return ERROR_SUCCESS;
 }
 
+/**
+ * @name KmtSendStringToDriver
+ *
+ * Unload special-purpose driver (stop the service)
+ *
+ * @param ControlCode
+ * @param String
+ *
+ * @return Win32 error code as returned by DeviceIoControl
+ */
+DWORD
+KmtSendWStringToDriver(
+    IN DWORD ControlCode,
+    IN PCWSTR String)
+{
+    DWORD BytesRead;
+
+    assert(ControlCode < 0x400);
+
+    if (!DeviceIoControl(TestDeviceHandle, KMT_MAKE_CODE(ControlCode), (PVOID)String, (DWORD)wcslen(String) * sizeof(WCHAR), NULL, 0, &BytesRead, NULL))
+        return GetLastError();
+
+    return ERROR_SUCCESS;
+}
+
 /**
  * @name KmtSendBufferToDriver
  *
index d76c4a6..d59f46d 100644 (file)
@@ -122,7 +122,8 @@ DriverEntry(
         Status = IoCreateDevice(DriverObject, 0, &DeviceName,
                                 FILE_DEVICE_UNKNOWN,
                                 FILE_DEVICE_SECURE_OPEN | FILE_READ_ONLY_DEVICE,
-                                TRUE, &TestDeviceObject);
+                                Flags & TESTENTRY_NO_EXCLUSIVE_DEVICE ? FALSE : TRUE,
+                                &TestDeviceObject);
 
         if (!NT_SUCCESS(Status))
         {