From ea5929db6251e191cf0e1f9e4371054e1e93e09d Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 22 Feb 2005 17:58:19 +0000 Subject: [PATCH] 1. added irql checks to various rtl and security functions 2. RtlGetVersion needs to be implemented differently in ntoskrnl and ntdll, ntoskrnl's version must not access the PEB (which might not be present) while ntdlls gets most information from the PEB structure 3. can't use spinlocks to serialize access to the security descriptor cache since it calls sd rtl functions which require to run < apc level svn path=/trunk/; revision=13712 --- reactos/include/ddk/extypes.h | 2 +- reactos/include/ntdll/ntdll.h | 7 +++ reactos/include/ntdll/rtl.h | 6 ++ reactos/lib/ntdll/makefile | 4 ++ reactos/lib/ntdll/rtl/libsupp.c | 9 +++ reactos/lib/ntdll/rtl/process.c | 43 ++++++++++++++ reactos/lib/rtl/acl.c | 32 +++++++++- reactos/lib/rtl/luid.c | 7 +++ reactos/lib/rtl/makefile | 4 ++ reactos/lib/rtl/sd.c | 42 +++++++++++++ reactos/lib/rtl/security.c | 6 +- reactos/lib/rtl/sid.c | 29 +++++++++ reactos/lib/rtl/timezone.c | 5 ++ reactos/lib/rtl/version.c | 91 +++++++++-------------------- reactos/ntoskrnl/Makefile | 4 ++ reactos/ntoskrnl/include/ntoskrnl.h | 19 ++++++ reactos/ntoskrnl/ke/main.c | 4 ++ reactos/ntoskrnl/ob/sdcache.c | 37 ++++++------ reactos/ntoskrnl/rtl/libsupp.c | 15 ++++- reactos/ntoskrnl/rtl/misc.c | 73 +++++++++++++++++++++++ reactos/ntoskrnl/se/access.c | 6 ++ reactos/ntoskrnl/se/acl.c | 2 + reactos/ntoskrnl/se/luid.c | 6 ++ reactos/ntoskrnl/se/priv.c | 12 ++++ reactos/ntoskrnl/se/semgr.c | 18 ++++++ reactos/tools/mkconfig.c | 2 + 26 files changed, 399 insertions(+), 86 deletions(-) diff --git a/reactos/include/ddk/extypes.h b/reactos/include/ddk/extypes.h index 2636e976207..4db6f6dd11b 100644 --- a/reactos/include/ddk/extypes.h +++ b/reactos/include/ddk/extypes.h @@ -129,7 +129,7 @@ typedef union _SLIST_HEADER ULONGLONG Alignment; struct { - SINGLE_LIST_ENTRY Next; + SLIST_ENTRY Next; USHORT Depth; USHORT Sequence; }; /* now anonymous */ diff --git a/reactos/include/ntdll/ntdll.h b/reactos/include/ntdll/ntdll.h index 1cdacb5d863..5a4004f658b 100644 --- a/reactos/include/ntdll/ntdll.h +++ b/reactos/include/ntdll/ntdll.h @@ -42,3 +42,10 @@ #define MAGIC(c1,c2,c3,c4) ((c1) + ((c2)<<8) + ((c3)<<16) + ((c4)<<24)) #define MAGIC_HEAP MAGIC( 'H','E','A','P' ) + +#ifdef DBG +extern VOID FASTCALL CHECK_PAGED_CODE_RTL(char *file, int line); +#define PAGED_CODE_RTL() CHECK_PAGED_CODE_RTL(__FILE__, __LINE__) +#else +#define PAGED_CODE_RTL() +#endif diff --git a/reactos/include/ntdll/rtl.h b/reactos/include/ntdll/rtl.h index 7c8dbf4695a..cb73f5526b1 100644 --- a/reactos/include/ntdll/rtl.h +++ b/reactos/include/ntdll/rtl.h @@ -14,6 +14,12 @@ extern "C" { #endif /* __cplusplus */ +#ifdef DBG +extern VOID FASTCALL CHECK_PAGED_CODE_RTL(char *file, int line); +#define PAGED_CODE_RTL() CHECK_PAGED_CODE_RTL(__FILE__, __LINE__) +#else +#define PAGED_CODE_RTL() +#endif #ifndef __USE_W32API diff --git a/reactos/lib/ntdll/makefile b/reactos/lib/ntdll/makefile index aeba6521db0..5c294b748da 100644 --- a/reactos/lib/ntdll/makefile +++ b/reactos/lib/ntdll/makefile @@ -13,6 +13,10 @@ TARGET_CFLAGS = -g -D__NTDLL__ -Werror -Wall # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -D_DISABLE_TIDENTS +ifneq ($(DBG), 0) +TARGET_CFLAGS += -DDBG +endif + TARGET_ASFLAGS = -I $(PATH_TO_TOP)/include TARGET_LFLAGS = -Wl,--file-alignment,0x1000 \ diff --git a/reactos/lib/ntdll/rtl/libsupp.c b/reactos/lib/ntdll/rtl/libsupp.c index c8e2182514f..1f6e70a5964 100644 --- a/reactos/lib/ntdll/rtl/libsupp.c +++ b/reactos/lib/ntdll/rtl/libsupp.c @@ -55,3 +55,12 @@ ExFreePool(IN PVOID Mem) 0, Mem); } + + +#ifdef DBG +VOID FASTCALL +CHECK_PAGED_CODE_RTL(char *file, int line) +{ + /* meaningless in user mode */ +} +#endif diff --git a/reactos/lib/ntdll/rtl/process.c b/reactos/lib/ntdll/rtl/process.c index 36f2071424d..760696fc352 100644 --- a/reactos/lib/ntdll/rtl/process.c +++ b/reactos/lib/ntdll/rtl/process.c @@ -324,4 +324,47 @@ RtlCreateUserProcess(PUNICODE_STRING ImageFileName, return(STATUS_SUCCESS); } + +/* +* @implemented +*/ +NTSTATUS STDCALL +RtlGetVersion(RTL_OSVERSIONINFOW *Info) +{ + if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) || + Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) + { + PPEB Peb = NtCurrentPeb(); + + Info->dwMajorVersion = Peb->OSMajorVersion; + Info->dwMinorVersion = Peb->OSMinorVersion; + Info->dwBuildNumber = Peb->OSBuildNumber; + Info->dwPlatformId = Peb->OSPlatformId; + if(((Peb->OSCSDVersion >> 8) & 0xFF) != 0) + { + int i = _snwprintf(Info->szCSDVersion, + (sizeof(Info->szCSDVersion) / sizeof(Info->szCSDVersion[0])) - 1, + L"Service Pack %d", + ((Peb->OSCSDVersion >> 8) & 0xFF)); + Info->szCSDVersion[i] = L'\0'; + } + else + { + RtlZeroMemory(Info->szCSDVersion, sizeof(Info->szCSDVersion)); + } + if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) + { + RTL_OSVERSIONINFOEXW *InfoEx = (RTL_OSVERSIONINFOEXW *)Info; + InfoEx->wServicePackMajor = (Peb->OSCSDVersion >> 8) & 0xFF; + InfoEx->wServicePackMinor = Peb->OSCSDVersion & 0xFF; + InfoEx->wSuiteMask = SharedUserData->SuiteMask; + InfoEx->wProductType = SharedUserData->NtProductType; + } + + return STATUS_SUCCESS; + } + + return STATUS_INVALID_PARAMETER; +} + /* EOF */ diff --git a/reactos/lib/rtl/acl.c b/reactos/lib/rtl/acl.c index 33bbc87f693..75b0e631a0a 100644 --- a/reactos/lib/rtl/acl.c +++ b/reactos/lib/rtl/acl.c @@ -12,7 +12,7 @@ /* INCLUDES *****************************************************************/ #include -#include +#include #define NDEBUG #include @@ -26,6 +26,8 @@ RtlFirstFreeAce(PACL Acl, PACE Current; PVOID AclEnd; ULONG i; + + PAGED_CODE_RTL(); Current = (PACE)(Acl + 1); *Ace = NULL; @@ -70,6 +72,8 @@ RtlGetAce(PACL Acl, PACE *Ace) { ULONG i; + + PAGED_CODE_RTL(); *Ace = (PACE)(Acl + 1); @@ -111,6 +115,8 @@ RtlpAddKnownAce (PACL Acl, ULONG Type) { PACE Ace; + + PAGED_CODE_RTL(); if (!RtlValidSid(Sid)) { @@ -158,6 +164,8 @@ RtlAddAccessAllowedAce (IN OUT PACL Acl, IN ACCESS_MASK AccessMask, IN PSID Sid) { + PAGED_CODE_RTL(); + return RtlpAddKnownAce (Acl, Revision, 0, @@ -177,6 +185,8 @@ RtlAddAccessAllowedAceEx (IN OUT PACL Acl, IN ACCESS_MASK AccessMask, IN PSID Sid) { + PAGED_CODE_RTL(); + return RtlpAddKnownAce (Acl, Revision, Flags, @@ -195,6 +205,8 @@ RtlAddAccessDeniedAce (PACL Acl, ACCESS_MASK AccessMask, PSID Sid) { + PAGED_CODE_RTL(); + return RtlpAddKnownAce (Acl, Revision, 0, @@ -214,6 +226,8 @@ RtlAddAccessDeniedAceEx (IN OUT PACL Acl, IN ACCESS_MASK AccessMask, IN PSID Sid) { + PAGED_CODE_RTL(); + return RtlpAddKnownAce (Acl, Revision, Flags, @@ -259,6 +273,8 @@ RtlAddAce(PACL Acl, ULONG i; PACE Current; ULONG j; + + PAGED_CODE_RTL(); if (Acl->AclRevision < MIN_ACL_REVISION || Acl->AclRevision > MAX_ACL_REVISION) @@ -339,6 +355,8 @@ RtlAddAuditAccessAce(PACL Acl, { PACE Ace; ULONG Flags = 0; + + PAGED_CODE_RTL(); if (Success != FALSE) { @@ -408,6 +426,8 @@ RtlAddAuditAccessAceEx(PACL Acl, BOOLEAN Failure) { PACE Ace; + + PAGED_CODE_RTL(); if (Success != FALSE) { @@ -494,6 +514,8 @@ RtlDeleteAce(PACL Acl, { PACE Ace; PACE Current; + + PAGED_CODE_RTL(); if (Acl->AclRevision < MIN_ACL_REVISION || Acl->AclRevision > MAX_ACL_REVISION) @@ -535,6 +557,8 @@ RtlCreateAcl(PACL Acl, ULONG AclSize, ULONG AclRevision) { + PAGED_CODE_RTL(); + if (AclSize < 8) { return(STATUS_BUFFER_TOO_SMALL); @@ -572,6 +596,8 @@ RtlQueryInformationAcl(PACL Acl, ACL_INFORMATION_CLASS InformationClass) { PACE Ace; + + PAGED_CODE_RTL(); if (Acl->AclRevision < MIN_ACL_REVISION || Acl->AclRevision > MAX_ACL_REVISION) @@ -638,6 +664,8 @@ RtlSetInformationAcl(PACL Acl, ULONG InformationLength, ACL_INFORMATION_CLASS InformationClass) { + PAGED_CODE_RTL(); + if (Acl->AclRevision < MIN_ACL_REVISION || Acl->AclRevision > MAX_ACL_REVISION) { @@ -680,6 +708,8 @@ RtlValidAcl (PACL Acl) { PACE Ace; USHORT Size; + + PAGED_CODE_RTL(); Size = ROUND_UP(Acl->AclSize, 4); diff --git a/reactos/lib/rtl/luid.c b/reactos/lib/rtl/luid.c index dbd0550bc41..77b75db9a02 100644 --- a/reactos/lib/rtl/luid.c +++ b/reactos/lib/rtl/luid.c @@ -12,6 +12,7 @@ /* INCLUDES *****************************************************************/ #include +#include #define NDEBUG #include @@ -22,6 +23,8 @@ VOID STDCALL RtlCopyLuid(PLUID LuidDest, PLUID LuidSrc) { + PAGED_CODE_RTL(); + LuidDest->LowPart = LuidSrc->LowPart; LuidDest->HighPart = LuidSrc->HighPart; } @@ -36,6 +39,8 @@ RtlCopyLuidAndAttributesArray(ULONG Count, PLUID_AND_ATTRIBUTES Dest) { ULONG i; + + PAGED_CODE_RTL(); for (i = 0; i < Count; i++) { @@ -53,6 +58,8 @@ BOOLEAN STDCALL RtlEqualLuid(PLUID Luid1, PLUID Luid2) { + PAGED_CODE_RTL(); + return (Luid1->LowPart == Luid2->LowPart && Luid1->HighPart == Luid2->HighPart); } diff --git a/reactos/lib/rtl/makefile b/reactos/lib/rtl/makefile index 18e0fb88dc3..013dfb8dea1 100644 --- a/reactos/lib/rtl/makefile +++ b/reactos/lib/rtl/makefile @@ -12,6 +12,10 @@ TARGET_CFLAGS = -Wall -Werror -ffreestanding # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -D_DISABLE_TIDENTS +ifneq ($(DBG), 0) +TARGET_CFLAGS += -DDBG +endif + TARGET_OBJECTS = \ acl.o \ bit.o \ diff --git a/reactos/lib/rtl/sd.c b/reactos/lib/rtl/sd.c index f8c60102d01..3ec3abbb62e 100644 --- a/reactos/lib/rtl/sd.c +++ b/reactos/lib/rtl/sd.c @@ -113,6 +113,8 @@ NTSTATUS STDCALL RtlCreateSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, ULONG Revision) { + PAGED_CODE_RTL(); + if (Revision != SECURITY_DESCRIPTOR_REVISION1) { return STATUS_UNKNOWN_REVISION; @@ -134,6 +136,8 @@ NTSTATUS STDCALL RtlCreateSecurityDescriptorRelative (PSECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor, ULONG Revision) { + PAGED_CODE_RTL(); + if (Revision != SECURITY_DESCRIPTOR_REVISION1) { return STATUS_UNKNOWN_REVISION; @@ -161,6 +165,8 @@ RtlLengthSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor) PACL Sacl, Dacl; ULONG Length = sizeof(SECURITY_DESCRIPTOR); + PAGED_CODE_RTL(); + RtlpQuerySecurityDescriptorPointers(SecurityDescriptor, &Owner, &Group, @@ -200,6 +206,8 @@ RtlGetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, PACL* Dacl, PBOOLEAN DaclDefaulted) { + PAGED_CODE_RTL(); + if (SecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) { return STATUS_UNKNOWN_REVISION; @@ -233,6 +241,8 @@ RtlSetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, PACL Dacl, BOOLEAN DaclDefaulted) { + PAGED_CODE_RTL(); + if (SecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) { return STATUS_UNKNOWN_REVISION; @@ -270,6 +280,8 @@ RtlValidSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor) { PSID Owner, Group; PACL Sacl, Dacl; + + PAGED_CODE_RTL(); if (SecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) { @@ -302,6 +314,8 @@ RtlSetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, PSID Owner, BOOLEAN OwnerDefaulted) { + PAGED_CODE_RTL(); + if (SecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) { return STATUS_UNKNOWN_REVISION; @@ -332,6 +346,8 @@ RtlGetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, PSID* Owner, PBOOLEAN OwnerDefaulted) { + PAGED_CODE_RTL(); + if (SecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) { return STATUS_UNKNOWN_REVISION; @@ -357,6 +373,8 @@ RtlSetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, PSID Group, BOOLEAN GroupDefaulted) { + PAGED_CODE_RTL(); + if (SecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) { return STATUS_UNKNOWN_REVISION; @@ -386,6 +404,8 @@ RtlGetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, PSID* Group, PBOOLEAN GroupDefaulted) { + PAGED_CODE_RTL(); + if (SecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) { return STATUS_UNKNOWN_REVISION; @@ -421,6 +441,8 @@ RtlMakeSelfRelativeSD(PSECURITY_DESCRIPTOR AbsSD, ULONG DaclLength; ULONG TotalLength; ULONG_PTR Current; + + PAGED_CODE_RTL(); RtlpQuerySecurityDescriptor(AbsSD, &Owner, @@ -494,6 +516,8 @@ RtlAbsoluteToSelfRelativeSD(PSECURITY_DESCRIPTOR AbsSD, PSECURITY_DESCRIPTOR_RELATIVE RelSD, PULONG BufferLength) { + PAGED_CODE_RTL(); + if (AbsSD->Control & SE_SELF_RELATIVE) { return STATUS_BAD_DESCRIPTOR_FORMAT; @@ -511,6 +535,8 @@ RtlGetControlSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, PSECURITY_DESCRIPTOR_CONTROL Control, PULONG Revision) { + PAGED_CODE_RTL(); + *Revision = SecurityDescriptor->Revision; if (SecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) @@ -532,6 +558,8 @@ RtlSetControlSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest, IN SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet) { + PAGED_CODE_RTL(); + if (SecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) { return STATUS_UNKNOWN_REVISION; @@ -556,6 +584,8 @@ RtlGetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, PACL *Sacl, PBOOLEAN SaclDefaulted) { + PAGED_CODE_RTL(); + if (SecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) { return STATUS_UNKNOWN_REVISION; @@ -589,6 +619,8 @@ RtlSetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, PACL Sacl, BOOLEAN SaclDefaulted) { + PAGED_CODE_RTL(); + if (SecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) { return STATUS_UNKNOWN_REVISION; @@ -642,6 +674,8 @@ RtlSelfRelativeToAbsoluteSD(PSECURITY_DESCRIPTOR_RELATIVE RelSD, PSID pGroup; PACL pDacl; PACL pSacl; + + PAGED_CODE_RTL(); if (RelSD->Revision != SECURITY_DESCRIPTOR_REVISION1) { @@ -713,6 +747,8 @@ RtlValidRelativeSecurityDescriptor(IN PSECURITY_DESCRIPTOR_RELATIVE SecurityDesc IN ULONG SecurityDescriptorLength, IN SECURITY_INFORMATION RequiredInformation) { + PAGED_CODE_RTL(); + if (SecurityDescriptorLength < sizeof(SECURITY_DESCRIPTOR_RELATIVE) || SecurityDescriptorInput->Revision != SECURITY_DESCRIPTOR_REVISION1 || !(SecurityDescriptorInput->Control & SE_SELF_RELATIVE)) @@ -783,6 +819,8 @@ BOOLEAN STDCALL RtlGetSecurityDescriptorRMControl(PSECURITY_DESCRIPTOR SecurityDescriptor, PUCHAR RMControl) { + PAGED_CODE_RTL(); + if (!(SecurityDescriptor->Control & SE_RM_CONTROL_VALID)) { *RMControl = 0; @@ -802,6 +840,8 @@ VOID STDCALL RtlSetSecurityDescriptorRMControl(PSECURITY_DESCRIPTOR SecurityDescriptor, PUCHAR RMControl) { + PAGED_CODE_RTL(); + if (RMControl == NULL) { SecurityDescriptor->Control &= ~SE_RM_CONTROL_VALID; @@ -823,6 +863,8 @@ RtlSetAttributesSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN SECURITY_DESCRIPTOR_CONTROL Control, OUT PULONG Revision) { + PAGED_CODE_RTL(); + *Revision = SecurityDescriptor->Revision; if (SecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) diff --git a/reactos/lib/rtl/security.c b/reactos/lib/rtl/security.c index 0687e31790a..c0183c2b1d1 100644 --- a/reactos/lib/rtl/security.c +++ b/reactos/lib/rtl/security.c @@ -28,7 +28,9 @@ RtlImpersonateSelf(IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel) HANDLE ImpersonationToken; NTSTATUS Status; OBJECT_ATTRIBUTES ObjAttr; - SECURITY_QUALITY_OF_SERVICE Sqos; + SECURITY_QUALITY_OF_SERVICE Sqos; + + PAGED_CODE_RTL(); Status = NtOpenProcessToken(NtCurrentProcess(), TOKEN_DUPLICATE, @@ -97,6 +99,8 @@ RtlAdjustPrivilege(IN ULONG Privilege, ULONG ReturnLength; HANDLE TokenHandle; NTSTATUS Status; + + PAGED_CODE_RTL(); DPRINT ("RtlAdjustPrivilege() called\n"); diff --git a/reactos/lib/rtl/sid.c b/reactos/lib/rtl/sid.c index 18e99ed6033..4c87664a8c2 100644 --- a/reactos/lib/rtl/sid.c +++ b/reactos/lib/rtl/sid.c @@ -13,6 +13,7 @@ #define __NTDRIVER__ #include +#include #include @@ -26,6 +27,8 @@ RtlValidSid(IN PSID Sid_) { PISID Sid = Sid_; + PAGED_CODE_RTL(); + if ((Sid->Revision != SID_REVISION) || (Sid->SubAuthorityCount > SID_MAX_SUB_AUTHORITIES)) { @@ -42,6 +45,8 @@ RtlValidSid(IN PSID Sid_) ULONG STDCALL RtlLengthRequiredSid(IN UCHAR SubAuthorityCount) { + PAGED_CODE_RTL(); + return (sizeof(SID) + (SubAuthorityCount - 1) * sizeof(ULONG)); } @@ -56,6 +61,8 @@ RtlInitializeSid(IN PSID Sid_, { PISID Sid = Sid_; + PAGED_CODE_RTL(); + Sid->Revision = SID_REVISION; Sid->SubAuthorityCount = SubAuthorityCount; memcpy(&Sid->IdentifierAuthority, @@ -75,6 +82,8 @@ RtlSubAuthoritySid(IN PSID Sid_, { PISID Sid = Sid_; + PAGED_CODE_RTL(); + return &Sid->SubAuthority[SubAuthority]; } @@ -87,6 +96,8 @@ RtlSubAuthorityCountSid(IN PSID Sid_) { PISID Sid = Sid_; + PAGED_CODE_RTL(); + return &Sid->SubAuthorityCount; } @@ -100,6 +111,8 @@ RtlEqualSid(IN PSID Sid1_, { PISID Sid1 = Sid1_; PISID Sid2 = Sid2_; + + PAGED_CODE_RTL(); if (Sid1->Revision != Sid2->Revision) { @@ -125,6 +138,8 @@ RtlLengthSid(IN PSID Sid_) { PISID Sid = Sid_; + PAGED_CODE_RTL(); + return (sizeof(SID) + (Sid->SubAuthorityCount-1) * sizeof(ULONG)); } @@ -137,6 +152,8 @@ RtlCopySid(ULONG BufferLength, PSID Dest, PSID Src) { + PAGED_CODE_RTL(); + if (BufferLength < RtlLengthSid(Src)) { return STATUS_UNSUCCESSFUL; @@ -165,6 +182,8 @@ RtlCopySidAndAttributesArray(ULONG Count, ULONG SidLength; ULONG Length; ULONG i; + + PAGED_CODE_RTL(); Length = SidAreaSize; @@ -197,6 +216,8 @@ RtlIdentifierAuthoritySid(IN PSID Sid_) { PISID Sid = Sid_; + PAGED_CODE_RTL(); + return &Sid->IdentifierAuthority; } @@ -218,6 +239,8 @@ RtlAllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, PSID *Sid) { PISID pSid; + + PAGED_CODE_RTL(); if (SubAuthorityCount > 8) return STATUS_INVALID_SID; @@ -273,6 +296,8 @@ RtlAllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, PVOID STDCALL RtlFreeSid(IN PSID Sid) { + PAGED_CODE_RTL(); + ExFreePool(Sid); return NULL; } @@ -287,6 +312,8 @@ RtlEqualPrefixSid(IN PSID Sid1_, { PISID Sid1 = Sid1_; PISID Sid2 = Sid2_; + + PAGED_CODE_RTL(); return(Sid1->SubAuthorityCount == Sid2->SubAuthorityCount && !RtlCompareMemory(Sid1, Sid2, @@ -307,6 +334,8 @@ RtlConvertSidToUnicodeString(PUNICODE_STRING String, ULONG Length; ULONG i; PISID Sid = Sid_; + + PAGED_CODE_RTL(); if (RtlValidSid (Sid) == FALSE) return STATUS_INVALID_SID; diff --git a/reactos/lib/rtl/timezone.c b/reactos/lib/rtl/timezone.c index 7acf56c1031..fc7fe0c3a2f 100644 --- a/reactos/lib/rtl/timezone.c +++ b/reactos/lib/rtl/timezone.c @@ -14,6 +14,7 @@ #include #include #include +#include #define NDEBUG #include @@ -33,6 +34,8 @@ RtlQueryTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation) NTSTATUS Status; DPRINT("RtlQueryTimeZoneInformation()\n"); + + PAGED_CODE_RTL(); RtlZeroMemory(QueryTable, sizeof(QueryTable)); @@ -93,6 +96,8 @@ RtlSetTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation) NTSTATUS Status; DPRINT("RtlSetTimeZoneInformation()\n"); + + PAGED_CODE_RTL(); Status = RtlWriteRegistryValue(RTL_REGISTRY_CONTROL, L"TimeZoneInformation", diff --git a/reactos/lib/rtl/version.c b/reactos/lib/rtl/version.c index 6a13c5e5241..5d954b45de2 100644 --- a/reactos/lib/rtl/version.c +++ b/reactos/lib/rtl/version.c @@ -39,37 +39,6 @@ /* FUNCTIONS ****************************************************************/ -/* -* @implemented -*/ -NTSTATUS STDCALL -RtlGetVersion(RTL_OSVERSIONINFOW *Info) -{ - WCHAR CSDString[] = L"Service Pack 6"; - - if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) || - Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) - { - Info->dwMajorVersion = 4; - Info->dwMinorVersion = 0; - Info->dwBuildNumber = 1381; - Info->dwPlatformId = VER_PLATFORM_WIN32_NT; - RtlCopyMemory(Info->szCSDVersion, CSDString, sizeof(CSDString)); - if (Info->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) - { - RTL_OSVERSIONINFOEXW *InfoEx = (RTL_OSVERSIONINFOEXW *)Info; - InfoEx->wServicePackMajor = 6; - InfoEx->wServicePackMinor = 0; - InfoEx->wSuiteMask = 0; - InfoEx->wProductType = VER_NT_WORKSTATION; - } - - return STATUS_SUCCESS; - } - - return STATUS_INVALID_PARAMETER; -} - /* * @unimplemented */ @@ -114,39 +83,37 @@ RtlVerifyVersionInfo( /* * @implemented */ -ULONGLONG NTAPI VerSetConditionMask -( - IN ULONGLONG dwlConditionMask, - IN DWORD dwTypeBitMask, - IN BYTE dwConditionMask -) +ULONGLONG NTAPI +VerSetConditionMask(IN ULONGLONG dwlConditionMask, + IN DWORD dwTypeBitMask, + IN BYTE dwConditionMask) { - if(dwTypeBitMask == 0) + if(dwTypeBitMask == 0) + return dwlConditionMask; + + dwConditionMask &= VER_CONDITION_MASK; + + if(dwConditionMask == 0) + return dwlConditionMask; + + if(dwTypeBitMask & VER_PRODUCT_TYPE) + dwlConditionMask |= dwConditionMask << 7 * VER_NUM_BITS_PER_CONDITION_MASK; + else if(dwTypeBitMask & VER_SUITENAME) + dwlConditionMask |= dwConditionMask << 6 * VER_NUM_BITS_PER_CONDITION_MASK; + else if(dwTypeBitMask & VER_SERVICEPACKMAJOR) + dwlConditionMask |= dwConditionMask << 5 * VER_NUM_BITS_PER_CONDITION_MASK; + else if(dwTypeBitMask & VER_SERVICEPACKMINOR) + dwlConditionMask |= dwConditionMask << 4 * VER_NUM_BITS_PER_CONDITION_MASK; + else if(dwTypeBitMask & VER_PLATFORMID) + dwlConditionMask |= dwConditionMask << 3 * VER_NUM_BITS_PER_CONDITION_MASK; + else if(dwTypeBitMask & VER_BUILDNUMBER) + dwlConditionMask |= dwConditionMask << 2 * VER_NUM_BITS_PER_CONDITION_MASK; + else if(dwTypeBitMask & VER_MAJORVERSION) + dwlConditionMask |= dwConditionMask << 1 * VER_NUM_BITS_PER_CONDITION_MASK; + else if(dwTypeBitMask & VER_MINORVERSION) + dwlConditionMask |= dwConditionMask << 0 * VER_NUM_BITS_PER_CONDITION_MASK; + return dwlConditionMask; - - dwConditionMask &= VER_CONDITION_MASK; - - if(dwConditionMask == 0) - return dwlConditionMask; - - if(dwTypeBitMask & VER_PRODUCT_TYPE) - dwlConditionMask |= dwConditionMask << 7 * VER_NUM_BITS_PER_CONDITION_MASK; - else if(dwTypeBitMask & VER_SUITENAME) - dwlConditionMask |= dwConditionMask << 6 * VER_NUM_BITS_PER_CONDITION_MASK; - else if(dwTypeBitMask & VER_SERVICEPACKMAJOR) - dwlConditionMask |= dwConditionMask << 5 * VER_NUM_BITS_PER_CONDITION_MASK; - else if(dwTypeBitMask & VER_SERVICEPACKMINOR) - dwlConditionMask |= dwConditionMask << 4 * VER_NUM_BITS_PER_CONDITION_MASK; - else if(dwTypeBitMask & VER_PLATFORMID) - dwlConditionMask |= dwConditionMask << 3 * VER_NUM_BITS_PER_CONDITION_MASK; - else if(dwTypeBitMask & VER_BUILDNUMBER) - dwlConditionMask |= dwConditionMask << 2 * VER_NUM_BITS_PER_CONDITION_MASK; - else if(dwTypeBitMask & VER_MAJORVERSION) - dwlConditionMask |= dwConditionMask << 1 * VER_NUM_BITS_PER_CONDITION_MASK; - else if(dwTypeBitMask & VER_MINORVERSION) - dwlConditionMask |= dwConditionMask << 0 * VER_NUM_BITS_PER_CONDITION_MASK; - - return dwlConditionMask; } /* EOF */ diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 6ae59eb607d..9dc41bf8ef9 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -54,6 +54,10 @@ else TARGET_BASE = 0x80000000 endif +ifneq ($(DBG), 0) +TARGET_CFLAGS += -DDBG +endif + # enable thread event pair features (NT4 only!) # TARGET_CFLAGS += -D_ENABLE_THRDEVTPAIR diff --git a/reactos/ntoskrnl/include/ntoskrnl.h b/reactos/ntoskrnl/include/ntoskrnl.h index 9f86d423f2e..c4b8a1ab400 100755 --- a/reactos/ntoskrnl/include/ntoskrnl.h +++ b/reactos/ntoskrnl/include/ntoskrnl.h @@ -65,4 +65,23 @@ #include +#ifdef DBG +#ifndef PAGED_CODE +#define PAGED_CODE() \ + do { \ + if(KeGetCurrentIrql() > APC_LEVEL) { \ + DbgPrint("%s:%i: Pagable code called at IRQL > APC_LEVEL (%d)\n", \ + __FILE__, __LINE__, KeGetCurrentIrql()); \ + KEBUGCHECK(0); \ + } \ + } while(0) +#endif +#define PAGED_CODE_RTL PAGED_CODE +#else +#ifndef PAGED_CODE +#define PAGED_CODE() +#endif +#define PAGED_CODE_RTL() +#endif + #endif /* INCLUDE_NTOSKRNL_H */ diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index c0ccca43c76..eef694b0bc7 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.c @@ -31,6 +31,10 @@ /* GLOBALS *******************************************************************/ +#define BUILD_OSCSDVERSION(major, minor) (((major & 0xFF) << 8) | (minor & 0xFF)) +ULONG NtMajorVersion = 4; +ULONG NtMinorVersion = 0; +ULONG NtOSCSDVersion = BUILD_OSCSDVERSION(6, 0); #ifdef __GNUC__ ULONG EXPORTED NtBuildNumber = KERNEL_VERSION_BUILD; ULONG EXPORTED NtGlobalFlag = 0; diff --git a/reactos/ntoskrnl/ob/sdcache.c b/reactos/ntoskrnl/ob/sdcache.c index f06b3f9d1dc..9cfc5a4c843 100644 --- a/reactos/ntoskrnl/ob/sdcache.c +++ b/reactos/ntoskrnl/ob/sdcache.c @@ -28,13 +28,11 @@ typedef struct _SD_CACHE_ENTRY /* GLOBALS ******************************************************************/ -PLIST_ENTRY ObpSdCache; -KSPIN_LOCK ObpSdCacheSpinLock; -KIRQL ObpSdCacheIrql; - - #define SD_CACHE_ENTRIES 0x100 +LIST_ENTRY ObpSdCache[SD_CACHE_ENTRIES]; +FAST_MUTEX ObpSdCacheMutex; + /* FUNCTIONS ****************************************************************/ NTSTATUS @@ -42,37 +40,36 @@ ObpInitSdCache(VOID) { ULONG i; - ObpSdCache = ExAllocatePool(NonPagedPool, - SD_CACHE_ENTRIES * sizeof(LIST_ENTRY)); - if (ObpSdCache == NULL) - { - return STATUS_INSUFFICIENT_RESOURCES; - } - - for (i = 0; i < SD_CACHE_ENTRIES; i++) + for (i = 0; i < (sizeof(ObpSdCache) / sizeof(ObpSdCache[0])); i++) { InitializeListHead(&ObpSdCache[i]); } - KeInitializeSpinLock(&ObpSdCacheSpinLock); + ExInitializeFastMutex(&ObpSdCacheMutex); return STATUS_SUCCESS; } -static VOID +static inline VOID ObpSdCacheLock(VOID) { - KeAcquireSpinLock(&ObpSdCacheSpinLock, - &ObpSdCacheIrql); + /* can't acquire a fast mutex in the early boot process... */ + if(KeGetCurrentThread() != NULL) + { + ExAcquireFastMutex(&ObpSdCacheMutex); + } } -static VOID +static inline VOID ObpSdCacheUnlock(VOID) { - KeReleaseSpinLock(&ObpSdCacheSpinLock, - ObpSdCacheIrql); + /* can't acquire a fast mutex in the early boot process... */ + if(KeGetCurrentThread() != NULL) + { + ExReleaseFastMutex(&ObpSdCacheMutex); + } } diff --git a/reactos/ntoskrnl/rtl/libsupp.c b/reactos/ntoskrnl/rtl/libsupp.c index b5f345102a4..bfc592a491b 100644 --- a/reactos/ntoskrnl/rtl/libsupp.c +++ b/reactos/ntoskrnl/rtl/libsupp.c @@ -1,4 +1,4 @@ -/* $Id:$ +/* $Id$ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -109,4 +109,17 @@ RtlInitializeCriticalSectionAndSpinCount( return STATUS_SUCCESS; } + +#ifdef DBG +VOID FASTCALL +CHECK_PAGED_CODE_RTL(char *file, int line) +{ + if(KeGetCurrentIrql() > APC_LEVEL) + { + DbgPrint("%s:%i: Pagable code called at IRQL > APC_LEVEL (%d)\n", file, line, KeGetCurrentIrql()); + KEBUGCHECK(0); + } +} +#endif + /* EOF */ diff --git a/reactos/ntoskrnl/rtl/misc.c b/reactos/ntoskrnl/rtl/misc.c index 7bb05ac2a95..62f43189142 100644 --- a/reactos/ntoskrnl/rtl/misc.c +++ b/reactos/ntoskrnl/rtl/misc.c @@ -17,6 +17,37 @@ /* GLOBALS *******************************************************************/ extern ULONG NtGlobalFlag; +extern ULONG NtMajorVersion; +extern ULONG NtMinorVersion; +extern ULONG NtOSCSDVersion; + +/* header hell made me do this...sorry */ +typedef struct _OSVERSIONINFOW { + DWORD dwOSVersionInfoSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformId; + WCHAR szCSDVersion[ 128 ]; +} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW; + +typedef struct _OSVERSIONINFOEXW { + DWORD dwOSVersionInfoSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformId; + WCHAR szCSDVersion[ 128 ]; + WORD wServicePackMajor; + WORD wServicePackMinor; + WORD wSuiteMask; + BYTE wProductType; + BYTE wReserved; +} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW; + +#ifndef VER_PLATFORM_WIN32_NT +#define VER_PLATFORM_WIN32_NT (2) +#endif /* FUNCTIONS *****************************************************************/ @@ -29,3 +60,45 @@ RtlGetNtGlobalFlags(VOID) { return(NtGlobalFlag); } + + +/* +* @implemented +*/ +NTSTATUS STDCALL +RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation) +{ + if (lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOW) || + lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW)) + { + lpVersionInformation->dwMajorVersion = NtMajorVersion; + lpVersionInformation->dwMinorVersion = NtMinorVersion; + lpVersionInformation->dwBuildNumber = NtBuildNumber; + lpVersionInformation->dwPlatformId = VER_PLATFORM_WIN32_NT; + if(((NtOSCSDVersion >> 8) & 0xFF) != 0) + { + int i = _snwprintf(lpVersionInformation->szCSDVersion, + (sizeof(lpVersionInformation->szCSDVersion) / sizeof(lpVersionInformation->szCSDVersion[0])) - 1, + L"Service Pack %d", + ((NtOSCSDVersion >> 8) & 0xFF)); + lpVersionInformation->szCSDVersion[i] = L'\0'; + } + else + { + RtlZeroMemory(lpVersionInformation->szCSDVersion, sizeof(lpVersionInformation->szCSDVersion)); + } + if (lpVersionInformation->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXW)) + { + RTL_OSVERSIONINFOEXW *InfoEx = (RTL_OSVERSIONINFOEXW *)lpVersionInformation; + InfoEx->wServicePackMajor = (NtOSCSDVersion >> 8) & 0xFF; + InfoEx->wServicePackMinor = NtOSCSDVersion & 0xFF; + InfoEx->wSuiteMask = SharedUserData->SuiteMask; + InfoEx->wProductType = SharedUserData->NtProductType; + } + + return STATUS_SUCCESS; + } + + return STATUS_INVALID_PARAMETER; +} + diff --git a/reactos/ntoskrnl/se/access.c b/reactos/ntoskrnl/se/access.c index a50a318e5ad..1e49fce5040 100644 --- a/reactos/ntoskrnl/se/access.c +++ b/reactos/ntoskrnl/se/access.c @@ -26,6 +26,8 @@ RtlAreAllAccessesGranted ( ACCESS_MASK DesiredAccess ) { + PAGED_CODE_RTL(); + return ((GrantedAccess & DesiredAccess) == DesiredAccess); } @@ -40,6 +42,8 @@ RtlAreAnyAccessesGranted ( ACCESS_MASK DesiredAccess ) { + PAGED_CODE_RTL(); + return ((GrantedAccess & DesiredAccess) != 0); } @@ -54,6 +58,8 @@ RtlMapGenericMask ( PGENERIC_MAPPING GenericMapping ) { + PAGED_CODE_RTL(); + if (*AccessMask & GENERIC_READ) *AccessMask |= GenericMapping->GenericRead; diff --git a/reactos/ntoskrnl/se/acl.c b/reactos/ntoskrnl/se/acl.c index bdb249ebe04..8f1bbd5b2e0 100644 --- a/reactos/ntoskrnl/se/acl.c +++ b/reactos/ntoskrnl/se/acl.c @@ -225,6 +225,8 @@ SepCreateImpersonationTokenDacl(PTOKEN Token, { ULONG AclLength; PVOID TokenDacl; + + PAGED_CODE(); AclLength = sizeof(ACL) + (sizeof(ACE) + RtlLengthSid(SeAliasAdminsSid)) + diff --git a/reactos/ntoskrnl/se/luid.c b/reactos/ntoskrnl/se/luid.c index 702bfcdd201..1b5d653caff 100644 --- a/reactos/ntoskrnl/se/luid.c +++ b/reactos/ntoskrnl/se/luid.c @@ -63,6 +63,8 @@ NtAllocateLocallyUniqueId(OUT LUID *LocallyUniqueId) KPROCESSOR_MODE PreviousMode; NTSTATUS Status = STATUS_SUCCESS; + PAGED_CODE(); + PreviousMode = ExGetPreviousMode(); if(PreviousMode != KernelMode) @@ -108,6 +110,8 @@ VOID STDCALL RtlCopyLuid(IN PLUID LuidDest, IN PLUID LuidSrc) { + PAGED_CODE_RTL(); + LuidDest->LowPart = LuidSrc->LowPart; LuidDest->HighPart = LuidSrc->HighPart; } @@ -120,6 +124,8 @@ BOOLEAN STDCALL RtlEqualLuid(IN PLUID Luid1, IN PLUID Luid2) { + PAGED_CODE_RTL(); + return (Luid1->LowPart == Luid2->LowPart && Luid1->HighPart == Luid2->HighPart); } diff --git a/reactos/ntoskrnl/se/priv.c b/reactos/ntoskrnl/se/priv.c index 5dceff3ab93..a3b813766d2 100644 --- a/reactos/ntoskrnl/se/priv.c +++ b/reactos/ntoskrnl/se/priv.c @@ -108,6 +108,8 @@ SepPrivilegeCheck (PTOKEN Token, ULONG k; DPRINT ("SepPrivilegeCheck() called\n"); + + PAGED_CODE(); if (PreviousMode == KernelMode) { @@ -167,6 +169,8 @@ SeCaptureLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Src, { PLUID_AND_ATTRIBUTES* NewMem; ULONG SrcLength; + + PAGED_CODE(); if (PrivilegeCount == 0) { @@ -212,6 +216,8 @@ SeReleaseLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Privilege, KPROCESSOR_MODE PreviousMode, ULONG a) { + PAGED_CODE(); + ExFreePool (Privilege); } @@ -227,6 +233,8 @@ NtPrivilegeCheck (IN HANDLE ClientToken, ULONG PrivilegeControl; ULONG Length; NTSTATUS Status; + + PAGED_CODE(); Status = ObReferenceObjectByHandle (ClientToken, 0, @@ -291,6 +299,8 @@ SePrivilegeCheck (PPRIVILEGE_SET Privileges, KPROCESSOR_MODE PreviousMode) { PACCESS_TOKEN Token = NULL; + + PAGED_CODE(); if (SubjectContext->ClientToken == NULL) { @@ -323,6 +333,8 @@ SeSinglePrivilegeCheck (IN LUID PrivilegeValue, SECURITY_SUBJECT_CONTEXT SubjectContext; PRIVILEGE_SET Priv; BOOLEAN Result; + + PAGED_CODE(); SeCaptureSubjectContext (&SubjectContext); diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index 1df75460793..017e480f705 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -198,6 +198,8 @@ SeCaptureSubjectContext(OUT PSECURITY_SUBJECT_CONTEXT SubjectContext) PETHREAD Thread; BOOLEAN CopyOnOpen; BOOLEAN EffectiveOnly; + + PAGED_CODE(); Thread = PsGetCurrentThread(); if (Thread == NULL) @@ -226,6 +228,8 @@ SeCaptureSubjectContext(OUT PSECURITY_SUBJECT_CONTEXT SubjectContext) VOID STDCALL SeLockSubjectContext(IN PSECURITY_SUBJECT_CONTEXT SubjectContext) { + PAGED_CODE(); + KeEnterCriticalRegion(); ExAcquireResourceExclusiveLite(&SepSubjectContextLock, TRUE); } @@ -237,6 +241,8 @@ SeLockSubjectContext(IN PSECURITY_SUBJECT_CONTEXT SubjectContext) VOID STDCALL SeUnlockSubjectContext(IN PSECURITY_SUBJECT_CONTEXT SubjectContext) { + PAGED_CODE(); + ExReleaseResourceLite(&SepSubjectContextLock); KeLeaveCriticalRegion(); } @@ -248,6 +254,8 @@ SeUnlockSubjectContext(IN PSECURITY_SUBJECT_CONTEXT SubjectContext) VOID STDCALL SeReleaseSubjectContext(IN PSECURITY_SUBJECT_CONTEXT SubjectContext) { + PAGED_CODE(); + if (SubjectContext->PrimaryToken != NULL) { ObDereferenceObject(SubjectContext->PrimaryToken); @@ -266,6 +274,8 @@ SeReleaseSubjectContext(IN PSECURITY_SUBJECT_CONTEXT SubjectContext) NTSTATUS STDCALL SeDeassignSecurity(PSECURITY_DESCRIPTOR *SecurityDescriptor) { + PAGED_CODE(); + if (*SecurityDescriptor != NULL) { ExFreePool(*SecurityDescriptor); @@ -331,6 +341,8 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL, PSID Group = NULL; PACL Dacl = NULL; PACL Sacl = NULL; + + PAGED_CODE(); /* Lock subject context */ SeLockSubjectContext(SubjectContext); @@ -561,6 +573,8 @@ SepSidInToken(PACCESS_TOKEN _Token, { ULONG i; PTOKEN Token = (PTOKEN)_Token; + + PAGED_CODE(); if (Token->UserAndGroupCount == 0) { @@ -624,6 +638,8 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, PACE CurrentAce; PSID Sid; NTSTATUS Status; + + PAGED_CODE(); CurrentAccess = PreviouslyGrantedAccess; @@ -795,6 +811,8 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, KPROCESSOR_MODE PreviousMode; PTOKEN Token; NTSTATUS Status; + + PAGED_CODE(); DPRINT("NtAccessCheck() called\n"); diff --git a/reactos/tools/mkconfig.c b/reactos/tools/mkconfig.c index 3ab1631c6c0..244de45667a 100644 --- a/reactos/tools/mkconfig.c +++ b/reactos/tools/mkconfig.c @@ -108,7 +108,9 @@ main(int argc, char* argv[]) } else { + s = s + sprintf(s, "#ifndef %s\n", argv[i]); s = s + sprintf(s, "#define %s\n", argv[i]); + s = s + sprintf(s, "#endif /* %s */\n", argv[i]); } strcat(config, argv[i]); if (i != (argc - 1))