Implement some ntoskrnl functions and stub others.

crwulff (none) crwulff at cybertron.
Tue Dec 18 21:43:14 CST 2007


---
 dlls/ntoskrnl.exe/ntoskrnl.c        |  443 ++++++++++++++++++++++++++++++++++-
 dlls/ntoskrnl.exe/ntoskrnl.exe.spec |   58 +++---
 include/ddk/wdm.h                   |  341 +++++++++++++++++++++++++++
 3 files changed, 805 insertions(+), 37 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 8ef06a8..474c9cb 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -35,10 +35,13 @@
 #include "wine/unicode.h"
 #include "wine/server.h"
 #include "wine/debug.h"
+#include "wine/exception.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(ntoskrnl);
 WINE_DECLARE_DEBUG_CHANNEL(relay);
+WINE_DECLARE_DEBUG_CHANNEL(seh);
 
+#define PAGE_SIZE 4096
 
 KSYSTEM_TIME KeTickCount;
 
@@ -191,7 +194,7 @@ NTSTATUS wine_ntoskrnl_main_loop( HANDLE stop_event )
     ULONG in_size = 4096, out_size = 0;
     HANDLE handles[2];
 
-    if (!(in_buff = HeapAlloc( GetProcessHeap(), 0, in_size )))
+    if (!(in_buff = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, in_size )))
     {
         ERR( "failed to allocate buffer\n" );
         return STATUS_NO_MEMORY;
@@ -230,13 +233,13 @@ NTSTATUS wine_ntoskrnl_main_loop( HANDLE stop_event )
         {
         case STATUS_SUCCESS:
             HeapFree( GetProcessHeap(), 0, out_buff );
-            if (out_size) out_buff = HeapAlloc( GetProcessHeap(), 0, out_size );
+            if (out_size) out_buff = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, out_size );
             else out_buff = NULL;
             status = process_ioctl( device, code, in_buff, in_size, out_buff, &out_size );
             break;
         case STATUS_BUFFER_OVERFLOW:
             HeapFree( GetProcessHeap(), 0, in_buff );
-            in_buff = HeapAlloc( GetProcessHeap(), 0, in_size );
+            in_buff = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, in_size );
             /* restart with larger buffer */
             break;
         case STATUS_PENDING:
@@ -250,12 +253,60 @@ NTSTATUS wine_ntoskrnl_main_loop( HANDLE stop_event )
 /***********************************************************************
  *           IoAllocateMdl  (NTOSKRNL.EXE.@)
  */
-PMDL WINAPI IoAllocateMdl( PVOID VirtualAddress, ULONG Length, BOOLEAN SecondaryBuffer, BOOLEAN ChargeQuota, PIRP Irp )
+PMDL WINAPI IoAllocateMdl( PVOID VAddr, ULONG Length,
+                           BOOLEAN SecondaryBuffer, BOOLEAN ChargeQuota,
+                           PIRP Irp )
 {
-    FIXME( "stub: %p, %u, %i, %i, %p\n", VirtualAddress, Length, SecondaryBuffer, ChargeQuota, Irp );
-    return NULL;
+    PMDL Mdl = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MDL) +
+         sizeof(PFN_NUMBER)*ADDRESS_AND_SIZE_TO_SPAN_PAGES(VAddr, Length) );
+    PMDL p;
+
+    TRACE("(%p %u %u %u %p)\n", VAddr, Length, SecondaryBuffer, ChargeQuota, Irp);
+
+    if (NULL == Mdl)
+    {
+        return NULL;
+    }
+
+    Mdl->Next = NULL;
+    Mdl->Size = 0;
+    Mdl->MdlFlags = 0;
+    Mdl->MappedSystemVa = VirtualAlloc( VAddr, Length, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE|PAGE_NOCACHE );
+    Mdl->StartVa = Mdl->MappedSystemVa;
+    Mdl->ByteCount = Length;
+    Mdl->ByteOffset = (ULONG)VAddr - (ULONG)Mdl->MappedSystemVa;
+
+    /* Check if an IRP was given too */
+    if (Irp)
+    {
+        /* Check if it came with a secondary buffer */
+        if (SecondaryBuffer)
+        {
+            /* Insert the MDL at the end */
+            p = Irp->MdlAddress;
+            while (p->Next) p = p->Next;
+            p->Next = Mdl;
+        }
+        else
+        {
+            /* Otherwise, insert it directly */
+            Irp->MdlAddress = Mdl;
+        }
+    }
+ 
+    /* Return the allocated mdl */
+    return Mdl;
 }
 
+/***********************************************************************
+ *           IoFreeMdl   (NTOSKRNL.EXE.@)
+ */
+VOID WINAPI IoFreeMdl( PMDL mdl )
+{
+    TRACE("(%p)\n", mdl);
+
+    HeapFree( GetProcessHeap(), 0, mdl );
+}
 
 /***********************************************************************
  *           IoAllocateWorkItem  (NTOSKRNL.EXE.@)
@@ -263,9 +314,26 @@ PMDL WINAPI IoAllocateMdl( PVOID VirtualAddress, ULONG Length, BOOLEAN Secondary
 PIO_WORKITEM WINAPI IoAllocateWorkItem( PDEVICE_OBJECT DeviceObject )
 {
     FIXME( "stub: %p\n", DeviceObject );
+
     return NULL;
 }
 
+/***********************************************************************
+ *           IoAssignResources	(NTOSKRNL.EXE.@)
+ */
+
+NTSTATUS WINAPI IoAssignResources(
+    PUNICODE_STRING RegistryPath, PUNICODE_STRING DriverClassName,
+    PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT DeviceObject,
+    PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
+    PCM_RESOURCE_LIST *AllocatedResources )
+{
+    FIXME( "%p %p %p %p %p %p\n", RegistryPath, DriverClassName,
+           DriverObject, DeviceObject, RequestedResources,
+           AllocatedResources );
+
+    return STATUS_NOT_IMPLEMENTED;
+}
 
 /***********************************************************************
  *           IoCreateDriver   (NTOSKRNL.EXE.@)
@@ -427,6 +495,20 @@ void WINAPI IofCompleteRequest( IRP *irp, UCHAR priority_boost )
 
 
 /***********************************************************************
+ *           ObfDereferenceObject   (NTOSKRNL.EXE.@)
+ */
+#ifdef DEFINE_FASTCALL1_ENTRYPOINT
+DEFINE_FASTCALL1_ENTRYPOINT( ObfDereferenceObject )
+void WINAPI __regs_ObfDereferenceObject( PVOID Object )
+#else
+VOID WINAPI ObfDereferenceObject( PVOID Object )
+#endif
+{
+    FIXME("(%p) stub!\n", Object);
+}
+
+
+/***********************************************************************
  *           ExAllocatePool   (NTOSKRNL.EXE.@)
  */
 PVOID WINAPI ExAllocatePool( POOL_TYPE type, SIZE_T size )
