windows几个重要的内核数据结构虽然网上也有相关的定义,但个人觉得不齐全定义不规范,因此用一天时间使用WinDbg+Win2000sourcecode重新定义了常用的内核数据结构,并尽可能还原微软的原结构定义,每个结构都递归到最子层的结构并且通过了测试。通过这次工作过程不仅使自己得到一次学习的机会,而且提高了自己的整体软件架构规划设计水平。

代码:
{********************************************************************************}
{*                                                                              *}
{*                         Windows Kernel Struct Define                         *}
{*                                                                              *}
{*                         [uWindowsKernelStruct.pas]                           *}
{*                                                                              *}
{*                                                Copyright (c)2010  codegame   *}
{*                                               Update:  2010-04-09 23:51:44   *}
{********************************************************************************}

unit uWindowsKernelStruct;

interface


uses

  Windows;

type

  PEXCEPTION_DISPOSITION = ^TEXCEPTION_DISPOSITION;
  TEXCEPTION_DISPOSITION = (
    ExceptionContinueExecution = 0,
    ExceptionContinueSearch = 1,
    ExceptionNestedException = 2,
    ExceptionCollidedUnwind = 3);

  PSECURITY_IMPERSONATION_LEVEL = ^TSECURITY_IMPERSONATION_LEVEL;
  TSECURITY_IMPERSONATION_LEVEL = (
    SecurityAnonymous = 0,
    SecurityIdentification = 1,
    SecurityImpersonation = 2,
    SecurityDelegation = 3);

  PUNICODE_STRING = ^TUNICODE_STRING;
  TUNICODE_STRING = packed record
    Length: Word;
    MaximumLength: Word;
    Buffer: Pointer;
  end;

  PLIST_ENTRY = ^TLIST_ENTRY;
  TLIST_ENTRY = packed record
    Flink: PLIST_ENTRY;
    Blink: PLIST_ENTRY;
  end;

  TDISPATCHER_HEADER = packed record
    bType: byte;
    bAbsolute: byte;
    Size: byte;
    Inserted: byte;
    SignalState: DWORD;
    WaitListHead: TLIST_ENTRY;
  end;

  TKGDTENTRY = packed record
    LimitLow: Word;
    BaseLow: Word;
    HighWord: packed record
      BaseMid: Byte;
      Flags1: Byte;
      Flags2: Byte;
      BaseHi: Byte;
    end;
  end;

  TKIDTENTRY = packed record
    Offset: Word;
    Selector: Word;
    Access: Word;
    ExtendedOffset: Word;
  end;

  PSINGLE_LIST_ENTRY = ^TSINGLE_LIST_ENTRY;
  TSINGLE_LIST_ENTRY = packed record
    Next: PSINGLE_LIST_ENTRY;
  end;

  PCLIENT_ID = ^TCLIENT_ID;
  TCLIENT_ID = packed record
    UniqueProcess: Dword;
    UniqueThread: Dword;
  end;

  PKPROCESS = ^TKPROCESS;
  TKPROCESS = packed record
    Header: TDISPATCHER_HEADER;
    ProfileListHead: TLIST_ENTRY;
    DirectoryTableBase: array[0..1] of Dword;
    LdtDescriptor: TKGDTENTRY;
    Int21Descriptor: TKIDTENTRY;
    IopmOffset: Word;
    Iopl: Byte;
    Unused: Byte;
    ActiveProcessors: DWORD;
    KernelTime: DWORD;
    UserTime: DWORD;
    ReadyListHead: TLIST_ENTRY;
    SwapListEntry: TSINGLE_LIST_ENTRY;
    VdmTrapcHandler: Pointer;
    ThreadListHead: TLIST_ENTRY;
    ProcessLock: DWORD;
    Affinity: DWORD;
    StackCount: Word;
    BasePriority: Char;
    ThreadQuantum: Char;
    AutoAlignment: Byte;
    State: Byte;
    ThreadSeed: Byte;
    DisableBoost: Byte;
    PowerState: Byte;
    DisableQuantum: Byte;
    IdealNode: Byte;
    case Integer of
      0: (Flags: byte);
      1: (ExecuteOptions: byte);
  end;

  PKAPC_STATE = ^TKAPC_STATE;
  TKAPC_STATE = packed record
    ApcListHead: array[0..1] of TLIST_ENTRY;
    Process: PKPROCESS;
    KernelApcInProgress: Byte;
    KernelApcPending: Byte;
    UserApcPending: Word;
  end;

  PKTHREAD = ^TKTHREAD;
  PKWAIT_BLOCK = ^TKWAIT_BLOCK;
  TKWAIT_BLOCK = packed record
    WaitListEntry: TLIST_ENTRY;
    Thread: PKTHREAD;
    pObject: Pointer;
    NextWaitBlock: PKWAIT_BLOCK;
    WaitKey: Word;
    WaitType: Word;
  end;

  PKQUEUE = ^TKQUEUE;
  TKQUEUE = packed record
    Header: TDISPATCHER_HEADER;
    EntryListHead: TLIST_ENTRY;
    CurrentCount: Dword;
    MaximumCount: Dword;
    ThreadListHead: TLIST_ENTRY;
  end;

  PKDPC = ^TKDPC;
  TKDPC = packed record
    wType: word;
    Number: Byte;
    Importance: Byte;
    DpcListEntry: TLIST_ENTRY;
    DeferredRoutine: Pointer;
    DeferredContext: Pointer;
    SystemArgument1: Pointer;
    SystemArgument2: Pointer;
    Lock: PDWORD;
  end;

  PKTIMER = ^TKTIMER;
  TKTIMER = packed record
    Header: TDISPATCHER_HEADER;
    DueTime: Int64;
    TimerListEntry: TLIST_ENTRY;
    Dpc: PKDPC;
    Period: DWORD;
  end;

  PEXCEPTION_REGISTRATION_RECORD = ^TPEXCEPTION_REGISTRATION_RECORD;
  TPEXCEPTION_REGISTRATION_RECORD = packed record
    Next: PEXCEPTION_REGISTRATION_RECORD;
    Handler: PEXCEPTION_DISPOSITION;
  end;

  PKTRAP_FRAME = ^TKTRAP_FRAME;
  TKTRAP_FRAME = packed record
    DbgEbp: Dword;
    DbgEip: Dword;
    DbgArgMark: Dword;
    DbgArgPointer: Dword;
    TempSegCs: Dword;
    TempEsp: Dword;
    Dr0: Dword;
    Dr1: Dword;
    Dr2: Dword;
    Dr3: Dword;
    Dr6: Dword;
    Dr7: Dword;
    SegGs: Dword;
    SegEs: Dword;
    SegDs: Dword;
    Edx: Dword;
    Ecx: Dword;
    Eax: Dword;
    PreviousPreviousMode: Dword;
    ExceptionList: PEXCEPTION_REGISTRATION_RECORD;
    SegFs: Dword;
    Edi: Dword;
    Esi: Dword;
    Ebx: Dword;
    Ebp: Dword;
    ErrCode: Dword;
    Eip: Dword;
    SegCs: Dword;
    EFlags: Dword;
    HardwareEsp: Dword;
    HardwareSegSs: Dword;
    V86Es: Dword;
    V86Ds: Dword;
    V86Fs: Dword;
    V86Gs: Dword;
  end;

  PKAPC = ^TKAPC;
  TKAPC = packed record
    wType: word;
    Size: word;
    Spare0: DWORD;
    Thread: PKTHREAD;
    ApcListEntry: TLIST_ENTRY;
    KernelRoutine: Pointer;
    RundownRoutine: Pointer;
    NormalRoutine: Pointer;
    NormalContext: Pointer;
    SystemArgument1: Pointer;
    SystemArgument2: Pointer;
    ApcStateIndex: Char;
    ApcMode: Char;
    Inserted: Word;
  end;

  PKSEMAPHORE = ^TKSEMAPHORE;
  TKSEMAPHORE = packed record
    Header: TDISPATCHER_HEADER;
    Limit: Cardinal;
  end;

  TKTHREAD = packed record
    Header: TDISPATCHER_HEADER;
    MutantListHead: TLIST_ENTRY;
    InitialStack: Pointer;
    StackLimit: Pointer;
    Teb: Pointer;
    TlsArray: Pointer;
    KernelStack: Pointer;
    DebugActive: Byte;
    State: Byte;
    Alerted: array[0..1] of Byte;
    Iopl: Byte;
    NpxState: Byte;
    Saturation: Char;
    Priority: Char;
    ApcState: TKAPC_STATE;
    ContextSwitches: DWORD;
    IdleSwapBlock: Byte;
    Spare0: array[0..2] of Byte;
    WaitStatus: Cardinal;
    WaitIrql: Byte;
    WaitMode: Char;
    WaitNext: Byte;
    WaitReason: Byte;
    WaitBlockList: PKWAIT_BLOCK;
    Union: record case integer of
        0: (WaitListEntry: TLIST_ENTRY);
        1: (SwapListEntry: TSINGLE_LIST_ENTRY);
    end;
    WaitTime: Dword;
    BasePriority: Char;
    DecrementCount: Byte;
    PriorityDecrement: Char;
    Quantum: Char;
    WaitBlock: array[0..3] of TKWAIT_BLOCK;
    LegoData: Pointer;
    KernelApcDisable: Dword;
    UserAffinity: Dword;
    SystemAffinityActive: Byte;
    PowerState: Byte;
    NpxIrql: Byte;
    InitialNode: Byte;
    ServiceTable: Pointer;
    Queue: PKQUEUE;
    ApcQueueLock: DWORD;
    Timer: TKTIMER;
    Gap1: Dword; //间隙1
    QueueListEntry: TLIST_ENTRY;
    SoftAffinity: Dword;
    Affinity: Dword;
    Preempted: Byte;
    ProcessReadyQueue: Byte;
    KernelStackResident: Byte;
    NextProcessor: Byte;
    CallbackStack: Pointer;
    Win32Thread: Pointer;
    TrapFrame: PKTRAP_FRAME;
    ApcStatePointer: array[0..1] of PKAPC_STATE;
    PreviousMode: Char;
    EnableStackSwap: Byte;
    LargeStack: Byte;
    ResourceIndex: Byte;
    KernelTime: Dword;
    UserTime: Dword;
    SavedApcState: TKAPC_STATE;
    Alertable: Byte;
    ApcStateIndex: Byte;
    ApcQueueable: Byte;
    AutoAlignment: Byte;
    StackBase: Pointer;
    SuspendApc: TKAPC;
    SuspendSemaphore: TKSEMAPHORE;
    ThreadListEntry: TLIST_ENTRY;
    FreezeCount: Char;
    SuspendCount: Char;
    IdealProcessor: Byte;
    DisableBoost: Byte;
    Gap2: DWORD; //间隙
  end;

  PTERMINATION_PORT = ^TTERMINATION_PORT;
  TTERMINATION_PORT = packed record
    Next: PTERMINATION_PORT;
    Port: Pointer;
  end;

  PPS_IMPERSONATION_INFORMATION = ^TPS_IMPERSONATION_INFORMATION;
  TPS_IMPERSONATION_INFORMATION = packed record
    Token: Pointer;
    CopyOnOpen: byte;
    EffectiveOnly: Byte;
    ImpersonationLevel: TSECURITY_IMPERSONATION_LEVEL;
  end;

  PIO_STATUS_BLOCK = ^TIO_STATUS_BLOCK;
  TIO_STATUS_BLOCK = packed record
    Union: record case integer of
        0: (Status: Cardinal);
        1: (Pointer: Pointer);
    end;
    Information: Dword;
  end;

  PEPROCESS = ^TEPROCESS;
  PMDL = ^TMDL;
  TMDL = packed record
    Next: PMDL;
    Size: word;
    MdlFlags: word;
    Process: PEPROCESS;
    MappedSystemVa: Pointer;
    StartVa: Pointer;
    ByteCount: Dword;
    ByteOffset: Dword;
  end;

  PKEVENT = ^TKEVENT;
  TKEVENT = packed record
    Header: TDISPATCHER_HEADER;
  end;

  PIRP = ^TIRP;
  TIRP = packed record
    bType: Word;
    Size: word;
    MdlAddress: PMDL;
    Flags: Dword;
    AssociatedIrp: DWORD; //3 elements
    ThreadListEntry: TLIST_ENTRY;
    IoStatus: TIO_STATUS_BLOCK;
    RequestorMode: Char;
    PendingReturned: Byte;
    StackCount: Char;
    CurrentLocation: Char;
    Cancel: Byte;
    CancelIrql: Byte;
    ApcEnvironment: Char;
    AllocationFlags: Byte;
    UserIosb: PIO_STATUS_BLOCK;
    UserEvent: PKEVENT;
    Overlay: array[0..1] of dword;
    CancelRoutine: Pointer;
    UserBuffer: Pointer;
    Tail: array[0..11] of dword; //$30byte
  end;

  PDEVICE_OBJECT = ^TDEVICE_OBJECT;
  PIO_TIMER = ^TIO_TIMER;
  TIO_TIMER = packed record //Size $18
    bType: word;
    TimerFlag: word;
    TimerList: TLIST_ENTRY;
    TimerRoutine: Pointer;
    Context: Pointer;
    DeviceObject: PDEVICE_OBJECT;
  end;

  PVPB = ^TVPB;
  TVPB = packed record //Size $58
    bType: word;
    Size: word;
    Flags: Dword;
    VolumeLabelLength: word;
    DeviceObject: PDEVICE_OBJECT;
    RealDevice: PDEVICE_OBJECT;
    SerialNumber: Dword;
    ReferenceCount: Dword;
    VolumeLabel: array[0..31] of Word;
  end;

  PKDEVICE_QUEUE = ^TKDEVICE_QUEUE;
  TKDEVICE_QUEUE = packed record //Size $14
    bType: word;
    Size: word;
    DeviceListHead: TLIST_ENTRY;
    Lock: Word;
    Busy: Byte;
    Gap: array[0..2] of byte;
  end;

  PDEVOBJ_EXTENSION = ^TDEVOBJ_EXTENSION;
  TDEVOBJ_EXTENSION = packed record //Size $2C
    btype: Word;
    Size: Word;
    DeviceObject: PDEVICE_OBJECT;
    PowerFlags: DWord;
    Dope: Pointer; //_DEVICE_OBJECT_POWER_EXTENSION
    ExtensionFlags: DWord;
    DeviceNode: Pointer;
    AttachedTo: PDEVICE_OBJECT;
    StartIoCount: DWord;
    StartIoKey: DWord;
    StartIoFlags: DWord;
    Vpb: PVPB;
  end;

  TDEVICE_OBJECT = packed record
    bType: Word;
    Size: word;
    ReferenceCount: dword;
    DriverObject: PDEVICE_OBJECT;
    NextDevice: PDEVICE_OBJECT;
    AttachedDevice: PDEVICE_OBJECT;
    CurrentIrp: PIRP;
    Timer: PIO_TIMER;
    Flags: Dword;
    Characteristics: Dword;
    Vpb: PVPB;
    DeviceExtension: Pointer;
    DeviceType: Dword;
    StackSize: Char;
    Queue: array[0..39] of byte;
    AlignmentRequirement: DWORD;
    DeviceQueue: TKDEVICE_QUEUE;
    Dpc: TKDPC;
    ActiveThreadCount: Dword;
    SecurityDescriptor: Pointer;
    DeviceLock: TKEVENT;
    SectorSize: word;
    Spare1: word;
    DeviceObjectExtension: PDEVOBJ_EXTENSION;
    Reserved: Pointer;
  end;

  PEX_RUNDOWN_REF = ^TEX_RUNDOWN_REF;
  TEX_RUNDOWN_REF = packed record
    case integer of
      0: (Count: Cardinal);
      1: (Ptr: Pointer);
  end;

  PEX_PUSH_LOCK = ^TEX_PUSH_LOCK;
  TEX_PUSH_LOCK = packed record
    case integer of
      0: (Value: Cardinal); //Waiting:Pos 0,1Bit; Exclusive:Pos 1,1Bit ; Shared:Pos 2,30Bit
      1: (Ptr: Pointer);
  end;

  PEThread = ^TEThread;
  TEThread = packed record //Size:$258
    TCB: TKTHREAD;
    CreateTime: Int64; // bit0-1 - NestedFaultCount bit2 - ApcNeeded
    Union1: record case integer of
        0: (ExitTime: Int64);
        1: (LpcReplyChain: TLIST_ENTRY);
        2: (KeyedWaitChain: TLIST_ENTRY);
    end;
    Union2: record case integer of
        0: (ExitStatus: Cardinal);
        1: (OfsChain: Pointer);
    end;
    PostBlockList: TLIST_ENTRY;
    Union3: record case integer of
        0: (TerminationPort: PTERMINATION_PORT);
        1: (ReaperLink: PETHREAD);
        2: (KeyedWaitValue: Pointer);
    end;
    ActiveTimerListLock: Dword;
    ActiveTimerListHead: TLIST_ENTRY;
    Cid: TCLIENT_ID;
    Union4: record case integer of
        0: (LpcReplySemaphore: TKSEMAPHORE);
        1: (KeyedWaitSemaphore: TKSEMAPHORE);
    end;
    Union5: record case integer of
        0: (LpcReplyMessage: Pointer);
        1: (LpcWaitingOnPort: Pointer);
    end;
    ImpersonationInfo: PPS_IMPERSONATION_INFORMATION;
    IrpList: TLIST_ENTRY;
    TopLevelIrp: Dword;
    DeviceToVerify: PDEVICE_OBJECT;
    ThreadsProcess: PEPROCESS;
    StartAddress: Pointer;
    Union6: record case integer of
        0: (Win32StartAddress: Pointer);
        1: (LpcReceivedMessageId: Dword);
    end;
    ThreadListEntry: TLIST_ENTRY;
    RundownProtect: TEX_RUNDOWN_REF;
    ThreadLock: TEX_PUSH_LOCK;
    LpcReplyMessageId: Dword;
    ReadClusterSize: DWORD;
    GrantedAccess: DWORD;
    CrossThreadFlags: DWORD;
    SameThreadPassiveFlags: DWORD;
    SameThreadApcFlags: DWORD;
    ForwardClusterOnly: byte;
    DisablePageFaultClustering: byte;
    Gap: Word; //间隙
  end;

  PPEB_LDR_DATA = ^TPEB_LDR_DATA;
  TPEB_LDR_DATA = packed record // Size: $28
    Length: dword;
    Initialized: byte;
    SsHandle: Pointer;
    InLoadOrderModuleList: TLIST_ENTRY;
    InMemoryOrderModuleList: TLIST_ENTRY;
    InInitializationOrderModuleList: TLIST_ENTRY;
    EntryInProgress: Pointer;
  end;

  PCURDIR = ^TCURDIR;
  TCURDIR = packed record
    DosPath: TUNICODE_STRING;
    Handle: Pointer;
  end;

  PRTL_DRIVE_LETTER_CURDIR = ^TRTL_DRIVE_LETTER_CURDIR;
  TRTL_DRIVE_LETTER_CURDIR = packed record
    Flags: word;
    Length: word;
    TimeStamp: Dword;
    DosPath: TUNICODE_STRING;
  end;

  PRTL_USER_PROCESS_PARAMETERS = ^TRTL_USER_PROCESS_PARAMETERS;
  TRTL_USER_PROCESS_PARAMETERS = packed record
    MaximumLength: Dword;
    Length: Dword;
    Flags: Dword;
    DebugFlags: Dword;
    ConsoleHandle: Pointer;
    ConsoleFlags: Dword;
    StandardInput: Pointer;
    StandardOutput: Pointer;
    StandardError: Pointer;
    CurrentDirectory: TCURDIR;
    DllPath: TUNICODE_STRING;
    ImagePathName: TUNICODE_STRING;
    CommandLine: TUNICODE_STRING;
    Environment: Pointer;
    StartingX: Dword;
    StartingY: Dword;
    CountX: Dword;
    CountY: Dword;
    CountCharsX: Dword;
    CountCharsY: Dword;
    FillAttribute: Dword;
    WindowFlags: Dword;
    ShowWindowFlags: Dword;
    WindowTitle: TUNICODE_STRING;
    DesktopInfo: TUNICODE_STRING;
    ShellInfo: TUNICODE_STRING;
    RuntimeData: TUNICODE_STRING;
    CurrentDirectores: array[0..31] of TRTL_DRIVE_LETTER_CURDIR;
  end;

  PRTL_CRITICAL_SECTION = ^TRTL_CRITICAL_SECTION;
  PRTL_CRITICAL_SECTION_DEBUG = ^TRTL_CRITICAL_SECTION_DEBUG;
  TRTL_CRITICAL_SECTION_DEBUG = record
    Type_18: Word;
    CreatorBackTraceIndex: Word;
    CriticalSection: PRTL_CRITICAL_SECTION;
    ProcessLocksList: TLIST_ENTRY;
    EntryCount: DWORD;
    ContentionCount: DWORD;
    Spare: array[0..1] of DWORD;
  end;

  TRTL_CRITICAL_SECTION = record
    DebugInfo: PRTL_CRITICAL_SECTION_DEBUG;
    LockCount: Longint;
    RecursionCount: Longint;
    OwningThread: THandle;
    LockSemaphore: THandle;
    Reserved: DWORD;
  end;

  PPEB_FREE_BLOCK = ^TPEB_FREE_BLOCK;
  TPEB_FREE_BLOCK = record
    Next: PPEB_FREE_BLOCK;
    Size: Cardinal;
  end;

  PPeb = ^TPeb;
  TPeb = packed record
    InheritedAddressSpace: Byte;
    ReadImageFileExecOptions: Byte;
    BeingDebugged: Byte;
    SpareBool: Byte;
    Mutant: Pointer;
    ImageBaseAddress: Pointer;
    Ldr: PPEB_LDR_DATA;
    ProcessParameters: PRTL_USER_PROCESS_PARAMETERS;
    SubSystemData: Pointer;
    ProcessHeap: Pointer;
    FastPebLock: PRTL_CRITICAL_SECTION;
    FastPebLockRoutine: Pointer;
    FastPebUnlockRoutine: Pointer;
    EnvironmentUpdateCount: Cardinal;
    KernelCallbackTable: Pointer;
    SystemReserved: Dword;
    AtlThunkSListPtr32: Dword;
    FreeList: PPEB_FREE_BLOCK;
    TlsExpansionCounter: Cardinal;
    TlsBitmap: Pointer;
    TlsBitmapBits: array[0..1] of Cardinal;
    ReadOnlySharedMemoryBase: Pointer;
    ReadOnlySharedMemoryHeap: Pointer;
    ReadOnlyStaticServerData: PPointer;
    AnsiCodePageData: Pointer;
    OemCodePageData: Pointer;
    UnicodeCaseTableData: Pointer;
    NumberOfProcessors: Cardinal;
    NtGlobalFlag: Cardinal;
    Gap1: Dword; //间隙
    CriticalSectionTimeout: Int64;
    HeapSegmentReserve: DWORD;
    HeapSegmentCommit: DWORD;
    HeapDeCommitTotalFreeThreshold: DWORD;
    HeapDeCommitFreeBlockThreshold: DWORD;
    NumberOfHeaps: DWORD;
    MaximumNumberOfHeaps: DWORD;
    ProcessHeaps: PPointer;
    GdiSharedHandleTable: Pointer;
    ProcessStarterHelper: Pointer;
    GdiDCAttributeList: DWORD;
    LoaderLock: Pointer;
    OSMajorVersion: DWORD;
    OSMinorVersion: DWORD;
    OSBuildNumber: word;
    OSCSDVersion: word;
    OSPlatformId: DWORD;
    ImageSubsystem: DWORD;
    ImageSubsystemMajorVersion: DWORD;
    ImageSubsystemMinorVersion: DWORD;
    ImageProcessAffinityMask: DWORD;
    GdiHandleBuffer: array[0..33] of Dword;
    PostProcessInitRoutine: Pointer;
    TlsExpansionBitmap: Pointer;
    TlsExpansionBitmapBits: array[0..31] of Dword;
    SessionId: DWORD;
    AppCompatInfo: Int64;
    AppCompatFlagsUser: Int64;
    pShimData: Pointer;
    AppCompInfo: Pointer;
    CSDVersion: TUNICODE_STRING;
    ActivationContextData: Pointer;
    ProcessAssemblyStorageMap: Pointer;
    SystemDefaultActivationContextData: Pointer;
    SystemAssemblyStorageMap: Pointer;
    MinimumStackCommit: DWORD;
    Gap2: Dword; //间隙
  end;

  PHANDLE_TRACE_DB_ENTRY = ^THANDLE_TRACE_DB_ENTRY;
  THANDLE_TRACE_DB_ENTRY = packed record //size : $50 byte
    ClientId: TCLIENT_ID;
    Handle: Pointer;
    dType: Dword;
    StackTrace: array[0..15] of Pointer;
  end;

  PHANDLE_TRACE_DEBUG_INFO = ^THANDLE_TRACE_DEBUG_INFO;
  THANDLE_TRACE_DEBUG_INFO = packed record //size : $50004 byte
    CurrentStackIndex: Dword;
    TraceDb: array[0..4095] of THANDLE_TRACE_DB_ENTRY;
  end;

  PHANDLE_TABLE = ^THANDLE_TABLE;
  THANDLE_TABLE = packed record
    TableCode: Dword;
    QuotaProcess: PEPROCESS;
    UniqueProcessId: Pointer;
    HandleTableLock: array[0..3] of TEX_PUSH_LOCK;
    HandleTableList: TLIST_ENTRY;
    HandleContentionEvent: TEX_PUSH_LOCK;
    DebugInfo: PHANDLE_TRACE_DEBUG_INFO;
    ExtraInfoPages: Dword;
    FirstFree: Dword;
    LastFree: Dword;
    NextHandleNeedingPool: Dword;
    HandleCount: Dword;
    Flags: Dword;
  end;

  PEX_FAST_REF = ^TEX_FAST_REF;
  TEX_FAST_REF = packed record
    case Integer of
      0: (pObject: Pointer);
      1: (Value: DWORD);
  end;

  PFAST_MUTEX = ^TFAST_MUTEX;
  TFAST_MUTEX = packed record
    Count: Cardinal;
    Owner: PKTHREAD;
    Contention: DWORD;
    Event: TKEVENT;
    OldIrql: DWORD;
  end;

  POWNER_ENTRY = ^TOWNER_ENTRY;
  TOWNER_ENTRY = packed record
    OwnerThread: Dword;
    case Integer of
      0: (OwnerCount: DWORD);
      1: (TableSize: DWORD);
  end;

  PERESOURCE = ^TERESOURCE;
  TERESOURCE = packed record
    SystemResourcesList: TLIST_ENTRY;
    OwnerTable: POWNER_ENTRY;
    ActiveCount: word;
    Flag: word;
    SharedWaiters: PKSEMAPHORE;
    ExclusiveWaiters: PKEVENT;
    OwnerThreads: array[0..1] of TOWNER_ENTRY;
    ContentionCount: Dword;
    NumberOfSharedWaiters: word;
    NumberOfExclusiveWaiters: word;
    Address: Pointer;
    CreatorBackTraceIndex: Dword;
    SpinLock: Dword;
  end;

  PSID_AND_ATTRIBUTES = ^TSID_AND_ATTRIBUTES;
  TSID_AND_ATTRIBUTES = packed record
    Sid: Pointer;
    Attributes: dword;
  end;

  PPS_JOB_TOKEN_FILTER = ^TPS_JOB_TOKEN_FILTER;
  TPS_JOB_TOKEN_FILTER = packed record
    CapturedSidCount: Cardinal;
    CapturedSids: PSID_AND_ATTRIBUTES;
    CapturedSidsLength: Cardinal;
    CapturedGroupCount: Cardinal;
    CapturedGroups: PSID_AND_ATTRIBUTES;
    CapturedGroupsLength: Cardinal;
    CapturedPrivilegeCount: Cardinal;
    CapturedPrivileges: PSID_AND_ATTRIBUTES;
    CapturedPrivilegesLength: Cardinal;
  end;

  PIO_COUNTERS = ^TIO_COUNTERS;
  TIO_COUNTERS = packed record
    ReadOperationCount: Int64;
    WriteOperationCount: Int64;
    OtherOperationCount: Int64;
    ReadTransferCount: Int64;
    WriteTransferCount: Int64;
    OtherTransferCount: Int64;
  end;

  PEJOB = ^TEJOB;
  TEJOB = packed record //size: $180 bytes
    Event: TKEVENT;
    JobLinks: TLIST_ENTRY;
    ProcessListHead: TLIST_ENTRY;
    JobLock: TERESOURCE;
    TotalUserTime: Int64;
    TotalKernelTime: Int64;
    ThisPeriodTotalUserTime: Int64;
    ThisPeriodTotalKernelTime: Int64;
    TotalPageFaultCount: Dword;
    TotalProcesses: Dword;
    ActiveProcesses: Dword;
    TotalTerminatedProcesses: Dword;
    PerProcessUserTimeLimit: Int64;
    PerJobUserTimeLimit: Int64;
    LimitFlags: Dword;
    MinimumWorkingSetSize: Dword;
    MaximumWorkingSetSize: Dword;
    ActiveProcessLimit: Dword;
    Affinity: Dword;
    PriorityClass: Byte;
    UIRestrictionsClass: Dword;
    SecurityLimitFlags: Dword;
    Token: Pointer;
    Filter: PPS_JOB_TOKEN_FILTER;
    EndOfJobTimeAction: Dword;
    CompletionPort: Pointer;
    CompletionKey: Pointer;
    SessionId: Dword;
    SchedulingClass: Dword;
    ReadOperationCount: Int64;
    WriteOperationCount: Int64;
    OtherOperationCount: Int64;
    ReadTransferCount: Int64;
    WriteTransferCount: Int64;
    OtherTransferCount: Int64;
    IoInfo: TIO_COUNTERS;
    ProcessMemoryLimit: Dword;
    JobMemoryLimit: Dword;
    PeakProcessMemoryUsed: Dword;
    PeakJobMemoryUsed: Dword;
    CurrentJobMemoryUsed: Dword;
    MemoryLimitsLock: TFAST_MUTEX;
    JobSetLinks: TLIST_ENTRY;
    MemberLevel: Dword;
    JobFlags: Dword;
  end;

  PEPROCESS_QUOTA_ENTRY = ^TEPROCESS_QUOTA_ENTRY;
  TEPROCESS_QUOTA_ENTRY = packed record
    Usage: DWORD;
    Limit: DWORD;
    Peak: DWORD;
    Return: DWORD;
  end;

  PEPROCESS_QUOTA_BLOCK = ^TEPROCESS_QUOTA_BLOCK;
  TEPROCESS_QUOTA_BLOCK = packed record
    QuotaEntry: array[0..3] of TEPROCESS_QUOTA_ENTRY;
    QuotaList: TLIST_ENTRY;
    ReferenceCount: Cardinal;
    ProcessCount: Cardinal;
  end;

  PPROCESS_WS_WATCH_INFORMATION = ^TPROCESS_WS_WATCH_INFORMATION;
  TPROCESS_WS_WATCH_INFORMATION = packed record
    FaultingPc: Pointer;
    FaultingVa: Pointer;
  end;

  PPAGEFAULT_HISTORY = ^TPAGEFAULT_HISTORY;
  TPAGEFAULT_HISTORY = packed record
    CurrentIndex: DWORD;
    MaxIndex: DWORD;
    SpinLock: DWORD;
    Reserved: Pointer;
    WatchInfo: TPROCESS_WS_WATCH_INFORMATION;
  end;

  PHARDWARE_PTE_X86 = ^THARDWARE_PTE_X86;
  THARDWARE_PTE_X86 = packed record
    Bit: Dword;
   // Valid: Bitfield Pos 0, 1 Bit
   // Write: Bitfield Pos 1, 1 Bit
   // Owner: Bitfield Pos 2, 1 Bit
   // WriteThrough: Bitfield Pos 3, 1 Bit
   // CacheDisable: Bitfield Pos 4, 1 Bit
   // Accessed: Bitfield Pos 5, 1 Bit
   // Dirty: Bitfield Pos 6, 1 Bit
   // LargePage: Bitfield Pos 7, 1 Bit
   // Global: Bitfield Pos 8, 1 Bit
   // CopyOnWrite: Bitfield Pos 9, 1 Bit
   // Prototype: Bitfield Pos 10, 1 Bit
   // reserved: Bitfield Pos 11, 1 Bit
   // PageFrameNumber: Bitfield Pos 12, 20 Bits
  end;

  POBJECT_NAME_INFORMATION = ^TOBJECT_NAME_INFORMATION;
  TOBJECT_NAME_INFORMATION = packed record
    Name: TUNICODE_STRING;
  end;

  PSE_AUDIT_PROCESS_CREATION_INFO = ^TSE_AUDIT_PROCESS_CREATION_INFO;
  TSE_AUDIT_PROCESS_CREATION_INFO = packed record
    ImageFileName: POBJECT_NAME_INFORMATION;
  end;

  PMMSUPPORT_FLAGS = ^TMMSUPPORT_FLAGS;
  TMMSUPPORT_FLAGS = packed record
    Bit: DWORD;
   //SessionSpace     : Bitfield Pos 0, 1 Bit
   //BeingTrimmed     : Bitfield Pos 1, 1 Bit
   //SessionLeader    : Bitfield Pos 2, 1 Bit
   //TrimHard         : Bitfield Pos 3, 1 Bit
   //WorkingSetHard   : Bitfield Pos 4, 1 Bit
   //AddressSpaceBeingDeleted : Bitfield Pos 5, 1 Bit
   //Available        : Bitfield Pos 6, 10 Bits
   //AllowWorkingSetAdjustment : Bitfield Pos 16, 8 Bits
   //MemoryPriority   : Bitfield Pos 24, 8 Bits
  end;

  PMMWSL = ^TMMWSL;
  TMMWSL = packed record
    //MS Undefined
  end;

  PMMSUPPORT = ^TMMSUPPORT;
  TMMSUPPORT = packed record
    LastTrimTime: Int64;
    Flags: TMMSUPPORT_FLAGS;
    PageFaultCount: Dword;
    PeakWorkingSetSize: Dword;
    WorkingSetSize: Dword;
    MinimumWorkingSetSize: Dword;
    MaximumWorkingSetSize: Dword;
    VmWorkingSetList: PMMWSL;
    WorkingSetExpansionLinks: TLIST_ENTRY;
    Claim: Dword;
    NextEstimationSlot: Dword;
    NextAgingSlot: Dword;
    EstimatedAvailable: Dword;
    GrowthSinceLastEstimate: Dword;
  end;

  TEPROCESS = packed record
    Pcb: TKPROCESS;
    ProcessLock: TEX_PUSH_LOCK;
    CreateTime: Int64;
    ExitTime: Int64;
    RundownProtect: TEX_RUNDOWN_REF;
    UniqueProcessId: Integer;
    ActiveProcessLinks: TLIST_ENTRY;
    QuotaUsage: array[0..2] of Cardinal;
    QuotaPeak: array[0..2] of Cardinal;
    CommitCharge: Cardinal;
    PeakVirtualSize: Cardinal;
    VirtualSize: Cardinal;
    SessionProcessLinks: TLIST_ENTRY;
    DebugPort: Pointer;
    ExceptionPort: Pointer;
    ObjectTable: PHANDLE_TABLE;
    Token: TEX_FAST_REF;
    WorkingSetLock: TFAST_MUTEX;
    WorkingSetPage: Cardinal;
    AddressCreationLock: TFAST_MUTEX;
    HyperSpaceLock: Cardinal;
    ForkInProgress: PEThread;
    HardwareTrigger: Cardinal;
    VadRoot: Pointer;
    VadHint: Pointer;
    CloneRoot: Pointer;
    NumberOfPrivatePages: Cardinal;
    NumberOfLockedPages: Cardinal;
    Win32Process: Pointer;
    Job: PEJOB;
    SectionObject: Pointer;
    SectionBaseAddress: Pointer;
    QuotaBlock: PEPROCESS_QUOTA_BLOCK;
    WorkingSetWatch: PPAGEFAULT_HISTORY;
    Win32WindowStation: Pointer;
    InheritedFromUniqueProcessId: Cardinal;
    LdtInformation: Pointer;
    VadFreeHint: Pointer;
    VdmObjects: Pointer;
    DeviceMap: Pointer;
    PhysicalVadList: TLIST_ENTRY;
    Union1: record case integer of
        0: (PageDirectoryPte: THARDWARE_PTE_X86);
        1: (Filler: Int64);
    end;
    Session: Pointer;
    ImageFileName: array[0..$F] of Char;
    JobLinks: TLIST_ENTRY;
    LockedPagesList: Pointer;
    ThreadListHead: TLIST_ENTRY;
    SecurityPort: Pointer;
    PaeTop: Pointer;
    ActiveThreads: Cardinal;
    GrantedAccess: Cardinal;
    DefaultHardErrorProcessing: Cardinal;
    LastThreadExitStatus: Dword;
    Peb: PPeb;
    PrefetchTrace: TEX_FAST_REF;
    ReadOperationCount: Int64;
    WriteOperationCount: Int64;
    OtherOperationCount: Int64;
    ReadTransferCount: Int64;
    WriteTransferCount: Int64;
    OtherTransferCount: Int64;
    CommitChargeLimit: Cardinal;
    CommitChargePeak: Cardinal;
    AweInfo: Pointer;
    SeAuditProcessCreationInfo: TSE_AUDIT_PROCESS_CREATION_INFO;
    Vm: TMMSUPPORT;
    LastFaultCount: Cardinal;
    ModifiedPageCount: Cardinal;
    NumberOfVads: Cardinal;
    JobStatus: Cardinal;
    Flags: Cardinal;
    ExitStatus: DWORD;
    NextPageColor: Word;
    Union2: record case integer of
        0: (SSV: record SubSystemMinorVersion: Byte; SubSystemMajorVersion: Byte; end);
        1: (SubSystemVersion: Word);
    end;
    SubSystemVersion: Word;
    PriorityClass: Byte;
    WorkingSetAcquiredUnsafe: Byte;
    Cookie: Cardinal;
    Gap: DWORD; //间隙
  end;

  NTSTATUS = DWORD;

function NT_SUCCESS(Status: DWORD): Bool;

implementation


function NT_SUCCESS(Status: NTSTATUS): Bool;
begin
  Result := Integer(Status) >= 0;
end;

function CTL_CODE(DeviceType, Func, Method, Access: DWORD): DWORD;
begin
  result := (((DeviceType) shl 16) or ((Access) shl 14) or ((Func) shl 2) or (Method));
end;

end.
上传的附件 uWindowsKernelStruct.rar