1. fixed querying tokens 2. implemented calling vectored exception handlers Modified: branches/alex_devel_branch/reactos/lib/ntdll/def/ntdll.def Modified: branches/alex_devel_branch/reactos/lib/ntdll/rtl/exception.c Modified: branches/alex_devel_branch/reactos/lib/ntdll/rtl/misc.c Modified: branches/alex_devel_branch/reactos/lib/rtl/sid.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/include/internal/ob.h Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/dpc.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/ipi.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/se/token.c Modified: branches/alex_devel_branch/reactos/w32api/include/ddk/ntifs.h _____
Modified: branches/alex_devel_branch/reactos/lib/ntdll/def/ntdll.def --- branches/alex_devel_branch/reactos/lib/ntdll/def/ntdll.def 2005-03-08 23:33:28 UTC (rev 13896) +++ branches/alex_devel_branch/reactos/lib/ntdll/def/ntdll.def 2005-03-09 00:04:13 UTC (rev 13897) @@ -363,7 +363,7 @@
RtlCustomCPToUnicodeN@24 RtlCutoverTimeToSystemTime@16 RtlDeNormalizeProcessParams@4 -RtlDecodePointer@4=RtlEncodePointer@4 +RtlDecodePointer=RtlEncodePointer@4 RtlDecompressBuffer@24 RtlDecompressFragment@32 RtlDelete@4 _____
Modified: branches/alex_devel_branch/reactos/lib/ntdll/rtl/exception.c --- branches/alex_devel_branch/reactos/lib/ntdll/rtl/exception.c 2005-03-08 23:33:28 UTC (rev 13896) +++ branches/alex_devel_branch/reactos/lib/ntdll/rtl/exception.c 2005-03-09 00:04:13 UTC (rev 13897) @@ -31,6 +31,10 @@
PVECTORED_EXCEPTION_HANDLER VectoredHandler; } RTL_VECTORED_EXCEPTION_HANDLER, *PRTL_VECTORED_EXCEPTION_HANDLER;
+/* FIXME - stupid ld won't resolve RtlDecodePointer! Since their implementation + is the same just use RtlEncodePointer for now! */ +#define RtlDecodePointer RtlEncodePointer + /* FUNCTIONS ***************************************************************/
VOID STDCALL @@ -44,20 +48,63 @@ RtlpDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT Context);
+EXCEPTION_DISPOSITION +RtlpExecuteVectoredExceptionHandlers(IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context) +{ + PLIST_ENTRY CurrentEntry; + PRTL_VECTORED_EXCEPTION_HANDLER veh; + PVECTORED_EXCEPTION_HANDLER VectoredHandler; + EXCEPTION_POINTERS ExceptionInfo; + + ExceptionInfo.ExceptionRecord = ExceptionRecord; + ExceptionInfo.ContextRecord = Context; + + if(RtlpVectoredExceptionHead.Flink != &RtlpVectoredExceptionHead) + { + RtlEnterCriticalSection(&RtlpVectoredExceptionLock); + for(CurrentEntry = RtlpVectoredExceptionHead.Flink; + CurrentEntry != &RtlpVectoredExceptionHead; + CurrentEntry = CurrentEntry->Flink) + { + veh = CONTAINING_RECORD(CurrentEntry, + RTL_VECTORED_EXCEPTION_HANDLER, + ListEntry); + VectoredHandler = RtlDecodePointer(veh->VectoredHandler); + if(VectoredHandler(&ExceptionInfo) == EXCEPTION_CONTINUE_EXECUTION) + { + RtlLeaveCriticalSection(&RtlpVectoredExceptionLock); + return ExceptionContinueSearch; + } + } + RtlLeaveCriticalSection(&RtlpVectoredExceptionLock); + } + + return ExceptionContinueExecution; +} + VOID STDCALL KiUserExceptionDispatcher(PEXCEPTION_RECORD ExceptionRecord, PCONTEXT Context) { EXCEPTION_RECORD NestedExceptionRecord; NTSTATUS Status; - - if (RtlpDispatchException(ExceptionRecord, Context) != ExceptionContinueExecution) + + if(RtlpExecuteVectoredExceptionHandlers(ExceptionRecord, + Context) != ExceptionContinueExecution) { Status = NtContinue(Context, FALSE); } else { - Status = NtRaiseException(ExceptionRecord, Context, FALSE); + if(RtlpDispatchException(ExceptionRecord, Context) != ExceptionContinueExecution) + { + Status = NtContinue(Context, FALSE); + } + else + { + Status = NtRaiseException(ExceptionRecord, Context, FALSE); + } }
NestedExceptionRecord.ExceptionCode = Status; _____
Modified: branches/alex_devel_branch/reactos/lib/ntdll/rtl/misc.c --- branches/alex_devel_branch/reactos/lib/ntdll/rtl/misc.c 2005-03-08 23:33:28 UTC (rev 13896) +++ branches/alex_devel_branch/reactos/lib/ntdll/rtl/misc.c 2005-03-09 00:04:13 UTC (rev 13897) @@ -131,7 +131,7 @@
if(!NT_SUCCESS(Status)) { DPRINT1("Failed to receive the process cookie! Status: 0x%x\n", Status); - return NULL; + return Pointer; }
return (PVOID)((ULONG_PTR)Pointer ^ Cookie); _____
Modified: branches/alex_devel_branch/reactos/lib/rtl/sid.c --- branches/alex_devel_branch/reactos/lib/rtl/sid.c 2005-03-08 23:33:28 UTC (rev 13896) +++ branches/alex_devel_branch/reactos/lib/rtl/sid.c 2005-03-09 00:04:13 UTC (rev 13897) @@ -200,7 +200,7 @@
RtlCopySid(SidLength, SidArea, Src[i].Sid); - SidArea = SidArea + SidLength; + SidArea = (PVOID)((ULONG_PTR)SidArea + SidLength); } *RemainingSidArea = SidArea; *RemainingSidAreaSize = Length; _____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/include/internal/ob.h --- branches/alex_devel_branch/reactos/ntoskrnl/include/internal/ob.h 2005-03-08 23:33:28 UTC (rev 13896) +++ branches/alex_devel_branch/reactos/ntoskrnl/include/internal/ob.h 2005-03-09 00:04:13 UTC (rev 13897) @@ -377,10 +377,8 @@
else if(ClassList[Class].RequiredSize##Mode > 0 && \ (BufferLen) != ClassList[Class].RequiredSize##Mode) \ { \ - if((!(ClassList[Class].Flags & ICIF_##Mode##_SIZE_VARIABLE) && \ - (BufferLen) != ClassList[Class].RequiredSize##Mode) || \ - ((ClassList[Class].Flags & ICIF_##Mode##_SIZE_VARIABLE) && \ - (BufferLen) < ClassList[Class].RequiredSize##Mode)) \ + if(!(ClassList[Class].Flags & ICIF_##Mode##_SIZE_VARIABLE) && \ + (BufferLen) != ClassList[Class].RequiredSize##Mode) \ { \ *(StatusVar) = STATUS_INFO_LENGTH_MISMATCH; \ } \ _____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/dpc.c --- branches/alex_devel_branch/reactos/ntoskrnl/ke/dpc.c 2005-03-08 23:33:28 UTC (rev 13896) +++ branches/alex_devel_branch/reactos/ntoskrnl/ke/dpc.c 2005-03-09 00:04:13 UTC (rev 13897) @@ -513,7 +513,7 @@
#endif Prcb->DpcRoutineActive = TRUE;
- DPRINT("&Pcr->PrcbData.DpcData[0].DpcListHead: %x\n", &Prcb->DpcData[0].DpcListHead); + DPRINT("&Prcb->DpcData[0].DpcListHead: %x\n", &Prcb->DpcData[0].DpcListHead); /* Loop while we have entries */ while (!IsListEmpty(&Prcb->DpcData[0].DpcListHead)) {
_____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/ipi.c --- branches/alex_devel_branch/reactos/ntoskrnl/ke/ipi.c 2005-03-08 23:33:28 UTC (rev 13896) +++ branches/alex_devel_branch/reactos/ntoskrnl/ke/ipi.c 2005-03-09 00:04:13 UTC (rev 13897) @@ -119,18 +119,18 @@
KiIpiSendPacket(ULONG TargetSet, VOID STDCALL (*WorkerRoutine)(PVOID), PVOID Argument, ULONG Count, BOOLEAN Synchronize) { ULONG i, Processor, CurrentProcessor; - PKPCR Pcr, CurrentPcr; + PKPRCB Prcb, CurrentPrcb; KIRQL oldIrql;
ASSERT(KeGetCurrentIrql() == SYNCH_LEVEL);
- CurrentPcr = KeGetCurrentKPCR(); - InterlockedExchangeUL(&CurrentPcr->PrcbData.TargetSet, TargetSet); - InterlockedExchangeUL(&CurrentPcr->PrcbData.WorkerRoutine, (ULONG_PTR)WorkerRoutine); - InterlockedExchangePointer(&CurrentPcr->PrcbData.CurrentPacket[0], Argument); - InterlockedExchangeUL(&CurrentPcr->PrcbData.CurrentPacket[1], Count); - InterlockedExchangeUL(&CurrentPcr->PrcbData.CurrentPacket[2], Synchronize ? 1 : 0); + CurrentPrcb = KeGetCurrentPrcb(); + InterlockedExchangeUL(&CurrentPrcb->TargetSet, TargetSet); + InterlockedExchangeUL(&CurrentPrcb->WorkerRoutine, (ULONG_PTR)WorkerRoutine); + InterlockedExchangePointer(&CurrentPrcb->CurrentPacket[0], Argument); + InterlockedExchangeUL(&CurrentPrcb->CurrentPacket[1], Count); + InterlockedExchangeUL(&CurrentPrcb->CurrentPacket[2], Synchronize ? 1 : 0);
CurrentProcessor = 1 << KeGetCurrentProcessorNumber();
@@ -138,9 +138,9 @@ { if (TargetSet & Processor) { - Pcr = (PKPCR)(KPCR_BASE + i * PAGE_SIZE); - while(0 != InterlockedCompareExchangeUL(&Pcr->PrcbData.SignalDone, (LONG)&CurrentPcr->PrcbData, 0)); - Ke386TestAndSetBit(IPI_REQUEST_FUNCTIONCALL, &Pcr->PrcbData.IpiFrozen); + Prcb = ((PKPCR)(KPCR_BASE + i * PAGE_SIZE))->Prcb; + while(0 != InterlockedCompareExchangeUL(&Prcb->SignalDone, (LONG)CurrentPrcb, 0)); + Ke386TestAndSetBit(IPI_REQUEST_FUNCTIONCALL, &Prcb->IpiFrozen); if (Processor != CurrentProcessor) { HalRequestIpi(i); _____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/se/token.c --- branches/alex_devel_branch/reactos/ntoskrnl/se/token.c 2005-03-08 23:33:28 UTC (rev 13896) +++ branches/alex_devel_branch/reactos/ntoskrnl/se/token.c 2005-03-09 00:04:13 UTC (rev 13897) @@ -643,7 +643,6 @@
if(!NT_SUCCESS(Status)) { - /* Invalid buffers */ DPRINT("NtQueryInformationToken() failed, Status: 0x%x\n", Status); return Status; } @@ -664,15 +663,15 @@
DPRINT("NtQueryInformationToken(TokenUser)\n"); RequiredLength = sizeof(TOKEN_USER) + - RtlLengthSidAndAttributes(1, Token->UserAndGroups); + RtlLengthSid(Token->UserAndGroups[0].Sid);
_SEH_TRY { if(TokenInformationLength >= RequiredLength) { Status = RtlCopySidAndAttributesArray(1, - Token->UserAndGroups, - RequiredLength, + &Token->UserAndGroups[0], + RequiredLength - sizeof(TOKEN_USER), &tu->User, (PSID)(tu + 1), &Unused.Ptr, @@ -702,21 +701,22 @@ PTOKEN_GROUPS tg = (PTOKEN_GROUPS)TokenInformation;
DPRINT("NtQueryInformationToken(TokenGroups)\n"); - RequiredLength = sizeof(TOKEN_GROUPS) + - RtlLengthSidAndAttributes(Token->UserAndGroupCount - 1, &Token->UserAndGroups[1]) + - sizeof(SID_AND_ATTRIBUTES); + RequiredLength = sizeof(tg->GroupCount) + + RtlLengthSidAndAttributes(Token->UserAndGroupCount - 1, &Token->UserAndGroups[1]);
_SEH_TRY { if(TokenInformationLength >= RequiredLength) { - PSID_AND_ATTRIBUTES Sid = (PSID_AND_ATTRIBUTES)((ULONG_PTR)TokenInformation + - RequiredLength - sizeof(SID_AND_ATTRIBUTES)); + ULONG SidLen = RequiredLength - sizeof(tg->GroupCount) - + ((Token->UserAndGroupCount - 1) * sizeof(SID_AND_ATTRIBUTES)); + PSID_AND_ATTRIBUTES Sid = (PSID_AND_ATTRIBUTES)((ULONG_PTR)TokenInformation + sizeof(tg->GroupCount) + + ((Token->UserAndGroupCount - 1) * sizeof(SID_AND_ATTRIBUTES)));
tg->GroupCount = Token->UserAndGroupCount - 1; Status = RtlCopySidAndAttributesArray(Token->UserAndGroupCount - 1,
&Token->UserAndGroups[1], - RequiredLength, + SidLen, &tg->Groups[0], (PSID)Sid, &Unused.Ptr, @@ -746,7 +746,7 @@ PTOKEN_PRIVILEGES tp = (PTOKEN_PRIVILEGES)TokenInformation;
DPRINT("NtQueryInformationToken(TokenPrivileges)\n"); - RequiredLength = sizeof(TOKEN_PRIVILEGES) + + RequiredLength = sizeof(tp->PrivilegeCount) + (Token->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES));
_SEH_TRY @@ -1096,6 +1096,7 @@ { _SEH_TRY { + /* buffer size was already verified, no need to check here again */ *(PULONG)TokenInformation = SessionId;
if(ReturnLength != NULL) @@ -1357,6 +1358,7 @@
_SEH_TRY { + /* buffer size was already verified, no need to check here again */ SessionId = *(PULONG)TokenInformation; } _SEH_HANDLE _____
Modified: branches/alex_devel_branch/reactos/w32api/include/ddk/ntifs.h --- branches/alex_devel_branch/reactos/w32api/include/ddk/ntifs.h 2005-03-08 23:33:28 UTC (rev 13896) +++ branches/alex_devel_branch/reactos/w32api/include/ddk/ntifs.h 2005-03-09 00:04:13 UTC (rev 13897) @@ -1218,13 +1218,23 @@
ULONG LastIndexValue; } GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT;
+typedef struct _HANDLE_TABLE_ENTRY_INFO { + ULONG AuditMask; +} HANDLE_TABLE_ENTRY_INFO, *PHANDLE_TABLE_ENTRY_INFO; + typedef struct _HANDLE_TABLE_ENTRY { - PVOID Object; - ULONG ObjectAttributes; - ULONG GrantedAccess; - USHORT GrantedAccessIndex; - USHORT CreatorBackTraceIndex; - ULONG NextFreeTableEntry; + union { + PVOID Object; + ULONG ObAttributes; + PHANDLE_TABLE_ENTRY_INFO InfoTable; + ULONG_PTR Value; + } u1; + union { + ULONG GrantedAccess; + USHORT GrantedAccessIndex; + LONG NextFreeTableEntry; + } u2; + USHORT CreatorBackTraceIndex; } HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;
typedef struct _MAPPING_PAIR {