@@ -450,7 +532,7 @@ PVOID WINAPI ExAllocatePoolWithQuota( POOL_TYPE type, SIZE_T size )
 PVOID WINAPI ExAllocatePoolWithTag( POOL_TYPE type, SIZE_T size, ULONG tag )
 {
     /* FIXME: handle page alignment constraints */
-    void *ret = HeapAlloc( GetProcessHeap(), 0, size );
+    void *ret = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size );
     TRACE( "%lu pool %u -> %p\n", size, type, ret );
     return ret;
 }
@@ -483,13 +565,168 @@ void WINAPI ExFreePoolWithTag( void *ptr, ULONG tag )
     HeapFree( GetProcessHeap(), 0, ptr );
 }
 
+/***********************************************************************
+ *           ExInitializeNPagedLookasideList	(NTOSKRNL.EXE.@)
+ */
+void WINAPI ExInitializeNPagedLookasideList(
+	       	PNPAGED_LOOKASIDE_LIST Lookaside,
+	       	PALLOCATE_FUNCTION Allocate, PFREE_FUNCTION Free,
+	       	ULONG Flags, SIZE_T Size, ULONG Tag, USHORT Depth)
+{
+    FIXME( "%p %p %p %u %lu %u %u\n", Lookaside, Allocate, Free, Flags, Size, Tag, Depth );
+}
+
+/***********************************************************************
+ *           ExInitializePagedLookasideList	(NTOSKRNL.EXE.@)
+ */
+void WINAPI ExInitializePagedLookasideList( 
+		PPAGED_LOOKASIDE_LIST Lookaside,
+	       	PALLOCATE_FUNCTION Allocate, PFREE_FUNCTION Free,
+	       	ULONG Flags, SIZE_T Size, ULONG Tag, USHORT Depth)
+{
+    FIXME( "%p %p %p %u %lu %u %u\n", Lookaside, Allocate, Free, Flags, Size, Tag, Depth );
+}
+
+/***********************************************************************
+ *           ExInitializeResourceLite	(NTOSKRNL.EXE.@)
+ */
+NTSTATUS WINAPI ExInitializeResourceLite( PERESOURCE Resource )
+{
+    FIXME( "%p\n", Resource );
+
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/***********************************************************************
+ *           ExInitializeZone	(NTOSKRNL.EXE.@)
+ */
+NTSTATUS WINAPI ExInitializeZone( PZONE_HEADER Zone, ULONG BlockSize,
+	       	PVOID InitialSegment, ULONG InitialSegmentSize )
+{
+    FIXME( "%p %u %p %u\n", Zone, BlockSize, InitialSegment, InitialSegmentSize );
+
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/***********************************************************************
+ *           KeInitializeEvent   (NTOSKRNL.EXE.@)
+ */
+void WINAPI KeInitializeEvent( PRKEVENT Event, EVENT_TYPE Type, BOOLEAN State )
+{
+    TRACE("(%p %d %d)\n", Event, Type, State);
+
+    /* Initialize the dispatcher header */
+    Event->Header.Type = Type;
+    Event->Header.Absolute = 0;
+    Event->Header.Inserted = 0;
+    Event->Header.Size =  sizeof(KEVENT) / sizeof(ULONG);
+    Event->Header.SignalState = State;
+}
+
+
+/***********************************************************************
+ *           KeInitializeInterrupt   (NTOSKRNL.EXE.@)
+ */
+void WINAPI KeInitializeInterrupt(
+	       	PKINTERRUPT Interrupt, PKSERVICE_ROUTINE ServiceRoutine,
+	       	PVOID ServiceContext, PKSPIN_LOCK SpinLock,
+	       	ULONG Vector, KIRQL Irql, KIRQL SynchronizeIrql,
+	       	KINTERRUPT_MODE InterruptMode, BOOLEAN ShareVector,
+	       	CHAR ProcessorNumber, BOOLEAN FloatingSave )
+{
+    FIXME("%p %p %p %p\n", Interrupt, ServiceRoutine, ServiceContext, SpinLock);
+}
+
+
+/***********************************************************************
+ *           KeInitializeSemaphore   (NTOSKRNL.EXE.@)
+ */
+void WINAPI KeInitializeSemaphore( PRKSEMAPHORE Semaphore, LONG Count, LONG Limit )
+{
+    TRACE("(%p %d %d)\n", Semaphore, Count, Limit);
+
+    /* Initialize the dispatcher header */
+    Semaphore->Header.Type = SemaphoreObject;
+    Semaphore->Header.Absolute = 0;
+    Semaphore->Header.Inserted = 0;
+    Semaphore->Header.Size =  sizeof(KSEMAPHORE) / sizeof(ULONG);
+    Semaphore->Header.SignalState = Count;
+
+    /* Set the semaphore specfic items */
+    Semaphore->Limit = Limit;
+}
+
+
+/***********************************************************************
+ *           KeInitializeSpinLock   (NTOSKRNL.EXE.@)
+ */
+void WINAPI KeInitializeSpinLock( PKSPIN_LOCK SpinLock )
+{
+    TRACE("(%p)\n", SpinLock);
+
+    *SpinLock = 0;
+}
+
+
+/***********************************************************************
+ *           KeInitializeTimerEx   (NTOSKRNL.EXE.@)
+ */
+void WINAPI KeInitializeTimerEx( PKTIMER Timer, TIMER_TYPE Type )
+{
+    TRACE("%p %u\n", Timer, Type);
+
+    /* Initialize the dispatcher header */
+    Timer->Header.Type = TimerNotificationObject + Type;
+    Timer->Header.Absolute = 0;
+    Timer->Header.Inserted = 0;
+    Timer->Header.Size =  sizeof(KTIMER) / sizeof(ULONG);
+    Timer->Header.SignalState = 0;
+
+    /* Initalize the timer specific items */
+    Timer->DueTime.QuadPart = 0;
+    InitializeListHead(&Timer->TimerListEntry);
+    Timer->Dpc = NULL;
+    Timer->Period = 0;
+}
+
 
 /***********************************************************************
  *           KeInitializeTimer   (NTOSKRNL.EXE.@)
  */
 void WINAPI KeInitializeTimer( PKTIMER Timer )
 {
-    FIXME("%p\n", Timer);
+    TRACE("(%p)\n", Timer);
+
+    KeInitializeTimerEx( Timer, 0 );
+}
+
+
+/***********************************************************************
+ *           KeInsertDeviceQueue	(NTOSKRNL.EXE.@)
+ */
+void WINAPI KeInsertDeviceQueue( PKDEVICE_QUEUE DeviceQueue,
+	       	PKDEVICE_QUEUE_ENTRY DeviceQueueEntry)
+{
+    FIXME("%p %p\n", DeviceQueue, DeviceQueueEntry);
+}
+
+
+/***********************************************************************
+ *           KeInsertHeadQueue	(NTOSKRNL.EXE.@)
+ */
+void WINAPI KeInsertHeadQueue( PKQUEUE Queue, PLIST_ENTRY Entry)
+{
+    FIXME("%p %p\n", Queue, Entry);
+}
+
+
+/***********************************************************************
+ *           KeInsertByKeyDeviceQueue	(NTOSKRNL.EXE.@)
+ */
+void WINAPI KeInsertByKeyDeviceQueue( PKDEVICE_QUEUE DeviceQueue,
+	       	PKDEVICE_QUEUE_ENTRY DeviceQueueEntry, ULONG SortKey )
+{
+    FIXME("%p %p %u\n", DeviceQueue, DeviceQueueEntry, SortKey);
 }
 
 
@@ -525,6 +762,52 @@ ULONG WINAPI KeQueryTimeIncrement(void)
 
 
 /***********************************************************************
+ *           KeReleaseSemaphore (NTOSKRNL.EXE.@)
+ */
+LONG WINAPI KeReleaseSemaphore( PRKSEMAPHORE Semaphore, KPRIORITY Inc,
+    LONG Adjustment, BOOLEAN Wait )
+{
+    FIXME("(%p %u %u %u) stub!\n", Semaphore, Inc, Adjustment, Wait);
+
+    return 0;
+}
+
+
+/***********************************************************************
+ *           KeResetEvent (NTOSKRNL.EXE.@)
+ */
+LONG WINAPI KeResetEvent( PRKEVENT Event )
+{
+    FIXME("(%p) stub!\n", Event);
+
+    return 0;
+}
+
+
+/***********************************************************************
+ *           KeSetEvent (NTOSKRNL.EXE.@)
+ */
+LONG WINAPI KeSetEvent( PRKEVENT Event, KPRIORITY Increment, BOOLEAN Wait )
+{
+    FIXME("(%p %u %u) stub!\n", Event, Increment, Wait);
+
+    return 0;
+}
+
+
+/***********************************************************************
+ *           KeWaitForSingleObject  (NTOSKRNL.EXE.@)
+ */
+NTSTATUS WINAPI KeWaitForSingleObject(PVOID Object, KWAIT_REASON Reason,
+    KPROCESSOR_MODE Mode, BOOLEAN Alertable, PLARGE_INTEGER Timeout)
+{
+    FIXME("(%p %u %u %u %p) stub!\n", Object, Reason, Mode, Alertable,
+        Timeout);
+
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/***********************************************************************
  *           MmAllocateNonCachedMemory   (NTOSKRNL.EXE.@)
  */
 PVOID WINAPI MmAllocateNonCachedMemory( SIZE_T size )
@@ -544,11 +827,155 @@ void WINAPI MmFreeNonCachedMemory( void *addr, SIZE_T size )
 }
 
 /***********************************************************************
+ *           MmIsAddressValid	(NTOSKRNL.EXE.@)
+ */
+BOOLEAN WINAPI MmIsAddressValid( void *VirtualAddress )
+{
+    TRACE("(%p)\n", VirtualAddress);
+
+    if (!VirtualAddress) return FALSE;
+
+    __TRY
+    {
+        volatile const char *p = VirtualAddress;
+        char dummy = p[0];
+    }
+    __EXCEPT_PAGE_FAULT
+    {
+        TRACE_(seh)("%p caused page fault during read\n", VirtualAddress);
+        return FALSE;
+    }
+    __ENDTRY
+
+    return TRUE;
+}
+
+/***********************************************************************
+ *           MmIsDriverVerifying	(NTOSKRNL.EXE.@)
+ */
+ULONG WINAPI MmIsDriverVerifying( struct _DRIVER_OBJECT *DriverObject )
+{
+    FIXME( "%p\n", DriverObject );
+
+    return 0;
+}
+
+/***********************************************************************
+ *           MmMapLockedPagesSpecifyCache	(NTOSKRNL.EXE.@)
+ */
+PVOID WINAPI MmMapLockedPagesSpecifyCache(
+    PMDL  MemoryDescriptorList,
+    KPROCESSOR_MODE  AccessMode,
+    MEMORY_CACHING_TYPE  CacheType,
+    PVOID  BaseAddress,
+    ULONG  BugCheckOnFailure,
+    MM_PAGE_PRIORITY  Priority )
+{
+    FIXME( "%p %u %u %p %u %u", MemoryDescriptorList, AccessMode, CacheType,
+			BaseAddress, BugCheckOnFailure, Priority );
+	
+    return MemoryDescriptorList->MappedSystemVa;
+}
+
+/***********************************************************************
+ *           MmMapLockedPagesSpecifyCache	(NTOSKRNL.EXE.@)
+ */
+PVOID WINAPI   MmMapLockedPagesWithReservedMapping (
+	    PVOID  MappingAddress,
+	    ULONG  PoolTag,
+	    PMDL  MemoryDescriptorList,
+	    MEMORY_CACHING_TYPE  CacheType )
+{
+    FIXME( "%p %u %p %u", MappingAddress, PoolTag, MemoryDescriptorList,
+			CacheType );
+	
+    return MemoryDescriptorList->MappedSystemVa;
+}
+
+/***********************************************************************
+ *           MmProbeAndLockPages	(NTOSKRNL.EXE.@)
+ */
+VOID WINAPI MmProbeAndLockPages( PMDL mdl,
+                                 KPROCESSOR_MODE AccessMode,
+                                 LOCK_OPERATION Operation )
+{
+    FIXME( "(%p %u %u) stub!\n", mdl, AccessMode, Operation );
+
+    mdl->Process = GetCurrentProcess();
+    mdl->MdlFlags |= MDL_PAGES_LOCKED;
+}
+
+
+/***********************************************************************
+ *           MmUnlockPages	(NTOSKRNL.EXE.@)
+ */
+VOID WINAPI MmUnlockPages( PMDL mdl )
+{
+    TRACE( "(%p)\n", mdl );
+
+    mdl->MdlFlags &= ~MDL_PAGES_LOCKED;
+}
+
+/***********************************************************************
+ *           ObReferenceObjectByHandle	(NTOSKRNL.EXE.@)
+ */
+NTSTATUS WINAPI ObReferenceObjectByHandle(
+	    HANDLE  Handle,
+	    ACCESS_MASK  DesiredAccess,
+	    POBJECT_TYPE  ObjectType,
+	    KPROCESSOR_MODE  AccessMode,
+	    PVOID  *Object,
+	    POBJECT_HANDLE_INFORMATION  HandleInformation )
+{
+    FIXME( "%p %u %p %u %p %p\n", Handle, DesiredAccess, ObjectType,
+    		AccessMode, Object, HandleInformation );
+    
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/***********************************************************************
+ *           ObReferenceObjectByName	(NTOSKRNL.EXE.@)
+ */
+NTSTATUS WINAPI ObReferenceObjectByName(
+		PUNICODE_STRING ObjectPath,
+		ULONG Attributes,
+		PACCESS_STATE PassedAccessState,
+		ACCESS_MASK DesiredAccess,
+		POBJECT_TYPE ObjectType,
+		KPROCESSOR_MODE AccessMode,
+		PVOID ParseContext,
+		PVOID* ObjectPtr)
+{
+    FIXME( "%p %u %p %u %p %u %p %p\n", ObjectPath, Attributes,
+    		PassedAccessState, DesiredAccess, ObjectType,
+    		AccessMode, ParseContext, ObjectPtr );
+    
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/***********************************************************************
+ *           ObReferenceObjectByPointer	(NTOSKRNL.EXE.@)
+ */
+NTSTATUS WINAPI ObReferenceObjectByPointer(
+	    PVOID  Object,
+	    ACCESS_MASK  DesiredAccess,
+	    POBJECT_TYPE  ObjectType,
+	    KPROCESSOR_MODE  AccessMode )
+{
+    FIXME( "(%p %u %p %u) stub!\n", Object, DesiredAccess, ObjectType,
+    		AccessMode );
+    
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/***********************************************************************
  *           PsCreateSystemThread   (NTOSKRNL.EXE.@)
  */
 NTSTATUS WINAPI PsCreateSystemThread(PHANDLE ThreadHandle, ULONG DesiredAccess,
 				     POBJECT_ATTRIBUTES ObjectAttributes,
 			             HANDLE ProcessHandle, PCLIENT_ID ClientId,
+
                                      PKSTART_ROUTINE StartRoutine, PVOID StartContext)
 {
     if (!ProcessHandle) ProcessHandle = GetCurrentProcess();
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index 8749d37..0562e42 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -48,7 +48,7 @@
 @ stub KefReleaseSpinLockFromDpcLevel
 @ stub KiAcquireSpinLock
 @ stub KiReleaseSpinLock
-@ stub ObfDereferenceObject
+@ stdcall ObfDereferenceObject(ptr);
 @ stub ObfReferenceObject
 @ stub RtlPrefetchMemoryNonTemporal
 @ cdecl -i386 -norelay RtlUlongByteSwap() ntdll.RtlUlongByteSwap
@@ -139,10 +139,10 @@
 @ stub ExGetExclusiveWaiterCount
 @ stub ExGetPreviousMode
 @ stub ExGetSharedWaiterCount
-@ stub ExInitializeNPagedLookasideList
-@ stub ExInitializePagedLookasideList
-@ stub ExInitializeResourceLite
-@ stub ExInitializeZone
+@ stdcall ExInitializeNPagedLookasideList(ptr ptr ptr long long long long)
+@ stdcall ExInitializePagedLookasideList(ptr ptr ptr long long long long)
+@ stdcall ExInitializeResourceLite(ptr)
+@ stdcall ExInitializeZone(ptr long ptr long)
 @ stub ExInterlockedAddLargeInteger
 @ stub ExInterlockedAddUlong
 @ stub ExInterlockedDecrementLong
@@ -314,7 +314,7 @@
 @ stub IoAllocateIrp
 @ stdcall IoAllocateMdl(ptr long long long ptr)
 @ stdcall IoAllocateWorkItem(ptr)
-@ stub IoAssignResources
+@ stdcall IoAssignResources(ptr ptr ptr ptr ptr ptr)
 @ stub IoAttachDevice
 @ stub IoAttachDeviceByPointer
 @ stub IoAttachDeviceToDeviceStack
@@ -371,14 +371,14 @@
 @ stub IoFreeController
 @ stub IoFreeErrorLogEntry
 @ stub IoFreeIrp
-@ stub IoFreeMdl
+@ stdcall IoFreeMdl(ptr)
 @ stub IoFreeWorkItem
 @ stub IoGetAttachedDevice
 @ stub IoGetAttachedDeviceReference
 @ stub IoGetBaseFileSystemDeviceObject
 @ stub IoGetBootDiskInformation
 @ stub IoGetConfigurationInformation
-@ stub IoGetCurrentProcess
+@ stdcall IoGetCurrentProcess() kernel32.GetCurrentProcess
 @ stub IoGetDeviceAttachmentBaseRef
 @ stub IoGetDeviceInterfaceAlias
 @ stub IoGetDeviceInterfaces
@@ -546,18 +546,18 @@
 @ stub KeInitializeApc
 @ stub KeInitializeDeviceQueue
 @ stub KeInitializeDpc
-@ stub KeInitializeEvent
-@ stub KeInitializeInterrupt
+@ stdcall KeInitializeEvent(ptr long long)
+@ stdcall KeInitializeInterrupt(ptr ptr ptr ptr long long long long long long)
 @ stub KeInitializeMutant
 @ stub KeInitializeMutex
 @ stub KeInitializeQueue
-@ stub KeInitializeSemaphore
-@ stub KeInitializeSpinLock
+@ stdcall KeInitializeSemaphore(ptr long long)
+@ stdcall KeInitializeSpinLock(ptr)
 @ stdcall KeInitializeTimer(ptr)
-@ stub KeInitializeTimerEx
-@ stub KeInsertByKeyDeviceQueue
-@ stub KeInsertDeviceQueue
-@ stub KeInsertHeadQueue
+@ stdcall KeInitializeTimerEx(ptr long)
+@ stdcall KeInsertByKeyDeviceQueue(ptr ptr long)
+@ stdcall KeInsertDeviceQueue(ptr ptr)
+@ stdcall KeInsertHeadQueue(ptr ptr)
 @ stub KeInsertQueue
 @ stub KeInsertQueueApc
 @ stub KeInsertQueueDpc
@@ -588,7 +588,7 @@
 @ stub KeReleaseInterruptSpinLock
 @ stub KeReleaseMutant
 @ stub KeReleaseMutex
-@ stub KeReleaseSemaphore
+@ stdcall KeReleaseSemaphore(ptr long long long)
 @ stub KeReleaseSpinLockFromDpcLevel
 @ stub KeRemoveByKeyDeviceQueue
 @ stub KeRemoveByKeyDeviceQueueIfBusy
@@ -597,7 +597,7 @@
 @ stub KeRemoveQueue
 @ stub KeRemoveQueueDpc
 @ stub KeRemoveSystemServiceTable
-@ stub KeResetEvent
+@ stdcall KeResetEvent(ptr)
 @ stub KeRestoreFloatingPointState
 @ stub KeRevertToUserAffinityThread
 @ stub KeRundownQueue
@@ -607,7 +607,7 @@
 @ stub KeSetAffinityThread
 @ stub KeSetBasePriorityThread
 @ stub KeSetDmaIoCoherency
-@ stub KeSetEvent
+@ stdcall KeSetEvent(ptr long long)
 @ stub KeSetEventBoostPriority
 @ stub KeSetIdealProcessorThread
 @ stub KeSetImportanceDpc
@@ -629,7 +629,7 @@
 @ stub KeUserModeCallback
 @ stub KeWaitForMultipleObjects
 @ stub KeWaitForMutexObject
-@ stub KeWaitForSingleObject
+@ stdcall KeWaitForSingleObject(ptr long long long ptr)
 @ stub KiBugCheckData
 @ stub KiCoprocessorError
 @ stub KiDeliverApc
@@ -679,8 +679,8 @@
 @ stub MmGetVirtualForPhysical
 @ stub MmGrowKernelStack
 @ stub MmHighestUserAddress
-@ stub MmIsAddressValid
-@ stub MmIsDriverVerifying
+@ stdcall MmIsAddressValid(ptr)
+@ stdcall MmIsDriverVerifying(ptr)
 @ stub MmIsNonPagedSystemAddressValid
 @ stub MmIsRecursiveIoFault
 @ stub MmIsThisAnNtAsSystem
@@ -690,8 +690,8 @@
 @ stub MmLockPagableSectionByHandle
 @ stub MmMapIoSpace
 @ stub MmMapLockedPages
-@ stub MmMapLockedPagesSpecifyCache
-@ stub MmMapLockedPagesWithReservedMapping
+@ stdcall MmMapLockedPagesSpecifyCache(ptr long long ptr long long)
+@ stdcall MmMapLockedPagesWithReservedMapping(ptr long ptr long)
 @ stub MmMapMemoryDumpMdl
 @ stub MmMapUserAddressesToPage
 @ stub MmMapVideoDisplay
@@ -702,7 +702,7 @@
 @ stub MmMarkPhysicalMemoryAsGood
 @ stub MmPageEntireDriver
 @ stub MmPrefetchPages
-@ stub MmProbeAndLockPages
+@ stdcall MmProbeAndLockPages(ptr long long)
 @ stub MmProbeAndLockProcessPages
 @ stub MmProbeAndLockSelectedPages
 @ stub MmProtectMdlSystemAddress
@@ -717,7 +717,7 @@
 @ stub MmSystemRangeStart
 @ stub MmTrimAllSystemPagableMemory
 @ stub MmUnlockPagableImageSection
-@ stub MmUnlockPages
+@ stdcall MmUnlockPages(ptr)
 @ stub MmUnmapIoSpace
 @ stub MmUnmapLockedPages
 @ stub MmUnmapReservedMapping
@@ -809,9 +809,9 @@
 @ stub ObOpenObjectByPointer
 @ stub ObQueryNameString
 @ stub ObQueryObjectAuditingByHandle
-@ stub ObReferenceObjectByHandle
-@ stub ObReferenceObjectByName
-@ stub ObReferenceObjectByPointer
+@ stdcall ObReferenceObjectByHandle(ptr long ptr long ptr ptr)
+@ stdcall ObReferenceObjectByName(ptr long ptr long ptr long ptr ptr)
+@ stdcall ObReferenceObjectByPointer(ptr long ptr long)
 @ stub ObReferenceSecurityDescriptor
 @ stub ObReleaseObjectSecurity
 @ stub ObSetHandleAttributes
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index 931a130..7dbb7f1 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -22,6 +22,13 @@
 
 #include <ntstatus.h>
 
+#define PAGE_ROUND_UP(x) ((((ULONG)x)|(PAGE_SIZE-1))+1)
+#define PAGE_ROUND_DOWN(x) (((ULONG)x)&(~PAGE_SIZE-1))
+
+#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size) \
+    (ULONG)((PAGE_ROUND_UP((Size) + ((ULONG_PTR)(Va))) - \
+        PAGE_ROUND_DOWN((ULONG_PTR)(Va))) / PAGE_SIZE)
+
 #ifdef _WIN64
 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
 #else
@@ -84,12 +91,55 @@ typedef struct _KDEVICE_QUEUE {
   BOOLEAN  Busy;
 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
 
+typedef struct _KQUEUE {
+  DISPATCHER_HEADER Header;
+  LIST_ENTRY EntryListHead;
+  ULONG CurrentCount;
+  ULONG MaximumCount;
+  LIST_ENTRY ThreadListHead;
+} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE;
+
+
+/* TODO: These are dummy types and need to be replaced
+ * with real definitions. */
+typedef VOID *PKINTERRUPT;
+typedef VOID *PKSERVICE_ROUTINE;
+typedef ULONG KINTERRUPT_MODE;
+typedef VOID *PZONE_HEADER;
+/* END DUMMY TYPES */
+
 typedef struct _IO_TIMER *PIO_TIMER;
 typedef struct _ETHREAD *PETHREAD;
 typedef struct _KTHREAD *PKTHREAD;
 typedef struct _EPROCESS *PEPROCESS;
 typedef struct _IO_WORKITEM *PIO_WORKITEM;
 
+typedef enum _MEMORY_CACHING_TYPE_ORIG {
+    MmFrameBufferCached = 2
+} MEMORY_CACHING_TYPE_ORIG;
+typedef enum _MEMORY_CACHING_TYPE {
+    MmNonCached = FALSE,
+    MmCached = TRUE,
+    MmWriteCombined = MmFrameBufferCached,
+    MmHardwareCoherentCached,
+    MmNonCachedUnordered,
+    MmUSWCCached,
+    MmMaximumCacheType
+} MEMORY_CACHING_TYPE;
+ 
+typedef enum _MM_PAGE_PRIORITY {
+    LowPagePriority,
+    NormalPagePriority = 16,
+    HighPagePriority = 32
+} MM_PAGE_PRIORITY;
+
+typedef enum _LOCK_OPERATION {
+	IoReadAccess,
+	IoWriteAccess,
+	IoModifyAccess
+} LOCK_OPERATION;
+
+
 #define MAXIMUM_VOLUME_LABEL_LENGTH       (32 * sizeof(WCHAR))
 
 typedef struct _VPB {
@@ -115,6 +165,9 @@ typedef enum _POOL_TYPE {
   MaxPoolType
 } POOL_TYPE;
 
+typedef PVOID (*PALLOCATE_FUNCTION)(POOL_TYPE PoolType, SIZE_T NumberOfBytes, ULONG Tag);
+typedef VOID (*PFREE_FUNCTION)(PVOID Buffer);
+
 typedef struct _WAIT_CONTEXT_BLOCK {
   KDEVICE_QUEUE_ENTRY  WaitQueueEntry;
   struct _DRIVER_CONTROL  *DeviceRoutine;
@@ -189,6 +242,8 @@ typedef struct _DRIVER_OBJECT {
 } DRIVER_OBJECT;
 typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
 
+typedef LONG KPRIORITY;
+
 /* Irp definitions */
 typedef UCHAR KIRQL, *PKIRQL;
 typedef CCHAR KPROCESSOR_MODE;
@@ -782,6 +837,32 @@ typedef struct _MDL {
   ULONG  ByteOffset;
 } MDL, *PMDL;
 
+#define MDL_MAPPED_TO_SYSTEM_VA           0x0001
+#define MDL_PAGES_LOCKED                  0x0002
+#define MDL_SOURCE_IS_NONPAGED_POOL       0x0004
+#define MDL_ALLOCATED_FIXED_SIZE          0x0008
+#define MDL_PARTIAL                       0x0010
+#define MDL_PARTIAL_HAS_BEEN_MAPPED       0x0020
+#define MDL_IO_PAGE_READ                  0x0040
+#define MDL_WRITE_OPERATION               0x0080
+#define MDL_PARENT_MAPPED_SYSTEM_VA       0x0100
+#define MDL_FREE_EXTRA_PTES               0x0200
+#define MDL_IO_SPACE                      0x0800
+#define MDL_NETWORK_HEADER                0x1000
+#define MDL_MAPPING_CAN_FAIL              0x2000
+#define MDL_ALLOCATED_MUST_SUCCEED        0x4000
+
+#define MDL_MAPPING_FLAGS ( \
+  MDL_MAPPED_TO_SYSTEM_VA     | \
+  MDL_PAGES_LOCKED            | \
+  MDL_SOURCE_IS_NONPAGED_POOL | \
+  MDL_PARTIAL_HAS_BEEN_MAPPED | \
+  MDL_PARENT_MAPPED_SYSTEM_VA | \
+  MDL_SYSTEM_VA               | \
+  MDL_IO_SPACE)
+
+typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
+
 typedef struct _KTIMER {
     DISPATCHER_HEADER Header;
     ULARGE_INTEGER DueTime;
@@ -1006,4 +1087,264 @@ NTSTATUS  WINAPI ZwWaitForMultipleObjects(ULONG,const HANDLE*,BOOLEAN,BOOLEAN,co
 NTSTATUS  WINAPI ZwWriteFile(HANDLE,HANDLE,PIO_APC_ROUTINE,PVOID,PIO_STATUS_BLOCK,const void*,ULONG,PLARGE_INTEGER,PULONG);
 NTSTATUS  WINAPI ZwYieldExecution(void);
 
+typedef ULONG_PTR ERESOURCE_THREAD;
+typedef ERESOURCE_THREAD *PERESOURCE_THREAD;
+
+typedef struct _OWNER_ENTRY {
+    ERESOURCE_THREAD  OwnerThread;
+    union {
+        LONG  OwnerCount;
+        ULONG  TableSize;
+    } DUMMYUNIONNAME;
+} OWNER_ENTRY, *POWNER_ENTRY;
+
+typedef struct _KSEMAPHORE {
+    DISPATCHER_HEADER Header;
+    LONG Limit;
+} KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
+
+typedef struct _FAST_MUTEX
+{
+    LONG Count;
+    PKTHREAD Owner;
+    ULONG Contention;
+    KEVENT Gate;
+    ULONG OldIrql;
+} FAST_MUTEX, *PFAST_MUTEX;
+
+typedef struct _ERESOURCE {
+    LIST_ENTRY  SystemResourcesList;
+    POWNER_ENTRY  OwnerTable;
+    SHORT  ActiveCount;
+    USHORT  Flag;
+    PKSEMAPHORE  SharedWaiters;
+    PKEVENT  ExclusiveWaiters;
+    OWNER_ENTRY  OwnerThreads[2];
+    ULONG  ContentionCount;
+    USHORT  NumberOfSharedWaiters;
+    USHORT  NumberOfExclusiveWaiters;
+    union {
+        PVOID  Address;
+        ULONG_PTR  CreatorBackTraceIndex;
+    } DUMMYUNIONNAME;
+    KSPIN_LOCK  SpinLock;
+} ERESOURCE, *PERESOURCE;
+
+typedef enum _SECURITY_OPERATION_CODE {
+    SetSecurityDescriptor,
+    QuerySecurityDescriptor,
+    DeleteSecurityDescriptor,
+    AssignSecurityDescriptor
+} SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
+
+typedef struct _OBJECT_HANDLE_INFORMATION {
+    ULONG HandleAttributes;
+    ACCESS_MASK GrantedAccess;
+} OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
+
+typedef struct _OBJECT_NAME_INFORMATION {
+    UNICODE_STRING  Name;
+} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
+
+typedef enum _OB_OPEN_REASON
+{
+    ObCreateHandle,
+    ObOpenHandle,
+    ObDuplicateHandle,
+    ObInheritHandle,
+    ObMaxOpenReason
+} OB_OPEN_REASON;
+
+typedef struct _OB_DUMP_CONTROL
+{
+	PVOID Stream;
+	ULONG Detail;
+} OB_DUMP_CONTROL, *POB_DUMP_CONTROL;
+
+typedef VOID (WINAPI *OB_DUMP_METHOD)(
+	PVOID Object,
+	POB_DUMP_CONTROL Control
+);
+
+typedef NTSTATUS (WINAPI *OB_OPEN_METHOD)(
+	OB_OPEN_REASON Reason,
+	PEPROCESS Process,
+	PVOID ObjectBody,
+	ACCESS_MASK GrantedAccess,
+	ULONG HandleCount
+);
+
+typedef VOID (WINAPI *OB_CLOSE_METHOD)(
+	PEPROCESS Process,
+	PVOID Object,
+	ACCESS_MASK GrantedAccess,
+	ULONG ProcessHandleCount,
+	ULONG SystemHandleCount
+);
+
+typedef VOID (WINAPI *OB_DELETE_METHOD)(
+	PVOID Object
+);
+ 
+typedef NTSTATUS (WINAPI *OB_PARSE_METHOD)(
+	PVOID ParseObject,
+	PVOID ObjectType,
+	PACCESS_STATE AccessState,
+	KPROCESSOR_MODE AccessMode,
+	ULONG Attributes,
+	PUNICODE_STRING CompleteName,
+	PUNICODE_STRING RemainingName,
+	PVOID Context OPTIONAL,
+	PSECURITY_QUALITY_OF_SERVICE SecurityQos,
+	PVOID *Object
+);
+
+typedef NTSTATUS (WINAPI *OB_SECURITY_METHOD)(
+    PVOID Object,
+    SECURITY_OPERATION_CODE OperationType,
+    PSECURITY_INFORMATION SecurityInformation,
+    PSECURITY_DESCRIPTOR SecurityDescriptor,
+    PULONG CapturedLength,
+    PSECURITY_DESCRIPTOR *ObjectSecurityDescriptor,
+    POOL_TYPE PoolType,
+    PGENERIC_MAPPING GenericMapping
+);
+ 
+typedef NTSTATUS (WINAPI *OB_QUERYNAME_METHOD)(
+    PVOID Object,
+    BOOLEAN HasObjectName,
+    POBJECT_NAME_INFORMATION ObjectNameInfo,
+    ULONG Length,
+    PULONG ReturnLength,
+    KPROCESSOR_MODE AccessMode
+);
+
+typedef NTSTATUS (WINAPI *OB_OKAYTOCLOSE_METHOD)(
+    PEPROCESS Process,
+    PVOID Object,
+    HANDLE Handle,
+    KPROCESSOR_MODE AccessMode
+);
+
+typedef struct _OBJECT_TYPE_INITIALIZER
+{
+    USHORT Length;
+    UCHAR UseDefaultObject;
+    UCHAR CaseInsensitive;
+    ULONG InvalidAttributes;
+    GENERIC_MAPPING GenericMapping;
+    ULONG ValidAccessMask;
+    UCHAR SecurityRequired;
+    UCHAR MaintainHandleCount;
+    UCHAR MaintainTypeList;
+    POOL_TYPE PoolType;
+    ULONG DefaultPagedPoolCharge;
+    ULONG DefaultNonPagedPoolCharge;
+    OB_DUMP_METHOD DumpProcedure;
+    OB_OPEN_METHOD OpenProcedure;
+    OB_CLOSE_METHOD CloseProcedure;
+    OB_DELETE_METHOD DeleteProcedure;
+    OB_PARSE_METHOD ParseProcedure;
+    OB_SECURITY_METHOD SecurityProcedure;
+    OB_QUERYNAME_METHOD QueryNameProcedure;
+    OB_OKAYTOCLOSE_METHOD OkayToCloseProcedure;
+} OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
+
+typedef struct _OBJECT_TYPE
+{
+    ERESOURCE Mutex;
+    LIST_ENTRY TypeList;
+    UNICODE_STRING Name;
+    PVOID DefaultObject;
+    ULONG Index;
+    ULONG TotalNumberOfObjects;
+    ULONG TotalNumberOfHandles;
+    ULONG HighWaterNumberOfObjects;
+    ULONG HighWaterNumberOfHandles;
+    OBJECT_TYPE_INITIALIZER TypeInfo;
+    ULONG Key;
+    ERESOURCE ObjectLocks[4];
+} OBJECT_TYPE, *POBJECT_TYPE;
+
+typedef enum _KWAIT_REASON {
+    Executive, FreePage, PageIn, PoolAllocation,
+    DelayExecution, Suspended, UserRequest, WrExecutive,
+    WrFreePage, WrPageIn, WrPoolAllocation, WrDelayExecution,
+    WrSuspended, WrUserRequest, WrEventPair, WrQueue,
+    WrLpcReceive, WrLpcReply, WrVirtualMemory, WrPageOut,
+    WrRendezvous, Spare2, WrGuardedMutex, Spare4,
+    Spare5, Spare6, WrKernel, WrResource,
+    WrPushLock, WrMutex, WrQuantumEnd, WrDispatchInt,
+    WrPreempted, WrYieldExecution, MaximumWaitReason
+
+} KWAIT_REASON;
+
+typedef enum _KOBJECTS
+{
+    EventNotificationObject = 0,
+    EventSynchronizationObject = 1,
+    MutantObject = 2,
+    ProcessObject = 3,
+    QueueObject = 4,
+    SemaphoreObject = 5,
+    ThreadObject = 6,
+    GateObject = 7,
+    TimerNotificationObject = 8,
+    TimerSynchronizationObject = 9,
+    Spare2Object = 10,
+    Spare3Object = 11,
+    Spare4Object = 12,
+    Spare5Object = 13,
+    Spare6Object = 14,
+    Spare7Object = 15,
+    Spare8Object = 16,
+    Spare9Object = 17,
+    ApcObject = 18,
+    DpcObject = 19,
+    DeviceQueueObject = 20,
+    EventPairObject = 21,
+    InterruptObject = 22,
+    ProfileObject = 23,
+    ThreadedDpcObject = 24,
+    MaximumKernelObject = 25
+} KOBJECTS;
+
+typedef struct _GENERAL_LOOKASIDE {
+  SLIST_HEADER  ListHead;
+  USHORT  Depth;
+  USHORT  MaximumDepth;
+  ULONG  TotalAllocates;
+  union {
+    ULONG  AllocateMisses;
+    ULONG  AllocateHits;
+  };
+  ULONG  TotalFrees;
+  union {
+    ULONG  FreeMisses;
+    ULONG  FreeHits;
+  };
+  POOL_TYPE  Type;
+  ULONG  Tag;
+  ULONG  Size;
+  PALLOCATE_FUNCTION  Allocate;
+  PFREE_FUNCTION  Free;
+  LIST_ENTRY  ListEntry;
+  ULONG  LastTotalAllocates;
+  union {
+    ULONG  LastAllocateMisses;
+    ULONG  LastAllocateHits;
+  };
+  ULONG Future[2];
+} GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
+
+typedef struct _NPAGED_LOOKASIDE_LIST {
+  GENERAL_LOOKASIDE  L;
+  KSPIN_LOCK  Obsoleted;
+} NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
+
+typedef struct _PAGED_LOOKASIDE_LIST {
+  GENERAL_LOOKASIDE  L;
+  FAST_MUTEX  Obsoleted;
+} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
+
 #endif
-- 
1.5.2.5


--=-R5oSKzTNTEw+Su557/39--




More information about the wine-patches mailing list