mirror of
https://github.com/reactos/reactos.git
synced 2024-07-01 02:10:07 +00:00
- Make use of _SEH2_YIELD in Ex, Io, Ob, Ps and Se.
- Don't call ExSystemExceptionFilter() if we know the caller is user mode. - Get rid of a couple of dependencies on the NTSTATUS being initialized with STATUS_SUCCESS -- indicate success where properly instead. svn path=/trunk/; revision=42942
This commit is contained in:
parent
08db367162
commit
f11466d9c0
|
@ -90,7 +90,7 @@ NtAddAtom(IN PWSTR AtomName,
|
||||||
OUT PRTL_ATOM Atom)
|
OUT PRTL_ATOM Atom)
|
||||||
{
|
{
|
||||||
PRTL_ATOM_TABLE AtomTable = ExpGetGlobalAtomTable();
|
PRTL_ATOM_TABLE AtomTable = ExpGetGlobalAtomTable();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
LPWSTR CapturedName;
|
LPWSTR CapturedName;
|
||||||
ULONG CapturedSize;
|
ULONG CapturedSize;
|
||||||
|
@ -145,16 +145,14 @@ NtAddAtom(IN PWSTR AtomName,
|
||||||
if (Atom) ProbeForWriteUshort(Atom);
|
if (Atom) ProbeForWriteUshort(Atom);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure probe worked */
|
|
||||||
if (NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
/* Call the runtime function */
|
/* Call the runtime function */
|
||||||
Status = RtlAddAtomToAtomTable(AtomTable, CapturedName, &SafeAtom);
|
Status = RtlAddAtomToAtomTable(AtomTable, CapturedName, &SafeAtom);
|
||||||
if (NT_SUCCESS(Status) && (Atom))
|
if (NT_SUCCESS(Status) && (Atom))
|
||||||
|
@ -167,11 +165,11 @@ NtAddAtom(IN PWSTR AtomName,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* If we captured anything, free it */
|
/* If we captured anything, free it */
|
||||||
if ((CapturedName) && (CapturedName != AtomName)) ExFreePool(CapturedName);
|
if ((CapturedName) && (CapturedName != AtomName)) ExFreePool(CapturedName);
|
||||||
|
@ -242,7 +240,7 @@ NtFindAtom(IN PWSTR AtomName,
|
||||||
OUT PRTL_ATOM Atom)
|
OUT PRTL_ATOM Atom)
|
||||||
{
|
{
|
||||||
PRTL_ATOM_TABLE AtomTable = ExpGetGlobalAtomTable();
|
PRTL_ATOM_TABLE AtomTable = ExpGetGlobalAtomTable();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
LPWSTR CapturedName = NULL;
|
LPWSTR CapturedName = NULL;
|
||||||
ULONG CapturedSize;
|
ULONG CapturedSize;
|
||||||
|
@ -297,16 +295,14 @@ NtFindAtom(IN PWSTR AtomName,
|
||||||
if (Atom) ProbeForWriteUshort(Atom);
|
if (Atom) ProbeForWriteUshort(Atom);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure probe worked */
|
|
||||||
if (NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
/* Call the runtime function */
|
/* Call the runtime function */
|
||||||
Status = RtlLookupAtomInAtomTable(AtomTable, CapturedName, &SafeAtom);
|
Status = RtlLookupAtomInAtomTable(AtomTable, CapturedName, &SafeAtom);
|
||||||
if (NT_SUCCESS(Status) && (Atom))
|
if (NT_SUCCESS(Status) && (Atom))
|
||||||
|
@ -323,7 +319,6 @@ NtFindAtom(IN PWSTR AtomName,
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* If we captured anything, free it */
|
/* If we captured anything, free it */
|
||||||
if ((CapturedName) && (CapturedName != AtomName)) ExFreePool(CapturedName);
|
if ((CapturedName) && (CapturedName != AtomName)) ExFreePool(CapturedName);
|
||||||
|
|
|
@ -101,7 +101,7 @@ NtCreateEvent(OUT PHANDLE EventHandle,
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
PKEVENT Event;
|
PKEVENT Event;
|
||||||
HANDLE hEvent;
|
HANDLE hEvent;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
DPRINT("NtCreateEvent(0x%p, 0x%x, 0x%p)\n",
|
DPRINT("NtCreateEvent(0x%p, 0x%x, 0x%p)\n",
|
||||||
EventHandle, DesiredAccess, ObjectAttributes);
|
EventHandle, DesiredAccess, ObjectAttributes);
|
||||||
|
@ -115,14 +115,12 @@ NtCreateEvent(OUT PHANDLE EventHandle,
|
||||||
/* Check handle pointer */
|
/* Check handle pointer */
|
||||||
ProbeForWriteHandle(EventHandle);
|
ProbeForWriteHandle(EventHandle);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Bail out if pointer was invalid */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the Object */
|
/* Create the Object */
|
||||||
|
@ -163,6 +161,7 @@ NtCreateEvent(OUT PHANDLE EventHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -184,7 +183,7 @@ NtOpenEvent(OUT PHANDLE EventHandle,
|
||||||
{
|
{
|
||||||
HANDLE hEvent;
|
HANDLE hEvent;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
DPRINT("NtOpenEvent(0x%p, 0x%x, 0x%p)\n",
|
DPRINT("NtOpenEvent(0x%p, 0x%x, 0x%p)\n",
|
||||||
EventHandle, DesiredAccess, ObjectAttributes);
|
EventHandle, DesiredAccess, ObjectAttributes);
|
||||||
|
@ -198,14 +197,12 @@ NtOpenEvent(OUT PHANDLE EventHandle,
|
||||||
/* Check handle pointer */
|
/* Check handle pointer */
|
||||||
ProbeForWriteHandle(EventHandle);
|
ProbeForWriteHandle(EventHandle);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Bail out if pointer was invalid */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the Object */
|
/* Open the Object */
|
||||||
|
@ -228,6 +225,7 @@ NtOpenEvent(OUT PHANDLE EventHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -247,7 +245,7 @@ NtPulseEvent(IN HANDLE EventHandle,
|
||||||
{
|
{
|
||||||
PKEVENT Event;
|
PKEVENT Event;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
DPRINT("NtPulseEvent(EventHandle 0%x PreviousState 0%x)\n",
|
DPRINT("NtPulseEvent(EventHandle 0%x PreviousState 0%x)\n",
|
||||||
EventHandle, PreviousState);
|
EventHandle, PreviousState);
|
||||||
|
@ -261,14 +259,12 @@ NtPulseEvent(IN HANDLE EventHandle,
|
||||||
/* Make sure the state pointer is valid */
|
/* Make sure the state pointer is valid */
|
||||||
ProbeForWriteLong(PreviousState);
|
ProbeForWriteLong(PreviousState);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Bail out if pointer was invalid */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the Object */
|
/* Open the Object */
|
||||||
|
@ -297,6 +293,7 @@ NtPulseEvent(IN HANDLE EventHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -320,7 +317,7 @@ NtQueryEvent(IN HANDLE EventHandle,
|
||||||
{
|
{
|
||||||
PKEVENT Event;
|
PKEVENT Event;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PEVENT_BASIC_INFORMATION BasicInfo =
|
PEVENT_BASIC_INFORMATION BasicInfo =
|
||||||
(PEVENT_BASIC_INFORMATION)EventInformation;
|
(PEVENT_BASIC_INFORMATION)EventInformation;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
@ -365,6 +362,7 @@ NtQueryEvent(IN HANDLE EventHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -387,7 +385,7 @@ NtResetEvent(IN HANDLE EventHandle,
|
||||||
{
|
{
|
||||||
PKEVENT Event;
|
PKEVENT Event;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
DPRINT("NtResetEvent(EventHandle 0%x PreviousState 0%x)\n",
|
DPRINT("NtResetEvent(EventHandle 0%x PreviousState 0%x)\n",
|
||||||
EventHandle, PreviousState);
|
EventHandle, PreviousState);
|
||||||
|
@ -401,14 +399,12 @@ NtResetEvent(IN HANDLE EventHandle,
|
||||||
/* Make sure the state pointer is valid */
|
/* Make sure the state pointer is valid */
|
||||||
ProbeForWriteLong(PreviousState);
|
ProbeForWriteLong(PreviousState);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Bail out if pointer was invalid */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the Object */
|
/* Open the Object */
|
||||||
|
@ -437,6 +433,7 @@ NtResetEvent(IN HANDLE EventHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -457,7 +454,7 @@ NtSetEvent(IN HANDLE EventHandle,
|
||||||
{
|
{
|
||||||
PKEVENT Event;
|
PKEVENT Event;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
DPRINT("NtSetEvent(EventHandle 0%x PreviousState 0%x)\n",
|
DPRINT("NtSetEvent(EventHandle 0%x PreviousState 0%x)\n",
|
||||||
EventHandle, PreviousState);
|
EventHandle, PreviousState);
|
||||||
|
@ -471,14 +468,12 @@ NtSetEvent(IN HANDLE EventHandle,
|
||||||
/* Make sure the state pointer is valid */
|
/* Make sure the state pointer is valid */
|
||||||
ProbeForWriteLong(PreviousState);
|
ProbeForWriteLong(PreviousState);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Bail out if pointer was invalid */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the Object */
|
/* Open the Object */
|
||||||
|
|
|
@ -61,7 +61,7 @@ NtCreateEventPair(OUT PHANDLE EventPairHandle,
|
||||||
PKEVENT_PAIR EventPair;
|
PKEVENT_PAIR EventPair;
|
||||||
HANDLE hEventPair;
|
HANDLE hEventPair;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
DPRINT("NtCreateEventPair: 0x%p\n", EventPairHandle);
|
DPRINT("NtCreateEventPair: 0x%p\n", EventPairHandle);
|
||||||
|
|
||||||
|
@ -74,14 +74,12 @@ NtCreateEventPair(OUT PHANDLE EventPairHandle,
|
||||||
/* Check handle pointer */
|
/* Check handle pointer */
|
||||||
ProbeForWriteHandle(EventPairHandle);
|
ProbeForWriteHandle(EventPairHandle);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Bail out if pointer was invalid */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the Object */
|
/* Create the Object */
|
||||||
|
@ -111,15 +109,18 @@ NtCreateEventPair(OUT PHANDLE EventPairHandle,
|
||||||
NULL,
|
NULL,
|
||||||
&hEventPair);
|
&hEventPair);
|
||||||
|
|
||||||
/* Check for success and return handle */
|
/* Check for success */
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
/* Enter SEH */
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
/* Return the handle */
|
||||||
*EventPairHandle = hEventPair;
|
*EventPairHandle = hEventPair;
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -138,7 +139,7 @@ NtOpenEventPair(OUT PHANDLE EventPairHandle,
|
||||||
{
|
{
|
||||||
HANDLE hEventPair;
|
HANDLE hEventPair;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check if we were called from user-mode */
|
/* Check if we were called from user-mode */
|
||||||
|
@ -150,14 +151,12 @@ NtOpenEventPair(OUT PHANDLE EventPairHandle,
|
||||||
/* Check handle pointer */
|
/* Check handle pointer */
|
||||||
ProbeForWriteHandle(EventPairHandle);
|
ProbeForWriteHandle(EventPairHandle);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Bail out if pointer was invalid */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the Object */
|
/* Open the Object */
|
||||||
|
@ -169,15 +168,18 @@ NtOpenEventPair(OUT PHANDLE EventPairHandle,
|
||||||
NULL,
|
NULL,
|
||||||
&hEventPair);
|
&hEventPair);
|
||||||
|
|
||||||
/* Check for success and return handle */
|
/* Check for success */
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
/* Enter SEH */
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
/* Return the handle */
|
||||||
*EventPairHandle = hEventPair;
|
*EventPairHandle = hEventPair;
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
|
@ -620,17 +620,16 @@ NtRaiseHardError(IN NTSTATUS ErrorStatus,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Free captured buffer */
|
/* Free captured buffer */
|
||||||
if (SafeParams) ExFreePool(SafeParams);
|
if (SafeParams) ExFreePool(SafeParams);
|
||||||
Status = _SEH2_GetExceptionCode();
|
|
||||||
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* If we failed to capture/probe, bail out */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Call the system function directly, because we probed */
|
/* Call the system function directly, because we probed */
|
||||||
ExpRaiseHardError(ErrorStatus,
|
ExpRaiseHardError(ErrorStatus,
|
||||||
NumberOfParameters,
|
NumberOfParameters,
|
||||||
|
@ -668,8 +667,9 @@ NtRaiseHardError(IN NTSTATUS ErrorStatus,
|
||||||
/* Return the response */
|
/* Return the response */
|
||||||
*Response = SafeResponse;
|
*Response = SafeResponse;
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
|
@ -84,7 +84,7 @@ NtCreateMutant(OUT PHANDLE MutantHandle,
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
HANDLE hMutant;
|
HANDLE hMutant;
|
||||||
PKMUTANT Mutant;
|
PKMUTANT Mutant;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
DPRINT("NtCreateMutant(0x%p, 0x%x, 0x%p)\n",
|
DPRINT("NtCreateMutant(0x%p, 0x%x, 0x%p)\n",
|
||||||
MutantHandle, DesiredAccess, ObjectAttributes);
|
MutantHandle, DesiredAccess, ObjectAttributes);
|
||||||
|
@ -98,14 +98,12 @@ NtCreateMutant(OUT PHANDLE MutantHandle,
|
||||||
/* Check handle pointer */
|
/* Check handle pointer */
|
||||||
ProbeForWriteHandle(MutantHandle);
|
ProbeForWriteHandle(MutantHandle);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Bail out if pointer was invalid */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the Mutant Object*/
|
/* Create the Mutant Object*/
|
||||||
|
@ -145,6 +143,7 @@ NtCreateMutant(OUT PHANDLE MutantHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -166,7 +165,7 @@ NtOpenMutant(OUT PHANDLE MutantHandle,
|
||||||
{
|
{
|
||||||
HANDLE hMutant;
|
HANDLE hMutant;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
DPRINT("NtOpenMutant(0x%p, 0x%x, 0x%p)\n",
|
DPRINT("NtOpenMutant(0x%p, 0x%x, 0x%p)\n",
|
||||||
MutantHandle, DesiredAccess, ObjectAttributes);
|
MutantHandle, DesiredAccess, ObjectAttributes);
|
||||||
|
@ -180,14 +179,12 @@ NtOpenMutant(OUT PHANDLE MutantHandle,
|
||||||
/* Check handle pointer */
|
/* Check handle pointer */
|
||||||
ProbeForWriteHandle(MutantHandle);
|
ProbeForWriteHandle(MutantHandle);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Bail out if pointer was invalid */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the Object */
|
/* Open the Object */
|
||||||
|
@ -232,7 +229,7 @@ NtQueryMutant(IN HANDLE MutantHandle,
|
||||||
{
|
{
|
||||||
PKMUTANT Mutant;
|
PKMUTANT Mutant;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PMUTANT_BASIC_INFORMATION BasicInfo =
|
PMUTANT_BASIC_INFORMATION BasicInfo =
|
||||||
(PMUTANT_BASIC_INFORMATION)MutantInformation;
|
(PMUTANT_BASIC_INFORMATION)MutantInformation;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
@ -299,7 +296,7 @@ NtReleaseMutant(IN HANDLE MutantHandle,
|
||||||
{
|
{
|
||||||
PKMUTANT Mutant;
|
PKMUTANT Mutant;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
DPRINT("NtReleaseMutant(MutantHandle 0x%p PreviousCount 0x%p)\n",
|
DPRINT("NtReleaseMutant(MutantHandle 0x%p PreviousCount 0x%p)\n",
|
||||||
MutantHandle,
|
MutantHandle,
|
||||||
|
@ -314,14 +311,12 @@ NtReleaseMutant(IN HANDLE MutantHandle,
|
||||||
/* Make sure the state pointer is valid */
|
/* Make sure the state pointer is valid */
|
||||||
ProbeForWriteLong(PreviousCount);
|
ProbeForWriteLong(PreviousCount);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Bail out if pointer was invalid */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the Object */
|
/* Open the Object */
|
||||||
|
@ -352,6 +347,7 @@ NtReleaseMutant(IN HANDLE MutantHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
|
@ -102,7 +102,7 @@ NtCreateProfile(OUT PHANDLE ProfileHandle,
|
||||||
PEPROCESS pProcess;
|
PEPROCESS pProcess;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
ULONG Log2 = 0;
|
ULONG Log2 = 0;
|
||||||
PVOID Segment = NULL;
|
PVOID Segment = NULL;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
@ -164,14 +164,12 @@ NtCreateProfile(OUT PHANDLE ProfileHandle,
|
||||||
BufferSize,
|
BufferSize,
|
||||||
sizeof(ULONG));
|
sizeof(ULONG));
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Bail out if we failed */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if a process was specified */
|
/* Check if a process was specified */
|
||||||
|
@ -293,14 +291,12 @@ NtQueryPerformanceCounter(OUT PLARGE_INTEGER PerformanceCounter,
|
||||||
ProbeForWriteLargeInteger(PerformanceFrequency);
|
ProbeForWriteLargeInteger(PerformanceFrequency);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* If the pointers are invalid, bail out */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enter a new SEH Block */
|
/* Enter a new SEH Block */
|
||||||
|
@ -314,6 +310,7 @@ NtQueryPerformanceCounter(OUT PLARGE_INTEGER PerformanceCounter,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -380,21 +377,14 @@ NtStartProfile(IN HANDLE ProfileHandle)
|
||||||
MmProbeAndLockPages(Profile->Mdl, PreviousMode, IoWriteAccess);
|
MmProbeAndLockPages(Profile->Mdl, PreviousMode, IoWriteAccess);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
|
||||||
/* Get the exception code */
|
|
||||||
Status = _SEH2_GetExceptionCode();
|
|
||||||
}
|
|
||||||
_SEH2_END;
|
|
||||||
|
|
||||||
/* Fail if we raised an exception */
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
{
|
||||||
/* Release our lock, free the buffer, dereference and return */
|
/* Release our lock, free the buffer, dereference and return */
|
||||||
KeReleaseMutex(&ExpProfileMutex, FALSE);
|
KeReleaseMutex(&ExpProfileMutex, FALSE);
|
||||||
ObDereferenceObject(Profile);
|
ObDereferenceObject(Profile);
|
||||||
ExFreePool(ProfileObject);
|
ExFreePool(ProfileObject);
|
||||||
return Status;
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
|
||||||
/* Map the pages */
|
/* Map the pages */
|
||||||
TempLockedBufferAddress = MmMapLockedPages(Profile->Mdl, KernelMode);
|
TempLockedBufferAddress = MmMapLockedPages(Profile->Mdl, KernelMode);
|
||||||
|
@ -490,14 +480,12 @@ NtQueryIntervalProfile(IN KPROFILE_SOURCE ProfileSource,
|
||||||
/* Validate interval */
|
/* Validate interval */
|
||||||
ProbeForWriteUlong(Interval);
|
ProbeForWriteUlong(Interval);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* If pointer was invalid, bail out */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Query the Interval */
|
/* Query the Interval */
|
||||||
|
@ -511,12 +499,13 @@ NtQueryIntervalProfile(IN KPROFILE_SOURCE ProfileSource,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Return Success */
|
/* Return Success */
|
||||||
return STATUS_SUCCESS;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
|
|
@ -72,7 +72,7 @@ NtCreateSemaphore(OUT PHANDLE SemaphoreHandle,
|
||||||
PKSEMAPHORE Semaphore;
|
PKSEMAPHORE Semaphore;
|
||||||
HANDLE hSemaphore;
|
HANDLE hSemaphore;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check if we were called from user-mode */
|
/* Check if we were called from user-mode */
|
||||||
|
@ -84,14 +84,12 @@ NtCreateSemaphore(OUT PHANDLE SemaphoreHandle,
|
||||||
/* Check handle pointer */
|
/* Check handle pointer */
|
||||||
ProbeForWriteHandle(SemaphoreHandle);
|
ProbeForWriteHandle(SemaphoreHandle);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Bail out if pointer was invalid */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure the counts make sense */
|
/* Make sure the counts make sense */
|
||||||
|
@ -141,6 +139,7 @@ NtCreateSemaphore(OUT PHANDLE SemaphoreHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -162,7 +161,7 @@ NtOpenSemaphore(OUT PHANDLE SemaphoreHandle,
|
||||||
{
|
{
|
||||||
HANDLE hSemaphore;
|
HANDLE hSemaphore;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check if we were called from user-mode */
|
/* Check if we were called from user-mode */
|
||||||
|
@ -174,14 +173,12 @@ NtOpenSemaphore(OUT PHANDLE SemaphoreHandle,
|
||||||
/* Check handle pointer */
|
/* Check handle pointer */
|
||||||
ProbeForWriteHandle(SemaphoreHandle);
|
ProbeForWriteHandle(SemaphoreHandle);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Bail out if pointer was invalid */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the Object */
|
/* Open the Object */
|
||||||
|
@ -204,6 +201,7 @@ NtOpenSemaphore(OUT PHANDLE SemaphoreHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -226,7 +224,7 @@ NtQuerySemaphore(IN HANDLE SemaphoreHandle,
|
||||||
{
|
{
|
||||||
PKSEMAPHORE Semaphore;
|
PKSEMAPHORE Semaphore;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check buffers and class validity */
|
/* Check buffers and class validity */
|
||||||
|
@ -271,6 +269,7 @@ NtQuerySemaphore(IN HANDLE SemaphoreHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -294,7 +293,7 @@ NtReleaseSemaphore(IN HANDLE SemaphoreHandle,
|
||||||
{
|
{
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
PKSEMAPHORE Semaphore;
|
PKSEMAPHORE Semaphore;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check if we were called from user-mode */
|
/* Check if we were called from user-mode */
|
||||||
|
@ -306,14 +305,12 @@ NtReleaseSemaphore(IN HANDLE SemaphoreHandle,
|
||||||
/* Make sure the state pointer is valid */
|
/* Make sure the state pointer is valid */
|
||||||
ProbeForWriteLong(PreviousCount);
|
ProbeForWriteLong(PreviousCount);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Bail out if pointer was invalid */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure count makes sense */
|
/* Make sure count makes sense */
|
||||||
|
@ -348,10 +345,12 @@ NtReleaseSemaphore(IN HANDLE SemaphoreHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
|
/* Dereference the Semaphore */
|
||||||
ObDereferenceObject(Semaphore);
|
ObDereferenceObject(Semaphore);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -228,8 +228,7 @@ NtQuerySystemEnvironmentValue(IN PUNICODE_STRING VariableName,
|
||||||
ANSI_STRING AValue;
|
ANSI_STRING AValue;
|
||||||
UNICODE_STRING WValue;
|
UNICODE_STRING WValue;
|
||||||
KPROCESSOR_MODE PreviousMode;
|
KPROCESSOR_MODE PreviousMode;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
PreviousMode = ExGetPreviousMode();
|
PreviousMode = ExGetPreviousMode();
|
||||||
|
@ -248,13 +247,12 @@ NtQuerySystemEnvironmentValue(IN PUNICODE_STRING VariableName,
|
||||||
|
|
||||||
if (ReturnLength != NULL) ProbeForWriteUlong(ReturnLength);
|
if (ReturnLength != NULL) ProbeForWriteUlong(ReturnLength);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -198,14 +198,12 @@ NtSetSystemTime(IN PLARGE_INTEGER SystemTime,
|
||||||
NewSystemTime = ProbeForReadLargeInteger(SystemTime);
|
NewSystemTime = ProbeForReadLargeInteger(SystemTime);
|
||||||
if(PreviousTime) ProbeForWriteLargeInteger(PreviousTime);
|
if(PreviousTime) ProbeForWriteLargeInteger(PreviousTime);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* If the pointers were invalid, bail out */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -240,6 +238,7 @@ NtSetSystemTime(IN PLARGE_INTEGER SystemTime,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -278,8 +277,9 @@ NtQuerySystemTime(OUT PLARGE_INTEGER SystemTime)
|
||||||
*/
|
*/
|
||||||
KeQuerySystemTime(SystemTime);
|
KeQuerySystemTime(SystemTime);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
|
@ -254,22 +254,23 @@ NtCancelTimer(IN HANDLE TimerHandle,
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
PETHREAD TimerThread;
|
PETHREAD TimerThread;
|
||||||
ULONG DerefsToDo = 1;
|
ULONG DerefsToDo = 1;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check Parameter Validity */
|
/* Check if we need to probe */
|
||||||
if ((CurrentState) && (PreviousMode != KernelMode))
|
if ((CurrentState) && (PreviousMode != KernelMode))
|
||||||
{
|
{
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
/* Make sure the pointer is valid */
|
||||||
ProbeForWriteBoolean(CurrentState);
|
ProbeForWriteBoolean(CurrentState);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the Timer Object */
|
/* Get the Timer Object */
|
||||||
|
@ -341,11 +342,12 @@ NtCancelTimer(IN HANDLE TimerHandle,
|
||||||
/* Dereference the Object */
|
/* Dereference the Object */
|
||||||
ObDereferenceObjectEx(Timer, DerefsToDo);
|
ObDereferenceObjectEx(Timer, DerefsToDo);
|
||||||
|
|
||||||
/* Make sure it's safe to write to the handle */
|
/* Check if caller wants the state */
|
||||||
if (CurrentState)
|
if (CurrentState)
|
||||||
{
|
{
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
/* Return the Timer State */
|
||||||
*CurrentState = State;
|
*CurrentState = State;
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
|
@ -370,7 +372,7 @@ NtCreateTimer(OUT PHANDLE TimerHandle,
|
||||||
PETIMER Timer;
|
PETIMER Timer;
|
||||||
HANDLE hTimer;
|
HANDLE hTimer;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check for correct timer type */
|
/* Check for correct timer type */
|
||||||
|
@ -381,19 +383,20 @@ NtCreateTimer(OUT PHANDLE TimerHandle,
|
||||||
return STATUS_INVALID_PARAMETER_4;
|
return STATUS_INVALID_PARAMETER_4;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check Parameter Validity */
|
/* Check if we need to probe */
|
||||||
if (PreviousMode != KernelMode)
|
if (PreviousMode != KernelMode)
|
||||||
{
|
{
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
/* Make sure the pointer is valid */
|
||||||
ProbeForWriteHandle(TimerHandle);
|
ProbeForWriteHandle(TimerHandle);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the Object */
|
/* Create the Object */
|
||||||
|
@ -431,9 +434,10 @@ NtCreateTimer(OUT PHANDLE TimerHandle,
|
||||||
/* Check for success */
|
/* Check for success */
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* Make sure it's safe to write to the handle */
|
/* Enter SEH */
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
/* Return the Timer Handle */
|
||||||
*TimerHandle = hTimer;
|
*TimerHandle = hTimer;
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
|
@ -456,7 +460,7 @@ NtOpenTimer(OUT PHANDLE TimerHandle,
|
||||||
{
|
{
|
||||||
HANDLE hTimer;
|
HANDLE hTimer;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check Parameter Validity */
|
/* Check Parameter Validity */
|
||||||
|
@ -464,14 +468,15 @@ NtOpenTimer(OUT PHANDLE TimerHandle,
|
||||||
{
|
{
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
/* Make sure the pointer is valid */
|
||||||
ProbeForWriteHandle(TimerHandle);
|
ProbeForWriteHandle(TimerHandle);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the Timer */
|
/* Open the Timer */
|
||||||
|
@ -484,9 +489,10 @@ NtOpenTimer(OUT PHANDLE TimerHandle,
|
||||||
&hTimer);
|
&hTimer);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* Make sure it's safe to write to the handle */
|
/* Enter SEH */
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
/* Return the Timer Handle */
|
||||||
*TimerHandle = hTimer;
|
*TimerHandle = hTimer;
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
|
@ -550,6 +556,7 @@ NtQueryTimer(IN HANDLE TimerHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -586,20 +593,23 @@ NtSetTimer(IN HANDLE TimerHandle,
|
||||||
/* Check for a valid Period */
|
/* Check for a valid Period */
|
||||||
if (Period < 0) return STATUS_INVALID_PARAMETER_6;
|
if (Period < 0) return STATUS_INVALID_PARAMETER_6;
|
||||||
|
|
||||||
/* Check Parameter Validity */
|
/* Check if we need to probe */
|
||||||
if (PreviousMode != KernelMode)
|
if (PreviousMode != KernelMode)
|
||||||
{
|
{
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
/* Probe and capture the due time */
|
||||||
TimerDueTime = ProbeForReadLargeInteger(DueTime);
|
TimerDueTime = ProbeForReadLargeInteger(DueTime);
|
||||||
|
|
||||||
|
/* Probe the state pointer if one was passed */
|
||||||
if (PreviousState) ProbeForWriteBoolean(PreviousState);
|
if (PreviousState) ProbeForWriteBoolean(PreviousState);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -715,15 +725,18 @@ NtSetTimer(IN HANDLE TimerHandle,
|
||||||
/* Dereference if it was previously enabled */
|
/* Dereference if it was previously enabled */
|
||||||
if (DerefsToDo) ObDereferenceObjectEx(Timer, DerefsToDo);
|
if (DerefsToDo) ObDereferenceObjectEx(Timer, DerefsToDo);
|
||||||
|
|
||||||
/* Make sure it's safe to write to the handle */
|
/* Check if we need to return the State */
|
||||||
if (PreviousState)
|
if (PreviousState)
|
||||||
{
|
{
|
||||||
|
/* Enter SEH */
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
/* Return the Timer State */
|
||||||
*PreviousState = State;
|
*PreviousState = State;
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
|
|
|
@ -259,7 +259,7 @@ NtAllocateLocallyUniqueId(OUT LUID *LocallyUniqueId)
|
||||||
{
|
{
|
||||||
LUID NewLuid;
|
LUID NewLuid;
|
||||||
KPROCESSOR_MODE PreviousMode;
|
KPROCESSOR_MODE PreviousMode;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -275,14 +275,9 @@ NtAllocateLocallyUniqueId(OUT LUID *LocallyUniqueId)
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if(!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ExpAllocateLocallyUniqueId(&NewLuid);
|
Status = ExpAllocateLocallyUniqueId(&NewLuid);
|
||||||
|
|
|
@ -1271,6 +1271,7 @@ IopSecurityFile(IN PVOID ObjectBody,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -1506,7 +1507,7 @@ IopQueryAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
IN ULONG FileInformationSize,
|
IN ULONG FileInformationSize,
|
||||||
OUT PVOID FileInformation)
|
OUT PVOID FileInformation)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
KPROCESSOR_MODE AccessMode = ExGetPreviousMode();
|
KPROCESSOR_MODE AccessMode = ExGetPreviousMode();
|
||||||
DUMMY_FILE_OBJECT DummyFileObject;
|
DUMMY_FILE_OBJECT DummyFileObject;
|
||||||
FILE_NETWORK_OPEN_INFORMATION NetworkOpenInfo;
|
FILE_NETWORK_OPEN_INFORMATION NetworkOpenInfo;
|
||||||
|
@ -1527,13 +1528,10 @@ IopQueryAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Fail on exception */
|
|
||||||
if (!NT_SUCCESS(Status))return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if this is a basic or full request */
|
/* Check if this is a basic or full request */
|
||||||
|
@ -1658,7 +1656,7 @@ IoCreateFile(OUT PHANDLE FileHandle,
|
||||||
HANDLE LocalHandle = 0;
|
HANDLE LocalHandle = 0;
|
||||||
LARGE_INTEGER SafeAllocationSize;
|
LARGE_INTEGER SafeAllocationSize;
|
||||||
PVOID SystemEaBuffer = NULL;
|
PVOID SystemEaBuffer = NULL;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
OPEN_PACKET OpenPacket;
|
OPEN_PACKET OpenPacket;
|
||||||
ULONG EaErrorOffset;
|
ULONG EaErrorOffset;
|
||||||
|
|
||||||
|
@ -1705,8 +1703,7 @@ IoCreateFile(OUT PHANDLE FileHandle,
|
||||||
TAG_EA);
|
TAG_EA);
|
||||||
if(!SystemEaBuffer)
|
if(!SystemEaBuffer)
|
||||||
{
|
{
|
||||||
Status = STATUS_INSUFFICIENT_RESOURCES;
|
_SEH2_YIELD(return STATUS_INSUFFICIENT_RESOURCES);
|
||||||
_SEH2_LEAVE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RtlCopyMemory(SystemEaBuffer, EaBuffer, EaLength);
|
RtlCopyMemory(SystemEaBuffer, EaBuffer, EaLength);
|
||||||
|
@ -1719,23 +1716,22 @@ IoCreateFile(OUT PHANDLE FileHandle,
|
||||||
{
|
{
|
||||||
DPRINT1("FIXME: IoCheckEaBufferValidity() failed with "
|
DPRINT1("FIXME: IoCheckEaBufferValidity() failed with "
|
||||||
"Status: %lx\n",Status);
|
"Status: %lx\n",Status);
|
||||||
|
|
||||||
|
/* Free EA Buffer and return the error */
|
||||||
|
ExFreePoolWithTag(SystemEaBuffer, TAG_EA);
|
||||||
|
_SEH2_YIELD(return Status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
|
||||||
Status = _SEH2_GetExceptionCode();
|
|
||||||
}
|
|
||||||
_SEH2_END;
|
|
||||||
|
|
||||||
if(!NT_SUCCESS(Status))
|
|
||||||
{
|
{
|
||||||
/* Free SystemEaBuffer if needed */
|
/* Free SystemEaBuffer if needed */
|
||||||
if (SystemEaBuffer) ExFreePoolWithTag(SystemEaBuffer, TAG_EA);
|
if (SystemEaBuffer) ExFreePoolWithTag(SystemEaBuffer, TAG_EA);
|
||||||
|
|
||||||
/* Return failure status */
|
/* Return the exception code */
|
||||||
return Status;
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2538,7 +2534,6 @@ NtCreateMailslotFile(OUT PHANDLE FileHandle,
|
||||||
IN PLARGE_INTEGER TimeOut)
|
IN PLARGE_INTEGER TimeOut)
|
||||||
{
|
{
|
||||||
MAILSLOT_CREATE_PARAMETERS Buffer;
|
MAILSLOT_CREATE_PARAMETERS Buffer;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check for Timeout */
|
/* Check for Timeout */
|
||||||
|
@ -2555,13 +2550,10 @@ NtCreateMailslotFile(OUT PHANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Return the exception */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2617,7 +2609,6 @@ NtCreateNamedPipeFile(OUT PHANDLE FileHandle,
|
||||||
IN PLARGE_INTEGER DefaultTimeout)
|
IN PLARGE_INTEGER DefaultTimeout)
|
||||||
{
|
{
|
||||||
NAMED_PIPE_CREATE_PARAMETERS Buffer;
|
NAMED_PIPE_CREATE_PARAMETERS Buffer;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check for Timeout */
|
/* Check for Timeout */
|
||||||
|
@ -2635,13 +2626,10 @@ NtCreateNamedPipeFile(OUT PHANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Return the exception */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2776,7 +2764,7 @@ NtCancelIoFile(IN HANDLE FileHandle,
|
||||||
BOOLEAN OurIrpsInList = FALSE;
|
BOOLEAN OurIrpsInList = FALSE;
|
||||||
LARGE_INTEGER Interval;
|
LARGE_INTEGER Interval;
|
||||||
KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PLIST_ENTRY ListHead, NextEntry;
|
PLIST_ENTRY ListHead, NextEntry;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
IOTRACE(IO_API_DEBUG, "FileHandle: %p\n", FileHandle);
|
IOTRACE(IO_API_DEBUG, "FileHandle: %p\n", FileHandle);
|
||||||
|
@ -2792,13 +2780,10 @@ NtCancelIoFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Return exception code on failure */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reference the file object */
|
/* Reference the file object */
|
||||||
|
|
|
@ -258,7 +258,7 @@ NtCreateIoCompletion(OUT PHANDLE IoCompletionHandle,
|
||||||
PKQUEUE Queue;
|
PKQUEUE Queue;
|
||||||
HANDLE hIoCompletionHandle;
|
HANDLE hIoCompletionHandle;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check if this was a user-mode call */
|
/* Check if this was a user-mode call */
|
||||||
|
@ -272,13 +272,10 @@ NtCreateIoCompletion(OUT PHANDLE IoCompletionHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Fail on exception */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the Object */
|
/* Create the Object */
|
||||||
|
@ -332,7 +329,7 @@ NtOpenIoCompletion(OUT PHANDLE IoCompletionHandle,
|
||||||
{
|
{
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
HANDLE hIoCompletionHandle;
|
HANDLE hIoCompletionHandle;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check if this was a user-mode call */
|
/* Check if this was a user-mode call */
|
||||||
|
@ -346,13 +343,10 @@ NtOpenIoCompletion(OUT PHANDLE IoCompletionHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Fail on exception */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the Object */
|
/* Open the Object */
|
||||||
|
@ -393,7 +387,7 @@ NtQueryIoCompletion(IN HANDLE IoCompletionHandle,
|
||||||
{
|
{
|
||||||
PKQUEUE Queue;
|
PKQUEUE Queue;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check buffers and parameters */
|
/* Check buffers and parameters */
|
||||||
|
@ -457,7 +451,7 @@ NtRemoveIoCompletion(IN HANDLE IoCompletionHandle,
|
||||||
PIOP_MINI_COMPLETION_PACKET Packet;
|
PIOP_MINI_COMPLETION_PACKET Packet;
|
||||||
PLIST_ENTRY ListEntry;
|
PLIST_ENTRY ListEntry;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
PVOID Apc, Key;
|
PVOID Apc, Key;
|
||||||
IO_STATUS_BLOCK IoStatus;
|
IO_STATUS_BLOCK IoStatus;
|
||||||
|
@ -484,13 +478,10 @@ NtRemoveIoCompletion(IN HANDLE IoCompletionHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Fail on exception */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the Object */
|
/* Open the Object */
|
||||||
|
|
|
@ -196,7 +196,7 @@ IopDeviceFsIoControl(IN HANDLE DeviceHandle,
|
||||||
IN ULONG OutputBufferLength OPTIONAL,
|
IN ULONG OutputBufferLength OPTIONAL,
|
||||||
IN BOOLEAN IsDevIoCtl)
|
IN BOOLEAN IsDevIoCtl)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
PDEVICE_OBJECT DeviceObject;
|
PDEVICE_OBJECT DeviceObject;
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
|
@ -258,11 +258,10 @@ IopDeviceFsIoControl(IN HANDLE DeviceHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't check for access rights right now, KernelMode can do anything */
|
/* Don't check for access rights right now, KernelMode can do anything */
|
||||||
|
@ -427,12 +426,11 @@ IopDeviceFsIoControl(IN HANDLE DeviceHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Cleanup after exception */
|
/* Cleanup after exception and return */
|
||||||
IopCleanupAfterException(FileObject, Irp, EventObject, NULL);
|
IopCleanupAfterException(FileObject, Irp, EventObject, NULL);
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Direct I/O */
|
/* Direct I/O */
|
||||||
|
@ -484,12 +482,11 @@ IopDeviceFsIoControl(IN HANDLE DeviceHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Cleanup after exception */
|
/* Cleanup after exception and return */
|
||||||
IopCleanupAfterException(FileObject, Irp, EventObject, NULL);
|
IopCleanupAfterException(FileObject, Irp, EventObject, NULL);
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case METHOD_NEITHER:
|
case METHOD_NEITHER:
|
||||||
|
@ -958,7 +955,7 @@ NtFlushBuffersFile(IN HANDLE FileHandle,
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
PIO_STACK_LOCATION StackPtr;
|
PIO_STACK_LOCATION StackPtr;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PDEVICE_OBJECT DeviceObject;
|
PDEVICE_OBJECT DeviceObject;
|
||||||
PKEVENT Event = NULL;
|
PKEVENT Event = NULL;
|
||||||
BOOLEAN LocalEvent = FALSE;
|
BOOLEAN LocalEvent = FALSE;
|
||||||
|
@ -978,13 +975,10 @@ NtFlushBuffersFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Return exception code, if any */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the File Object */
|
/* Get the File Object */
|
||||||
|
@ -1095,7 +1089,7 @@ NtNotifyChangeDirectoryFile(IN HANDLE FileHandle,
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
PIO_STACK_LOCATION IoStack;
|
PIO_STACK_LOCATION IoStack;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
BOOLEAN LockedForSync = FALSE;
|
BOOLEAN LockedForSync = FALSE;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
IOTRACE(IO_API_DEBUG, "FileHandle: %p\n", FileHandle);
|
IOTRACE(IO_API_DEBUG, "FileHandle: %p\n", FileHandle);
|
||||||
|
@ -1114,14 +1108,11 @@ NtNotifyChangeDirectoryFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Check if probing failed */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Check if CompletionFilter is valid */
|
/* Check if CompletionFilter is valid */
|
||||||
if (!CompletionFilter || (CompletionFilter & ~FILE_NOTIFY_VALID_MASK))
|
if (!CompletionFilter || (CompletionFilter & ~FILE_NOTIFY_VALID_MASK))
|
||||||
{
|
{
|
||||||
|
@ -1229,7 +1220,7 @@ NtLockFile(IN HANDLE FileHandle,
|
||||||
BOOLEAN LockedForSync = FALSE;
|
BOOLEAN LockedForSync = FALSE;
|
||||||
KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
|
||||||
LARGE_INTEGER CapturedByteOffset, CapturedLength;
|
LARGE_INTEGER CapturedByteOffset, CapturedLength;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
OBJECT_HANDLE_INFORMATION HandleInformation;
|
OBJECT_HANDLE_INFORMATION HandleInformation;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
CapturedByteOffset.QuadPart = 0;
|
CapturedByteOffset.QuadPart = 0;
|
||||||
|
@ -1267,19 +1258,12 @@ NtLockFile(IN HANDLE FileHandle,
|
||||||
CapturedLength = ProbeForReadLargeInteger(Length);
|
CapturedLength = ProbeForReadLargeInteger(Length);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
|
||||||
/* Get the exception code */
|
|
||||||
Status = _SEH2_GetExceptionCode();
|
|
||||||
}
|
|
||||||
_SEH2_END;
|
|
||||||
|
|
||||||
/* Check if probing failed */
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
{
|
||||||
/* Dereference the object and return exception code */
|
/* Dereference the object and return exception code */
|
||||||
ObDereferenceObject(FileObject);
|
ObDereferenceObject(FileObject);
|
||||||
return Status;
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1351,15 +1335,14 @@ NtLockFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Allocating failed, clean up */
|
/* Allocating failed, clean up and return the exception code */
|
||||||
IopCleanupAfterException(FileObject, Irp, Event, NULL);
|
IopCleanupAfterException(FileObject, Irp, Event, NULL);
|
||||||
if (LocalLength) ExFreePool(LocalLength);
|
if (LocalLength) ExFreePool(LocalLength);
|
||||||
|
|
||||||
/* Get status */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Set Parameters */
|
/* Set Parameters */
|
||||||
StackPtr->Parameters.LockControl.ByteOffset = CapturedByteOffset;
|
StackPtr->Parameters.LockControl.ByteOffset = CapturedByteOffset;
|
||||||
|
@ -1401,7 +1384,7 @@ NtQueryDirectoryFile(IN HANDLE FileHandle,
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
PIO_STACK_LOCATION StackPtr;
|
PIO_STACK_LOCATION StackPtr;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
BOOLEAN LockedForSynch = FALSE;
|
BOOLEAN LockedForSynch = FALSE;
|
||||||
PKEVENT Event = NULL;
|
PKEVENT Event = NULL;
|
||||||
PVOID AuxBuffer = NULL;
|
PVOID AuxBuffer = NULL;
|
||||||
|
@ -1456,14 +1439,11 @@ NtQueryDirectoryFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get exception code and free the buffer */
|
/* Free buffer and return the exception code */
|
||||||
if (AuxBuffer) ExFreePool(AuxBuffer);
|
if (AuxBuffer) ExFreePool(AuxBuffer);
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Return status on failure */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get File Object */
|
/* Get File Object */
|
||||||
|
@ -1547,15 +1527,14 @@ NtQueryDirectoryFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Allocating failed, clean up */
|
/* Allocating failed, clean up and return the exception code */
|
||||||
IopCleanupAfterException(FileObject, Irp, Event, NULL);
|
IopCleanupAfterException(FileObject, Irp, Event, NULL);
|
||||||
if (AuxBuffer) ExFreePool(AuxBuffer);
|
if (AuxBuffer) ExFreePool(AuxBuffer);
|
||||||
|
|
||||||
/* Get status */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Set the buffer and flags */
|
/* Set the buffer and flags */
|
||||||
Irp->UserBuffer = FileInformation;
|
Irp->UserBuffer = FileInformation;
|
||||||
|
@ -1573,10 +1552,9 @@ NtQueryDirectoryFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Allocating failed, clean up */
|
/* Allocating failed, clean up and return the exception code */
|
||||||
IopCleanupAfterException(FileObject, Irp, Event, NULL);
|
IopCleanupAfterException(FileObject, Irp, Event, NULL);
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
_SEH2_YIELD(return Status);
|
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
|
@ -1647,7 +1625,7 @@ NtQueryInformationFile(IN HANDLE FileHandle,
|
||||||
{
|
{
|
||||||
OBJECT_HANDLE_INFORMATION HandleInformation;
|
OBJECT_HANDLE_INFORMATION HandleInformation;
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
PDEVICE_OBJECT DeviceObject;
|
PDEVICE_OBJECT DeviceObject;
|
||||||
PIO_STACK_LOCATION StackPtr;
|
PIO_STACK_LOCATION StackPtr;
|
||||||
|
@ -1689,11 +1667,10 @@ NtQueryInformationFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1811,12 +1788,11 @@ NtQueryInformationFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Allocating failed, clean up */
|
/* Allocating failed, clean up and return the exception code */
|
||||||
IopCleanupAfterException(FileObject, Irp, NULL, Event);
|
IopCleanupAfterException(FileObject, Irp, NULL, Event);
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Set the flags */
|
/* Set the flags */
|
||||||
Irp->Flags |= (IRP_BUFFERED_IO |
|
Irp->Flags |= (IRP_BUFFERED_IO |
|
||||||
|
@ -1957,7 +1933,7 @@ NtReadFile(IN HANDLE FileHandle,
|
||||||
IN PLARGE_INTEGER ByteOffset OPTIONAL,
|
IN PLARGE_INTEGER ByteOffset OPTIONAL,
|
||||||
IN PULONG Key OPTIONAL)
|
IN PULONG Key OPTIONAL)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
PDEVICE_OBJECT DeviceObject;
|
PDEVICE_OBJECT DeviceObject;
|
||||||
|
@ -1995,13 +1971,10 @@ NtReadFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Check for probe failure */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2116,12 +2089,11 @@ NtReadFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Allocating failed, clean up */
|
/* Allocating failed, clean up and return the exception code */
|
||||||
IopCleanupAfterException(FileObject, Irp, EventObject, NULL);
|
IopCleanupAfterException(FileObject, Irp, EventObject, NULL);
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Set the buffer and flags */
|
/* Set the buffer and flags */
|
||||||
Irp->UserBuffer = Buffer;
|
Irp->UserBuffer = Buffer;
|
||||||
|
@ -2148,10 +2120,9 @@ NtReadFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Allocating failed, clean up */
|
/* Allocating failed, clean up and return the exception code */
|
||||||
IopCleanupAfterException(FileObject, Irp, EventObject, NULL);
|
IopCleanupAfterException(FileObject, Irp, EventObject, NULL);
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
_SEH2_YIELD(return Status);
|
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
|
@ -2229,7 +2200,7 @@ NtSetInformationFile(IN HANDLE FileHandle,
|
||||||
IN FILE_INFORMATION_CLASS FileInformationClass)
|
IN FILE_INFORMATION_CLASS FileInformationClass)
|
||||||
{
|
{
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
PDEVICE_OBJECT DeviceObject;
|
PDEVICE_OBJECT DeviceObject;
|
||||||
PIO_STACK_LOCATION StackPtr;
|
PIO_STACK_LOCATION StackPtr;
|
||||||
|
@ -2278,13 +2249,10 @@ NtSetInformationFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Check if probing failed */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2417,12 +2385,11 @@ NtSetInformationFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Allocating failed, clean up */
|
/* Allocating failed, clean up and return the exception code */
|
||||||
IopCleanupAfterException(FileObject, Irp, NULL, Event);
|
IopCleanupAfterException(FileObject, Irp, NULL, Event);
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Set the flags */
|
/* Set the flags */
|
||||||
Irp->Flags |= (IRP_BUFFERED_IO |
|
Irp->Flags |= (IRP_BUFFERED_IO |
|
||||||
|
@ -2626,7 +2593,7 @@ NtUnlockFile(IN HANDLE FileHandle,
|
||||||
BOOLEAN LocalEvent = FALSE;
|
BOOLEAN LocalEvent = FALSE;
|
||||||
KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
|
||||||
LARGE_INTEGER CapturedByteOffset, CapturedLength;
|
LARGE_INTEGER CapturedByteOffset, CapturedLength;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
OBJECT_HANDLE_INFORMATION HandleInformation;
|
OBJECT_HANDLE_INFORMATION HandleInformation;
|
||||||
IO_STATUS_BLOCK KernelIosb;
|
IO_STATUS_BLOCK KernelIosb;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
@ -2665,19 +2632,12 @@ NtUnlockFile(IN HANDLE FileHandle,
|
||||||
CapturedLength = ProbeForReadLargeInteger(Length);
|
CapturedLength = ProbeForReadLargeInteger(Length);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
|
||||||
/* Get the exception code */
|
|
||||||
Status = _SEH2_GetExceptionCode();
|
|
||||||
}
|
|
||||||
_SEH2_END;
|
|
||||||
|
|
||||||
/* Check if probing failed */
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
{
|
||||||
/* Dereference the object and return exception code */
|
/* Dereference the object and return exception code */
|
||||||
ObDereferenceObject(FileObject);
|
ObDereferenceObject(FileObject);
|
||||||
return Status;
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2747,15 +2707,14 @@ NtUnlockFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Allocating failed, clean up */
|
/* Allocating failed, clean up and return the exception code */
|
||||||
IopCleanupAfterException(FileObject, Irp, NULL, Event);
|
IopCleanupAfterException(FileObject, Irp, NULL, Event);
|
||||||
if (LocalLength) ExFreePool(LocalLength);
|
if (LocalLength) ExFreePool(LocalLength);
|
||||||
|
|
||||||
/* Get exception status */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Set Parameters */
|
/* Set Parameters */
|
||||||
StackPtr->Parameters.LockControl.ByteOffset = CapturedByteOffset;
|
StackPtr->Parameters.LockControl.ByteOffset = CapturedByteOffset;
|
||||||
|
@ -2801,7 +2760,7 @@ NtWriteFile(IN HANDLE FileHandle,
|
||||||
IN PLARGE_INTEGER ByteOffset OPTIONAL,
|
IN PLARGE_INTEGER ByteOffset OPTIONAL,
|
||||||
IN PULONG Key OPTIONAL)
|
IN PULONG Key OPTIONAL)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
PDEVICE_OBJECT DeviceObject;
|
PDEVICE_OBJECT DeviceObject;
|
||||||
|
@ -2864,13 +2823,10 @@ NtWriteFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Check for probe failure */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2990,10 +2946,9 @@ NtWriteFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Allocating failed, clean up */
|
/* Allocating failed, clean up and return the exception code */
|
||||||
IopCleanupAfterException(FileObject, Irp, EventObject, NULL);
|
IopCleanupAfterException(FileObject, Irp, EventObject, NULL);
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
_SEH2_YIELD(return Status);
|
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
|
@ -3019,10 +2974,9 @@ NtWriteFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Allocating failed, clean up */
|
/* Allocating failed, clean up and return the exception code */
|
||||||
IopCleanupAfterException(FileObject, Irp, EventObject, NULL);
|
IopCleanupAfterException(FileObject, Irp, EventObject, NULL);
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
_SEH2_YIELD(return Status);
|
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
|
@ -3088,7 +3042,7 @@ NtQueryVolumeInformationFile(IN HANDLE FileHandle,
|
||||||
PKEVENT Event = NULL;
|
PKEVENT Event = NULL;
|
||||||
BOOLEAN LocalEvent = FALSE;
|
BOOLEAN LocalEvent = FALSE;
|
||||||
KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
IO_STATUS_BLOCK KernelIosb;
|
IO_STATUS_BLOCK KernelIosb;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
IOTRACE(IO_API_DEBUG, "FileHandle: %p\n", FileHandle);
|
IOTRACE(IO_API_DEBUG, "FileHandle: %p\n", FileHandle);
|
||||||
|
@ -3122,11 +3076,10 @@ NtQueryVolumeInformationFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get File Object */
|
/* Get File Object */
|
||||||
|
@ -3191,12 +3144,11 @@ NtQueryVolumeInformationFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Allocating failed, clean up */
|
/* Allocating failed, clean up and return the exception code */
|
||||||
IopCleanupAfterException(FileObject, Irp, NULL, Event);
|
IopCleanupAfterException(FileObject, Irp, NULL, Event);
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Set the flags for this buffered + deferred I/O */
|
/* Set the flags for this buffered + deferred I/O */
|
||||||
Irp->Flags |= (IRP_BUFFERED_IO |
|
Irp->Flags |= (IRP_BUFFERED_IO |
|
||||||
|
@ -3251,7 +3203,7 @@ NtSetVolumeInformationFile(IN HANDLE FileHandle,
|
||||||
PKEVENT Event = NULL;
|
PKEVENT Event = NULL;
|
||||||
BOOLEAN LocalEvent = FALSE;
|
BOOLEAN LocalEvent = FALSE;
|
||||||
KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
IO_STATUS_BLOCK KernelIosb;
|
IO_STATUS_BLOCK KernelIosb;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
IOTRACE(IO_API_DEBUG, "FileHandle: %p\n", FileHandle);
|
IOTRACE(IO_API_DEBUG, "FileHandle: %p\n", FileHandle);
|
||||||
|
@ -3285,11 +3237,10 @@ NtSetVolumeInformationFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get File Object */
|
/* Get File Object */
|
||||||
|
@ -3357,12 +3308,11 @@ NtSetVolumeInformationFile(IN HANDLE FileHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Allocating failed, clean up */
|
/* Allocating failed, clean up and return the exception code */
|
||||||
IopCleanupAfterException(FileObject, Irp, NULL, Event);
|
IopCleanupAfterException(FileObject, Irp, NULL, Event);
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Set the flags for this buffered + deferred I/O */
|
/* Set the flags for this buffered + deferred I/O */
|
||||||
Irp->Flags |= (IRP_BUFFERED_IO | IRP_DEALLOCATE_BUFFER);
|
Irp->Flags |= (IRP_BUFFERED_IO | IRP_DEALLOCATE_BUFFER);
|
||||||
|
|
|
@ -712,12 +712,11 @@ IoBuildAsynchronousFsdRequest(IN ULONG MajorFunction,
|
||||||
/* Free the IRP and its MDL */
|
/* Free the IRP and its MDL */
|
||||||
IoFreeMdl(Irp->MdlAddress);
|
IoFreeMdl(Irp->MdlAddress);
|
||||||
IoFreeIrp(Irp);
|
IoFreeIrp(Irp);
|
||||||
Irp = NULL;
|
|
||||||
|
/* Fail */
|
||||||
|
_SEH2_YIELD(return NULL);
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* This is how we know if we failed during the probe */
|
|
||||||
if (!Irp) return NULL;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -908,12 +907,11 @@ IoBuildDeviceIoControlRequest(IN ULONG IoControlCode,
|
||||||
/* Free the input buffer and IRP */
|
/* Free the input buffer and IRP */
|
||||||
if (InputBuffer) ExFreePool(Irp->AssociatedIrp.SystemBuffer);
|
if (InputBuffer) ExFreePool(Irp->AssociatedIrp.SystemBuffer);
|
||||||
IoFreeIrp(Irp);
|
IoFreeIrp(Irp);
|
||||||
Irp = NULL;
|
|
||||||
|
/* Fail */
|
||||||
|
_SEH2_YIELD(return NULL);
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* This is how we know if probing failed */
|
|
||||||
if (!Irp) return NULL;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -197,14 +197,11 @@ IopCaptureUnicodeString(PUNICODE_STRING DstName, PUNICODE_STRING SrcName)
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
|
if (Name.Buffer) ExFreePool(Name.Buffer);
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status) && Name.Buffer)
|
|
||||||
{
|
|
||||||
ExFreePool(Name.Buffer);
|
|
||||||
}
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,7 +209,7 @@ static NTSTATUS
|
||||||
IopGetDeviceProperty(PPLUGPLAY_CONTROL_PROPERTY_DATA PropertyData)
|
IopGetDeviceProperty(PPLUGPLAY_CONTROL_PROPERTY_DATA PropertyData)
|
||||||
{
|
{
|
||||||
PDEVICE_OBJECT DeviceObject = NULL;
|
PDEVICE_OBJECT DeviceObject = NULL;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
UNICODE_STRING DeviceInstance;
|
UNICODE_STRING DeviceInstance;
|
||||||
ULONG BufferSize;
|
ULONG BufferSize;
|
||||||
ULONG Property = 0;
|
ULONG Property = 0;
|
||||||
|
@ -237,16 +234,11 @@ IopGetDeviceProperty(PPLUGPLAY_CONTROL_PROPERTY_DATA PropertyData)
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
ExFreePool(DeviceInstance.Buffer);
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
ExFreePool(DeviceInstance.Buffer);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the device object */
|
/* Get the device object */
|
||||||
DeviceObject = IopGetDeviceObjectFromDeviceInstance(&DeviceInstance);
|
DeviceObject = IopGetDeviceObjectFromDeviceInstance(&DeviceInstance);
|
||||||
ExFreePool(DeviceInstance.Buffer);
|
ExFreePool(DeviceInstance.Buffer);
|
||||||
|
@ -319,16 +311,11 @@ IopGetRelatedDevice(PPLUGPLAY_CONTROL_RELATED_DEVICE_DATA RelatedDeviceData)
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
ExFreePool(TargetDeviceInstance.Buffer);
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
ExFreePool(TargetDeviceInstance.Buffer);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
RtlInitUnicodeString(&RootDeviceName,
|
RtlInitUnicodeString(&RootDeviceName,
|
||||||
L"HTREE\\ROOT\\0");
|
L"HTREE\\ROOT\\0");
|
||||||
if (RtlEqualUnicodeString(&TargetDeviceInstance,
|
if (RtlEqualUnicodeString(&TargetDeviceInstance,
|
||||||
|
@ -426,7 +413,7 @@ IopDeviceStatus(PPLUGPLAY_CONTROL_STATUS_DATA StatusData)
|
||||||
ULONG DeviceStatus = 0;
|
ULONG DeviceStatus = 0;
|
||||||
ULONG DeviceProblem = 0;
|
ULONG DeviceProblem = 0;
|
||||||
UNICODE_STRING DeviceInstance;
|
UNICODE_STRING DeviceInstance;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
DPRINT("IopDeviceStatus() called\n");
|
DPRINT("IopDeviceStatus() called\n");
|
||||||
|
|
||||||
|
@ -446,17 +433,11 @@ IopDeviceStatus(PPLUGPLAY_CONTROL_STATUS_DATA StatusData)
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
if (DeviceInstance.Buffer) ExFreePool(DeviceInstance.Buffer);
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
if (DeviceInstance.Buffer)
|
|
||||||
ExFreePool(DeviceInstance.Buffer);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the device object */
|
/* Get the device object */
|
||||||
DeviceObject = IopGetDeviceObjectFromDeviceInstance(&DeviceInstance);
|
DeviceObject = IopGetDeviceObjectFromDeviceInstance(&DeviceInstance);
|
||||||
ExFreePool(DeviceInstance.Buffer);
|
ExFreePool(DeviceInstance.Buffer);
|
||||||
|
@ -766,8 +747,6 @@ NtPlugPlayControl(IN PLUGPLAY_CONTROL_CLASS PlugPlayControlClass,
|
||||||
IN OUT PVOID Buffer,
|
IN OUT PVOID Buffer,
|
||||||
IN ULONG BufferLength)
|
IN ULONG BufferLength)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
|
||||||
|
|
||||||
DPRINT("NtPlugPlayControl(%lu %p %lu) called\n",
|
DPRINT("NtPlugPlayControl(%lu %p %lu) called\n",
|
||||||
PlugPlayControlClass, Buffer, BufferLength);
|
PlugPlayControlClass, Buffer, BufferLength);
|
||||||
|
|
||||||
|
@ -795,15 +774,10 @@ NtPlugPlayControl(IN PLUGPLAY_CONTROL_CLASS PlugPlayControlClass,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (PlugPlayControlClass)
|
switch (PlugPlayControlClass)
|
||||||
{
|
{
|
||||||
case PlugPlayControlUserResponse:
|
case PlugPlayControlUserResponse:
|
||||||
|
|
|
@ -362,7 +362,7 @@ NtOpenDirectoryObject(OUT PHANDLE DirectoryHandle,
|
||||||
{
|
{
|
||||||
HANDLE Directory;
|
HANDLE Directory;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check if we need to do any probing */
|
/* Check if we need to do any probing */
|
||||||
|
@ -375,11 +375,10 @@ NtOpenDirectoryObject(OUT PHANDLE DirectoryHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the error code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the directory object */
|
/* Open the directory object */
|
||||||
|
@ -465,7 +464,7 @@ NtQueryDirectoryObject(IN HANDLE DirectoryHandle,
|
||||||
POBJECT_DIRECTORY Directory;
|
POBJECT_DIRECTORY Directory;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
ULONG SkipEntries = 0;
|
ULONG SkipEntries = 0;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PVOID LocalBuffer;
|
PVOID LocalBuffer;
|
||||||
POBJECT_DIRECTORY_INFORMATION DirectoryInfo;
|
POBJECT_DIRECTORY_INFORMATION DirectoryInfo;
|
||||||
ULONG Length, TotalLength;
|
ULONG Length, TotalLength;
|
||||||
|
@ -499,11 +498,10 @@ NtQueryDirectoryObject(IN HANDLE DirectoryHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else if (!RestartScan)
|
else if (!RestartScan)
|
||||||
{
|
{
|
||||||
|
@ -692,6 +690,7 @@ Quickie:
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -736,7 +735,7 @@ NtCreateDirectoryObject(OUT PHANDLE DirectoryHandle,
|
||||||
POBJECT_DIRECTORY Directory;
|
POBJECT_DIRECTORY Directory;
|
||||||
HANDLE NewHandle;
|
HANDLE NewHandle;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check if we need to do any probing */
|
/* Check if we need to do any probing */
|
||||||
|
@ -749,11 +748,10 @@ NtCreateDirectoryObject(OUT PHANDLE DirectoryHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the error code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the object */
|
/* Create the object */
|
||||||
|
|
|
@ -3221,7 +3221,7 @@ NtDuplicateObject(IN HANDLE SourceProcessHandle,
|
||||||
PEPROCESS SourceProcess, TargetProcess, Target;
|
PEPROCESS SourceProcess, TargetProcess, Target;
|
||||||
HANDLE hTarget;
|
HANDLE hTarget;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
OBTRACE(OB_HANDLE_DEBUG,
|
OBTRACE(OB_HANDLE_DEBUG,
|
||||||
"%s - Duplicating handle: %lx for %lx into %lx.\n",
|
"%s - Duplicating handle: %lx for %lx into %lx.\n",
|
||||||
__FUNCTION__,
|
__FUNCTION__,
|
||||||
|
@ -3241,11 +3241,10 @@ NtDuplicateObject(IN HANDLE SourceProcessHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception status */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now reference the input handle */
|
/* Now reference the input handle */
|
||||||
|
|
|
@ -466,8 +466,7 @@ ObpCaptureObjectCreateInformation(IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
(ObjectAttributes->Attributes & ~OBJ_VALID_ATTRIBUTES))
|
(ObjectAttributes->Attributes & ~OBJ_VALID_ATTRIBUTES))
|
||||||
{
|
{
|
||||||
/* Invalid combination, fail */
|
/* Invalid combination, fail */
|
||||||
Status = STATUS_INVALID_PARAMETER;
|
_SEH2_YIELD(return STATUS_INVALID_PARAMETER);
|
||||||
_SEH2_LEAVE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set some Create Info */
|
/* Set some Create Info */
|
||||||
|
@ -491,7 +490,7 @@ ObpCaptureObjectCreateInformation(IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
{
|
{
|
||||||
/* Capture failed, quit */
|
/* Capture failed, quit */
|
||||||
ObjectCreateInfo->SecurityDescriptor = NULL;
|
ObjectCreateInfo->SecurityDescriptor = NULL;
|
||||||
_SEH2_LEAVE;
|
_SEH2_YIELD(return Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the probe mode and security descriptor size */
|
/* Save the probe mode and security descriptor size */
|
||||||
|
@ -525,13 +524,12 @@ ObpCaptureObjectCreateInformation(IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
_SEH2_EXCEPT(ExSystemExceptionFilter())
|
||||||
{
|
{
|
||||||
/* Get the exception */
|
/* Cleanup and return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
ObpReleaseObjectCreateInformation(ObjectCreateInfo);
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
/* Now check if the Object Attributes had an Object Name */
|
/* Now check if the Object Attributes had an Object Name */
|
||||||
if (LocalObjectName)
|
if (LocalObjectName)
|
||||||
{
|
{
|
||||||
|
@ -551,7 +549,6 @@ ObpCaptureObjectCreateInformation(IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
Status = STATUS_OBJECT_NAME_INVALID;
|
Status = STATUS_OBJECT_NAME_INVALID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* Cleanup if we failed */
|
/* Cleanup if we failed */
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
@ -1411,7 +1408,7 @@ NtQueryObject(IN HANDLE ObjectHandle,
|
||||||
POBJECT_BASIC_INFORMATION BasicInfo;
|
POBJECT_BASIC_INFORMATION BasicInfo;
|
||||||
ULONG InfoLength;
|
ULONG InfoLength;
|
||||||
PVOID Object = NULL;
|
PVOID Object = NULL;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -1429,13 +1426,10 @@ NtQueryObject(IN HANDLE ObjectHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Fail if we raised an exception */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1632,7 +1626,7 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
|
||||||
IN PVOID ObjectInformation,
|
IN PVOID ObjectInformation,
|
||||||
IN ULONG Length)
|
IN ULONG Length)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
OBP_SET_HANDLE_ATTRIBUTES_CONTEXT Context;
|
OBP_SET_HANDLE_ATTRIBUTES_CONTEXT Context;
|
||||||
PVOID ObjectTable;
|
PVOID ObjectTable;
|
||||||
KAPC_STATE ApcState;
|
KAPC_STATE ApcState;
|
||||||
|
@ -1653,13 +1647,16 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
|
||||||
return STATUS_INFO_LENGTH_MISMATCH;
|
return STATUS_INFO_LENGTH_MISMATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the previous mode and actual information */
|
/* Save the previous mode */
|
||||||
Context.PreviousMode = ExGetPreviousMode();
|
Context.PreviousMode = ExGetPreviousMode();
|
||||||
|
|
||||||
|
/* Check if we were called from user mode */
|
||||||
if (Context.PreviousMode != KernelMode)
|
if (Context.PreviousMode != KernelMode)
|
||||||
{
|
{
|
||||||
|
/* Enter SEH */
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
/* Probe and capture the attribute buffer */
|
||||||
ProbeForRead(ObjectInformation,
|
ProbeForRead(ObjectInformation,
|
||||||
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
|
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
|
||||||
sizeof(BOOLEAN));
|
sizeof(BOOLEAN));
|
||||||
|
@ -1668,15 +1665,17 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
/* Just copy the buffer directly */
|
||||||
Context.Information = *(POBJECT_HANDLE_ATTRIBUTE_INFORMATION)
|
Context.Information = *(POBJECT_HANDLE_ATTRIBUTE_INFORMATION)
|
||||||
ObjectInformation;
|
ObjectInformation;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if this is a kernel handle */
|
/* Check if this is a kernel handle */
|
||||||
if (ObIsKernelHandle(ObjectHandle, Context.PreviousMode))
|
if (ObIsKernelHandle(ObjectHandle, Context.PreviousMode))
|
||||||
|
@ -1708,6 +1707,11 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
|
||||||
/* Some failure */
|
/* Some failure */
|
||||||
Status = STATUS_ACCESS_DENIED;
|
Status = STATUS_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We are done */
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/* De-attach if we were attached, and return status */
|
/* De-attach if we were attached, and return status */
|
||||||
if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
|
if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
|
||||||
|
|
|
@ -238,7 +238,7 @@ NtCreateSymbolicLinkObject(OUT PHANDLE LinkHandle,
|
||||||
POBJECT_SYMBOLIC_LINK SymbolicLink;
|
POBJECT_SYMBOLIC_LINK SymbolicLink;
|
||||||
UNICODE_STRING CapturedLinkTarget;
|
UNICODE_STRING CapturedLinkTarget;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check if we need to probe parameters */
|
/* Check if we need to probe parameters */
|
||||||
|
@ -257,13 +257,10 @@ NtCreateSymbolicLinkObject(OUT PHANDLE LinkHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Exception, get the error code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Probing failed, return the error code */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -380,7 +377,7 @@ NtOpenSymbolicLinkObject(OUT PHANDLE LinkHandle,
|
||||||
{
|
{
|
||||||
HANDLE hLink;
|
HANDLE hLink;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check if we need to probe parameters */
|
/* Check if we need to probe parameters */
|
||||||
|
@ -393,13 +390,10 @@ NtOpenSymbolicLinkObject(OUT PHANDLE LinkHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Exception, get the error code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Probing failed, return the error code */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the object */
|
/* Open the object */
|
||||||
|
@ -458,7 +452,7 @@ NtQuerySymbolicLinkObject(IN HANDLE LinkHandle,
|
||||||
UNICODE_STRING SafeLinkTarget = { 0, 0, NULL };
|
UNICODE_STRING SafeLinkTarget = { 0, 0, NULL };
|
||||||
POBJECT_SYMBOLIC_LINK SymlinkObject;
|
POBJECT_SYMBOLIC_LINK SymlinkObject;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
ULONG LengthUsed;
|
ULONG LengthUsed;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -480,13 +474,10 @@ NtQuerySymbolicLinkObject(IN HANDLE LinkHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Probe failure: get exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Probe failed, return status */
|
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -804,7 +804,7 @@ NtQuerySecurityObject(IN HANDLE Handle,
|
||||||
POBJECT_HEADER Header;
|
POBJECT_HEADER Header;
|
||||||
POBJECT_TYPE Type;
|
POBJECT_TYPE Type;
|
||||||
ACCESS_MASK DesiredAccess;
|
ACCESS_MASK DesiredAccess;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check if we came from user mode */
|
/* Check if we came from user mode */
|
||||||
|
@ -819,13 +819,10 @@ NtQuerySecurityObject(IN HANDLE Handle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Fail if we got an access violation */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the required access rights for the operation */
|
/* Get the required access rights for the operation */
|
||||||
|
|
|
@ -62,7 +62,7 @@ NtWaitForMultipleObjects(IN ULONG ObjectCount,
|
||||||
PHANDLE_TABLE HandleTable;
|
PHANDLE_TABLE HandleTable;
|
||||||
ACCESS_MASK GrantedAccess;
|
ACCESS_MASK GrantedAccess;
|
||||||
PVOID DefaultObject;
|
PVOID DefaultObject;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Enter a critical region since we'll play with handles */
|
/* Enter a critical region since we'll play with handles */
|
||||||
|
@ -116,14 +116,11 @@ NtWaitForMultipleObjects(IN ULONG ObjectCount,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Fail if we raised an exception */
|
|
||||||
if (!NT_SUCCESS(Status)) goto Quickie;
|
|
||||||
|
|
||||||
/* Check if we can use the internal Wait Array */
|
/* Check if we can use the internal Wait Array */
|
||||||
if (ObjectCount > THREAD_WAIT_OBJECTS)
|
if (ObjectCount > THREAD_WAIT_OBJECTS)
|
||||||
{
|
{
|
||||||
|
@ -359,7 +356,7 @@ NtWaitForSingleObject(IN HANDLE ObjectHandle,
|
||||||
PVOID Object, WaitableObject;
|
PVOID Object, WaitableObject;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
LARGE_INTEGER SafeTimeOut;
|
LARGE_INTEGER SafeTimeOut;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
/* Check if we came with a timeout from user mode */
|
/* Check if we came with a timeout from user mode */
|
||||||
if ((TimeOut) && (PreviousMode != KernelMode))
|
if ((TimeOut) && (PreviousMode != KernelMode))
|
||||||
|
@ -373,11 +370,10 @@ NtWaitForSingleObject(IN HANDLE ObjectHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the Object */
|
/* Get the Object */
|
||||||
|
@ -460,7 +456,7 @@ NtSignalAndWaitForSingleObject(IN HANDLE ObjectHandleToSignal,
|
||||||
PVOID SignalObj, WaitObj, WaitableObject;
|
PVOID SignalObj, WaitObj, WaitableObject;
|
||||||
LARGE_INTEGER SafeTimeOut;
|
LARGE_INTEGER SafeTimeOut;
|
||||||
OBJECT_HANDLE_INFORMATION HandleInfo;
|
OBJECT_HANDLE_INFORMATION HandleInfo;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
/* Check if we came with a timeout from user mode */
|
/* Check if we came with a timeout from user mode */
|
||||||
if ((TimeOut) && (PreviousMode != KernelMode))
|
if ((TimeOut) && (PreviousMode != KernelMode))
|
||||||
|
@ -474,11 +470,10 @@ NtSignalAndWaitForSingleObject(IN HANDLE ObjectHandleToSignal,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start by getting the signal object*/
|
/* Start by getting the signal object*/
|
||||||
|
|
|
@ -103,7 +103,7 @@ PsGetContextThread(IN PETHREAD Thread,
|
||||||
{
|
{
|
||||||
GET_SET_CTX_CONTEXT GetSetContext;
|
GET_SET_CTX_CONTEXT GetSetContext;
|
||||||
ULONG Size = 0, Flags = 0;
|
ULONG Size = 0, Flags = 0;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
/* Enter SEH */
|
/* Enter SEH */
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
|
@ -133,14 +133,11 @@ PsGetContextThread(IN PETHREAD Thread,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Check if we got success */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Initialize the wait event */
|
/* Initialize the wait event */
|
||||||
KeInitializeEvent(&GetSetContext.Event, NotificationEvent, FALSE);
|
KeInitializeEvent(&GetSetContext.Event, NotificationEvent, FALSE);
|
||||||
|
|
||||||
|
@ -167,6 +164,9 @@ PsGetContextThread(IN PETHREAD Thread,
|
||||||
|
|
||||||
/* Leave the guarded region */
|
/* Leave the guarded region */
|
||||||
KeLeaveGuardedRegion();
|
KeLeaveGuardedRegion();
|
||||||
|
|
||||||
|
/* We are done */
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -204,6 +204,7 @@ PsGetContextThread(IN PETHREAD Thread,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
@ -223,7 +224,7 @@ PsSetContextThread(IN PETHREAD Thread,
|
||||||
{
|
{
|
||||||
GET_SET_CTX_CONTEXT GetSetContext;
|
GET_SET_CTX_CONTEXT GetSetContext;
|
||||||
ULONG Size = 0, Flags = 0;
|
ULONG Size = 0, Flags = 0;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
/* Enter SEH */
|
/* Enter SEH */
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
|
@ -256,14 +257,11 @@ PsSetContextThread(IN PETHREAD Thread,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Check if we got success */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Initialize the wait event */
|
/* Initialize the wait event */
|
||||||
KeInitializeEvent(&GetSetContext.Event, NotificationEvent, FALSE);
|
KeInitializeEvent(&GetSetContext.Event, NotificationEvent, FALSE);
|
||||||
|
|
||||||
|
@ -290,6 +288,9 @@ PsSetContextThread(IN PETHREAD Thread,
|
||||||
|
|
||||||
/* Leave the guarded region */
|
/* Leave the guarded region */
|
||||||
KeLeaveGuardedRegion();
|
KeLeaveGuardedRegion();
|
||||||
|
|
||||||
|
/* We are done */
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -226,7 +226,7 @@ NtCreateJobObject (
|
||||||
PEJOB Job;
|
PEJOB Job;
|
||||||
KPROCESSOR_MODE PreviousMode;
|
KPROCESSOR_MODE PreviousMode;
|
||||||
PEPROCESS CurrentProcess;
|
PEPROCESS CurrentProcess;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -242,14 +242,9 @@ NtCreateJobObject (
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if(!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ObCreateObject(PreviousMode,
|
Status = ObCreateObject(PreviousMode,
|
||||||
|
@ -397,7 +392,7 @@ NtOpenJobObject (
|
||||||
{
|
{
|
||||||
KPROCESSOR_MODE PreviousMode;
|
KPROCESSOR_MODE PreviousMode;
|
||||||
HANDLE hJob;
|
HANDLE hJob;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -412,18 +407,11 @@ NtOpenJobObject (
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if(!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
Status = ObOpenObjectByName(ObjectAttributes,
|
Status = ObOpenObjectByName(ObjectAttributes,
|
||||||
PsJobType,
|
PsJobType,
|
||||||
PreviousMode,
|
PreviousMode,
|
||||||
|
@ -443,7 +431,6 @@ NtOpenJobObject (
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1248,7 +1248,7 @@ NtCreateProcessEx(OUT PHANDLE ProcessHandle,
|
||||||
IN BOOLEAN InJob)
|
IN BOOLEAN InJob)
|
||||||
{
|
{
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
PSTRACE(PS_PROCESS_DEBUG,
|
PSTRACE(PS_PROCESS_DEBUG,
|
||||||
"ParentProcess: %p Flags: %lx\n", ParentProcess, Flags);
|
"ParentProcess: %p Flags: %lx\n", ParentProcess, Flags);
|
||||||
|
@ -1263,11 +1263,10 @@ NtCreateProcessEx(OUT PHANDLE ProcessHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure there's a parent process */
|
/* Make sure there's a parent process */
|
||||||
|
@ -1346,7 +1345,7 @@ NtOpenProcess(OUT PHANDLE ProcessHandle,
|
||||||
BOOLEAN HasObjectName = FALSE;
|
BOOLEAN HasObjectName = FALSE;
|
||||||
PETHREAD Thread = NULL;
|
PETHREAD Thread = NULL;
|
||||||
PEPROCESS Process = NULL;
|
PEPROCESS Process = NULL;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
ACCESS_STATE AccessState;
|
ACCESS_STATE AccessState;
|
||||||
AUX_ACCESS_DATA AuxData;
|
AUX_ACCESS_DATA AuxData;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
@ -1383,11 +1382,10 @@ NtOpenProcess(OUT PHANDLE ProcessHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -63,7 +63,7 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
|
||||||
{
|
{
|
||||||
PEPROCESS Process;
|
PEPROCESS Process;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
ULONG Length = 0;
|
ULONG Length = 0;
|
||||||
PPROCESS_BASIC_INFORMATION ProcessBasicInfo =
|
PPROCESS_BASIC_INFORMATION ProcessBasicInfo =
|
||||||
(PPROCESS_BASIC_INFORMATION)ProcessInformation;
|
(PPROCESS_BASIC_INFORMATION)ProcessInformation;
|
||||||
|
@ -86,18 +86,20 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
|
||||||
/* Prepare to probe parameters */
|
/* Prepare to probe parameters */
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
/* Probe the buffer */
|
||||||
ProbeForWrite(ProcessInformation,
|
ProbeForWrite(ProcessInformation,
|
||||||
ProcessInformationLength,
|
ProcessInformationLength,
|
||||||
sizeof(ULONG));
|
sizeof(ULONG));
|
||||||
|
|
||||||
|
/* Probe the return length if required */
|
||||||
if (ReturnLength) ProbeForWriteUlong(ReturnLength);
|
if (ReturnLength) ProbeForWriteUlong(ReturnLength);
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the error code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if((ProcessInformationClass == ProcessCookie) &&
|
if((ProcessInformationClass == ProcessCookie) &&
|
||||||
|
@ -761,6 +763,9 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
|
||||||
Length = sizeof(ULONG);
|
Length = sizeof(ULONG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Indicate success */
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
/* Enter SEH to protect write */
|
/* Enter SEH to protect write */
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
@ -882,11 +887,10 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) break;
|
|
||||||
|
|
||||||
/* Get the LPC Port */
|
/* Get the LPC Port */
|
||||||
Status = ObReferenceObjectByHandle(PortHandle,
|
Status = ObReferenceObjectByHandle(PortHandle,
|
||||||
|
@ -927,11 +931,10 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) break;
|
|
||||||
|
|
||||||
/* Assign the actual token */
|
/* Assign the actual token */
|
||||||
Status = PspSetPrimaryToken(Process, TokenHandle, NULL);
|
Status = PspSetPrimaryToken(Process, TokenHandle, NULL);
|
||||||
|
@ -980,11 +983,10 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) break;
|
|
||||||
|
|
||||||
/* Setting the session id requires the SeTcbPrivilege */
|
/* Setting the session id requires the SeTcbPrivilege */
|
||||||
if (!SeSinglePrivilegeCheck(SeTcbPrivilege, PreviousMode))
|
if (!SeSinglePrivilegeCheck(SeTcbPrivilege, PreviousMode))
|
||||||
|
@ -1048,11 +1050,10 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) break;
|
|
||||||
|
|
||||||
/* Check for invalid PriorityClass value */
|
/* Check for invalid PriorityClass value */
|
||||||
if (PriorityClass.PriorityClass > PROCESS_PRIORITY_CLASS_ABOVE_NORMAL)
|
if (PriorityClass.PriorityClass > PROCESS_PRIORITY_CLASS_ABOVE_NORMAL)
|
||||||
|
@ -1250,11 +1251,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) break;
|
|
||||||
|
|
||||||
/* Validate it */
|
/* Validate it */
|
||||||
if ((Priority > HIGH_PRIORITY) ||
|
if ((Priority > HIGH_PRIORITY) ||
|
||||||
|
@ -1286,11 +1286,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) break;
|
|
||||||
|
|
||||||
/* Validate it */
|
/* Validate it */
|
||||||
if ((Priority > THREAD_BASE_PRIORITY_MAX) ||
|
if ((Priority > THREAD_BASE_PRIORITY_MAX) ||
|
||||||
|
@ -1332,11 +1331,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) break;
|
|
||||||
|
|
||||||
/* Validate it */
|
/* Validate it */
|
||||||
if (!Affinity)
|
if (!Affinity)
|
||||||
|
@ -1400,11 +1398,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) break;
|
|
||||||
|
|
||||||
/* Assign the actual token */
|
/* Assign the actual token */
|
||||||
Status = PsAssignImpersonationToken(Thread, TokenHandle);
|
Status = PsAssignImpersonationToken(Thread, TokenHandle);
|
||||||
|
@ -1427,11 +1424,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) break;
|
|
||||||
|
|
||||||
/* Set the address */
|
/* Set the address */
|
||||||
Thread->Win32StartAddress = Address;
|
Thread->Win32StartAddress = Address;
|
||||||
|
@ -1454,11 +1450,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) break;
|
|
||||||
|
|
||||||
/* Validate it */
|
/* Validate it */
|
||||||
if (IdealProcessor > MAXIMUM_PROCESSORS)
|
if (IdealProcessor > MAXIMUM_PROCESSORS)
|
||||||
|
@ -1502,11 +1497,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) break;
|
|
||||||
|
|
||||||
/* Call the kernel */
|
/* Call the kernel */
|
||||||
KeSetDisableBoostThread(&Thread->Tcb, (BOOLEAN)DisableBoost);
|
KeSetDisableBoostThread(&Thread->Tcb, (BOOLEAN)DisableBoost);
|
||||||
|
@ -1529,11 +1523,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) break;
|
|
||||||
|
|
||||||
/* This is only valid for the current thread */
|
/* This is only valid for the current thread */
|
||||||
if (Thread != PsGetCurrentThread())
|
if (Thread != PsGetCurrentThread())
|
||||||
|
@ -1614,7 +1607,7 @@ NtQueryInformationThread(IN HANDLE ThreadHandle,
|
||||||
{
|
{
|
||||||
PETHREAD Thread;
|
PETHREAD Thread;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
ULONG Access;
|
ULONG Access;
|
||||||
ULONG Length = 0;
|
ULONG Length = 0;
|
||||||
PTHREAD_BASIC_INFORMATION ThreadBasicInfo =
|
PTHREAD_BASIC_INFORMATION ThreadBasicInfo =
|
||||||
|
@ -1623,26 +1616,26 @@ NtQueryInformationThread(IN HANDLE ThreadHandle,
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
/* Check if we were called from user mode */
|
||||||
if (PreviousMode != KernelMode)
|
if (PreviousMode != KernelMode)
|
||||||
{
|
{
|
||||||
|
/* Enter SEH */
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
/* Probe the buffer */
|
||||||
ProbeForWrite(ThreadInformation,
|
ProbeForWrite(ThreadInformation,
|
||||||
ThreadInformationLength,
|
ThreadInformationLength,
|
||||||
sizeof(ULONG));
|
sizeof(ULONG));
|
||||||
|
|
||||||
if (ReturnLength)
|
/* Probe the return length if required */
|
||||||
{
|
if (ReturnLength) ProbeForWriteUlong(ReturnLength);
|
||||||
ProbeForWriteUlong(ReturnLength);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check what class this is */
|
/* Check what class this is */
|
||||||
|
|
|
@ -349,7 +349,7 @@ NtOpenProcessTokenEx(IN HANDLE ProcessHandle,
|
||||||
PACCESS_TOKEN Token;
|
PACCESS_TOKEN Token;
|
||||||
HANDLE hToken;
|
HANDLE hToken;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
PSTRACE(PS_SECURITY_DEBUG,
|
PSTRACE(PS_SECURITY_DEBUG,
|
||||||
"Process: %p DesiredAccess: %lx\n", ProcessHandle, DesiredAccess);
|
"Process: %p DesiredAccess: %lx\n", ProcessHandle, DesiredAccess);
|
||||||
|
@ -365,13 +365,10 @@ NtOpenProcessTokenEx(IN HANDLE ProcessHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Fail on exception */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the process token */
|
/* Open the process token */
|
||||||
|
@ -938,7 +935,7 @@ NtImpersonateThread(IN HANDLE ThreadHandle,
|
||||||
PETHREAD Thread;
|
PETHREAD Thread;
|
||||||
PETHREAD ThreadToImpersonate;
|
PETHREAD ThreadToImpersonate;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
PSTRACE(PS_SECURITY_DEBUG,
|
PSTRACE(PS_SECURITY_DEBUG,
|
||||||
"Threads: %p %p\n", ThreadHandle, ThreadToImpersonateHandle);
|
"Threads: %p %p\n", ThreadHandle, ThreadToImpersonateHandle);
|
||||||
|
@ -960,13 +957,10 @@ NtImpersonateThread(IN HANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get exception status */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Fail on exception */
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reference the thread */
|
/* Reference the thread */
|
||||||
|
|
|
@ -48,7 +48,7 @@ NTAPI
|
||||||
PsSuspendThread(IN PETHREAD Thread,
|
PsSuspendThread(IN PETHREAD Thread,
|
||||||
OUT PULONG PreviousCount OPTIONAL)
|
OUT PULONG PreviousCount OPTIONAL)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
ULONG OldCount = 0;
|
ULONG OldCount = 0;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -60,6 +60,9 @@ PsSuspendThread(IN PETHREAD Thread,
|
||||||
{
|
{
|
||||||
/* Do the suspend */
|
/* Do the suspend */
|
||||||
OldCount = KeSuspendThread(&Thread->Tcb);
|
OldCount = KeSuspendThread(&Thread->Tcb);
|
||||||
|
|
||||||
|
/* We are done */
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -89,6 +92,9 @@ PsSuspendThread(IN PETHREAD Thread,
|
||||||
|
|
||||||
/* Release rundown protection */
|
/* Release rundown protection */
|
||||||
ExReleaseRundownProtection(&Thread->RundownProtect);
|
ExReleaseRundownProtection(&Thread->RundownProtect);
|
||||||
|
|
||||||
|
/* We are done */
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -99,6 +105,7 @@ PsSuspendThread(IN PETHREAD Thread,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
|
/* Get the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
|
|
||||||
/* Don't fail if we merely couldn't write the handle back */
|
/* Don't fail if we merely couldn't write the handle back */
|
||||||
|
@ -216,7 +223,7 @@ NtAlertResumeThread(IN HANDLE ThreadHandle,
|
||||||
{
|
{
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
PETHREAD Thread;
|
PETHREAD Thread;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
ULONG PreviousState;
|
ULONG PreviousState;
|
||||||
|
|
||||||
/* Check if we came from user mode with a suspend count */
|
/* Check if we came from user mode with a suspend count */
|
||||||
|
@ -230,11 +237,10 @@ NtAlertResumeThread(IN HANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reference the Object */
|
/* Reference the Object */
|
||||||
|
@ -282,7 +288,7 @@ NtResumeThread(IN HANDLE ThreadHandle,
|
||||||
PETHREAD Thread;
|
PETHREAD Thread;
|
||||||
ULONG Prev;
|
ULONG Prev;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check if caller gave a suspend count from user mode */
|
/* Check if caller gave a suspend count from user mode */
|
||||||
|
@ -296,11 +302,10 @@ NtResumeThread(IN HANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the Thread Object */
|
/* Get the Thread Object */
|
||||||
|
@ -345,7 +350,7 @@ NtSuspendThread(IN HANDLE ThreadHandle,
|
||||||
PETHREAD Thread;
|
PETHREAD Thread;
|
||||||
ULONG Prev;
|
ULONG Prev;
|
||||||
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Check if caller gave a suspend count from user mode */
|
/* Check if caller gave a suspend count from user mode */
|
||||||
|
@ -359,11 +364,10 @@ NtSuspendThread(IN HANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if(!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the Thread Object */
|
/* Get the Thread Object */
|
||||||
|
|
|
@ -475,9 +475,6 @@ PspCreateThread(OUT PHANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
|
||||||
Status = _SEH2_GetExceptionCode();
|
|
||||||
|
|
||||||
/* Thread insertion failed, thread is dead */
|
/* Thread insertion failed, thread is dead */
|
||||||
PspSetCrossThreadFlag(Thread, CT_DEAD_THREAD_BIT);
|
PspSetCrossThreadFlag(Thread, CT_DEAD_THREAD_BIT);
|
||||||
|
|
||||||
|
@ -492,9 +489,11 @@ PspCreateThread(OUT PHANDLE ThreadHandle,
|
||||||
|
|
||||||
/* Close its handle, killing it */
|
/* Close its handle, killing it */
|
||||||
ObCloseHandle(ThreadHandle, PreviousMode);
|
ObCloseHandle(ThreadHandle, PreviousMode);
|
||||||
|
|
||||||
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -879,7 +878,6 @@ NtCreateThread(OUT PHANDLE ThreadHandle,
|
||||||
IN BOOLEAN CreateSuspended)
|
IN BOOLEAN CreateSuspended)
|
||||||
{
|
{
|
||||||
INITIAL_TEB SafeInitialTeb;
|
INITIAL_TEB SafeInitialTeb;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
PSTRACE(PS_THREAD_DEBUG,
|
PSTRACE(PS_THREAD_DEBUG,
|
||||||
"ProcessHandle: %p Context: %p\n", ProcessHandle, ThreadContext);
|
"ProcessHandle: %p Context: %p\n", ProcessHandle, ThreadContext);
|
||||||
|
@ -912,10 +910,10 @@ NtCreateThread(OUT PHANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -951,7 +949,7 @@ NtOpenThread(OUT PHANDLE ThreadHandle,
|
||||||
CLIENT_ID SafeClientId;
|
CLIENT_ID SafeClientId;
|
||||||
ULONG Attributes = 0;
|
ULONG Attributes = 0;
|
||||||
HANDLE hThread = NULL;
|
HANDLE hThread = NULL;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
PETHREAD Thread;
|
PETHREAD Thread;
|
||||||
BOOLEAN HasObjectName = FALSE;
|
BOOLEAN HasObjectName = FALSE;
|
||||||
ACCESS_STATE AccessState;
|
ACCESS_STATE AccessState;
|
||||||
|
@ -990,11 +988,10 @@ NtOpenThread(OUT PHANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get the exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -131,7 +131,7 @@ NtW32Call(IN ULONG RoutineIndex,
|
||||||
{
|
{
|
||||||
PVOID RetResult;
|
PVOID RetResult;
|
||||||
ULONG RetResultLength;
|
ULONG RetResultLength;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
ASSERT(KeGetPreviousMode() != KernelMode);
|
ASSERT(KeGetPreviousMode() != KernelMode);
|
||||||
|
|
||||||
/* Enter SEH for probing */
|
/* Enter SEH for probing */
|
||||||
|
@ -143,14 +143,11 @@ NtW32Call(IN ULONG RoutineIndex,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
/* Get exception code */
|
/* Return the exception code */
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Make sure we got success */
|
|
||||||
if (NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
/* Call kernel function */
|
/* Call kernel function */
|
||||||
Status = KeUserModeCallback(RoutineIndex,
|
Status = KeUserModeCallback(RoutineIndex,
|
||||||
Argument,
|
Argument,
|
||||||
|
@ -173,7 +170,6 @@ NtW32Call(IN ULONG RoutineIndex,
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the result */
|
/* Return the result */
|
||||||
return Status;
|
return Status;
|
||||||
|
|
|
@ -292,12 +292,11 @@ SepCaptureAcl(IN PACL InputAcl,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if(NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
NewAcl = ExAllocatePool(PoolType,
|
NewAcl = ExAllocatePool(PoolType,
|
||||||
AclSize);
|
AclSize);
|
||||||
if(NewAcl != NULL)
|
if(NewAcl != NULL)
|
||||||
|
@ -312,8 +311,9 @@ SepCaptureAcl(IN PACL InputAcl,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
|
/* Free the ACL and return the exception code */
|
||||||
ExFreePool(NewAcl);
|
ExFreePool(NewAcl);
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
|
@ -322,7 +322,6 @@ SepCaptureAcl(IN PACL InputAcl,
|
||||||
Status = STATUS_INSUFFICIENT_RESOURCES;
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else if(!CaptureIfKernel)
|
else if(!CaptureIfKernel)
|
||||||
{
|
{
|
||||||
*CapturedAcl = InputAcl;
|
*CapturedAcl = InputAcl;
|
||||||
|
|
|
@ -215,14 +215,10 @@ SeCaptureLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Src,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allocate enough memory or check if the provided buffer is
|
/* allocate enough memory or check if the provided buffer is
|
||||||
|
@ -391,7 +387,7 @@ NtPrivilegeCheck (IN HANDLE ClientToken,
|
||||||
ULONG Length;
|
ULONG Length;
|
||||||
BOOLEAN CheckResult;
|
BOOLEAN CheckResult;
|
||||||
KPROCESSOR_MODE PreviousMode;
|
KPROCESSOR_MODE PreviousMode;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -415,8 +411,7 @@ NtPrivilegeCheck (IN HANDLE ClientToken,
|
||||||
Privilege[PrivilegeCount]) /
|
Privilege[PrivilegeCount]) /
|
||||||
sizeof(RequiredPrivileges->Privilege[0]) != PrivilegeCount)
|
sizeof(RequiredPrivileges->Privilege[0]) != PrivilegeCount)
|
||||||
{
|
{
|
||||||
Status = STATUS_INVALID_PARAMETER;
|
_SEH2_YIELD(return STATUS_INVALID_PARAMETER);
|
||||||
_SEH2_LEAVE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* probe all of the array */
|
/* probe all of the array */
|
||||||
|
@ -429,14 +424,10 @@ NtPrivilegeCheck (IN HANDLE ClientToken,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -397,7 +397,7 @@ SeCaptureSecurityDescriptor(IN PSECURITY_DESCRIPTOR _OriginalSecurityDescriptor,
|
||||||
ULONG OwnerSize = 0, GroupSize = 0;
|
ULONG OwnerSize = 0, GroupSize = 0;
|
||||||
ULONG SaclSize = 0, DaclSize = 0;
|
ULONG SaclSize = 0, DaclSize = 0;
|
||||||
ULONG DescriptorSize = 0;
|
ULONG DescriptorSize = 0;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
if(OriginalSecurityDescriptor != NULL)
|
if(OriginalSecurityDescriptor != NULL)
|
||||||
{
|
{
|
||||||
|
@ -417,8 +417,7 @@ SeCaptureSecurityDescriptor(IN PSECURITY_DESCRIPTOR _OriginalSecurityDescriptor,
|
||||||
|
|
||||||
if(OriginalSecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1)
|
if(OriginalSecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1)
|
||||||
{
|
{
|
||||||
Status = STATUS_UNKNOWN_REVISION;
|
_SEH2_YIELD(return STATUS_UNKNOWN_REVISION);
|
||||||
_SEH2_LEAVE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make a copy on the stack */
|
/* make a copy on the stack */
|
||||||
|
@ -452,14 +451,10 @@ SeCaptureSecurityDescriptor(IN PSECURITY_DESCRIPTOR _OriginalSecurityDescriptor,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if(!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if(!CaptureIfKernel)
|
else if(!CaptureIfKernel)
|
||||||
{
|
{
|
||||||
|
@ -547,14 +542,10 @@ sizeof(ULONG)); \
|
||||||
} \
|
} \
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) \
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) \
|
||||||
{ \
|
{ \
|
||||||
Status = _SEH2_GetExceptionCode(); \
|
_SEH2_YIELD(return _SEH2_GetExceptionCode()); \
|
||||||
} \
|
} \
|
||||||
_SEH2_END; \
|
_SEH2_END; \
|
||||||
\
|
\
|
||||||
if(!NT_SUCCESS(Status)) \
|
|
||||||
{ \
|
|
||||||
return Status; \
|
|
||||||
} \
|
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
|
@ -591,14 +582,10 @@ sizeof(ULONG)); \
|
||||||
} \
|
} \
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) \
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) \
|
||||||
{ \
|
{ \
|
||||||
Status = _SEH2_GetExceptionCode(); \
|
_SEH2_YIELD(return _SEH2_GetExceptionCode()); \
|
||||||
} \
|
} \
|
||||||
_SEH2_END; \
|
_SEH2_END; \
|
||||||
\
|
\
|
||||||
if(!NT_SUCCESS(Status)) \
|
|
||||||
{ \
|
|
||||||
return Status; \
|
|
||||||
} \
|
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
|
@ -686,22 +673,17 @@ Offset += ROUND_UP(Type##Size, sizeof(ULONG)); \
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* we failed to copy the data to the new descriptor */
|
||||||
|
ExFreePool(NewDescriptor);
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if(NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
/* we're finally done! copy the pointer to the captured descriptor to
|
/* we're finally done! copy the pointer to the captured descriptor to
|
||||||
to the caller */
|
to the caller */
|
||||||
*CapturedSecurityDescriptor = NewDescriptor;
|
*CapturedSecurityDescriptor = NewDescriptor;
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* we failed to copy the data to the new descriptor */
|
|
||||||
ExFreePool(NewDescriptor);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -232,7 +232,7 @@ SepCaptureSid(IN PSID InputSid,
|
||||||
{
|
{
|
||||||
ULONG SidSize = 0;
|
ULONG SidSize = 0;
|
||||||
PISID NewSid, Sid = (PISID)InputSid;
|
PISID NewSid, Sid = (PISID)InputSid;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -251,12 +251,11 @@ SepCaptureSid(IN PSID InputSid,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if(NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
/* allocate a SID and copy it */
|
/* allocate a SID and copy it */
|
||||||
NewSid = ExAllocatePool(PoolType,
|
NewSid = ExAllocatePool(PoolType,
|
||||||
SidSize);
|
SidSize);
|
||||||
|
@ -272,8 +271,9 @@ SepCaptureSid(IN PSID InputSid,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
|
/* Free the SID and return the exception code */
|
||||||
ExFreePool(NewSid);
|
ExFreePool(NewSid);
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
|
@ -282,7 +282,6 @@ SepCaptureSid(IN PSID InputSid,
|
||||||
Status = STATUS_INSUFFICIENT_RESOURCES;
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else if(!CaptureIfKernel)
|
else if(!CaptureIfKernel)
|
||||||
{
|
{
|
||||||
*CapturedSid = InputSid;
|
*CapturedSid = InputSid;
|
||||||
|
|
|
@ -1413,7 +1413,7 @@ NtSetInformationToken(IN HANDLE TokenHandle,
|
||||||
PTOKEN Token;
|
PTOKEN Token;
|
||||||
KPROCESSOR_MODE PreviousMode;
|
KPROCESSOR_MODE PreviousMode;
|
||||||
ULONG NeededAccess = TOKEN_ADJUST_DEFAULT;
|
ULONG NeededAccess = TOKEN_ADJUST_DEFAULT;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -1453,7 +1453,7 @@ NtSetInformationToken(IN HANDLE TokenHandle,
|
||||||
if(TokenInformationLength >= sizeof(TOKEN_OWNER))
|
if(TokenInformationLength >= sizeof(TOKEN_OWNER))
|
||||||
{
|
{
|
||||||
PTOKEN_OWNER to = (PTOKEN_OWNER)TokenInformation;
|
PTOKEN_OWNER to = (PTOKEN_OWNER)TokenInformation;
|
||||||
PSID InputSid = NULL;
|
PSID InputSid = NULL, CapturedSid;
|
||||||
|
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
@ -1461,14 +1461,10 @@ NtSetInformationToken(IN HANDLE TokenHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if(NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
PSID CapturedSid;
|
|
||||||
|
|
||||||
Status = SepCaptureSid(InputSid,
|
Status = SepCaptureSid(InputSid,
|
||||||
PreviousMode,
|
PreviousMode,
|
||||||
PagedPool,
|
PagedPool,
|
||||||
|
@ -1484,7 +1480,6 @@ NtSetInformationToken(IN HANDLE TokenHandle,
|
||||||
FALSE);
|
FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Status = STATUS_INFO_LENGTH_MISMATCH;
|
Status = STATUS_INFO_LENGTH_MISMATCH;
|
||||||
|
@ -1497,7 +1492,7 @@ NtSetInformationToken(IN HANDLE TokenHandle,
|
||||||
if(TokenInformationLength >= sizeof(TOKEN_PRIMARY_GROUP))
|
if(TokenInformationLength >= sizeof(TOKEN_PRIMARY_GROUP))
|
||||||
{
|
{
|
||||||
PTOKEN_PRIMARY_GROUP tpg = (PTOKEN_PRIMARY_GROUP)TokenInformation;
|
PTOKEN_PRIMARY_GROUP tpg = (PTOKEN_PRIMARY_GROUP)TokenInformation;
|
||||||
PSID InputSid = NULL;
|
PSID InputSid = NULL, CapturedSid;
|
||||||
|
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
@ -1505,14 +1500,10 @@ NtSetInformationToken(IN HANDLE TokenHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if(NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
PSID CapturedSid;
|
|
||||||
|
|
||||||
Status = SepCaptureSid(InputSid,
|
Status = SepCaptureSid(InputSid,
|
||||||
PreviousMode,
|
PreviousMode,
|
||||||
PagedPool,
|
PagedPool,
|
||||||
|
@ -1528,7 +1519,6 @@ NtSetInformationToken(IN HANDLE TokenHandle,
|
||||||
FALSE);
|
FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Status = STATUS_INFO_LENGTH_MISMATCH;
|
Status = STATUS_INFO_LENGTH_MISMATCH;
|
||||||
|
@ -1549,12 +1539,10 @@ NtSetInformationToken(IN HANDLE TokenHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if(NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
if(InputAcl != NULL)
|
if(InputAcl != NULL)
|
||||||
{
|
{
|
||||||
PACL CapturedAcl;
|
PACL CapturedAcl;
|
||||||
|
@ -1587,7 +1575,6 @@ NtSetInformationToken(IN HANDLE TokenHandle,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Status = STATUS_INFO_LENGTH_MISMATCH;
|
Status = STATUS_INFO_LENGTH_MISMATCH;
|
||||||
|
@ -1606,12 +1593,10 @@ NtSetInformationToken(IN HANDLE TokenHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if(NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
if(!SeSinglePrivilegeCheck(SeTcbPrivilege,
|
if(!SeSinglePrivilegeCheck(SeTcbPrivilege,
|
||||||
PreviousMode))
|
PreviousMode))
|
||||||
{
|
{
|
||||||
|
@ -1620,7 +1605,6 @@ NtSetInformationToken(IN HANDLE TokenHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
Token->SessionId = SessionId;
|
Token->SessionId = SessionId;
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1660,7 +1644,7 @@ NtDuplicateToken(IN HANDLE ExistingTokenHandle,
|
||||||
PTOKEN NewToken;
|
PTOKEN NewToken;
|
||||||
PSECURITY_QUALITY_OF_SERVICE CapturedSecurityQualityOfService;
|
PSECURITY_QUALITY_OF_SERVICE CapturedSecurityQualityOfService;
|
||||||
BOOLEAN QoSPresent;
|
BOOLEAN QoSPresent;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -1674,14 +1658,10 @@ NtDuplicateToken(IN HANDLE ExistingTokenHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if(!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = SepCaptureSecurityQualityOfService(ObjectAttributes,
|
Status = SepCaptureSecurityQualityOfService(ObjectAttributes,
|
||||||
|
@ -1964,7 +1944,7 @@ NtCreateToken(OUT PHANDLE TokenHandle,
|
||||||
KPROCESSOR_MODE PreviousMode;
|
KPROCESSOR_MODE PreviousMode;
|
||||||
ULONG nTokenPrivileges = 0;
|
ULONG nTokenPrivileges = 0;
|
||||||
LARGE_INTEGER LocalExpirationTime = {{0, 0}};
|
LARGE_INTEGER LocalExpirationTime = {{0, 0}};
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -2004,14 +1984,10 @@ NtCreateToken(OUT PHANDLE TokenHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if(!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2198,7 +2174,7 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
|
||||||
SECURITY_DESCRIPTOR SecurityDescriptor;
|
SECURITY_DESCRIPTOR SecurityDescriptor;
|
||||||
PACL Dacl = NULL;
|
PACL Dacl = NULL;
|
||||||
KPROCESSOR_MODE PreviousMode;
|
KPROCESSOR_MODE PreviousMode;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -2212,14 +2188,10 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if(!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2373,7 +2345,7 @@ NtCompareTokens(IN HANDLE FirstTokenHandle,
|
||||||
KPROCESSOR_MODE PreviousMode;
|
KPROCESSOR_MODE PreviousMode;
|
||||||
PTOKEN FirstToken, SecondToken;
|
PTOKEN FirstToken, SecondToken;
|
||||||
BOOLEAN IsEqual;
|
BOOLEAN IsEqual;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -2387,12 +2359,10 @@ NtCompareTokens(IN HANDLE FirstTokenHandle,
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(FirstTokenHandle,
|
Status = ObReferenceObjectByHandle(FirstTokenHandle,
|
||||||
|
|
Loading…
Reference in a new issue