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 {