- Implement InterlockedExchangeAdd/Decrement/Increment16.

- Fix MM_EXTEND_INFO definition.
- Fix MMWSLE definition.
- Fix EPROCESS definition.
- Add quota functions to NDK.
- Add one more parameter to PspMapSystemDll to support mapping large pages.
- Don't make the quota functions do anything for the system process.
- Add page file quota functions.
- Other misc small fixes.

svn path=/trunk/; revision=29214
This commit is contained in:
Aleksey Bragin 2007-09-26 16:41:35 +00:00
parent cb82475b6d
commit 432625614e
17 changed files with 250 additions and 49 deletions

View file

@ -9686,6 +9686,20 @@ MmMapLockedPages(
IN PMDL MemoryDescriptorList,
IN KPROCESSOR_MODE AccessMode);
NTKERNELAPI
PVOID
NTAPI
MmLockPageableDataSection (
IN PVOID AddressWithinSection
);
NTKERNELAPI
VOID
NTAPI
MmUnlockPageableImageSection(
IN PVOID ImageSectionHandle
);
NTKERNELAPI
PVOID
NTAPI
@ -9748,6 +9762,9 @@ MmUnsecureVirtualMemory(
} \
}
#define MmGetProcedureAddress(Address) (Address)
#define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
NTKERNELAPI
VOID
NTAPI

View file

@ -247,20 +247,6 @@ typedef struct _MMPTE
} u;
} MMPTE, *PMMPTE;
//
// Section Information structure
//
typedef struct _MI_EXTRA_IMAGE_INFORMATION
{
ULONG SizeOfHeaders;
} MI_EXTRA_IMAGE_INFORMATION, *PMI_EXTRA_IMAGE_INFORMATION;
typedef struct _MI_SECTION_IMAGE_INFORMATION
{
SECTION_IMAGE_INFORMATION ExportedImageInformation;
MI_EXTRA_IMAGE_INFORMATION InternalImageInformation;
} MI_SECTION_IMAGE_INFORMATION, *PMI_SECTION_IMAGE_INFORMATION;
//
// Section Extension Information
//
@ -295,12 +281,12 @@ typedef struct _SEGMENT
PVOID BaseAddress;
union
{
ULONG ImageCommitment;
SIZE_T ImageCommitment;
PEPROCESS CreatingProcess;
} u1;
union
{
PMI_SECTION_IMAGE_INFORMATION ImageInformation;
PSECTION_IMAGE_INFORMATION ImageInformation;
PVOID FirstMappedVa;
} u2;
PMMPTE PrototypePte;
@ -545,7 +531,7 @@ typedef struct _MMWSLE
PVOID VirtualAddress;
ULONG Long;
MMWSLENTRY e1;
};
} u1;
} MMWSLE, *PMMWSLE;
typedef struct _MMWSLE_HASH

View file

@ -132,6 +132,68 @@ PsIsProtectedProcess(
IN PEPROCESS Process
);
//
// Quota Functions
//
NTKERNELAPI
VOID
NTAPI
PsChargePoolQuota(
IN PEPROCESS Process,
IN POOL_TYPE PoolType,
IN ULONG Amount
);
NTKERNELAPI
NTSTATUS
NTAPI
PsChargeProcessNonPagedPoolQuota(
IN PEPROCESS Process,
IN ULONG_PTR Amount
);
NTKERNELAPI
NTSTATUS
NTAPI
PsChargeProcessPagedPoolQuota(
IN PEPROCESS Process,
IN ULONG_PTR Amount
);
NTKERNELAPI
NTSTATUS
NTAPI
PsChargeProcessPoolQuota(
IN PEPROCESS Process,
IN POOL_TYPE PoolType,
IN ULONG Amount
);
NTKERNELAPI
VOID
NTAPI
PsReturnPoolQuota(
IN PEPROCESS Process,
IN POOL_TYPE PoolType,
IN ULONG_PTR Amount
);
NTKERNELAPI
VOID
NTAPI
PsReturnProcessNonPagedPoolQuota(
IN PEPROCESS Process,
IN ULONG_PTR Amount
);
NTKERNELAPI
VOID
NTAPI
PsReturnProcessPagedPoolQuota(
IN PEPROCESS Process,
IN ULONG_PTR Amount
);
#endif
//

View file

