- FreeLdr Part II (ntoskrnl is now relocated, removes 3GB compiler flag). Note that there is a bug in LD which Filip and I are examining, so do not try this yet. - Fix Registry ObRef/ObDeref bug -- Hartmut - Fix SID Capture Bug -- Thomas - Use KPRCB pointer properly (results in more portable and much faster code) Modified: branches/alex_devel_branch/reactos/boot/freeldr/freeldr/multiboot.c Modified: branches/alex_devel_branch/reactos/config Modified: branches/alex_devel_branch/reactos/include/ntos/security.h Modified: branches/alex_devel_branch/reactos/include/ntos/zwtypes.h Modified: branches/alex_devel_branch/reactos/lib/ntdll/def/ntdll.def Modified: branches/alex_devel_branch/reactos/lib/ntdll/rtl/misc.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/Makefile Modified: branches/alex_devel_branch/reactos/ntoskrnl/cm/registry.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/cm/regobj.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ex/sysinfo.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/include/internal/i386/ps.h Modified: branches/alex_devel_branch/reactos/ntoskrnl/include/internal/ke.h Modified: branches/alex_devel_branch/reactos/ntoskrnl/include/internal/ps.h Modified: branches/alex_devel_branch/reactos/ntoskrnl/io/create.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/io/device.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/io/dir.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/kd/kdebug.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/catch.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/clock.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/device.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/dpc.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/i386/fpu.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/i386/gdt.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/i386/irq.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/i386/kernel.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/ipi.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/wait.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ob/object.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ps/i386/continue.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ps/idle.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ps/kill.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ps/process.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ps/thread.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ps/w32call.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/se/sd.c Modified: branches/alex_devel_branch/reactos/w32api/include/ddk/winddk.h _____
Modified: branches/alex_devel_branch/reactos/boot/freeldr/freeldr/multiboot.c --- branches/alex_devel_branch/reactos/boot/freeldr/freeldr/multiboot.c 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/boot/freeldr/freeldr/multiboot.c 2005-03-05 20:44:57 UTC (rev 13832) @@ -164,9 +164,7 @@
/* Re-initalize EFLAGS */ Ke386EraseFlags();
- /* Get Kernel Base and Set MmSystemRangeStart */ - FrLdrGetKernelBase(); - + /* Get the PAE Mode */ FrLdrGetPaeMode();
/* Initialize the page directory */ @@ -531,6 +529,14 @@ ULONG_PTR TargetSection; ULONG SectionSize; LONG i; + PIMAGE_DATA_DIRECTORY RelocationDDir; + PIMAGE_BASE_RELOCATION RelocationDir, RelocationEnd; + ULONG Count; + ULONG_PTR Address, MaxAddress; + PUSHORT TypeOffset; + ULONG_PTR Delta; + PUSHORT ShortPtr; + PULONG LongPtr;
/* Allocate 1024 bytes for PE Header */ ImageHeader = (PIMAGE_DOS_HEADER)MmAllocateMemory(1024); @@ -552,8 +558,9 @@ /* Now read the MZ header to get the offset to the PE Header */ NtHeader = (PIMAGE_NT_HEADERS)((PCHAR)ImageHeader + ImageHeader->e_lfanew);
- /* Save the Image Base */ - KernelBase = NtHeader->OptionalHeader.ImageBase; + /* Get Kernel Base */ + KernelBase = NtHeader->OptionalHeader.ImageBase; + FrLdrGetKernelBase();
/* Save Entrypoint */ KernelEntry = RaToPa(NtHeader->OptionalHeader.AddressOfEntryPoint); @@ -603,10 +610,65 @@ Section->Misc.VirtualSize - Section->SizeOfRawData); } } + + /* Get the Relocation Data Directory */ + RelocationDDir = &NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC] ;
- /* Now relocate the file */ - /* FIXME: ADD RELOC CODE */ + /* Get the Relocation Section Start and End*/ + RelocationDir = (PIMAGE_BASE_RELOCATION)(KERNEL_BASE_PHYS + RelocationDDir->VirtualAddress); + RelocationEnd = (PIMAGE_BASE_RELOCATION)((ULONG_PTR)RelocationDir + RelocationDDir->Size); + + /* Calculate Difference between Real Base and Compiled Base*/ + Delta = KernelBase - NtHeader->OptionalHeader.ImageBase;;
+ /* Determine how far we shoudl relocate */ + MaxAddress = KERNEL_BASE_PHYS + ImageSize; + + /* Relocate until we've processed all the blocks */ + while (RelocationDir < RelocationEnd && RelocationDir->SizeOfBlock
- {
+ + /* See how many Relocation Blocks we have */ + Count = (RelocationDir->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(USHORT); + + /* Calculate the Address of this Directory */ + Address = KERNEL_BASE_PHYS + RelocationDir->VirtualAddress; + + /* Calculate the Offset of the Type */ + TypeOffset = (PUSHORT)(RelocationDir + 1); + + for (i = 0; i < Count; i++) { + + ShortPtr = (PUSHORT)(Address + (*TypeOffset & 0xFFF)); + + /* Don't relocate after the end of the loaded driver */ + if ((ULONG_PTR)ShortPtr >= MaxAddress) break; + + switch (*TypeOffset >> 12) { + + case IMAGE_REL_BASED_ABSOLUTE: + break; + + case IMAGE_REL_BASED_HIGH: + *ShortPtr += HIWORD(Delta); + break; + + case IMAGE_REL_BASED_LOW: + *ShortPtr += LOWORD(Delta); + break; + + case IMAGE_REL_BASED_HIGHLOW: + LongPtr = (PULONG)ShortPtr; + *LongPtr += Delta; + break; + } + + TypeOffset++; + } + + /* Move to the next Relocation Table */ + RelocationDir = (PIMAGE_BASE_RELOCATION)((ULONG_PTR)RelocationDir + RelocationDir->SizeOfBlock); + } + /* Increase the next Load Base */ NextModuleBase = ROUND_UP(KERNEL_BASE_PHYS + ImageSize, PAGE_SIZE);
_____
Modified: branches/alex_devel_branch/reactos/config --- branches/alex_devel_branch/reactos/config 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/config 2005-03-05 20:44:57 UTC (rev 13832) @@ -5,7 +5,6 @@
# Possible values in the future: alpha,i386,m68k,mips,powerpc ARCH := i386
- # # Which cpu should reactos optimize for # example : i486, i586, pentium, pentium2, pentium3, pentium4 @@ -14,7 +13,6 @@ # see gcc manual for more cpu names and which cpus it can # be optimized for. # - OARCH := pentium2
# @@ -43,11 +41,6 @@ ACPI := 0
# -# whether to use a 3GB User, 1GB Kernel memory map -# -3GB := 0 - -# # Which version of NDIS do we support up to? # #NDISVERSION=NDIS50 _____
Modified: branches/alex_devel_branch/reactos/include/ntos/security.h --- branches/alex_devel_branch/reactos/include/ntos/security.h 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/include/ntos/security.h 2005-03-05 20:44:57 UTC (rev 13832) @@ -160,7 +160,7 @@
#define TOKEN_WRITE (0x200e0L) #define TOKEN_EXECUTE (0x20000L)
-typedef BOOL SECURITY_CONTEXT_TRACKING_MODE; +typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
#define SECURITY_STATIC_TRACKING (0) #define SECURITY_DYNAMIC_TRACKING (1) @@ -193,13 +193,14 @@ TokenOrigin } TOKEN_INFORMATION_CLASS;
-typedef ULONG SECURITY_IMPERSONATION_LEVEL, *PSECURITY_IMPERSONATION_LEVEL; +typedef enum _SECURITY_IMPERSONATION_LEVEL +{ + SecurityAnonymous, + SecurityIdentification, + SecurityImpersonation, + SecurityDelegation +} SECURITY_IMPERSONATION_LEVEL, *PSECURITY_IMPERSONATION_LEVEL;
-#define SecurityAnonymous ((SECURITY_IMPERSONATION_LEVEL)0) -#define SecurityIdentification ((SECURITY_IMPERSONATION_LEVEL)1) -#define SecurityImpersonation ((SECURITY_IMPERSONATION_LEVEL)2) -#define SecurityDelegation ((SECURITY_IMPERSONATION_LEVEL)3) - typedef ULONG ACCESS_MASK, *PACCESS_MASK; typedef ULONG TOKEN_TYPE, *PTOKEN_TYPE;
_____
Modified: branches/alex_devel_branch/reactos/include/ntos/zwtypes.h --- branches/alex_devel_branch/reactos/include/ntos/zwtypes.h 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/include/ntos/zwtypes.h 2005-03-05 20:44:57 UTC (rev 13832) @@ -1220,9 +1220,17 @@
#define ProcessSessionInformation 24 #define ProcessForegroundInformation 25 #define ProcessWow64Information 26 -/* ReactOS private. */ #define ProcessImageFileName 27 -#define MaxProcessInfoClass 28 +#define ProcessLUIDDeviceMapsEnabled 28 +#define ProcessBreakOnTermination 29 +#define ProcessDebugObjectHandle 30 +#define ProcessDebugFlags 31 +#define ProcessHandleTracing 32 +#define ProcessUnknown33 33 +#define ProcessUnknown34 34 +#define ProcessUnknown35 35 +#define ProcessCookie 36 +#define MaxProcessInfoClass 36
/* * thread query / set information class _____
Modified: branches/alex_devel_branch/reactos/lib/ntdll/def/ntdll.def --- branches/alex_devel_branch/reactos/lib/ntdll/def/ntdll.def 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/lib/ntdll/def/ntdll.def 2005-03-05 20:44:57 UTC (rev 13832) @@ -362,6 +362,7 @@
RtlCustomCPToUnicodeN@24 RtlCutoverTimeToSystemTime@16 RtlDeNormalizeProcessParams@4 +RtlDecodePointer@4=RtlEncodePointer@4 RtlDecompressBuffer@24 RtlDecompressFragment@32 RtlDelete@4 @@ -394,6 +395,7 @@ RtlDumpResource@4 RtlDuplicateUnicodeString@12 RtlEmptyAtomTable@8 +RtlEncodePointer@4 RtlEnlargedIntegerMultiply@8 RtlEnlargedUnsignedDivide@16 RtlEnlargedUnsignedMultiply@8 _____
Modified: branches/alex_devel_branch/reactos/lib/ntdll/rtl/misc.c --- branches/alex_devel_branch/reactos/lib/ntdll/rtl/misc.c 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/lib/ntdll/rtl/misc.c 2005-03-05 20:44:57 UTC (rev 13832) @@ -15,6 +15,9 @@
#include <ddk/ntddk.h> #include <ntdll/rtl.h>
+#define NDEBUG +#include <ntdll/ntdll.h> + /********************************************************************** * NAME EXPORTED * RtlGetNtProductType @@ -107,3 +110,30 @@ PPEB pPeb = NtCurrentPeb(); return pPeb->NtGlobalFlag; } + + +/* + * @implemented + */ +PVOID +STDCALL +RtlEncodePointer(IN PVOID Pointer) +{ + ULONG Cookie; + NTSTATUS Status; + + Status = NtQueryInformationProcess(NtCurrentProcess(), + ProcessCookie, + &Cookie, + sizeof(Cookie), + NULL); + + if(!NT_SUCCESS(Status)) + { + DPRINT1("Failed to receive the process cookie! Status: 0x%x\n", Status); + return NULL; + } + + return (PVOID)((ULONG_PTR)Pointer ^ Cookie); +} + _____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/Makefile --- branches/alex_devel_branch/reactos/ntoskrnl/Makefile 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/Makefile 2005-03-05 20:44:57 UTC (rev 13832) @@ -47,12 +47,7 @@
TARGET_CFLAGS += -D_DISABLE_TIDENTS
# 3GB User Mode Memory Space support -ifeq ($(3GB), 1) -TARGET_CFLAGS += -D__3GB__ -TARGET_BASE = 0xC0000000 -else TARGET_BASE = 0x80000000 -endif
ifneq ($(DBG), 0) TARGET_CFLAGS += -DDBG _____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/cm/registry.c --- branches/alex_devel_branch/reactos/ntoskrnl/cm/registry.c 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/cm/registry.c 2005-03-05 20:44:57 UTC (rev 13832) @@ -20,7 +20,6 @@
POBJECT_TYPE CmiKeyType = NULL; PREGISTRY_HIVE CmiVolatileHive = NULL; -KSPIN_LOCK CmiKeyListLock;
LIST_ENTRY CmiHiveListHead;
@@ -361,7 +360,6 @@ CmiVolatileHive->RootSecurityCell = RootSecurityCell; #endif
- KeInitializeSpinLock(&CmiKeyListLock);
/* Create '\Registry\Machine' key. */ RtlInitUnicodeString(&KeyName, _____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/cm/regobj.c --- branches/alex_devel_branch/reactos/ntoskrnl/cm/regobj.c 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/cm/regobj.c 2005-03-05 20:44:57 UTC (rev 13832) @@ -76,6 +76,9 @@
KeyName.Length); KeyName.Buffer[KeyName.Length / sizeof(WCHAR)] = 0;
+ /* Acquire hive lock */ + KeEnterCriticalRegion(); + ExAcquireResourceExclusiveLite(&CmiRegistryLock, TRUE);
FoundObject = CmiScanKeyList(ParsedKey, &KeyName, @@ -91,6 +94,8 @@ Attributes); if (!NT_SUCCESS(Status) || (SubKeyCell == NULL)) { + ExReleaseResourceLite(&CmiRegistryLock); + KeLeaveCriticalRegion(); RtlFreeUnicodeString(&KeyName); return(STATUS_UNSUCCESSFUL); } @@ -104,6 +109,9 @@ &LinkPath); if (NT_SUCCESS(Status)) { + ExReleaseResourceLite(&CmiRegistryLock); + KeLeaveCriticalRegion(); + DPRINT("LinkPath '%wZ'\n", &LinkPath);
/* build new FullPath for reparsing */ @@ -152,6 +160,8 @@ (PVOID*)&FoundObject); if (!NT_SUCCESS(Status)) { + ExReleaseResourceLite(&CmiRegistryLock); + KeLeaveCriticalRegion(); RtlFreeUnicodeString(&KeyName); return(Status); } @@ -179,7 +189,12 @@ if (NT_SUCCESS(Status)) { DPRINT("LinkPath '%wZ'\n", &LinkPath); + + ExReleaseResourceLite(&CmiRegistryLock); + KeLeaveCriticalRegion();
+ ObDereferenceObject(FoundObject); + /* build new FullPath for reparsing */ TargetPath.MaximumLength = LinkPath.MaximumLength; if (EndPtr != NULL) @@ -213,6 +228,8 @@ } } } + ExReleaseResourceLite(&CmiRegistryLock); + KeLeaveCriticalRegion();
DPRINT("CmiObjectParse: %s\n", FoundObject->Name);
@@ -269,6 +286,10 @@
ObReferenceObject (ParentKeyObject);
+ /* Acquire hive lock */ + KeEnterCriticalRegion(); + ExAcquireResourceExclusiveLite(&CmiRegistryLock, TRUE); + if (!NT_SUCCESS(CmiRemoveKeyFromList(KeyObject))) { DPRINT1("Key not found in parent list ???\n"); @@ -297,6 +318,9 @@
ObDereferenceObject (ParentKeyObject);
+ ExReleaseResourceLite(&CmiRegistryLock); + KeLeaveCriticalRegion(); + if (KeyObject->NumberOfSubKeys) { KEBUGCHECK(REGISTRY_ERROR); @@ -527,11 +551,9 @@ CmiAddKeyToList(PKEY_OBJECT ParentKey, PKEY_OBJECT NewKey) { - KIRQL OldIrql;
DPRINT("ParentKey %.08x\n", ParentKey);
- KeAcquireSpinLock(&CmiKeyListLock, &OldIrql);
if (ParentKey->SizeOfSubKeys <= ParentKey->NumberOfSubKeys) { @@ -563,7 +585,6 @@ NULL, UserMode); NewKey->ParentKey = ParentKey; - KeReleaseSpinLock(&CmiKeyListLock, OldIrql); }
@@ -571,11 +592,9 @@ CmiRemoveKeyFromList(PKEY_OBJECT KeyToRemove) { PKEY_OBJECT ParentKey; - KIRQL OldIrql; DWORD Index;
ParentKey = KeyToRemove->ParentKey; - KeAcquireSpinLock(&CmiKeyListLock, &OldIrql); /* FIXME: If list maintained in alphabetic order, use dichotomic search */ for (Index = 0; Index < ParentKey->NumberOfSubKeys; Index++) { @@ -586,7 +605,6 @@ &ParentKey->SubKeys[Index + 1], (ParentKey->NumberOfSubKeys - Index - 1) * sizeof(PKEY_OBJECT)); ParentKey->NumberOfSubKeys--; - KeReleaseSpinLock(&CmiKeyListLock, OldIrql);
DPRINT("Dereference parent key: 0x%x\n", ParentKey); @@ -594,7 +612,6 @@ return STATUS_SUCCESS; } } - KeReleaseSpinLock(&CmiKeyListLock, OldIrql);
return STATUS_UNSUCCESSFUL; } @@ -606,13 +623,12 @@ ULONG Attributes) { PKEY_OBJECT CurKey; - KIRQL OldIrql; ULONG Index; - + NTSTATUS Status; + DPRINT("Scanning key list for: %wZ (Parent: %wZ)\n", KeyName, &Parent->Name);
- KeAcquireSpinLock(&CmiKeyListLock, &OldIrql); /* FIXME: if list maintained in alphabetic order, use dichotomic search */ for (Index=0; Index < Parent->NumberOfSubKeys; Index++) { @@ -622,8 +638,7 @@ if ((KeyName->Length == CurKey->Name.Length) && (_wcsicmp(KeyName->Buffer, CurKey->Name.Buffer) == 0)) { - KeReleaseSpinLock(&CmiKeyListLock, OldIrql); - return CurKey; + break; } } else @@ -631,13 +646,23 @@ if ((KeyName->Length == CurKey->Name.Length) && (wcscmp(KeyName->Buffer, CurKey->Name.Buffer) == 0)) { - KeReleaseSpinLock(&CmiKeyListLock, OldIrql); - return CurKey; + break; } } } - KeReleaseSpinLock(&CmiKeyListLock, OldIrql);
+ if (Index < Parent->NumberOfSubKeys) + { + Status = ObReferenceObjectByPointer(CurKey, + STANDARD_RIGHTS_REQUIRED, + NULL, + UserMode); + if (NT_SUCCESS(Status)) + { + return CurKey; + } + } + return NULL; }
_____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/ex/sysinfo.c --- branches/alex_devel_branch/reactos/ntoskrnl/ex/sysinfo.c 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/ex/sysinfo.c 2005-03-05 20:44:57 UTC (rev 13832) @@ -46,17 +46,18 @@
PULONG CpuUsage ) { - PKPCR Pcr; + PKPRCB Prcb; ULONG TotalTime; - ULONG PercentTime = 0; ULONGLONG ScaledIdle;
- Pcr = KeGetCurrentKPCR(); + Prcb = KeGetCurrentPrcb();
- ScaledIdle = Pcr->PrcbData.IdleThread->KernelTime * 100; - TotalTime = Pcr->PrcbData.KernelTime + Pcr->PrcbData.UserTime; - if (TotalTime) PercentTime = 100 - (ScaledIdle / TotalTime); - CpuUsage = &PercentTime; + ScaledIdle = Prcb->IdleThread->KernelTime * 100; + TotalTime = Prcb->KernelTime + Prcb->UserTime; + if (TotalTime != 0) + *CpuUsage = 100 - (ScaledIdle / TotalTime); + else + *CpuUsage = 0; }
/* @@ -70,20 +71,13 @@ PULONG ProcessorNumber ) { - PKPCR Pcr; - ULONG TotalTime; - ULONG ThreadTime; - ULONG ProcNumber; + PKPRCB Prcb;
- Pcr = KeGetCurrentKPCR(); + Prcb = KeGetCurrentPrcb();
- TotalTime = Pcr->PrcbData.KernelTime + Pcr->PrcbData.UserTime; - ThreadTime = Pcr->PrcbData.CurrentThread->KernelTime; - ProcNumber = Pcr->ProcessorNumber; - - ThreadKernelTime = &ThreadTime; - TotalCpuTime = &TotalTime; - ProcessorNumber = &ProcNumber; + *ThreadKernelTime = Prcb->KernelTime + Prcb->UserTime; + *TotalCpuTime = Prcb->CurrentThread->KernelTime; + *ProcessorNumber = KeGetCurrentKPCR()->ProcessorNumber; }
/* @@ -377,7 +371,7 @@ { PSYSTEM_PROCESSOR_INFORMATION Spi = (PSYSTEM_PROCESSOR_INFORMATION) Buffer; - PKPCR Pcr; + PKPRCB Prcb; *ReqSize = sizeof (SYSTEM_PROCESSOR_INFORMATION); /* * Check user buffer's size @@ -386,12 +380,12 @@ { return (STATUS_INFO_LENGTH_MISMATCH); } - Pcr = KeGetCurrentKPCR(); + Prcb = KeGetCurrentPrcb(); Spi->ProcessorArchitecture = 0; /* Intel Processor */ - Spi->ProcessorLevel = Pcr->PrcbData.CpuType; - Spi->ProcessorRevision = Pcr->PrcbData.CpuStep; + Spi->ProcessorLevel = Prcb->CpuType; + Spi->ProcessorRevision = Prcb->CpuStep; Spi->Unknown = 0; - Spi->FeatureBits = Pcr->PrcbData.FeatureBits; + Spi->FeatureBits = Prcb->FeatureBits;
DPRINT("Arch %d Level %d Rev 0x%x\n", Spi->ProcessorArchitecture, Spi->ProcessorLevel, Spi->ProcessorRevision); @@ -727,7 +721,7 @@
ULONG i; LARGE_INTEGER CurrentTime; - PKPCR Pcr; + PKPRCB Prcb;
*ReqSize = KeNumberProcessors * sizeof (SYSTEM_PROCESSORTIME_INFO); /* @@ -739,19 +733,17 @@ }
CurrentTime.QuadPart = KeQueryInterruptTime(); - Pcr = (PKPCR)KPCR_BASE; + Prcb = ((PKPCR)KPCR_BASE)->Prcb; for (i = 0; i < KeNumberProcessors; i++) { - - Spi->TotalProcessorRunTime.QuadPart = (Pcr->PrcbData.IdleThread->KernelTime + Pcr->PrcbData.IdleThread->UserTime) * 100000LL; // IdleTime - Spi->TotalProcessorTime.QuadPart = Pcr->PrcbData.KernelTime * 100000LL; // KernelTime - Spi->TotalProcessorUserTime.QuadPart = Pcr->PrcbData.UserTime * 100000LL; - Spi->TotalDPCTime.QuadPart = Pcr->PrcbData.DpcTime * 100000LL; - Spi->TotalInterruptTime.QuadPart = Pcr->PrcbData.InterruptTime * 100000LL; - Spi->TotalInterrupts = Pcr->PrcbData.InterruptCount; // Interrupt Count + Spi->TotalProcessorRunTime.QuadPart = (Prcb->IdleThread->KernelTime + Prcb->IdleThread->UserTime) * 100000LL; // IdleTime + Spi->TotalProcessorTime.QuadPart = Prcb->KernelTime * 100000LL; // KernelTime + Spi->TotalProcessorUserTime.QuadPart = Prcb->UserTime * 100000LL; + Spi->TotalDPCTime.QuadPart = Prcb->DpcTime * 100000LL; + Spi->TotalInterruptTime.QuadPart = Prcb->InterruptTime * 100000LL; + Spi->TotalInterrupts = Prcb->InterruptCount; // Interrupt Count Spi++; -// Pcr++; - Pcr = (PKPCR)((ULONG_PTR)Pcr + PAGE_SIZE); + Prcb = (PKPRCB)((ULONG_PTR)Prcb + PAGE_SIZE); }
return (STATUS_SUCCESS); _____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/include/internal/i386/ps.h --- branches/alex_devel_branch/reactos/ntoskrnl/include/internal/i386/ps.h 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/include/internal/i386/ps.h 2005-03-05 20:44:57 UTC (rev 13832) @@ -217,7 +217,7 @@
typedef struct _KPCR { KPCR_TIB Tib; /* 00 */ struct _KPCR *Self; /* 1C */ - struct _KPRCB *PCRCB; /* 20 */ + struct _KPRCB *Prcb; /* 20 */ KIRQL Irql; /* 24 */ ULONG IRR; /* 28 */ ULONG IrrActive; /* 2C */ @@ -269,9 +269,28 @@ return((PKPCR)value); }
+static inline PKPRCB KeGetCurrentPrcb(VOID) +{ + ULONG value; + +#if defined(__GNUC__) + __asm__ __volatile__ ("movl %%fs:0x20, %0\n\t" + : "=r" (value) + : /* no inputs */ + ); +#elif defined(_MSC_VER) + __asm mov eax, fs:0x20; + __asm mov value, eax; #else +#error Unknown compiler for inline assembler +#endif + return((PKPRCB)value); +}
+#else + #define KeGetCurrentKPCR(X) ((PKPCR)KPCR_BASE) +#define KeGetCurrentPrcb() (((PKPCR)KPCR_BASE)->Prcb)
#endif
_____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/include/internal/ke.h --- branches/alex_devel_branch/reactos/ntoskrnl/include/internal/ke.h 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/include/internal/ke.h 2005-03-05 20:44:57 UTC (rev 13832) @@ -41,6 +41,7 @@
struct _KTHREAD; struct _KIRQ_TRAPFRAME; struct _KPCR; +struct _KPRCB; struct _KEXCEPTION_FRAME;
#define IPI_REQUEST_FUNCTIONCALL 0 @@ -207,7 +208,7 @@ VOID KeInitExceptions(VOID); VOID KeInitInterrupts(VOID); VOID KeInitTimer(VOID); -VOID KeInitDpc(struct _KPCR* Pcr); +VOID KeInitDpc(struct _KPRCB* Prcb); VOID KeInitDispatcher(VOID); VOID inline FASTCALL KeInitializeDispatcher(VOID); VOID KiInitializeSystemClock(VOID); _____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/include/internal/ps.h --- branches/alex_devel_branch/reactos/ntoskrnl/include/internal/ps.h 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/include/internal/ps.h 2005-03-05 20:44:57 UTC (rev 13832) @@ -416,6 +416,7 @@
PRTL_BITMAP VadPhysicalPagesBitMap; ULONG VadPhysicalPages; KSPIN_LOCK AweLock; + ULONG Cookie;
/* * FIXME - ReactOS specified - remove the following fields ASAP!!! _____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/io/create.c --- branches/alex_devel_branch/reactos/ntoskrnl/io/create.c 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/io/create.c 2005-03-05 20:44:57 UTC (rev 13832) @@ -213,7 +213,7 @@
DPRINT("IoCreateStreamFileObject(FileObject %x, DeviceObject %x)\n", FileObject, DeviceObject);
- ASSERT_IRQL(PASSIVE_LEVEL); + PAGED_CODE();
Status = ObCreateObject(KernelMode, IoFileObjectType, @@ -406,6 +406,10 @@ } _SEH_HANDLE { + if(SystemEaBuffer != NULL) + { + ExFreePool(SystemEaBuffer); + } Status = _SEH_GetExceptionCode(); } _SEH_END; @@ -596,7 +600,7 @@ ExFreePool(SystemEaBuffer); }
- ASSERT_IRQL(PASSIVE_LEVEL); + PAGED_CODE();
DPRINT("Finished IoCreateFile() (*FileHandle) %x\n", (*FileHandle));
_____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/io/device.c --- branches/alex_devel_branch/reactos/ntoskrnl/io/device.c 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/io/device.c 2005-03-05 20:44:57 UTC (rev 13832) @@ -541,7 +541,7 @@
OBJECT_ATTRIBUTES ObjectAttributes; NTSTATUS Status;
- ASSERT_IRQL(PASSIVE_LEVEL); + PAGED_CODE();
if (DeviceName != NULL) { _____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/io/dir.c --- branches/alex_devel_branch/reactos/ntoskrnl/io/dir.c 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/io/dir.c 2005-03-05 20:44:57 UTC (rev 13832) @@ -38,13 +38,41 @@
PIRP Irp; PDEVICE_OBJECT DeviceObject; PFILE_OBJECT FileObject; - NTSTATUS Status; PIO_STACK_LOCATION IoStack; KPROCESSOR_MODE PreviousMode; + NTSTATUS Status = STATUS_SUCCESS;
DPRINT("NtNotifyChangeDirectoryFile()\n"); + + PAGED_CODE();
PreviousMode = ExGetPreviousMode(); + + if(PreviousMode != KernelMode) + { + _SEH_TRY + { + ProbeForWrite(IoStatusBlock, + sizeof(IO_STATUS_BLOCK), + sizeof(ULONG)); + if(BufferSize != 0) + { + ProbeForWrite(Buffer, + BufferSize, + sizeof(ULONG)); + } + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + if(!NT_SUCCESS(Status)) + { + return Status; + } + }
Status = ObReferenceObjectByHandle(FileHandle, FILE_LIST_DIRECTORY, @@ -155,14 +183,39 @@ PIRP Irp; PDEVICE_OBJECT DeviceObject; PFILE_OBJECT FileObject; - NTSTATUS Status; PIO_STACK_LOCATION IoStack; KPROCESSOR_MODE PreviousMode; + NTSTATUS Status = STATUS_SUCCESS;
DPRINT("NtQueryDirectoryFile()\n"); + + PAGED_CODE();
PreviousMode = ExGetPreviousMode(); + + if(PreviousMode != KernelMode) + { + _SEH_TRY + { + ProbeForWrite(IoStatusBlock, + sizeof(IO_STATUS_BLOCK), + sizeof(ULONG)); + ProbeForWrite(FileInformation, + Length, + sizeof(ULONG)); + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END;
+ if(!NT_SUCCESS(Status)) + { + return Status; + } + } + Status = ObReferenceObjectByHandle(FileHandle, FILE_LIST_DIRECTORY, IoFileObjectType, _____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/kd/kdebug.c --- branches/alex_devel_branch/reactos/ntoskrnl/kd/kdebug.c 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/kd/kdebug.c 2005-03-05 20:44:57 UTC (rev 13832) @@ -444,7 +444,7 @@
/* FIXME: This is needed to allow Int10 to attach to csrss until * bugchecks are done properly with Inbv, which i'll implement soon -- Alex */ - KeGetCurrentKPCR()->PrcbData.DpcRoutineActive = FALSE; + KeGetCurrentPrcb()->DpcRoutineActive = FALSE; KEBUGCHECK(MANUALLY_INITIATED_CRASH); } /* _____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/catch.c --- branches/alex_devel_branch/reactos/ntoskrnl/ke/catch.c 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/ke/catch.c 2005-03-05 20:44:57 UTC (rev 13832) @@ -54,7 +54,7 @@
DPRINT("KiDispatchException() called\n");
/* Increase number of Exception Dispatches */ - KeGetCurrentKPCR()->PrcbData.KeExceptionDispatchCount++; + KeGetCurrentPrcb()->KeExceptionDispatchCount++;
if (!Context) {
_____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/clock.c --- branches/alex_devel_branch/reactos/ntoskrnl/ke/clock.c 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/ke/clock.c 2005-03-05 20:44:57 UTC (rev 13832) @@ -242,22 +242,22 @@
IN KIRQL Irql ) { - PKPCR Pcr; + PKPRCB Prcb; PKTHREAD CurrentThread; PKPROCESS CurrentProcess; #if 0 ULONG DpcLastCount; #endif
- Pcr = KeGetCurrentKPCR(); + Prcb = KeGetCurrentPrcb();
/* Make sure we don't go further if we're in early boot phase. */ - if (Pcr == NULL || Pcr->PrcbData.CurrentThread == NULL) + if (Prcb == NULL || Prcb->CurrentThread == NULL) return;
- DPRINT("KernelTime %u, UserTime %u \n", Pcr->PrcbData.KernelTime, Pcr->PrcbData.UserTime); + DPRINT("KernelTime %u, UserTime %u \n", Prcb->KernelTime, Prcb->UserTime);
- CurrentThread = Pcr->PrcbData.CurrentThread; + CurrentThread = Prcb->CurrentThread; CurrentProcess = CurrentThread->ApcState.Process;
/* @@ -269,36 +269,36 @@ { InterlockedIncrementUL(&CurrentThread->UserTime); InterlockedIncrementUL(&CurrentProcess->UserTime); - Pcr->PrcbData.UserTime++; + Prcb->UserTime++; } else { if (Irql > DISPATCH_LEVEL) { - Pcr->PrcbData.InterruptTime++; + Prcb->InterruptTime++; } else if (Irql == DISPATCH_LEVEL) { - Pcr->PrcbData.DpcTime++; + Prcb->DpcTime++; } else { InterlockedIncrementUL(&CurrentThread->KernelTime); InterlockedIncrementUL(&CurrentProcess->KernelTime); - Pcr->PrcbData.KernelTime++; + Prcb->KernelTime++; } }
#if 0 - DpcLastCount = Pcr->PrcbData.DpcLastCount; - Pcr->PrcbData.DpcLastCount = Pcr->PrcbData.DpcCount; - Pcr->PrcbData.DpcRequestRate = ((Pcr->PrcbData.DpcCount - DpcLastCount) + - Pcr->PrcbData.DpcRequestRate) / 2; + DpcLastCount = Prcb->DpcLastCount; + Prcb->DpcLastCount = Prcb->DpcCount; + Prcb->DpcRequestRate = ((Prcb->DpcCount - DpcLastCount) + + Prcb->DpcRequestRate) / 2; #endif
- if (Pcr->PrcbData.DpcData[0].DpcQueueDepth > 0 && - Pcr->PrcbData.DpcRoutineActive == FALSE && - Pcr->PrcbData.DpcInterruptRequested == FALSE) + if (Prcb->DpcData[0].DpcQueueDepth > 0 && + Prcb->DpcRoutineActive == FALSE && + Prcb->DpcInterruptRequested == FALSE) { HalRequestSoftwareInterrupt(DISPATCH_LEVEL); } @@ -311,7 +311,7 @@ */ if ((CurrentThread->Quantum -= 3) <= 0) { - Pcr->PrcbData.QuantumEnd = TRUE; + Prcb->QuantumEnd = TRUE; HalRequestSoftwareInterrupt(DISPATCH_LEVEL); } } _____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/device.c --- branches/alex_devel_branch/reactos/ntoskrnl/ke/device.c 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/ke/device.c 2005-03-05 20:44:57 UTC (rev 13832) @@ -57,17 +57,17 @@
{ KIRQL OldIrql; PKPROCESS Process = NULL; - PKPCR Pcr = NULL; + PKPRCB Prcb = NULL; /* Raise the IRQL for the TB Flush */ OldIrql = KeRaiseIrqlToSynchLevel(); /* All CPUs need to have the TB flushed. */ if (CurrentCpuOnly == FALSE) { - Pcr = KeGetCurrentKPCR(); + Prcb = KeGetCurrentPrcb(); /* How many CPUs is our caller using? */ - Process = Pcr->PrcbData.CurrentThread->ApcState.Process; + Process = Prcb->CurrentThread->ApcState.Process; /* More then one, so send an IPI */ if (Process->ActiveProcessors > 1) { @@ -83,7 +83,7 @@ /* Did we send an IPI? If so, wait for completion */ if (Process->ActiveProcessors > 1) { do { - } while (Pcr->PrcbData.TargetSet != 0); + } while (Prcb->TargetSet != 0); } } _____
Modified: branches/alex_devel_branch/reactos/ntoskrnl/ke/dpc.c --- branches/alex_devel_branch/reactos/ntoskrnl/ke/dpc.c 2005-03-05 20:44:41 UTC (rev 13831) +++ branches/alex_devel_branch/reactos/ntoskrnl/ke/dpc.c 2005-03-05 20:44:57 UTC (rev 13832) @@ -32,14 +32,14 @@
*/ VOID INIT_FUNCTION -KeInitDpc(PKPCR Pcr) +KeInitDpc(PKPRCB Prcb) { - InitializeListHead(&Pcr->PrcbData.DpcData[0].DpcListHead); - KeInitializeEvent(Pcr->PrcbData.DpcEvent, 0, 0); - KeInitializeSpinLock(&Pcr->PrcbData.DpcData[0].DpcLock); - Pcr->PrcbData.MaximumDpcQueueDepth = 4; - Pcr->PrcbData.MinimumDpcRate = 3; - Pcr->PrcbData.DpcData[0].DpcQueueDepth = 0; + InitializeListHead(&Prcb->DpcData[0].DpcListHead); + KeInitializeEvent(Prcb->DpcEvent, 0, 0); + KeInitializeSpinLock(&Prcb->DpcData[0].DpcLock); + Prcb->MaximumDpcQueueDepth = 4; + Prcb->MinimumDpcRate = 3; + Prcb->DpcData[0].DpcQueueDepth = 0; }
/* @@ -156,7 +156,7 @@ PVOID SystemArgument2) { KIRQL OldIrql; - PKPCR Pcr; + PKPRCB Prcb;
DPRINT("KeInsertQueueDpc(DPC %x, SystemArgument1 %x, SystemArgument2 %x)\n", Dpc, SystemArgument1, SystemArgument2); [truncated at 1000 lines; 952 more skipped]