- Add Ex*Spinlock macros and FLUSH_MULTIPLE_MAXIMUM definitions missing from DDK

- Add KeAcquireQueuedSpinLock / KeAcquireReleaseQueuedSpinLock, RtlCompareMemoryUlong definitions missing from IFS.
- Add actual section object definition to NDK
- More NDK fixes
- Fix incorrect definition of MMPTE_LIST
- Fix incorrect prototype of NtFlushVirtualMemory
- Fix incorrect prototypes of KeAcquire / ReleaseQueuedSpinLock
- Add a second parameter to MmCreateKernelStack to select the NUMA node on which the stack should be allocated
- Avoid usage of PROS_SECTION_OBJECT in Ps where possible
- Unimplement PsChargeProcessQuota. It was not working right
- Use PFN_NUMBER defined in DDK instead of PFN_TYPE internal ROS Type.

svn path=/trunk/; revision=29188
This commit is contained in:
Aleksey Bragin
2007-09-24 14:01:54 +00:00
parent a7396c359e
commit 2cbc032859
20 changed files with 101 additions and 73 deletions
+2 -2
View File
@@ -170,7 +170,7 @@ KeReleaseInStackQueuedSpinLock(
*/
KIRQL
FASTCALL
KeAcquireQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle)
KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER Number)
{
UNIMPLEMENTED;
return 0;
@@ -192,7 +192,7 @@ KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
*/
VOID
FASTCALL
KeReleaseQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle,
KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER Number,
IN KIRQL OldIrql)
{
UNIMPLEMENTED;
+24
View File
@@ -3460,6 +3460,21 @@ IoVerifyVolume (
IN BOOLEAN AllowRawMount
);
NTHALAPI
KIRQL
FASTCALL
KeAcquireQueuedSpinLock (
IN KSPIN_LOCK_QUEUE_NUMBER Number
);
NTHALAPI
VOID
FASTCALL
KeReleaseQueuedSpinLock (
IN KSPIN_LOCK_QUEUE_NUMBER Number,
IN KIRQL OldIrql
);
NTKERNELAPI
VOID
NTAPI
@@ -3887,6 +3902,15 @@ RtlCaptureStackBackTrace (
OUT PULONG BackTraceHash OPTIONAL
);
NTSYSAPI
SIZE_T
NTAPI
RtlCompareMemoryUlong (
PVOID Source,
SIZE_T Length,
ULONG Pattern
);
NTSYSAPI
NTSTATUS
NTAPI
+7
View File
@@ -4743,6 +4743,8 @@ typedef ULONG PFN_COUNT;
typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
#define FLUSH_MULTIPLE_MAXIMUM 32
typedef enum _MM_SYSTEM_SIZE {
MmSmallSystem,
MmMediumSystem,
@@ -8899,6 +8901,11 @@ KeEnterCriticalRegion(
*/
#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
#define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
#define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
#define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
#define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
NTHALAPI
VOID
NTAPI
+3 -1
View File
@@ -114,8 +114,10 @@ typedef struct _MMPTE_LIST
{
ULONG Valid:1;
ULONG OneEntry:1;
ULONG filler10:10;
ULONG filler0:8;
ULONG NextEntry:20;
ULONG Prototype:1;
ULONG filler1:1;
} MMPTE_LIST;
#ifndef CONFIG_SMP
+3 -3
View File
@@ -133,9 +133,9 @@ NTSTATUS
NTAPI
NtFlushVirtualMemory(
IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN ULONG NumberOfBytesToFlush,
OUT PULONG NumberOfBytesFlushed OPTIONAL
IN OUT PVOID *BaseAddress,
IN OUT PSIZE_T RegionSize,
OUT PIO_STATUS_BLOCK IoStatus
);
NTSTATUS
+23 -4
View File
@@ -507,6 +507,22 @@ typedef struct _MM_AVL_TABLE
PVOID NodeFreeHint;
} MM_AVL_TABLE, *PMM_AVL_TABLE;
//
// Actual Section Object
//
typedef struct _SECTION
{
MMADDRESS_NODE Address;
PSEGMENT Segment;
LARGE_INTEGER SizeOfSection;
union
{
ULONG LongFlags;
MMSECTION_FLAGS Flags;
} u;
ULONG InitialPageProtection;
} SECTION, *PSECTION;
//
// Memory Manager Working Set Structures
//
@@ -567,11 +583,14 @@ typedef struct _MMSUPPORT_FLAGS
ULONG BeingTrimmed:1;
ULONG SessionLeader:1;
ULONG TrimHard:1;
ULONG WorkingSetHard:1;
ULONG AddressSpaceBeingDeleted :1;
ULONG Available:10;
ULONG AllowWorkingSetAdjustment:8;
ULONG MaximumWorkingSetHard:1;
ULONG ForceTrim:1;
ULONG MinimumworkingSetHard:1;
ULONG Available0:1;
ULONG MemoryPriority:8;
ULONG GrowWsleHash:1;
ULONG AcquiredUnsafe:1;
ULONG Available:14;
} MMSUPPORT_FLAGS, *PMMSUPPORT_FLAGS;
//
+1
View File
@@ -191,6 +191,7 @@ Author:
#define STA_LPC_RECEIVED_MSG_ID_VALID_BIT 0x1
#define STA_LPC_EXIT_THREAD_CALLED_BIT 0x2
#define STA_ADDRESS_SPACE_OWNER_BIT 0x4
#define STA_OWNS_WORKING_SET_BITS 0x1F8
#endif
#define TLS_EXPANSION_SLOTS 1024
+12
View File
@@ -941,6 +941,18 @@ KeDisableInterrupts(
VOID
);
VOID
FASTCALL
KeAcquireQueuedSpinLockAtDpcLevel(
IN OUT PKSPIN_LOCK_QUEUE LockQueue
);
VOID
FASTCALL
KeReleaseQueuedSpinLockFromDpcLevel(
IN OUT PKSPIN_LOCK_QUEUE LockQueue
);
#include "ke_x.h"
#endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */
+1 -1
View File
@@ -802,7 +802,7 @@ MmInitializePageOp(VOID);
PVOID
NTAPI
MmCreateKernelStack(BOOLEAN GuiStack);
MmCreateKernelStack(BOOLEAN GuiStack, UCHAR Node);
VOID
NTAPI
-4
View File
@@ -58,10 +58,6 @@
#define PSREFTRACE(x)
#endif
#define PspSetProcessFlag(Process, Flag) \
InterlockedOr((PLONG)&Process->Flags, Flag)
//
// Maximum Count of Notification Routines
//
+6
View File
@@ -19,6 +19,12 @@
#define PspQuantumLengthFromMask(Mask) \
((Mask) & 48)
//
// Set Process Flag routines
//
#define PspSetProcessFlag(Process, Flag) \
InterlockedOr((PLONG)&Process->Flags, Flag)
//
// Cross Thread Flag routines
//
+3 -3
View File
@@ -95,8 +95,8 @@ IoBuildPartialMdl(IN PMDL SourceMdl,
IN PVOID VirtualAddress,
IN ULONG Length)
{
PPFN_TYPE TargetPages = (PPFN_TYPE)(TargetMdl + 1);
PPFN_TYPE SourcePages = (PPFN_TYPE)(SourceMdl + 1);
PPFN_NUMBER TargetPages = (PPFN_NUMBER)(TargetMdl + 1);
PPFN_NUMBER SourcePages = (PPFN_NUMBER)(SourceMdl + 1);
ULONG Offset;
/* Calculate the offset */
@@ -131,7 +131,7 @@ IoBuildPartialMdl(IN PMDL SourceMdl,
Offset = ((ULONG_PTR)TargetMdl->StartVa - (ULONG_PTR)SourceMdl->StartVa) >>
PAGE_SHIFT;
SourcePages += Offset;
RtlCopyMemory(TargetPages, SourcePages, Length * sizeof(PFN_TYPE));
RtlCopyMemory(TargetPages, SourcePages, Length * sizeof(PFN_NUMBER));
}
/*
+1 -1
View File
@@ -580,7 +580,7 @@ KiInitializeKernel(IN PKPROCESS InitProcess,
Prcb->AdjustDpcThreshold = KiAdjustDpcThreshold;
/* Allocate the DPC Stack */
DpcStack = MmCreateKernelStack(FALSE);
DpcStack = MmCreateKernelStack(FALSE, 0);
if (!DpcStack) KeBugCheckEx(NO_PAGES_AVAILABLE, 1, 0, 0, 0);
Prcb->DpcStack = (PVOID)((ULONG_PTR)DpcStack + KERNEL_STACK_SIZE);
+2 -2
View File
@@ -19,7 +19,7 @@
VOID
FASTCALL
KeAcquireQueuedSpinLockAtDpcLevel(IN PKLOCK_QUEUE_HANDLE LockHandle)
KeAcquireQueuedSpinLockAtDpcLevel(IN PKSPIN_LOCK_QUEUE LockHandle)
{
#ifdef CONFIG_SMP
PKSPIN_LOCK_QUEUE Prev;
@@ -49,7 +49,7 @@ KeAcquireQueuedSpinLockAtDpcLevel(IN PKLOCK_QUEUE_HANDLE LockHandle)
VOID
FASTCALL
KeReleaseQueuedSpinLockFromDpcLevel(IN PKLOCK_QUEUE_HANDLE LockHandle)
KeReleaseQueuedSpinLockFromDpcLevel(IN PKSPIN_LOCK_QUEUE LockHandle)
{
#ifdef CONFIG_SMP
KSPIN_LOCK LockVal;
+1 -1
View File
@@ -797,7 +797,7 @@ KeInitThread(IN OUT PKTHREAD Thread,
if (!KernelStack)
{
/* We don't, allocate one */
KernelStack = (PVOID)((ULONG_PTR)MmCreateKernelStack(FALSE) +
KernelStack = (PVOID)((ULONG_PTR)MmCreateKernelStack(FALSE, 0) +
KERNEL_STACK_SIZE);
if (!KernelStack) return STATUS_INSUFFICIENT_RESOURCES;
+2 -1
View File
@@ -180,7 +180,8 @@ MmDeleteTeb(PEPROCESS Process,
PVOID
STDCALL
MmCreateKernelStack(BOOLEAN GuiStack)
MmCreateKernelStack(BOOLEAN GuiStack,
UCHAR Node)
{
PMEMORY_AREA StackArea;
ULONG i;
+3 -3
View File
@@ -19,9 +19,9 @@
NTSTATUS STDCALL
NtFlushVirtualMemory(IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN ULONG NumberOfBytesToFlush,
OUT PULONG NumberOfBytesFlushed OPTIONAL)
IN OUT PVOID *BaseAddress,
IN OUT PSIZE_T NumberOfBytesToFlush,
OUT PIO_STATUS_BLOCK IoStatusBlock)
/*
* FUNCTION: Flushes virtual memory to file
* ARGUMENTS:
+3 -3
View File
@@ -26,18 +26,18 @@ NTAPI
PsReferenceProcessFilePointer(IN PEPROCESS Process,
OUT PFILE_OBJECT *FileObject)
{
PROS_SECTION_OBJECT Section;
PSECTION Section;
PAGED_CODE();
/* Lock the process */
ExAcquireRundownProtection(&Process->RundownProtect);
/* Get the section */
Section = (PROS_SECTION_OBJECT)Process->SectionObject;
Section = Process->SectionObject;
if (Section)
{
/* Get the file object and reference it */
*FileObject = MmGetFileObjectForSection(Section);
*FileObject = MmGetFileObjectForSection((PVOID)Section);
ObReferenceObject(*FileObject);
}
+2 -43
View File
@@ -113,49 +113,8 @@ PsChargeProcessPoolQuota(IN PEPROCESS Process,
IN POOL_TYPE PoolType,
IN ULONG Amount)
{
PEPROCESS_QUOTA_BLOCK QuotaBlock;
ULONG NewUsageSize;
ULONG NewMaxQuota;
/* Get current Quota Block */
QuotaBlock = Process->QuotaBlock;
/* Quota Operations are not to be done on the SYSTEM Process */
if (Process == PsInitialSystemProcess) return STATUS_SUCCESS;
/* New Size in use */
NewUsageSize = QuotaBlock->QuotaEntry[PoolType].Usage + Amount;
/* Does this size respect the quota? */
if (NewUsageSize > QuotaBlock->QuotaEntry[PoolType].Limit)
{
/* It doesn't, so keep raising the Quota */
while (MiRaisePoolQuota(PoolType,
QuotaBlock->QuotaEntry[PoolType].Limit,
&NewMaxQuota))
{
/* Save new Maximum Quota */
QuotaBlock->QuotaEntry[PoolType].Limit = NewMaxQuota;
/* See if the new Maximum Quota fulfills our need */
if (NewUsageSize <= NewMaxQuota) goto QuotaChanged;
}
return STATUS_QUOTA_EXCEEDED;
}
QuotaChanged:
/* Save new Usage */
QuotaBlock->QuotaEntry[PoolType].Usage = NewUsageSize;
/* Is this a new peak? */
if (NewUsageSize > QuotaBlock->QuotaEntry[PoolType].Peak)
{
QuotaBlock->QuotaEntry[PoolType].Peak = NewUsageSize;
}
/* All went well */
return STATUS_SUCCESS;
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/*
+2 -1
View File
@@ -52,7 +52,8 @@ PsConvertToGuiThread(VOID)
if (!Thread->Tcb.LargeStack)
{
/* We don't create one */
NewStack = (ULONG_PTR)MmCreateKernelStack(TRUE) + KERNEL_LARGE_STACK_SIZE;
NewStack = (ULONG_PTR)MmCreateKernelStack(TRUE, 0) +
KERNEL_LARGE_STACK_SIZE;
if (!NewStack)
{
/* Panic in user-mode */