ntoskrnl: Implement or add stubs for several functions.
Chris Wulff
crwulff at rochester.rr.com
Tue Dec 18 21:56:25 CST 2007
NOTE: This is required for the "hal: Stubs for ExAcquireFastMutex and
ExReleaseFastMutex" patch to build. (it contains the fast mutex
typedefs.) I apologize for submitting them out of order.
Complete list of functions:
IoAllocateMdl : implemented
IoFreeMdl : implemented
IoAssignResources : stubbed
ObfDereferenceObject : stubbed
ExInitializeNPagedLookasideList : stubbed
ExInitializePagedLookasideList : stubbed
ExInitializeResourceLite : stubbed
ExInitializeZone : stubbed
KeInitializeEvent : implemented
KeInitializeInterrupt : stubbed
KeInitializeSemaphore : implemented
KeInitializeSpinLock : implemented
KeInitializeTimerEx : implemented
KeInitializeTimer : implemented
KeInsertDeviceQueue : stubbed
KeInsertHeadQueue : stubbed
KeInsertByKeyDeviceQueue : stubbed
KeReleaseSemaphore : stubbed
KeResetEvent : stubbed
KeSetEvent : stubbed
KeWaitForSingleObject : stubbed
MmIsAddressValid : implemented
MmIsDriverVerifying : stubbed
MmMapLockedPagesSpecifyCache : partially implemented
MmMapLockedPagesSpecifyCache : partially implemented
MmProbeAndLockPages : partially implemented
MmUnlockPages : partially implemented
ObReferenceObjectByHandle : stubbed
ObReferenceObjectByName : stubbed
ObReferenceObjectByPointer : stubbed
-- Chris Wulff
-------------- next part --------------
commit fc2d37617a2bd437aba42e0f2834336bc6ef3f4d
Author: crwulff <crwulff at cybertron.(none)>
Date: Tue Dec 18 22:43:14 2007 -0500
Implement some ntoskrnl functions and stub others.
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
More information about the wine-patches
mailing list