diff --git a/sdk/include/ndk/arm64/ketypes.h b/sdk/include/ndk/arm64/ketypes.h index 11ed9e9d5b8..2f65267fd7b 100644 --- a/sdk/include/ndk/arm64/ketypes.h +++ b/sdk/include/ndk/arm64/ketypes.h @@ -157,13 +157,337 @@ typedef struct _TRAPFRAME_LOG_ENTRY ULONG Reserved1; } TRAPFRAME_LOG_ENTRY, *PTRAPFRAME_LOG_ENTRY; + +// +// Special Registers Structure (outside of CONTEXT) +// Based on WoA symbols +// +typedef struct _KSPECIAL_REGISTERS +{ + ULONG64 Elr_El1; + UINT32 Spsr_El1; + ULONG64 Tpidr_El0; + ULONG64 Tpidrro_El0; + ULONG64 Tpidr_El1; + ULONG64 KernelBvr[8]; + ULONG KernelBcr[8]; + ULONG64 KernelWvr[2]; + ULONG KernelWcr[2]; +} KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS; + +// +// ARM64 Architecture State +// Based on WoA symbols +// +typedef struct _KARM64_ARCH_STATE +{ + ULONG64 Midr_El1; + ULONG64 Sctlr_El1; + ULONG64 Actlr_El1; + ULONG64 Cpacr_El1; + ULONG64 Tcr_El1; + ULONG64 Ttbr0_El1; + ULONG64 Ttbr1_El1; + ULONG64 Esr_El1; + ULONG64 Far_El1; + ULONG64 Pmcr_El0; + ULONG64 Pmcntenset_El0; + ULONG64 Pmccntr_El0; + ULONG64 Pmxevcntr_El0[31]; + ULONG64 Pmxevtyper_El0[31]; + ULONG64 Pmovsclr_El0; + ULONG64 Pmselr_El0; + ULONG64 Pmuserenr_El0; + ULONG64 Mair_El1; + ULONG64 Vbar_El1; +} KARM64_ARCH_STATE, *PKARM64_ARCH_STATE; + +typedef struct _KPROCESSOR_STATE +{ + KSPECIAL_REGISTERS SpecialRegisters; // 0 + KARM64_ARCH_STATE ArchState; // 160 + CONTEXT ContextFrame; // 800 +} KPROCESSOR_STATE, *PKPROCESSOR_STATE; + + // // Processor Region Control Block // Based on WoA // typedef struct _KPRCB { - ULONG dummy; + UCHAR LegacyNumber; + UCHAR ReservedMustBeZero; + UCHAR IdleHalt; + PKTHREAD CurrentThread; + PKTHREAD NextThread; + PKTHREAD IdleThread; + UCHAR NestingLevel; + UCHAR ClockOwner; + union + { + UCHAR PendingTickFlags; + struct + { + UCHAR PendingTick : 1; + UCHAR PendingBackupTick : 1; + }; + }; + UCHAR PrcbPad00[1]; + ULONG Number; + ULONG PrcbLock; + PCHAR PriorityState; + KPROCESSOR_STATE ProcessorState; + USHORT ProcessorModel; + USHORT ProcessorRevision; + ULONG MHz; + UINT64 CycleCounterFrequency; + ULONG HalReserved[15]; + USHORT MinorVersion; + USHORT MajorVersion; + UCHAR BuildType; + UCHAR CpuVendor; + UCHAR CoresPerPhysicalProcessor; + UCHAR LogicalProcessorsPerCore; + PVOID AcpiReserved; + ULONG GroupSetMember; + UCHAR Group; + UCHAR GroupIndex; + //UCHAR _PADDING1_[0x62]; + KSPIN_LOCK_QUEUE DECLSPEC_ALIGN(128) LockQueue[17]; + UCHAR ProcessorVendorString[2]; + UCHAR _PADDING2_[0x2]; + ULONG FeatureBits; + ULONG MaxBreakpoints; + ULONG MaxWatchpoints; + PCONTEXT Context; + ULONG ContextFlagsInit; + //UCHAR _PADDING3_[0x60]; + PP_LOOKASIDE_LIST DECLSPEC_ALIGN(128) PPLookasideList[16]; + LONG PacketBarrier; + SINGLE_LIST_ENTRY DeferredReadyListHead; + LONG MmPageFaultCount; + LONG MmCopyOnWriteCount; + LONG MmTransitionCount; + LONG MmDemandZeroCount; + LONG MmPageReadCount; + LONG MmPageReadIoCount; + LONG MmDirtyPagesWriteCount; + LONG MmDirtyWriteIoCount; + LONG MmMappedPagesWriteCount; + LONG MmMappedWriteIoCount; + ULONG KeSystemCalls; + ULONG KeContextSwitches; + ULONG CcFastReadNoWait; + ULONG CcFastReadWait; + ULONG CcFastReadNotPossible; + ULONG CcCopyReadNoWait; + ULONG CcCopyReadWait; + ULONG CcCopyReadNoWaitMiss; + LONG LookasideIrpFloat; + LONG IoReadOperationCount; + LONG IoWriteOperationCount; + LONG IoOtherOperationCount; + LARGE_INTEGER IoReadTransferCount; + LARGE_INTEGER IoWriteTransferCount; + LARGE_INTEGER IoOtherTransferCount; + UCHAR _PADDING4_[0x8]; + struct _REQUEST_MAILBOX* Mailbox; + LONG TargetCount; + ULONG IpiFrozen; + ULONG RequestSummary; + KDPC_DATA DpcData[2]; + PVOID DpcStack; + PVOID SpBase; + LONG MaximumDpcQueueDepth; + ULONG DpcRequestRate; + ULONG MinimumDpcRate; + ULONG DpcLastCount; + UCHAR ThreadDpcEnable; + UCHAR QuantumEnd; + UCHAR DpcRoutineActive; + UCHAR IdleSchedule; +#if (NTDDI_VERSION >= NTDDI_WIN8) + union + { + LONG DpcRequestSummary; + SHORT DpcRequestSlot[2]; + struct + { + SHORT NormalDpcState; + SHORT ThreadDpcState; + }; + struct + { + ULONG DpcNormalProcessingActive : 1; + ULONG DpcNormalProcessingRequested : 1; + ULONG DpcNormalThreadSignal : 1; + ULONG DpcNormalTimerExpiration : 1; + ULONG DpcNormalDpcPresent : 1; + ULONG DpcNormalLocalInterrupt : 1; + ULONG DpcNormalSpare : 10; + ULONG DpcThreadActive : 1; + ULONG DpcThreadRequested : 1; + ULONG DpcThreadSpare : 14; + }; + }; +#else + LONG DpcSetEventRequest; +#endif + ULONG LastTimerHand; + ULONG LastTick; + ULONG ClockInterrupts; + ULONG ReadyScanTick; + ULONG PrcbPad10[1]; + ULONG InterruptLastCount; + ULONG InterruptRate; + UCHAR _PADDING5_[0x4]; +#if (NTDDI_VERSION >= NTDDI_LONGHORN) + KGATE DpcGate; +#else + KEVENT DpcEvent; +#endif + ULONG MPAffinity; + KDPC CallDpc; + LONG ClockKeepAlive; + UCHAR ClockCheckSlot; + UCHAR ClockPollCycle; + //UCHAR _PADDING6_[0x2]; + LONG DpcWatchdogPeriod; + LONG DpcWatchdogCount; + LONG KeSpinLockOrdering; + UCHAR _PADDING7_[0x38]; + LIST_ENTRY WaitListHead; + ULONG WaitLock; + ULONG ReadySummary; + LONG AffinitizedSelectionMask; + ULONG QueueIndex; + KDPC TimerExpirationDpc; + //RTL_RB_TREE ScbQueue; + LIST_ENTRY ScbList; + UCHAR _PADDING8_[0x38]; + LIST_ENTRY DispatcherReadyListHead[32]; + ULONG InterruptCount; + ULONG KernelTime; + ULONG UserTime; + ULONG DpcTime; + ULONG InterruptTime; + ULONG AdjustDpcThreshold; + UCHAR SkipTick; + UCHAR DebuggerSavedIRQL; + UCHAR PollSlot; + UCHAR GroupSchedulingOverQuota; + ULONG DpcTimeCount; + ULONG DpcTimeLimit; + ULONG PeriodicCount; + ULONG PeriodicBias; + ULONG AvailableTime; + ULONG ScbOffset; + ULONG KeExceptionDispatchCount; + struct _KNODE* ParentNode; + UCHAR _PADDING9_[0x4]; + ULONG64 AffinitizedCycles; + ULONG64 StartCycles; + ULONG64 GenerationTarget; + ULONG64 CycleCounterHigh; +#if (NTDDI_VERSION >= NTDDI_WIN8) + KENTROPY_TIMING_STATE EntropyTimingState; +#endif /* (NTDDI_VERSION >= NTDDI_WIN8) */ + LONG MmSpinLockOrdering; + ULONG PageColor; + ULONG NodeColor; + ULONG NodeShiftedColor; + ULONG SecondaryColorMask; + ULONG64 CycleTime; + UCHAR _PADDING10_[0x58]; + ULONG CcFastMdlReadNoWait; + ULONG CcFastMdlReadWait; + ULONG CcFastMdlReadNotPossible; + ULONG CcMapDataNoWait; + ULONG CcMapDataWait; + ULONG CcPinMappedDataCount; + ULONG CcPinReadNoWait; + ULONG CcPinReadWait; + ULONG CcMdlReadNoWait; + ULONG CcMdlReadWait; + ULONG CcLazyWriteHotSpots; + ULONG CcLazyWriteIos; + ULONG CcLazyWritePages; + ULONG CcDataFlushes; + ULONG CcDataPages; + ULONG CcLostDelayedWrites; + ULONG CcFastReadResourceMiss; + ULONG CcCopyReadWaitMiss; + ULONG CcFastMdlReadResourceMiss; + ULONG CcMapDataNoWaitMiss; + ULONG CcMapDataWaitMiss; + ULONG CcPinReadNoWaitMiss; + ULONG CcPinReadWaitMiss; + ULONG CcMdlReadNoWaitMiss; + ULONG CcMdlReadWaitMiss; + ULONG CcReadAheadIos; + LONG MmCacheTransitionCount; + LONG MmCacheReadCount; + LONG MmCacheIoCount; + UCHAR _PADDING11_[0xC]; + PROCESSOR_POWER_STATE PowerState; + ULONG SharedReadyQueueOffset; + ULONG PrcbPad15[2]; + ULONG DeviceInterrupts; + PVOID IsrDpcStats; + ULONG KeAlignmentFixupCount; + KDPC DpcWatchdogDpc; + KTIMER DpcWatchdogTimer; + SLIST_HEADER InterruptObjectPool; + //KAFFINITY_EX PackageProcessorSet; + UCHAR _PADDING12_[0x4]; + ULONG SharedReadyQueueMask; + struct _KSHARED_READY_QUEUE* SharedReadyQueue; + ULONG CoreProcessorSet; + ULONG ScanSiblingMask; + ULONG LLCMask; + ULONG CacheProcessorMask[5]; + ULONG ScanSiblingIndex; + CACHE_DESCRIPTOR Cache[6]; + UCHAR CacheCount; + UCHAR PrcbPad20[3]; + ULONG CachedCommit; + ULONG CachedResidentAvailable; + PVOID HyperPte; + PVOID WheaInfo; + PVOID EtwSupport; + UCHAR _PADDING13_[0x74]; + SYNCH_COUNTERS SynchCounters; + //FILESYSTEM_DISK_COUNTERS FsCounters; + UCHAR _PADDING14_[0x8]; + ULONG PanicStackBase; + PVOID IsrStack; + ULONG PteBitCache; + ULONG PteBitOffset; + KTIMER_TABLE TimerTable; + GENERAL_LOOKASIDE_POOL PPNxPagedLookasideList[32]; + GENERAL_LOOKASIDE_POOL PPNPagedLookasideList[32]; + GENERAL_LOOKASIDE_POOL PPPagedLookasideList[32]; + SINGLE_LIST_ENTRY AbSelfIoBoostsList; + SINGLE_LIST_ENTRY AbPropagateBoostsList; + KDPC AbDpc; + UCHAR _PADDING15_[0x58]; + //REQUEST_MAILBOX RequestMailbox[1]; + + // FIXME: Oldstyle stuff +#if (NTDDI_VERSION < NTDDI_WIN8) // FIXME + UCHAR CpuType; + volatile UCHAR DpcInterruptRequested; + volatile UCHAR DpcThreadRequested; + volatile UCHAR DpcThreadActive; + volatile ULONG TimerHand; + volatile ULONG TimerRequest; + ULONG DebugDpcTime; + LONG Sleeping; + KAFFINITY SetMember; + CHAR VendorString[13]; +#endif + } KPRCB, *PKPRCB; // @@ -218,58 +542,6 @@ typedef struct _KIPCR PVOID PcrAlign[15]; KPRCB Prcb; } KIPCR, *PKIPCR; - -// -// Special Registers Structure (outside of CONTEXT) -// Based on WoA symbols -// -typedef struct _KSPECIAL_REGISTERS -{ - ULONG64 Elr_El1; - UINT32 Spsr_El1; - ULONG64 Tpidr_El0; - ULONG64 Tpidrro_El0; - ULONG64 Tpidr_El1; - ULONG64 KernelBvr[8]; - ULONG KernelBcr[8]; - ULONG64 KernelWvr[2]; - ULONG KernelWcr[2]; -} KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS; - -// -// ARM64 Architecture State -// Based on WoA symbols -// -typedef struct _KARM64_ARCH_STATE -{ - ULONG64 Midr_El1; - ULONG64 Sctlr_El1; - ULONG64 Actlr_El1; - ULONG64 Cpacr_El1; - ULONG64 Tcr_El1; - ULONG64 Ttbr0_El1; - ULONG64 Ttbr1_El1; - ULONG64 Esr_El1; - ULONG64 Far_El1; - ULONG64 Pmcr_El0; - ULONG64 Pmcntenset_El0; - ULONG64 Pmccntr_El0; - ULONG64 Pmxevcntr_El0[31]; - ULONG64 Pmxevtyper_El0[31]; - ULONG64 Pmovsclr_El0; - ULONG64 Pmselr_El0; - ULONG64 Pmuserenr_El0; - ULONG64 Mair_El1; - ULONG64 Vbar_El1; -} KARM64_ARCH_STATE, *PKARM64_ARCH_STATE; - -typedef struct _KPROCESSOR_STATE -{ - KSPECIAL_REGISTERS SpecialRegisters; // 0 - KARM64_ARCH_STATE ArchState; // 160 - CONTEXT ContextFrame; // 800 -} KPROCESSOR_STATE, *PKPROCESSOR_STATE; - // // Macro to get current KPRCB // diff --git a/sdk/include/xdk/arm64/ke.h b/sdk/include/xdk/arm64/ke.h index e275f0e5a13..430b585c0e0 100644 --- a/sdk/include/xdk/arm64/ke.h +++ b/sdk/include/xdk/arm64/ke.h @@ -46,6 +46,64 @@ $if (_WDMDDK_) #define EXCEPTION_WRITE_FAULT 1 #define EXCEPTION_EXECUTE_FAULT 8 + + + +#define PCR_MINOR_VERSION 1 +#define PCR_MAJOR_VERSION 1 +/* this is just ARM32 KPCR, it's a hack to move on*/ +typedef struct _KPCR +{ + _ANONYMOUS_UNION union + { + _ANONYMOUS_STRUCT struct + { + ULONG TibPad0[2]; + PVOID Spare1; + struct _KPCR *Self; + struct _KPRCB *CurrentPrcb; + PKSPIN_LOCK_QUEUE LockArray; + PVOID Used_Self; + }; + }; + KIRQL CurrentIrql; + UCHAR SecondLevelCacheAssociativity; + ULONG Unused0[3]; + USHORT MajorVersion; + USHORT MinorVersion; + ULONG StallScaleFactor; + PVOID Unused1[3]; + ULONG KernelReserved[15]; + ULONG SecondLevelCacheSize; + _ANONYMOUS_UNION union + { + USHORT SoftwareInterruptPending; // Software Interrupt Pending Flag + struct + { + UCHAR ApcInterrupt; // 0x01 if APC int pending + UCHAR DispatchInterrupt; // 0x01 if dispatch int pending + }; + }; + USHORT InterruptPad; + ULONG HalReserved[32]; + PVOID KdVersionBlock; + PVOID Unused3; + ULONG PcrAlign1[8]; +} KPCR, *PKPCR; + + +/* this isn't correct.. There's a far better way to do this then this static address. */ +#define KIP0PCRADDRESS 0xFFFFF78000001000ULL /* FIXME!!! */ +#define PCR ((KPCR * const)KIP0PCRADDRESS) + +FORCEINLINE +PKPCR +KeGetPcr( + VOID) +{ + return (PKPCR)(PCR); +} + NTSYSAPI PKTHREAD NTAPI