Kinda curious why you have "unknowns" in a documented structure.
On 30-Jul-08, at 7:17 PM, tkreuzer(a)svn.reactos.org wrote:
Author: tkreuzer
Date: Wed Jul 30 21:16:59 2008
New Revision: 34970
URL:
http://svn.reactos.org/svn/reactos?rev=34970&view=rev
Log:
- update KPCR and KIPCR
- add KeGetPcr() and update KeGetCurrentProcessorNumber
Modified:
branches/ros-amd64-bringup/reactos/include/ddk/winddk.h
branches/ros-amd64-bringup/reactos/include/ndk/amd64/ketypes.h
Modified: branches/ros-amd64-bringup/reactos/include/ddk/winddk.h
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/inclu…
=
=
=
=
=
=
=
=
======================================================================
--- branches/ros-amd64-bringup/reactos/include/ddk/winddk.h
[iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/include/ddk/winddk.h
[iso-8859-1] Wed Jul 30 21:16:59 2008
@@ -5516,23 +5516,38 @@
typedef struct _KPCR
{
- NT_TIB NtTib;
- struct _KPRCB *CurrentPrcb;
- ULONG64 SavedRcx;
- ULONG64 SavedR11;
+ union
+ {
+ NT_TIB NtTib;
+ struct
+ {
+ union _KGDTENTRY64 *GdtBase;
+ struct _KTSS64 *TssBase;
+ ULONG64 UserRsp;
+ struct _KPCR *Self;
+ struct _KPRCB *CurrentPrcb;
+ PKSPIN_LOCK_QUEUE LockArray;
+ PVOID Used_Self;
+ };
+ };
+ union _KIDTENTRY64 *IdtBase;
+ ULONG64 Unused[2];
KIRQL Irql;
UCHAR SecondLevelCacheAssociativity;
- UCHAR Number;
+ UCHAR ObsoleteNumber;
UCHAR Fill0;
- ULONG Irr;
- ULONG IrrActive;
- ULONG Idr;
+ ULONG Unused0[3];
USHORT MajorVersion;
USHORT MinorVersion;
ULONG StallScaleFactor;
- union _KIDTENTRY64 *IdtBase;
- union _KGDTENTRY64 *GdtBase;
- struct _KTSS64 *TssBase;
+ PVOID Unused1[3];
+ ULONG KernelReserved[15];
+ ULONG SecondLevelCacheSize;
+ ULONG HalReserved[16];
+ ULONG Unused2;
+ PVOID KdVersionBlock;
+ PVOID Unused3;
+ ULONG PcrAlign1[24];
} KPCR, *PKPCR;
typedef struct _KFLOATING_SAVE {
@@ -5552,10 +5567,17 @@
VOID);
FORCEINLINE
+PKPCR
+KeGetPcr(VOID)
+{
+ return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
+}
+
+FORCEINLINE
ULONG
KeGetCurrentProcessorNumber(VOID)
{
- return (ULONG)__readgsbyte(FIELD_OFFSET(KPCR, Number));
+ return (ULONG)__readgsword(0x184);
}
#elif defined(__PowerPC__)
Modified: branches/ros-amd64-bringup/reactos/include/ndk/amd64/
ketypes.h
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/inclu…
=
=
=
=
=
=
=
=
======================================================================
--- branches/ros-amd64-bringup/reactos/include/ndk/amd64/ketypes.h
[iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/include/ndk/amd64/ketypes.h
[iso-8859-1] Wed Jul 30 21:16:59 2008
@@ -635,41 +635,42 @@
NT_TIB NtTib;
struct
{
- struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList;
- PVOID Used_StackBase;
- PVOID PerfGlobalGroupMask;
- PVOID TssCopy;
- ULONG ContextSwitches;
- KAFFINITY SetMemberCopy;
+ union _KGDTENTRY64 *GdtBase;
+ struct _KTSS64 *TssBase;
+ ULONG64 UserRsp;
+ struct _KPCR *Self;
+ struct _KPRCB *CurrentPrcb;
+ PKSPIN_LOCK_QUEUE LockArray;
PVOID Used_Self;
};
};
- struct _KPCR *Self;
- struct _KPRCB *Prcb;
+ union _KIDTENTRY64 *IdtBase;
+ ULONG64 Unused[2];
KIRQL Irql;
- ULONG IRR;
- ULONG IrrActive;
- ULONG IDR;
- PVOID KdVersionBlock;
- PKIDTENTRY IDT;
- PKGDTENTRY GDT;
- struct _KTSS *TSS;
+ UCHAR SecondLevelCacheAssociativity;
+ UCHAR ObsoleteNumber;
+ UCHAR Fill0;
+ ULONG Unused0[3];
USHORT MajorVersion;
USHORT MinorVersion;
- KAFFINITY SetMember;
ULONG StallScaleFactor;
- UCHAR SparedUnused;
- UCHAR Number;
- UCHAR Reserved;
- UCHAR L2CacheAssociativity;
- ULONG VdmAlert;
- ULONG KernelReserved[14];
+ PVOID Unused1[3];
+ ULONG KernelReserved[15];
ULONG SecondLevelCacheSize;
ULONG HalReserved[16];
- ULONG InterruptMode;
- UCHAR Spare1;
- ULONG KernelReserved2[17];
- KPRCB PrcbData;
+ ULONG Unused2;
+ ULONG Fill1;
+ PVOID KdVersionBlock; // 0x108
+ PVOID Unused3;
+ ULONG PcrAlign1[24];
+
+ ULONG Unknown1; // 0x178
+ ULONG Unknown2;
+ ULONG Unknown3;
+ USHORT CpuNumber; // 0x184
+ // hack:
+ ULONG ContextSwitches;
+
} KIPCR, *PKIPCR;
#pragma pack(pop)