Compare commits
167 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
e5cf62cbfb
|
|||
|
10aaac59e4
|
|||
|
e3081c0cf5
|
|||
|
a0e707d35f
|
|||
|
042bf8520c
|
|||
|
30a6517109
|
|||
|
cba4c6fffb
|
|||
|
66f74be947
|
|||
|
0ccf20f0c9
|
|||
|
a2801bab2a
|
|||
|
9fcd81a507
|
|||
|
46fb492032
|
|||
|
b2e3a6afe0
|
|||
|
2389bcbed1
|
|||
|
213713b6d2
|
|||
|
c1bc4e4940
|
|||
|
b76a240fd8
|
|||
|
d164495d48
|
|||
|
2b7fc5b41d
|
|||
|
5cd52a4a12
|
|||
|
c58305022f
|
|||
|
d8f4f6bfd0
|
|||
|
ef4f9ba74d
|
|||
|
f9cbe78f84
|
|||
|
91946ae88f
|
|||
|
84d35e3c97
|
|||
|
9ef8c569d5
|
|||
|
7d9c338e2a
|
|||
|
2868db63ca
|
|||
|
9d5466594a
|
|||
|
119480382b
|
|||
|
3011df6f3c
|
|||
|
6e4f9dd5b1
|
|||
|
42d6426318
|
|||
|
757acb732e
|
|||
|
a54c4b48fb
|
|||
|
314012cad9
|
|||
|
b3ce1a8be8
|
|||
|
d6f925ebfd
|
|||
|
53a8b57a96
|
|||
|
77c1138f7d
|
|||
|
03f97d94ae
|
|||
|
8c6e06c973
|
|||
|
f2168e8c55
|
|||
|
6184e9e73d
|
|||
|
3d42ecf3d3
|
|||
|
c309bd769d
|
|||
|
79c9b2abef
|
|||
|
d9a4217f8b
|
|||
|
7b27b09748
|
|||
|
195c4a34ad
|
|||
|
e266b30e24
|
|||
|
28daa1718c
|
|||
|
b016ffd0d7
|
|||
|
8479c95e82
|
|||
|
f66e27cf83
|
|||
|
cf846d5abe
|
|||
|
08f26c6762
|
|||
|
19a1b11236
|
|||
|
d10b2cc2a1
|
|||
|
5475d970c4
|
|||
|
18d36b9f23
|
|||
|
fe02bb9214
|
|||
|
76b1807eee
|
|||
|
e431bccd44
|
|||
|
7526f90759
|
|||
|
c45b81d345
|
|||
|
95ec18a1de
|
|||
|
9faf19b57e
|
|||
|
bae43034a6
|
|||
|
156ae3efab
|
|||
|
854a8c8eef
|
|||
|
1fca2400a4
|
|||
|
ea1ad3c6b1
|
|||
|
cea860b008
|
|||
|
6560ca9b96
|
|||
|
ffcb2dbeda
|
|||
|
780bf92b40
|
|||
|
cc288f5417
|
|||
|
55eb3047e3
|
|||
|
8597e37650
|
|||
|
1c90218042
|
|||
|
f6f37494cd
|
|||
|
d1aa3cf481
|
|||
|
208684c3b4
|
|||
|
89681897d7
|
|||
|
e035666f7a
|
|||
|
df35bf8601
|
|||
|
15523e7d71
|
|||
|
f79c9023d8
|
|||
|
97703c7932
|
|||
|
2f5902119d
|
|||
|
7a10135731
|
|||
|
b0074637f8
|
|||
|
1a062ca05f
|
|||
|
c702152cca
|
|||
|
81c799e590
|
|||
|
cf0d7f0a40
|
|||
|
b0d2868f82
|
|||
|
32f0b747a1
|
|||
|
c57aa98923
|
|||
|
429e4ef6f1
|
|||
|
39928f2ef4
|
|||
|
51ec7e3bab
|
|||
|
f3ae70573c
|
|||
|
830f84ab26
|
|||
|
5a9df7ca86
|
|||
|
4bcdcda3a0
|
|||
|
7a27912dac
|
|||
|
cf4b91ac83
|
|||
|
36c3d92399
|
|||
|
6a2a35c008
|
|||
|
a9202f5b57
|
|||
|
4cbefe3a22
|
|||
|
3841ceaf5b
|
|||
|
e2eb784eef
|
|||
|
6078a5ba29
|
|||
|
663f5cd048
|
|||
|
5999906bf0
|
|||
|
1e0c1490fb
|
|||
|
5b0eebdb43
|
|||
|
9e64939de4
|
|||
|
b911670121
|
|||
|
d175a817a5
|
|||
|
b285bc7312
|
|||
|
c8cd198c4e
|
|||
|
95d45f5a0a
|
|||
|
766e4d9603
|
|||
|
a601fd0afa
|
|||
|
cc23e459e0
|
|||
|
d36b678ba1
|
|||
|
43265bcddb
|
|||
|
47d4069d6f
|
|||
|
904df63198
|
|||
|
1df971a71e
|
|||
|
2a413d5717
|
|||
|
9c2357dfe6
|
|||
|
f82562f450
|
|||
|
a33b63842a
|
|||
|
4256a312ae
|
|||
|
678a0f4f48
|
|||
|
7344c5ed4a
|
|||
|
537fbc8af4
|
|||
|
cf25af23d1
|
|||
|
f680830b53
|
|||
|
53a239958f
|
|||
|
f13326ffaf
|
|||
|
75e7760d04
|
|||
|
02d0f3f538
|
|||
|
e2a78389f2
|
|||
|
81fdf1f77a
|
|||
|
631f58bf72
|
|||
|
1d2d66fc83
|
|||
|
34aba8c7c7
|
|||
|
5e764a0d17
|
|||
|
65e86db731
|
|||
|
615d253bb4
|
|||
|
2fcbc7bee8
|
|||
|
2c14da997d
|
|||
|
a7c2182d4a
|
|||
|
0aabc206a1
|
|||
|
7d8b33390a
|
|||
|
5a5604c35d
|
|||
|
addf9addab
|
|||
|
f562aa0874
|
|||
|
19a9dfe7c6
|
|||
|
46594f1fc3
|
@@ -30,7 +30,7 @@ namespace AR
|
||||
public:
|
||||
STATIC XTAPI VOID GetTrampolineInformation(IN TRAMPOLINE_TYPE TrampolineType,
|
||||
OUT PVOID *TrampolineCode,
|
||||
OUT PULONG_PTR TrampolineSize);
|
||||
OUT PULONG TrampolineSize);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ Xtos::EnablePaging(IN PXTBL_PAGE_MAPPING PageMap)
|
||||
EFI_STATUS Status;
|
||||
EFI_PHYSICAL_ADDRESS TrampolineAddress;
|
||||
PXT_TRAMPOLINE_ENTRY TrampolineEntry;
|
||||
ULONG_PTR TrampolineSize;
|
||||
ULONG TrampolineSize;
|
||||
PVOID TrampolineCode;
|
||||
|
||||
/* Check the configured page map level to set the LA57 state accordingly */
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
#define APIC_VECTOR_PERF 0xFE
|
||||
#define APIC_VECTOR_NMI 0xFF
|
||||
|
||||
/* APIC SIPI vector shift */
|
||||
#define APIC_VECTOR_SIPI_SHIFT 12
|
||||
|
||||
/* APIC destination formats */
|
||||
#define APIC_DF_FLAT 0xFFFFFFFF
|
||||
#define APIC_DF_CLUSTER 0x0FFFFFFF
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <xtbase.h>
|
||||
#include <xtstruct.h>
|
||||
#include <xttypes.h>
|
||||
#include <extypes.h>
|
||||
#include <potypes.h>
|
||||
#include ARCH_HEADER(xtstruct.h)
|
||||
#include ARCH_HEADER(artypes.h)
|
||||
@@ -132,6 +133,18 @@
|
||||
#define CONTEXT_SEGMENTS (CONTEXT_ARCHITECTURE | 0x04)
|
||||
#define CONTEXT_FLOATING_POINT (CONTEXT_ARCHITECTURE | 0x08)
|
||||
#define CONTEXT_DEBUG_REGISTERS (CONTEXT_ARCHITECTURE | 0x10)
|
||||
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
|
||||
#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
|
||||
CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
|
||||
|
||||
/* Clock control flags */
|
||||
#define CLOCK_QUANTUM_DECREMENT 3
|
||||
|
||||
/* DPC definitions */
|
||||
#define DPC_ADJUST_THRESHOLD 20
|
||||
#define DPC_IDEAL_RATE 20
|
||||
#define DPC_MAXIMUM_QUEUE_DEPTH 4
|
||||
#define DPC_MINIMUM_RATE 3
|
||||
|
||||
/* Interrupt request levels definitions */
|
||||
#define PASSIVE_LEVEL 0
|
||||
@@ -232,7 +245,7 @@ typedef struct _CONTEXT
|
||||
USHORT SegFs;
|
||||
USHORT SegGs;
|
||||
USHORT SegSs;
|
||||
ULONG EFlags;
|
||||
ULONG Flags;
|
||||
ULONG64 Dr0;
|
||||
ULONG64 Dr1;
|
||||
ULONG64 Dr2;
|
||||
@@ -298,6 +311,24 @@ typedef struct _KDESCRIPTOR
|
||||
PVOID Base;
|
||||
} KDESCRIPTOR, *PKDESCRIPTOR;
|
||||
|
||||
/* Device Queue structure definition */
|
||||
typedef struct _KDEVICE_QUEUE
|
||||
{
|
||||
CSHORT Type;
|
||||
CSHORT Size;
|
||||
LIST_ENTRY DeviceListHead;
|
||||
KSPIN_LOCK Lock;
|
||||
union
|
||||
{
|
||||
BOOLEAN Busy;
|
||||
struct
|
||||
{
|
||||
LONGLONG Reserved:8;
|
||||
LONGLONG Hint:56;
|
||||
};
|
||||
};
|
||||
} KDEVICE_QUEUE, *PKDEVICE_QUEUE;
|
||||
|
||||
/* Global Descriptor Table (GDT) entry union definition */
|
||||
typedef struct _KGDTENTRY
|
||||
{
|
||||
@@ -560,13 +591,30 @@ typedef struct _KPROCESSOR_CONTROL_BLOCK
|
||||
ULONG_PTR SetMember;
|
||||
CPU_IDENTIFICATION CpuId;
|
||||
KPROCESSOR_STATE ProcessorState;
|
||||
KSPIN_LOCK PrcbLock;
|
||||
KSPIN_LOCK_QUEUE LockQueue[MaximumLock];
|
||||
LOOKASIDE_LIST LookasideList[16];
|
||||
LOOKASIDE_LIST NonPagedLookasideList[POOL_LOOKASIDE_LISTS];
|
||||
LOOKASIDE_LIST PagedLookasideList[POOL_LOOKASIDE_LISTS];
|
||||
VOLATILE ULONG IpiFrozen;
|
||||
VOLATILE LONG_PTR RequestSummary;
|
||||
KDPC_DATA DpcData[2];
|
||||
PVOID DpcStack;
|
||||
LONG MaximumDpcQueueDepth;
|
||||
ULONG DpcRequestRate;
|
||||
BOOLEAN DpcInterruptRequested;
|
||||
VOLATILE BOOLEAN DpcRoutineActive;
|
||||
ULONG DpcLastCount;
|
||||
VOLATILE ULONG_PTR TimerHand;
|
||||
VOLATILE ULONG_PTR TimerRequest;
|
||||
ULONG_PTR MultiThreadProcessorSet;
|
||||
SINGLE_LIST_ENTRY DeferredReadyListHead;
|
||||
ULONG InterruptCount;
|
||||
ULONG KernelTime;
|
||||
ULONG UserTime;
|
||||
ULONG DpcTime;
|
||||
ULONG InterruptTime;
|
||||
ULONG AdjustDpcThreshold;
|
||||
PROCESSOR_POWER_STATE PowerState;
|
||||
ULONG ProfilingCountdown;
|
||||
} KPROCESSOR_CONTROL_BLOCK, *PKPROCESSOR_CONTROL_BLOCK;
|
||||
|
||||
@@ -110,6 +110,10 @@
|
||||
/* Highest system address */
|
||||
#define MM_HIGHEST_SYSTEM_ADDRESS 0xFFFFFFFFFFFFFFFFULL
|
||||
|
||||
/* User probe address */
|
||||
#define MM_USER_PROBE_ADDRESS 0x00007FFFFFFF0000ULL
|
||||
#define MM_USER_PROBE_LA57_ADDRESS 0x00FFFFFFFFFF0000ULL
|
||||
|
||||
/* Trampoline code address */
|
||||
#define MM_TRAMPOLINE_ADDRESS 0x80000
|
||||
|
||||
|
||||
57
sdk/xtdk/amd64/rtltypes.h
Normal file
57
sdk/xtdk/amd64/rtltypes.h
Normal file
@@ -0,0 +1,57 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: sdk/xtdk/amd64/rtltypes.h
|
||||
* DESCRIPTION: Runtime library structures definitions for AMD64 architecture
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTDK_AMD64_RTLTYPES_H
|
||||
#define __XTDK_AMD64_RTLTYPES_H
|
||||
|
||||
#include <xtbase.h>
|
||||
#include <rtltypes.h>
|
||||
|
||||
|
||||
/* C/C++ specific code */
|
||||
#ifndef __XTOS_ASSEMBLER__
|
||||
|
||||
/* Header for a sequenced single linked list union definition */
|
||||
typedef union _SINGLE_LIST_HEADER
|
||||
{
|
||||
struct
|
||||
{
|
||||
ULONGLONG Alignment;
|
||||
ULONGLONG Region;
|
||||
};
|
||||
struct
|
||||
{
|
||||
ULONGLONG Depth:16;
|
||||
ULONGLONG Sequence:9;
|
||||
ULONGLONG NextEntry:39;
|
||||
ULONGLONG HeaderType:1;
|
||||
ULONGLONG Init:1;
|
||||
ULONGLONG Reserved:59;
|
||||
ULONGLONG Region:3;
|
||||
} Header8;
|
||||
struct
|
||||
{
|
||||
ULONGLONG Depth:16;
|
||||
ULONGLONG Sequence:48;
|
||||
ULONGLONG HeaderType:1;
|
||||
ULONGLONG Init:1;
|
||||
ULONGLONG Reserved:2;
|
||||
ULONGLONG NextEntry:60;
|
||||
} Header16;
|
||||
struct
|
||||
{
|
||||
ULONGLONG Depth:16;
|
||||
ULONGLONG Sequence:48;
|
||||
ULONGLONG HeaderType:1;
|
||||
ULONGLONG Reserved:3;
|
||||
ULONGLONG NextEntry:60;
|
||||
} Header64;
|
||||
} SINGLE_LIST_HEADER, *PSINGLE_LIST_HEADER;
|
||||
|
||||
#endif /* __XTOS_ASSEMBLER__ */
|
||||
#endif /* __XTDK_AMD64_RTLTYPES_H */
|
||||
@@ -50,6 +50,7 @@ typedef struct _HARDWARE_PTE HARDWARE_PTE, *PHARDWARE_PTE;
|
||||
typedef struct _HPET_REGISTERS HPET_REGISTERS, *PHPET_REGISTERS;
|
||||
typedef struct _IOAPIC_DATA IOAPIC_DATA, *PIOAPIC_DATA;
|
||||
typedef struct _KDESCRIPTOR KDESCRIPTOR, *PKDESCRIPTOR;
|
||||
typedef struct _KDEVICE_QUEUE KDEVICE_QUEUE, *PKDEVICE_QUEUE;
|
||||
typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
|
||||
typedef struct _KGDTENTRY KGDTENTRY, *PKGDTENTRY;
|
||||
typedef struct _KIDTENTRY KIDTENTRY, *PKIDTENTRY;
|
||||
@@ -90,6 +91,7 @@ typedef union _PIC_I8259_ICW1 PIC_I8259_ICW1, *PPIC_I8259_ICW1;
|
||||
typedef union _PIC_I8259_ICW2 PIC_I8259_ICW2, *PPIC_I8259_ICW2;
|
||||
typedef union _PIC_I8259_ICW3 PIC_I8259_ICW3, *PPIC_I8259_ICW3;
|
||||
typedef union _PIC_I8259_ICW4 PIC_I8259_ICW4, *PPIC_I8259_ICW4;
|
||||
typedef union _SINGLE_LIST_HEADER SINGLE_LIST_HEADER, *PSINGLE_LIST_HEADER;
|
||||
|
||||
#endif /* __XTOS_ASSEMBLER__ */
|
||||
#endif /* __XTDK_AMD64_XTSTRUCT_H */
|
||||
|
||||
@@ -57,7 +57,7 @@ typedef EFI_STATUS (XTCDECL *PBL_ALLOCATE_PAGES)(IN EFI_ALLOCATE_TYPE Allocation
|
||||
typedef EFI_STATUS (XTCDECL *PBL_ALLOCATE_POOL)(IN UINT_PTR Size, OUT PVOID *Memory);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_BOOTMENU_INITIALIZE_OS_LIST)(IN ULONG MaxNameLength, OUT PXTBL_BOOTMENU_ITEM *MenuEntries, OUT PULONG EntriesCount, OUT PULONG DefaultId);
|
||||
typedef BOOLEAN (XTCDECL *PBL_BOOTUTILS_GET_BOOLEAN_PARAMETER)(IN PCWSTR Parameters, IN PCWSTR Needle);
|
||||
typedef VOID (XTAPI *PBL_BOOTUTILS_GET_TRAMPOLINE_INFORMATION)(IN TRAMPOLINE_TYPE TrampolineType, OUT PVOID *TrampolineCode, OUT PULONG_PTR TrampolineSize);
|
||||
typedef VOID (XTAPI *PBL_BOOTUTILS_GET_TRAMPOLINE_INFORMATION)(IN TRAMPOLINE_TYPE TrampolineType, OUT PVOID *TrampolineCode, OUT PULONG TrampolineSize);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_BUILD_PAGE_MAP)(IN PXTBL_PAGE_MAPPING PageMap, IN ULONG_PTR SelfMapAddress);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_COMMIT_PAGE_MAP)(IN PXTBL_PAGE_MAPPING PageMap);
|
||||
typedef EFI_STATUS (XTCDECL *PBL_CLOSE_VOLUME)(IN PEFI_HANDLE VolumeHandle);
|
||||
|
||||
135
sdk/xtdk/cmtypes.h
Normal file
135
sdk/xtdk/cmtypes.h
Normal file
@@ -0,0 +1,135 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: sdk/xtdk/cmtypes.h
|
||||
* DESCRIPTION: Configuration Manager structures definitions
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTDK_CMTYPES_H
|
||||
#define __XTDK_CMTYPES_H
|
||||
|
||||
#include <xttypes.h>
|
||||
#include <xtstruct.h>
|
||||
#include <mmtypes.h>
|
||||
|
||||
|
||||
/* C/C++ specific code */
|
||||
#ifndef __XTOS_ASSEMBLER__
|
||||
|
||||
/* Partial resource descriptor */
|
||||
typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
|
||||
{
|
||||
UCHAR Type;
|
||||
UCHAR ShareDisposition;
|
||||
USHORT Flags;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
PHYSICAL_ADDRESS Start;
|
||||
ULONG Length;
|
||||
} Generic;
|
||||
struct
|
||||
{
|
||||
PHYSICAL_ADDRESS Start;
|
||||
ULONG Length;
|
||||
} Port;
|
||||
struct
|
||||
{
|
||||
USHORT Level;
|
||||
USHORT Group;
|
||||
ULONG Vector;
|
||||
PKAFFINITY_MAP Affinity;
|
||||
} Interrupt;
|
||||
struct
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
USHORT Group;
|
||||
USHORT MessageCount;
|
||||
ULONG Vector;
|
||||
PKAFFINITY_MAP Affinity;
|
||||
} Raw;
|
||||
struct
|
||||
{
|
||||
USHORT Level;
|
||||
USHORT Group;
|
||||
ULONG Vector;
|
||||
PKAFFINITY_MAP Affinity;
|
||||
} Translated;
|
||||
};
|
||||
} MessageInterrupt;
|
||||
struct
|
||||
{
|
||||
PHYSICAL_ADDRESS Start;
|
||||
ULONG Length;
|
||||
} Memory;
|
||||
struct
|
||||
{
|
||||
ULONG Channel;
|
||||
ULONG Port;
|
||||
ULONG Reserved1;
|
||||
} Dma;
|
||||
struct
|
||||
{
|
||||
ULONG Data[3];
|
||||
} DevicePrivate;
|
||||
struct
|
||||
{
|
||||
ULONG Start;
|
||||
ULONG Length;
|
||||
ULONG Reserved;
|
||||
} BusNumber;
|
||||
struct
|
||||
{
|
||||
ULONG DataSize;
|
||||
ULONG Reserved1;
|
||||
ULONG Reserved2;
|
||||
} DeviceSpecificData;
|
||||
struct
|
||||
{
|
||||
PHYSICAL_ADDRESS Start;
|
||||
ULONG Length40;
|
||||
} Memory40;
|
||||
struct
|
||||
{
|
||||
PHYSICAL_ADDRESS Start;
|
||||
ULONG Length48;
|
||||
} Memory48;
|
||||
struct
|
||||
{
|
||||
PHYSICAL_ADDRESS Start;
|
||||
ULONG Length64;
|
||||
} Memory64;
|
||||
} u;
|
||||
} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
|
||||
|
||||
/* Partial resource list */
|
||||
typedef struct _CM_PARTIAL_RESOURCE_LIST
|
||||
{
|
||||
USHORT Version;
|
||||
USHORT Revision;
|
||||
ULONG Count;
|
||||
CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
|
||||
} CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
|
||||
|
||||
/* Full resource descriptor */
|
||||
typedef struct _CM_FULL_RESOURCE_DESCRIPTOR
|
||||
{
|
||||
INTERFACE_TYPE InterfaceType;
|
||||
ULONG BusNumber;
|
||||
CM_PARTIAL_RESOURCE_LIST PartialResourceList;
|
||||
} CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
|
||||
|
||||
/* Full resource list */
|
||||
typedef struct _CM_RESOURCE_LIST
|
||||
{
|
||||
ULONG Count;
|
||||
CM_FULL_RESOURCE_DESCRIPTOR List[1];
|
||||
} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
|
||||
|
||||
#endif /* __XTOS_ASSEMBLER__ */
|
||||
#endif /* __XTDK_CMTYPES_H */
|
||||
@@ -17,18 +17,75 @@
|
||||
/* Rundown protection flags */
|
||||
#define EX_RUNDOWN_ACTIVE 0x1
|
||||
|
||||
/* Number of lookaside lists */
|
||||
#define POOL_LOOKASIDE_LISTS 32
|
||||
|
||||
/* C/C++ specific code */
|
||||
#ifndef __XTOS_ASSEMBLER__
|
||||
|
||||
/* Executive rundown protection structure definition */
|
||||
typedef struct _EX_RUNDOWN_REFERENCE
|
||||
/* Kernel routine callbacks */
|
||||
typedef XTSTATUS (XTAPI *PALLOCATE_FUNCTION)(IN MMPOOL_TYPE PoolType, IN SIZE_T Bytes, OUT PVOID *Memory, IN ULONG Tag);
|
||||
typedef XTSTATUS (XTAPI *PALLOCATE_FUNCTION_EX)(IN MMPOOL_TYPE PoolType, IN SIZE_T Bytes, OUT PVOID *Memory, IN ULONG Tag, IN PLOOKASIDE_LIST_EX Lookaside);
|
||||
typedef XTSTATUS (XTAPI *PFREE_FUNCTION)(IN PVOID Buffer);
|
||||
typedef XTSTATUS (XTAPI *PFREE_FUNCTION_EX)(IN PVOID Buffer, IN OUT PLOOKASIDE_LIST_EX Lookaside);
|
||||
typedef VOID (XTAPI *PWORKER_THREAD_ROUTINE)(IN PVOID Parameter);
|
||||
|
||||
/* Work queue types */
|
||||
typedef enum _WORK_QUEUE_TYPE
|
||||
{
|
||||
CriticalWorkQueue,
|
||||
DelayedWorkQueue,
|
||||
HyperCriticalWorkQueue,
|
||||
NormalWorkQueue,
|
||||
BackgroundWorkQueue,
|
||||
RealTimeWorkQueue,
|
||||
SuperCriticalWorkQueue,
|
||||
MaximumWorkQueue,
|
||||
} WORK_QUEUE_TYPE, *PWORK_QUEUE_TYPE;
|
||||
|
||||
/* Owner entry structure definition */
|
||||
typedef struct _OWNER_ENTRY
|
||||
{
|
||||
ULONG_PTR OwnerThread;
|
||||
union
|
||||
{
|
||||
ULONG_PTR Count;
|
||||
PVOID Ptr;
|
||||
struct
|
||||
{
|
||||
ULONG IoPriorityBoosted:1;
|
||||
ULONG OwnerReferenced:1;
|
||||
ULONG OwnerCount:30;
|
||||
};
|
||||
ULONG TableSize;
|
||||
};
|
||||
} OWNER_ENTRY, *POWNER_ENTRY;
|
||||
|
||||
/* Exclusive resource structure definition */
|
||||
typedef struct _ERESOURCE
|
||||
{
|
||||
LIST_ENTRY SystemResourcesList;
|
||||
POWNER_ENTRY OwnerTable;
|
||||
SHORT ActiveCount;
|
||||
USHORT Flag;
|
||||
VOLATILE PKSEMAPHORE SharedWaiters;
|
||||
VOLATILE PKEVENT ExclusiveWaiters;
|
||||
OWNER_ENTRY OwnerEntry;
|
||||
ULONG ActiveEntries;
|
||||
ULONG ContentionCount;
|
||||
ULONG NumberOfSharedWaiters;
|
||||
ULONG NumberOfExclusiveWaiters;
|
||||
union
|
||||
{
|
||||
PVOID Address;
|
||||
ULONG_PTR CreatorBackTraceIndex;
|
||||
};
|
||||
KSPIN_LOCK SpinLock;
|
||||
} ERESOURCE, *PERESOURCE;
|
||||
|
||||
/* Executive rundown protection structure definition */
|
||||
typedef union _EX_RUNDOWN_REFERENCE
|
||||
{
|
||||
ULONG_PTR Count;
|
||||
PVOID Ptr;
|
||||
} EX_RUNDOWN_REFERENCE, *PEX_RUNDOWN_REFERENCE;
|
||||
|
||||
/* Executive rundown wait block definition */
|
||||
@@ -38,5 +95,82 @@ typedef struct _EX_RUNDOWN_WAIT_BLOCK
|
||||
KEVENT WakeEvent;
|
||||
} EX_RUNDOWN_WAIT_BLOCK, *PEX_RUNDOWN_WAIT_BLOCK;
|
||||
|
||||
/* Lookaside list structure definition */
|
||||
typedef struct _GENERAL_LOOKASIDE
|
||||
{
|
||||
union
|
||||
{
|
||||
SINGLE_LIST_HEADER ListHead;
|
||||
SINGLE_LIST_ENTRY SingleListHead;
|
||||
};
|
||||
USHORT Depth;
|
||||
USHORT MaximumDepth;
|
||||
ULONG TotalAllocates;
|
||||
union
|
||||
{
|
||||
ULONG AllocateMisses;
|
||||
ULONG AllocateHits;
|
||||
};
|
||||
ULONG TotalFrees;
|
||||
union {
|
||||
ULONG FreeMisses;
|
||||
ULONG FreeHits;
|
||||
};
|
||||
MMPOOL_TYPE Type;
|
||||
ULONG Tag;
|
||||
ULONG Size;
|
||||
union
|
||||
{
|
||||
PALLOCATE_FUNCTION_EX AllocateEx;
|
||||
PALLOCATE_FUNCTION Allocate;
|
||||
};
|
||||
union
|
||||
{
|
||||
PFREE_FUNCTION_EX FreeEx;
|
||||
PFREE_FUNCTION Free;
|
||||
};
|
||||
LIST_ENTRY ListEntry;
|
||||
ULONG LastTotalAllocates;
|
||||
union
|
||||
{
|
||||
ULONG LastAllocateMisses;
|
||||
ULONG LastAllocateHits;
|
||||
};
|
||||
ULONG Future[2];
|
||||
} GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
|
||||
|
||||
/* Lookaside list pointers structure definition */
|
||||
typedef struct _LOOKASIDE_LIST
|
||||
{
|
||||
PGENERAL_LOOKASIDE Local;
|
||||
PGENERAL_LOOKASIDE Global;
|
||||
} LOOKASIDE_LIST, *PLOOKASIDE_LIST;
|
||||
|
||||
/* Lookaside list extended structure definition */
|
||||
typedef struct _LOOKASIDE_LIST_EX
|
||||
{
|
||||
GENERAL_LOOKASIDE Global;
|
||||
} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
|
||||
|
||||
/* Non-paged lookaside list structure definition */
|
||||
typedef struct _NONPAGED_LOOKASIDE_LIST
|
||||
{
|
||||
GENERAL_LOOKASIDE Global;
|
||||
} NONPAGED_LOOKASIDE_LIST, *PNONPAGED_LOOKASIDE_LIST;
|
||||
|
||||
/* Paged lookaside list structure definition */
|
||||
typedef struct _PAGED_LOOKASIDE_LIST
|
||||
{
|
||||
GENERAL_LOOKASIDE Global;
|
||||
} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
|
||||
|
||||
/* Work queue item structure definition */
|
||||
typedef struct _WORK_QUEUE_ITEM
|
||||
{
|
||||
LIST_ENTRY List;
|
||||
PWORKER_THREAD_ROUTINE WorkerRoutine;
|
||||
VOLATILE PVOID Parameter;
|
||||
} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
|
||||
|
||||
#endif /* __XTOS_ASSEMBLER__ */
|
||||
#endif /* __XTDK_EXTYPES_H */
|
||||
|
||||
@@ -215,6 +215,30 @@ typedef ULONG (XTAPI *PHALP_QUERY_TIME_DELTA)(VOID);
|
||||
typedef ULONG (XTAPI *PHALP_SET_CLOCK_RATE)(IN ULONG Increment);
|
||||
typedef VOID (XTAPI *PHALP_STALL_EXECUTION)(IN ULONG MicroSeconds);
|
||||
|
||||
/* Interface types */
|
||||
typedef enum _INTERFACE_TYPE
|
||||
{
|
||||
InterfaceTypeUndefined = -1,
|
||||
Internal,
|
||||
Isa,
|
||||
Eisa,
|
||||
MicroChannel,
|
||||
TurboChannel,
|
||||
PCIBus,
|
||||
VMEBus,
|
||||
NuBus,
|
||||
PCMCIABus,
|
||||
CBus,
|
||||
MPIBus,
|
||||
MPSABus,
|
||||
ProcessorInternal,
|
||||
InternalPowerBus,
|
||||
PNPISABus,
|
||||
PNPBus,
|
||||
Vmcs,
|
||||
MaximumInterfaceType
|
||||
} INTERFACE_TYPE, *PINTERFACE_TYPE;
|
||||
|
||||
/* Generic Address structure */
|
||||
typedef struct _GENERIC_ADDRESS
|
||||
{
|
||||
|
||||
@@ -45,6 +45,9 @@
|
||||
#define APIC_VECTOR_PERF 0xFE
|
||||
#define APIC_VECTOR_NMI 0xFF
|
||||
|
||||
/* APIC SIPI vector shift */
|
||||
#define APIC_VECTOR_SIPI_SHIFT 12
|
||||
|
||||
/* APIC destination formats */
|
||||
#define APIC_DF_FLAT 0xFFFFFFFF
|
||||
#define APIC_DF_CLUSTER 0x0FFFFFFF
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <xtbase.h>
|
||||
#include <xtstruct.h>
|
||||
#include <xttypes.h>
|
||||
#include <extypes.h>
|
||||
#include <potypes.h>
|
||||
#include ARCH_HEADER(xtstruct.h)
|
||||
#include ARCH_HEADER(artypes.h)
|
||||
@@ -154,6 +155,19 @@
|
||||
#define CONTEXT_FLOATING_POINT (CONTEXT_ARCHITECTURE | 0x08)
|
||||
#define CONTEXT_DEBUG_REGISTERS (CONTEXT_ARCHITECTURE | 0x10)
|
||||
#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_ARCHITECTURE | 0x20)
|
||||
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
|
||||
#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
|
||||
CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \
|
||||
CONTEXT_EXTENDED_REGISTERS)
|
||||
|
||||
/* Clock control flags */
|
||||
#define CLOCK_QUANTUM_DECREMENT 3
|
||||
|
||||
/* DPC definitions */
|
||||
#define DPC_ADJUST_THRESHOLD 20
|
||||
#define DPC_IDEAL_RATE 20
|
||||
#define DPC_MAXIMUM_QUEUE_DEPTH 4
|
||||
#define DPC_MINIMUM_RATE 3
|
||||
|
||||
/* Interrupt request levels definitions */
|
||||
#define PASSIVE_LEVEL 0
|
||||
@@ -291,7 +305,7 @@ typedef struct _CONTEXT
|
||||
ULONG Ebp;
|
||||
ULONG Eip;
|
||||
ULONG SegCs;
|
||||
ULONG EFlags;
|
||||
ULONG Flags;
|
||||
ULONG Esp;
|
||||
ULONG SegSs;
|
||||
UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
|
||||
@@ -305,6 +319,16 @@ typedef struct _KDESCRIPTOR
|
||||
PVOID Base;
|
||||
} KDESCRIPTOR, *PKDESCRIPTOR;
|
||||
|
||||
/* Device Queue structure definition */
|
||||
typedef struct _KDEVICE_QUEUE
|
||||
{
|
||||
CSHORT Type;
|
||||
CSHORT Size;
|
||||
LIST_ENTRY DeviceListHead;
|
||||
KSPIN_LOCK Lock;
|
||||
BOOLEAN Busy;
|
||||
} KDEVICE_QUEUE, *PKDEVICE_QUEUE;
|
||||
|
||||
/* Global Descriptor Table (GDT) entry structure definition */
|
||||
typedef struct _KGDTENTRY
|
||||
{
|
||||
@@ -415,18 +439,19 @@ typedef struct _KEXCEPTION_FRAME
|
||||
/* Thread start frame definition */
|
||||
typedef struct _KSTART_FRAME
|
||||
{
|
||||
PKSYSTEM_ROUTINE SystemRoutine;
|
||||
PKSTART_ROUTINE StartRoutine;
|
||||
PVOID StartContext;
|
||||
ULONG P1Home;
|
||||
ULONG P2Home;
|
||||
ULONG P3Home;
|
||||
BOOLEAN UserMode;
|
||||
ULONG Return;
|
||||
} KSTART_FRAME, *PKSTART_FRAME;
|
||||
|
||||
/* Switch frame definition */
|
||||
typedef struct _KSWITCH_FRAME
|
||||
{
|
||||
PVOID ExceptionList;
|
||||
BOOLEAN ApcBypassDisabled;
|
||||
PVOID Return;
|
||||
KRUNLEVEL ApcBypass;
|
||||
ULONG Return;
|
||||
} KSWITCH_FRAME, *PKSWITCH_FRAME;
|
||||
|
||||
/* Trap frame definition */
|
||||
@@ -519,13 +544,30 @@ typedef struct _KPROCESSOR_CONTROL_BLOCK
|
||||
ULONG_PTR SetMember;
|
||||
CPU_IDENTIFICATION CpuId;
|
||||
KPROCESSOR_STATE ProcessorState;
|
||||
KSPIN_LOCK PrcbLock;
|
||||
KSPIN_LOCK_QUEUE LockQueue[MaximumLock];
|
||||
LOOKASIDE_LIST LookasideList[16];
|
||||
LOOKASIDE_LIST NonPagedLookasideList[POOL_LOOKASIDE_LISTS];
|
||||
LOOKASIDE_LIST PagedLookasideList[POOL_LOOKASIDE_LISTS];
|
||||
ULONG_PTR MultiThreadProcessorSet;
|
||||
VOLATILE ULONG IpiFrozen;
|
||||
VOLATILE LONG_PTR RequestSummary;
|
||||
KDPC_DATA DpcData[2];
|
||||
PVOID DpcStack;
|
||||
LONG MaximumDpcQueueDepth;
|
||||
ULONG DpcRequestRate;
|
||||
BOOLEAN DpcInterruptRequested;
|
||||
VOLATILE BOOLEAN DpcRoutineActive;
|
||||
ULONG DpcLastCount;
|
||||
VOLATILE ULONG_PTR TimerHand;
|
||||
VOLATILE ULONG_PTR TimerRequest;
|
||||
SINGLE_LIST_ENTRY DeferredReadyListHead;
|
||||
ULONG InterruptCount;
|
||||
ULONG KernelTime;
|
||||
ULONG UserTime;
|
||||
ULONG DpcTime;
|
||||
ULONG InterruptTime;
|
||||
ULONG AdjustDpcThreshold;
|
||||
PROCESSOR_POWER_STATE PowerState;
|
||||
ULONG ProfilingCountdown;
|
||||
} KPROCESSOR_CONTROL_BLOCK, *PKPROCESSOR_CONTROL_BLOCK;
|
||||
|
||||
@@ -108,6 +108,9 @@
|
||||
/* Highest system address */
|
||||
#define MM_HIGHEST_SYSTEM_ADDRESS 0xFFFFFFFF
|
||||
|
||||
/* User probe address */
|
||||
#define MM_USER_PROBE_ADDRESS 0x7FFF0000
|
||||
|
||||
/* Trampoline code address */
|
||||
#define MM_TRAMPOLINE_ADDRESS 0x80000
|
||||
|
||||
|
||||
32
sdk/xtdk/i686/rtltypes.h
Normal file
32
sdk/xtdk/i686/rtltypes.h
Normal file
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: sdk/xtdk/amd64/rtltypes.h
|
||||
* DESCRIPTION: Runtime library structures definitions for i686 architecture
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTDK_I686_RTLTYPES_H
|
||||
#define __XTDK_I686_RTLTYPES_H
|
||||
|
||||
#include <xtbase.h>
|
||||
#include <rtltypes.h>
|
||||
|
||||
|
||||
/* C/C++ specific code */
|
||||
#ifndef __XTOS_ASSEMBLER__
|
||||
|
||||
/* Header for a sequenced single linked list union definition */
|
||||
typedef union _SINGLE_LIST_HEADER
|
||||
{
|
||||
ULONGLONG Alignment;
|
||||
struct
|
||||
{
|
||||
SINGLE_LIST_ENTRY Next;
|
||||
USHORT Depth;
|
||||
USHORT Sequence;
|
||||
};
|
||||
} SINGLE_LIST_HEADER, *PSINGLE_LIST_HEADER;
|
||||
|
||||
#endif /* __XTOS_ASSEMBLER__ */
|
||||
#endif /* __XTDK_I686_RTLTYPES_H */
|
||||
@@ -53,6 +53,7 @@ typedef struct _HARDWARE_MODERN_PTE HARDWARE_MODERN_PTE, *PHARDWARE_MODERN_PTE;
|
||||
typedef struct _HPET_REGISTERS HPET_REGISTERS, *PHPET_REGISTERS;
|
||||
typedef struct _IOAPIC_DATA IOAPIC_DATA, *PIOAPIC_DATA;
|
||||
typedef struct _KDESCRIPTOR KDESCRIPTOR, *PKDESCRIPTOR;
|
||||
typedef struct _KDEVICE_QUEUE KDEVICE_QUEUE, *PKDEVICE_QUEUE;
|
||||
typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
|
||||
typedef struct _KGDTENTRY KGDTENTRY, *PKGDTENTRY;
|
||||
typedef struct _KIDTENTRY KIDTENTRY, *PKIDTENTRY;
|
||||
@@ -100,6 +101,7 @@ typedef union _PIC_I8259_ICW1 PIC_I8259_ICW1, *PPIC_I8259_ICW1;
|
||||
typedef union _PIC_I8259_ICW2 PIC_I8259_ICW2, *PPIC_I8259_ICW2;
|
||||
typedef union _PIC_I8259_ICW3 PIC_I8259_ICW3, *PPIC_I8259_ICW3;
|
||||
typedef union _PIC_I8259_ICW4 PIC_I8259_ICW4, *PPIC_I8259_ICW4;
|
||||
typedef union _SINGLE_LIST_HEADER SINGLE_LIST_HEADER, *PSINGLE_LIST_HEADER;
|
||||
|
||||
#endif /* __XTOS_ASSEMBLER__ */
|
||||
#endif /* __XTDK_I686_XTSTRUCT_H */
|
||||
|
||||
1039
sdk/xtdk/iotypes.h
1039
sdk/xtdk/iotypes.h
File diff suppressed because it is too large
Load Diff
@@ -14,6 +14,7 @@
|
||||
#include <xttarget.h>
|
||||
#include <xttypes.h>
|
||||
#include ARCH_HEADER(xtstruct.h)
|
||||
#include ARCH_HEADER(rtltypes.h)
|
||||
|
||||
|
||||
/* Exception types and handling mechanisms */
|
||||
@@ -24,14 +25,49 @@
|
||||
/* Maximum number of exception parameters */
|
||||
#define EXCEPTION_MAXIMUM_PARAMETERS 15
|
||||
|
||||
/* IPI types */
|
||||
#define IPI_APC 1
|
||||
#define IPI_DPC 2
|
||||
#define IPI_FREEZE 4
|
||||
#define IPI_PACKET_READY 8
|
||||
#define IPI_SYNC_REQUEST 16
|
||||
|
||||
/* IPI frozen states */
|
||||
#define IPI_FROZEN_STATE_RUNNING 0x00
|
||||
#define IPI_FROZEN_STATE_FROZEN 0x02
|
||||
#define IPI_FROZEN_STATE_THAW 0x03
|
||||
#define IPI_FROZEN_STATE_OWNER 0x04
|
||||
#define IPI_FROZEN_STATE_FREEZE 0x05
|
||||
#define IPI_FROZEN_STATE_ACTIVE 0x20
|
||||
|
||||
/* Lock queue states */
|
||||
#define LOCK_QUEUE_WAIT 1
|
||||
#define LOCK_QUEUE_OWNER 2
|
||||
|
||||
/* APC pending state length */
|
||||
#define KAPC_STATE_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN))
|
||||
|
||||
/* Indices used to access the PushLock data structure */
|
||||
#define KPUSHLOCK_INDEX ((ULONG_PTR)0x00)
|
||||
#define KPUSHLOCK_LOCK ((ULONG_PTR)0x01)
|
||||
#define KPUSHLOCK_WAITING ((ULONG_PTR)0x02)
|
||||
#define KPUSHLOCK_WAKING ((ULONG_PTR)0x04)
|
||||
#define KPUSHLOCK_MULTIPLE_SHARED ((ULONG_PTR)0x08)
|
||||
#define KPUSHLOCK_INCREMENT_SHARED ((ULONG_PTR)0x10)
|
||||
|
||||
/* Mask for the pointer bits */
|
||||
#define KPUSHLOCK_PTR_BITS ((ULONG_PTR)0x0F)
|
||||
|
||||
/* PushLock related definitions */
|
||||
#define KPUSH_LOCK_TOTAL_BITS (sizeof(ULONG_PTR) * 8)
|
||||
#define KPUSH_LOCK_SPIN_COUNT 1024
|
||||
|
||||
/* Kernel service descriptor tables count */
|
||||
#define KSERVICE_TABLES_COUNT 4
|
||||
|
||||
/* Timer length */
|
||||
/* Timer related definitions */
|
||||
#define KTIMER_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG))
|
||||
#define KTIMER_TABLE_SIZE 512
|
||||
|
||||
/* Kernel builtin wait blocks */
|
||||
#define EVENT_WAIT_BLOCK 2
|
||||
@@ -43,6 +79,9 @@
|
||||
#define READY_SKIP_QUANTUM 2
|
||||
#define THREAD_QUANTUM 6
|
||||
|
||||
/* Dispatcher object type mask */
|
||||
#define DISPATCHER_OBJECT_TYPE_MASK 0x7L
|
||||
|
||||
/* Thread priority levels */
|
||||
#define THREAD_LOW_PRIORITY 0
|
||||
#define THREAD_LOW_REALTIME_PRIORITY 16
|
||||
@@ -79,6 +118,15 @@ typedef enum _KAPC_ENVIRONMENT
|
||||
InsertApcEnvironment
|
||||
} KAPC_ENVIRONMENT, *PKAPC_ENVIRONMENT;
|
||||
|
||||
/* Continue status enumeration list */
|
||||
typedef enum _KCONTINUE_STATUS
|
||||
{
|
||||
ContinueError,
|
||||
ContinueSuccess,
|
||||
ContinueProcessorReselected,
|
||||
ContinueNextProcessor
|
||||
} KCONTINUE_STATUS, *PKCONTINUE_STATUS;
|
||||
|
||||
/* DPC importance enumeration list */
|
||||
typedef enum _KDPC_IMPORTANCE
|
||||
{
|
||||
@@ -100,7 +148,7 @@ typedef enum _KOBJECTS
|
||||
{
|
||||
EventNotificationObject = 0,
|
||||
EventSynchronizationObject = 1,
|
||||
MutantObject = 2,
|
||||
MutexObject = 2,
|
||||
ProcessObject = 3,
|
||||
QueueObject = 4,
|
||||
SemaphoreObject = 5,
|
||||
@@ -212,6 +260,55 @@ typedef enum _KTIMER_TYPE
|
||||
SynchronizationTimer
|
||||
} KTIMER_TYPE, *PKTIMER_TYPE;
|
||||
|
||||
/* Wait reason */
|
||||
typedef enum _KWAIT_REASON
|
||||
{
|
||||
Executive,
|
||||
FreePage,
|
||||
PageIn,
|
||||
PoolAllocation,
|
||||
DelayExecution,
|
||||
Suspended,
|
||||
UserRequest,
|
||||
WrExecutive,
|
||||
WrFreePage,
|
||||
WrPageIn,
|
||||
WrPoolAllocation,
|
||||
WrDelayExecution,
|
||||
WrSuspended,
|
||||
WrUserRequest,
|
||||
WrEventPair,
|
||||
WrQueue,
|
||||
WrLpcReceive,
|
||||
WrLpcReply,
|
||||
WrVirtualMemory,
|
||||
WrPageOut,
|
||||
WrRendezvous,
|
||||
WrKeyedEvent,
|
||||
WrTerminated,
|
||||
WrProcessInSwap,
|
||||
WrCpuRateControl,
|
||||
WrCalloutStack,
|
||||
WrKernel,
|
||||
WrResource,
|
||||
WrPushLock,
|
||||
WrMutex,
|
||||
WrQuantumEnd,
|
||||
WrDispatchInt,
|
||||
WrPreempted,
|
||||
WrYieldExecution,
|
||||
WrFastMutex,
|
||||
WrGuardedMutex,
|
||||
WrRundown,
|
||||
WrAlertByThreadId,
|
||||
WrDeferredPreempt,
|
||||
WrPhysicalFault,
|
||||
WrIoRing,
|
||||
WrMdlCache,
|
||||
WrRcu,
|
||||
MaximumWaitReason
|
||||
} KWAIT_REASON, *PKWAIT_REASON;
|
||||
|
||||
/* APC Types */
|
||||
typedef enum _MODE
|
||||
{
|
||||
@@ -252,6 +349,27 @@ typedef VOID (XTAPI *PKRUNDOWN_ROUTINE)(IN PKAPC Apc);
|
||||
typedef VOID (XTCDECL *PKSTART_ROUTINE)(IN PVOID StartContext);
|
||||
typedef VOID (XTCDECL *PKSYSTEM_ROUTINE)(IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext);
|
||||
|
||||
/* Dispatcher object header structure definition */
|
||||
typedef struct _DISPATCHER_HEADER
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
UCHAR Type;
|
||||
UCHAR Absolute;
|
||||
UCHAR Size;
|
||||
union {
|
||||
UCHAR Inserted;
|
||||
BOOLEAN DebugActive;
|
||||
};
|
||||
};
|
||||
VOLATILE LONG Lock;
|
||||
};
|
||||
LONG SignalState;
|
||||
LIST_ENTRY WaitListHead;
|
||||
} DISPATCHER_HEADER, *PDISPATCHER_HEADER;
|
||||
|
||||
/* Exception record structure definition */
|
||||
typedef struct _EXCEPTION_RECORD
|
||||
{
|
||||
@@ -263,6 +381,14 @@ typedef struct _EXCEPTION_RECORD
|
||||
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
|
||||
} EXCEPTION_RECORD, *PEXCEPTION_RECORD;
|
||||
|
||||
/* Extended affinity structure definition */
|
||||
typedef struct _KAFFINITY_MAP
|
||||
{
|
||||
USHORT Size;
|
||||
ULONG Reserved;
|
||||
KAFFINITY Bitmap[];
|
||||
} KAFFINITY_MAP, *PKAFFINITY_MAP;
|
||||
|
||||
/* Asynchronous Procedure Call (APC) object structure definition */
|
||||
typedef struct _KAPC
|
||||
{
|
||||
@@ -331,11 +457,49 @@ typedef struct _KAPC_STATE
|
||||
BOOLEAN UserApcPending;
|
||||
} KAPC_STATE, *PKAPC_STATE;
|
||||
|
||||
/* Event gate structure definition */
|
||||
typedef struct _KGATE
|
||||
/* Device queue entry structure definition */
|
||||
typedef struct _KDEVICE_QUEUE_ENTRY
|
||||
{
|
||||
LIST_ENTRY DeviceListEntry;
|
||||
ULONG SortKey;
|
||||
BOOLEAN Inserted;
|
||||
} KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY;
|
||||
|
||||
/* Mutex object structure definition */
|
||||
typedef struct _KMUTEX
|
||||
{
|
||||
DISPATCHER_HEADER Header;
|
||||
} KGATE, *PKGATE;
|
||||
LIST_ENTRY MutexListEntry;
|
||||
PKTHREAD OwnerThread;
|
||||
BOOLEAN Abandoned;
|
||||
UCHAR ApcDisable;
|
||||
} KMUTEX, *PKMUTEX;
|
||||
|
||||
/* Push Lock structure definition */
|
||||
typedef union _KPUSH_LOCK
|
||||
{
|
||||
struct
|
||||
{
|
||||
ULONG_PTR Locked:1;
|
||||
ULONG_PTR Waiting:1;
|
||||
ULONG_PTR Waking:1;
|
||||
ULONG_PTR MultipleShared:1;
|
||||
ULONG_PTR Shared:(KPUSH_LOCK_TOTAL_BITS - 4);
|
||||
};
|
||||
ULONG_PTR Value;
|
||||
PVOID Ptr;
|
||||
} KPUSH_LOCK, *PKPUSH_LOCK;
|
||||
|
||||
/* Push lock wait block structure definition */
|
||||
typedef struct _KPUSH_LOCK_WAIT_BLOCK
|
||||
{
|
||||
KEVENT WakeEvent;
|
||||
PKPUSH_LOCK_WAIT_BLOCK Next;
|
||||
PKPUSH_LOCK_WAIT_BLOCK Last;
|
||||
PKPUSH_LOCK_WAIT_BLOCK Previous;
|
||||
LONG ShareCount;
|
||||
LONG Flags;
|
||||
} KPUSH_LOCK_WAIT_BLOCK, *PKPUSH_LOCK_WAIT_BLOCK;
|
||||
|
||||
/* Semaphore object structure definition */
|
||||
typedef struct _KSEMAPHORE
|
||||
@@ -419,7 +583,8 @@ typedef struct _KPROCESS
|
||||
ULONG_PTR DirectoryTable[2];
|
||||
USHORT IopmOffset;
|
||||
UCHAR Iopl;
|
||||
VOLATILE KAFFINITY ActiveProcessors;
|
||||
PKAFFINITY_MAP Affinity;
|
||||
PKAFFINITY_MAP ActiveProcessors;
|
||||
ULONG KernelTime;
|
||||
ULONG UserTime;
|
||||
LIST_ENTRY ReadyListHead;
|
||||
@@ -427,7 +592,6 @@ typedef struct _KPROCESS
|
||||
PVOID VdmTrapHandler;
|
||||
LIST_ENTRY ThreadListHead;
|
||||
KSPIN_LOCK ProcessLock;
|
||||
KAFFINITY Affinity;
|
||||
union
|
||||
{
|
||||
struct
|
||||
@@ -476,13 +640,12 @@ typedef struct _KSHARED_DATA
|
||||
typedef struct _KTHREAD
|
||||
{
|
||||
DISPATCHER_HEADER Header;
|
||||
LIST_ENTRY MutantListHead;
|
||||
LIST_ENTRY MutexListHead;
|
||||
PVOID InitialStack;
|
||||
PVOID KernelStack;
|
||||
PVOID StackBase;
|
||||
PVOID StackLimit;
|
||||
KSPIN_LOCK ThreadLock;
|
||||
|
||||
ULONG ContextSwitches;
|
||||
VOLATILE UCHAR State;
|
||||
UCHAR NpxState;
|
||||
@@ -507,7 +670,7 @@ typedef struct _KTHREAD
|
||||
PKWAIT_BLOCK WaitBlockList;
|
||||
BOOLEAN Alertable;
|
||||
BOOLEAN WaitNext;
|
||||
UCHAR WaitReason;
|
||||
KWAIT_REASON WaitReason;
|
||||
SCHAR Priority;
|
||||
UCHAR StackSwap;
|
||||
VOLATILE UCHAR SwapBusy;
|
||||
@@ -545,9 +708,9 @@ typedef struct _KTHREAD
|
||||
CHAR PreviousMode;
|
||||
UCHAR ResourceIndex;
|
||||
UCHAR DisableBoost;
|
||||
KAFFINITY UserAffinity;
|
||||
PKAFFINITY_MAP UserAffinity;
|
||||
PKPROCESS Process;
|
||||
KAFFINITY Affinity;
|
||||
PKAFFINITY_MAP Affinity;
|
||||
PVOID ServiceTable;
|
||||
PKAPC_STATE ApcStatePointer[2];
|
||||
KAPC_STATE SavedApcState;
|
||||
@@ -563,12 +726,12 @@ typedef struct _KTHREAD
|
||||
LIST_ENTRY ThreadListEntry;
|
||||
UCHAR LargeStack;
|
||||
UCHAR PowerState;
|
||||
UCHAR NpxIrql;
|
||||
UCHAR NpxRunLevel;
|
||||
UCHAR Spare5;
|
||||
BOOLEAN AutoAlignment;
|
||||
UCHAR Iopl;
|
||||
CCHAR FreezeCount;
|
||||
CCHAR SuspendCount;
|
||||
CHAR FreezeCount;
|
||||
CHAR SuspendCount;
|
||||
UCHAR Spare0[1];
|
||||
UCHAR UserIdealProcessor;
|
||||
UCHAR Spare2[3];
|
||||
|
||||
62
sdk/xtdk/lpctypes.h
Normal file
62
sdk/xtdk/lpctypes.h
Normal file
@@ -0,0 +1,62 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: sdk/xtdk/lpctypes.h
|
||||
* DESCRIPTION: Local Procedure Call (LPC) structures and definitions
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTDK_LPCTYPES_H
|
||||
#define __XTDK_LPCTYPES_H
|
||||
|
||||
#include <xttypes.h>
|
||||
#include <xtstruct.h>
|
||||
#include <iotypes.h>
|
||||
|
||||
|
||||
/* C/C++ specific code */
|
||||
#ifndef __XTOS_ASSEMBLER__
|
||||
|
||||
/* LPC non-paged port queue structure definition */
|
||||
typedef struct _LPCP_NONPAGED_PORT_QUEUE
|
||||
{
|
||||
KSEMAPHORE Semaphore;
|
||||
struct _LPCP_PORT_OBJECT *BackPointer;
|
||||
} LPCP_NONPAGED_PORT_QUEUE, *PLPCP_NONPAGED_PORT_QUEUE;
|
||||
|
||||
/* LPC port queue structure definition */
|
||||
typedef struct _LPCP_PORT_QUEUE
|
||||
{
|
||||
PLPCP_NONPAGED_PORT_QUEUE NonPagedPortQueue;
|
||||
PKSEMAPHORE Semaphore;
|
||||
LIST_ENTRY ReceiveHead;
|
||||
} LPCP_PORT_QUEUE, *PLPCP_PORT_QUEUE;
|
||||
|
||||
/* LPC port object structure definition */
|
||||
typedef struct _LPCP_PORT_OBJECT
|
||||
{
|
||||
struct _LPCP_PORT_OBJECT *ConnectionPort;
|
||||
struct _LPCP_PORT_OBJECT *ConnectedPort;
|
||||
LPCP_PORT_QUEUE MsgQueue;
|
||||
CLIENT_ID Creator;
|
||||
PVOID ClientSectionBase;
|
||||
PVOID ServerSectionBase;
|
||||
PVOID PortContext;
|
||||
PETHREAD ClientThread;
|
||||
SECURITY_QUALITY_OF_SERVICE SecurityQos;
|
||||
SECURITY_CLIENT_CONTEXT StaticSecurity;
|
||||
LIST_ENTRY LpcReplyChainHead;
|
||||
LIST_ENTRY LpcDataInfoChainHead;
|
||||
union
|
||||
{
|
||||
PEPROCESS ServerProcess;
|
||||
PEPROCESS MappingProcess;
|
||||
};
|
||||
ULONG MaxMessageLength;
|
||||
ULONG MaxConnectionInfoLength;
|
||||
ULONG Flags;
|
||||
KEVENT WaitEvent;
|
||||
} LPCP_PORT_OBJECT, *PLPCP_PORT_OBJECT;
|
||||
|
||||
#endif /* __XTOS_ASSEMBLER__ */
|
||||
#endif /* __XTDK_LPCTYPES_H */
|
||||
@@ -55,6 +55,9 @@
|
||||
/* Protection field shift */
|
||||
#define MM_PROTECT_FIELD_SHIFT 5
|
||||
|
||||
/* Process Quota Adjustment Thresholds */
|
||||
#define MMNONPAGED_QUOTA_INCREASE (64*1024)
|
||||
#define MMPAGED_QUOTA_INCREASE (512*1024)
|
||||
|
||||
/* C/C++ specific code */
|
||||
#ifndef __XTOS_ASSEMBLER__
|
||||
@@ -107,14 +110,31 @@ typedef enum _MMSYSTEM_PTE_POOL_TYPE
|
||||
MaximumPtePoolTypes
|
||||
} MMSYSTEM_PTE_POOL_TYPE, *PMMSYSTEM_PTE_POOL_TYPE;
|
||||
|
||||
/* Page map routines structure definition */
|
||||
typedef CONST STRUCT _CMMPAGEMAP_ROUTINES
|
||||
/* Non-paged lookaside list indices */
|
||||
typedef enum _NONPAGED_LOOKASIDE_NUMBER
|
||||
{
|
||||
VOID (XTAPI *ClearPte)(PHARDWARE_PTE PtePointer);
|
||||
BOOLEAN (XTAPI *PteValid)(PHARDWARE_PTE PtePointer);
|
||||
VOID (XTAPI *SetPteCaching)(PHARDWARE_PTE PtePointer, BOOLEAN CacheDisable, BOOLEAN WriteThrough);
|
||||
VOID (XTAPI *SetPte)(PHARDWARE_PTE PtePointer, PFN_NUMBER PageFrameNumber, BOOLEAN Writable);
|
||||
} CMMPAGEMAP_ROUTINES, *PCMMPAGEMAP_ROUTINES;
|
||||
LookasideSmallIrpList,
|
||||
LookasideLargeIrpList,
|
||||
LookasideMdlList,
|
||||
LookasideCreateInfoList,
|
||||
LookasideNameBufferList,
|
||||
LookasideTwilightList,
|
||||
LookasideCompletionList,
|
||||
LookasideMaximumList
|
||||
} NONPAGED_LOOKASIDE_NUMBER, *PNONPAGED_LOOKASIDE_NUMBER;
|
||||
|
||||
/* Memory Descriptor List structure definition */
|
||||
typedef struct _MDL
|
||||
{
|
||||
PMDL Next;
|
||||
CSHORT Size;
|
||||
CSHORT MdlFlags;
|
||||
PEPROCESS Process;
|
||||
PVOID MappedSystemVa;
|
||||
PVOID StartVa;
|
||||
ULONG ByteCount;
|
||||
ULONG ByteOffset;
|
||||
} MDL, *PMDL;
|
||||
|
||||
/* Color tables structure definition */
|
||||
typedef struct _MMCOLOR_TABLES
|
||||
|
||||
357
sdk/xtdk/obtypes.h
Normal file
357
sdk/xtdk/obtypes.h
Normal file
@@ -0,0 +1,357 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: sdk/xtdk/obtypes.h
|
||||
* DESCRIPTION: Object Manager structures definitions
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTDK_OBTYPES_H
|
||||
#define __XTDK_OBTYPES_H
|
||||
|
||||
#include <xtbase.h>
|
||||
#include <xttypes.h>
|
||||
#include <xtstruct.h>
|
||||
#include <iotypes.h>
|
||||
|
||||
|
||||
/* Object header information flag masks */
|
||||
#define OBJECT_FLAG_NEW_OBJECT 0x01
|
||||
#define OBJECT_FLAG_KERNEL_MODE 0x02
|
||||
#define OBJECT_FLAG_CREATOR_INFO 0x04
|
||||
#define OBJECT_FLAG_EXCLUSIVE 0x08
|
||||
#define OBJECT_FLAG_PERMANENT 0x10
|
||||
#define OBJECT_FLAG_SECURITY_QUOTA 0x20
|
||||
#define OBJECT_FLAG_SINGLE_PROCESS 0x40
|
||||
#define OBJECT_FLAG_DEFER_DELETE 0x80
|
||||
|
||||
/* Object lock states */
|
||||
#define OBJECT_LOCK_STATE_WAIT_EXCLUSIVE 0xAAAA1234
|
||||
#define OBJECT_LOCK_WAITSHARED_SIGNATURE 0xBBBB1234
|
||||
#define OBJECT_LOCK_STATE_OWNED_EXCLUSIVE 0xCCCC1234
|
||||
#define OBJECT_LOCK_OWNEDSHARED_SIGNATURE 0xDDDD1234
|
||||
#define OBJECT_LOCK_STATE_RELEASED_SIGNATURE 0xEEEE1234
|
||||
#define OBJECT_LOCK_STATE_INITIALIZED 0xFFFF1234
|
||||
|
||||
/* Object name attribute flags */
|
||||
#define OBJECT_INHERIT 0x00000002L
|
||||
#define OBJECT_PERMANENT 0x00000010L
|
||||
#define OBJECT_EXCLUSIVE 0x00000020L
|
||||
#define OBJECT_CASE_INSENSITIVE 0x00000040L
|
||||
#define OBJECT_OPENIF 0x00000080L
|
||||
#define OBJECT_OPENLINK 0x00000100L
|
||||
#define OBJECT_KERNEL_HANDLE 0x00000200L
|
||||
#define OBJECT_FORCE_ACCESS_CHECK 0x00000400L
|
||||
#define OBJECT_VALID_ATTRIBUTES 0x000007F2L
|
||||
|
||||
/* Maximum number of defined object types */
|
||||
#define OBJECT_MAX_DEFINED_OBJECT_TYPES 48
|
||||
|
||||
/* Object name buffer size */
|
||||
#define OBJECT_NAME_BUFFER_SIZE 248
|
||||
|
||||
/* Object name lock flags */
|
||||
#define OBJECT_NAME_LOCKED ((LONG)0x80000000)
|
||||
#define OBJECT_REMOVE_QUEUE_LOCKED (PVOID)1
|
||||
|
||||
/* Object name path separator */
|
||||
#define OBJECT_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
|
||||
|
||||
/* Number of hash buckets */
|
||||
#define OBJECT_NUMBER_HASH_BUCKETS 37
|
||||
|
||||
|
||||
/* C/C++ specific code */
|
||||
#ifndef __XTOS_ASSEMBLER__
|
||||
|
||||
/* Object Manager routine callbacks */
|
||||
typedef VOID (XTAPI *POB_DUMP_METHOD)(IN PVOID Object, IN POBJECT_DUMP_CONTROL Control);
|
||||
typedef XTSTATUS (XTAPI *POB_OPEN_METHOD)(IN OBJECT_OPEN_REASON Reason, IN PEPROCESS Process, IN PVOID ObjectBody, IN ACCESS_MASK GrantedAccess, IN ULONG HandleCount);
|
||||
typedef VOID (XTAPI *POB_CLOSE_METHOD)(IN PEPROCESS Process, IN PVOID Object, IN ACCESS_MASK GrantedAccess, IN ULONG ProcessHandleCount, IN ULONG SystemHandleCount);
|
||||
typedef VOID (XTAPI *POB_DELETE_METHOD)(IN PVOID Object);
|
||||
typedef XTSTATUS (XTAPI *POB_PARSE_METHOD)(IN PVOID ParseObject, IN PVOID ObjectType, IN OUT PACCESS_STATE AccessState, IN KPROCESSOR_MODE ProcessorMode, IN ULONG Attributes, IN OUT PUNICODE_STRING CompleteName, IN OUT PUNICODE_STRING RemainingName, IN OUT PVOID Context, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos, OUT PVOID *Object);
|
||||
typedef XTSTATUS (XTAPI *POB_SECURITY_METHOD)(IN PVOID Object, IN SECURITY_OPERATION_CODE OperationType, IN PSECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN OUT PULONG CapturedLength, IN OUT PSECURITY_DESCRIPTOR *ObjectSecurityDescriptor, IN MMPOOL_TYPE PoolType, IN PGENERIC_MAPPING GenericMapping);
|
||||
typedef XTSTATUS (XTAPI *POB_QUERYNAME_METHOD)(IN PVOID Object, IN BOOLEAN HasObjectName, OUT POBJECT_NAME_INFORMATION ObjectNameInfo, IN ULONG Length, OUT PULONG ReturnLength, IN KPROCESSOR_MODE ProcessorMode);
|
||||
typedef BOOLEAN (XTAPI *POB_OKAYTOCLOSE_METHOD)(IN PEPROCESS Process, IN PVOID Object, IN HANDLE Handle, IN KPROCESSOR_MODE ProcessorMode);
|
||||
|
||||
/* Bitmasks used to identify the presence of optional object headers in memory */
|
||||
typedef enum _OBJECT_HEADER_INFO
|
||||
{
|
||||
ObjectHeaderInfoNone = 0,
|
||||
ObjectHeaderInfoCreatorInfo = 0x01,
|
||||
ObjectHeaderInfoNameInfo = 0x02,
|
||||
ObjectHeaderInfoHandleInfo = 0x04,
|
||||
ObjectHeaderInfoQuotaInfo = 0x08,
|
||||
ObjectHeaderInfoProcessInfo = 0x10
|
||||
} OBJECT_HEADER_INFO, *POBJECT_HEADER_INFO;
|
||||
|
||||
/* List of information classes used when querying or setting object attributes */
|
||||
typedef enum _OBJECT_INFORMATION_CLASS
|
||||
{
|
||||
ObjectBasicInfo,
|
||||
ObjectNameInfo,
|
||||
ObjectTypeInfo,
|
||||
ObjectAllInfo,
|
||||
ObjectHandleFlagInfo
|
||||
} OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS;
|
||||
|
||||
/* List of valid reasons for creating, opening, or duplicating an object handle */
|
||||
typedef enum _OBJECT_OPEN_REASON
|
||||
{
|
||||
ObCreateHandle,
|
||||
ObOpenHandle,
|
||||
ObDuplicateHandle,
|
||||
ObInheritHandle,
|
||||
ObMaxOpenReason
|
||||
} OBJECT_OPEN_REASON, *POBJECT_OPEN_REASON;
|
||||
|
||||
/* Mapping of device names to object manager devices */
|
||||
typedef struct _DEVICE_MAP
|
||||
{
|
||||
POBJECT_DIRECTORY DevicesDirectory;
|
||||
POBJECT_DIRECTORY GlobalDevicesDirectory;
|
||||
ULONG ReferenceCount;
|
||||
ULONG DriveMap;
|
||||
UCHAR DriveType[32];
|
||||
} DEVICE_MAP, *PDEVICE_MAP;
|
||||
|
||||
/* Parameters provided by a caller when creating or opening an object */
|
||||
typedef struct _OBJECT_ATTRIBUTES
|
||||
{
|
||||
ULONG Length;
|
||||
HANDLE RootDirectory;
|
||||
PUNICODE_STRING ObjectName;
|
||||
ULONG Attributes;
|
||||
PSECURITY_DESCRIPTOR SecurityDescriptor;
|
||||
PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
|
||||
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
|
||||
|
||||
/* Internal data stored during object creation */
|
||||
typedef struct _OBJECT_CREATE_INFORMATION
|
||||
{
|
||||
ULONG Attributes;
|
||||
HANDLE RootDirectory;
|
||||
PVOID ParseContext;
|
||||
KPROCESSOR_MODE ProbeMode;
|
||||
ULONG PagedPoolCharge;
|
||||
ULONG NonPagedPoolCharge;
|
||||
ULONG SecurityDescriptorCharge;
|
||||
PSECURITY_DESCRIPTOR SecurityDescriptor;
|
||||
PSECURITY_QUALITY_OF_SERVICE SecurityQos;
|
||||
SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
|
||||
} OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION;
|
||||
|
||||
/* Optional header storing information about the object's creator */
|
||||
typedef struct _OBJECT_CREATOR_INFO
|
||||
{
|
||||
LIST_ENTRY TypeList;
|
||||
HANDLE CreatorProcessId;
|
||||
} OBJECT_CREATOR_INFO, *POBJECT_CREATOR_INFO;
|
||||
|
||||
/* Directory object used to structure the namespace hierarchy */
|
||||
typedef struct _OBJECT_DIRECTORY
|
||||
{
|
||||
POBJECT_DIRECTORY_ENTRY HashBuckets[OBJECT_NUMBER_HASH_BUCKETS];
|
||||
KPUSH_LOCK Lock;
|
||||
PDEVICE_MAP DeviceMap;
|
||||
ULONG SessionId;
|
||||
} OBJECT_DIRECTORY, *POBJECT_DIRECTORY;
|
||||
|
||||
/* Linked list entry representing an object within a directory bucket */
|
||||
typedef struct _OBJECT_DIRECTORY_ENTRY
|
||||
{
|
||||
POBJECT_DIRECTORY_ENTRY ChainLink;
|
||||
PVOID Object;
|
||||
ULONG HashValue;
|
||||
} OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;
|
||||
|
||||
/* Control structure used during object diagnostic dumps */
|
||||
typedef struct _OBJECT_DUMP_CONTROL
|
||||
{
|
||||
PVOID Stream;
|
||||
ULONG Detail;
|
||||
} OBJECT_DUMP_CONTROL, *POBJECT_DUMP_CONTROL;
|
||||
|
||||
/* Entry tracking the number of open handles a specific process holds */
|
||||
typedef struct _OBJECT_HANDLE_COUNT_ENTRY
|
||||
{
|
||||
PEPROCESS OwningProcess;
|
||||
ULONG HandleTableIndex;
|
||||
ULONG HandleCount;
|
||||
} OBJECT_HANDLE_COUNT_ENTRY, *POBJECT_HANDLE_COUNT_ENTRY;
|
||||
|
||||
/* Database array tracking handle counts for objects opened by processes */
|
||||
typedef struct _OBJECT_HANDLE_COUNT_DATABASE
|
||||
{
|
||||
ULONG CountEntries;
|
||||
OBJECT_HANDLE_COUNT_ENTRY HandleCountEntries[1];
|
||||
} OBJECT_HANDLE_COUNT_DATABASE, *POBJECT_HANDLE_COUNT_DATABASE;
|
||||
|
||||
/* Database tracking all handle counts across different processes */
|
||||
typedef struct _OBJECT_HANDLE_COUNT_INFORMATION
|
||||
{
|
||||
ULONG TotalHandleCount;
|
||||
ULONG EntryCount;
|
||||
POBJECT_HANDLE_COUNT_ENTRY Entries;
|
||||
} OBJECT_HANDLE_COUNT_INFORMATION, *POBJECT_HANDLE_COUNT_INFORMATION;
|
||||
|
||||
/* Optional header containing the handle count database */
|
||||
typedef struct _OBJECT_HANDLE_INFO
|
||||
{
|
||||
OBJECT_HANDLE_COUNT_INFORMATION HandleCounts;
|
||||
} OBJECT_HANDLE_INFO, *POBJECT_HANDLE_INFO;
|
||||
|
||||
/* Core object header */
|
||||
typedef struct _OBJECT_HEADER
|
||||
{
|
||||
LONG_PTR PointerCount;
|
||||
union
|
||||
{
|
||||
LONG_PTR HandleCount;
|
||||
VOLATILE PVOID NextToFree;
|
||||
};
|
||||
POBJECT_TYPE Type;
|
||||
UCHAR NameInfoOffset;
|
||||
UCHAR HandleInfoOffset;
|
||||
UCHAR QuotaInfoOffset;
|
||||
UCHAR Flags;
|
||||
union
|
||||
{
|
||||
POBJECT_CREATE_INFORMATION ObjectCreateInfo;
|
||||
PVOID QuotaBlockCharged;
|
||||
};
|
||||
PSECURITY_DESCRIPTOR SecurityDescriptor;
|
||||
QUAD Body;
|
||||
} OBJECT_HEADER, *POBJECT_HEADER;
|
||||
|
||||
/* Creator tracking information */
|
||||
typedef struct _OBJECT_HEADER_CREATOR_INFO
|
||||
{
|
||||
LIST_ENTRY TypeList;
|
||||
PVOID CreatorUniqueProcess;
|
||||
USHORT CreatorBackTraceIndex;
|
||||
USHORT Reserved;
|
||||
} OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO;
|
||||
|
||||
/* Union representing either a single handle count entry or a full database */
|
||||
typedef union _OBJECT_HEADER_HANDLE_INFO
|
||||
{
|
||||
POBJECT_HANDLE_COUNT_DATABASE HandleCountDatabase;
|
||||
OBJECT_HANDLE_COUNT_ENTRY SingleEntry;
|
||||
} OBJECT_HEADER_HANDLE_INFO, *POBJECT_HEADER_HANDLE_INFO;
|
||||
|
||||
/* Name information stored in the object header */
|
||||
typedef struct _OBJECT_HEADER_NAME_INFO
|
||||
{
|
||||
POBJECT_DIRECTORY Directory;
|
||||
UNICODE_STRING Name;
|
||||
ULONG QueryReferences;
|
||||
ULONG Reserved;
|
||||
ULONG DbgReferenceCount;
|
||||
} OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
|
||||
|
||||
/* Active quota information stored in the object header */
|
||||
typedef struct _OBJECT_HEADER_QUOTA_INFO
|
||||
{
|
||||
ULONG PagedPoolCharge;
|
||||
ULONG NonPagedPoolCharge;
|
||||
ULONG SecurityDescriptorCharge;
|
||||
PEPROCESS ExclusiveProcess;
|
||||
} OBJECT_HEADER_QUOTA_INFO, *POBJECT_HEADER_QUOTA_INFO;
|
||||
|
||||
/* Context maintained during namespace traversal and directory lookups */
|
||||
typedef struct _OBJECT_LOOKUP_CONTEXT
|
||||
{
|
||||
POBJECT_DIRECTORY Directory;
|
||||
PVOID Object;
|
||||
USHORT HashIndex;
|
||||
BOOLEAN DirectoryLocked;
|
||||
VOLATILE ULONG LockStateSignature;
|
||||
} OBJECT_LOOKUP_CONTEXT, *POBJECT_LOOKUP_CONTEXT;
|
||||
|
||||
/* Optional header storing the object's hierarchical name and directory links */
|
||||
typedef struct _OBJECT_NAME_INFO
|
||||
{
|
||||
LIST_ENTRY ObjectLinks;
|
||||
UNICODE_STRING ObjectName;
|
||||
PWSTR ObjectDirectoryPath;
|
||||
} OBJECT_NAME_INFO, *POBJECT_NAME_INFO;
|
||||
|
||||
/* Structure used to query an object's name */
|
||||
typedef struct _OBJECT_NAME_INFORMATION
|
||||
{
|
||||
UNICODE_STRING Name;
|
||||
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
|
||||
|
||||
/* Memory layout sizes for the object's optional headers */
|
||||
typedef struct _OBJECT_OPTIONAL_HEADER_LAYOUT
|
||||
{
|
||||
ULONG QuotaInfoSize;
|
||||
ULONG HandleInfoSize;
|
||||
ULONG NameInfoSize;
|
||||
ULONG CreatorInfoSize;
|
||||
ULONG TotalSize;
|
||||
} OBJECT_OPTIONAL_HEADER_LAYOUT, *POBJECT_OPTIONAL_HEADER_LAYOUT;
|
||||
|
||||
/* Information block linking an object to a specific process */
|
||||
typedef struct _OBJECT_PROCESS_INFO
|
||||
{
|
||||
LIST_ENTRY Entry;
|
||||
PEPROCESS Process;
|
||||
ULONG ReferenceCount;
|
||||
} OBJECT_PROCESS_INFO, *POBJECT_PROCESS_INFO;
|
||||
|
||||
/* Optional header tracking memory pool charges */
|
||||
typedef struct _OBJECT_QUOTA_INFO
|
||||
{
|
||||
ULONG PagedPoolCharge;
|
||||
ULONG NonPagedPoolCharge;
|
||||
ULONG SecurityDescriptorCharge;
|
||||
PEPROCESS ExclusiveProcess;
|
||||
} OBJECT_QUOTA_INFO, *POBJECT_QUOTA_INFO;
|
||||
|
||||
/* Configuration block defining the lifecycle and behavior of a specific object type */
|
||||
typedef struct _OBJECT_TYPE_INITIALIZER
|
||||
{
|
||||
USHORT Length;
|
||||
BOOLEAN UseDefaultObject;
|
||||
BOOLEAN CaseInsensitive;
|
||||
ULONG InvalidAttributes;
|
||||
GENERIC_MAPPING GenericMapping;
|
||||
ULONG ValidAccessMask;
|
||||
BOOLEAN SecurityRequired;
|
||||
BOOLEAN MaintainHandleCount;
|
||||
BOOLEAN MaintainTypeList;
|
||||
MMPOOL_TYPE PoolType;
|
||||
ULONG DefaultPagedPoolCharge;
|
||||
ULONG DefaultNonPagedPoolCharge;
|
||||
POB_DUMP_METHOD DumpProcedure;
|
||||
POB_OPEN_METHOD OpenProcedure;
|
||||
POB_CLOSE_METHOD CloseProcedure;
|
||||
POB_DELETE_METHOD DeleteProcedure;
|
||||
POB_PARSE_METHOD ParseProcedure;
|
||||
POB_SECURITY_METHOD SecurityProcedure;
|
||||
POB_QUERYNAME_METHOD QueryNameProcedure;
|
||||
POB_OKAYTOCLOSE_METHOD OkayToCloseProcedure;
|
||||
} OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
|
||||
|
||||
|
||||
/* Descriptor representing a registered object type in the system */
|
||||
typedef struct _OBJECT_TYPE
|
||||
{
|
||||
LIST_ENTRY TypeList;
|
||||
UNICODE_STRING Name;
|
||||
PVOID DefaultObject;
|
||||
ULONG Index;
|
||||
ULONG TotalNumberOfObjects;
|
||||
ULONG TotalNumberOfHandles;
|
||||
ULONG HighWaterNumberOfObjects;
|
||||
ULONG HighWaterNumberOfHandles;
|
||||
OBJECT_TYPE_INITIALIZER TypeInfo;
|
||||
KPUSH_LOCK TypeLock;
|
||||
ULONG Key;
|
||||
LIST_ENTRY CallbackList;
|
||||
} OBJECT_TYPE;
|
||||
|
||||
#endif /* __XTOS_ASSEMBLER__ */
|
||||
#endif /* __XTDK_OBTYPES_H */
|
||||
@@ -14,6 +14,10 @@
|
||||
#include <ketypes.h>
|
||||
|
||||
|
||||
/* Processor performance scale factor */
|
||||
#define POWER_PERFORMANCE_SCALE 100
|
||||
|
||||
|
||||
/* C/C++ specific code */
|
||||
#ifndef __XTOS_ASSEMBLER__
|
||||
|
||||
@@ -21,6 +25,56 @@
|
||||
typedef VOID (XTFASTCALL *PPROCESSOR_IDLE_FUNCTION)(IN PPROCESSOR_POWER_STATE PowerState);
|
||||
typedef XTSTATUS (XTFASTCALL *PSET_PROCESSOR_THROTTLE)(IN UCHAR Throttle);
|
||||
|
||||
/* Device power states */
|
||||
typedef enum _DEVICE_POWER_STATE
|
||||
{
|
||||
PowerDeviceUnspecified = 0,
|
||||
PowerDeviceD0,
|
||||
PowerDeviceD1,
|
||||
PowerDeviceD2,
|
||||
PowerDeviceD3,
|
||||
PowerDeviceMaximum
|
||||
} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
|
||||
|
||||
/* Power actions list */
|
||||
typedef enum _POWER_ACTION
|
||||
{
|
||||
PowerActionNone = 0,
|
||||
PowerActionReserved,
|
||||
PowerActionSleep,
|
||||
PowerActionHibernate,
|
||||
PowerActionShutdown,
|
||||
PowerActionShutdownReset,
|
||||
PowerActionShutdownOff,
|
||||
PowerActionWarmEject
|
||||
} POWER_ACTION, *PPOWER_ACTION;
|
||||
|
||||
typedef enum _POWER_STATE_TYPE
|
||||
{
|
||||
SystemPowerState = 0,
|
||||
DevicePowerState
|
||||
} POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
|
||||
|
||||
/* System power states */
|
||||
typedef enum _SYSTEM_POWER_STATE
|
||||
{
|
||||
PowerSystemUnspecified = 0,
|
||||
PowerSystemWorking,
|
||||
PowerSystemSleeping1,
|
||||
PowerSystemSleeping2,
|
||||
PowerSystemSleeping3,
|
||||
PowerSystemHibernate,
|
||||
PowerSystemShutdown,
|
||||
PowerSystemMaximum
|
||||
} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
|
||||
|
||||
/* Power state union definition */
|
||||
typedef union _POWER_STATE
|
||||
{
|
||||
SYSTEM_POWER_STATE SystemState;
|
||||
DEVICE_POWER_STATE DeviceState;
|
||||
} POWER_STATE, *PPOWER_STATE;
|
||||
|
||||
/* Processor IDLE times structure definition */
|
||||
typedef struct _PROCESSOR_IDLE_TIMES
|
||||
{
|
||||
@@ -91,5 +145,24 @@ typedef struct _PROCESSOR_POWER_STATE
|
||||
ULONG LastC3UserTime;
|
||||
} PROCESSOR_POWER_STATE, *PPROCESSOR_POWER_STATE;
|
||||
|
||||
/* System power state context structure definition */
|
||||
typedef struct _SYSTEM_POWER_STATE_CONTEXT
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
ULONG Reserved1:8;
|
||||
ULONG TargetSystemState:4;
|
||||
ULONG EffectiveSystemState:4;
|
||||
ULONG CurrentSystemState:4;
|
||||
ULONG IgnoreHibernationPath:1;
|
||||
ULONG PseudoTransition:1;
|
||||
ULONG Reserved2:10;
|
||||
};
|
||||
ULONG ContextAsUlong;
|
||||
};
|
||||
} SYSTEM_POWER_STATE_CONTEXT, *PSYSTEM_POWER_STATE_CONTEXT;
|
||||
|
||||
#endif /* __XTOS_ASSEMBLER__ */
|
||||
#endif /* __XTDK_POTYPES_H */
|
||||
|
||||
@@ -10,19 +10,56 @@
|
||||
#define __XTDK_PSTYPES_H
|
||||
|
||||
#include <xttypes.h>
|
||||
#include <ketypes.h>
|
||||
#include <xtstruct.h>
|
||||
#include <extypes.h>
|
||||
|
||||
|
||||
/* Quota bypass marker */
|
||||
#define PS_QUOTA_BYPASS_MARKER ((PEPROCESS_QUOTA_BLOCK)1)
|
||||
|
||||
/* C/C++ specific code */
|
||||
#ifndef __XTOS_ASSEMBLER__
|
||||
|
||||
/* Process quota types */
|
||||
typedef enum _PS_QUOTA_TYPE
|
||||
{
|
||||
PsNonPagedPool,
|
||||
PsPagedPool,
|
||||
PsPageFile,
|
||||
PsQuotaTypes
|
||||
} PS_QUOTA_TYPE, *PPS_QUOTA_TYPE;
|
||||
|
||||
/* Kernel's representation of a process object */
|
||||
typedef struct _EPROCESS
|
||||
{
|
||||
KPROCESS ProcessControlBlock;
|
||||
KPUSH_LOCK ProcessLock;
|
||||
LARGE_INTEGER CreateTime;
|
||||
LARGE_INTEGER ExitTime;
|
||||
EX_RUNDOWN_REFERENCE RundownProtect;
|
||||
HANDLE UniqueProcessId;
|
||||
SIZE_T QuotaUsage[PsQuotaTypes];
|
||||
UINT Reserved0;
|
||||
} EPROCESS, *PEPROCESS;
|
||||
|
||||
/* Kernel's representation of a process quota entry*/
|
||||
typedef struct _EPROCESS_QUOTA_ENTRY
|
||||
{
|
||||
SIZE_T Usage;
|
||||
SIZE_T Limit;
|
||||
SIZE_T Peak;
|
||||
SIZE_T Return;
|
||||
} EPROCESS_QUOTA_ENTRY, *PEPROCESS_QUOTA_ENTRY;
|
||||
|
||||
/* Kernel's representation of a process quota block */
|
||||
typedef struct _EPROCESS_QUOTA_BLOCK
|
||||
{
|
||||
EPROCESS_QUOTA_ENTRY QuotaEntry[PsQuotaTypes];
|
||||
LIST_ENTRY QuotaList;
|
||||
ULONG ReferenceCount;
|
||||
ULONG ProcessCount;
|
||||
} EPROCESS_QUOTA_BLOCK, *PEPROCESS_QUOTA_BLOCK;
|
||||
|
||||
/* Kernel's representation of a thread object */
|
||||
typedef struct _ETHREAD
|
||||
{
|
||||
|
||||
@@ -123,6 +123,12 @@ RtlCopyString(IN PCHAR Destination,
|
||||
IN PCSTR Source,
|
||||
IN ULONG Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlCopyUnicodeString(IN OUT PUNICODE_STRING Destination,
|
||||
IN PCUNICODE_STRING Source);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
@@ -187,6 +193,18 @@ XTCDECL
|
||||
VOID
|
||||
RtlInitializeListHead(IN PLIST_ENTRY ListHead);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlInitializeUnicodeString(OUT PUNICODE_STRING Destination,
|
||||
IN PCWSTR Source);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
XTSTATUS
|
||||
RtlInitializeUnicodeStringEx(OUT PUNICODE_STRING Destination,
|
||||
IN PCWSTR Source);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
* FILE: sdk/xtdk/rtltypes.h
|
||||
* DESCRIPTION: Runtime library structures definitions
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
* Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTDK_RTLTYPES_H
|
||||
@@ -11,6 +12,7 @@
|
||||
|
||||
#include <xtbase.h>
|
||||
#include <xttypes.h>
|
||||
#include ARCH_HEADER(xtstruct.h)
|
||||
|
||||
|
||||
/* UUID string lengths */
|
||||
@@ -32,6 +34,23 @@
|
||||
#define DOUBLE_SCIENTIFIC_PRECISION -4
|
||||
#define DOUBLE_SIGN_BIT 0x8000000000000000ULL
|
||||
|
||||
/* Exception Record flags */
|
||||
#define EXCEPTION_CONTINUE_SEARCH 0x00
|
||||
#define EXCEPTION_NONCONTINUABLE 0x01
|
||||
#define EXCEPTION_UNWINDING 0x02
|
||||
#define EXCEPTION_EXIT_UNWIND 0x04
|
||||
#define EXCEPTION_STACK_INVALID 0x08
|
||||
#define EXCEPTION_NESTED_CALL 0x10
|
||||
#define EXCEPTION_TARGET_UNWIND 0x20
|
||||
#define EXCEPTION_COLLIDED_UNWIND 0x40
|
||||
|
||||
/* Exception Record accessors */
|
||||
#define EXCEPTION_CODE _exception_code()
|
||||
#define EXCEPTION_INFORMATION (PEXCEPTION_POINTERS)_exception_info()
|
||||
|
||||
/* Maximum number of lead bytes for NLS */
|
||||
#define NLS_MAXIMUM_LEADBYTES 12
|
||||
|
||||
/* Print flag definitions */
|
||||
#define PFL_ALWAYS_PRINT_SIGN 0x00000001
|
||||
#define PFL_SPACE_FOR_PLUS 0x00000002
|
||||
@@ -72,6 +91,74 @@
|
||||
typedef XTSTATUS (*PWRITE_CHARACTER)(IN CHAR Character);
|
||||
typedef XTSTATUS (*PWRITE_WIDE_CHARACTER)(IN WCHAR Character);
|
||||
|
||||
/* Compressed data information structure definition */
|
||||
typedef struct _COMPRESSED_DATA_INFO
|
||||
{
|
||||
USHORT CompressionFormatAndEngine;
|
||||
UCHAR CompressionUnitShift;
|
||||
UCHAR ChunkShift;
|
||||
UCHAR ClusterShift;
|
||||
UCHAR Reserved;
|
||||
USHORT NumberOfChunks;
|
||||
ULONG CompressedChunkSizes[1];
|
||||
} COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO;
|
||||
|
||||
/* Code page table structure definition */
|
||||
typedef struct _CPTABLE_INFO
|
||||
{
|
||||
USHORT CodePage;
|
||||
USHORT MaximumCharacterSize;
|
||||
USHORT DefaultChar;
|
||||
USHORT UniDefaultChar;
|
||||
USHORT TransDefaultChar;
|
||||
USHORT TransUniDefaultChar;
|
||||
USHORT DBCSCodePage;
|
||||
UCHAR LeadByte[NLS_MAXIMUM_LEADBYTES];
|
||||
PUSHORT MultiByteTable;
|
||||
PVOID WideCharTable;
|
||||
PUSHORT DBCSRanges;
|
||||
PUSHORT DBCSOffsets;
|
||||
} CPTABLE_INFO, *PCPTABLE_INFO;
|
||||
|
||||
/* Exception Pointers structure definition */
|
||||
typedef struct _EXCEPTION_POINTERS
|
||||
{
|
||||
PEXCEPTION_RECORD ExceptionRecord;
|
||||
PCONTEXT ContextRecord;
|
||||
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
|
||||
|
||||
/* 128-bit buffer containing a unique identifier value */
|
||||
typedef struct _GUID
|
||||
{
|
||||
UINT Data1;
|
||||
USHORT Data2;
|
||||
USHORT Data3;
|
||||
UCHAR Data4[8];
|
||||
} GUID, *PGUID;
|
||||
|
||||
/* 32-bit double linked list structure definition */
|
||||
typedef struct _LIST_ENTRY32
|
||||
{
|
||||
ULONG Flink;
|
||||
ULONG Blink;
|
||||
} LIST_ENTRY32, *PLIST_ENTRY32;
|
||||
|
||||
/* 64-bit double linked list structure definition */
|
||||
typedef struct _LIST_ENTRY64
|
||||
{
|
||||
ULONGLONG Flink;
|
||||
ULONGLONG Blink;
|
||||
} LIST_ENTRY64, *PLIST_ENTRY64;
|
||||
|
||||
/* NLS table structure definition */
|
||||
typedef struct _NLSTABLE_INFO
|
||||
{
|
||||
CPTABLE_INFO OemTableInfo;
|
||||
CPTABLE_INFO AnsiTableInfo;
|
||||
PUSHORT UpperCaseTable;
|
||||
PUSHORT LowerCaseTable;
|
||||
} NLSTABLE_INFO, *PNLSTABLE_INFO;
|
||||
|
||||
/* Red-black tree node color enumeration list */
|
||||
typedef enum _RTL_BALANCED_NODE_COLOR
|
||||
{
|
||||
@@ -156,6 +243,12 @@ typedef struct _RTL_SHA1_CONTEXT
|
||||
UCHAR Buffer[SHA1_BLOCK_SIZE];
|
||||
} RTL_SHA1_CONTEXT, *PRTL_SHA1_CONTEXT;
|
||||
|
||||
/* Single linked list structure definition */
|
||||
typedef struct _SINGLE_LIST_ENTRY
|
||||
{
|
||||
PSINGLE_LIST_ENTRY Next;
|
||||
} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
|
||||
|
||||
/* Runtime time fields structure definition */
|
||||
typedef struct _TIME_FIELDS
|
||||
{
|
||||
|
||||
201
sdk/xtdk/setypes.h
Normal file
201
sdk/xtdk/setypes.h
Normal file
@@ -0,0 +1,201 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: sdk/xtdk/setypes.h
|
||||
* DESCRIPTION: Kernel Security structures and definitions
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTDK_SETYPES_H
|
||||
#define __XTDK_SETYPES_H
|
||||
|
||||
#include <xttypes.h>
|
||||
#include <xtstruct.h>
|
||||
#include <xtbase.h>
|
||||
|
||||
|
||||
/* Privilege LUIDs */
|
||||
#define SE_LUID_MIN_WELL_KNOWN_PRIVILEGE (LUID){2, 0}
|
||||
#define SE_LUID_CREATE_TOKEN_PRIVILEGE (LUID){2, 0}
|
||||
#define SE_LUID_ASSIGNPRIMARYTOKEN_PRIVILEGE (LUID){3, 0}
|
||||
#define SE_LUID_LOCK_MEMORY_PRIVILEGE (LUID){4, 0}
|
||||
#define SE_LUID_INCREASE_QUOTA_PRIVILEGE (LUID){5, 0}
|
||||
#define SE_LUID_MACHINE_ACCOUNT_PRIVILEGE (LUID){6, 0}
|
||||
#define SE_LUID_TCB_PRIVILEGE (LUID){7, 0}
|
||||
#define SE_LUID_SECURITY_PRIVILEGE (LUID){8, 0}
|
||||
#define SE_LUID_TAKE_OWNERSHIP_PRIVILEGE (LUID){9, 0}
|
||||
#define SE_LUID_LOAD_DRIVER_PRIVILEGE (LUID){10, 0}
|
||||
#define SE_LUID_SYSTEM_PROFILE_PRIVILEGE (LUID){11, 0}
|
||||
#define SE_LUID_SYSTEMTIME_PRIVILEGE (LUID){12, 0}
|
||||
#define SE_LUID_PROF_SINGLE_PROCESS_PRIVILEGE (LUID){13, 0}
|
||||
#define SE_LUID_INC_BASE_PRIORITY_PRIVILEGE (LUID){14, 0}
|
||||
#define SE_LUID_CREATE_PAGEFILE_PRIVILEGE (LUID){15, 0}
|
||||
#define SE_LUID_CREATE_PERMANENT_PRIVILEGE (LUID){16, 0}
|
||||
#define SE_LUID_BACKUP_PRIVILEGE (LUID){17, 0}
|
||||
#define SE_LUID_RESTORE_PRIVILEGE (LUID){18, 0}
|
||||
#define SE_LUID_SHUTDOWN_PRIVILEGE (LUID){19, 0}
|
||||
#define SE_LUID_DEBUG_PRIVILEGE (LUID){20, 0}
|
||||
#define SE_LUID_AUDIT_PRIVILEGE (LUID){21, 0}
|
||||
#define SE_LUID_SYSTEM_ENVIRONMENT_PRIVILEGE (LUID){22, 0}
|
||||
#define SE_LUID_CHANGE_NOTIFY_PRIVILEGE (LUID){23, 0}
|
||||
#define SE_LUID_REMOTE_SHUTDOWN_PRIVILEGE (LUID){24, 0}
|
||||
#define SE_LUID_UNDOCK_PRIVILEGE (LUID){25, 0}
|
||||
#define SE_LUID_SYNC_AGENT_PRIVILEGE (LUID){26, 0}
|
||||
#define SE_LUID_ENABLE_DELEGATION_PRIVILEGE (LUID){27, 0}
|
||||
#define SE_LUID_MANAGE_VOLUME_PRIVILEGE (LUID){28, 0}
|
||||
#define SE_LUID_IMPERSONATE_PRIVILEGE (LUID){29, 0}
|
||||
#define SE_LUID_CREATE_GLOBAL_PRIVILEGE (LUID){30, 0}
|
||||
#define SE_LUID_TRUSTED_CREDMAN_ACCESS_PRIVILEGE (LUID){31, 0}
|
||||
#define SE_LUID_RELABEL_PRIVILEGE (LUID){32, 0}
|
||||
#define SE_LUID_INC_WORKING_SET_PRIVILEGE (LUID){33, 0}
|
||||
#define SE_LUID_TIME_ZONE_PRIVILEGE (LUID){34, 0}
|
||||
#define SE_LUID_CREATE_SYMBOLIC_LINK_PRIVILEGE (LUID){35, 0}
|
||||
|
||||
/* Default security quota */
|
||||
#define SE_DEFAULT_SECURITY_QUOTA 2048
|
||||
|
||||
#define SE_INITIAL_PRIVILEGE_COUNT 3
|
||||
|
||||
/* Token source length */
|
||||
#define SE_TOKEN_SOURCE_LENGTH 8
|
||||
|
||||
/* C/C++ specific code */
|
||||
#ifndef __XTOS_ASSEMBLER__
|
||||
|
||||
/* Security impersonation levels */
|
||||
typedef enum _SECURITY_IMPERSONATION_LEVEL
|
||||
{
|
||||
SecurityAnonymous,
|
||||
SecurityIdentification,
|
||||
SecurityImpersonation,
|
||||
SecurityDelegation
|
||||
} SECURITY_IMPERSONATION_LEVEL, *PSECURITY_IMPERSONATION_LEVEL;
|
||||
|
||||
/* Security operation codes */
|
||||
typedef enum _SECURITY_OPERATION_CODE
|
||||
{
|
||||
SetSecurityDescriptor,
|
||||
QuerySecurityDescriptor,
|
||||
DeleteSecurityDescriptor,
|
||||
AssignSecurityDescriptor
|
||||
} SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
|
||||
|
||||
/* Generic security mapping structure definition */
|
||||
typedef struct _GENERIC_MAPPING
|
||||
{
|
||||
ULONG GenericRead;
|
||||
ULONG GenericWrite;
|
||||
ULONG GenericExecute;
|
||||
ULONG GenericAll;
|
||||
} GENERIC_MAPPING, *PGENERIC_MAPPING;
|
||||
|
||||
/* LUID and attributes structure definition */
|
||||
typedef struct _LUID_AND_ATTRIBUTES
|
||||
{
|
||||
LUID Luid;
|
||||
ULONG Attributes;
|
||||
} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
|
||||
|
||||
/* Initial privilege set structure definition */
|
||||
typedef struct _INITIAL_PRIVILEGE_SET
|
||||
{
|
||||
ULONG PrivilegeCount;
|
||||
ULONG Control;
|
||||
LUID_AND_ATTRIBUTES Privilege[SE_INITIAL_PRIVILEGE_COUNT];
|
||||
} INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
|
||||
|
||||
/* Privilege set structure definition */
|
||||
typedef struct _PRIVILEGE_SET
|
||||
{
|
||||
ULONG PrivilegeCount;
|
||||
ULONG Control;
|
||||
LUID_AND_ATTRIBUTES Privilege[1];
|
||||
} PRIVILEGE_SET, *PPRIVILEGE_SET;
|
||||
|
||||
/* Identifier authority structure definition */
|
||||
typedef struct _SID_IDENTIFIER_AUTHORITY
|
||||
{
|
||||
UCHAR Value[6];
|
||||
} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY;
|
||||
|
||||
/* Security identifier structure definition */
|
||||
typedef struct _SID
|
||||
{
|
||||
UCHAR Revision;
|
||||
UCHAR SubAuthorityCount;
|
||||
SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
|
||||
ULONG SubAuthority[1];
|
||||
} SID, *PSID;
|
||||
|
||||
/* Token source structure definition */
|
||||
typedef struct _TOKEN_SOURCE
|
||||
{
|
||||
CHAR SourceName[SE_TOKEN_SOURCE_LENGTH];
|
||||
LUID SourceIdentifier;
|
||||
} TOKEN_SOURCE, *PTOKEN_SOURCE;
|
||||
|
||||
/* Token control structure definition */
|
||||
typedef struct _TOKEN_CONTROL
|
||||
{
|
||||
LUID TokenId;
|
||||
LUID AuthenticationId;
|
||||
LUID ModifiedId;
|
||||
TOKEN_SOURCE TokenSource;
|
||||
} TOKEN_CONTROL, *PTOKEN_CONTROL;
|
||||
|
||||
/* Security quality of service structure definition */
|
||||
typedef struct _SECURITY_QUALITY_OF_SERVICE
|
||||
{
|
||||
ULONG Length;
|
||||
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
|
||||
SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
|
||||
BOOLEAN EffectiveOnly;
|
||||
} SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
|
||||
|
||||
/* Security client context structure definition */
|
||||
typedef struct _SECURITY_CLIENT_CONTEXT
|
||||
{
|
||||
SECURITY_QUALITY_OF_SERVICE SecurityQos;
|
||||
PACCESS_TOKEN ClientToken;
|
||||
BOOLEAN DirectlyAccessClientToken;
|
||||
BOOLEAN DirectAccessEffectiveOnly;
|
||||
BOOLEAN ServerIsRemote;
|
||||
TOKEN_CONTROL ClientTokenControl;
|
||||
} SECURITY_CLIENT_CONTEXT, *PSECURITY_CLIENT_CONTEXT;
|
||||
|
||||
/* Security subject context structure definition */
|
||||
typedef struct _SECURITY_SUBJECT_CONTEXT
|
||||
{
|
||||
PACCESS_TOKEN ClientToken;
|
||||
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
|
||||
PACCESS_TOKEN PrimaryToken;
|
||||
PVOID ProcessAuditId;
|
||||
} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
|
||||
|
||||
/* Access state structure definition */
|
||||
typedef struct _ACCESS_STATE
|
||||
{
|
||||
LUID OperationID;
|
||||
BOOLEAN SecurityEvaluated;
|
||||
BOOLEAN GenerateAudit;
|
||||
BOOLEAN GenerateOnClose;
|
||||
BOOLEAN PrivilegesAllocated;
|
||||
ULONG Flags;
|
||||
ACCESS_MASK RemainingDesiredAccess;
|
||||
ACCESS_MASK PreviouslyGrantedAccess;
|
||||
ACCESS_MASK OriginalDesiredAccess;
|
||||
SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
|
||||
PSECURITY_DESCRIPTOR SecurityDescriptor;
|
||||
PVOID AuxData;
|
||||
union
|
||||
{
|
||||
INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
|
||||
PRIVILEGE_SET PrivilegeSet;
|
||||
} Privileges;
|
||||
BOOLEAN AuditPrivileges;
|
||||
UNICODE_STRING ObjectName;
|
||||
UNICODE_STRING ObjectTypeName;
|
||||
} ACCESS_STATE, *PACCESS_STATE;
|
||||
|
||||
#endif /* __XTOS_ASSEMBLER__ */
|
||||
#endif /* __XTDK_SETYPES_H */
|
||||
@@ -17,6 +17,12 @@
|
||||
/* C/C++ specific code */
|
||||
#ifndef __XTOS_ASSEMBLER__
|
||||
|
||||
/* Access mask */
|
||||
typedef ULONG ACCESS_MASK, *PACCESS_MASK;
|
||||
|
||||
/* Device type */
|
||||
typedef ULONG DEVICE_TYPE;
|
||||
|
||||
/* Kernel affinity */
|
||||
typedef ULONG_PTR KAFFINITY, *PKAFFINITY;
|
||||
|
||||
@@ -32,6 +38,12 @@ typedef UCHAR KRUNLEVEL, *PKRUNLEVEL;
|
||||
/* Spin locks synchronization mechanism */
|
||||
typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
|
||||
|
||||
/* Locale identifier */
|
||||
typedef ULONG LCID;
|
||||
|
||||
/* Access token */
|
||||
typedef PVOID PACCESS_TOKEN;
|
||||
|
||||
/* Page Frame Number count */
|
||||
typedef ULONG PFN_COUNT;
|
||||
|
||||
@@ -41,75 +53,14 @@ typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
|
||||
/* Physical address */
|
||||
typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;
|
||||
|
||||
/* 128-bit buffer containing a unique identifier value */
|
||||
typedef struct _GUID
|
||||
{
|
||||
UINT Data1;
|
||||
USHORT Data2;
|
||||
USHORT Data3;
|
||||
UCHAR Data4[8];
|
||||
} GUID, *PGUID;
|
||||
/* Security descriptor */
|
||||
typedef PVOID PSECURITY_DESCRIPTOR;
|
||||
|
||||
/* Double linked list structure definition */
|
||||
typedef struct _LIST_ENTRY
|
||||
{
|
||||
PLIST_ENTRY Flink;
|
||||
PLIST_ENTRY Blink;
|
||||
} LIST_ENTRY, *PLIST_ENTRY;
|
||||
/* Security context tracking mode */
|
||||
typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
|
||||
|
||||
/* 32-bit double linked list structure definition */
|
||||
typedef struct _LIST_ENTRY32
|
||||
{
|
||||
ULONG Flink;
|
||||
ULONG Blink;
|
||||
} LIST_ENTRY32, *PLIST_ENTRY32;
|
||||
|
||||
/* 64-bit double linked list structure definition */
|
||||
typedef struct _LIST_ENTRY64
|
||||
{
|
||||
ULONGLONG Flink;
|
||||
ULONGLONG Blink;
|
||||
} LIST_ENTRY64, *PLIST_ENTRY64;
|
||||
|
||||
/* Single linked list structure definition */
|
||||
typedef struct _SINGLE_LIST_ENTRY
|
||||
{
|
||||
PSINGLE_LIST_ENTRY Next;
|
||||
} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
|
||||
|
||||
/* Header for a sequenced single linked list union definition */
|
||||
typedef union _SINGLE_LIST_HEADER
|
||||
{
|
||||
ULONGLONG Alignment;
|
||||
struct
|
||||
{
|
||||
SINGLE_LIST_ENTRY Next;
|
||||
USHORT Depth;
|
||||
USHORT Sequence;
|
||||
};
|
||||
} SINGLE_LIST_HEADER, *PSINGLE_LIST_HEADER;
|
||||
|
||||
/* 128-bit 16-byte aligned XMM register */
|
||||
typedef struct _M128
|
||||
{
|
||||
ULONGLONG Low;
|
||||
LONGLONG High;
|
||||
} ALIGN(16) M128, *PM128;
|
||||
|
||||
/* Dispatcher object header structure definition */
|
||||
typedef struct _DISPATCHER_HEADER
|
||||
{
|
||||
UCHAR Type;
|
||||
union
|
||||
{
|
||||
UCHAR Absolute;
|
||||
UCHAR NpxIrql;
|
||||
};
|
||||
UCHAR Inserted;
|
||||
BOOLEAN DebugActive;
|
||||
LONG SignalState;
|
||||
LIST_ENTRY WaitListHead;
|
||||
} DISPATCHER_HEADER, *PDISPATCHER_HEADER;
|
||||
/* Security information */
|
||||
typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
|
||||
|
||||
#endif /* __XTOS_ASSEMBLER_ */
|
||||
#endif /* __XTDK_XTBASE_H */
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#define MAXCHAR 0x7F
|
||||
#define MINSHORT 0x8000
|
||||
#define MAXSHORT 0x7FFF
|
||||
#define MAXUSHORT 0xFFFF
|
||||
#define MINLONG 0x80000000
|
||||
#define MAXLONG 0x7FFFFFFF
|
||||
#define MAXULONG 0xFFFFFFFF
|
||||
|
||||
@@ -28,22 +28,27 @@
|
||||
#include <xtuefi.h>
|
||||
|
||||
/* Low level data types headers */
|
||||
#include <cmtypes.h>
|
||||
#include <extypes.h>
|
||||
#include <hltypes.h>
|
||||
#include <iotypes.h>
|
||||
#include <kdtypes.h>
|
||||
#include <ketypes.h>
|
||||
#include <ldrtypes.h>
|
||||
#include <lpctypes.h>
|
||||
#include <mmtypes.h>
|
||||
#include <obtypes.h>
|
||||
#include <potypes.h>
|
||||
#include <pstypes.h>
|
||||
#include <rtltypes.h>
|
||||
#include <setypes.h>
|
||||
|
||||
/* Architecture-specific low level data types headers */
|
||||
#include ARCH_HEADER(artypes.h)
|
||||
#include ARCH_HEADER(hltypes.h)
|
||||
#include ARCH_HEADER(ketypes.h)
|
||||
#include ARCH_HEADER(mmtypes.h)
|
||||
#include ARCH_HEADER(rtltypes.h)
|
||||
|
||||
/* XT routines */
|
||||
#include <exfuncs.h>
|
||||
|
||||
@@ -48,6 +48,20 @@
|
||||
|
||||
/* XT status code definitions */
|
||||
#define STATUS_SUCCESS ((XTSTATUS) 0x00000000L)
|
||||
#define STATUS_WAIT_0 ((XTSTATUS) 0x00000000L)
|
||||
#define STATUS_WAIT_1 ((XTSTATUS) 0x00000001L)
|
||||
#define STATUS_WAIT_2 ((XTSTATUS) 0x00000002L)
|
||||
#define STATUS_WAIT_3 ((XTSTATUS) 0x00000003L)
|
||||
#define STATUS_WAIT_63 ((XTSTATUS) 0x0000003FL)
|
||||
#define STATUS_ABANDONED ((XTSTATUS) 0x00000080L)
|
||||
#define STATUS_ABANDONED_WAIT_0 ((XTSTATUS) 0x00000080L)
|
||||
#define STATUS_ABANDONED_WAIT_63 ((XTSTATUS) 0x000000BFL)
|
||||
#define STATUS_ALERTED ((XTSTATUS) 0x00000101L)
|
||||
#define STATUS_TIMEOUT ((XTSTATUS) 0x00000102L)
|
||||
#define STATUS_PENDING ((XTSTATUS) 0x00000103L)
|
||||
#define STATUS_REPARSE ((XTSTATUS) 0x00000104L)
|
||||
#define STATUS_DATATYPE_MISALIGNMENT ((XTSTATUS) 0x80000002L)
|
||||
#define STATUS_WAKE_SYSTEM_DEBUGGER ((XTSTATUS) 0x80000007L)
|
||||
#define STATUS_END_OF_MEDIA ((XTSTATUS) 0x8000001EL)
|
||||
#define STATUS_RESOURCE_LOCKED ((XTSTATUS) 0xC0000000L)
|
||||
#define STATUS_UNSUCCESSFUL ((XTSTATUS) 0xC0000001L)
|
||||
@@ -59,6 +73,9 @@
|
||||
#define STATUS_INVALID_PARAMETER ((XTSTATUS) 0xC000000DL)
|
||||
#define STATUS_END_OF_FILE ((XTSTATUS) 0xC0000011L)
|
||||
#define STATUS_NO_MEMORY ((XTSTATUS) 0xC0000017L)
|
||||
#define STATUS_BUFFER_TOO_SMALL ((XTSTATUS) 0xC0000023L)
|
||||
#define STATUS_OBJECT_NAME_INVALID ((XTSTATUS) 0xC0000033L)
|
||||
#define STATUS_OBJECT_NAME_COLLISION ((XTSTATUS) 0xC0000035L)
|
||||
#define STATUS_PORT_DISCONNECTED ((XTSTATUS) 0xC0000037L)
|
||||
#define STATUS_CRC_ERROR ((XTSTATUS) 0xC000003FL)
|
||||
#define STATUS_FLOAT_OVERFLOW ((XTSTATUS) 0xC0000091L)
|
||||
@@ -66,8 +83,9 @@
|
||||
#define STATUS_INSUFFICIENT_RESOURCES ((XTSTATUS) 0xC000009AL)
|
||||
#define STATUS_DEVICE_NOT_READY ((XTSTATUS) 0xC00000A3L)
|
||||
#define STATUS_NOT_SUPPORTED ((XTSTATUS) 0xC00000BBL)
|
||||
#define STATUS_TIMEOUT ((XTSTATUS) 0x00000102L)
|
||||
#define STATUS_NAME_TOO_LONG ((XTSTATUS) 0xC0000106L)
|
||||
#define STATUS_IO_DEVICE_ERROR ((XTSTATUS) 0xC0000185L)
|
||||
#define STATUS_MUTEX_LIMIT_EXCEEDED ((XTSTATUS) 0xC0000191L)
|
||||
#define STATUS_NOT_FOUND ((XTSTATUS) 0xC0000225L)
|
||||
|
||||
#endif /* __XTDK_XTSTATUS_H */
|
||||
|
||||
@@ -17,6 +17,12 @@
|
||||
|
||||
/* Enumeration lists forward references */
|
||||
typedef enum _ADJUST_REASON ADJUST_REASON, *PADJUST_REASON;
|
||||
typedef enum _BUS_QUERY_ID_TYPE BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
|
||||
typedef enum _DEVICE_POWER_STATE DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
|
||||
typedef enum _DEVICE_RELATION_TYPE DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
|
||||
typedef enum _DEVICE_TEXT_TYPE DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
|
||||
typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE DEVICE_USAGE_NOTIFICATION_TYPE, *PDEVICE_USAGE_NOTIFICATION_TYPE;
|
||||
typedef enum _DIRECTORY_NOTIFY_INFORMATION_CLASS DIRECTORY_NOTIFY_INFORMATION_CLASS, *PDIRECTORY_NOTIFY_INFORMATION_CLASS;
|
||||
typedef enum _EXCEPTION_DISPOSITION EXCEPTION_DISPOSITION, *PEXCEPTION_DISPOSITION;
|
||||
typedef enum _EFI_ALLOCATE_TYPE EFI_ALLOCATE_TYPE, *PEFI_ALLOCATE_TYPE;
|
||||
typedef enum _EFI_FRAMEWORK_CPU_DESIGNATION EFI_FRAMEWORK_CPU_DESIGNATION, *PEFI_FRAMEWORK_CPU_DESIGNATION;
|
||||
@@ -41,8 +47,15 @@ typedef enum _EFI_TIMER_DELAY EFI_TIMER_DELAY, *PEFI_TIMER_DELAY;
|
||||
typedef enum _EFI_UART_PARITY_TYPE EFI_UART_PARITY_TYPE, *PEFI_UART_PARITY_TYPE;
|
||||
typedef enum _EFI_UART_STOP_BITS_TYPE EFI_UART_STOP_BITS_TYPE, *PEFI_UART_STOP_BITS_TYPE;
|
||||
typedef enum _EFI_UNIVERSA_GRAPHICS_BLT_OPERATION EFI_UNIVERSA_GRAPHICS_BLT_OPERATION, *PEFI_UNIVERSA_GRAPHICS_BLT_OPERATION;
|
||||
typedef enum _FILE_INFORMATION_CLASS FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
|
||||
typedef enum _FS_INFORMATION_CLASS FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
|
||||
typedef enum _HAL_APIC_MODE HAL_APIC_MODE, *PHAL_APIC_MODE;
|
||||
typedef enum _INTERFACE_TYPE INTERFACE_TYPE, *PINTERFACE_TYPE;
|
||||
typedef enum _IO_ALLOCATION_ACTION IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
|
||||
typedef enum _IRQ_DEVICE_POLICY IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
|
||||
typedef enum _IRQ_PRIORITY IRQ_PRIORITY, *PIRQ_PRIORITY;
|
||||
typedef enum _KAPC_ENVIRONMENT KAPC_ENVIRONMENT, *PKAPC_ENVIRONMENT;
|
||||
typedef enum _KCONTINUE_STATUS KCONTINUE_STATUS, *PKCONTINUE_STATUS;
|
||||
typedef enum _KDPC_IMPORTANCE KDPC_IMPORTANCE, *PKDPC_IMPORTANCE;
|
||||
typedef enum _KEVENT_TYPE KEVENT_TYPE, *PKEVENT_TYPE;
|
||||
typedef enum _KOBJECTS KOBJECTS, *PKOBJECTS;
|
||||
@@ -51,19 +64,32 @@ typedef enum _KPROFILE_SOURCE KPROFILE_SOURCE, *PKPROFILE_SOURCE;
|
||||
typedef enum _KTHREAD_STATE KTHREAD_STATE, *PKTHREAD_STATE;
|
||||
typedef enum _KTIMER_TYPE KTIMER_TYPE, *PKTIMER_TYPE;
|
||||
typedef enum _KUBSAN_DATA_TYPE KUBSAN_DATA_TYPE, *PKUBSAN_DATA_TYPE;
|
||||
typedef enum _KWAIT_REASON KWAIT_REASON, *PKWAIT_REASON;
|
||||
typedef enum _LOADER_MEMORY_TYPE LOADER_MEMORY_TYPE, *PLOADER_MEMORY_TYPE;
|
||||
typedef enum _MMPAGELISTS MMPAGELISTS, *PMMPAGELISTS;
|
||||
typedef enum _MMPFN_CACHE_ATTRIBUTE MMPFN_CACHE_ATTRIBUTE, *PMMPFN_CACHE_ATTRIBUTE;
|
||||
typedef enum _MMPOOL_TYPE MMPOOL_TYPE, *PMMPOOL_TYPE;
|
||||
typedef enum _MMSYSTEM_PTE_POOL_TYPE MMSYSTEM_PTE_POOL_TYPE, *PMMSYSTEM_PTE_POOL_TYPE;
|
||||
typedef enum _MODE MODE, *PMODE;
|
||||
typedef enum _NONPAGED_LOOKASIDE_NUMBER NONPAGED_LOOKASIDE_NUMBER, *PNONPAGED_LOOKASIDE_NUMBER;
|
||||
typedef enum _OBJECT_HEADER_INFO OBJECT_HEADER_INFO, *POBJECT_HEADER_INFO;
|
||||
typedef enum _OBJECT_INFORMATION_CLASS OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS;
|
||||
typedef enum _OBJECT_OPEN_REASON OBJECT_OPEN_REASON, *POBJECT_OPEN_REASON;
|
||||
typedef enum _POWER_ACTION POWER_ACTION, *PPOWER_ACTION;
|
||||
typedef enum _POWER_STATE_TYPE POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
|
||||
typedef enum _PS_QUOTA_TYPE PS_QUOTA_TYPE, *PPS_QUOTA_TYPE;
|
||||
typedef enum _RTL_BALANCED_NODE_COLOR RTL_BALANCED_NODE_COLOR, *PRTL_BALANCED_NODE_COLOR;
|
||||
typedef enum _RTL_VARIABLE_TYPE RTL_VARIABLE_TYPE, *PRTL_VARIABLE_TYPE;
|
||||
typedef enum _SECURITY_IMPERSONATION_LEVEL SECURITY_IMPERSONATION_LEVEL, *PSECURITY_IMPERSONATION_LEVEL;
|
||||
typedef enum _SECURITY_OPERATION_CODE SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
|
||||
typedef enum _SYSTEM_FIRMWARE_TYPE SYSTEM_FIRMWARE_TYPE, *PSYSTEM_FIRMWARE_TYPE;
|
||||
typedef enum _SYSTEM_POWER_STATE SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
|
||||
typedef enum _SYSTEM_RESOURCE_TYPE SYSTEM_RESOURCE_TYPE, *PSYSTEM_RESOURCE_TYPE;
|
||||
typedef enum _WAIT_TYPE WAIT_TYPE, *PWAIT_TYPE;
|
||||
typedef enum _WORK_QUEUE_TYPE WORK_QUEUE_TYPE, *PWORK_QUEUE_TYPE;
|
||||
|
||||
/* Structures forward references */
|
||||
typedef struct _ACCESS_STATE ACCESS_STATE, *PACCESS_STATE;
|
||||
typedef struct _ACPI_CACHE_LIST ACPI_CACHE_LIST, *PACPI_CACHE_LIST;
|
||||
typedef struct _ACPI_DESCRIPTION_HEADER ACPI_DESCRIPTION_HEADER, *PACPI_DESCRIPTION_HEADER;
|
||||
typedef struct _ACPI_FADT ACPI_FADT, *PACPI_FADT;
|
||||
@@ -82,9 +108,21 @@ typedef struct _ACPI_XSDT ACPI_XSDT, *PACPI_XSDT;
|
||||
typedef struct _ANSI_STRING ANSI_STRING, *PANSI_STRING;
|
||||
typedef struct _ANSI_STRING32 ANSI_STRING32, *PANSI_STRING32;
|
||||
typedef struct _ANSI_STRING64 ANSI_STRING64, *PANSI_STRING64;
|
||||
typedef struct _CLIENT_ID CLIENT_ID, *PCLIENT_ID;
|
||||
typedef struct _CM_FULL_RESOURCE_DESCRIPTOR CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
|
||||
typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
|
||||
typedef struct _CM_PARTIAL_RESOURCE_LIST CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
|
||||
typedef struct _CM_RESOURCE_LIST CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
|
||||
typedef struct _COMPRESSED_DATA_INFO COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO;
|
||||
typedef struct _CPPORT CPPORT, *PCPPORT;
|
||||
typedef const struct _CMMPAGEMAP_ROUTINES CMMPAGEMAP_ROUTINES, *PCMMPAGEMAP_ROUTINES;
|
||||
typedef struct _CPTABLE_INFO CPTABLE_INFO, *PCPTABLE_INFO;
|
||||
typedef struct _CSTRING CSTRING, *PCSTRING;
|
||||
typedef struct _DEVICE_CAPABILITIES DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
|
||||
typedef struct _DEVICE_MAP DEVICE_MAP, *PDEVICE_MAP;
|
||||
typedef struct _DEVICE_OBJECT DEVICE_OBJECT, *PDEVICE_OBJECT;
|
||||
typedef struct _DEVOBJ_EXTENSION DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
|
||||
typedef struct _DRIVER_EXTENSION DRIVER_EXTENSION, *PDRIVER_EXTENSION;
|
||||
typedef struct _DRIVER_OBJECT DRIVER_OBJECT, *PDRIVER_OBJECT;
|
||||
typedef struct _EFI_1394_DEVICE_PATH EFI_1394_DEVICE_PATH, *PEFI_1394_DEVICE_PATH;
|
||||
typedef struct _EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR, *PEFI_ACPI_ADDRESS_SPACE_DESCRIPTOR;
|
||||
typedef struct _EFI_ACPI_ADR_DEVICE_PATH EFI_ACPI_ADR_DEVICE_PATH, *PEFI_ACPI_ADR_DEVICE_PATH;
|
||||
@@ -240,27 +278,52 @@ typedef struct _EFI_VENDOR_DEVICE_PATH EFI_VENDOR_DEVICE_PATH, *PEFI_VENDOR_DEVI
|
||||
typedef struct _EFI_VLAN_DEVICE_PATH EFI_VLAN_DEVICE_PATH, *PEFI_VLAN_DEVICE_PATH;
|
||||
typedef struct _EFI_WORD_REGS EFI_WORD_REGS, *PEFI_WORD_REGS;
|
||||
typedef struct _EPROCESS EPROCESS, *PEPROCESS;
|
||||
typedef struct _EPROCESS_QUOTA_BLOCK EPROCESS_QUOTA_BLOCK, *PEPROCESS_QUOTA_BLOCK;
|
||||
typedef struct _EPROCESS_QUOTA_ENTRY EPROCESS_QUOTA_ENTRY, *PEPROCESS_QUOTA_ENTRY;
|
||||
typedef struct _ERESOURCE ERESOURCE, *PERESOURCE;
|
||||
typedef struct _ETHREAD ETHREAD, *PETHREAD;
|
||||
typedef struct _EX_RUNDOWN_REFERENCE EX_RUNDOWN_REFERENCE, *PEX_RUNDOWN_REFERENCE;
|
||||
typedef struct _EXCEPTION_POINTERS EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
|
||||
typedef struct _EXCEPTION_RECORD EXCEPTION_RECORD, *PEXCEPTION_RECORD;
|
||||
typedef struct _EXCEPTION_REGISTRATION_RECORD EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD;
|
||||
typedef struct _FAST_IO_DISPATCH FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
|
||||
typedef struct _FILE_BASIC_INFORMATION FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
|
||||
typedef struct _FILE_GET_QUOTA_INFORMATION FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION;
|
||||
typedef struct _FILE_NETWORK_OPEN_INFORMATION FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
|
||||
typedef struct _FILE_OBJECT FILE_OBJECT, *PFILE_OBJECT;
|
||||
typedef struct _FILE_STANDARD_INFORMATION FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
|
||||
typedef struct _FIRMWARE_INFORMATION_BLOCK FIRMWARE_INFORMATION_BLOCK, *PFIRMWARE_INFORMATION_BLOCK;
|
||||
typedef struct _FLOAT128 FLOAT128, *PFLOAT128;
|
||||
typedef struct _GENERAL_LOOKASIDE GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
|
||||
typedef struct _GENERIC_ADDRESS GENERIC_ADDRESS, *PGENERIC_ADDRESS;
|
||||
typedef struct _GENERIC_MAPPING GENERIC_MAPPING, *PGENERIC_MAPPING;
|
||||
typedef struct _GUID GUID, *PGUID;
|
||||
typedef struct _HL_FRAMEBUFFER_DATA HL_FRAMEBUFFER_DATA, *PHL_FRAMEBUFFER_DATA;
|
||||
typedef struct _HL_SCROLL_REGION_DATA HL_SCROLL_REGION_DATA, *PHL_SCROLL_REGION_DATA;
|
||||
typedef struct _INITIAL_PRIVILEGE_SET INITIAL_PRIVILEGE_SET, *PINITIAL_PRIVILEGE_SET;
|
||||
typedef struct _INTERFACE INTERFACE, *PINTERFACE;
|
||||
typedef struct _IO_COMPLETION_CONTEXT IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
|
||||
typedef struct _IO_RESOURCE_DESCRIPTOR IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
|
||||
typedef struct _IO_RESOURCE_LIST IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
|
||||
typedef struct _IO_RESOURCE_REQUIREMENTS_LIST IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
|
||||
typedef struct _IO_SECURITY_CONTEXT IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
|
||||
typedef struct _IO_STACK_LOCATION IO_STACK_LOCATION, *PIO_STACK_LOCATION;
|
||||
typedef struct _IO_STATUS_BLOCK IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
|
||||
typedef struct _IO_TIMER IO_TIMER, *PIO_TIMER;
|
||||
typedef struct _IRP IRP, *PIRP;
|
||||
typedef struct _KAFFINITY_MAP KAFFINITY_MAP, *PKAFFINITY_MAP;
|
||||
typedef struct _KAPC KAPC, *PKAPC;
|
||||
typedef struct _KAPC_STATE KAPC_STATE, *PKAPC_STATE;
|
||||
typedef struct _KD_DEBUG_MODE KD_DEBUG_MODE, *PKD_DEBUG_MODE;
|
||||
typedef struct _KD_DISPATCH_TABLE KD_DISPATCH_TABLE, *PKD_DISPATCH_TABLE;
|
||||
typedef struct _KDPC KDPC, *PKDPC;
|
||||
typedef struct _KDPC_DATA KDPC_DATA, *PKDPC_DATA;
|
||||
typedef struct _KDEVICE_QUEUE_ENTRY KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY;
|
||||
typedef struct _KERNEL_INITIALIZATION_BLOCK KERNEL_INITIALIZATION_BLOCK, *PKERNEL_INITIALIZATION_BLOCK;
|
||||
typedef struct _KEVENT KEVENT, *PKEVENT;
|
||||
typedef struct _KGATE KGATE, *PKGATE;
|
||||
typedef struct _KLOCK_QUEUE_HANDLE KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
|
||||
typedef struct _KMUTEX KMUTEX, *PKMUTEX;
|
||||
typedef struct _KPROCESS KPROCESS, *PKPROCESS;
|
||||
typedef struct _KPUSH_LOCK_WAIT_BLOCK KPUSH_LOCK_WAIT_BLOCK, *PKPUSH_LOCK_WAIT_BLOCK;
|
||||
typedef struct _KQUEUE KQUEUE, *PKQUEUE;
|
||||
typedef struct _KSEMAPHORE KSEMAPHORE, *PKSEMAPHORE;
|
||||
typedef struct _KSERVICE_DESCRIPTOR_TABLE KSERVICE_DESCRIPTOR_TABLE, *PKSERVICE_DESCRIPTOR_TABLE;
|
||||
@@ -287,12 +350,48 @@ typedef struct _LIST_ENTRY64 LIST_ENTRY64, *PLIST_ENTRY64;
|
||||
typedef struct _LOADER_GRAPHICS_INFORMATION_BLOCK LOADER_GRAPHICS_INFORMATION_BLOCK, *PLOADER_GRAPHICS_INFORMATION_BLOCK;
|
||||
typedef struct _LOADER_INFORMATION_BLOCK LOADER_INFORMATION_BLOCK, *PLOADER_INFORMATION_BLOCK;
|
||||
typedef struct _LOADER_MEMORY_DESCRIPTOR LOADER_MEMORY_DESCRIPTOR, *PLOADER_MEMORY_DESCRIPTOR;
|
||||
typedef struct _LOOKASIDE_LIST LOOKASIDE_LIST, *PLOOKASIDE_LIST;
|
||||
typedef struct _LOOKASIDE_LIST_EX LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
|
||||
typedef struct _LPCP_NONPAGED_PORT_QUEUE LPCP_NONPAGED_PORT_QUEUE, *PLPCP_NONPAGED_PORT_QUEUE;
|
||||
typedef struct _LPCP_PORT_OBJECT LPCP_PORT_OBJECT, *PLPCP_PORT_OBJECT;
|
||||
typedef struct _LPCP_PORT_QUEUE LPCP_PORT_QUEUE, *PLPCP_PORT_QUEUE;
|
||||
typedef struct _LUID LUID, *PLUID;
|
||||
typedef struct _LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
|
||||
typedef struct _M128 M128, *PM128;
|
||||
typedef struct _MAILSLOT_CREATE_PARAMETERS MAILSLOT_CREATE_PARAMETERS, *PMAILSLOT_CREATE_PARAMETERS;
|
||||
typedef struct _MDL MDL, *PMDL;
|
||||
typedef struct _MMCOLOR_TABLES MMCOLOR_TABLES, *PMMCOLOR_TABLES;
|
||||
typedef struct _MMFREE_POOL_ENTRY MMFREE_POOL_ENTRY, *PMMFREE_POOL_ENTRY;
|
||||
typedef struct _MMMEMORY_LAYOUT MMMEMORY_LAYOUT, *PMMMEMORY_LAYOUT;
|
||||
typedef struct _MMPFNENTRY MMPFNENTRY, *PMMPFNENTRY;
|
||||
typedef struct _MMPFNLIST MMPFNLIST, *PMMPFNLIST;
|
||||
typedef struct _NAMED_PIPE_CREATE_PARAMETERS NAMED_PIPE_CREATE_PARAMETERS, *PNAMED_PIPE_CREATE_PARAMETERS;
|
||||
typedef struct _NLSTABLE_INFO NLSTABLE_INFO, *PNLSTABLE_INFO;
|
||||
typedef struct _NONPAGED_LOOKASIDE_LIST NONPAGED_LOOKASIDE_LIST, *PNONPAGED_LOOKASIDE_LIST;
|
||||
typedef struct _OBJECT_ATTRIBUTES OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
|
||||
typedef struct _OBJECT_CREATE_INFORMATION OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION;
|
||||
typedef struct _OBJECT_CREATOR_INFO OBJECT_CREATOR_INFO, *POBJECT_CREATOR_INFO;
|
||||
typedef struct _OBJECT_DIRECTORY OBJECT_DIRECTORY, *POBJECT_DIRECTORY;
|
||||
typedef struct _OBJECT_DIRECTORY_ENTRY OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;
|
||||
typedef struct _OBJECT_DUMP_CONTROL OBJECT_DUMP_CONTROL, *POBJECT_DUMP_CONTROL;
|
||||
typedef struct _OBJECT_HANDLE_COUNT_DATABASE OBJECT_HANDLE_COUNT_DATABASE, *POBJECT_HANDLE_COUNT_DATABASE;
|
||||
typedef struct _OBJECT_HANDLE_COUNT_ENTRY OBJECT_HANDLE_COUNT_ENTRY, *POBJECT_HANDLE_COUNT_ENTRY;
|
||||
typedef struct _OBJECT_HANDLE_COUNT_INFORMATION OBJECT_HANDLE_COUNT_INFORMATION, *POBJECT_HANDLE_COUNT_INFORMATION;
|
||||
typedef struct _OBJECT_HANDLE_INFO OBJECT_HANDLE_INFO, *POBJECT_HANDLE_INFO;
|
||||
typedef struct _OBJECT_HEADER OBJECT_HEADER, *POBJECT_HEADER;
|
||||
typedef struct _OBJECT_HEADER_CREATOR_INFO OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO;
|
||||
typedef struct _OBJECT_HEADER_NAME_INFO OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
|
||||
typedef struct _OBJECT_HEADER_QUOTA_INFO OBJECT_HEADER_QUOTA_INFO, *POBJECT_HEADER_QUOTA_INFO;
|
||||
typedef struct _OBJECT_LOOKUP_CONTEXT OBJECT_LOOKUP_CONTEXT, *POBJECT_LOOKUP_CONTEXT;
|
||||
typedef struct _OBJECT_NAME_INFO OBJECT_NAME_INFO, *POBJECT_NAME_INFO;
|
||||
typedef struct _OBJECT_NAME_INFORMATION OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
|
||||
typedef struct _OBJECT_OPTIONAL_HEADER_LAYOUT OBJECT_OPTIONAL_HEADER_LAYOUT, *POBJECT_OPTIONAL_HEADER_LAYOUT;
|
||||
typedef struct _OBJECT_PROCESS_INFO OBJECT_PROCESS_INFO, *POBJECT_PROCESS_INFO;
|
||||
typedef struct _OBJECT_QUOTA_INFO OBJECT_QUOTA_INFO, *POBJECT_QUOTA_INFO;
|
||||
typedef struct _OBJECT_TYPE OBJECT_TYPE, *POBJECT_TYPE;
|
||||
typedef struct _OBJECT_TYPE_INITIALIZER OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
|
||||
typedef struct _OWNER_ENTRY OWNER_ENTRY, *POWNER_ENTRY;
|
||||
typedef struct _PAGED_LOOKASIDE_LIST PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
|
||||
typedef struct _PCAT_FIRMWARE_INFORMATION PCAT_FIRMWARE_INFORMATION, *PPCAT_FIRMWARE_INFORMATION;
|
||||
typedef struct _PCI_BRIDGE_CONTROL_REGISTER PCI_BRIDGE_CONTROL_REGISTER, *PPCI_BRIDGE_CONTROL_REGISTER;
|
||||
typedef struct _PCI_COMMON_CONFIG PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
|
||||
@@ -326,26 +425,41 @@ typedef struct _PHYSICAL_MEMORY_RUN PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;
|
||||
typedef struct _POOL_HEADER POOL_HEADER, *PPOOL_HEADER;
|
||||
typedef struct _POOL_TRACKING_BIG_ALLOCATIONS POOL_TRACKING_BIG_ALLOCATIONS, *PPOOL_TRACKING_BIG_ALLOCATIONS;
|
||||
typedef struct _POOL_TRACKING_TABLE POOL_TRACKING_TABLE, *PPOOL_TRACKING_TABLE;
|
||||
typedef struct _POWER_SEQUENCE POWER_SEQUENCE, *PPOWER_SEQUENCE;
|
||||
typedef struct _PRIVILEGE_SET PRIVILEGE_SET, *PPRIVILEGE_SET;
|
||||
typedef struct _PROCESSOR_IDENTITY PROCESSOR_IDENTITY, *PPROCESSOR_IDENTITY;
|
||||
typedef struct _PROCESSOR_POWER_STATE PROCESSOR_POWER_STATE, *PPROCESSOR_POWER_STATE;
|
||||
typedef struct _QUAD QUAD, *PQUAD;
|
||||
typedef struct _RTL_BALANCED_NODE RTL_BALANCED_NODE, *PRTL_BALANCED_NODE;
|
||||
typedef struct _RTL_BITMAP RTL_BITMAP, *PRTL_BITMAP;
|
||||
typedef struct _RTL_PRINT_CONTEXT RTL_PRINT_CONTEXT, *PRTL_PRINT_CONTEXT;
|
||||
typedef struct _RTL_PRINT_FORMAT_PROPERTIES RTL_PRINT_FORMAT_PROPERTIES, *PRTL_PRINT_FORMAT_PROPERTIES;
|
||||
typedef struct _RTL_RB_TREE RTL_RB_TREE, *PRTL_RB_TREE;
|
||||
typedef struct _SCSI_REQUEST_BLOCK SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;
|
||||
typedef struct _SECTION_OBJECT_POINTERS SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
|
||||
typedef struct _SECURITY_CLIENT_CONTEXT SECURITY_CLIENT_CONTEXT, *PSECURITY_CLIENT_CONTEXT;
|
||||
typedef struct _SECURITY_QUALITY_OF_SERVICE SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
|
||||
typedef struct _SECURITY_SUBJECT_CONTEXT SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
|
||||
typedef struct _SID SID, *PSID;
|
||||
typedef struct _SID_IDENTIFIER_AUTHORITY SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;
|
||||
typedef struct _SINGLE_LIST_ENTRY SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
|
||||
typedef struct _SMBIOS_TABLE_HEADER SMBIOS_TABLE_HEADER, *PSMBIOS_TABLE_HEADER;
|
||||
typedef struct _SMBIOS3_TABLE_HEADER SMBIOS3_TABLE_HEADER, *PSMBIOS3_TABLE_HEADER;
|
||||
typedef struct _STRING STRING, *PSTRING;
|
||||
typedef struct _STRING32 STRING32, *PSTRING32;
|
||||
typedef struct _STRING64 STRING64, *PSTRING64;
|
||||
typedef struct _SYSTEM_POWER_STATE_CONTEXT SYSTEM_POWER_STATE_CONTEXT, *PSYSTEM_POWER_STATE_CONTEXT;
|
||||
typedef struct _THREAD_INFORMATION_BLOCK THREAD_INFORMATION_BLOCK, *PTHREAD_INFORMATION_BLOCK;
|
||||
typedef struct _TIME_FIELDS TIME_FIELDS, *PTIME_FIELDS;
|
||||
typedef struct _TIMER_ROUTINES TIMER_ROUTINES, *PTIMER_ROUTINES;
|
||||
typedef struct _TOKEN_CONTROL TOKEN_CONTROL, *PTOKEN_CONTROL;
|
||||
typedef struct _TOKEN_SOURCE TOKEN_SOURCE, *PTOKEN_SOURCE;
|
||||
typedef struct _UEFI_FIRMWARE_INFORMATION UEFI_FIRMWARE_INFORMATION, *PUEFI_FIRMWARE_INFORMATION;
|
||||
typedef struct _UNICODE_STRING UNICODE_STRING, *PUNICODE_STRING;
|
||||
typedef struct _UNICODE_STRING32 UNICODE_STRING32, *PUNICODE_STRING32;
|
||||
typedef struct _UNICODE_STRING64 UNICODE_STRING64, *PUNICODE_STRING64;
|
||||
typedef struct _VPB VPB, *PVPB;
|
||||
typedef struct _WORK_QUEUE_ITEM WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
|
||||
typedef struct _XTBL_BOOT_PARAMETERS XTBL_BOOT_PARAMETERS, *PXTBL_BOOT_PARAMETERS;
|
||||
typedef struct _XTBL_BOOT_PROTOCOL XTBL_BOOT_PROTOCOL, *PXTBL_BOOT_PROTOCOL;
|
||||
typedef struct _XTBL_BOOTMENU_ITEM XTBL_BOOTMENU_ITEM, *PXTBL_BOOTMENU_ITEM;
|
||||
@@ -374,8 +488,11 @@ typedef union _EFI_HASH_OUTPUT EFI_HASH_OUTPUT, *PEFI_HASH_OUTPUT;
|
||||
typedef union _EFI_IA32_REGISTER_SET EFI_IA32_REGISTER_SET, *PEFI_IA32_REGISTER_SET;
|
||||
typedef union _EFI_IP_ADDRESS EFI_IP_ADDRESS, *PEFI_IP_ADDRESS;
|
||||
typedef union _EFI_PXE_BASE_CODE_PACKET EFI_PXE_BASE_CODE_PACKET, *PEFI_PXE_BASE_CODE_PACKET;
|
||||
typedef union _EX_RUNDOWN_REFERENCE EX_RUNDOWN_REFERENCE, *PEX_RUNDOWN_REFERENCE;
|
||||
typedef union _KPUSH_LOCK KPUSH_LOCK, *PKPUSH_LOCK;
|
||||
typedef union _LARGE_INTEGER LARGE_INTEGER, *PLARGE_INTEGER;
|
||||
typedef union _SINGLE_LIST_HEADER SINGLE_LIST_HEADER, *PSINGLE_LIST_HEADER;
|
||||
typedef union _OBJECT_HEADER_HANDLE_INFO OBJECT_HEADER_HANDLE_INFO, *POBJECT_HEADER_HANDLE_INFO;
|
||||
typedef union _POWER_STATE POWER_STATE, *PPOWER_STATE;
|
||||
typedef union _ULARGE_INTEGER ULARGE_INTEGER, *PULARGE_INTEGER;
|
||||
|
||||
#endif /* __XTOS_ASSEMBLER__ */
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
#include <xttarget.h>
|
||||
#include <xtcompat.h>
|
||||
#include <xtstruct.h>
|
||||
|
||||
|
||||
/* C/C++ specific code */
|
||||
@@ -156,6 +157,41 @@ typedef LPCUWSTR PCUTSTR, LPCUTSTR;
|
||||
/* Variadic ABI types */
|
||||
typedef __builtin_va_list VA_LIST, *PVA_LIST;
|
||||
|
||||
/* ANSI string structure */
|
||||
typedef struct _ANSI_STRING
|
||||
{
|
||||
USHORT Length;
|
||||
USHORT MaximumLength;
|
||||
PSTR Buffer;
|
||||
} ANSI_STRING, *PANSI_STRING;
|
||||
typedef const ANSI_STRING *PCANSI_STRING;
|
||||
|
||||
/* 32-bit ANSI string structure */
|
||||
typedef struct _ANSI_STRING32
|
||||
{
|
||||
USHORT Length;
|
||||
USHORT MaximumLength;
|
||||
ULONG Buffer;
|
||||
} ANSI_STRING32, *PANSI_STRING32;
|
||||
typedef const ANSI_STRING32 *PCANSI_STRING32;
|
||||
|
||||
/* 64-bit ANSI string structure */
|
||||
typedef struct _ANSI_STRING64
|
||||
{
|
||||
USHORT Length;
|
||||
USHORT MaximumLength;
|
||||
ULONGLONG Buffer;
|
||||
} ANSI_STRING64, *PANSI_STRING64;
|
||||
typedef const ANSI_STRING64 *PCANSI_STRING64;
|
||||
|
||||
/* Constant counted string structure */
|
||||
typedef struct _CSTRING
|
||||
{
|
||||
USHORT Length;
|
||||
USHORT MaximumLength;
|
||||
PCCHAR Buffer;
|
||||
} CSTRING, *PCSTRING;
|
||||
|
||||
/* 128-bit floats structure */
|
||||
typedef struct _FLOAT128
|
||||
{
|
||||
@@ -191,21 +227,32 @@ typedef union _LARGE_INTEGER
|
||||
LONGLONG QuadPart;
|
||||
} LARGE_INTEGER, *PLARGE_INTEGER;
|
||||
|
||||
/* 64-bit unsigned integer union */
|
||||
typedef union _ULARGE_INTEGER
|
||||
/* Double linked list structure definition */
|
||||
typedef struct _LIST_ENTRY
|
||||
{
|
||||
struct
|
||||
{
|
||||
ULONG LowPart;
|
||||
ULONG HighPart;
|
||||
};
|
||||
struct
|
||||
{
|
||||
ULONG LowPart;
|
||||
ULONG HighPart;
|
||||
} u;
|
||||
ULONGLONG QuadPart;
|
||||
} ULARGE_INTEGER, *PULARGE_INTEGER;
|
||||
PLIST_ENTRY Flink;
|
||||
PLIST_ENTRY Blink;
|
||||
} LIST_ENTRY, *PLIST_ENTRY;
|
||||
|
||||
/* Locally Unique Identifier structure definition */
|
||||
typedef struct _LUID
|
||||
{
|
||||
ULONG LowPart;
|
||||
LONG HighPart;
|
||||
} LUID, *PLUID;
|
||||
|
||||
/* 128-bit 16-byte aligned XMM register */
|
||||
typedef struct _M128
|
||||
{
|
||||
ULONGLONG Low;
|
||||
LONGLONG High;
|
||||
} ALIGN(16) M128, *PM128;
|
||||
|
||||
/* Quadruple-word alignment structure definition */
|
||||
typedef struct _QUAD
|
||||
{
|
||||
unsigned long long Alignment;
|
||||
} QUAD, *PQUAD;
|
||||
|
||||
/* Counted string structure */
|
||||
typedef struct _STRING
|
||||
@@ -231,40 +278,21 @@ typedef struct _STRING64
|
||||
ULONGLONG Buffer;
|
||||
} STRING64, *PSTRING64;
|
||||
|
||||
/* Constant counted string structure */
|
||||
typedef struct _CSTRING
|
||||
/* 64-bit unsigned integer union */
|
||||
typedef union _ULARGE_INTEGER
|
||||
{
|
||||
USHORT Length;
|
||||
USHORT MaximumLength;
|
||||
PCCHAR Buffer;
|
||||
} CSTRING, *PCSTRING;
|
||||
|
||||
/* ANSI string structure */
|
||||
typedef struct _ANSI_STRING
|
||||
{
|
||||
USHORT Length;
|
||||
USHORT MaximumLength;
|
||||
PSTR Buffer;
|
||||
} ANSI_STRING, *PANSI_STRING;
|
||||
typedef const ANSI_STRING *PCANSI_STRING;
|
||||
|
||||
/* 32-bit ANSI string structure */
|
||||
typedef struct _ANSI_STRING32
|
||||
{
|
||||
USHORT Length;
|
||||
USHORT MaximumLength;
|
||||
ULONG Buffer;
|
||||
} ANSI_STRING32, *PANSI_STRING32;
|
||||
typedef const ANSI_STRING32 *PCANSI_STRING32;
|
||||
|
||||
/* 64-bit ANSI string structure */
|
||||
typedef struct _ANSI_STRING64
|
||||
{
|
||||
USHORT Length;
|
||||
USHORT MaximumLength;
|
||||
ULONGLONG Buffer;
|
||||
} ANSI_STRING64, *PANSI_STRING64;
|
||||
typedef const ANSI_STRING64 *PCANSI_STRING64;
|
||||
struct
|
||||
{
|
||||
ULONG LowPart;
|
||||
ULONG HighPart;
|
||||
};
|
||||
struct
|
||||
{
|
||||
ULONG LowPart;
|
||||
ULONG HighPart;
|
||||
} u;
|
||||
ULONGLONG QuadPart;
|
||||
} ULARGE_INTEGER, *PULARGE_INTEGER;
|
||||
|
||||
/* UNICODE string structure */
|
||||
typedef struct _UNICODE_STRING
|
||||
|
||||
@@ -14,7 +14,10 @@ list(APPEND XTOSKRNL_SOURCE
|
||||
${XTOSKRNL_SOURCE_DIR}/ar/${ARCH}/data.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ar/${ARCH}/procsup.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ar/${ARCH}/traps.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ex/data.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ex/exports.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ex/laslist.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ex/resource.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ex/rundown.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/${ARCH}/cpu.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/${ARCH}/firmware.cc
|
||||
@@ -31,30 +34,38 @@ list(APPEND XTOSKRNL_SOURCE
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/fbdev.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/init.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/ioreg.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/kd/${ARCH}/debug.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/kd/data.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/kd/dbgio.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/kd/debug.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/kd/exports.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/${ARCH}/dispatch.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/${ARCH}/krnlinit.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/${ARCH}/kthread.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/${ARCH}/proc.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/affinity.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/apc.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/bootinfo.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/crash.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/data.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/dispatch.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/dispobj.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/dpc.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/event.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/exports.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/ipi.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/kprocess.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/krnlinit.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/kthread.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/kubsan.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/pushlock.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/runlevel.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/schedule.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/semphore.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/shdata.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/spinlock.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/sysres.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/sysserv.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/systime.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ke/timer.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/mm/${ARCH}/mmgr.cc
|
||||
@@ -74,26 +85,37 @@ list(APPEND XTOSKRNL_SOURCE
|
||||
${XTOSKRNL_SOURCE_DIR}/mm/paging.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/mm/pfn.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/mm/pool.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/mm/probe.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/mm/pte.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/mm/quota.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/po/idle.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ps/process.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/ps/thread.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/${ARCH}/atomic.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/${ARCH}/dispatch.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/${ARCH}/exsup.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/${ARCH}/intrin.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/${ARCH}/slist.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/atomic.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/bitmap.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/data.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/endian.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/exports.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/exsup.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/guid.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/lifo.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/llist.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/math.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/memory.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/nls.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/rbtree.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/sha1.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/slist.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/string.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/time.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/widestr.cc)
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/unicode.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/widestr.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/se/descript.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/se/privileg.cc)
|
||||
|
||||
# Set module definition SPEC file
|
||||
set_specfile(xtoskrnl.spec xtoskrnl.exe)
|
||||
|
||||
@@ -40,6 +40,7 @@ corresponding C++ namespace in which the subsystem's classes and routines reside
|
||||
* Ke - Core Kernel Library
|
||||
* Mm - Memory Manager
|
||||
* Po - Plug&Play and Power Manager
|
||||
* Ps - Process and Thread Manager
|
||||
* Rtl - Runtime library
|
||||
|
||||
### AR: Architecture Library
|
||||
@@ -76,6 +77,12 @@ This subsystem handles power management events, such as shutdown or standby. It
|
||||
supporting device detection and installation at boot time. Furthermore, it is responsible for starting and stopping
|
||||
devices on demand.
|
||||
|
||||
### PS: Process and Thread Manager
|
||||
This subsystem is responsible for managing the lifecycle of processes and threads within the operating system. It
|
||||
handles the creation, termination, and state tracking of these execution units. Furthermore, it provides the high-level
|
||||
executive abstractions required to allocate system resources, manage process boundaries, and coordinate with the core
|
||||
kernel for thread execution.
|
||||
|
||||
### RTL: Runtime Library
|
||||
The Runtime Library provides a kernel-mode implementation of common C library functions. It includes many utility
|
||||
routines, for use by other kernel components.
|
||||
|
||||
@@ -467,9 +467,11 @@ ApEnterLongMode:
|
||||
|
||||
/* Save the pointer to PROCESSOR_START_BLOCK */
|
||||
movq %rdi, %rcx
|
||||
pushq %rdi
|
||||
|
||||
/* Call the EntryPoint routine */
|
||||
/* Allocate 32 bytes of shadow space */
|
||||
subq $32, %rsp
|
||||
|
||||
/* Fetch the EntryPoint address and call the routine */
|
||||
movq PROCESSOR_START_BLOCK_EntryPoint(%rdi), %rax
|
||||
call *%rax
|
||||
|
||||
|
||||
@@ -617,6 +617,56 @@ AR::CpuFunctions::ReadWriteBarrier(VOID)
|
||||
: "memory");
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a Bit Scan Forward instruction to locate the most significant set bit.
|
||||
*
|
||||
* @param Index
|
||||
* Receives the zero-based index of the highest set bit when one is found.
|
||||
*
|
||||
* @param Mask
|
||||
* Supplies the bitmap to scan.
|
||||
*
|
||||
* @return This routine returns TRUE when a set bit was found, otherwise FALSE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
AR::CpuFunctions::ScanForwardBit(OUT PULONG Index,
|
||||
IN ULONG Mask)
|
||||
{
|
||||
/* Defer to the BSF instruction */
|
||||
__asm__("bsfl %[Mask], %[Index]" : [Index] "=r" (*Index) : [Mask] "mr" (Mask));
|
||||
|
||||
/* Report whether the input had any bit set */
|
||||
return Mask ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a Bit Scan Reverse instruction to locate the most significant set bit.
|
||||
*
|
||||
* @param Index
|
||||
* Receives the zero-based index of the highest set bit when one is found.
|
||||
*
|
||||
* @param Mask
|
||||
* Supplies the bitmap to scan.
|
||||
*
|
||||
* @return This routine returns TRUE when a set bit was found, otherwise FALSE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
AR::CpuFunctions::ScanReverseBit(OUT PULONG Index,
|
||||
IN ULONG Mask)
|
||||
{
|
||||
/* Defer to the BSR instruction */
|
||||
__asm__("bsrl %[Mask], %[Index]" : [Index] "=r" (*Index) : [Mask] "mr" (Mask));
|
||||
|
||||
/* Report whether the input had any bit set */
|
||||
return Mask ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Instructs the processor to set the interrupt flag.
|
||||
*
|
||||
|
||||
@@ -28,7 +28,7 @@ XTAPI
|
||||
VOID
|
||||
AR::ProcessorSupport::GetTrampolineInformation(IN TRAMPOLINE_TYPE TrampolineType,
|
||||
OUT PVOID *TrampolineCode,
|
||||
OUT PULONG_PTR TrampolineSize)
|
||||
OUT PULONG TrampolineSize)
|
||||
{
|
||||
/* Get trampoline information */
|
||||
switch(TrampolineType)
|
||||
@@ -320,30 +320,28 @@ AR::ProcessorSupport::InitializeIdt(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
||||
}
|
||||
|
||||
/* Setup IDT handlers for known interrupts and traps */
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x00, (PVOID)ArTrapEntry[0x00], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x01, (PVOID)ArTrapEntry[0x01], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x00, (PVOID)ArTrapEntry[0x00], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x01, (PVOID)ArTrapEntry[0x01], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x02, (PVOID)ArTrapEntry[0x02], KGDT_R0_CODE, KIDT_IST_NMI, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x03, (PVOID)ArTrapEntry[0x03], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x04, (PVOID)ArTrapEntry[0x04], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x05, (PVOID)ArTrapEntry[0x05], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x06, (PVOID)ArTrapEntry[0x06], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x07, (PVOID)ArTrapEntry[0x07], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x08, (PVOID)ArTrapEntry[0x08], KGDT_R0_CODE, KIDT_IST_PANIC, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x09, (PVOID)ArTrapEntry[0x09], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0A, (PVOID)ArTrapEntry[0x0A], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0B, (PVOID)ArTrapEntry[0x0B], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0C, (PVOID)ArTrapEntry[0x0C], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0D, (PVOID)ArTrapEntry[0x0D], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0E, (PVOID)ArTrapEntry[0x0E], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x10, (PVOID)ArTrapEntry[0x10], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x11, (PVOID)ArTrapEntry[0x11], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x12, (PVOID)ArTrapEntry[0x12], KGDT_R0_CODE, KIDT_IST_MCA, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x13, (PVOID)ArTrapEntry[0x13], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x03, (PVOID)ArTrapEntry[0x03], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x04, (PVOID)ArTrapEntry[0x04], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x05, (PVOID)ArTrapEntry[0x05], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x06, (PVOID)ArTrapEntry[0x06], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x07, (PVOID)ArTrapEntry[0x07], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x08, (PVOID)ArTrapEntry[0x08], KGDT_R0_CODE, KIDT_IST_PANIC, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x09, (PVOID)ArTrapEntry[0x09], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0A, (PVOID)ArTrapEntry[0x0A], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0B, (PVOID)ArTrapEntry[0x0B], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0C, (PVOID)ArTrapEntry[0x0C], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0D, (PVOID)ArTrapEntry[0x0D], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x0E, (PVOID)ArTrapEntry[0x0E], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x10, (PVOID)ArTrapEntry[0x10], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x11, (PVOID)ArTrapEntry[0x11], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x12, (PVOID)ArTrapEntry[0x12], KGDT_R0_CODE, KIDT_IST_MCA, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x13, (PVOID)ArTrapEntry[0x13], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x1F, (PVOID)ArTrapEntry[0x1F], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2C, (PVOID)ArTrapEntry[0x2C], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2D, (PVOID)ArTrapEntry[0x2D], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_TRAP_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2F, (PVOID)ArTrapEntry[0x2F], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0xE1, (PVOID)ArInterruptEntry[0xE1], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING0, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2C, (PVOID)ArTrapEntry[0x2C], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_INTERRUPT_GATE);
|
||||
SetIdtGate(ProcessorBlock->IdtBase, 0x2D, (PVOID)ArTrapEntry[0x2D], KGDT_R0_CODE, KIDT_IST_RESERVED, KIDT_ACCESS_RING3, AMD64_INTERRUPT_GATE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -477,8 +475,9 @@ AR::ProcessorSupport::InitializeProcessorBlock(OUT PKPROCESSOR_BLOCK ProcessorBl
|
||||
/* Set initial MXCSR register value */
|
||||
ProcessorBlock->Prcb.MxCsr = INITIAL_MXCSR;
|
||||
|
||||
/* Set initial runlevel */
|
||||
/* Set initial runlevel and mark processor as started */
|
||||
ProcessorBlock->RunLevel = PASSIVE_LEVEL;
|
||||
ProcessorBlock->Started = TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -171,14 +171,6 @@ AR::Traps::DispatchTrap(IN PKTRAP_FRAME TrapFrame)
|
||||
/* Debug-Service-Request raised */
|
||||
HandleTrap2D(TrapFrame);
|
||||
break;
|
||||
case 0x2F:
|
||||
/* Software Interrupt at DISPATCH level */
|
||||
HandleTrap2F(TrapFrame);
|
||||
break;
|
||||
case 0xE1:
|
||||
/* InterProcessor Interrupt (IPI) */
|
||||
HandleTrapE1(TrapFrame);
|
||||
break;
|
||||
default:
|
||||
/* Unknown/Unexpected trap */
|
||||
HandleTrapFF(TrapFrame);
|
||||
@@ -608,40 +600,6 @@ AR::Traps::HandleTrap2D(IN PKTRAP_FRAME TrapFrame)
|
||||
KE::Crash::Panic(0x2D);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the trap 0x2F when a software interrupt gets generated at DISPATCH_LEVEL.
|
||||
*
|
||||
* @param TrapFrame
|
||||
* Supplies a kernel trap frame pushed by common trap handler on the stack.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
AR::Traps::HandleTrap2F(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Unhandled software interrupt at DISPATCH level (0x2F)!\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the trap 0xE1 when InterProcessor Interrupt (IPI) occurs.
|
||||
*
|
||||
* @param TrapFrame
|
||||
* Supplies a kernel trap frame pushed by common trap handler on the stack.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
AR::Traps::HandleTrapE1(IN PKTRAP_FRAME TrapFrame)
|
||||
{
|
||||
DebugPrint(L"Unhandled IPI interrupt (0xE1)!\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the trap 0xFF when Unexpected Interrupt occurs.
|
||||
*
|
||||
|
||||
@@ -587,6 +587,56 @@ AR::CpuFunctions::ReadWriteBarrier(VOID)
|
||||
: "memory");
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a Bit Scan Forward instruction to locate the most significant set bit.
|
||||
*
|
||||
* @param Index
|
||||
* Receives the zero-based index of the highest set bit when one is found.
|
||||
*
|
||||
* @param Mask
|
||||
* Supplies the bitmap to scan.
|
||||
*
|
||||
* @return This routine returns TRUE when a set bit was found, otherwise FALSE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
AR::CpuFunctions::ScanForwardBit(OUT PULONG Index,
|
||||
IN ULONG Mask)
|
||||
{
|
||||
/* Defer to the BSF instruction */
|
||||
__asm__("bsfl %[Mask], %[Index]" : [Index] "=r" (*Index) : [Mask] "mr" (Mask));
|
||||
|
||||
/* Report whether the input had any bit set */
|
||||
return Mask ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a Bit Scan Reverse instruction to locate the most significant set bit.
|
||||
*
|
||||
* @param Index
|
||||
* Receives the zero-based index of the highest set bit when one is found.
|
||||
*
|
||||
* @param Mask
|
||||
* Supplies the bitmap to scan.
|
||||
*
|
||||
* @return This routine returns TRUE when a set bit was found, otherwise FALSE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
AR::CpuFunctions::ScanReverseBit(OUT PULONG Index,
|
||||
IN ULONG Mask)
|
||||
{
|
||||
/* Defer to the BSR instruction */
|
||||
__asm__("bsrl %[Mask], %[Index]" : [Index] "=r" (*Index) : [Mask] "mr" (Mask));
|
||||
|
||||
/* Report whether the input had any bit set */
|
||||
return Mask ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Instructs the processor to set the interrupt flag.
|
||||
*
|
||||
|
||||
@@ -28,7 +28,7 @@ XTAPI
|
||||
VOID
|
||||
AR::ProcessorSupport::GetTrampolineInformation(IN TRAMPOLINE_TYPE TrampolineType,
|
||||
OUT PVOID *TrampolineCode,
|
||||
OUT PULONG_PTR TrampolineSize)
|
||||
OUT PULONG TrampolineSize)
|
||||
{
|
||||
/* Get trampoline information */
|
||||
switch(TrampolineType)
|
||||
@@ -465,8 +465,9 @@ AR::ProcessorSupport::InitializeProcessorBlock(OUT PKPROCESSOR_BLOCK ProcessorBl
|
||||
ProcessorBlock->Prcb.IdleThread = &(KE::KThread::GetInitialThread())->ThreadControlBlock;
|
||||
ProcessorBlock->Prcb.NextThread = NULLPTR;
|
||||
|
||||
/* Set initial runlevel */
|
||||
/* Set initial runlevel and mark processor as started */
|
||||
ProcessorBlock->RunLevel = PASSIVE_LEVEL;
|
||||
ProcessorBlock->Started = TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
43
xtoskrnl/ex/data.cc
Normal file
43
xtoskrnl/ex/data.cc
Normal file
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/ex/data.cc
|
||||
* DESCRIPTION: Kernel Executive global and static data
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Tracks all active non-paged lookaside lists in the system */
|
||||
LIST_ENTRY EX::LookasideList::NonPagedLookasideListHead;
|
||||
|
||||
/* Spinlock protecting the integrity of the NonPagedLookasideListHead */
|
||||
KSPIN_LOCK EX::LookasideList::NonPagedLookasideListLock;
|
||||
|
||||
/* Array of standard system lookaside lists for non-paged pool allocations */
|
||||
GENERAL_LOOKASIDE EX::LookasideList::NonPagedPoolLookasideLists[POOL_LOOKASIDE_LISTS];
|
||||
|
||||
/* Tracks all active paged lookaside lists in the system */
|
||||
LIST_ENTRY EX::LookasideList::PagedLookasideListHead;
|
||||
|
||||
/* Spinlock protecting the integrity of the PagedLookasideListHead */
|
||||
KSPIN_LOCK EX::LookasideList::PagedLookasideListLock;
|
||||
|
||||
/* Array of standard system lookaside lists for paged pool allocations */
|
||||
GENERAL_LOOKASIDE EX::LookasideList::PagedPoolLookasideLists[POOL_LOOKASIDE_LISTS];
|
||||
|
||||
/* Tracks all standard pool lookaside lists */
|
||||
LIST_ENTRY EX::LookasideList::PoolLookasideListHead;
|
||||
|
||||
/* Tracks dynamic system lookaside lists */
|
||||
LIST_ENTRY EX::LookasideList::SystemLookasideListHead;
|
||||
|
||||
/* Specifies the default timeout interval for resource wait operations */
|
||||
LARGE_INTEGER EX::Resources::ResourcesTimeOut;
|
||||
|
||||
/* Tracks all initialized structures currently active in the system */
|
||||
LIST_ENTRY EX::Resources::SystemResourcesList;
|
||||
|
||||
/* The global spinlock that protects the system resources list */
|
||||
KSPIN_LOCK EX::Resources::SystemResourcesLock;
|
||||
453
xtoskrnl/ex/laslist.cc
Normal file
453
xtoskrnl/ex/laslist.cc
Normal file
@@ -0,0 +1,453 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/ex/laslist.cc
|
||||
* DESCRIPTION: Lookaside Lists support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
* Attempts to allocate a fixed-size buffer from the specified non-paged lookaside list.
|
||||
*
|
||||
* @param LookasideList
|
||||
* Supplies a pointer to the non-paged lookaside list.
|
||||
*
|
||||
* @return Returns a pointer to the allocated buffer, or NULLPTR if the allocation fails.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PVOID
|
||||
EX::LookasideList::AllocateFromLookasideList(IN PNONPAGED_LOOKASIDE_LIST LookasideList)
|
||||
{
|
||||
PVOID Buffer;
|
||||
|
||||
/* Increment the total number of allocation requests */
|
||||
LookasideList->Global.TotalAllocates++;
|
||||
|
||||
/* Attempt to pop an entry from the lookaside list */
|
||||
Buffer = RTL::Atomic::PopEntrySingleList(&LookasideList->Global.ListHead);
|
||||
if(!Buffer)
|
||||
{
|
||||
/* Increment the miss counter */
|
||||
LookasideList->Global.AllocateMisses++;
|
||||
|
||||
/* Fallback to standard pool allocator */
|
||||
(LookasideList->Global.Allocate)(LookasideList->Global.Type, LookasideList->Global.Size,
|
||||
&Buffer, LookasideList->Global.Tag);
|
||||
}
|
||||
|
||||
/* Return the allocated buffer */
|
||||
return Buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to allocate a fixed-size buffer from the specified paged lookaside list.
|
||||
*
|
||||
* @param LookasideList
|
||||
* Supplies a pointer to the paged lookaside list.
|
||||
*
|
||||
* @return Returns a pointer to the allocated buffer, or NULLPTR if the allocation fails.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PVOID
|
||||
EX::LookasideList::AllocateFromLookasideList(IN PPAGED_LOOKASIDE_LIST LookasideList)
|
||||
{
|
||||
PVOID Buffer;
|
||||
|
||||
/* Increment the total number of allocation requests */
|
||||
LookasideList->Global.TotalAllocates++;
|
||||
|
||||
/* Attempt to pop an entry from the lookaside list */
|
||||
Buffer = RTL::Atomic::PopEntrySingleList(&LookasideList->Global.ListHead);
|
||||
if(!Buffer)
|
||||
{
|
||||
/* Increment the miss counter */
|
||||
LookasideList->Global.AllocateMisses++;
|
||||
|
||||
/* Fallback to standard pool allocator */
|
||||
(LookasideList->Global.Allocate)(LookasideList->Global.Type, LookasideList->Global.Size,
|
||||
&Buffer, LookasideList->Global.Tag);
|
||||
}
|
||||
|
||||
/* Return the allocated buffer */
|
||||
return Buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocates a memory block from the specified per-processor lookaside list.
|
||||
*
|
||||
* @param Number
|
||||
* Supplies the index of the lookaside list to allocate from.
|
||||
*
|
||||
* @return This routine returns a pointer to the allocated memory block, or NULLPTR if allocation fails.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PVOID
|
||||
EX::LookasideList::AllocateFromPerProcessorList(IN NONPAGED_LOOKASIDE_NUMBER Number)
|
||||
{
|
||||
PKPROCESSOR_CONTROL_BLOCK Prcb;
|
||||
PGENERAL_LOOKASIDE Lookaside;
|
||||
PVOID Entry;
|
||||
|
||||
/* Retrieve the current Processor Control Block */
|
||||
Prcb = KE::Processor::GetCurrentProcessorControlBlock();
|
||||
|
||||
/* Target the processor's local lookaside list and increment the tracking metric */
|
||||
Lookaside = Prcb->LookasideList[Number].Local;
|
||||
Lookaside->TotalAllocates++;
|
||||
|
||||
/* Attempt a pop from the local list */
|
||||
Entry = RTL::Atomic::PopEntrySingleList(&Lookaside->ListHead);
|
||||
if(Entry != NULLPTR)
|
||||
{
|
||||
/* Return the retrieved a pre-allocated block */
|
||||
return Entry;
|
||||
}
|
||||
|
||||
/* Record a local cache miss */
|
||||
Lookaside->AllocateMisses++;
|
||||
Lookaside->TotalAllocates++;
|
||||
|
||||
/* Switch the target to the shared global lookaside list */
|
||||
Lookaside = Prcb->LookasideList[Number].Global;
|
||||
|
||||
/* Attempt a pop from the global list */
|
||||
Entry = RTL::Atomic::PopEntrySingleList(&Lookaside->ListHead);
|
||||
if(Entry != NULLPTR)
|
||||
{
|
||||
/* Return the retrieved a pre-allocated block */
|
||||
return Entry;
|
||||
}
|
||||
|
||||
/* Both caches are saturated, record a miss */
|
||||
Lookaside->AllocateMisses++;
|
||||
|
||||
/* Invoke the pool allocator */
|
||||
(Lookaside->Allocate)(Lookaside->Type, Lookaside->Size, &Entry, Lookaside->Tag);
|
||||
|
||||
/* Return the newly allocated block */
|
||||
return Entry;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a previously allocated memory block to the specified non-paged lookaside list.
|
||||
*
|
||||
* @param LookasideList
|
||||
* Supplies a pointer to the non-paged lookaside list.
|
||||
*
|
||||
* @param Entry
|
||||
* Supplies a pointer to the memory block being freed.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
EX::LookasideList::FreeToLookasideList(IN PNONPAGED_LOOKASIDE_LIST LookasideList,
|
||||
IN PVOID Entry)
|
||||
{
|
||||
/* Increment the tracking metric */
|
||||
LookasideList->Global.TotalFrees++;
|
||||
|
||||
/* Verify if the lookaside list has reached its maximum capacity threshold */
|
||||
if(RTL::SinglyList::QueryListDepth(&LookasideList->Global.ListHead) >= LookasideList->Global.Depth)
|
||||
{
|
||||
/* The list is full, record a capacity miss */
|
||||
LookasideList->Global.FreeMisses++;
|
||||
(LookasideList->Global.Free)(Entry);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Push the block onto the lookaside list */
|
||||
RTL::Atomic::PushEntrySingleList(&LookasideList->Global.ListHead, (PSINGLE_LIST_ENTRY)Entry);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a previously allocated memory block to the specified paged lookaside list.
|
||||
*
|
||||
* @param LookasideList
|
||||
* Supplies a pointer to the paged lookaside list.
|
||||
*
|
||||
* @param Entry
|
||||
* Supplies a pointer to the memory block being freed.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
EX::LookasideList::FreeToLookasideList(IN PPAGED_LOOKASIDE_LIST LookasideList,
|
||||
IN PVOID Entry)
|
||||
{
|
||||
/* Increment the tracking metric */
|
||||
LookasideList->Global.TotalFrees++;
|
||||
|
||||
/* Verify if the lookaside list has reached its maximum capacity threshold */
|
||||
if(RTL::SinglyList::QueryListDepth(&LookasideList->Global.ListHead) >= LookasideList->Global.Depth)
|
||||
{
|
||||
/* The list is full, record a capacity miss */
|
||||
LookasideList->Global.FreeMisses++;
|
||||
(LookasideList->Global.Free)(Entry);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Push the block onto the lookaside list */
|
||||
RTL::Atomic::PushEntrySingleList(&LookasideList->Global.ListHead, (PSINGLE_LIST_ENTRY)Entry);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Frees a memory block back to the specified per-processor lookaside list.
|
||||
*
|
||||
* @param Number
|
||||
* Supplies the index of the lookaside list receiving the freed block.
|
||||
*
|
||||
* @param Entry
|
||||
* Supplies a pointer to the memory block being freed.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
EX::LookasideList::FreeToPerProcessorList(IN NONPAGED_LOOKASIDE_NUMBER Number,
|
||||
IN PVOID Entry)
|
||||
{
|
||||
PKPROCESSOR_CONTROL_BLOCK Prcb;
|
||||
PGENERAL_LOOKASIDE Lookaside;
|
||||
|
||||
/* Retrieve the current Processor Control Block */
|
||||
Prcb = KE::Processor::GetCurrentProcessorControlBlock();
|
||||
|
||||
/* Target the processor's local lookaside list and increment the tracking metric */
|
||||
Lookaside = Prcb->LookasideList[Number].Local;
|
||||
Lookaside->TotalFrees += 1;
|
||||
|
||||
/* Check if the lookaside list has reached its maximum capacity threshold */
|
||||
if(RTL::SinglyList::QueryListDepth(&Lookaside->ListHead) >= Lookaside->Depth)
|
||||
{
|
||||
/* The local list is full, record a capacity miss */
|
||||
Lookaside->FreeMisses++;
|
||||
Lookaside->TotalFrees++;
|
||||
|
||||
/* Switch the target to the shared global lookaside list */
|
||||
Lookaside = Prcb->LookasideList[Number].Global;
|
||||
|
||||
/* Check if the lookaside list has reached its maximum capacity threshold */
|
||||
if(RTL::SinglyList::QueryListDepth(&Lookaside->ListHead) >= Lookaside->Depth)
|
||||
{
|
||||
/* Both caches are saturated, record a miss */
|
||||
Lookaside->FreeMisses++;
|
||||
(Lookaside->Free)(Entry);
|
||||
|
||||
/* Exit the routine */
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Push the block onto the selected lookaside list */
|
||||
RTL::Atomic::PushEntrySingleList(&Lookaside->ListHead, (PSINGLE_LIST_ENTRY)Entry);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes a generic lookaside list and inserts it into the tracking list.
|
||||
*
|
||||
* @param LookasideList
|
||||
* Supplies a pointer to the general lookaside list structure to initialize.
|
||||
*
|
||||
* @param PoolType
|
||||
* Supplies the type of memory pool to be allocated.
|
||||
*
|
||||
* @param Size
|
||||
* Supplies the size, in bytes, of the entries to be allocated from the lookaside list.
|
||||
*
|
||||
* @param Tag
|
||||
* Supplies the pool tag to be used for allocations.
|
||||
*
|
||||
* @param MaxDepth
|
||||
* Supplies the maximum number of entries the lookaside list should hold.
|
||||
*
|
||||
* @param ListHead
|
||||
* Supplies a pointer to the linked list header used to track this lookaside list.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
EX::LookasideList::InitializeLookasideList(IN OUT PGENERAL_LOOKASIDE LookasideList,
|
||||
IN MMPOOL_TYPE PoolType,
|
||||
IN ULONG Size,
|
||||
IN ULONG Tag,
|
||||
IN USHORT MaxDepth,
|
||||
IN PLIST_ENTRY ListHead)
|
||||
{
|
||||
/* Initialize the singly linked list header and insert it into the tracking list */
|
||||
RTL::SinglyList::InitializeListHead(&LookasideList->ListHead);
|
||||
RTL::LinkedList::InsertTailList(ListHead, &LookasideList->ListEntry);
|
||||
|
||||
/* Initialize lookaside list properties */
|
||||
LookasideList->Allocate = &MM::Allocator::AllocatePool;
|
||||
LookasideList->AllocateHits = 0;
|
||||
LookasideList->Depth = 2;
|
||||
LookasideList->Free = &MM::Allocator::FreePool;
|
||||
LookasideList->FreeHits = 0;
|
||||
LookasideList->LastAllocateHits = 0;
|
||||
LookasideList->LastTotalAllocates = 0;
|
||||
LookasideList->MaximumDepth = MaxDepth;
|
||||
LookasideList->Size = Size;
|
||||
LookasideList->Tag = Tag;
|
||||
LookasideList->TotalAllocates = 0;
|
||||
LookasideList->TotalFrees = 0;
|
||||
LookasideList->Type = PoolType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the per-processor lookaside list pointers.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
EX::LookasideList::InitializePointers(VOID)
|
||||
{
|
||||
PGENERAL_LOOKASIDE LookasideList;
|
||||
PKPROCESSOR_CONTROL_BLOCK Prcb;
|
||||
ULONG Index, Offset;
|
||||
XTSTATUS Status;
|
||||
|
||||
/* Retrieve the processor control block */
|
||||
Prcb = KE::Processor::GetCurrentProcessorControlBlock();
|
||||
|
||||
/* Allocate a contiguous memory block for lookaside lists */
|
||||
Status = MM::Allocator::AllocatePool(NonPagedPool, sizeof(GENERAL_LOOKASIDE) * POOL_LOOKASIDE_LISTS * 2,
|
||||
(PVOID*)&LookasideList, TAG_MM_MEMORY_POOL);
|
||||
|
||||
/* Initialize both non-paged and paged lookaside lists for all pool indexes */
|
||||
for(Index = 0; Index < POOL_LOOKASIDE_LISTS; Index++)
|
||||
{
|
||||
/* Wire the global pointer for the non-paged lookaside list */
|
||||
Prcb->NonPagedLookasideList[Index].Global = &NonPagedPoolLookasideLists[Index];
|
||||
|
||||
/* Check if the contiguous allocation was successful */
|
||||
if(Status == STATUS_SUCCESS && LookasideList)
|
||||
{
|
||||
/* Map the pointer to the first half of the contiguous block */
|
||||
Prcb->NonPagedLookasideList[Index].Local = &LookasideList[Index];
|
||||
|
||||
/* Initialize the local non-paged list */
|
||||
EX::LookasideList::InitializeLookasideList(&LookasideList[Index], NonPagedPool,
|
||||
(Index + 1) * 8, TAG_MM_MEMORY_POOL,
|
||||
256, &PoolLookasideListHead);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Allocation failed, use shared global list */
|
||||
Prcb->NonPagedLookasideList[Index].Local = &NonPagedPoolLookasideLists[Index];
|
||||
}
|
||||
|
||||
/* Wire the global pointer for the paged lookaside list */
|
||||
Prcb->PagedLookasideList[Index].Global = &PagedPoolLookasideLists[Index];
|
||||
|
||||
/* Check if the contiguous allocation was successful */
|
||||
if(Status == STATUS_SUCCESS && LookasideList)
|
||||
{
|
||||
/* Calculate the offset into the second half of the contiguous memory block */
|
||||
Offset = POOL_LOOKASIDE_LISTS + Index;
|
||||
|
||||
/* Map the pointer to the second half of the contiguous block */
|
||||
Prcb->PagedLookasideList[Index].Local = &LookasideList[Offset];
|
||||
|
||||
/* Initialize the local paged list */
|
||||
EX::LookasideList::InitializeLookasideList(&LookasideList[Offset], PagedPool,
|
||||
(Index + 1) * 8, TAG_MM_MEMORY_POOL,
|
||||
256, &PoolLookasideListHead);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Allocation failed, use shared global list */
|
||||
Prcb->PagedLookasideList[Index].Local = &PagedPoolLookasideLists[Index];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes global system lookaside lists and their synchronization primitives.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
EX::LookasideList::InitializeSystemLookasideLists(VOID)
|
||||
{
|
||||
ULONG Index;
|
||||
|
||||
/* Initialize spinlocks for protecting lookaside list operations */
|
||||
KE::SpinLock::InitializeSpinLock(&NonPagedLookasideListLock);
|
||||
KE::SpinLock::InitializeSpinLock(&PagedLookasideListLock);
|
||||
|
||||
/* Initialize global list heads for tracking various types of lookaside lists */
|
||||
RTL::LinkedList::InitializeListHead(&NonPagedLookasideListHead);
|
||||
RTL::LinkedList::InitializeListHead(&PagedLookasideListHead);
|
||||
RTL::LinkedList::InitializeListHead(&PoolLookasideListHead);
|
||||
RTL::LinkedList::InitializeListHead(&SystemLookasideListHead);
|
||||
|
||||
/* Initialize standard pool lookaside lists */
|
||||
for(Index = 0; Index < POOL_LOOKASIDE_LISTS; Index++)
|
||||
{
|
||||
/* Initialize non-paged pool lookaside list */
|
||||
InitializeLookasideList(&NonPagedPoolLookasideLists[Index], NonPagedPool, (Index + 1) * 8,
|
||||
TAG_MM_MEMORY_POOL, 256, &PoolLookasideListHead);
|
||||
|
||||
/* Initialize paged pool lookaside list */
|
||||
InitializeLookasideList(&PagedPoolLookasideLists[Index], PagedPool, (Index + 1) * 8,
|
||||
TAG_MM_MEMORY_POOL, 256, &PoolLookasideListHead);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the head of the pool lookaside list tracker.
|
||||
*
|
||||
* @return This routine returns a pointer to the global pool lookaside list head.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PLIST_ENTRY
|
||||
EX::LookasideList::GetPoolLookasideListHead(VOID)
|
||||
{
|
||||
/* Return the head of the pool lookaside list */
|
||||
return &PoolLookasideListHead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the head of the system-wide lookaside list tracker.
|
||||
*
|
||||
* @return This routine returns a pointer to the global system lookaside list head.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PLIST_ENTRY
|
||||
EX::LookasideList::GetSystemLookasideListHead(VOID)
|
||||
{
|
||||
/* Return the head of the pool lookaside list */
|
||||
return &SystemLookasideListHead;
|
||||
}
|
||||
169
xtoskrnl/ex/resource.cc
Normal file
169
xtoskrnl/ex/resource.cc
Normal file
@@ -0,0 +1,169 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/ex/resource.cc
|
||||
* DESCRIPTION: Exclusive resource synchronization support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
* Deletes a system resource and frees its associated memory allocations.
|
||||
*
|
||||
* @param Resource
|
||||
* Supplies a pointer to the resource to be deleted.
|
||||
*
|
||||
* @return This routine returns a status code indicating the success or failure of the operation.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
XTSTATUS
|
||||
EX::Resources::DeleteResource(IN PERESOURCE Resource)
|
||||
{
|
||||
/* Start a guarded code block */
|
||||
{
|
||||
/* Raise runlevel to DISPATCH level and acquire system resources lock */
|
||||
KE::RaiseRunLevel RunLevel(DISPATCH_LEVEL);
|
||||
KE::QueuedSpinLockGuard Guard(&SystemResourcesLock);
|
||||
|
||||
/* Remove the resource from the system resource list */
|
||||
RTL::LinkedList::RemoveEntryList(&Resource->SystemResourcesList);
|
||||
}
|
||||
|
||||
/* Check if exclusive waiters event exists */
|
||||
if(Resource->ExclusiveWaiters)
|
||||
{
|
||||
/* Free the exclusive waiters event */
|
||||
MM::Allocator::FreePool(Resource->ExclusiveWaiters);
|
||||
}
|
||||
|
||||
/* Check if owner table exists */
|
||||
if(Resource->OwnerTable)
|
||||
{
|
||||
/* Free the owner table */
|
||||
MM::Allocator::FreePool(Resource->OwnerTable);
|
||||
}
|
||||
|
||||
/* Check if shared waiters semaphore exists */
|
||||
if(Resource->SharedWaiters)
|
||||
{
|
||||
/* Free the shared waiters semaphore */
|
||||
MM::Allocator::FreePool(Resource->SharedWaiters);
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes a system resource object.
|
||||
*
|
||||
* @param Resource
|
||||
* Supplies a pointer to the resource structure to be initialized.
|
||||
*
|
||||
* @return This routine returns a status code indicating the success or failure of the operation.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
XTSTATUS
|
||||
EX::Resources::InitializeResource(IN PERESOURCE Resource)
|
||||
{
|
||||
/* Clear the entire resource structure */
|
||||
RTL::Memory::ZeroMemory(Resource, sizeof(ERESOURCE));
|
||||
|
||||
/* Initialize the spinlock used for managing this resource */
|
||||
KE::SpinLock::InitializeSpinLock(&Resource->SpinLock);
|
||||
|
||||
/* Raise runlevel to DISPATCH level and acquire the global system resources lock */
|
||||
KE::RaiseRunLevel RunLevel(DISPATCH_LEVEL);
|
||||
KE::QueuedSpinLockGuard Guard(&SystemResourcesLock);
|
||||
|
||||
/* Insert the resource into the global tracking list */
|
||||
RTL::LinkedList::InsertTailList(&SystemResourcesList, &Resource->SystemResourcesList);
|
||||
|
||||
/* Return success */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the global system resource structures and synchronization primitives.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
EX::Resources::InitializeSystemResources(VOID)
|
||||
{
|
||||
/* Set the default timeout for resource operations to 4 seconds relative to now */
|
||||
ResourcesTimeOut.QuadPart = -40000000LL;
|
||||
|
||||
/* Initialize the global system resources list and its protecting spinlock */
|
||||
RTL::LinkedList::InitializeListHead(&SystemResourcesList);
|
||||
KE::SpinLock::InitializeSpinLock(&SystemResourcesLock);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reinitializes an existing resource object, resetting its state and synchronization primitives.
|
||||
*
|
||||
* @param Resource
|
||||
* Supplies a pointer to the resource structure to be reinitialized.
|
||||
*
|
||||
* @return This routine returns a status code indicating the success or failure of the operation.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
XTSTATUS
|
||||
EX::Resources::ReinitializeResource(IN PERESOURCE Resource)
|
||||
{
|
||||
ULONG Index;
|
||||
|
||||
/* Zero the active count and flags */
|
||||
Resource->ActiveCount = 0;
|
||||
Resource->ActiveEntries = 0;
|
||||
Resource->Flag = 0;
|
||||
|
||||
/* Zero the contention count and counters */
|
||||
Resource->ContentionCount = 0;
|
||||
Resource->NumberOfSharedWaiters = 0;
|
||||
Resource->NumberOfExclusiveWaiters = 0;
|
||||
|
||||
/* Zero the owner entry */
|
||||
Resource->OwnerEntry.OwnerThread = 0;
|
||||
Resource->OwnerEntry.TableSize = 0;
|
||||
|
||||
/* Check if exclusive waiters event exists */
|
||||
if(Resource->ExclusiveWaiters)
|
||||
{
|
||||
/* Reinitialize the event */
|
||||
KE::Event::InitializeEvent(Resource->ExclusiveWaiters, SynchronizationEvent, FALSE);
|
||||
}
|
||||
|
||||
/* Check if owner table exists */
|
||||
if(Resource->OwnerTable)
|
||||
{
|
||||
/* Iterate over the owner table */
|
||||
for(Index = 1; Index < Resource->OwnerTable->TableSize; Index++)
|
||||
{
|
||||
/* Zero the owner table */
|
||||
Resource->OwnerTable[Index].OwnerCount = 0;
|
||||
Resource->OwnerTable[Index].OwnerThread = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if shared waiters semaphore exists */
|
||||
if(Resource->SharedWaiters)
|
||||
{
|
||||
/* Reinitialize the semaphore */
|
||||
KE::Semaphore::InitializeSemaphore(Resource->SharedWaiters, 0, MAXLONG);
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
* FILE: xtoskrnl/ex/rundown.cc
|
||||
* DESCRIPTION: Rundown protection mechanism
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
* Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#include <xtos.hh>
|
||||
@@ -22,6 +23,28 @@
|
||||
XTFASTCALL
|
||||
BOOLEAN
|
||||
EX::Rundown::AcquireProtection(IN PEX_RUNDOWN_REFERENCE Descriptor)
|
||||
{
|
||||
/* Acquire protection */
|
||||
return AcquireProtection(Descriptor, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Acquires the rundown protection for given descriptor.
|
||||
*
|
||||
* @param Descriptor
|
||||
* Supplies a pointer to the rundown block descriptor.
|
||||
*
|
||||
* @param Count
|
||||
* Supplies the number of times the protection should be acquired.
|
||||
*
|
||||
* @return This routine returns TRUE if protection acquired successfully, or FALSE otherwise.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTFASTCALL
|
||||
BOOLEAN
|
||||
EX::Rundown::AcquireProtection(IN PEX_RUNDOWN_REFERENCE Descriptor,
|
||||
IN ULONG Count)
|
||||
{
|
||||
ULONG_PTR CurrentValue, NewValue;
|
||||
|
||||
@@ -39,7 +62,7 @@ EX::Rundown::AcquireProtection(IN PEX_RUNDOWN_REFERENCE Descriptor)
|
||||
}
|
||||
|
||||
/* Attempt to increment the usage count */
|
||||
NewValue = CurrentValue + 2;
|
||||
NewValue = CurrentValue + 2 * Count;
|
||||
|
||||
/* Exchange the value */
|
||||
NewValue = (ULONG_PTR)RTL::Atomic::CompareExchangePointer(&Descriptor->Ptr, (PVOID)NewValue,
|
||||
@@ -71,6 +94,7 @@ XTFASTCALL
|
||||
VOID
|
||||
EX::Rundown::CompleteProtection(IN PEX_RUNDOWN_REFERENCE Descriptor)
|
||||
{
|
||||
/* Mark the descriptor as completely run down */
|
||||
RTL::Atomic::ExchangePointer(&Descriptor->Ptr, (PVOID)EX_RUNDOWN_ACTIVE);
|
||||
}
|
||||
|
||||
@@ -106,6 +130,7 @@ XTFASTCALL
|
||||
VOID
|
||||
EX::Rundown::ReInitializeProtection(IN PEX_RUNDOWN_REFERENCE Descriptor)
|
||||
{
|
||||
/* Reset the descriptor to its initial state */
|
||||
RTL::Atomic::ExchangePointer(&Descriptor->Ptr, NULLPTR);
|
||||
}
|
||||
|
||||
@@ -122,39 +147,71 @@ EX::Rundown::ReInitializeProtection(IN PEX_RUNDOWN_REFERENCE Descriptor)
|
||||
XTFASTCALL
|
||||
VOID
|
||||
EX::Rundown::ReleaseProtection(IN PEX_RUNDOWN_REFERENCE Descriptor)
|
||||
{
|
||||
/* Release protection */
|
||||
ReleaseProtection(Descriptor, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Releases the rundown protection for given descriptor.
|
||||
*
|
||||
* @param Descriptor
|
||||
* Supplies a pointer to the descriptor to be initialized.
|
||||
*
|
||||
* @param Count
|
||||
* Supplies the number of references to release.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTFASTCALL
|
||||
VOID
|
||||
EX::Rundown::ReleaseProtection(IN PEX_RUNDOWN_REFERENCE Descriptor,
|
||||
IN ULONG Count)
|
||||
{
|
||||
ULONG_PTR CurrentValue, NewValue;
|
||||
PEX_RUNDOWN_WAIT_BLOCK WaitBlock;
|
||||
|
||||
/* Read the current state of the rundown descriptor */
|
||||
CurrentValue = Descriptor->Count;
|
||||
|
||||
/* Enter a CAS loop */
|
||||
while(TRUE)
|
||||
{
|
||||
/* Check if the rundown is currently active */
|
||||
if(CurrentValue & 0x1)
|
||||
{
|
||||
/* Extract the pointer to the wait block */
|
||||
WaitBlock = (PEX_RUNDOWN_WAIT_BLOCK)(CurrentValue & ~0x1);
|
||||
|
||||
/* Decrement the pending reference count */
|
||||
if(!RTL::Atomic::Decrement64((PLONG_PTR)&WaitBlock->Count))
|
||||
{
|
||||
/* Signal the event to wake up the teardown thread */
|
||||
KE::Event::SetEvent(&WaitBlock->WakeEvent, 0, FALSE);
|
||||
}
|
||||
|
||||
/* Break the loop */
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Attempt to decrement the usage count */
|
||||
NewValue = CurrentValue - 2;
|
||||
NewValue = CurrentValue - 2 * Count;
|
||||
|
||||
/* Exchange the value */
|
||||
NewValue = (ULONG_PTR)RTL::Atomic::CompareExchangePointer(&Descriptor->Ptr, (PVOID)NewValue,
|
||||
(PVOID)CurrentValue);
|
||||
|
||||
/* Check if the atomic swap succeeded without interference from other processors */
|
||||
if(NewValue == CurrentValue)
|
||||
{
|
||||
/* Reference count is decremented, break the loop */
|
||||
break;
|
||||
}
|
||||
|
||||
/* Collision detected, update current state and retry */
|
||||
CurrentValue = NewValue;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ ACPI_SYSTEM_INFO HL::Acpi::SystemInfo;
|
||||
ACPI_TIMER_INFO HL::Acpi::TimerInfo;
|
||||
|
||||
/* Represents the number of active processors */
|
||||
KAFFINITY HL::Cpu::ActiveProcessors;
|
||||
PKAFFINITY_MAP HL::Cpu::ActiveProcessors;
|
||||
|
||||
/* Metadata detailing the linear frame buffer geometry */
|
||||
HL_FRAMEBUFFER_DATA HL::FrameBuffer::FrameBufferData;
|
||||
|
||||
@@ -409,7 +409,7 @@ HL::FrameBuffer::EnableShadowBuffer(VOID)
|
||||
|
||||
/* Allocate non-paged memory for the shadow buffer */
|
||||
Status = MM::Allocator::AllocatePool(NonPagedPool, FrameBufferSize,
|
||||
&ScreenShadowBuffer, SIGNATURE32('F', 'B', 'U', 'F'));
|
||||
&ScreenShadowBuffer, TAG_HL_FRAMEBUFFER);
|
||||
if(Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* Allocation failed, return status code */
|
||||
|
||||
@@ -24,7 +24,6 @@ VOID
|
||||
HL::Cpu::InitializeProcessor(VOID)
|
||||
{
|
||||
PKPROCESSOR_BLOCK ProcessorBlock;
|
||||
KAFFINITY Affinity;
|
||||
|
||||
/* Get current processor block */
|
||||
ProcessorBlock = KE::Processor::GetCurrentProcessorBlock();
|
||||
@@ -33,17 +32,46 @@ HL::Cpu::InitializeProcessor(VOID)
|
||||
ProcessorBlock->StallScaleFactor = INITIAL_STALL_FACTOR;
|
||||
ProcessorBlock->Idr = 0xFFFFFFFF;
|
||||
|
||||
/* Set processor affinity */
|
||||
Affinity = (KAFFINITY) 1 << ProcessorBlock->CpuNumber;
|
||||
|
||||
/* Apply affinity to a set of processors */
|
||||
ActiveProcessors |= Affinity;
|
||||
/* Check if active processors map is initialized */
|
||||
if(ActiveProcessors != NULLPTR)
|
||||
{
|
||||
/* Register this CPU in the global active processors map */
|
||||
KE::Affinity::AtomicSetProcessorAffinity(ActiveProcessors, ProcessorBlock->CpuNumber);
|
||||
}
|
||||
|
||||
/* Initialize APIC for this processor */
|
||||
HL::Pic::InitializePic();
|
||||
|
||||
/* Set the APIC running level */
|
||||
HL::RunLevel::SetRunLevel(KE::Processor::GetCurrentProcessorBlock()->RunLevel);
|
||||
HL::RunLevel::SetRunLevel(ProcessorBlock->RunLevel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the global processor affinity map for active processors and registers Bootstrap Processor (BSP).
|
||||
*
|
||||
* @return This routine returns a status code indicating the success or failure of the operation.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
XTSTATUS
|
||||
HL::Cpu::InitializeProcessorAffinity(VOID)
|
||||
{
|
||||
XTSTATUS Status;
|
||||
|
||||
/* Allocate an array of pointers */
|
||||
Status = KE::Affinity::CreateAffinityMap(KE::Processor::GetInstalledCpus(), &ActiveProcessors);
|
||||
if(Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* Failed to allocate memory, return error */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Register BSP in the global active processors map */
|
||||
KE::Affinity::SetProcessorAffinity(ActiveProcessors, 0);
|
||||
|
||||
/* Return success */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -57,9 +85,9 @@ XTAPI
|
||||
XTSTATUS
|
||||
HL::Cpu::StartAllProcessors(VOID)
|
||||
{
|
||||
ULONG CpuNumber, Index, MaxCpus, SipiVector, Timeout, TrampolinePages;
|
||||
PVOID CpuStructures, TrampolineAddress, TrampolineCode;
|
||||
ULONG_PTR AllocationSize, TrampolineCodeSize;
|
||||
ULONG ApPages, CpuNumber, Index, MaxCpus, SipiVector, Timeout, TrampolineCodeSize;
|
||||
PVOID ApVirtualAddress, CpuStructures, TrampolineCode;
|
||||
PHYSICAL_ADDRESS ApPhysicalAddress;
|
||||
PPROCESSOR_START_BLOCK StartBlock;
|
||||
PKPROCESSOR_BLOCK ProcessorBlock;
|
||||
PACPI_SYSTEM_INFO SysInfo;
|
||||
@@ -108,27 +136,34 @@ HL::Cpu::StartAllProcessors(VOID)
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
/* Compute trampoline memory allocation size (trampoline + processor start block + temporary stack) */
|
||||
AllocationSize = TrampolineCodeSize + sizeof(PROCESSOR_START_BLOCK) + 512;
|
||||
TrampolinePages = (ULONG)(ROUND_UP(AllocationSize, MM_PAGE_SIZE) / MM_PAGE_SIZE);
|
||||
|
||||
/* Allocate real mode memory for AP trampoline */
|
||||
Status = MM::HardwarePool::AllocateRealModeMemory(TrampolinePages, &TrampolineAddress);
|
||||
/* Allocate low memory for AP trampoline code */
|
||||
Status = MM::HardwarePool::AllocateLowMemory(&ApPhysicalAddress, &ApVirtualAddress);
|
||||
if(Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* Failed to allocate memory, print error message and return error */
|
||||
DebugPrint(L"Failed to allocate %lu pages for AP Trampoline!\n", TrampolinePages);
|
||||
DebugPrint(L"Failed to allocate low memory for AP Trampoline!\n");
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Copy trampoline code to low memory */
|
||||
RTL::Memory::CopyMemory(TrampolineAddress, TrampolineCode, TrampolineCodeSize);
|
||||
RTL::Memory::CopyMemory(ApVirtualAddress, TrampolineCode, TrampolineCodeSize);
|
||||
|
||||
/* Compute number of pages for trampoline */
|
||||
ApPages = MM::HardwarePool::CalculateRealModeAllocationPages(TrampolineCodeSize);
|
||||
|
||||
/* Temporarily identity map trampoline address */
|
||||
Status = MM::HardwarePool::MapRealModeMemory(ApPhysicalAddress, ApPages);
|
||||
if(Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* Failed to map memory, return error */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Get start block address relative to trampoline address */
|
||||
StartBlock = (PPROCESSOR_START_BLOCK)((PUCHAR)TrampolineAddress + TrampolineCodeSize);
|
||||
StartBlock = (PPROCESSOR_START_BLOCK)((PUCHAR)ApVirtualAddress + TrampolineCodeSize);
|
||||
|
||||
/* Get SIPI vector */
|
||||
SipiVector = (ULONG)((ULONG_PTR)TrampolineAddress >> 12);
|
||||
SipiVector = (ULONG)(ApPhysicalAddress.QuadPart >> APIC_VECTOR_SIPI_SHIFT);
|
||||
|
||||
/* Loop over all CPUs */
|
||||
CpuNumber = 0;
|
||||
@@ -155,8 +190,8 @@ HL::Cpu::StartAllProcessors(VOID)
|
||||
Status = MM::KernelPool::AllocateProcessorStructures(&CpuStructures);
|
||||
if(Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* Failed to allocate memory, unmap memory and return error */
|
||||
MM::HardwarePool::UnmapHardwareMemory(TrampolineAddress, TrampolinePages, TRUE);
|
||||
/* Failed to allocate memory, unmap temporary identity mapping and return error */
|
||||
MM::HardwarePool::UnmapRealModeMemory(ApPhysicalAddress, ApPages);
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -214,7 +249,7 @@ HL::Cpu::StartAllProcessors(VOID)
|
||||
}
|
||||
}
|
||||
|
||||
/* Unmap trampoline memory and return success */
|
||||
MM::HardwarePool::UnmapHardwareMemory(TrampolineAddress, TrampolinePages, TRUE);
|
||||
/* Unmap temporary identity mapping and return success */
|
||||
MM::HardwarePool::UnmapRealModeMemory(ApPhysicalAddress, ApPages);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -42,6 +42,10 @@ namespace AR
|
||||
STATIC XTCDECL ULONGLONG ReadTimeStampCounter(VOID);
|
||||
STATIC XTCDECL ULONGLONG ReadTimeStampCounterProcessor(OUT PULONG TscAux);
|
||||
STATIC XTCDECL VOID ReadWriteBarrier(VOID);
|
||||
STATIC XTCDECL BOOLEAN ScanForwardBit(OUT PULONG Index,
|
||||
IN ULONG Mask);
|
||||
STATIC XTCDECL BOOLEAN ScanReverseBit(OUT PULONG Index,
|
||||
IN ULONG Mask);
|
||||
STATIC XTCDECL VOID SetInterruptFlag(VOID);
|
||||
STATIC XTCDECL VOID StoreGlobalDescriptorTable(OUT PVOID Destination);
|
||||
STATIC XTCDECL VOID StoreInterruptDescriptorTable(OUT PVOID Destination);
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace AR
|
||||
STATIC XTAPI PVOID GetBootStack(VOID);
|
||||
STATIC XTAPI VOID GetTrampolineInformation(IN TRAMPOLINE_TYPE TrampolineType,
|
||||
OUT PVOID *TrampolineCode,
|
||||
OUT PULONG_PTR TrampolineSize);
|
||||
OUT PULONG TrampolineSize);
|
||||
STATIC XTAPI VOID InitializeProcessor(IN PVOID ProcessorStructures);
|
||||
STATIC XTAPI VOID InitializeProcessorStructures(IN PVOID ProcessorStructures,
|
||||
OUT PKGDTENTRY *Gdt,
|
||||
|
||||
@@ -51,8 +51,6 @@ namespace AR
|
||||
STATIC XTCDECL VOID HandleTrap1F(IN PKTRAP_FRAME TrapFrame);
|
||||
STATIC XTCDECL VOID HandleTrap2C(IN PKTRAP_FRAME TrapFrame);
|
||||
STATIC XTCDECL VOID HandleTrap2D(IN PKTRAP_FRAME TrapFrame);
|
||||
STATIC XTCDECL VOID HandleTrap2F(IN PKTRAP_FRAME TrapFrame);
|
||||
STATIC XTCDECL VOID HandleTrapE1(IN PKTRAP_FRAME TrapFrame);
|
||||
STATIC XTCDECL VOID HandleTrapFF(IN PKTRAP_FRAME TrapFrame);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -41,6 +41,10 @@ namespace AR
|
||||
STATIC XTCDECL ULONGLONG ReadTimeStampCounter(VOID);
|
||||
STATIC XTCDECL ULONGLONG ReadTimeStampCounterProcessor(OUT PULONG TscAux);
|
||||
STATIC XTCDECL VOID ReadWriteBarrier(VOID);
|
||||
STATIC XTCDECL BOOLEAN ScanForwardBit(OUT PULONG Index,
|
||||
IN ULONG Mask);
|
||||
STATIC XTCDECL BOOLEAN ScanReverseBit(OUT PULONG Index,
|
||||
IN ULONG Mask);
|
||||
STATIC XTCDECL VOID SetInterruptFlag(VOID);
|
||||
STATIC XTCDECL VOID StoreGlobalDescriptorTable(OUT PVOID Destination);
|
||||
STATIC XTCDECL VOID StoreInterruptDescriptorTable(OUT PVOID Destination);
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace AR
|
||||
STATIC XTAPI PVOID GetBootStack(VOID);
|
||||
STATIC XTAPI VOID GetTrampolineInformation(IN TRAMPOLINE_TYPE TrampolineType,
|
||||
OUT PVOID *TrampolineCode,
|
||||
OUT PULONG_PTR TrampolineSize);
|
||||
OUT PULONG TrampolineSize);
|
||||
STATIC XTAPI VOID InitializeProcessor(IN PVOID ProcessorStructures);
|
||||
STATIC XTAPI VOID InitializeProcessorStructures(IN PVOID ProcessorStructures,
|
||||
OUT PKGDTENTRY *Gdt,
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
#include <ex/laslist.hh>
|
||||
#include <ex/resource.hh>
|
||||
#include <ex/rundown.hh>
|
||||
|
||||
#endif /* __XTOSKRNL_EX_HH */
|
||||
|
||||
53
xtoskrnl/includes/ex/laslist.hh
Normal file
53
xtoskrnl/includes/ex/laslist.hh
Normal file
@@ -0,0 +1,53 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/ex/laslist.hh
|
||||
* DESCRIPTION: Lookaside Lists support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_EX_LASLIST_HH
|
||||
#define __XTOSKRNL_EX_LASLIST_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Kernel Executive */
|
||||
namespace EX
|
||||
{
|
||||
class LookasideList
|
||||
{
|
||||
private:
|
||||
STATIC LIST_ENTRY NonPagedLookasideListHead;
|
||||
STATIC KSPIN_LOCK NonPagedLookasideListLock;
|
||||
STATIC GENERAL_LOOKASIDE NonPagedPoolLookasideLists[POOL_LOOKASIDE_LISTS];
|
||||
STATIC LIST_ENTRY PagedLookasideListHead;
|
||||
STATIC KSPIN_LOCK PagedLookasideListLock;
|
||||
STATIC GENERAL_LOOKASIDE PagedPoolLookasideLists[POOL_LOOKASIDE_LISTS];
|
||||
STATIC LIST_ENTRY PoolLookasideListHead;
|
||||
STATIC LIST_ENTRY SystemLookasideListHead;
|
||||
|
||||
public:
|
||||
STATIC XTAPI PVOID AllocateFromLookasideList(IN PNONPAGED_LOOKASIDE_LIST LookasideList);
|
||||
STATIC XTAPI PVOID AllocateFromLookasideList(IN PPAGED_LOOKASIDE_LIST LookasideList);
|
||||
STATIC XTAPI PVOID AllocateFromPerProcessorList(IN NONPAGED_LOOKASIDE_NUMBER Number);
|
||||
STATIC XTAPI VOID FreeToLookasideList(IN PNONPAGED_LOOKASIDE_LIST LookasideList,
|
||||
IN PVOID Entry);
|
||||
STATIC XTAPI VOID FreeToLookasideList(IN PPAGED_LOOKASIDE_LIST LookasideList,
|
||||
IN PVOID Entry);
|
||||
STATIC XTAPI VOID FreeToPerProcessorList(IN NONPAGED_LOOKASIDE_NUMBER Number,
|
||||
IN PVOID Entry);
|
||||
STATIC XTAPI VOID InitializeLookasideList(IN OUT PGENERAL_LOOKASIDE LookasideList,
|
||||
IN MMPOOL_TYPE PoolType,
|
||||
IN ULONG Size,
|
||||
IN ULONG Tag,
|
||||
IN USHORT MaxDepth,
|
||||
IN PLIST_ENTRY ListHead);
|
||||
STATIC XTAPI VOID InitializePointers(VOID);
|
||||
STATIC XTAPI VOID InitializeSystemLookasideLists(VOID);
|
||||
STATIC XTAPI PLIST_ENTRY GetPoolLookasideListHead(VOID);
|
||||
STATIC XTAPI PLIST_ENTRY GetSystemLookasideListHead(VOID);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_EX_LASLIST_HH */
|
||||
33
xtoskrnl/includes/ex/resource.hh
Normal file
33
xtoskrnl/includes/ex/resource.hh
Normal file
@@ -0,0 +1,33 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/ex/resource.hh
|
||||
* DESCRIPTION: Exclusive resource synchronization support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_EX_RESOURCE_HH
|
||||
#define __XTOSKRNL_EX_RESOURCE_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Kernel Executive */
|
||||
namespace EX
|
||||
{
|
||||
class Resources
|
||||
{
|
||||
private:
|
||||
STATIC LARGE_INTEGER ResourcesTimeOut;
|
||||
STATIC LIST_ENTRY SystemResourcesList;
|
||||
STATIC KSPIN_LOCK SystemResourcesLock;
|
||||
|
||||
public:
|
||||
STATIC XTAPI XTSTATUS DeleteResource(IN PERESOURCE Resource);
|
||||
STATIC XTAPI XTSTATUS InitializeResource(IN PERESOURCE Resource);
|
||||
STATIC XTAPI VOID InitializeSystemResources(VOID);
|
||||
STATIC XTAPI XTSTATUS ReinitializeResource(IN PERESOURCE Resource);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_EX_RESOURCES_HH */
|
||||
@@ -12,17 +12,21 @@
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Architecture-specific Library */
|
||||
/* Kernel Executive */
|
||||
namespace EX
|
||||
{
|
||||
class Rundown
|
||||
{
|
||||
public:
|
||||
STATIC XTFASTCALL BOOLEAN AcquireProtection(IN PEX_RUNDOWN_REFERENCE Descriptor);
|
||||
STATIC XTFASTCALL BOOLEAN AcquireProtection(IN PEX_RUNDOWN_REFERENCE Descriptor,
|
||||
IN ULONG Count);
|
||||
STATIC XTFASTCALL VOID CompleteProtection(IN PEX_RUNDOWN_REFERENCE Descriptor);
|
||||
STATIC XTFASTCALL VOID InitializeProtection(IN PEX_RUNDOWN_REFERENCE Descriptor);
|
||||
STATIC XTFASTCALL VOID ReInitializeProtection(IN PEX_RUNDOWN_REFERENCE Descriptor);
|
||||
STATIC XTFASTCALL VOID ReleaseProtection(IN PEX_RUNDOWN_REFERENCE Descriptor);
|
||||
STATIC XTFASTCALL VOID ReleaseProtection(IN PEX_RUNDOWN_REFERENCE Descriptor,
|
||||
IN ULONG Count);
|
||||
STATIC XTFASTCALL VOID WaitForProtectionRelease(IN PEX_RUNDOWN_REFERENCE Descriptor);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -18,10 +18,11 @@ namespace HL
|
||||
class Cpu
|
||||
{
|
||||
private:
|
||||
STATIC KAFFINITY ActiveProcessors;
|
||||
STATIC PKAFFINITY_MAP ActiveProcessors;
|
||||
|
||||
public:
|
||||
STATIC XTAPI VOID InitializeProcessor(VOID);
|
||||
STATIC XTAPI XTSTATUS InitializeProcessorAffinity(VOID);
|
||||
STATIC XTAPI XTSTATUS StartAllProcessors(VOID);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -13,5 +13,6 @@
|
||||
|
||||
#include <kd/dbg.hh>
|
||||
#include <kd/dbgio.hh>
|
||||
#include <kd/debug.hh>
|
||||
|
||||
#endif /* __XTOSKRNL_KD_HH */
|
||||
|
||||
38
xtoskrnl/includes/kd/debug.hh
Normal file
38
xtoskrnl/includes/kd/debug.hh
Normal file
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/kd/debug.hh
|
||||
* DESCRIPTION: Kernel Debugger
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_KD_DEBUG_HH
|
||||
#define __XTOSKRNL_KD_DEBUG_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Kernel Debugger */
|
||||
namespace KD
|
||||
{
|
||||
class Debugger
|
||||
{
|
||||
public:
|
||||
STATIC PKD_PRINT_ROUTINE KdPrint;
|
||||
|
||||
private:
|
||||
STATIC BOOLEAN Active;
|
||||
|
||||
public:
|
||||
STATIC XTAPI BOOLEAN DebuggerActive(VOID);
|
||||
STATIC XTAPI VOID EnterDebugger(IN PKTRAP_FRAME TrapFrame);
|
||||
STATIC XTAPI KCONTINUE_STATUS SwitchProcessor(VOID);
|
||||
|
||||
private:
|
||||
STATIC XTAPI BOOLEAN ProcessCpuStateChange(IN PEXCEPTION_RECORD ExceptionRecord,
|
||||
IN OUT PCONTEXT Context,
|
||||
IN BOOLEAN SecondChanceException);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_KD_DEBUG_HH */
|
||||
@@ -11,23 +11,29 @@
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
#include <ke/affinity.hh>
|
||||
#include <ke/apc.hh>
|
||||
#include <ke/bootinfo.hh>
|
||||
#include <ke/crash.hh>
|
||||
#include <ke/dispatch.hh>
|
||||
#include <ke/dispobj.hh>
|
||||
#include <ke/dpc.hh>
|
||||
#include <ke/event.hh>
|
||||
#include <ke/guard.hh>
|
||||
#include <ke/ipi.hh>
|
||||
#include <ke/kprocess.hh>
|
||||
#include <ke/krnlinit.hh>
|
||||
#include <ke/kthread.hh>
|
||||
#include <ke/kubsan.hh>
|
||||
#include <ke/proc.hh>
|
||||
#include <ke/pushlock.hh>
|
||||
#include <ke/runlevel.hh>
|
||||
#include <ke/schedule.hh>
|
||||
#include <ke/semphore.hh>
|
||||
#include <ke/shdata.hh>
|
||||
#include <ke/spinlock.hh>
|
||||
#include <ke/sysres.hh>
|
||||
#include <ke/sysserv.hh>
|
||||
#include <ke/systime.hh>
|
||||
#include <ke/timer.hh>
|
||||
|
||||
|
||||
49
xtoskrnl/includes/ke/affinity.hh
Normal file
49
xtoskrnl/includes/ke/affinity.hh
Normal file
@@ -0,0 +1,49 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/ke/affinity.hh
|
||||
* DESCRIPTION: XT kernel processor affinity management support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_KE_AFFINITY_HH
|
||||
#define __XTOSKRNL_KE_AFFINITY_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Kernel Library */
|
||||
namespace KE
|
||||
{
|
||||
class Affinity
|
||||
{
|
||||
public:
|
||||
STATIC XTFASTCALL VOID AtomicSetProcessorAffinity(IN OUT PKAFFINITY_MAP AffinityMap,
|
||||
IN ULONG CpuNumber);
|
||||
STATIC XTFASTCALL VOID CalculateAffinityMapSize(IN ULONG CpuCount,
|
||||
OUT PULONG RequiredMapSize,
|
||||
OUT PULONG RequiredBlockCount);
|
||||
STATIC XTFASTCALL BOOLEAN CheckProcessorAffinity(IN PKAFFINITY_MAP AffinityMap,
|
||||
IN ULONG CpuNumber);
|
||||
STATIC XTFASTCALL VOID ClearAffinityMap(IN OUT PKAFFINITY_MAP AffinityMap);
|
||||
STATIC XTFASTCALL VOID ClearProcessorAffinity(IN OUT PKAFFINITY_MAP AffinityMap,
|
||||
IN ULONG CpuNumber);
|
||||
|
||||
STATIC XTAPI XTSTATUS CopyAffinity(OUT PKAFFINITY_MAP Destination,
|
||||
IN PKAFFINITY_MAP Source);
|
||||
STATIC XTAPI XTSTATUS CreateAffinityMap(IN ULONG CpuCount,
|
||||
OUT PKAFFINITY_MAP* AffinityMap);
|
||||
STATIC XTAPI VOID DestroyAffinityMap(IN PKAFFINITY_MAP AffinityMap);
|
||||
STATIC XTAPI ULONG FindNextLeftSetProcessor(IN ULONG ThreadSeed,
|
||||
IN PKAFFINITY_MAP AffinityMap);
|
||||
STATIC XTAPI ULONG FindNextRightSetProcessor(IN ULONG ThreadSeed,
|
||||
IN PKAFFINITY_MAP AffinityMap);
|
||||
STATIC XTAPI XTSTATUS InitializeAffinityMap(IN OUT PKAFFINITY_MAP AffinityMap,
|
||||
IN ULONG BufferSize);
|
||||
STATIC XTFASTCALL VOID SetAllProcessorsAffinity(IN OUT PKAFFINITY_MAP AffinityMap);
|
||||
STATIC XTFASTCALL VOID SetProcessorAffinity(IN OUT PKAFFINITY_MAP AffinityMap,
|
||||
IN ULONG CpuNumber);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_KE_AFFINITY_HH */
|
||||
@@ -18,6 +18,11 @@ namespace KE
|
||||
class Apc
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI VOID CheckApcDelivery(VOID);
|
||||
STATIC XTAPI VOID DeliverApc(IN KPROCESSOR_MODE ProcessorMode,
|
||||
IN PKEXCEPTION_FRAME ExceptionFrame,
|
||||
IN PKTRAP_FRAME TrapFrame);
|
||||
STATIC XTCDECL VOID HandleApcInterrupt(IN PKTRAP_FRAME TrapFrame);
|
||||
STATIC XTAPI VOID InitializeApc(IN PKAPC Apc,
|
||||
IN PKTHREAD Thread,
|
||||
IN KAPC_ENVIRONMENT Environment,
|
||||
|
||||
@@ -17,7 +17,16 @@ namespace KE
|
||||
{
|
||||
class Crash
|
||||
{
|
||||
private:
|
||||
STATIC PKPROCESSOR_CONTROL_BLOCK FreezeOwner;
|
||||
STATIC BOOLEAN KernelPanic;
|
||||
STATIC KRUNLEVEL RunLevel;
|
||||
|
||||
public:
|
||||
STATIC XTAPI VOID FreezeCurrentExecution(IN PKTRAP_FRAME TrapFrame,
|
||||
IN PKEXCEPTION_FRAME ExceptionFrame);
|
||||
STATIC XTAPI BOOLEAN FreezeExecution(IN PKTRAP_FRAME TrapFrame,
|
||||
IN PKEXCEPTION_FRAME ExceptionFrame);
|
||||
STATIC XTAPI VOID HaltSystem(VOID);
|
||||
STATIC XTAPI VOID Panic(IN ULONG Code);
|
||||
STATIC XTAPI VOID Panic(IN ULONG Code,
|
||||
@@ -25,6 +34,8 @@ namespace KE
|
||||
IN ULONG_PTR Parameter2,
|
||||
IN ULONG_PTR Parameter3,
|
||||
IN ULONG_PTR Parameter4);
|
||||
STATIC XTAPI BOOLEAN SystemCrashed(VOID);
|
||||
STATIC XTAPI VOID ThawExecution(IN BOOLEAN Interrupts);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -18,13 +18,25 @@ namespace KE
|
||||
class Dispatcher
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI VOID EnterIdleLoop(VOID);
|
||||
STATIC XTFASTCALL VOID ExitDispatcher(IN KRUNLEVEL OldRunLevel);
|
||||
STATIC XTCDECL VOID HandleDispatchInterrupt(IN PKTRAP_FRAME TrapFrame);
|
||||
STATIC XTFASTCALL BOOLEAN SwitchContext(IN PKTHREAD CurrentThread,
|
||||
IN KRUNLEVEL RunLevel);
|
||||
STATIC XTAPI XTSTATUS WaitForSingleObject(IN PVOID Object,
|
||||
IN KWAIT_REASON WaitReason,
|
||||
IN KPROCESSOR_MODE WaitMode,
|
||||
IN BOOLEAN Alertable,
|
||||
IN PLARGE_INTEGER Timeout);
|
||||
STATIC XTAPI VOID UpdateRunTime(IN PKTRAP_FRAME TrapFrame,
|
||||
IN KRUNLEVEL RunLevel);
|
||||
|
||||
private:
|
||||
STATIC XTFASTCALL PLARGE_INTEGER ComputeWaitInterval(IN PLARGE_INTEGER OriginalDueTime,
|
||||
IN PLARGE_INTEGER PreviousDueTime,
|
||||
IN OUT PLARGE_INTEGER NewDueTime);
|
||||
STATIC XTFASTCALL XTSTATUS SatisfyWaitingObject(IN PDISPATCHER_HEADER Object,
|
||||
IN PKTHREAD Thread);
|
||||
STATIC XTFASTCALL BOOLEAN SwitchThreadContext(IN PKTHREAD CurrentThread,
|
||||
IN BOOLEAN ApcBypass);
|
||||
STATIC XTFASTCALL BOOLEAN SwitchThreadStack(IN PKTHREAD CurrentThread,
|
||||
|
||||
29
xtoskrnl/includes/ke/dispobj.hh
Normal file
29
xtoskrnl/includes/ke/dispobj.hh
Normal file
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/ke/dispobj.hh
|
||||
* DESCRIPTION: Kernel Thread Dispatcher Objects
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_KE_DISPOBJ_HH
|
||||
#define __XTOSKRNL_KE_DISPOBJ_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Kernel Library */
|
||||
namespace KE
|
||||
{
|
||||
class DispatcherObject
|
||||
{
|
||||
public:
|
||||
STATIC XTFASTCALL VOID SatisfyWaitingMutexObject(IN PKMUTEX MutexObject,
|
||||
IN PKTHREAD Thread);
|
||||
STATIC XTFASTCALL VOID SatisfyWaitingNonMutexObject(IN PDISPATCHER_HEADER MutexObject);
|
||||
STATIC XTFASTCALL VOID SatisfyWaitingObject(IN PDISPATCHER_HEADER MutexObject,
|
||||
IN PKTHREAD Thread);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_KE_DISPOBJ_HH */
|
||||
@@ -25,6 +25,8 @@ namespace KE
|
||||
STATIC XTAPI LONG SetEvent(IN PKEVENT Event,
|
||||
IN KPRIORITY Increment,
|
||||
IN BOOLEAN Wait);
|
||||
STATIC XTAPI VOID SetEventBoostPriority(IN PKEVENT Event,
|
||||
IN OUT PKTHREAD* WaitingThread);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -12,45 +12,95 @@
|
||||
#include <xtos.hh>
|
||||
#include <ke/spinlock.hh>
|
||||
|
||||
|
||||
/* Kernel Library */
|
||||
namespace KE
|
||||
{
|
||||
class QueuedSpinLockGuard
|
||||
{
|
||||
private:
|
||||
KSPIN_LOCK_QUEUE_LEVEL QueuedLockLevel;
|
||||
KLOCK_QUEUE_HANDLE LockQueueHandle;
|
||||
PKSPIN_LOCK Lock;
|
||||
BOOLEAN Owned;
|
||||
|
||||
public:
|
||||
QueuedSpinLockGuard(IN OUT KSPIN_LOCK_QUEUE_LEVEL LockLevel)
|
||||
QueuedSpinLockGuard(IN OUT PKSPIN_LOCK SpinLock,
|
||||
IN BOOLEAN Acquire = TRUE)
|
||||
{
|
||||
QueuedLockLevel = LockLevel;
|
||||
KE::SpinLock::AcquireQueuedSpinLock(QueuedLockLevel);
|
||||
Lock = SpinLock;
|
||||
Owned = Acquire;
|
||||
if(Owned)
|
||||
{
|
||||
KE::SpinLock::AcquireQueuedSpinLock(Lock, &LockQueueHandle);
|
||||
}
|
||||
}
|
||||
|
||||
~QueuedSpinLockGuard()
|
||||
{
|
||||
KE::SpinLock::ReleaseQueuedSpinLock(QueuedLockLevel);
|
||||
if(Owned)
|
||||
{
|
||||
KE::SpinLock::ReleaseQueuedSpinLock(&LockQueueHandle);
|
||||
}
|
||||
}
|
||||
|
||||
QueuedSpinLockGuard(const QueuedSpinLockGuard&) = delete;
|
||||
QueuedSpinLockGuard& operator=(const QueuedSpinLockGuard&) = delete;
|
||||
};
|
||||
|
||||
class SystemQueuedSpinLockGuard
|
||||
{
|
||||
private:
|
||||
KSPIN_LOCK_QUEUE_LEVEL QueuedLockLevel;
|
||||
BOOLEAN Owned;
|
||||
|
||||
public:
|
||||
SystemQueuedSpinLockGuard(IN OUT KSPIN_LOCK_QUEUE_LEVEL LockLevel,
|
||||
IN BOOLEAN Acquire = TRUE)
|
||||
{
|
||||
QueuedLockLevel = LockLevel;
|
||||
Owned = Acquire;
|
||||
if(Owned)
|
||||
{
|
||||
KE::SpinLock::AcquireQueuedSpinLock(QueuedLockLevel);
|
||||
}
|
||||
}
|
||||
|
||||
~SystemQueuedSpinLockGuard()
|
||||
{
|
||||
if(Owned)
|
||||
{
|
||||
KE::SpinLock::ReleaseQueuedSpinLock(QueuedLockLevel);
|
||||
}
|
||||
}
|
||||
|
||||
SystemQueuedSpinLockGuard(const SystemQueuedSpinLockGuard&) = delete;
|
||||
SystemQueuedSpinLockGuard& operator=(const SystemQueuedSpinLockGuard&) = delete;
|
||||
};
|
||||
|
||||
class SpinLockGuard
|
||||
{
|
||||
private:
|
||||
PKSPIN_LOCK Lock;
|
||||
BOOLEAN Owned;
|
||||
|
||||
public:
|
||||
SpinLockGuard(IN OUT PKSPIN_LOCK SpinLock)
|
||||
SpinLockGuard(IN OUT PKSPIN_LOCK SpinLock,
|
||||
IN BOOLEAN Acquire = TRUE)
|
||||
{
|
||||
Lock = SpinLock;
|
||||
KE::SpinLock::AcquireSpinLock(Lock);
|
||||
Owned = Acquire;
|
||||
if(Owned)
|
||||
{
|
||||
KE::SpinLock::AcquireSpinLock(Lock);
|
||||
}
|
||||
}
|
||||
|
||||
~SpinLockGuard()
|
||||
{
|
||||
KE::SpinLock::ReleaseSpinLock(Lock);
|
||||
if(Owned)
|
||||
{
|
||||
KE::SpinLock::ReleaseSpinLock(Lock);
|
||||
}
|
||||
}
|
||||
|
||||
SpinLockGuard(const SpinLockGuard&) = delete;
|
||||
|
||||
31
xtoskrnl/includes/ke/ipi.hh
Normal file
31
xtoskrnl/includes/ke/ipi.hh
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/ke/ipi.hh
|
||||
* DESCRIPTION: Interprocessor interrupt support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_KE_IPI_HH
|
||||
#define __XTOSKRNL_KE_IPI_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Kernel Library */
|
||||
namespace KE
|
||||
{
|
||||
class Ipi
|
||||
{
|
||||
public:
|
||||
STATIC XTCDECL VOID HandleIpiInterrupt(IN PKTRAP_FRAME TrapFrame);
|
||||
STATIC XTAPI BOOLEAN HandleIpiService(IN PKTRAP_FRAME TrapFrame,
|
||||
IN PKEXCEPTION_FRAME ExceptionFrame);
|
||||
STATIC XTAPI VOID SendBroadcastIpi(IN ULONG Request,
|
||||
IN BOOLEAN Self);
|
||||
STATIC XTAPI VOID SendIpi(IN ULONG Request,
|
||||
IN PKAFFINITY_MAP TargetSet);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_KE_IPI_HH */
|
||||
@@ -21,10 +21,13 @@ namespace KE
|
||||
STATIC EPROCESS InitialProcess;
|
||||
|
||||
public:
|
||||
STATIC XTAPI PKPROCESS GetIdleProcess(VOID);
|
||||
STATIC XTAPI PEPROCESS GetInitialProcess(VOID);
|
||||
STATIC XTAPI XTSTATUS InitializeIdleProcess(IN OUT PKPROCESS IdleProcess,
|
||||
IN PULONG_PTR DirectoryTable);
|
||||
STATIC XTAPI VOID InitializeProcess(IN OUT PKPROCESS Process,
|
||||
IN KPRIORITY Priority,
|
||||
IN KAFFINITY Affinity,
|
||||
IN PKAFFINITY_MAP AffinityMap,
|
||||
IN PULONG_PTR DirectoryTable,
|
||||
IN BOOLEAN Alignment);
|
||||
};
|
||||
|
||||
@@ -24,6 +24,7 @@ namespace KE
|
||||
|
||||
private:
|
||||
STATIC XTAPI VOID BootstrapKernel(VOID);
|
||||
STATIC XTAPI VOID InitializeInterruptHandlers(VOID);
|
||||
STATIC XTAPI VOID InitializeKernel(VOID);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -21,7 +21,14 @@ namespace KE
|
||||
STATIC ETHREAD InitialThread;
|
||||
|
||||
public:
|
||||
STATIC XTAPI VOID AttachThread(IN PKTHREAD Thread);
|
||||
STATIC XTFASTCALL VOID EnterCriticalRegion();
|
||||
STATIC XTFASTCALL VOID EnterCriticalRegion(IN PKTHREAD Thread);
|
||||
STATIC XTAPI PETHREAD GetInitialThread(VOID);
|
||||
STATIC XTAPI XTSTATUS InitializeIdleThread(IN PKPROCESS IdleProcess,
|
||||
IN OUT PKTHREAD IdleThread,
|
||||
IN PKPROCESSOR_CONTROL_BLOCK Prcb,
|
||||
IN PVOID Stack);
|
||||
STATIC XTAPI XTSTATUS InitializeThread(IN PKPROCESS Process,
|
||||
IN OUT PKTHREAD Thread,
|
||||
IN PKSYSTEM_ROUTINE SystemRoutine,
|
||||
@@ -30,15 +37,18 @@ namespace KE
|
||||
IN PCONTEXT Context,
|
||||
IN PVOID EnvironmentBlock,
|
||||
IN PVOID Stack,
|
||||
IN BOOLEAN StartThread);
|
||||
STATIC XTAPI VOID StartThread(IN PKTHREAD Thread);
|
||||
IN BOOLEAN AttachToProcess);
|
||||
STATIC XTFASTCALL VOID LeaveCriticalRegion();
|
||||
STATIC XTFASTCALL VOID LeaveCriticalRegion(IN PKTHREAD Thread);
|
||||
|
||||
private:
|
||||
STATIC XTAPI VOID HandleSystemThreadExit(VOID);
|
||||
STATIC XTAPI VOID InitializeThreadContext(IN PKTHREAD Thread,
|
||||
IN PKSYSTEM_ROUTINE SystemRoutine,
|
||||
IN PKSTART_ROUTINE StartRoutine,
|
||||
IN PVOID StartContext,
|
||||
IN PCONTEXT ContextRecord);
|
||||
STATIC XTAPI VOID RunThread(VOID);
|
||||
STATIC XTAPI VOID SuspendNop(IN PKAPC Apc,
|
||||
IN OUT PKNORMAL_ROUTINE *NormalRoutine,
|
||||
IN OUT PVOID *NormalContext,
|
||||
@@ -48,6 +58,7 @@ namespace KE
|
||||
STATIC XTAPI VOID SuspendThread(IN PVOID NormalContext,
|
||||
IN PVOID SystemArgument1,
|
||||
IN PVOID SystemArgument2);
|
||||
STATIC XTAPI VOID SwitchToUserMode(VOID);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -26,12 +26,25 @@ namespace KE
|
||||
STATIC XTAPI PKPROCESSOR_CONTROL_BLOCK GetCurrentProcessorControlBlock(VOID);
|
||||
STATIC XTAPI ULONG GetCurrentProcessorNumber(VOID);
|
||||
STATIC XTAPI PKTHREAD GetCurrentThread(VOID);
|
||||
STATIC XTAPI ULONG GetInstalledCpus(VOID);
|
||||
STATIC XTAPI PKPROCESSOR_BLOCK GetProcessorBlock(IN ULONG CpuNumber);
|
||||
STATIC XTAPI XTSTATUS InitializeProcessorBlocks();
|
||||
STATIC XTAPI VOID RegisterHardwareId(IN ULONG HardwareId);
|
||||
STATIC XTAPI VOID RegisterProcessorBlock(ULONG CpuNumber,
|
||||
PKPROCESSOR_BLOCK ProcessorBlock);
|
||||
STATIC XTAPI VOID SaveProcessorState(OUT PKPROCESSOR_STATE CpuState);
|
||||
STATIC XTAPI VOID RestoreProcessorContext(IN OUT PKTRAP_FRAME TrapFrame,
|
||||
IN OUT PKEXCEPTION_FRAME ExceptionFrame,
|
||||
IN PCONTEXT ContextFrame,
|
||||
IN ULONG ContextFlags);
|
||||
STATIC XTAPI VOID RestoreProcessorControlState(IN PKPROCESSOR_STATE CpuState);
|
||||
STATIC XTAPI VOID RestoreProcessorState(OUT PKTRAP_FRAME TrapFrame,
|
||||
OUT PKEXCEPTION_FRAME ExceptionFrame);
|
||||
STATIC XTAPI VOID SaveProcessorContext(IN PKTRAP_FRAME TrapFrame,
|
||||
IN PKEXCEPTION_FRAME ExceptionFrame,
|
||||
IN OUT PCONTEXT ContextRecord);
|
||||
STATIC XTAPI VOID SaveProcessorControlState(OUT PKPROCESSOR_STATE CpuState);
|
||||
STATIC XTAPI VOID SaveProcessorState(IN PKTRAP_FRAME TrapFrame,
|
||||
IN PKEXCEPTION_FRAME ExceptionFrame);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
44
xtoskrnl/includes/ke/pushlock.hh
Normal file
44
xtoskrnl/includes/ke/pushlock.hh
Normal file
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/ke/pushlock.hh
|
||||
* DESCRIPTION: XT Kernel Push Lock support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_KE_PUSHLOCK_HH
|
||||
#define __XTOSKRNL_KE_PUSHLOCK_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Kernel Library */
|
||||
namespace KE
|
||||
{
|
||||
class PushLock
|
||||
{
|
||||
public:
|
||||
STATIC XTFASTCALL VOID AcquireExclusivePushLock(IN PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL VOID AcquireSharedPushLock(PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL VOID AcquireWaitExclusivePushLock(IN PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL VOID AcquireWaitSharedPushLock(IN OUT PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL BOOLEAN ConvertSharedPushLockToExclusive(IN PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL VOID InitializePushLock(IN PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL VOID ReleaseExclusivePushLock(IN PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL VOID ReleasePushLock(IN PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL VOID ReleaseSharedPushLock(IN PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL VOID ReleaseWaitExclusivePushLock(IN PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL VOID ReleaseWaitSharedPushLock(IN PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL VOID ReleaseWaitPushLock(IN PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL BOOLEAN TryAcquireExclusivePushLock(PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL VOID TryWakePushLock(IN PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL VOID WaitOnPushLock(IN PKPUSH_LOCK PushLock);
|
||||
STATIC XTFASTCALL VOID WakePushLockWaiters(IN PKPUSH_LOCK PushLock, IN KPUSH_LOCK OldState);
|
||||
|
||||
private:
|
||||
STATIC XTINLINE VOID OptimizePushLockList(IN PKPUSH_LOCK PushLock, IN KPUSH_LOCK OldValue);
|
||||
STATIC XTINLINE VOID SpinPushLock(IN PKPUSH_LOCK_WAIT_BLOCK WaitBlock);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_KE_PUSHLOCK_HH */
|
||||
@@ -27,17 +27,26 @@ namespace KE
|
||||
{
|
||||
private:
|
||||
KRUNLEVEL PreviousRunLevel;
|
||||
BOOLEAN Switched;
|
||||
|
||||
public:
|
||||
LowerRunLevel(KRUNLEVEL RunLevel)
|
||||
LowerRunLevel(IN KRUNLEVEL RunLevel,
|
||||
IN BOOLEAN ChangeLevel = TRUE)
|
||||
{
|
||||
PreviousRunLevel = KE::RunLevel::GetCurrentRunLevel();
|
||||
KE::RunLevel::LowerRunLevel(RunLevel);
|
||||
Switched = ChangeLevel;
|
||||
if(Switched)
|
||||
{
|
||||
KE::RunLevel::LowerRunLevel(RunLevel);
|
||||
}
|
||||
}
|
||||
|
||||
~LowerRunLevel()
|
||||
{
|
||||
KE::RunLevel::RaiseRunLevel(PreviousRunLevel);
|
||||
if(Switched)
|
||||
{
|
||||
KE::RunLevel::RaiseRunLevel(PreviousRunLevel);
|
||||
}
|
||||
}
|
||||
|
||||
LowerRunLevel(const LowerRunLevel&) = delete;
|
||||
@@ -48,17 +57,26 @@ namespace KE
|
||||
{
|
||||
private:
|
||||
KRUNLEVEL PreviousRunLevel;
|
||||
BOOLEAN Switched;
|
||||
|
||||
public:
|
||||
RaiseRunLevel(KRUNLEVEL RunLevel)
|
||||
RaiseRunLevel(IN KRUNLEVEL RunLevel,
|
||||
IN BOOLEAN ChangeLevel = TRUE)
|
||||
{
|
||||
PreviousRunLevel = KE::RunLevel::GetCurrentRunLevel();
|
||||
KE::RunLevel::RaiseRunLevel(RunLevel);
|
||||
Switched = ChangeLevel;
|
||||
if(Switched)
|
||||
{
|
||||
KE::RunLevel::RaiseRunLevel(RunLevel);
|
||||
}
|
||||
}
|
||||
|
||||
~RaiseRunLevel()
|
||||
{
|
||||
KE::RunLevel::LowerRunLevel(PreviousRunLevel);
|
||||
if(Switched)
|
||||
{
|
||||
KE::RunLevel::LowerRunLevel(PreviousRunLevel);
|
||||
}
|
||||
}
|
||||
|
||||
RaiseRunLevel(const RaiseRunLevel&) = delete;
|
||||
|
||||
30
xtoskrnl/includes/ke/schedule.hh
Normal file
30
xtoskrnl/includes/ke/schedule.hh
Normal file
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/ke/schedule.hh
|
||||
* DESCRIPTION: XT Kernel Thread Scheduler
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_KE_SCHEDULE_HH
|
||||
#define __XTOSKRNL_KE_SCHEDULE_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Kernel Library */
|
||||
namespace KE
|
||||
{
|
||||
class Scheduler
|
||||
{
|
||||
public:
|
||||
STATIC XTFASTCALL VOID InsertDeferredReadyList(IN PKTHREAD Thread);
|
||||
STATIC XTAPI VOID ProcessQuantumEnd(VOID);
|
||||
STATIC XTAPI VOID ProcessReadyThread(IN PKTHREAD Thread);
|
||||
STATIC XTFASTCALL VOID QueueReadyThread(IN PKTHREAD Thread,
|
||||
IN PKPROCESSOR_CONTROL_BLOCK Prcb);
|
||||
STATIC XTAPI VOID ReadyThread(IN PKTHREAD Thread);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_KE_SCHEDULE_HH */
|
||||
@@ -36,13 +36,20 @@ namespace KE
|
||||
|
||||
public:
|
||||
STATIC XTFASTCALL VOID AcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_LEVEL LockLevel);
|
||||
STATIC XTFASTCALL VOID AcquireQueuedSpinLock(IN PKSPIN_LOCK SpinLock,
|
||||
IN PKLOCK_QUEUE_HANDLE LockQueueHandle);
|
||||
STATIC XTFASTCALL VOID AcquireSpinLock(IN OUT PKSPIN_LOCK SpinLock);
|
||||
STATIC XTAPI VOID InitializeAllLocks();
|
||||
STATIC XTAPI VOID InitializeLockQueues();
|
||||
STATIC XTAPI VOID InitializeSpinLock(IN PKSPIN_LOCK SpinLock);
|
||||
STATIC XTFASTCALL VOID ReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_LEVEL LockLevel);
|
||||
STATIC XTFASTCALL VOID ReleaseQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockQueueHandle);
|
||||
STATIC XTFASTCALL VOID ReleaseSpinLock(IN OUT PKSPIN_LOCK SpinLock);
|
||||
STATIC XTFASTCALL BOOLEAN TestSpinLock(IN PKSPIN_LOCK SpinLock);
|
||||
|
||||
private:
|
||||
STATIC XTFASTCALL VOID AcquireQueuedSpinLock(IN PKSPIN_LOCK_QUEUE LockQueue);
|
||||
STATIC XTFASTCALL VOID ReleaseQueuedSpinLock(IN PKSPIN_LOCK_QUEUE LockQueue);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
25
xtoskrnl/includes/ke/sysserv.hh
Normal file
25
xtoskrnl/includes/ke/sysserv.hh
Normal file
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/ke/sysserv.hh
|
||||
* DESCRIPTION: System Services Descriptor Table
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_KE_SYSSERV_HH
|
||||
#define __XTOSKRNL_KE_SYSSERV_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Kernel Library */
|
||||
namespace KE
|
||||
{
|
||||
class SystemServices
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI PKSERVICE_DESCRIPTOR_TABLE GetSystemServicesDescriptorTable(VOID);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_KE_SYSSERV_HH */
|
||||
@@ -25,6 +25,7 @@ namespace KE
|
||||
STATIC ULONG TimeAdjustment;
|
||||
|
||||
public:
|
||||
STATIC XTAPI VOID GetInterruptTime(OUT PLARGE_INTEGER InterruptTime);
|
||||
STATIC XTAPI VOID GetSystemTime(OUT PLARGE_INTEGER SystemTime);
|
||||
STATIC XTAPI VOID SetSystemTime(IN PLARGE_INTEGER NewTime,
|
||||
OUT PLARGE_INTEGER OldTime,
|
||||
|
||||
@@ -17,6 +17,9 @@ namespace KE
|
||||
{
|
||||
class Timer
|
||||
{
|
||||
private:
|
||||
STATIC LIST_ENTRY TimerTableListHead[KTIMER_TABLE_SIZE];
|
||||
|
||||
public:
|
||||
STATIC XTAPI BOOLEAN CancelTimer(IN PKTIMER Timer);
|
||||
STATIC XTAPI VOID ClearTimer(IN PKTIMER Timer);
|
||||
@@ -28,6 +31,9 @@ namespace KE
|
||||
IN LARGE_INTEGER DueTime,
|
||||
IN LONG Period,
|
||||
IN PKDPC Dpc);
|
||||
STATIC XTAPI VOID VerifySystemTimerExpiration(IN PKPROCESSOR_CONTROL_BLOCK Prcb,
|
||||
IN PKTRAP_FRAME TrapFrame,
|
||||
IN LARGE_INTEGER Time);
|
||||
|
||||
private:
|
||||
STATIC XTAPI VOID RemoveTimer(IN OUT PKTIMER Timer);
|
||||
|
||||
@@ -24,5 +24,8 @@
|
||||
#include <mm/pfault.hh>
|
||||
#include <mm/pfn.hh>
|
||||
#include <mm/pool.hh>
|
||||
#include <mm/probe.hh>
|
||||
#include <mm/quota.hh>
|
||||
#include <mm/tags.hh>
|
||||
|
||||
#endif /* __XTOSKRNL_MM_HH */
|
||||
|
||||
@@ -52,6 +52,7 @@ namespace MM
|
||||
XTAPI PMMPXE GetPxeAddress(IN PVOID Address);
|
||||
XTAPI ULONG GetPxeOffset(IN PVOID Address);
|
||||
VIRTUAL XTAPI PVOID GetPxeVirtualAddress(IN PMMPXE PxePointer) = 0;
|
||||
VIRTUAL ULONG_PTR GetUserProbeAddress(VOID) = 0;
|
||||
XTAPI BOOLEAN GetXpaStatus();
|
||||
VIRTUAL XTAPI VOID InitializePageMapInfo(VOID) = 0;
|
||||
XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer);
|
||||
@@ -80,6 +81,7 @@ namespace MM
|
||||
XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer);
|
||||
XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer);
|
||||
XTAPI PVOID GetPxeVirtualAddress(IN PMMPXE PxePointer);
|
||||
XTAPI ULONG_PTR GetUserProbeAddress(VOID);
|
||||
XTAPI VOID InitializePageMapInfo(VOID);
|
||||
};
|
||||
|
||||
@@ -90,6 +92,7 @@ namespace MM
|
||||
XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer);
|
||||
XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer);
|
||||
XTAPI PVOID GetPxeVirtualAddress(IN PMMPXE PxePointer);
|
||||
XTAPI ULONG_PTR GetUserProbeAddress(VOID);
|
||||
XTAPI VOID InitializePageMapInfo(VOID);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ namespace MM
|
||||
STATIC XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer);
|
||||
STATIC XTAPI PMMPXE GetPxeAddress(IN PVOID Address);
|
||||
STATIC XTAPI PVOID GetPxeVirtualAddress(IN PMMPXE PxePointer);
|
||||
STATIC XTAPI ULONG_PTR GetUserProbeAddress(VOID);
|
||||
STATIC XTAPI BOOLEAN GetXpaStatus(VOID);
|
||||
STATIC XTAPI VOID InitializePageMapSupport(VOID);
|
||||
STATIC XTAPI XTSTATUS MapVirtualAddress(IN PVOID VirtualAddress,
|
||||
|
||||
@@ -20,6 +20,8 @@ namespace MM
|
||||
private:
|
||||
STATIC LOADER_MEMORY_DESCRIPTOR HardwareAllocationDescriptors[MM_HARDWARE_ALLOCATION_DESCRIPTORS];
|
||||
STATIC PVOID HardwareHeapStart;
|
||||
STATIC PHYSICAL_ADDRESS LowMemoryPhysicalAddress;
|
||||
STATIC PVOID LowMemoryVirtualAddress;
|
||||
STATIC ULONG UsedHardwareAllocationDescriptors;
|
||||
|
||||
public:
|
||||
@@ -27,12 +29,19 @@ namespace MM
|
||||
IN BOOLEAN Aligned,
|
||||
IN ULONGLONG MaximumAddress,
|
||||
OUT PPHYSICAL_ADDRESS Buffer);
|
||||
STATIC XTAPI XTSTATUS AllocateRealModeMemory(IN PFN_NUMBER PageCount,
|
||||
OUT PVOID *MemoryAddress);
|
||||
STATIC XTAPI XTSTATUS AllocateLowMemory(OUT PPHYSICAL_ADDRESS PhysicalAddress,
|
||||
OUT PVOID *VirtualAddress);
|
||||
STATIC XTAPI ULONG CalculateRealModeAllocationPages(IN ULONG TrampolineCodeSize);
|
||||
STATIC XTAPI XTSTATUS FreeHardwareMemory(IN PHYSICAL_ADDRESS PhysicalAddress,
|
||||
IN PFN_NUMBER PageCount);
|
||||
STATIC XTAPI XTSTATUS FreeRealModeMemory(IN PVOID VirtualAddress,
|
||||
IN PFN_NUMBER PageCount);
|
||||
STATIC XTAPI XTSTATUS MapHardwareMemory(IN PHYSICAL_ADDRESS PhysicalAddress,
|
||||
IN PFN_NUMBER PageCount,
|
||||
IN BOOLEAN FlushTlb,
|
||||
OUT PVOID *VirtualAddress);
|
||||
STATIC XTAPI XTSTATUS MapRealModeMemory(IN PHYSICAL_ADDRESS PhysicalAddress,
|
||||
IN ULONG Size);
|
||||
STATIC XTAPI VOID MarkHardwareMemoryWriteThrough(IN PVOID VirtualAddress,
|
||||
IN PFN_NUMBER PageCount);
|
||||
STATIC XTAPI VOID RemapHardwareMemory(IN PVOID VirtualAddress,
|
||||
@@ -41,6 +50,8 @@ namespace MM
|
||||
STATIC XTAPI XTSTATUS UnmapHardwareMemory(IN PVOID VirtualAddress,
|
||||
IN PFN_NUMBER PageCount,
|
||||
IN BOOLEAN FlushTlb);
|
||||
STATIC XTAPI VOID UnmapRealModeMemory(IN PHYSICAL_ADDRESS PhysicalAddress,
|
||||
IN ULONG Size);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ namespace MM
|
||||
VIRTUAL XTAPI ULONG GetPteSoftwarePrototype(IN PMMPTE PtePointer) = 0;
|
||||
VIRTUAL XTAPI ULONG GetPteSoftwareTransition(IN PMMPTE PtePointer) = 0;
|
||||
VIRTUAL XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer) = 0;
|
||||
XTAPI ULONG_PTR GetUserProbeAddress(VOID);
|
||||
XTAPI BOOLEAN GetXpaStatus();
|
||||
VIRTUAL XTAPI VOID InitializePageMapInfo(VOID) = 0;
|
||||
VIRTUAL XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer) = 0;
|
||||
|
||||
@@ -45,6 +45,7 @@ namespace MM
|
||||
STATIC XTAPI ULONG GetPteSoftwarePrototype(IN PMMPTE PtePointer);
|
||||
STATIC XTAPI ULONG GetPteSoftwareTransition(IN PMMPTE PtePointer);
|
||||
STATIC XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer);
|
||||
STATIC XTAPI ULONG_PTR GetUserProbeAddress(VOID);
|
||||
STATIC XTAPI BOOLEAN GetXpaStatus(VOID);
|
||||
STATIC XTAPI VOID InitializePageMapSupport(VOID);
|
||||
STATIC XTAPI XTSTATUS MapVirtualAddress(IN PVOID VirtualAddress,
|
||||
|
||||
44
xtoskrnl/includes/mm/probe.hh
Normal file
44
xtoskrnl/includes/mm/probe.hh
Normal file
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/mm/probe.hh
|
||||
* DESCRIPTION: Memory Manager read/write probe support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_MM_PROBE_HH
|
||||
#define __XTOSKRNL_MM_PROBE_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Memory Manager */
|
||||
namespace MM
|
||||
{
|
||||
class Probe
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI VOID ProbeForRead(IN CONST PVOID Address,
|
||||
IN SIZE_T Size,
|
||||
IN ULONG Alignment);
|
||||
STATIC XTAPI VOID ProbeForReadArray(IN CONST PVOID Array,
|
||||
IN ULONG ItemSize,
|
||||
IN ULONG ItemCount,
|
||||
IN ULONG Alignment);
|
||||
STATIC XTAPI VOID ProbeForReadStructure(IN CONST PVOID Address,
|
||||
IN SIZE_T Size,
|
||||
IN ULONG Alignment);
|
||||
STATIC XTAPI VOID ProbeForWrite(IN PVOID Address,
|
||||
IN SIZE_T Size,
|
||||
IN ULONG Alignment);
|
||||
STATIC XTAPI VOID ProbeForWriteArray(IN OUT PVOID Array,
|
||||
IN ULONG ItemSize,
|
||||
IN ULONG ItemCount,
|
||||
IN ULONG Alignment);
|
||||
STATIC XTAPI VOID ProbeForWriteStructure(IN PVOID Address,
|
||||
IN SIZE_T Size,
|
||||
IN ULONG Alignment);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_MM_PROBE_HH */
|
||||
33
xtoskrnl/includes/mm/quota.hh
Normal file
33
xtoskrnl/includes/mm/quota.hh
Normal file
@@ -0,0 +1,33 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/mm/quota.hh
|
||||
* DESCRIPTION: Memory Manager Quota support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_MM_QUOTA_HH
|
||||
#define __XTOSKRNL_MM_QUOTA_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Memory Manager */
|
||||
namespace MM
|
||||
{
|
||||
class Quota
|
||||
{
|
||||
private:
|
||||
STATIC SIZE_T PagedPoolQuota;
|
||||
STATIC SIZE_T NonPagedPoolQuota;
|
||||
|
||||
public:
|
||||
STATIC XTAPI BOOLEAN RaisePoolQuota(IN MMPOOL_TYPE PoolType,
|
||||
IN SIZE_T CurrentQuotaLimit,
|
||||
OUT PSIZE_T NewQuotaLimit);
|
||||
STATIC XTAPI VOID ReturnPoolQuota(IN MMPOOL_TYPE PoolType,
|
||||
IN SIZE_T ReturnedQuota);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_MM_QUOTA_HH */
|
||||
24
xtoskrnl/includes/mm/tags.hh
Normal file
24
xtoskrnl/includes/mm/tags.hh
Normal file
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/mm/tags.hh
|
||||
* DESCRIPTION: Memory Manager allocation tags
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_MM_TAGS_HH
|
||||
#define __XTOSKRNL_MM_TAGS_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Allocation tags */
|
||||
#define TAG_HL_FRAMEBUFFER SIGNATURE32('F', 'B', 'U', 'F')
|
||||
#define TAG_MM_BIG_ALLOC SIGNATURE32('B', 'I', 'G', 'A')
|
||||
#define TAG_MM_MEMORY_MGR SIGNATURE32('M', 'M', 'G', 'R')
|
||||
#define TAG_MM_OVERFLOW SIGNATURE32('O', 'V', 'F', 'L')
|
||||
#define TAG_MM_MEMORY_POOL SIGNATURE32('P', 'O', 'O', 'L')
|
||||
#define TAG_MM_NONE SIGNATURE32('N', 'O', 'N', 'E')
|
||||
#define TAG_SE_DESCRIPTOR SIGNATURE32('S', 'E', 'S', 'D')
|
||||
|
||||
#endif /* __XTOSKRNL_MM_TAGS_HH */
|
||||
@@ -12,7 +12,7 @@
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
/* Power Management */
|
||||
namespace PO
|
||||
{
|
||||
class Idle
|
||||
|
||||
18
xtoskrnl/includes/ps.hh
Normal file
18
xtoskrnl/includes/ps.hh
Normal file
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/ps.hh
|
||||
* DESCRIPTION: Process and thread management
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_PS_HH
|
||||
#define __XTOSKRNL_PS_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
#include <ps/process.hh>
|
||||
#include <ps/thread.hh>
|
||||
|
||||
|
||||
#endif /* __XTOSKRNL_PS_HH */
|
||||
26
xtoskrnl/includes/ps/process.hh
Normal file
26
xtoskrnl/includes/ps/process.hh
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/ps/process.hh
|
||||
* DESCRIPTION: Process Management
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_PS_PROCESS_HH
|
||||
#define __XTOSKRNL_PS_PROCESS_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Process and thread management */
|
||||
namespace PS
|
||||
{
|
||||
class Process
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI XTSTATUS CreateIdleProcess(IN PKPROCESSOR_CONTROL_BLOCK Prcb);
|
||||
STATIC XTFASTCALL PEPROCESS GetCurrentProcess(VOID);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_PS_PROCESS_HH */
|
||||
26
xtoskrnl/includes/ps/thread.hh
Normal file
26
xtoskrnl/includes/ps/thread.hh
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/ps/thread.hh
|
||||
* DESCRIPTION: Thread Management
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_PS_THREAD_HH
|
||||
#define __XTOSKRNL_PS_THREAD_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Process and thread management */
|
||||
namespace PS
|
||||
{
|
||||
class Thread
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI XTSTATUS CreateIdleThread(IN PKPROCESSOR_CONTROL_BLOCK Prcb,
|
||||
IN PVOID Stack);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_PS_THREAD_HH */
|
||||
@@ -17,15 +17,19 @@
|
||||
#include <rtl/bitmap.hh>
|
||||
#include <rtl/dispatch.hh>
|
||||
#include <rtl/endian.hh>
|
||||
#include <rtl/exsup.hh>
|
||||
#include <rtl/guid.hh>
|
||||
#include <rtl/lifo.hh>
|
||||
#include <rtl/llist.hh>
|
||||
#include <rtl/math.hh>
|
||||
#include <rtl/memory.hh>
|
||||
#include <rtl/nls.hh>
|
||||
#include <rtl/rbtree.hh>
|
||||
#include <rtl/sha1.hh>
|
||||
#include <rtl/slist.hh>
|
||||
#include <rtl/string.hh>
|
||||
#include <rtl/time.hh>
|
||||
#include <rtl/unicode.hh>
|
||||
#include <rtl/widestr.hh>
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_HH */
|
||||
|
||||
@@ -18,6 +18,16 @@ namespace RTL
|
||||
class Atomic
|
||||
{
|
||||
public:
|
||||
STATIC XTFASTCALL CHAR Add8(IN PCHAR Address,
|
||||
IN CHAR Value);
|
||||
STATIC XTFASTCALL SHORT Add16(IN PSHORT Address,
|
||||
IN SHORT Value);
|
||||
STATIC XTFASTCALL LONG Add32(IN PLONG Address,
|
||||
IN LONG Value);
|
||||
STATIC XTFASTCALL LONG_PTR Add64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Value);
|
||||
STATIC XTFASTCALL PVOID AddPointer(IN PVOID *Address,
|
||||
IN PVOID Value);
|
||||
STATIC XTFASTCALL CHAR And8(IN PCHAR Address,
|
||||
IN CHAR Mask);
|
||||
STATIC XTFASTCALL SHORT And16(IN PSHORT Address,
|
||||
@@ -26,6 +36,10 @@ namespace RTL
|
||||
IN LONG Mask);
|
||||
STATIC XTFASTCALL LONG_PTR And64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Mask);
|
||||
STATIC XTFASTCALL UCHAR BitTestAndReset(IN PLONG Base,
|
||||
IN LONG Offset);
|
||||
STATIC XTFASTCALL UCHAR BitTestAndReset64(IN PLONGLONG Base,
|
||||
IN LONGLONG Offset);
|
||||
STATIC XTFASTCALL UCHAR BitTestAndSet(IN PLONG Base,
|
||||
IN LONG Offset);
|
||||
STATIC XTFASTCALL UCHAR BitTestAndSet64(IN PLONGLONG Base,
|
||||
@@ -67,7 +81,7 @@ namespace RTL
|
||||
IN LONG_PTR Value);
|
||||
STATIC XTFASTCALL PVOID ExchangePointer(IN PVOID *Address,
|
||||
IN PVOID Exchange);
|
||||
STATIC XTFASTCALL PSINGLE_LIST_ENTRY FlushSingleList(IN PSINGLE_LIST_HEADER Header);
|
||||
STATIC XTFASTCALL PSINGLE_LIST_ENTRY FlushSingleList(IN PSINGLE_LIST_HEADER ListHead);
|
||||
STATIC XTFASTCALL CHAR Increment8(IN PCHAR Address);
|
||||
STATIC XTFASTCALL SHORT Increment16(IN PSHORT Address);
|
||||
STATIC XTFASTCALL LONG Increment32(IN PLONG Address);
|
||||
@@ -80,8 +94,8 @@ namespace RTL
|
||||
IN LONG Mask);
|
||||
STATIC XTFASTCALL LONG_PTR Or64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Mask);
|
||||
STATIC XTFASTCALL XTFASTCALL PSINGLE_LIST_ENTRY PopEntrySingleList(IN PSINGLE_LIST_HEADER Header);
|
||||
STATIC XTFASTCALL PSINGLE_LIST_ENTRY PushEntrySingleList(IN PSINGLE_LIST_HEADER Header,
|
||||
STATIC XTFASTCALL XTFASTCALL PSINGLE_LIST_ENTRY PopEntrySingleList(IN PSINGLE_LIST_HEADER ListHead);
|
||||
STATIC XTFASTCALL PSINGLE_LIST_ENTRY PushEntrySingleList(IN PSINGLE_LIST_HEADER ListHead,
|
||||
IN PSINGLE_LIST_ENTRY Entry);
|
||||
STATIC XTFASTCALL CHAR Xor8(IN PCHAR Address,
|
||||
IN CHAR Mask);
|
||||
|
||||
27
xtoskrnl/includes/rtl/exsup.hh
Normal file
27
xtoskrnl/includes/rtl/exsup.hh
Normal file
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl/exsup.hh
|
||||
* DESCRIPTION: Exception handling
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_EXSUP_HH
|
||||
#define __XTOSKRNL_RTL_EXSUP_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
namespace RTL
|
||||
{
|
||||
class Exception
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI VOID RaiseException(IN PEXCEPTION_RECORD ExceptionRecord);
|
||||
STATIC XTAPI VOID RaiseStatus(IN XTSTATUS Status);
|
||||
STATIC XTAPI LONG SystemFilter(VOID);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_EXSUP_HH */
|
||||
31
xtoskrnl/includes/rtl/lifo.hh
Normal file
31
xtoskrnl/includes/rtl/lifo.hh
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl/lifo.hh
|
||||
* DESCRIPTION: Last In First Out (LIFO) queue implementation
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_LIFO_HH
|
||||
#define __XTOSKRNL_RTL_LIFO_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
namespace RTL
|
||||
{
|
||||
class LifoQueue
|
||||
{
|
||||
public:
|
||||
STATIC XTFASTCALL BOOLEAN EmptyList(IN PSINGLE_LIST_ENTRY ListHead);
|
||||
STATIC XTFASTCALL PSINGLE_LIST_ENTRY PeekEntryList(IN PSINGLE_LIST_ENTRY ListHead);
|
||||
STATIC XTFASTCALL PSINGLE_LIST_ENTRY PopEntryList(IN OUT PSINGLE_LIST_ENTRY ListHead);
|
||||
STATIC XTFASTCALL VOID PushEntryList(IN OUT PSINGLE_LIST_ENTRY ListHead,
|
||||
IN PSINGLE_LIST_ENTRY Entry);
|
||||
STATIC XTFASTCALL BOOLEAN SearchEntryList(IN PSINGLE_LIST_ENTRY ListHead,
|
||||
IN PSINGLE_LIST_ENTRY Entry);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_LIFO_HH */
|
||||
34
xtoskrnl/includes/rtl/nls.hh
Normal file
34
xtoskrnl/includes/rtl/nls.hh
Normal file
@@ -0,0 +1,34 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl/nls.hh
|
||||
* DESCRIPTION: National Language Support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_NLS_HH
|
||||
#define __XTOSKRNL_RTL_NLS_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
namespace RTL
|
||||
{
|
||||
class Nls
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI VOID GetDefaultCodePage(OUT PUSHORT AnsiCodePage,
|
||||
OUT PUSHORT OemCodePage);
|
||||
STATIC XTAPI VOID InitializeCodePageTable(IN PUSHORT TableBase,
|
||||
OUT PCPTABLE_INFO CodePageTable);
|
||||
STATIC XTAPI VOID InitializeNlsTables(IN PUSHORT AnsiTableBase,
|
||||
IN PUSHORT OemTableBase,
|
||||
IN PUSHORT CaseTableBase,
|
||||
OUT PNLSTABLE_INFO NlsTable);
|
||||
STATIC XTAPI WCHAR ToLowerUnicodeCharacter(IN WCHAR WideCHaracter);
|
||||
STATIC XTAPI WCHAR ToUpperUnicodeCharacter(IN WCHAR WideCharacter);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_NLS_HH */
|
||||
29
xtoskrnl/includes/rtl/unicode.hh
Normal file
29
xtoskrnl/includes/rtl/unicode.hh
Normal file
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl/unicode.hh
|
||||
* DESCRIPTION: Unicode support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_UNICODE_HH
|
||||
#define __XTOSKRNL_RTL_UNICODE_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
namespace RTL
|
||||
{
|
||||
class Unicode
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI VOID CopyString(IN OUT PUNICODE_STRING Destination,
|
||||
IN PCUNICODE_STRING Source);
|
||||
STATIC XTAPI XTSTATUS InitializeString(OUT PUNICODE_STRING Destination,
|
||||
IN PCWSTR Source,
|
||||
IN BOOLEAN Truncate = FALSE);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_UNICODE_HH */
|
||||
18
xtoskrnl/includes/se.hh
Normal file
18
xtoskrnl/includes/se.hh
Normal file
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/se.hh
|
||||
* DESCRIPTION: Kernel Security
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_SE_HH
|
||||
#define __XTOSKRNL_SE_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
#include <se/descript.hh>
|
||||
#include <se/privileg.hh>
|
||||
|
||||
|
||||
#endif /* __XTOSKRNL_SE_HH */
|
||||
35
xtoskrnl/includes/se/descript.hh
Normal file
35
xtoskrnl/includes/se/descript.hh
Normal file
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/se/descript.hh
|
||||
* DESCRIPTION: Security Descriptors
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_SE_DESCRIPT_HH
|
||||
#define __XTOSKRNL_SE_DESCRIPT_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Kernel Security */
|
||||
namespace SE
|
||||
{
|
||||
class Descriptor
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI XTSTATUS CaptureSecurityDescriptor(IN PSECURITY_DESCRIPTOR InputDescriptor,
|
||||
IN KPROCESSOR_MODE ProcessorMode,
|
||||
IN MMPOOL_TYPE PoolType,
|
||||
IN BOOLEAN ForceCapture,
|
||||
OUT PSECURITY_DESCRIPTOR *OutputDescriptor);
|
||||
STATIC XTFASTCALL ULONG ComputeSecurityQuota(IN ULONG Size);
|
||||
STATIC XTAPI XTSTATUS ComputeQuotaInformationSize(IN PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||
OUT PULONG QuotaSize);
|
||||
STATIC XTAPI VOID ReleaseSecurityDescriptor(IN PSECURITY_DESCRIPTOR Descriptor,
|
||||
IN KPROCESSOR_MODE ProcessorMode,
|
||||
IN BOOLEAN ForceRelease);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_SE_DESCRIPT_HH */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user