mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-01-28 22:04:43 -08:00
ntoskrnl.exe-Resources: Add patch set.
This commit is contained in:
parent
7937739028
commit
d12fcebb0e
@ -1,3 +1,2 @@
|
||||
Fixes: Add stub for ntoskrnl.Mm{Map,Unmap}LockedPages
|
||||
Fixes: Add stub for ntoskrnl.IoGetDeviceAttachmentBaseRef
|
||||
Fixes: Implement ntoskrnl.NtBuildNumber
|
||||
|
@ -0,0 +1,132 @@
|
||||
From 635759b4f374469956488aaf6fa4c6307a542ee9 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Tue, 29 Jan 2019 21:33:08 -0600
|
||||
Subject: [PATCH 01/13] ntoskrnl.exe: Implement ExInitializeResourceLite().
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntoskrnl.exe/ntoskrnl.c | 11 --------
|
||||
dlls/ntoskrnl.exe/sync.c | 10 +++++++
|
||||
include/ddk/wdm.h | 54 +++++++++++++++++++++++++++++++++++-
|
||||
3 files changed, 63 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
index 4b626607..93ba89be 100644
|
||||
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
@@ -2081,17 +2081,6 @@ void WINAPI ExFreePoolWithTag( void *ptr, ULONG tag )
|
||||
HeapFree( GetProcessHeap(), 0, ptr );
|
||||
}
|
||||
|
||||
-
|
||||
-/***********************************************************************
|
||||
- * ExInitializeResourceLite (NTOSKRNL.EXE.@)
|
||||
- */
|
||||
-NTSTATUS WINAPI ExInitializeResourceLite(PERESOURCE Resource)
|
||||
-{
|
||||
- FIXME( "stub: %p\n", Resource );
|
||||
- return STATUS_NOT_IMPLEMENTED;
|
||||
-}
|
||||
-
|
||||
-
|
||||
/***********************************************************************
|
||||
* ExInitializeNPagedLookasideList (NTOSKRNL.EXE.@)
|
||||
*/
|
||||
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
|
||||
index 98b3f9d9..56d46a86 100644
|
||||
--- a/dlls/ntoskrnl.exe/sync.c
|
||||
+++ b/dlls/ntoskrnl.exe/sync.c
|
||||
@@ -663,3 +663,13 @@ void WINAPI ExReleaseFastMutexUnsafe( FAST_MUTEX *mutex )
|
||||
if (count < 1)
|
||||
KeSetEvent( &mutex->Event, IO_NO_INCREMENT, FALSE );
|
||||
}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * ExInitializeResourceLite (NTOSKRNL.EXE.@)
|
||||
+ */
|
||||
+NTSTATUS WINAPI ExInitializeResourceLite( ERESOURCE *resource )
|
||||
+{
|
||||
+ TRACE("resource %p.\n", resource);
|
||||
+ memset(resource, 0, sizeof(*resource));
|
||||
+ return STATUS_SUCCESS;
|
||||
+}
|
||||
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
|
||||
index 293da50c..f76444f1 100644
|
||||
--- a/include/ddk/wdm.h
|
||||
+++ b/include/ddk/wdm.h
|
||||
@@ -153,12 +153,63 @@ typedef struct _KWAIT_BLOCK {
|
||||
USHORT WaitType;
|
||||
} KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
|
||||
|
||||
+typedef struct _OWNER_ENTRY
|
||||
+{
|
||||
+ ERESOURCE_THREAD OwnerThread;
|
||||
+ union
|
||||
+ {
|
||||
+ struct
|
||||
+ {
|
||||
+ ULONG IoPriorityBoosted : 1;
|
||||
+ ULONG OwnerReferenced : 1;
|
||||
+ ULONG IoQoSPriorityBoosted : 1;
|
||||
+ ULONG OwnerCount : 29;
|
||||
+ };
|
||||
+ ULONG TableSize;
|
||||
+ };
|
||||
+} OWNER_ENTRY, *POWNER_ENTRY;
|
||||
+
|
||||
+#define ResourceNeverExclusive 0x0010
|
||||
+#define ResourceReleaseByOtherThread 0x0020
|
||||
+#define ResourceOwnedExclusive 0x0080
|
||||
+
|
||||
+typedef struct _ERESOURCE
|
||||
+{
|
||||
+ LIST_ENTRY SystemResourcesList;
|
||||
+ OWNER_ENTRY *OwnerTable;
|
||||
+ SHORT ActiveCount;
|
||||
+ union
|
||||
+ {
|
||||
+ USHORT Flag;
|
||||
+ struct
|
||||
+ {
|
||||
+ UCHAR ReservedLowFlags;
|
||||
+ UCHAR WaiterPriority;
|
||||
+ };
|
||||
+ };
|
||||
+ KSEMAPHORE *SharedWaiters;
|
||||
+ KEVENT *ExclusiveWaiters;
|
||||
+ OWNER_ENTRY OwnerEntry;
|
||||
+ ULONG ActiveEntries;
|
||||
+ ULONG ContentionCount;
|
||||
+ ULONG NumberOfSharedWaiters;
|
||||
+ ULONG NumberOfExclusiveWaiters;
|
||||
+#ifdef _WIN64
|
||||
+ void *Reserved2;
|
||||
+#endif
|
||||
+ union
|
||||
+ {
|
||||
+ void *Address;
|
||||
+ ULONG_PTR CreatorBackTraceIndex;
|
||||
+ };
|
||||
+ KSPIN_LOCK SpinLock;
|
||||
+} ERESOURCE, *PERESOURCE;
|
||||
+
|
||||
typedef struct _IO_TIMER *PIO_TIMER;
|
||||
typedef struct _IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE;
|
||||
typedef struct _ETHREAD *PETHREAD;
|
||||
typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
|
||||
typedef struct _EPROCESS *PEPROCESS;
|
||||
-typedef struct _ERESOURCE *PERESOURCE;
|
||||
typedef struct _IO_WORKITEM *PIO_WORKITEM;
|
||||
typedef struct _PAGED_LOOKASIDE_LIST *PPAGED_LOOKASIDE_LIST;
|
||||
typedef struct _OBJECT_TYPE *POBJECT_TYPE;
|
||||
@@ -1469,6 +1520,7 @@ void WINAPI ExDeleteNPagedLookasideList(PNPAGED_LOOKASIDE_LIST);
|
||||
void WINAPI ExFreePool(PVOID);
|
||||
void WINAPI ExFreePoolWithTag(PVOID,ULONG);
|
||||
void WINAPI ExInitializeNPagedLookasideList(PNPAGED_LOOKASIDE_LIST,PALLOCATE_FUNCTION,PFREE_FUNCTION,ULONG,SIZE_T,ULONG,USHORT);
|
||||
+NTSTATUS WINAPI ExInitializeResourceLite(ERESOURCE*);
|
||||
PSLIST_ENTRY WINAPI ExInterlockedPopEntrySList(PSLIST_HEADER,PKSPIN_LOCK);
|
||||
PSLIST_ENTRY WINAPI ExInterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY,PKSPIN_LOCK);
|
||||
LIST_ENTRY * WINAPI ExInterlockedRemoveHeadList(LIST_ENTRY*,KSPIN_LOCK*);
|
||||
--
|
||||
2.20.1
|
||||
|
@ -0,0 +1,143 @@
|
||||
From 0a7df47900ff847f137836341d086dc5690f97d7 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Tue, 29 Jan 2019 21:35:44 -0600
|
||||
Subject: [PATCH 02/13] ntoskrnl.exe: Implement
|
||||
ExAcquireResourceExclusiveLite().
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntoskrnl.exe/ntoskrnl.c | 9 -----
|
||||
dlls/ntoskrnl.exe/sync.c | 73 ++++++++++++++++++++++++++++++++++++
|
||||
include/ddk/wdm.h | 1 +
|
||||
3 files changed, 74 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
index 93ba89be..d6c35d1c 100644
|
||||
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
@@ -3038,15 +3038,6 @@ NTSTATUS WINAPI IoCsqInitialize(PIO_CSQ csq, PIO_CSQ_INSERT_IRP insert_irp, PIO_
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
-/***********************************************************************
|
||||
- * ExAcquireResourceExclusiveLite (NTOSKRNL.EXE.@)
|
||||
- */
|
||||
-BOOLEAN WINAPI ExAcquireResourceExclusiveLite( PERESOURCE resource, BOOLEAN wait )
|
||||
-{
|
||||
- FIXME( ":%p %u stub\n", resource, wait );
|
||||
- return TRUE;
|
||||
-}
|
||||
-
|
||||
/***********************************************************************
|
||||
* ExDeleteResourceLite (NTOSKRNL.EXE.@)
|
||||
*/
|
||||
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
|
||||
index 56d46a86..205914a7 100644
|
||||
--- a/dlls/ntoskrnl.exe/sync.c
|
||||
+++ b/dlls/ntoskrnl.exe/sync.c
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "ddk/wdm.h"
|
||||
|
||||
#include "wine/debug.h"
|
||||
+#include "wine/heap.h"
|
||||
|
||||
#include "ntoskrnl_private.h"
|
||||
|
||||
@@ -664,6 +665,18 @@ void WINAPI ExReleaseFastMutexUnsafe( FAST_MUTEX *mutex )
|
||||
KeSetEvent( &mutex->Event, IO_NO_INCREMENT, FALSE );
|
||||
}
|
||||
|
||||
+/* Use of the fields of an ERESOURCE structure seems to vary wildly between
|
||||
+ * Windows versions. The below implementation uses them as follows:
|
||||
+ *
|
||||
+ * OwnerTable - contains a list of shared owners (TID and recursion count),
|
||||
+ * including threads which do not currently own the resource
|
||||
+ * (recursion count == 0)
|
||||
+ * OwnerEntry.OwnerThread - the owner TID if exclusively owned
|
||||
+ * OwnerEntry.TableSize - the number of entries in OwnerTable, including threads
|
||||
+ * which do not currently own the resource
|
||||
+ * ActiveEntries - total number of acquisitions (incl. recursive ones)
|
||||
+ */
|
||||
+
|
||||
/***********************************************************************
|
||||
* ExInitializeResourceLite (NTOSKRNL.EXE.@)
|
||||
*/
|
||||
@@ -673,3 +686,63 @@ NTSTATUS WINAPI ExInitializeResourceLite( ERESOURCE *resource )
|
||||
memset(resource, 0, sizeof(*resource));
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * ExAcquireResourceExclusiveLite (NTOSKRNL.EXE.@)
|
||||
+ */
|
||||
+BOOLEAN WINAPI ExAcquireResourceExclusiveLite( ERESOURCE *resource, BOOLEAN wait )
|
||||
+{
|
||||
+ KIRQL irql;
|
||||
+
|
||||
+ TRACE("resource %p, wait %u.\n", resource, wait);
|
||||
+
|
||||
+ KeAcquireSpinLock( &resource->SpinLock, &irql );
|
||||
+
|
||||
+ FIXME("%#lx/%d/%d/%d\n", resource->OwnerEntry.OwnerThread, resource->ActiveEntries,
|
||||
+ resource->NumberOfExclusiveWaiters, resource->NumberOfSharedWaiters);
|
||||
+
|
||||
+ if (resource->OwnerEntry.OwnerThread == (ERESOURCE_THREAD)KeGetCurrentThread())
|
||||
+ {
|
||||
+ resource->ActiveEntries++;
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+ return TRUE;
|
||||
+ }
|
||||
+ else if (!resource->ActiveEntries && !resource->NumberOfExclusiveWaiters && !resource->NumberOfSharedWaiters)
|
||||
+ {
|
||||
+ /* In order to avoid a race between waiting for the ExclusiveWaiters
|
||||
+ * event and grabbing the lock, do not grab the resource if it is
|
||||
+ * unclaimed but has waiters; instead queue ourselves. */
|
||||
+ resource->Flag |= ResourceOwnedExclusive;
|
||||
+ resource->OwnerEntry.OwnerThread = (ERESOURCE_THREAD)KeGetCurrentThread();
|
||||
+ resource->ActiveEntries++;
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+ return TRUE;
|
||||
+ }
|
||||
+ else if (!wait)
|
||||
+ {
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ if (!resource->ExclusiveWaiters)
|
||||
+ {
|
||||
+ resource->ExclusiveWaiters = heap_alloc( sizeof(*resource->ExclusiveWaiters) );
|
||||
+ KeInitializeEvent( resource->ExclusiveWaiters, SynchronizationEvent, FALSE );
|
||||
+ }
|
||||
+ resource->NumberOfExclusiveWaiters++;
|
||||
+
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+
|
||||
+ KeWaitForSingleObject( resource->ExclusiveWaiters, Executive, KernelMode, FALSE, NULL );
|
||||
+
|
||||
+ KeAcquireSpinLock( &resource->SpinLock, &irql );
|
||||
+
|
||||
+ resource->Flag |= ResourceOwnedExclusive;
|
||||
+ resource->OwnerEntry.OwnerThread = (ERESOURCE_THREAD)KeGetCurrentThread();
|
||||
+ resource->ActiveEntries++;
|
||||
+ resource->NumberOfExclusiveWaiters--;
|
||||
+
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
|
||||
index f76444f1..a8cbdc2e 100644
|
||||
--- a/include/ddk/wdm.h
|
||||
+++ b/include/ddk/wdm.h
|
||||
@@ -1512,6 +1512,7 @@ static inline void IoSetCompletionRoutine(IRP *irp, PIO_COMPLETION_ROUTINE routi
|
||||
|
||||
NTSTATUS WINAPI DbgQueryDebugFilterState(ULONG, ULONG);
|
||||
void WINAPI ExAcquireFastMutexUnsafe(PFAST_MUTEX);
|
||||
+BOOLEAN WINAPI ExAcquireResourceExclusiveLite(ERESOURCE*,BOOLEAN);
|
||||
PVOID WINAPI ExAllocatePool(POOL_TYPE,SIZE_T);
|
||||
PVOID WINAPI ExAllocatePoolWithQuota(POOL_TYPE,SIZE_T);
|
||||
PVOID WINAPI ExAllocatePoolWithTag(POOL_TYPE,SIZE_T,ULONG);
|
||||
--
|
||||
2.20.1
|
||||
|
@ -0,0 +1,141 @@
|
||||
From a1fc7aa628beedda24325ce4de8231ed03b2b184 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Tue, 29 Jan 2019 21:37:38 -0600
|
||||
Subject: [PATCH 03/13] ntoskrnl.exe: Implement ExAcquireResourceSharedLite().
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +-
|
||||
dlls/ntoskrnl.exe/sync.c | 79 +++++++++++++++++++++++++++++
|
||||
include/ddk/wdm.h | 1 +
|
||||
3 files changed, 81 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
index d0874226..217f27ff 100644
|
||||
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
@@ -121,7 +121,7 @@
|
||||
@ stdcall DbgQueryDebugFilterState(long long)
|
||||
@ stub DbgSetDebugFilterState
|
||||
@ stdcall ExAcquireResourceExclusiveLite(ptr long)
|
||||
-@ stub ExAcquireResourceSharedLite
|
||||
+@ stdcall ExAcquireResourceSharedLite(ptr long)
|
||||
@ stub ExAcquireSharedStarveExclusive
|
||||
@ stub ExAcquireSharedWaitForExclusive
|
||||
@ stub ExAllocateFromPagedLookasideList
|
||||
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
|
||||
index 205914a7..b37a46e4 100644
|
||||
--- a/dlls/ntoskrnl.exe/sync.c
|
||||
+++ b/dlls/ntoskrnl.exe/sync.c
|
||||
@@ -19,6 +19,7 @@
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
+#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "ntstatus.h"
|
||||
@@ -687,6 +688,25 @@ NTSTATUS WINAPI ExInitializeResourceLite( ERESOURCE *resource )
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
+/* Find an existing entry in the shared owner list, or create a new one. */
|
||||
+static OWNER_ENTRY *resource_get_shared_entry( ERESOURCE *resource, ERESOURCE_THREAD thread )
|
||||
+{
|
||||
+ ULONG i, count;
|
||||
+
|
||||
+ for (i = 0; i < resource->OwnerEntry.TableSize; ++i)
|
||||
+ {
|
||||
+ if (resource->OwnerTable[i].OwnerThread == thread)
|
||||
+ return &resource->OwnerTable[i];
|
||||
+ }
|
||||
+
|
||||
+ count = ++resource->OwnerEntry.TableSize;
|
||||
+ resource->OwnerTable = heap_realloc(resource->OwnerTable, count * sizeof(*resource->OwnerTable));
|
||||
+ resource->OwnerTable[count - 1].OwnerThread = thread;
|
||||
+ resource->OwnerTable[count - 1].OwnerCount = 0;
|
||||
+
|
||||
+ return &resource->OwnerTable[count - 1];
|
||||
+}
|
||||
+
|
||||
/***********************************************************************
|
||||
* ExAcquireResourceExclusiveLite (NTOSKRNL.EXE.@)
|
||||
*/
|
||||
@@ -746,3 +766,62 @@ BOOLEAN WINAPI ExAcquireResourceExclusiveLite( ERESOURCE *resource, BOOLEAN wait
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * ExAcquireResourceSharedLite (NTOSKRNL.EXE.@)
|
||||
+ */
|
||||
+BOOLEAN WINAPI ExAcquireResourceSharedLite( ERESOURCE *resource, BOOLEAN wait )
|
||||
+{
|
||||
+ OWNER_ENTRY *entry;
|
||||
+ KIRQL irql;
|
||||
+
|
||||
+ TRACE("resource %p, wait %u.\n", resource, wait);
|
||||
+
|
||||
+ KeAcquireSpinLock( &resource->SpinLock, &irql );
|
||||
+
|
||||
+ entry = resource_get_shared_entry( resource, (ERESOURCE_THREAD)KeGetCurrentThread() );
|
||||
+
|
||||
+ if (resource->Flag & ResourceOwnedExclusive)
|
||||
+ {
|
||||
+ if (resource->OwnerEntry.OwnerThread == (ERESOURCE_THREAD)KeGetCurrentThread())
|
||||
+ {
|
||||
+ resource->ActiveEntries++;
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+ return TRUE;
|
||||
+ }
|
||||
+ }
|
||||
+ else if (entry->OwnerCount || !resource->NumberOfExclusiveWaiters)
|
||||
+ {
|
||||
+ entry->OwnerCount++;
|
||||
+ resource->ActiveEntries++;
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+ return TRUE;
|
||||
+ }
|
||||
+
|
||||
+ if (!wait)
|
||||
+ {
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ if (!resource->SharedWaiters)
|
||||
+ {
|
||||
+ resource->SharedWaiters = heap_alloc( sizeof(*resource->SharedWaiters) );
|
||||
+ KeInitializeSemaphore( resource->SharedWaiters, 0, INT_MAX );
|
||||
+ }
|
||||
+ resource->NumberOfSharedWaiters++;
|
||||
+
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+
|
||||
+ KeWaitForSingleObject( resource->SharedWaiters, Executive, KernelMode, FALSE, NULL );
|
||||
+
|
||||
+ KeAcquireSpinLock( &resource->SpinLock, &irql );
|
||||
+
|
||||
+ entry->OwnerCount++;
|
||||
+ resource->ActiveEntries++;
|
||||
+ resource->NumberOfSharedWaiters--;
|
||||
+
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
|
||||
index a8cbdc2e..14d4ba4e 100644
|
||||
--- a/include/ddk/wdm.h
|
||||
+++ b/include/ddk/wdm.h
|
||||
@@ -1513,6 +1513,7 @@ static inline void IoSetCompletionRoutine(IRP *irp, PIO_COMPLETION_ROUTINE routi
|
||||
NTSTATUS WINAPI DbgQueryDebugFilterState(ULONG, ULONG);
|
||||
void WINAPI ExAcquireFastMutexUnsafe(PFAST_MUTEX);
|
||||
BOOLEAN WINAPI ExAcquireResourceExclusiveLite(ERESOURCE*,BOOLEAN);
|
||||
+BOOLEAN WINAPI ExAcquireResourceSharedLite(ERESOURCE*,BOOLEAN);
|
||||
PVOID WINAPI ExAllocatePool(POOL_TYPE,SIZE_T);
|
||||
PVOID WINAPI ExAllocatePoolWithQuota(POOL_TYPE,SIZE_T);
|
||||
PVOID WINAPI ExAllocatePoolWithTag(POOL_TYPE,SIZE_T,ULONG);
|
||||
--
|
||||
2.20.1
|
||||
|
@ -0,0 +1,110 @@
|
||||
From d57ba73e962955d928a72d7fa23a90b3dbb6e50c Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Tue, 29 Jan 2019 21:39:05 -0600
|
||||
Subject: [PATCH 04/13] ntoskrnl.exe: Implement
|
||||
ExAcquireSharedStarveExclusive().
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +-
|
||||
dlls/ntoskrnl.exe/sync.c | 61 +++++++++++++++++++++++++++++
|
||||
include/ddk/wdm.h | 1 +
|
||||
3 files changed, 63 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
index 217f27ff..4609c86d 100644
|
||||
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
@@ -122,7 +122,7 @@
|
||||
@ stub DbgSetDebugFilterState
|
||||
@ stdcall ExAcquireResourceExclusiveLite(ptr long)
|
||||
@ stdcall ExAcquireResourceSharedLite(ptr long)
|
||||
-@ stub ExAcquireSharedStarveExclusive
|
||||
+@ stdcall ExAcquireSharedStarveExclusive(ptr long)
|
||||
@ stub ExAcquireSharedWaitForExclusive
|
||||
@ stub ExAllocateFromPagedLookasideList
|
||||
@ stdcall ExAllocatePool(long long)
|
||||
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
|
||||
index b37a46e4..3033c8a2 100644
|
||||
--- a/dlls/ntoskrnl.exe/sync.c
|
||||
+++ b/dlls/ntoskrnl.exe/sync.c
|
||||
@@ -825,3 +825,64 @@ BOOLEAN WINAPI ExAcquireResourceSharedLite( ERESOURCE *resource, BOOLEAN wait )
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * ExAcquireSharedStarveExclusive (NTOSKRNL.EXE.@)
|
||||
+ */
|
||||
+BOOLEAN WINAPI ExAcquireSharedStarveExclusive( ERESOURCE *resource, BOOLEAN wait )
|
||||
+{
|
||||
+ OWNER_ENTRY *entry;
|
||||
+ KIRQL irql;
|
||||
+
|
||||
+ TRACE("resource %p, wait %u.\n", resource, wait);
|
||||
+
|
||||
+ KeAcquireSpinLock( &resource->SpinLock, &irql );
|
||||
+
|
||||
+ entry = resource_get_shared_entry( resource, (ERESOURCE_THREAD)KeGetCurrentThread() );
|
||||
+
|
||||
+ if (resource->Flag & ResourceOwnedExclusive)
|
||||
+ {
|
||||
+ if (resource->OwnerEntry.OwnerThread == (ERESOURCE_THREAD)KeGetCurrentThread())
|
||||
+ {
|
||||
+ resource->ActiveEntries++;
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+ return TRUE;
|
||||
+ }
|
||||
+ }
|
||||
+ else if (resource->ActiveEntries || !resource->NumberOfExclusiveWaiters)
|
||||
+ {
|
||||
+ /* We are starving exclusive waiters, but we cannot steal the resource
|
||||
+ * out from under an exclusive waiter who is about to acquire it. */
|
||||
+ entry->OwnerCount++;
|
||||
+ resource->ActiveEntries++;
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+ return TRUE;
|
||||
+ }
|
||||
+
|
||||
+ if (!wait)
|
||||
+ {
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ if (!resource->SharedWaiters)
|
||||
+ {
|
||||
+ resource->SharedWaiters = heap_alloc( sizeof(*resource->SharedWaiters) );
|
||||
+ KeInitializeSemaphore( resource->SharedWaiters, 0, INT_MAX );
|
||||
+ }
|
||||
+ resource->NumberOfSharedWaiters++;
|
||||
+
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+
|
||||
+ KeWaitForSingleObject( resource->SharedWaiters, Executive, KernelMode, FALSE, NULL );
|
||||
+
|
||||
+ KeAcquireSpinLock( &resource->SpinLock, &irql );
|
||||
+
|
||||
+ entry->OwnerCount++;
|
||||
+ resource->ActiveEntries++;
|
||||
+ resource->NumberOfSharedWaiters--;
|
||||
+
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
|
||||
index 14d4ba4e..a65974da 100644
|
||||
--- a/include/ddk/wdm.h
|
||||
+++ b/include/ddk/wdm.h
|
||||
@@ -1514,6 +1514,7 @@ NTSTATUS WINAPI DbgQueryDebugFilterState(ULONG, ULONG);
|
||||
void WINAPI ExAcquireFastMutexUnsafe(PFAST_MUTEX);
|
||||
BOOLEAN WINAPI ExAcquireResourceExclusiveLite(ERESOURCE*,BOOLEAN);
|
||||
BOOLEAN WINAPI ExAcquireResourceSharedLite(ERESOURCE*,BOOLEAN);
|
||||
+BOOLEAN WINAPI ExAcquireSharedStarveExclusive(ERESOURCE*,BOOLEAN);
|
||||
PVOID WINAPI ExAllocatePool(POOL_TYPE,SIZE_T);
|
||||
PVOID WINAPI ExAllocatePoolWithQuota(POOL_TYPE,SIZE_T);
|
||||
PVOID WINAPI ExAllocatePoolWithTag(POOL_TYPE,SIZE_T,ULONG);
|
||||
--
|
||||
2.20.1
|
||||
|
@ -0,0 +1,108 @@
|
||||
From 3503f4db49ee2c4602fc1af38c97f456a1dea76a Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Tue, 29 Jan 2019 21:40:19 -0600
|
||||
Subject: [PATCH 05/13] ntoskrnl.exe: Implement
|
||||
ExAcquireSharedWaitForExclusive().
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +-
|
||||
dlls/ntoskrnl.exe/sync.c | 59 +++++++++++++++++++++++++++++
|
||||
include/ddk/wdm.h | 1 +
|
||||
3 files changed, 61 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
index 4609c86d..c32f4590 100644
|
||||
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
@@ -123,7 +123,7 @@
|
||||
@ stdcall ExAcquireResourceExclusiveLite(ptr long)
|
||||
@ stdcall ExAcquireResourceSharedLite(ptr long)
|
||||
@ stdcall ExAcquireSharedStarveExclusive(ptr long)
|
||||
-@ stub ExAcquireSharedWaitForExclusive
|
||||
+@ stdcall ExAcquireSharedWaitForExclusive(ptr long)
|
||||
@ stub ExAllocateFromPagedLookasideList
|
||||
@ stdcall ExAllocatePool(long long)
|
||||
@ stdcall ExAllocatePoolWithQuota(long long)
|
||||
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
|
||||
index 3033c8a2..2fd7f903 100644
|
||||
--- a/dlls/ntoskrnl.exe/sync.c
|
||||
+++ b/dlls/ntoskrnl.exe/sync.c
|
||||
@@ -886,3 +886,62 @@ BOOLEAN WINAPI ExAcquireSharedStarveExclusive( ERESOURCE *resource, BOOLEAN wait
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * ExAcquireSharedWaitForExclusive (NTOSKRNL.EXE.@)
|
||||
+ */
|
||||
+BOOLEAN WINAPI ExAcquireSharedWaitForExclusive( ERESOURCE *resource, BOOLEAN wait )
|
||||
+{
|
||||
+ OWNER_ENTRY *entry;
|
||||
+ KIRQL irql;
|
||||
+
|
||||
+ TRACE("resource %p, wait %u.\n", resource, wait);
|
||||
+
|
||||
+ KeAcquireSpinLock( &resource->SpinLock, &irql );
|
||||
+
|
||||
+ entry = resource_get_shared_entry( resource, (ERESOURCE_THREAD)KeGetCurrentThread() );
|
||||
+
|
||||
+ if (resource->Flag & ResourceOwnedExclusive)
|
||||
+ {
|
||||
+ if (resource->OwnerEntry.OwnerThread == (ERESOURCE_THREAD)KeGetCurrentThread())
|
||||
+ {
|
||||
+ resource->ActiveEntries++;
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+ return TRUE;
|
||||
+ }
|
||||
+ }
|
||||
+ else if (!resource->NumberOfExclusiveWaiters)
|
||||
+ {
|
||||
+ entry->OwnerCount++;
|
||||
+ resource->ActiveEntries++;
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+ return TRUE;
|
||||
+ }
|
||||
+
|
||||
+ if (!wait)
|
||||
+ {
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ if (!resource->SharedWaiters)
|
||||
+ {
|
||||
+ resource->SharedWaiters = heap_alloc( sizeof(*resource->SharedWaiters) );
|
||||
+ KeInitializeSemaphore( resource->SharedWaiters, 0, INT_MAX );
|
||||
+ }
|
||||
+ resource->NumberOfSharedWaiters++;
|
||||
+
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+
|
||||
+ KeWaitForSingleObject( resource->SharedWaiters, Executive, KernelMode, FALSE, NULL );
|
||||
+
|
||||
+ KeAcquireSpinLock( &resource->SpinLock, &irql );
|
||||
+
|
||||
+ entry->OwnerCount++;
|
||||
+ resource->ActiveEntries++;
|
||||
+ resource->NumberOfSharedWaiters--;
|
||||
+
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
|
||||
index a65974da..010c1ee4 100644
|
||||
--- a/include/ddk/wdm.h
|
||||
+++ b/include/ddk/wdm.h
|
||||
@@ -1515,6 +1515,7 @@ void WINAPI ExAcquireFastMutexUnsafe(PFAST_MUTEX);
|
||||
BOOLEAN WINAPI ExAcquireResourceExclusiveLite(ERESOURCE*,BOOLEAN);
|
||||
BOOLEAN WINAPI ExAcquireResourceSharedLite(ERESOURCE*,BOOLEAN);
|
||||
BOOLEAN WINAPI ExAcquireSharedStarveExclusive(ERESOURCE*,BOOLEAN);
|
||||
+BOOLEAN WINAPI ExAcquireSharedWaitForExclusive(ERESOURCE*,BOOLEAN);
|
||||
PVOID WINAPI ExAllocatePool(POOL_TYPE,SIZE_T);
|
||||
PVOID WINAPI ExAllocatePoolWithQuota(POOL_TYPE,SIZE_T);
|
||||
PVOID WINAPI ExAllocatePoolWithTag(POOL_TYPE,SIZE_T,ULONG);
|
||||
--
|
||||
2.20.1
|
||||
|
@ -0,0 +1,116 @@
|
||||
From 25b736d558aba82da91d004b8976471df6ef0a64 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Tue, 29 Jan 2019 21:41:46 -0600
|
||||
Subject: [PATCH 06/13] ntoskrnl.exe: Implement
|
||||
ExReleaseResourceForThreadLite().
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntoskrnl.exe/ntoskrnl.c | 8 -----
|
||||
dlls/ntoskrnl.exe/sync.c | 61 ++++++++++++++++++++++++++++++++++++
|
||||
include/ddk/wdm.h | 1 +
|
||||
3 files changed, 62 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
index d6c35d1c..5ab4db12 100644
|
||||
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
@@ -3047,14 +3047,6 @@ NTSTATUS WINAPI ExDeleteResourceLite(PERESOURCE resource)
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
-/***********************************************************************
|
||||
- * ExReleaseResourceForThreadLite (NTOSKRNL.EXE.@)
|
||||
- */
|
||||
-void WINAPI ExReleaseResourceForThreadLite( PERESOURCE resource, ERESOURCE_THREAD tid )
|
||||
-{
|
||||
- FIXME( "stub: %p %lu\n", resource, tid );
|
||||
-}
|
||||
-
|
||||
/***********************************************************************
|
||||
* KeEnterCriticalRegion (NTOSKRNL.EXE.@)
|
||||
*/
|
||||
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
|
||||
index 2fd7f903..450e4417 100644
|
||||
--- a/dlls/ntoskrnl.exe/sync.c
|
||||
+++ b/dlls/ntoskrnl.exe/sync.c
|
||||
@@ -945,3 +945,64 @@ BOOLEAN WINAPI ExAcquireSharedWaitForExclusive( ERESOURCE *resource, BOOLEAN wai
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * ExReleaseResourceForThreadLite (NTOSKRNL.EXE.@)
|
||||
+ */
|
||||
+void WINAPI ExReleaseResourceForThreadLite( ERESOURCE *resource, ERESOURCE_THREAD thread )
|
||||
+{
|
||||
+ OWNER_ENTRY *entry;
|
||||
+ KIRQL irql;
|
||||
+
|
||||
+ TRACE("resource %p, thread %#lx.\n", resource, thread);
|
||||
+
|
||||
+ KeAcquireSpinLock( &resource->SpinLock, &irql );
|
||||
+
|
||||
+ if (resource->Flag & ResourceOwnedExclusive)
|
||||
+ {
|
||||
+ if (resource->OwnerEntry.OwnerThread == thread)
|
||||
+ {
|
||||
+ if (!--resource->ActiveEntries)
|
||||
+ {
|
||||
+ resource->OwnerEntry.OwnerThread = 0;
|
||||
+ resource->Flag &= ~ResourceOwnedExclusive;
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ ERR("Attempt to release %p for thread %#lx, but resource is exclusively owned by %#lx.\n",
|
||||
+ resource, thread, resource->OwnerEntry.OwnerThread);
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ entry = resource_get_shared_entry( resource, thread );
|
||||
+ if (entry->OwnerCount)
|
||||
+ {
|
||||
+ entry->OwnerCount--;
|
||||
+ resource->ActiveEntries--;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ ERR("Attempt to release %p for thread %#lx, but resource is not owned by that thread.\n",
|
||||
+ resource, thread);
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (!resource->ActiveEntries)
|
||||
+ {
|
||||
+ if (resource->NumberOfExclusiveWaiters)
|
||||
+ {
|
||||
+ KeSetEvent( resource->ExclusiveWaiters, IO_NO_INCREMENT, FALSE );
|
||||
+ }
|
||||
+ else if (resource->NumberOfSharedWaiters)
|
||||
+ {
|
||||
+ KeReleaseSemaphore( resource->SharedWaiters, IO_NO_INCREMENT,
|
||||
+ resource->NumberOfSharedWaiters, FALSE );
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+}
|
||||
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
|
||||
index 010c1ee4..e95458bf 100644
|
||||
--- a/include/ddk/wdm.h
|
||||
+++ b/include/ddk/wdm.h
|
||||
@@ -1529,6 +1529,7 @@ PSLIST_ENTRY WINAPI ExInterlockedPopEntrySList(PSLIST_HEADER,PKSPIN_LOCK);
|
||||
PSLIST_ENTRY WINAPI ExInterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY,PKSPIN_LOCK);
|
||||
LIST_ENTRY * WINAPI ExInterlockedRemoveHeadList(LIST_ENTRY*,KSPIN_LOCK*);
|
||||
void WINAPI ExReleaseFastMutexUnsafe(PFAST_MUTEX);
|
||||
+void WINAPI ExReleaseResourceForThreadLite(ERESOURCE*,ERESOURCE_THREAD);
|
||||
|
||||
void WINAPI IoAcquireCancelSpinLock(KIRQL*);
|
||||
NTSTATUS WINAPI IoAllocateDriverObjectExtension(PDRIVER_OBJECT,PVOID,ULONG,PVOID*);
|
||||
--
|
||||
2.20.1
|
||||
|
@ -0,0 +1,68 @@
|
||||
From d211d0b1843d4bea1502be6b3bd236ab893b19c2 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Tue, 29 Jan 2019 21:44:23 -0600
|
||||
Subject: [PATCH 07/13] ntoskrnl.exe: Implement ExReleaseResourceLite().
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntoskrnl.exe/ntoskrnl.c | 8 --------
|
||||
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +-
|
||||
dlls/ntoskrnl.exe/sync.c | 13 +++++++++++++
|
||||
3 files changed, 14 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
index 5ab4db12..556b2ae8 100644
|
||||
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
@@ -3912,14 +3912,6 @@ NTSTATUS WINAPI DbgQueryDebugFilterState(ULONG component, ULONG level)
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
-/*********************************************************************
|
||||
- * ExReleaseResourceLite (NTOSKRNL.@)
|
||||
- */
|
||||
-void WINAPI ExReleaseResourceLite(PERESOURCE resource)
|
||||
-{
|
||||
- FIXME("stub: %p\n", resource);
|
||||
-}
|
||||
-
|
||||
/*********************************************************************
|
||||
* PsGetProcessWow64Process (NTOSKRNL.@)
|
||||
*/
|
||||
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
index c32f4590..79db7ee8 100644
|
||||
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
@@ -9,7 +9,7 @@
|
||||
@ stdcall -arch=i386 -norelay ExInterlockedPushEntrySList (ptr ptr ptr) NTOSKRNL_ExInterlockedPushEntrySList
|
||||
@ stub ExReInitializeRundownProtection
|
||||
@ stdcall -norelay ExReleaseFastMutexUnsafe(ptr)
|
||||
-@ stdcall ExReleaseResourceLite(ptr)
|
||||
+@ stdcall -norelay ExReleaseResourceLite(ptr)
|
||||
@ stub ExReleaseRundownProtection
|
||||
@ stub ExReleaseRundownProtectionEx
|
||||
@ stub ExRundownCompleted
|
||||
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
|
||||
index 450e4417..0553db7f 100644
|
||||
--- a/dlls/ntoskrnl.exe/sync.c
|
||||
+++ b/dlls/ntoskrnl.exe/sync.c
|
||||
@@ -1006,3 +1006,16 @@ void WINAPI ExReleaseResourceForThreadLite( ERESOURCE *resource, ERESOURCE_THREA
|
||||
|
||||
KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * ExReleaseResourceLite (NTOSKRNL.EXE.@)
|
||||
+ */
|
||||
+#ifdef DEFINE_FASTCALL1_ENTRYPOINT
|
||||
+DEFINE_FASTCALL1_ENTRYPOINT( ExReleaseResourceLite )
|
||||
+void WINAPI DECLSPEC_HIDDEN __regs_ExReleaseResourceLite( ERESOURCE *resource )
|
||||
+#else
|
||||
+void WINAPI ExReleaseResourceLite( ERESOURCE *resource )
|
||||
+#endif
|
||||
+{
|
||||
+ ExReleaseResourceForThreadLite( resource, (ERESOURCE_THREAD)KeGetCurrentThread() );
|
||||
+}
|
||||
--
|
||||
2.20.1
|
||||
|
@ -0,0 +1,70 @@
|
||||
From 977a76e8ed97d3dee870738b6fecfd3bc515e270 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Tue, 29 Jan 2019 21:47:14 -0600
|
||||
Subject: [PATCH 08/13] ntoskrnl.exe: Implement ExDeleteResourceLite().
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntoskrnl.exe/ntoskrnl.c | 9 ---------
|
||||
dlls/ntoskrnl.exe/sync.c | 12 ++++++++++++
|
||||
include/ddk/wdm.h | 1 +
|
||||
3 files changed, 13 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
index 556b2ae8..3cae33c9 100644
|
||||
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
|
||||
@@ -3038,15 +3038,6 @@ NTSTATUS WINAPI IoCsqInitialize(PIO_CSQ csq, PIO_CSQ_INSERT_IRP insert_irp, PIO_
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
-/***********************************************************************
|
||||
- * ExDeleteResourceLite (NTOSKRNL.EXE.@)
|
||||
- */
|
||||
-NTSTATUS WINAPI ExDeleteResourceLite(PERESOURCE resource)
|
||||
-{
|
||||
- FIXME("(%p): stub\n", resource);
|
||||
- return STATUS_NOT_IMPLEMENTED;
|
||||
-}
|
||||
-
|
||||
/***********************************************************************
|
||||
* KeEnterCriticalRegion (NTOSKRNL.EXE.@)
|
||||
*/
|
||||
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
|
||||
index 0553db7f..705ea2c7 100644
|
||||
--- a/dlls/ntoskrnl.exe/sync.c
|
||||
+++ b/dlls/ntoskrnl.exe/sync.c
|
||||
@@ -688,6 +688,18 @@ NTSTATUS WINAPI ExInitializeResourceLite( ERESOURCE *resource )
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
+/***********************************************************************
|
||||
+ * ExDeleteResourceLite (NTOSKRNL.EXE.@)
|
||||
+ */
|
||||
+NTSTATUS WINAPI ExDeleteResourceLite( ERESOURCE *resource )
|
||||
+{
|
||||
+ TRACE("resource %p.\n", resource);
|
||||
+ heap_free(resource->OwnerTable);
|
||||
+ heap_free(resource->ExclusiveWaiters);
|
||||
+ heap_free(resource->SharedWaiters);
|
||||
+ return STATUS_SUCCESS;
|
||||
+}
|
||||
+
|
||||
/* Find an existing entry in the shared owner list, or create a new one. */
|
||||
static OWNER_ENTRY *resource_get_shared_entry( ERESOURCE *resource, ERESOURCE_THREAD thread )
|
||||
{
|
||||
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
|
||||
index e95458bf..69efdb7a 100644
|
||||
--- a/include/ddk/wdm.h
|
||||
+++ b/include/ddk/wdm.h
|
||||
@@ -1521,6 +1521,7 @@ PVOID WINAPI ExAllocatePoolWithQuota(POOL_TYPE,SIZE_T);
|
||||
PVOID WINAPI ExAllocatePoolWithTag(POOL_TYPE,SIZE_T,ULONG);
|
||||
PVOID WINAPI ExAllocatePoolWithQuotaTag(POOL_TYPE,SIZE_T,ULONG);
|
||||
void WINAPI ExDeleteNPagedLookasideList(PNPAGED_LOOKASIDE_LIST);
|
||||
+NTSTATUS WINAPI ExDeleteResourceLite(ERESOURCE*);
|
||||
void WINAPI ExFreePool(PVOID);
|
||||
void WINAPI ExFreePoolWithTag(PVOID,ULONG);
|
||||
void WINAPI ExInitializeNPagedLookasideList(PNPAGED_LOOKASIDE_LIST,PALLOCATE_FUNCTION,PFREE_FUNCTION,ULONG,SIZE_T,ULONG,USHORT);
|
||||
--
|
||||
2.20.1
|
||||
|
@ -0,0 +1,67 @@
|
||||
From 15fd135cd7bc46416235eee58ebac0d35d8e0d9e Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Tue, 29 Jan 2019 21:48:49 -0600
|
||||
Subject: [PATCH 09/13] ntoskrnl.exe: Implement ExGetExclusiveWaiterCount().
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +-
|
||||
dlls/ntoskrnl.exe/sync.c | 19 +++++++++++++++++++
|
||||
include/ddk/wdm.h | 1 +
|
||||
3 files changed, 21 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
index 79db7ee8..3d6ed649 100644
|
||||
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
@@ -146,7 +146,7 @@
|
||||
@ stub ExFreeToPagedLookasideList
|
||||
@ stub ExGetCurrentProcessorCounts
|
||||
@ stub ExGetCurrentProcessorCpuUsage
|
||||
-@ stub ExGetExclusiveWaiterCount
|
||||
+@ stdcall ExGetExclusiveWaiterCount(ptr)
|
||||
@ stub ExGetPreviousMode
|
||||
@ stub ExGetSharedWaiterCount
|
||||
@ stdcall ExInitializeNPagedLookasideList(ptr ptr ptr long long long long)
|
||||
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
|
||||
index 705ea2c7..d024ee9f 100644
|
||||
--- a/dlls/ntoskrnl.exe/sync.c
|
||||
+++ b/dlls/ntoskrnl.exe/sync.c
|
||||
@@ -1031,3 +1031,22 @@ void WINAPI ExReleaseResourceLite( ERESOURCE *resource )
|
||||
{
|
||||
ExReleaseResourceForThreadLite( resource, (ERESOURCE_THREAD)KeGetCurrentThread() );
|
||||
}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * ExGetExclusiveWaiterCount (NTOSKRNL.EXE.@)
|
||||
+ */
|
||||
+ULONG WINAPI ExGetExclusiveWaiterCount( ERESOURCE *resource )
|
||||
+{
|
||||
+ ULONG count;
|
||||
+ KIRQL irql;
|
||||
+
|
||||
+ TRACE("resource %p.\n", resource);
|
||||
+
|
||||
+ KeAcquireSpinLock( &resource->SpinLock, &irql );
|
||||
+
|
||||
+ count = resource->NumberOfExclusiveWaiters;
|
||||
+
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
|
||||
index 69efdb7a..f7ced72a 100644
|
||||
--- a/include/ddk/wdm.h
|
||||
+++ b/include/ddk/wdm.h
|
||||
@@ -1524,6 +1524,7 @@ void WINAPI ExDeleteNPagedLookasideList(PNPAGED_LOOKASIDE_LIST);
|
||||
NTSTATUS WINAPI ExDeleteResourceLite(ERESOURCE*);
|
||||
void WINAPI ExFreePool(PVOID);
|
||||
void WINAPI ExFreePoolWithTag(PVOID,ULONG);
|
||||
+ULONG WINAPI ExGetExclusiveWaiterCount(ERESOURCE*);
|
||||
void WINAPI ExInitializeNPagedLookasideList(PNPAGED_LOOKASIDE_LIST,PALLOCATE_FUNCTION,PFREE_FUNCTION,ULONG,SIZE_T,ULONG,USHORT);
|
||||
NTSTATUS WINAPI ExInitializeResourceLite(ERESOURCE*);
|
||||
PSLIST_ENTRY WINAPI ExInterlockedPopEntrySList(PSLIST_HEADER,PKSPIN_LOCK);
|
||||
--
|
||||
2.20.1
|
||||
|
@ -0,0 +1,67 @@
|
||||
From c497239999dfae6e989f27118c5289e2d0bf5c0d Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Tue, 29 Jan 2019 21:49:26 -0600
|
||||
Subject: [PATCH 10/13] ntoskrnl.exe: Implement ExGetSharedWaiterCount().
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +-
|
||||
dlls/ntoskrnl.exe/sync.c | 19 +++++++++++++++++++
|
||||
include/ddk/wdm.h | 1 +
|
||||
3 files changed, 21 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
index 3d6ed649..45553e06 100644
|
||||
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
@@ -148,7 +148,7 @@
|
||||
@ stub ExGetCurrentProcessorCpuUsage
|
||||
@ stdcall ExGetExclusiveWaiterCount(ptr)
|
||||
@ stub ExGetPreviousMode
|
||||
-@ stub ExGetSharedWaiterCount
|
||||
+@ stdcall ExGetSharedWaiterCount(ptr)
|
||||
@ stdcall ExInitializeNPagedLookasideList(ptr ptr ptr long long long long)
|
||||
@ stdcall ExInitializePagedLookasideList(ptr ptr ptr long long long long)
|
||||
@ stdcall ExInitializeResourceLite(ptr)
|
||||
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
|
||||
index d024ee9f..ad68e7ea 100644
|
||||
--- a/dlls/ntoskrnl.exe/sync.c
|
||||
+++ b/dlls/ntoskrnl.exe/sync.c
|
||||
@@ -1050,3 +1050,22 @@ ULONG WINAPI ExGetExclusiveWaiterCount( ERESOURCE *resource )
|
||||
|
||||
return count;
|
||||
}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * ExGetSharedWaiterCount (NTOSKRNL.EXE.@)
|
||||
+ */
|
||||
+ULONG WINAPI ExGetSharedWaiterCount( ERESOURCE *resource )
|
||||
+{
|
||||
+ ULONG count;
|
||||
+ KIRQL irql;
|
||||
+
|
||||
+ TRACE("resource %p.\n", resource);
|
||||
+
|
||||
+ KeAcquireSpinLock( &resource->SpinLock, &irql );
|
||||
+
|
||||
+ count = resource->NumberOfSharedWaiters;
|
||||
+
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
|
||||
index f7ced72a..7a4be723 100644
|
||||
--- a/include/ddk/wdm.h
|
||||
+++ b/include/ddk/wdm.h
|
||||
@@ -1525,6 +1525,7 @@ NTSTATUS WINAPI ExDeleteResourceLite(ERESOURCE*);
|
||||
void WINAPI ExFreePool(PVOID);
|
||||
void WINAPI ExFreePoolWithTag(PVOID,ULONG);
|
||||
ULONG WINAPI ExGetExclusiveWaiterCount(ERESOURCE*);
|
||||
+ULONG WINAPI ExGetSharedWaiterCount(ERESOURCE*);
|
||||
void WINAPI ExInitializeNPagedLookasideList(PNPAGED_LOOKASIDE_LIST,PALLOCATE_FUNCTION,PFREE_FUNCTION,ULONG,SIZE_T,ULONG,USHORT);
|
||||
NTSTATUS WINAPI ExInitializeResourceLite(ERESOURCE*);
|
||||
PSLIST_ENTRY WINAPI ExInterlockedPopEntrySList(PSLIST_HEADER,PKSPIN_LOCK);
|
||||
--
|
||||
2.20.1
|
||||
|
@ -0,0 +1,68 @@
|
||||
From 7a4285a1f926b9a1caba1f815b9b781857a0997e Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Tue, 29 Jan 2019 21:50:37 -0600
|
||||
Subject: [PATCH 11/13] ntoskrnl.exe: Implement
|
||||
ExIsResourceAcquiredExclusiveLite().
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +-
|
||||
dlls/ntoskrnl.exe/sync.c | 19 +++++++++++++++++++
|
||||
include/ddk/wdm.h | 1 +
|
||||
3 files changed, 21 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
index 45553e06..66f0b7d9 100644
|
||||
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
@@ -165,7 +165,7 @@
|
||||
@ stub ExInterlockedPushEntryList
|
||||
@ stdcall ExInterlockedRemoveHeadList(ptr ptr)
|
||||
@ stub ExIsProcessorFeaturePresent
|
||||
-@ stub ExIsResourceAcquiredExclusiveLite
|
||||
+@ stdcall ExIsResourceAcquiredExclusiveLite(ptr)
|
||||
@ stub ExIsResourceAcquiredSharedLite
|
||||
@ stdcall ExLocalTimeToSystemTime(ptr ptr) RtlLocalTimeToSystemTime
|
||||
@ stub ExNotifyCallback
|
||||
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
|
||||
index ad68e7ea..cee15605 100644
|
||||
--- a/dlls/ntoskrnl.exe/sync.c
|
||||
+++ b/dlls/ntoskrnl.exe/sync.c
|
||||
@@ -1069,3 +1069,22 @@ ULONG WINAPI ExGetSharedWaiterCount( ERESOURCE *resource )
|
||||
|
||||
return count;
|
||||
}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * ExIsResourceAcquiredExclusiveLite (NTOSKRNL.EXE.@)
|
||||
+ */
|
||||
+BOOLEAN WINAPI ExIsResourceAcquiredExclusiveLite( ERESOURCE *resource )
|
||||
+{
|
||||
+ BOOLEAN ret;
|
||||
+ KIRQL irql;
|
||||
+
|
||||
+ TRACE("resource %p.\n", resource);
|
||||
+
|
||||
+ KeAcquireSpinLock( &resource->SpinLock, &irql );
|
||||
+
|
||||
+ ret = (resource->OwnerEntry.OwnerThread == (ERESOURCE_THREAD)KeGetCurrentThread());
|
||||
+
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
|
||||
index 7a4be723..76eb6117 100644
|
||||
--- a/include/ddk/wdm.h
|
||||
+++ b/include/ddk/wdm.h
|
||||
@@ -1531,6 +1531,7 @@ NTSTATUS WINAPI ExInitializeResourceLite(ERESOURCE*);
|
||||
PSLIST_ENTRY WINAPI ExInterlockedPopEntrySList(PSLIST_HEADER,PKSPIN_LOCK);
|
||||
PSLIST_ENTRY WINAPI ExInterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY,PKSPIN_LOCK);
|
||||
LIST_ENTRY * WINAPI ExInterlockedRemoveHeadList(LIST_ENTRY*,KSPIN_LOCK*);
|
||||
+BOOLEAN WINAPI ExIsResourceAcquiredExclusiveLite(ERESOURCE*);
|
||||
void WINAPI ExReleaseFastMutexUnsafe(PFAST_MUTEX);
|
||||
void WINAPI ExReleaseResourceForThreadLite(ERESOURCE*,ERESOURCE_THREAD);
|
||||
|
||||
--
|
||||
2.20.1
|
||||
|
@ -0,0 +1,74 @@
|
||||
From 5203c63e18a2461b1909996ec1ffbcc662d57865 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Tue, 29 Jan 2019 21:51:08 -0600
|
||||
Subject: [PATCH 12/13] ntoskrnl.exe: Implement
|
||||
ExIsResourceAcquiredSharedLite().
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +-
|
||||
dlls/ntoskrnl.exe/sync.c | 25 +++++++++++++++++++++++++
|
||||
include/ddk/wdm.h | 1 +
|
||||
3 files changed, 27 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
index 66f0b7d9..127c5ef3 100644
|
||||
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
|
||||
@@ -166,7 +166,7 @@
|
||||
@ stdcall ExInterlockedRemoveHeadList(ptr ptr)
|
||||
@ stub ExIsProcessorFeaturePresent
|
||||
@ stdcall ExIsResourceAcquiredExclusiveLite(ptr)
|
||||
-@ stub ExIsResourceAcquiredSharedLite
|
||||
+@ stdcall ExIsResourceAcquiredSharedLite(ptr)
|
||||
@ stdcall ExLocalTimeToSystemTime(ptr ptr) RtlLocalTimeToSystemTime
|
||||
@ stub ExNotifyCallback
|
||||
@ stub ExQueryPoolBlockSize
|
||||
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
|
||||
index cee15605..5154ea5c 100644
|
||||
--- a/dlls/ntoskrnl.exe/sync.c
|
||||
+++ b/dlls/ntoskrnl.exe/sync.c
|
||||
@@ -1088,3 +1088,28 @@ BOOLEAN WINAPI ExIsResourceAcquiredExclusiveLite( ERESOURCE *resource )
|
||||
|
||||
return ret;
|
||||
}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * ExIsResourceAcquiredSharedLite (NTOSKRNL.EXE.@)
|
||||
+ */
|
||||
+ULONG WINAPI ExIsResourceAcquiredSharedLite( ERESOURCE *resource )
|
||||
+{
|
||||
+ ULONG ret;
|
||||
+ KIRQL irql;
|
||||
+
|
||||
+ TRACE("resource %p.\n", resource);
|
||||
+
|
||||
+ KeAcquireSpinLock( &resource->SpinLock, &irql );
|
||||
+
|
||||
+ if (resource->OwnerEntry.OwnerThread == (ERESOURCE_THREAD)KeGetCurrentThread())
|
||||
+ ret = resource->ActiveEntries;
|
||||
+ else
|
||||
+ {
|
||||
+ OWNER_ENTRY *entry = resource_get_shared_entry( resource, (ERESOURCE_THREAD)KeGetCurrentThread() );
|
||||
+ ret = entry->OwnerCount;
|
||||
+ }
|
||||
+
|
||||
+ KeReleaseSpinLock( &resource->SpinLock, irql );
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
|
||||
index 76eb6117..e5a2906f 100644
|
||||
--- a/include/ddk/wdm.h
|
||||
+++ b/include/ddk/wdm.h
|
||||
@@ -1532,6 +1532,7 @@ PSLIST_ENTRY WINAPI ExInterlockedPopEntrySList(PSLIST_HEADER,PKSPIN_LOCK);
|
||||
PSLIST_ENTRY WINAPI ExInterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY,PKSPIN_LOCK);
|
||||
LIST_ENTRY * WINAPI ExInterlockedRemoveHeadList(LIST_ENTRY*,KSPIN_LOCK*);
|
||||
BOOLEAN WINAPI ExIsResourceAcquiredExclusiveLite(ERESOURCE*);
|
||||
+ULONG WINAPI ExIsResourceAcquiredSharedLite(ERESOURCE*);
|
||||
void WINAPI ExReleaseFastMutexUnsafe(PFAST_MUTEX);
|
||||
void WINAPI ExReleaseResourceForThreadLite(ERESOURCE*,ERESOURCE_THREAD);
|
||||
|
||||
--
|
||||
2.20.1
|
||||
|
@ -0,0 +1,383 @@
|
||||
From 85acc986954ed6476fe459fc60fafee7211eb556 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Tue, 29 Jan 2019 21:54:39 -0600
|
||||
Subject: [PATCH 13/13] ntoskrnl.exe/tests: Add tests for ERESOURCE functions.
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntoskrnl.exe/tests/driver.c | 311 ++++++++++++++++++++++++++++++-
|
||||
include/ddk/wdm.h | 2 +
|
||||
2 files changed, 312 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
|
||||
index 3984240e..6d64cc8e 100644
|
||||
--- a/dlls/ntoskrnl.exe/tests/driver.c
|
||||
+++ b/dlls/ntoskrnl.exe/tests/driver.c
|
||||
@@ -289,7 +289,14 @@ static NTSTATUS wait_multiple(ULONG count, void *objs[], WAIT_TYPE wait_type, UL
|
||||
return KeWaitForMultipleObjects(count, objs, wait_type, Executive, KernelMode, FALSE, &integer, NULL);
|
||||
}
|
||||
|
||||
-static void run_thread(PKSTART_ROUTINE proc, void *arg)
|
||||
+static void sleep(void)
|
||||
+{
|
||||
+ LARGE_INTEGER timeout;
|
||||
+ timeout.QuadPart = -2000;
|
||||
+ KeDelayExecutionThread( KernelMode, FALSE, &timeout );
|
||||
+}
|
||||
+
|
||||
+static HANDLE create_thread(PKSTART_ROUTINE proc, void *arg)
|
||||
{
|
||||
OBJECT_ATTRIBUTES attr = {0};
|
||||
HANDLE thread;
|
||||
@@ -300,12 +307,25 @@ static void run_thread(PKSTART_ROUTINE proc, void *arg)
|
||||
ret = PsCreateSystemThread(&thread, THREAD_ALL_ACCESS, &attr, NULL, NULL, proc, arg);
|
||||
ok(!ret, "got %#x\n", ret);
|
||||
|
||||
+ return thread;
|
||||
+}
|
||||
+
|
||||
+static void join_thread(HANDLE thread)
|
||||
+{
|
||||
+ NTSTATUS ret;
|
||||
+
|
||||
ret = ZwWaitForSingleObject(thread, FALSE, NULL);
|
||||
ok(!ret, "got %#x\n", ret);
|
||||
ret = ZwClose(thread);
|
||||
ok(!ret, "got %#x\n", ret);
|
||||
}
|
||||
|
||||
+static void run_thread(PKSTART_ROUTINE proc, void *arg)
|
||||
+{
|
||||
+ HANDLE thread = create_thread(proc, arg);
|
||||
+ join_thread(thread);
|
||||
+}
|
||||
+
|
||||
static KMUTEX test_mutex;
|
||||
|
||||
static void WINAPI mutex_thread(void *arg)
|
||||
@@ -636,6 +656,294 @@ static void test_version(void)
|
||||
ok(*pNtBuildNumber == build, "Expected build number %u, got %u\n", build, *pNtBuildNumber);
|
||||
}
|
||||
|
||||
+static void check_resource_(int line, ERESOURCE *resource, ULONG exclusive_waiters,
|
||||
+ ULONG shared_waiters, BOOLEAN exclusive, ULONG shared_count)
|
||||
+{
|
||||
+ BOOLEAN ret;
|
||||
+ ULONG count;
|
||||
+
|
||||
+ count = ExGetExclusiveWaiterCount(resource);
|
||||
+ ok_(__FILE__, line, count == exclusive_waiters,
|
||||
+ "expected %u exclusive waiters, got %u\n", exclusive_waiters, count);
|
||||
+ count = ExGetSharedWaiterCount(resource);
|
||||
+ ok_(__FILE__, line, count == shared_waiters,
|
||||
+ "expected %u shared waiters, got %u\n", shared_waiters, count);
|
||||
+ ret = ExIsResourceAcquiredExclusiveLite(resource);
|
||||
+ ok_(__FILE__, line, ret == exclusive,
|
||||
+ "expected exclusive %u, got %u\n", exclusive, ret);
|
||||
+ count = ExIsResourceAcquiredSharedLite(resource);
|
||||
+ ok_(__FILE__, line, count == shared_count,
|
||||
+ "expected shared %u, got %u\n", shared_count, count);
|
||||
+}
|
||||
+#define check_resource(a,b,c,d,e) check_resource_(__LINE__,a,b,c,d,e)
|
||||
+
|
||||
+static KEVENT resource_shared_ready, resource_shared_done, resource_exclusive_ready, resource_exclusive_done;
|
||||
+
|
||||
+static void WINAPI resource_shared_thread(void *arg)
|
||||
+{
|
||||
+ ERESOURCE *resource = arg;
|
||||
+ BOOLEAN ret;
|
||||
+
|
||||
+ check_resource(resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireResourceSharedLite(resource, TRUE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+
|
||||
+ check_resource(resource, 0, 0, FALSE, 1);
|
||||
+
|
||||
+ KeSetEvent(&resource_shared_ready, IO_NO_INCREMENT, FALSE);
|
||||
+ KeWaitForSingleObject(&resource_shared_done, Executive, KernelMode, FALSE, NULL);
|
||||
+
|
||||
+ ExReleaseResourceForThreadLite(resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+
|
||||
+ PsTerminateSystemThread(STATUS_SUCCESS);
|
||||
+}
|
||||
+
|
||||
+static void WINAPI resource_exclusive_thread(void *arg)
|
||||
+{
|
||||
+ ERESOURCE *resource = arg;
|
||||
+ BOOLEAN ret;
|
||||
+
|
||||
+ check_resource(resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireResourceExclusiveLite(resource, TRUE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+
|
||||
+ check_resource(resource, 0, 0, TRUE, 1);
|
||||
+
|
||||
+ KeSetEvent(&resource_exclusive_ready, IO_NO_INCREMENT, FALSE);
|
||||
+ KeWaitForSingleObject(&resource_exclusive_done, Executive, KernelMode, FALSE, NULL);
|
||||
+
|
||||
+ ExReleaseResourceForThreadLite(resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+
|
||||
+ PsTerminateSystemThread(STATUS_SUCCESS);
|
||||
+}
|
||||
+
|
||||
+static void test_resource(void)
|
||||
+{
|
||||
+ ERESOURCE resource;
|
||||
+ NTSTATUS status;
|
||||
+ BOOLEAN ret;
|
||||
+ HANDLE thread, thread2;
|
||||
+
|
||||
+ memset(&resource, 0xcc, sizeof(resource));
|
||||
+
|
||||
+ status = ExInitializeResourceLite(&resource);
|
||||
+ ok(status == STATUS_SUCCESS, "got status %#x\n", status);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ KeEnterCriticalRegion();
|
||||
+
|
||||
+ ret = ExAcquireResourceExclusiveLite(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, TRUE, 1);
|
||||
+
|
||||
+ ret = ExAcquireResourceExclusiveLite(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, TRUE, 2);
|
||||
+
|
||||
+ ret = ExAcquireResourceSharedLite(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, TRUE, 3);
|
||||
+
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+ check_resource(&resource, 0, 0, TRUE, 2);
|
||||
+
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+ check_resource(&resource, 0, 0, TRUE, 1);
|
||||
+
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireResourceSharedLite(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 1);
|
||||
+
|
||||
+ ret = ExAcquireResourceSharedLite(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 2);
|
||||
+
|
||||
+ ret = ExAcquireResourceExclusiveLite(&resource, FALSE);
|
||||
+ ok(ret == FALSE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 2);
|
||||
+
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+ check_resource(&resource, 0, 0, FALSE, 1);
|
||||
+
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireSharedStarveExclusive(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 1);
|
||||
+
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireSharedWaitForExclusive(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 1);
|
||||
+
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ /* Do not acquire the resource ourselves, but spawn a shared thread holding it. */
|
||||
+
|
||||
+ KeInitializeEvent(&resource_shared_ready, SynchronizationEvent, FALSE);
|
||||
+ KeInitializeEvent(&resource_shared_done, SynchronizationEvent, FALSE);
|
||||
+ thread = create_thread(resource_shared_thread, &resource);
|
||||
+ KeWaitForSingleObject(&resource_shared_ready, Executive, KernelMode, FALSE, NULL);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireResourceExclusiveLite(&resource, FALSE);
|
||||
+ ok(ret == FALSE, "got ret %u\n", ret);
|
||||
+
|
||||
+ ret = ExAcquireResourceSharedLite(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 1);
|
||||
+
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireSharedStarveExclusive(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 1);
|
||||
+
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireSharedWaitForExclusive(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 1);
|
||||
+
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ KeSetEvent(&resource_shared_done, IO_NO_INCREMENT, FALSE);
|
||||
+ join_thread(thread);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ /* Acquire the resource as exclusive, and then spawn a shared thread. */
|
||||
+
|
||||
+ ret = ExAcquireResourceExclusiveLite(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, TRUE, 1);
|
||||
+
|
||||
+ thread = create_thread(resource_shared_thread, &resource);
|
||||
+ sleep();
|
||||
+ check_resource(&resource, 0, 1, TRUE, 1);
|
||||
+
|
||||
+ ret = ExAcquireResourceExclusiveLite(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 1, TRUE, 2);
|
||||
+
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+ KeWaitForSingleObject(&resource_shared_ready, Executive, KernelMode, FALSE, NULL);
|
||||
+ KeSetEvent(&resource_shared_done, IO_NO_INCREMENT, FALSE);
|
||||
+ join_thread(thread);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ /* Do not acquire the resource ourselves, but spawn an exclusive thread holding it. */
|
||||
+
|
||||
+ KeInitializeEvent(&resource_exclusive_ready, SynchronizationEvent, FALSE);
|
||||
+ KeInitializeEvent(&resource_exclusive_done, SynchronizationEvent, FALSE);
|
||||
+ thread = create_thread(resource_exclusive_thread, &resource);
|
||||
+ KeWaitForSingleObject(&resource_exclusive_ready, Executive, KernelMode, FALSE, NULL);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireResourceExclusiveLite(&resource, FALSE);
|
||||
+ ok(ret == FALSE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireResourceSharedLite(&resource, FALSE);
|
||||
+ ok(ret == FALSE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireSharedStarveExclusive(&resource, FALSE);
|
||||
+ ok(ret == FALSE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireSharedWaitForExclusive(&resource, FALSE);
|
||||
+ ok(ret == FALSE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ KeSetEvent(&resource_exclusive_done, IO_NO_INCREMENT, FALSE);
|
||||
+ join_thread(thread);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ /* Acquire the resource as shared, and then spawn an exclusive waiter. */
|
||||
+
|
||||
+ ret = ExAcquireResourceSharedLite(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 1);
|
||||
+
|
||||
+ thread = create_thread(resource_exclusive_thread, &resource);
|
||||
+ sleep();
|
||||
+ check_resource(&resource, 1, 0, FALSE, 1);
|
||||
+
|
||||
+ ret = ExAcquireResourceSharedLite(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 1, 0, FALSE, 2);
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+
|
||||
+ ret = ExAcquireSharedStarveExclusive(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 1, 0, FALSE, 2);
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+
|
||||
+ ret = ExAcquireSharedWaitForExclusive(&resource, FALSE);
|
||||
+ ok(ret == FALSE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 1, 0, FALSE, 1);
|
||||
+
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+ KeWaitForSingleObject(&resource_exclusive_ready, Executive, KernelMode, FALSE, NULL);
|
||||
+ KeSetEvent(&resource_exclusive_done, IO_NO_INCREMENT, FALSE);
|
||||
+ join_thread(thread);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ /* Spawn a shared and then exclusive waiter. */
|
||||
+
|
||||
+ KeInitializeEvent(&resource_shared_ready, SynchronizationEvent, FALSE);
|
||||
+ KeInitializeEvent(&resource_shared_done, SynchronizationEvent, FALSE);
|
||||
+ thread = create_thread(resource_shared_thread, &resource);
|
||||
+ KeWaitForSingleObject(&resource_shared_ready, Executive, KernelMode, FALSE, NULL);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ thread2 = create_thread(resource_exclusive_thread, &resource);
|
||||
+ sleep();
|
||||
+ check_resource(&resource, 1, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireResourceExclusiveLite(&resource, FALSE);
|
||||
+ ok(ret == FALSE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 1, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireResourceSharedLite(&resource, FALSE);
|
||||
+ ok(ret == FALSE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 1, 0, FALSE, 0);
|
||||
+
|
||||
+ ret = ExAcquireSharedStarveExclusive(&resource, FALSE);
|
||||
+ ok(ret == TRUE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 1, 0, FALSE, 1);
|
||||
+ ExReleaseResourceForThreadLite(&resource, (ULONG_PTR)PsGetCurrentThread());
|
||||
+
|
||||
+ ret = ExAcquireSharedWaitForExclusive(&resource, FALSE);
|
||||
+ ok(ret == FALSE, "got ret %u\n", ret);
|
||||
+ check_resource(&resource, 1, 0, FALSE, 0);
|
||||
+
|
||||
+ KeSetEvent(&resource_shared_done, IO_NO_INCREMENT, FALSE);
|
||||
+ join_thread(thread);
|
||||
+ KeWaitForSingleObject(&resource_exclusive_ready, Executive, KernelMode, FALSE, NULL);
|
||||
+ KeSetEvent(&resource_exclusive_done, IO_NO_INCREMENT, FALSE);
|
||||
+ join_thread(thread2);
|
||||
+ check_resource(&resource, 0, 0, FALSE, 0);
|
||||
+
|
||||
+ KeLeaveCriticalRegion();
|
||||
+
|
||||
+ status = ExDeleteResourceLite(&resource);
|
||||
+ ok(status == STATUS_SUCCESS, "got status %#x\n", status);
|
||||
+}
|
||||
+
|
||||
static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
|
||||
{
|
||||
ULONG length = stack->Parameters.DeviceIoControl.OutputBufferLength;
|
||||
@@ -669,6 +977,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
|
||||
test_version();
|
||||
test_stack_callout();
|
||||
test_lookaside_list();
|
||||
+ test_resource();
|
||||
|
||||
/* print process report */
|
||||
if (test_input->winetest_debug)
|
||||
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
|
||||
index e5a2906f..0677be69 100644
|
||||
--- a/include/ddk/wdm.h
|
||||
+++ b/include/ddk/wdm.h
|
||||
@@ -1578,6 +1578,7 @@ void WINAPI KeAcquireSpinLockAtDpcLevel(KSPIN_LOCK*);
|
||||
BOOLEAN WINAPI KeCancelTimer(KTIMER*);
|
||||
void WINAPI KeClearEvent(PRKEVENT);
|
||||
NTSTATUS WINAPI KeDelayExecutionThread(KPROCESSOR_MODE,BOOLEAN,LARGE_INTEGER*);
|
||||
+void WINAPI KeEnterCriticalRegion(void);
|
||||
PKTHREAD WINAPI KeGetCurrentThread(void);
|
||||
void WINAPI KeInitializeEvent(PRKEVENT,EVENT_TYPE,BOOLEAN);
|
||||
void WINAPI KeInitializeMutex(PRKMUTEX,ULONG);
|
||||
@@ -1585,6 +1586,7 @@ void WINAPI KeInitializeSemaphore(PRKSEMAPHORE,LONG,LONG);
|
||||
void WINAPI KeInitializeSpinLock(KSPIN_LOCK*);
|
||||
void WINAPI KeInitializeTimerEx(PKTIMER,TIMER_TYPE);
|
||||
void WINAPI KeInitializeTimer(KTIMER*);
|
||||
+void WINAPI KeLeaveCriticalRegion(void);
|
||||
void WINAPI KeQuerySystemTime(LARGE_INTEGER*);
|
||||
void WINAPI KeQueryTickCount(LARGE_INTEGER*);
|
||||
ULONG WINAPI KeQueryTimeIncrement(void);
|
||||
--
|
||||
2.20.1
|
||||
|
4
patches/ntoskrnl.exe-Resources/definition
Normal file
4
patches/ntoskrnl.exe-Resources/definition
Normal file
@ -0,0 +1,4 @@
|
||||
Fixes: [45819] Symantec Eraser Control Driver 'eeCtrl64.sys' (Norton 360) fails in driver entry point due to 'ntoskrnl.exe.ExInitializeResourceLite' stub (needs STATUS_SUCCESS)
|
||||
# This patch is fit for submission as far as I'm concerned, but it can't really
|
||||
# be submitted yet, since it depends on a working implementation of
|
||||
# KeGetCurrentThread() [at least, one that distinguishes different threads].
|
@ -236,6 +236,7 @@ patch_enable_all ()
|
||||
enable_ntdll_set_full_cpu_context="$1"
|
||||
enable_ntoskrnl_Stubs="$1"
|
||||
enable_ntoskrnl_exe_Fix_Relocation="$1"
|
||||
enable_ntoskrnl_exe_Resources="$1"
|
||||
enable_nvapi_Stub_DLL="$1"
|
||||
enable_nvcuda_CUDA_Support="$1"
|
||||
enable_nvcuvid_CUDA_Video_Support="$1"
|
||||
@ -861,6 +862,9 @@ patch_enable ()
|
||||
ntoskrnl.exe-Fix_Relocation)
|
||||
enable_ntoskrnl_exe_Fix_Relocation="$2"
|
||||
;;
|
||||
ntoskrnl.exe-Resources)
|
||||
enable_ntoskrnl_exe_Resources="$2"
|
||||
;;
|
||||
nvapi-Stub_DLL)
|
||||
enable_nvapi_Stub_DLL="$2"
|
||||
;;
|
||||
@ -1742,8 +1746,12 @@ if test "$enable_winedevice_Default_Drivers" -eq 1; then
|
||||
if test "$enable_ntoskrnl_Stubs" -gt 1; then
|
||||
abort "Patchset ntoskrnl-Stubs disabled, but winedevice-Default_Drivers depends on that."
|
||||
fi
|
||||
if test "$enable_ntoskrnl_exe_Resources" -gt 1; then
|
||||
abort "Patchset ntoskrnl.exe-Resources disabled, but winedevice-Default_Drivers depends on that."
|
||||
fi
|
||||
enable_dxva2_Video_Decoder=1
|
||||
enable_ntoskrnl_Stubs=1
|
||||
enable_ntoskrnl_exe_Resources=1
|
||||
fi
|
||||
|
||||
if test "$enable_wined3d_Indexed_Vertex_Blending" -eq 1; then
|
||||
@ -5056,6 +5064,47 @@ if test "$enable_ntoskrnl_exe_Fix_Relocation" -eq 1; then
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntoskrnl.exe-Resources
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#45819] Symantec Eraser Control Driver 'eeCtrl64.sys' (Norton 360) fails in driver entry point due to
|
||||
# | 'ntoskrnl.exe.ExInitializeResourceLite' stub (needs STATUS_SUCCESS)
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/ntoskrnl.exe/ntoskrnl.c, dlls/ntoskrnl.exe/ntoskrnl.exe.spec, dlls/ntoskrnl.exe/sync.c,
|
||||
# | dlls/ntoskrnl.exe/tests/driver.c, include/ddk/wdm.h
|
||||
# |
|
||||
if test "$enable_ntoskrnl_exe_Resources" -eq 1; then
|
||||
patch_apply ntoskrnl.exe-Resources/0001-ntoskrnl.exe-Implement-ExInitializeResourceLite.patch
|
||||
patch_apply ntoskrnl.exe-Resources/0002-ntoskrnl.exe-Implement-ExAcquireResourceExclusiveLit.patch
|
||||
patch_apply ntoskrnl.exe-Resources/0003-ntoskrnl.exe-Implement-ExAcquireResourceSharedLite.patch
|
||||
patch_apply ntoskrnl.exe-Resources/0004-ntoskrnl.exe-Implement-ExAcquireSharedStarveExclusiv.patch
|
||||
patch_apply ntoskrnl.exe-Resources/0005-ntoskrnl.exe-Implement-ExAcquireSharedWaitForExclusi.patch
|
||||
patch_apply ntoskrnl.exe-Resources/0006-ntoskrnl.exe-Implement-ExReleaseResourceForThreadLit.patch
|
||||
patch_apply ntoskrnl.exe-Resources/0007-ntoskrnl.exe-Implement-ExReleaseResourceLite.patch
|
||||
patch_apply ntoskrnl.exe-Resources/0008-ntoskrnl.exe-Implement-ExDeleteResourceLite.patch
|
||||
patch_apply ntoskrnl.exe-Resources/0009-ntoskrnl.exe-Implement-ExGetExclusiveWaiterCount.patch
|
||||
patch_apply ntoskrnl.exe-Resources/0010-ntoskrnl.exe-Implement-ExGetSharedWaiterCount.patch
|
||||
patch_apply ntoskrnl.exe-Resources/0011-ntoskrnl.exe-Implement-ExIsResourceAcquiredExclusive.patch
|
||||
patch_apply ntoskrnl.exe-Resources/0012-ntoskrnl.exe-Implement-ExIsResourceAcquiredSharedLit.patch
|
||||
patch_apply ntoskrnl.exe-Resources/0013-ntoskrnl.exe-tests-Add-tests-for-ERESOURCE-functions.patch
|
||||
(
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntoskrnl.exe: Implement ExInitializeResourceLite().", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntoskrnl.exe: Implement ExAcquireResourceExclusiveLite().", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntoskrnl.exe: Implement ExAcquireResourceSharedLite().", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntoskrnl.exe: Implement ExAcquireSharedStarveExclusive().", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntoskrnl.exe: Implement ExAcquireSharedWaitForExclusive().", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntoskrnl.exe: Implement ExReleaseResourceForThreadLite().", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntoskrnl.exe: Implement ExReleaseResourceLite().", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntoskrnl.exe: Implement ExDeleteResourceLite().", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntoskrnl.exe: Implement ExGetExclusiveWaiterCount().", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntoskrnl.exe: Implement ExGetSharedWaiterCount().", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntoskrnl.exe: Implement ExIsResourceAcquiredExclusiveLite().", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntoskrnl.exe: Implement ExIsResourceAcquiredSharedLite().", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntoskrnl.exe/tests: Add tests for ERESOURCE functions.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset nvcuvid-CUDA_Video_Support
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
@ -6967,7 +7016,7 @@ fi
|
||||
# Patchset winedevice-Default_Drivers
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * dxva2-Video_Decoder, ntoskrnl-Stubs
|
||||
# | * dxva2-Video_Decoder, ntoskrnl-Stubs, ntoskrnl.exe-Resources
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * configure.ac, dlls/dxgkrnl.sys/Makefile.in, dlls/dxgkrnl.sys/dxgkrnl.sys.spec, dlls/dxgkrnl.sys/main.c,
|
||||
|
@ -1,16 +1,16 @@
|
||||
From 6ac70538d8f1989386bfe95bdbdc61af60b482c7 Mon Sep 17 00:00:00 2001
|
||||
From 63ae0e1dd59a078db172a96b3c1d63db4e9d8245 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Thu, 8 Jun 2017 23:50:03 +0200
|
||||
Subject: [PATCH] programs/winedevice: Load some common drivers and fix ldr
|
||||
order.
|
||||
|
||||
---
|
||||
dlls/ntoskrnl.exe/tests/driver.c | 51 ++++++++++++++++++++++++++++++++++++++++
|
||||
programs/winedevice/device.c | 26 ++++++++++++++++++++
|
||||
dlls/ntoskrnl.exe/tests/driver.c | 51 ++++++++++++++++++++++++++++++++
|
||||
programs/winedevice/device.c | 26 ++++++++++++++++
|
||||
2 files changed, 77 insertions(+)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
|
||||
index 3984240..c467ac5 100644
|
||||
index 6d64cc8e..f3465b77 100644
|
||||
--- a/dlls/ntoskrnl.exe/tests/driver.c
|
||||
+++ b/dlls/ntoskrnl.exe/tests/driver.c
|
||||
@@ -38,6 +38,8 @@ static const WCHAR driver_device[] = {'\\','D','e','v','i','c','e',
|
||||
@ -22,8 +22,8 @@ index 3984240..c467ac5 100644
|
||||
static HANDLE okfile;
|
||||
static LONG successes;
|
||||
static LONG failures;
|
||||
@@ -636,6 +638,52 @@ static void test_version(void)
|
||||
ok(*pNtBuildNumber == build, "Expected build number %u, got %u\n", build, *pNtBuildNumber);
|
||||
@@ -944,6 +946,52 @@ static void test_resource(void)
|
||||
ok(status == STATUS_SUCCESS, "got status %#x\n", status);
|
||||
}
|
||||
|
||||
+static void test_default_modules(void)
|
||||
@ -75,15 +75,15 @@ index 3984240..c467ac5 100644
|
||||
static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
|
||||
{
|
||||
ULONG length = stack->Parameters.DeviceIoControl.OutputBufferLength;
|
||||
@@ -669,6 +717,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
|
||||
test_version();
|
||||
@@ -978,6 +1026,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
|
||||
test_stack_callout();
|
||||
test_lookaside_list();
|
||||
test_resource();
|
||||
+ test_default_modules();
|
||||
|
||||
/* print process report */
|
||||
if (test_input->winetest_debug)
|
||||
@@ -781,6 +830,8 @@ NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, PUNICODE_STRING registry)
|
||||
@@ -1090,6 +1139,8 @@ NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, PUNICODE_STRING registry)
|
||||
|
||||
DbgPrint("loading driver\n");
|
||||
|
||||
@ -93,7 +93,7 @@ index 3984240..c467ac5 100644
|
||||
driver->DriverUnload = driver_Unload;
|
||||
|
||||
diff --git a/programs/winedevice/device.c b/programs/winedevice/device.c
|
||||
index 201a041..33b332d 100644
|
||||
index 201a0411..33b332da 100644
|
||||
--- a/programs/winedevice/device.c
|
||||
+++ b/programs/winedevice/device.c
|
||||
@@ -124,7 +124,33 @@ static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_
|
||||
@ -131,5 +131,5 @@ index 201a041..33b332d 100644
|
||||
if (!(stop_event = CreateEventW( NULL, TRUE, FALSE, NULL )))
|
||||
return;
|
||||
--
|
||||
1.9.1
|
||||
2.20.1
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
Fixes: Simulate a more realistic kernel environment in ntoskrnl/winedevice
|
||||
Depends: dxva2-Video_Decoder
|
||||
Depends: ntoskrnl-Stubs
|
||||
Depends: ntoskrnl-Stubs
|
||||
Depends: ntoskrnl.exe-Resources
|
Loading…
x
Reference in New Issue
Block a user