[PATCH] Bits needed to get hackshield working in RO2.
Chris Wulff
crwulff at rochester.rr.com
Mon Feb 16 20:37:20 CST 2009
---
dlls/ntdll/thread.c | 3 +
dlls/ntoskrnl.exe/ntoskrnl.c | 547 ++++++++++++++++++++++++++++++++---
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 40 ++--
include/ddk/wdm.h | 316 ++++++++++++++++++++-
4 files changed, 842 insertions(+), 64 deletions(-)
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 56d742d..c8546a3 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -250,6 +250,9 @@ HANDLE thread_init(void)
size = sizeof(*peb);
NtAllocateVirtualMemory( NtCurrentProcess(), &addr, 1, &size,
MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE );
+
+ memset(addr, 0x00, size);
+
peb = addr;
peb->NumberOfProcessors = 1;
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 0dc9aaf..0767aff 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -36,10 +36,13 @@
#include "wine/server.h"
#include "wine/list.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 = { 0, 0, 0 };
@@ -146,7 +149,65 @@ static NTSTATUS process_ioctl( DEVICE_OBJECT *device, ULONG code, void *in_buff,
NTSTATUS status;
LARGE_INTEGER count;
+#if 1 // DEBUG - CRW
+ SuspendThread(OpenThread(THREAD_ALL_ACCESS,TRUE,GetCurrentThreadId()+3));
+ SuspendThread(OpenThread(THREAD_ALL_ACCESS,TRUE,GetCurrentThreadId()+4));
+
+ PEB *peb = NtCurrentTeb()->Peb;
+ if (NULL == peb->ReadOnlyStaticServerData)
+ {
+
+ peb->ReadOnlyStaticServerData = (VOID**)HeapAlloc( GetProcessHeap(), 0, 4*sizeof(PVOID) );
+ memset(peb->ReadOnlyStaticServerData, 0xCD, 4*sizeof(PVOID));
+ peb->ReadOnlyStaticServerData[1] = (PVOID)HeapAlloc( GetProcessHeap(), 0, 4096 );
+ memset(peb->ReadOnlyStaticServerData[1], 0xcc, 4096);
+ ((VOID**)peb->ReadOnlyStaticServerData[1])[3] = L"Test";
+
+ TRACE("PEB LdrData=%p ProcessParameters=%p SubSystemData=%p\n",
+ peb->LdrData, peb->ProcessParameters, peb->SubSystemData);
+ TRACE("PEB FastPebLock=%p FastPebLockRoutine=%p, FastPebUnlockRoutine=%p\n",
+ peb->FastPebLock, peb->FastPebLockRoutine, peb->FastPebUnlockRoutine);
+ TRACE("PEB KernelCallbackTable=%p EventLogSection=%p EventLog=%p FreeList=%p\n",
+ peb->KernelCallbackTable, peb->EventLogSection, peb->EventLog, peb->FreeList);
+ TRACE("PEB ReadOnlySharedMemoryBase=%p ReadOnlySharedMemoryHeap=%p\n",
+ peb->ReadOnlySharedMemoryBase, peb->ReadOnlySharedMemoryHeap);
+ TRACE("PEB ReadOnlyStaticServerData=%p AnsiCodePageData=%p OemCodePageData=%p\n",
+ peb->ReadOnlyStaticServerData, peb->AnsiCodePageData, peb->OemCodePageData);
+ TRACE("PEB UnicodeCaseTableData=%p ProcessHeaps=%p GdiSharedHandleTable=%p\n",
+ peb->UnicodeCaseTableData, peb->ProcessHeaps, peb->GdiSharedHandleTable);
+ TRACE("PEB ProcessStarterHelper=%p GdiDCAttributeList=%p LoaderLock=%p TlsExpansionBitmap=%p\n",
+ peb->ProcessStarterHelper, peb->GdiDCAttributeList, peb->LoaderLock, peb->TlsExpansionBitmap);
+
+ peb->SubSystemData = (PVOID)0xAAAAAAAA;
+ peb->FastPebLock = (PVOID)0xAAAABAAA;
+ peb->FastPebLockRoutine = (PVOID)0xAAAACAAA;
+ peb->FastPebUnlockRoutine = (PVOID)0xAAAADAAA;
+ peb->KernelCallbackTable = (PVOID)0xAAAAEAAA;
+ peb->EventLogSection = (PVOID)0xAAAAFAAA;
+ peb->EventLog = (PVOID)0xAAABAAAA;
+ peb->FreeList = (PVOID)0xAAABBAAA;
+ peb->ReadOnlySharedMemoryBase = (PVOID)0xAAABCAAA;
+ peb->ReadOnlySharedMemoryHeap = (PVOID)0xAAABDAAA;
+ peb->AnsiCodePageData = (PVOID)0xAAABEAAA;
+ peb->OemCodePageData = (PVOID)0xAAABFAAA;
+ peb->UnicodeCaseTableData = (PVOID)0xAAACAAAA;
+ peb->ProcessHeaps = (PVOID)0xAAACBAAA;
+ peb->GdiSharedHandleTable = (PVOID)0xAAACCAAA;
+ peb->ProcessStarterHelper = (PVOID)0xAAACDAAA;
+ peb->GdiDCAttributeList = (PVOID)0xAAACEAAA;
+ peb->LoaderLock = (PVOID)0xAAACFAAA;
+ }
+#endif
+
TRACE( "ioctl %x device %p in_size %u out_size %u\n", code, device, in_size, *out_size );
+ unsigned int i;
+ for (i=0; i<(in_size+3)/4; i++) TRACE("0x%08x ", ((unsigned int*)in_buff)[i]);
+ TRACE("\n");
+
+ if (code == 0xf1200268)
+ {
+ for (i=0; i<in_size/4; i++) if (0 == ((unsigned int*)in_buff)[i]) ((unsigned int*)in_buff)[i] = 0xcccccccc;
+ }
/* so we can spot things that we should initialize */
memset( &irp, 0x55, sizeof(irp) );
@@ -178,13 +239,43 @@ static NTSTATUS process_ioctl( DEVICE_OBJECT *device, ULONG code, void *in_buff,
KeQueryTickCount( &count ); /* update the global KeTickCount */
- if (TRACE_ON(relay))
+// if (TRACE_ON(relay))
DPRINTF( "%04x:Call driver dispatch %p (device=%p,irp=%p)\n",
GetCurrentThreadId(), dispatch, device, &irp );
+#if 0
status = dispatch( device, &irp );
+#else
+ __TRY
+ {
+ status = dispatch( device, &irp );
+ if (irp.IoStatus.Information == 0 && *out_size > 0)
+ {
+ memset(out_buff, 0x00, *out_size);
+ irp.IoStatus.Information = *out_size;//0;
+ }
+ }
+ __EXCEPT_PAGE_FAULT
+ {
+ TRACE_(seh)("ioctl caused an exception\n");
+#if 0
+ irp.IoStatus.u.Status = STATUS_ACCESS_VIOLATION;
+#else
+ status = irp.IoStatus.u.Status = STATUS_SUCCESS;
+ irp.IoStatus.Information = 0;
+#endif
+ }
+ __ENDTRY
+#endif
- if (TRACE_ON(relay))
+ #if 1
+ if ((code == 0xf1200254)||(code == 0xf1200284))
+ {
+ ResumeThread(OpenThread(THREAD_ALL_ACCESS,TRUE,GetCurrentThreadId()+3));
+ ResumeThread(OpenThread(THREAD_ALL_ACCESS,TRUE,GetCurrentThreadId()+4));
+ }
+ #endif
+// if (TRACE_ON(relay))
DPRINTF( "%04x:Ret driver dispatch %p (device=%p,irp=%p) retval=%08x\n",
GetCurrentThreadId(), dispatch, device, &irp, status );
@@ -207,7 +298,7 @@ NTSTATUS CDECL 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;
@@ -246,13 +337,13 @@ NTSTATUS CDECL 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:
@@ -346,26 +437,6 @@ void WINAPI IoFreeIrp( IRP *irp )
/***********************************************************************
- * IoAllocateMdl (NTOSKRNL.EXE.@)
- */
-PMDL WINAPI IoAllocateMdl( PVOID VirtualAddress, ULONG Length, BOOLEAN SecondaryBuffer, BOOLEAN ChargeQuota, PIRP Irp )
-{
- FIXME( "stub: %p, %u, %i, %i, %p\n", VirtualAddress, Length, SecondaryBuffer, ChargeQuota, Irp );
- return NULL;
-}
-
-
-/***********************************************************************
- * IoAllocateWorkItem (NTOSKRNL.EXE.@)
- */
-PIO_WORKITEM WINAPI IoAllocateWorkItem( PDEVICE_OBJECT DeviceObject )
-{
- FIXME( "stub: %p\n", DeviceObject );
- return NULL;
-}
-
-
-/***********************************************************************
* IoAttachDeviceToDeviceStack (NTOSKRNL.EXE.@)
*/
PDEVICE_OBJECT WINAPI IoAttachDeviceToDeviceStack( DEVICE_OBJECT *source,
@@ -475,6 +546,98 @@ void WINAPI IoDeleteDriver( DRIVER_OBJECT *driver )
/***********************************************************************
+ * IoAllocateMdl (NTOSKRNL.EXE.@)
+ */
+PMDL WINAPI IoAllocateMdl( PVOID VAddr, ULONG Length,
+ BOOLEAN SecondaryBuffer, BOOLEAN ChargeQuota,
+ PIRP Irp )
+{
+ 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.@)
+ */
+PIO_WORKITEM WINAPI IoAllocateWorkItem( PDEVICE_OBJECT DeviceObject )
+{
+ PIO_WORKITEM WorkItem = NULL;
+
+ FIXME( "%p\n", DeviceObject );
+
+ // Allocat a dummy object for now
+ WorkItem = HeapAlloc( GetProcessHeap(), 0, 0x400 );
+
+ memset(WorkItem, 0xCC, 0x400);
+
+ return WorkItem;
+}
+
+/***********************************************************************
+ * 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_SUCCESS;
+}
+
+/***********************************************************************
* IoCreateDevice (NTOSKRNL.EXE.@)
*/
NTSTATUS WINAPI IoCreateDevice( DRIVER_OBJECT *driver, ULONG ext_size,
@@ -836,8 +999,9 @@ 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 );
+ memset(ret, 0xCC, size);
return ret;
}
@@ -871,11 +1035,92 @@ void WINAPI ExFreePoolWithTag( void *ptr, ULONG tag )
/***********************************************************************
+ * 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 );
+
+ memset(Lookaside, 0xcc, sizeof(NPAGED_LOOKASIDE_LIST));
+}
+
+/***********************************************************************
+ * 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 );
+
+ memset(Lookaside, 0xcc, sizeof(PAGED_LOOKASIDE_LIST));
+}
+
+/***********************************************************************
+ * ExInitializeResourceLite (NTOSKRNL.EXE.@)
+ */
+NTSTATUS WINAPI ExInitializeResourceLite( PERESOURCE Resource )
+{
+ FIXME( "%p\n", Resource );
+
+ return STATUS_SUCCESS;
+}
+
+/***********************************************************************
+ * 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_SUCCESS;
+}
+
+/***********************************************************************
* KeInitializeEvent (NTOSKRNL.EXE.@)
*/
void WINAPI KeInitializeEvent( PRKEVENT Event, EVENT_TYPE Type, BOOLEAN State )
{
- FIXME( "stub: %p %d %d\n", Event, Type, 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;
+
+ /* CRW - DEBUG */
+ NtCreateEvent((HANDLE*)&Event->Header.Absolute, EVENT_ALL_ACCESS, NULL, FALSE, 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;
+
+ /* CRW - DEBUG */
+ NtCreateSemaphore((HANDLE*)&Semaphore->Header.Absolute, EVENT_ALL_ACCESS, NULL, Count, Limit);
}
@@ -884,7 +1129,9 @@ void WINAPI KeInitializeEvent( PRKEVENT Event, EVENT_TYPE Type, BOOLEAN State )
*/
void WINAPI KeInitializeSpinLock( PKSPIN_LOCK SpinLock )
{
- FIXME( "stub: %p\n", SpinLock );
+ TRACE("(%p)\n", SpinLock);
+
+ *SpinLock = 0;
}
@@ -893,7 +1140,20 @@ void WINAPI KeInitializeSpinLock( PKSPIN_LOCK SpinLock )
*/
void WINAPI KeInitializeTimerEx( PKTIMER Timer, TIMER_TYPE Type )
{
- FIXME( "stub: %p %d\n", Timer, 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;
}
@@ -906,6 +1166,32 @@ void WINAPI KeInitializeTimer( PKTIMER Timer )
}
+/***********************************************************************
+ * 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);
+}
+
/**********************************************************************
* KeQueryActiveProcessors (NTOSKRNL.EXE.@)
*
@@ -939,6 +1225,63 @@ ULONGLONG WINAPI KeQueryInterruptTime( 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);
+
+ ULONG Prev = 0;
+ NtReleaseSemaphore((HANDLE*)&Semaphore->Header.Absolute, Inc, &Prev);
+ return Prev;
+}
+
+
+/***********************************************************************
+ * KeResetEvent (NTOSKRNL.EXE.@)
+ */
+LONG WINAPI KeResetEvent( PRKEVENT Event )
+{
+ FIXME("(%p) stub!\n", Event);
+
+ /* CRW - DEBUG */
+ NtResetEvent(&Event->Header.Absolute, NULL);
+
+ return 0;
+}
+
+
+/***********************************************************************
+ * KeSetEvent (NTOSKRNL.EXE.@)
+ */
+LONG WINAPI KeSetEvent( PRKEVENT Event, KPRIORITY Increment, BOOLEAN Wait )
+{
+ FIXME("(%p %u %u) stub!\n", Event, Increment, Wait);
+
+ /* CRW - DEBUG */
+ NtSetEvent(&Event->Header.Absolute, NULL);
+
+ 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);
+
+ /* CRW - DEBUG */
+ return NtWaitForSingleObject(&(((DISPATCHER_HEADER*)Object)->Absolute), Alertable, Timeout);
+
+// return STATUS_NOT_IMPLEMENTED;
+}
+
/***********************************************************************
* KeQuerySystemTime (NTOSKRNL.EXE.@)
*/
@@ -1026,19 +1369,6 @@ void WINAPI MmResetDriverPaging(PVOID AddrInSection)
}
- /***********************************************************************
- * ObReferenceObjectByHandle (NTOSKRNL.EXE.@)
- */
-NTSTATUS WINAPI ObReferenceObjectByHandle( HANDLE obj, ACCESS_MASK access,
- POBJECT_TYPE type,
- KPROCESSOR_MODE mode, PVOID* ptr,
- POBJECT_HANDLE_INFORMATION info)
-{
- FIXME( "stub: %p %x %p %d %p %p\n", obj, access, type, mode, ptr, info);
- return STATUS_NOT_IMPLEMENTED;
-}
-
-
/***********************************************************************
* ObfDereferenceObject (NTOSKRNL.EXE.@)
*/
@@ -1054,11 +1384,143 @@ void WINAPI ObfDereferenceObject( VOID *obj )
/***********************************************************************
+ * 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 );
+
+ // Allocat a dummy object for now
+ *Object = HeapAlloc( GetProcessHeap(), 0, 0x4000 );
+
+ memset(*Object, 0xCC, 0x4000);
+
+ return STATUS_SUCCESS;
+}
+
+/***********************************************************************
+ * 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 );
+
+ // Allocat a dummy object for now
+ *ObjectPtr = HeapAlloc( GetProcessHeap(), 0, 0x4000 );
+
+ memset(*ObjectPtr, 0xCD, 0x4000);
+
+ return STATUS_SUCCESS;
+}
+
+/***********************************************************************
+ * 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 );
+
+ memset(Object, 0xCE, 0x4000);
+
+ return STATUS_SUCCESS;
+}
+
+
+/***********************************************************************
* 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();
@@ -1116,6 +1578,7 @@ BOOLEAN WINAPI PsGetVersion(ULONG *major, ULONG *minor, ULONG *build, UNICODE_ST
NTSTATUS WINAPI PsSetCreateProcessNotifyRoutine( PCREATE_PROCESS_NOTIFY_ROUTINE callback, BOOLEAN remove )
{
FIXME( "stub: %p %d\n", callback, remove );
+
return STATUS_SUCCESS;
}
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index 7b95852..be3c324 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -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
@@ -378,7 +378,7 @@
@ stub IoGetBaseFileSystemDeviceObject
@ stub IoGetBootDiskInformation
@ stdcall IoGetConfigurationInformation()
-@ stub IoGetCurrentProcess
+@ stdcall IoGetCurrentProcess() kernel32.GetCurrentProcess
@ stub IoGetDeviceAttachmentBaseRef
@ stub IoGetDeviceInterfaceAlias
@ stub IoGetDeviceInterfaces
@@ -547,17 +547,17 @@
@ stub KeInitializeDeviceQueue
@ stub KeInitializeDpc
@ stdcall KeInitializeEvent(ptr long long)
-@ stub KeInitializeInterrupt
+@ stdcall KeInitializeInterrupt(ptr ptr ptr ptr long long long long long long)
@ stub KeInitializeMutant
@ stub KeInitializeMutex
@ stub KeInitializeQueue
-@ stub KeInitializeSemaphore
+@ stdcall KeInitializeSemaphore(ptr long long)
@ stdcall KeInitializeSpinLock(ptr)
@ stdcall KeInitializeTimer(ptr)
@ stdcall KeInitializeTimerEx(ptr long)
-@ stub KeInsertByKeyDeviceQueue
-@ stub KeInsertDeviceQueue
-@ stub KeInsertHeadQueue
+@ 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
@@ -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
@ stdcall MmPageEntireDriver(ptr)
@ 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
@@ -810,8 +810,8 @@
@ stub ObQueryNameString
@ stub ObQueryObjectAuditingByHandle
@ stdcall ObReferenceObjectByHandle(long long ptr long ptr ptr)
-@ stub ObReferenceObjectByName
-@ stub ObReferenceObjectByPointer
+@ 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 0f241b6..672886a 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
@@ -124,13 +131,87 @@ typedef enum _KWAIT_REASON
MaximumWaitReason,
} KWAIT_REASON;
+typedef struct _KQUEUE {
+ DISPATCHER_HEADER Header;
+ LIST_ENTRY EntryListHead;
+ ULONG CurrentCount;
+ ULONG MaximumCount;
+ LIST_ENTRY ThreadListHead;
+} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE;
+
+
+/* CRW - Check the type of these */
+typedef VOID *PKINTERRUPT;
+typedef VOID *PKSERVICE_ROUTINE;
+typedef ULONG KINTERRUPT_MODE;
+typedef VOID *PZONE_HEADER;
+
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 struct _OBJECT_TYPE *POBJECT_TYPE;
-typedef struct _OBJECT_HANDLE_INFORMATION *POBJECT_HANDLE_INFORMATION;
+
+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;
+
+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 _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 struct _FAST_MUTEX
{
@@ -166,6 +247,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;
@@ -920,6 +1004,139 @@ typedef struct _IO_STACK_LOCATION {
} IO_STACK_LOCATION, *PIO_STACK_LOCATION;
#include <poppack.h>
+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 enum _SECURITY_OPERATION_CODE {
+ SetSecurityDescriptor,
+ QuerySecurityDescriptor,
+ DeleteSecurityDescriptor,
+ AssignSecurityDescriptor
+} SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
+
+typedef enum _OB_OPEN_REASON
+{
+ ObCreateHandle,
+ ObOpenHandle,
+ ObDuplicateHandle,
+ ObInheritHandle,
+ ObMaxOpenReason
+} OB_OPEN_REASON;
+
+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 struct _OBJECT_HANDLE_INFORMATION {
+ ULONG HandleAttributes;
+ ACCESS_MASK GrantedAccess;
+} OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
+
typedef struct _MDL {
struct _MDL *Next;
CSHORT Size;
@@ -931,6 +1148,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;
@@ -1164,4 +1407,73 @@ 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 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.6.3
--=-OcwQRztMkqlD1dhtvDz9--
More information about the wine-devel
mailing list