Alexandre Julliard : ntoskrnl.exe: Implemented IoCreateDevice and IoDeleteDevice.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 16 09:10:22 CDT 2007


Module: wine
Branch: master
Commit: a2adc8881554887c03ed985a6d08c565e675e657
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a2adc8881554887c03ed985a6d08c565e675e657

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue May 15 21:41:50 2007 +0200

ntoskrnl.exe: Implemented IoCreateDevice and IoDeleteDevice.

---

 dlls/ntoskrnl.exe/Makefile.in       |    3 +
 dlls/ntoskrnl.exe/ntoskrnl.c        |  163 +++++++++++++++++++++++++++++++++++
 dlls/ntoskrnl.exe/ntoskrnl.exe.spec |    4 +-
 3 files changed, 168 insertions(+), 2 deletions(-)

diff --git a/dlls/ntoskrnl.exe/Makefile.in b/dlls/ntoskrnl.exe/Makefile.in
index 448eb1f..2e91316 100644
--- a/dlls/ntoskrnl.exe/Makefile.in
+++ b/dlls/ntoskrnl.exe/Makefile.in
@@ -6,6 +6,9 @@ MODULE    = ntoskrnl.exe
 IMPORTLIB = libntoskrnl.exe.$(IMPLIBEXT)
 IMPORTS   = kernel32 ntdll
 
+C_SRCS = \
+	ntoskrnl.c
+
 @MAKE_DLL_RULES@
 
 @DEPENDENCIES@  # everything below this line is overwritten by make depend
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
new file mode 100644
index 0000000..ae78665
--- /dev/null
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -0,0 +1,163 @@
+/*
+ * ntoskrnl.exe implementation
+ *
+ * Copyright (C) 2007 Alexandre Julliard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "config.h"
+#include "wine/port.h"
+
+#include <stdarg.h>
+
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
+#include "windef.h"
+#include "winternl.h"
+#include "ddk/wdm.h"
+#include "wine/unicode.h"
+#include "wine/server.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(ntoskrnl);
+
+static inline LPCSTR debugstr_us( const UNICODE_STRING *us )
+{
+    if (!us) return "<null>";
+    return debugstr_wn( us->Buffer, us->Length / sizeof(WCHAR) );
+}
+
+static HANDLE get_device_manager(void)
+{
+    static HANDLE device_manager;
+    HANDLE handle = 0, ret = device_manager;
+
+    if (!ret)
+    {
+        SERVER_START_REQ( create_device_manager )
+        {
+            req->access     = SYNCHRONIZE;
+            req->attributes = 0;
+            if (!wine_server_call( req )) handle = reply->handle;
+        }
+        SERVER_END_REQ;
+
+        if (!handle)
+        {
+            ERR( "failed to create the device manager\n" );
+            return 0;
+        }
+        if (!(ret = InterlockedCompareExchangePointer( &device_manager, handle, 0 )))
+            ret = handle;
+        else
+            NtClose( handle );  /* somebody beat us to it */
+    }
+    return ret;
+}
+
+
+/***********************************************************************
+ *           IoCreateDevice   (NTOSKRNL.EXE.@)
+ */
+NTSTATUS WINAPI IoCreateDevice( DRIVER_OBJECT *driver, ULONG ext_size,
+                                UNICODE_STRING *name, DEVICE_TYPE type,
+                                ULONG characteristics, BOOLEAN exclusive,
+                                DEVICE_OBJECT **ret_device )
+{
+    NTSTATUS status;
+    DEVICE_OBJECT *device;
+    HANDLE handle = 0;
+    HANDLE manager = get_device_manager();
+
+    TRACE( "(%p, %u, %s, %u, %x, %u, %p)\n",
+           driver, ext_size, debugstr_us(name), type, characteristics, exclusive, ret_device );
+
+    if (!(device = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*device) + ext_size )))
+        return STATUS_NO_MEMORY;
+
+    SERVER_START_REQ( create_device )
+    {
+        req->access     = 0;
+        req->attributes = 0;
+        req->rootdir    = 0;
+        req->manager    = manager;
+        req->user_ptr   = device;
+        if (name) wine_server_add_data( req, name->Buffer, name->Length );
+        if (!(status = wine_server_call( req ))) handle = reply->handle;
+    }
+    SERVER_END_REQ;
+
+    if (status == STATUS_SUCCESS)
+    {
+        device->DriverObject    = driver;
+        device->DeviceExtension = device + 1;
+        device->DeviceType      = type;
+        device->Reserved        = handle;
+
+        device->NextDevice   = driver->DeviceObject;
+        driver->DeviceObject = device;
+
+        *ret_device = device;
+    }
+    else HeapFree( GetProcessHeap(), 0, device );
+
+    return status;
+}
+
+
+/***********************************************************************
+ *           IoDeleteDevice   (NTOSKRNL.EXE.@)
+ */
+void WINAPI IoDeleteDevice( DEVICE_OBJECT *device )
+{
+    NTSTATUS status;
+
+    TRACE( "%p\n", device );
+
+    SERVER_START_REQ( delete_device )
+    {
+        req->handle = device->Reserved;
+        status = wine_server_call( req );
+    }
+    SERVER_END_REQ;
+
+    if (status == STATUS_SUCCESS)
+    {
+        DEVICE_OBJECT **prev = &device->DriverObject->DeviceObject;
+        while (*prev && *prev != device) prev = &(*prev)->NextDevice;
+        if (*prev) *prev = (*prev)->NextDevice;
+        NtClose( device->Reserved );
+        HeapFree( GetProcessHeap(), 0, device );
+    }
+}
+
+
+/*****************************************************
+ *           DllMain
+ */
+BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
+{
+    switch(reason)
+    {
+    case DLL_PROCESS_ATTACH:
+        DisableThreadLibraryCalls( inst );
+        break;
+    }
+    return TRUE;
+}
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index 4e6a38c..04591ba 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -336,7 +336,7 @@
 @ stub IoCompleteRequest
 @ stub IoConnectInterrupt
 @ stub IoCreateController
-@ stub IoCreateDevice
+@ stdcall IoCreateDevice(ptr long ptr long long long ptr)
 @ stub IoCreateDisk
 @ stub IoCreateDriver
 @ stub IoCreateFile
@@ -353,7 +353,7 @@
 @ stub IoCsqRemoveIrp
 @ stub IoCsqRemoveNextIrp
 @ stub IoDeleteController
-@ stub IoDeleteDevice
+@ stdcall IoDeleteDevice(ptr)
 @ stub IoDeleteDriver
 @ stub IoDeleteSymbolicLink
 @ stub IoDetachDevice




More information about the wine-cvs mailing list