From ce91c7959de3fabfffbfb8aaacd26a0cfcd3eda3 Mon Sep 17 00:00:00 2001 From: wj32 Date: Sun, 24 Jan 2010 03:23:43 +0000 Subject: [PATCH] added some unused hacks git-svn-id: svn://svn.code.sf.net/p/processhacker/code@2728 21ef857c-d57f-4fe0-8362-d861dc6d29cd --- 2.x/trunk/ProcessHacker/hndlinfo.c | 142 ++++++++++++++++++++------- 2.x/trunk/ProcessHacker/include/ph.h | 14 +++ 2 files changed, 122 insertions(+), 34 deletions(-) diff --git a/2.x/trunk/ProcessHacker/hndlinfo.c b/2.x/trunk/ProcessHacker/hndlinfo.c index 09afe2657..4776e1db6 100644 --- a/2.x/trunk/ProcessHacker/hndlinfo.c +++ b/2.x/trunk/ProcessHacker/hndlinfo.c @@ -23,12 +23,23 @@ #include #include +typedef enum _PH_QUERY_OBJECT_WORK +{ + QueryNameHack, + QuerySecurityHack, + SetSecurityHack +} PH_QUERY_OBJECT_WORK; + typedef struct _PH_QUERY_OBJECT_CONTEXT { LOGICAL Initialized; + PH_QUERY_OBJECT_WORK Work; + HANDLE Handle; - POBJECT_NAME_INFORMATION Buffer; + SECURITY_INFORMATION SecurityInformation; + PVOID Buffer; ULONG Length; + NTSTATUS Status; ULONG ReturnLength; } PH_QUERY_OBJECT_CONTEXT, *PPH_QUERY_OBJECT_CONTEXT; @@ -800,15 +811,8 @@ CleanupExit: return status; } -NTSTATUS PhQueryObjectNameHack( - __in HANDLE Handle, - __out_bcount(ObjectNameInformationLength) POBJECT_NAME_INFORMATION ObjectNameInformation, - __in ULONG ObjectNameInformationLength, - __out_opt PULONG ReturnLength - ) +BOOLEAN PhpHeadQueryObjectHack() { - ULONG waitResult; - PhAcquireMutex(&PhQueryObjectMutex); // Create a query thread if we don't have one. @@ -818,41 +822,37 @@ NTSTATUS PhQueryObjectNameHack( NULL, 0, (LPTHREAD_START_ROUTINE)PhpQueryObjectThreadStart, NULL, 0, NULL); if (!PhQueryObjectThreadHandle) - { - PhReleaseMutex(&PhQueryObjectMutex); - return STATUS_UNSUCCESSFUL; - } + return FALSE; } // Create the events if they don't exist. + if (!PhQueryObjectStartEvent) { if (!(PhQueryObjectStartEvent = CreateEvent(NULL, FALSE, FALSE, NULL))) - { - PhReleaseMutex(&PhQueryObjectMutex); - return STATUS_UNSUCCESSFUL; - } + return FALSE; } if (!PhQueryObjectCompletedEvent) { if (!(PhQueryObjectCompletedEvent = CreateEvent(NULL, FALSE, FALSE, NULL))) - { - PhReleaseMutex(&PhQueryObjectMutex); - return STATUS_UNSUCCESSFUL; - } + return FALSE; } - // Initialize the work context. - PhQueryObjectContext.Handle = Handle; - PhQueryObjectContext.Buffer = ObjectNameInformation; - PhQueryObjectContext.Length = ObjectNameInformationLength; + return TRUE; +} + +NTSTATUS PhpTailQueryObjectHack( + __out_opt PULONG ReturnLength + ) +{ + ULONG waitResult; + PhQueryObjectContext.Initialized = TRUE; // Allow the worker thread to start. SetEvent(PhQueryObjectStartEvent); // Wait for the work to complete, with a timeout of 1 second. waitResult = WaitForSingleObject(PhQueryObjectCompletedEvent, 1000); - // Set the context as uninitialized. PhQueryObjectContext.Initialized = FALSE; // Return normally if the work was completed. @@ -861,9 +861,9 @@ NTSTATUS PhQueryObjectNameHack( NTSTATUS status; ULONG returnLength; - // Copy the status information before we release the mutex. status = PhQueryObjectContext.Status; returnLength = PhQueryObjectContext.ReturnLength; + PhReleaseMutex(&PhQueryObjectMutex); if (ReturnLength) @@ -886,10 +886,66 @@ NTSTATUS PhQueryObjectNameHack( } PhReleaseMutex(&PhQueryObjectMutex); + return STATUS_UNSUCCESSFUL; } } +NTSTATUS PhQueryObjectNameHack( + __in HANDLE Handle, + __out_bcount(ObjectNameInformationLength) POBJECT_NAME_INFORMATION ObjectNameInformation, + __in ULONG ObjectNameInformationLength, + __out_opt PULONG ReturnLength + ) +{ + if (!PhpHeadQueryObjectHack()) + return STATUS_UNSUCCESSFUL; + + PhQueryObjectContext.Work = QueryNameHack; + PhQueryObjectContext.Handle = Handle; + PhQueryObjectContext.Buffer = ObjectNameInformation; + PhQueryObjectContext.Length = ObjectNameInformationLength; + + return PhpTailQueryObjectHack(ReturnLength); +} + +NTSTATUS PhQueryObjectSecurityHack( + __in HANDLE Handle, + __in SECURITY_INFORMATION SecurityInformation, + __out_bcount(Length) PVOID Buffer, + __in ULONG Length, + __out_opt PULONG ReturnLength + ) +{ + if (!PhpHeadQueryObjectHack()) + return STATUS_UNSUCCESSFUL; + + PhQueryObjectContext.Work = QuerySecurityHack; + PhQueryObjectContext.Handle = Handle; + PhQueryObjectContext.SecurityInformation = SecurityInformation; + PhQueryObjectContext.Buffer = Buffer; + PhQueryObjectContext.Length = Length; + + return PhpTailQueryObjectHack(ReturnLength); +} + +NTSTATUS PhSetObjectSecurityHack( + __in HANDLE Handle, + __in SECURITY_INFORMATION SecurityInformation, + __in PVOID Buffer + ) +{ + if (!PhpHeadQueryObjectHack()) + return STATUS_UNSUCCESSFUL; + + PhQueryObjectContext.Work = SetSecurityHack; + PhQueryObjectContext.Handle = Handle; + PhQueryObjectContext.SecurityInformation = SecurityInformation; + PhQueryObjectContext.Buffer = Buffer; + + return PhpTailQueryObjectHack(NULL); +} + NTSTATUS PhpQueryObjectThreadStart( __in PVOID Parameter ) @@ -905,13 +961,31 @@ NTSTATUS PhpQueryObjectThreadStart( // Make sure we actually have work. if (PhQueryObjectContext.Initialized) { - PhQueryObjectContext.Status = NtQueryObject( - PhQueryObjectContext.Handle, - ObjectNameInformation, - PhQueryObjectContext.Buffer, - PhQueryObjectContext.Length, - &PhQueryObjectContext.ReturnLength - ); + switch (PhQueryObjectContext.Work) + { + case QueryNameHack: + PhQueryObjectContext.Status = NtQueryObject( + PhQueryObjectContext.Handle, + ObjectNameInformation, + PhQueryObjectContext.Buffer, + PhQueryObjectContext.Length, + &PhQueryObjectContext.ReturnLength + ); + case QuerySecurityHack: + PhQueryObjectContext.Status = NtQuerySecurityObject( + PhQueryObjectContext.Handle, + PhQueryObjectContext.SecurityInformation, + (PSECURITY_DESCRIPTOR)PhQueryObjectContext.Buffer, + PhQueryObjectContext.Length, + &PhQueryObjectContext.ReturnLength + ); + case SetSecurityHack: + PhQueryObjectContext.Status = NtSetSecurityObject( + PhQueryObjectContext.Handle, + PhQueryObjectContext.SecurityInformation, + (PSECURITY_DESCRIPTOR)PhQueryObjectContext.Buffer + ); + } // Work done. SetEvent(PhQueryObjectCompletedEvent); diff --git a/2.x/trunk/ProcessHacker/include/ph.h b/2.x/trunk/ProcessHacker/include/ph.h index c221700e4..921e3ee77 100644 --- a/2.x/trunk/ProcessHacker/include/ph.h +++ b/2.x/trunk/ProcessHacker/include/ph.h @@ -616,6 +616,20 @@ NTSTATUS PhQueryObjectNameHack( __out_opt PULONG ReturnLength ); +NTSTATUS PhQueryObjectSecurityHack( + __in HANDLE Handle, + __in SECURITY_INFORMATION SecurityInformation, + __out_bcount(Length) PVOID Buffer, + __in ULONG Length, + __out_opt PULONG ReturnLength + ); + +NTSTATUS PhSetObjectSecurityHack( + __in HANDLE Handle, + __in SECURITY_INFORMATION SecurityInformation, + __in PVOID Buffer + ); + // verify typedef enum _VERIFY_RESULT