@ -1177,16 +1177,12 @@ typedef struct _EPROCESS
EX_PUSH_LOCK AddressCreationLock;
PETHREAD RotateInProgress;
#else
FAST_MUTEX AddressCreationLock; // FIXME: FAST_MUTEX for XP, KGUARDED_MUTEX for 2K3
KGUARDED_MUTEX AddressCreationLock;
KSPIN_LOCK HyperSpaceLock;
#endif
PETHREAD ForkInProgress;
ULONG HardwareTrigger;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
PMM_AVL_TABLE PhysicalVadroot;
#else
MM_AVL_TABLE PhysicalVadroot;
#endif
PMM_AVL_TABLE PhysicalVadRoot;
PVOID CloneRoot;
ULONG NumberOfPrivatePages;
ULONG NumberOfLockedPages;

View file

@ -128,6 +128,11 @@ static __inline__ __attribute__((always_inline)) void * _InterlockedExchangePoin
return __sync_lock_test_and_set(Target, Value);
}
static __inline__ __attribute__((always_inline)) long _InterlockedExchangeAdd16(volatile short * const Addend, const short Value)
{
return __sync_fetch_and_add(Addend, Value);
}
static __inline__ __attribute__((always_inline)) long _InterlockedExchangeAdd(volatile long * const Addend, const long Value)
{
return __sync_fetch_and_add(Addend, Value);
@ -239,6 +244,13 @@ static __inline__ __attribute__((always_inline)) void * _InterlockedExchangePoin
return retval;
}
static __inline__ __attribute__((always_inline)) long _InterlockedExchangeAdd16(volatile short * const Addend, const short Value)
{
long retval = Value;
__asm__("lock; xaddw %[retval], %[Addend]" : [retval] "+r" (retval) : [Addend] "m" (*Addend) : "memory");
return retval;
}
static __inline__ __attribute__((always_inline)) long _InterlockedExchangeAdd(volatile long * const Addend, const long Value)
{
long retval = Value;
@ -426,6 +438,16 @@ static __inline__ __attribute__((always_inline)) long _InterlockedIncrement(vola
return _InterlockedExchangeAdd(lpAddend, 1) + 1;
}
static __inline__ __attribute__((always_inline)) long _InterlockedDecrement16(volatile short * const lpAddend)
{
return _InterlockedExchangeAdd16(lpAddend, -1) - 1;
}
static __inline__ __attribute__((always_inline)) long _InterlockedIncrement16(volatile short * const lpAddend)
{
return _InterlockedExchangeAdd16(lpAddend, 1) + 1;
}
static __inline__ __attribute__((always_inline)) unsigned char _interlockedbittestandreset(volatile long * a, const long b)
{
unsigned char retval;

View file

@ -80,6 +80,9 @@ static inline void Ki386Cpuid(ULONG Op, PULONG Eax, PULONG Ebx, PULONG Ecx, PULO
#define Ke386FnInit() __asm__("fninit\n\t");
#define Ke386WbInvd() __asm__("wbinvd\n\t");
//
// CR Macros
//

View file

@ -751,6 +751,15 @@ VOID
NTAPI
KeFlushCurrentTb(VOID);
BOOLEAN
NTAPI
KeInvalidateAllCaches(VOID);
VOID
FASTCALL
KeZeroPages(IN PVOID Address,
IN ULONG Size);
VOID
NTAPI
KeRosDumpStackFrames(

View file

@ -96,7 +96,7 @@ Ke386SanitizeDr(IN PVOID DrAddress,
PKTHREAD _Thread = KeGetCurrentThread(); \
\
/* Sanity checks */ \
ASSERT_IRQL_LESS_OR_EQUAL(APC_LEVEL); \
ASSERT(KeGetCurrentIrql() <= APC_LEVEL); \
ASSERT(_Thread == KeGetCurrentThread()); \
ASSERT((_Thread->SpecialApcDisable <= 0) && \
(_Thread->SpecialApcDisable != -32768)); \
@ -113,7 +113,7 @@ Ke386SanitizeDr(IN PVOID DrAddress,
PKTHREAD _Thread = KeGetCurrentThread(); \
\
/* Sanity checks */ \
ASSERT_IRQL_LESS_OR_EQUAL(APC_LEVEL); \
ASSERT(KeGetCurrentIrql() <= APC_LEVEL); \
ASSERT(_Thread == KeGetCurrentThread()); \
ASSERT(_Thread->SpecialApcDisable < 0); \
\
@ -1540,3 +1540,11 @@ KeGetPreviousMode(VOID)
return KeGetCurrentThread()->PreviousMode;
}
VOID
FORCEINLINE
KeFlushProcessTb(VOID)
{
/* Flush the TLB by resetting CR3 */
__writecr3(__readcr3());
}

View file

@ -1457,4 +1457,14 @@ MmCheckSystemImage(
IN BOOLEAN PurgeSection
);
FORCEINLINE
VOID
NTAPI
MiSyncThreadProcessViews(IN PKPROCESS Process,
IN PVOID Address,
IN ULONG Size)
{
MmUpdatePageDir((PEPROCESS)Process, Address, Size);
}
#endif

View file

@ -105,7 +105,8 @@ NTSTATUS
NTAPI
PspMapSystemDll(
IN PEPROCESS Process,
OUT PVOID *DllBase
OUT PVOID *DllBase,
IN BOOLEAN UseLargePages
);
NTSTATUS
@ -349,6 +350,23 @@ PsSuspendThread(
OUT PULONG PreviousCount OPTIONAL
);
//
// Process Quotas
//
NTSTATUS
NTAPI
PsReturnProcessPageFileQuota(
IN PEPROCESS Process,
IN SIZE_T Amount
);
NTSTATUS
NTAPI
PsChargeProcessPageFileQuota(
IN PEPROCESS Process,
IN SIZE_T Amount
);
//
// Global data inside the Process Manager
//

View file

@ -19,12 +19,6 @@
#define PspQuantumLengthFromMask(Mask) \
((Mask) & 48)
//
// Set Process Flag routines
//
#define PspSetProcessFlag(Process, Flag) \
InterlockedOr((PLONG)&Process->Flags, Flag)
//
// Cross Thread Flag routines
//
@ -33,6 +27,14 @@
#define PspClearCrossThreadFlag(Thread, Flag) \
InterlockedAnd((PLONG)&Thread->CrossThreadFlags, ~Flag)
//
// Process flag routines
//
#define PspSetProcessFlag(Process, Flag) \
InterlockedOr((PLONG)&Process->Flags, Flag)
#define PspClearProcessFlag(Process, Flag) \
InterlockedAnd((PLONG)&Process->Flags, ~Flag)
VOID
FORCEINLINE
PspRunCreateThreadNotifyRoutines(IN PETHREAD CurrentThread,

View file

@ -78,6 +78,9 @@ BOOLEAN KiSMTProcessorsPresent;
KIRQL KiOldIrql;
ULONG KiFreezeFlag;
/* Flush data */
volatile LONG KiTbFlushTimeStamp;
/* CPU Signatures */
static const CHAR CmpIntelID[] = "GenuineIntel";
static const CHAR CmpAmdID[] = "AuthenticAMD";
@ -882,6 +885,27 @@ KeThawExecution(IN BOOLEAN Enable)
if (Enable) _enable();
}
BOOLEAN
NTAPI
KeInvalidateAllCaches(VOID)
{
/* Only supported on Pentium Pro and higher */
if (KeI386CpuType < 6) return FALSE;
/* Invalidate all caches */
Ke386WbInvd();
return TRUE;
}
VOID
FASTCALL
KeZeroPages(IN PVOID Address,
IN ULONG Size)
{
/* Not using XMMI in this routine */
RtlZeroMemory(Address, Size);
}
/* PUBLIC FUNCTIONS **********************************************************/
/*

View file

@ -39,11 +39,11 @@ MmLockAddressSpace(PMADDRESS_SPACE AddressSpace)
if (AddressSpace->Process)
{
ExEnterCriticalRegionAndAcquireFastMutexUnsafe(&AddressSpace->Process->AddressCreationLock);
ExEnterCriticalRegionAndAcquireFastMutexUnsafe((PFAST_MUTEX)&AddressSpace->Process->AddressCreationLock);
}
else
{
ExEnterCriticalRegionAndAcquireFastMutexUnsafe(&KernelAddressSpaceLock);
ExEnterCriticalRegionAndAcquireFastMutexUnsafe((PFAST_MUTEX)&KernelAddressSpaceLock);
}
}
@ -60,11 +60,11 @@ MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace)
}
if (AddressSpace->Process)
{
ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&AddressSpace->Process->AddressCreationLock);
ExReleaseFastMutexUnsafeAndLeaveCriticalRegion((PFAST_MUTEX)&AddressSpace->Process->AddressCreationLock);
}
else
{
ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&KernelAddressSpaceLock);
ExReleaseFastMutexUnsafeAndLeaveCriticalRegion((PFAST_MUTEX)&KernelAddressSpaceLock);
}
}
@ -98,11 +98,11 @@ MmInitializeAddressSpace(PEPROCESS Process,
AddressSpace->MemoryAreaRoot = NULL;
if (Process)
{
ExInitializeFastMutex(&Process->AddressCreationLock);
ExInitializeFastMutex((PFAST_MUTEX)&Process->AddressCreationLock);
}
else
{
ExInitializeFastMutex(&KernelAddressSpaceLock);
ExInitializeFastMutex((PFAST_MUTEX)&KernelAddressSpaceLock);
}
if (Process != NULL)
{

View file

@ -15,6 +15,8 @@
/* FUNCTIONS *****************************************************************/
#undef MmLockPagableDataSection
#if 0
VOID
MmUnlockPagableImageSection(IN PVOID ImageSectionHandle)

View file

@ -592,7 +592,7 @@ PspCreateProcess(OUT PHANDLE ProcessHandle,
if (!NT_SUCCESS(Status)) goto CleanupWithRef;
/* Check if we have a section object and map the system DLL */
if (SectionObject) PspMapSystemDll(Process, NULL);
if (SectionObject) PspMapSystemDll(Process, NULL, FALSE);
/* Create a handle for the Process */
CidEntry.Object = Process;

View file

@ -218,13 +218,14 @@ PspLookupKernelUserEntryPoints(VOID)
NTSTATUS
NTAPI
PspMapSystemDll(IN PEPROCESS Process,
IN PVOID *DllBase)
IN PVOID *DllBase,
IN BOOLEAN UseLargePages)
{
NTSTATUS Status;
LARGE_INTEGER Offset = {{0}};
SIZE_T ViewSize = 0;
PVOID ImageBase = 0;
/* Map the System DLL */
Status = MmMapViewOfSection(PspSystemDllSection,
Process,
@ -236,7 +237,12 @@ PspMapSystemDll(IN PEPROCESS Process,
ViewShare,
0,
PAGE_READWRITE);
if (Status != STATUS_SUCCESS)
{
/* Normalize status code */
Status = STATUS_CONFLICTING_ADDRESSES;
}
/* Write the image base and return status */
if (DllBase) *DllBase = ImageBase;
return Status;
@ -316,7 +322,7 @@ PsLocateSystemDll(VOID)
}
/* Map it */
Status = PspMapSystemDll(PsGetCurrentProcess(), &PspSystemDllBase);
Status = PspMapSystemDll(PsGetCurrentProcess(), &PspSystemDllBase, FALSE);
if (!NT_SUCCESS(Status))
{
/* Failed, bugcheck */

View file

@ -59,6 +59,19 @@ PspDestroyQuotaBlock(PEPROCESS Process)
}
}
NTSTATUS
NTAPI
PsChargeProcessPageFileQuota(IN PEPROCESS Process,
IN SIZE_T Amount)
{
/* Don't do anything for the system process */
if (Process == PsInitialSystemProcess) return STATUS_SUCCESS;
/* Otherwise, not implemented */
UNIMPLEMENTED;
return STATUS_SUCCESS;
}
/*
* @implemented
*/
@ -70,14 +83,12 @@ PsChargePoolQuota(IN PEPROCESS Process,
{
NTSTATUS Status;
/* Don't do anything for the system process */
if (Process == PsInitialSystemProcess) return;
/* Charge the usage */
Status = PsChargeProcessPoolQuota(Process, PoolType, Amount);
/* Raise Exception */
if (!NT_SUCCESS(Status))
{
ExRaiseStatus(Status);
}
if (!NT_SUCCESS(Status)) ExRaiseStatus(Status);
}
/*
@ -113,6 +124,9 @@ PsChargeProcessPoolQuota(IN PEPROCESS Process,
IN POOL_TYPE PoolType,
IN ULONG Amount)
{
/* Don't do anything for the system process */
if (Process == PsInitialSystemProcess) return STATUS_SUCCESS;
UNIMPLEMENTED;
return STATUS_SUCCESS;
}
@ -126,6 +140,9 @@ PsReturnPoolQuota(IN PEPROCESS Process,
IN POOL_TYPE PoolType,
IN ULONG_PTR Amount)
{
/* Don't do anything for the system process */
if (Process == PsInitialSystemProcess) return;
UNIMPLEMENTED;
}
@ -137,6 +154,9 @@ STDCALL
PsReturnProcessNonPagedPoolQuota(IN PEPROCESS Process,
IN ULONG_PTR Amount)
{
/* Don't do anything for the system process */
if (Process == PsInitialSystemProcess) return;
UNIMPLEMENTED;
}
@ -148,7 +168,23 @@ STDCALL
PsReturnProcessPagedPoolQuota(IN PEPROCESS Process,
IN ULONG_PTR Amount)
{
/* Don't do anything for the system process */
if (Process == PsInitialSystemProcess) return;
UNIMPLEMENTED;
}
NTSTATUS
NTAPI
PsReturnProcessPageFileQuota(IN PEPROCESS Process,
IN SIZE_T Amount)
{
/* Don't do anything for the system process */
if (Process == PsInitialSystemProcess) return STATUS_SUCCESS;
/* Otherwise, not implemented */
UNIMPLEMENTED;
return STATUS_SUCCESS;
}
/* EOF */