Коммит 126768af создал по автору David Welch's avatar David Welch
Просмотр файлов

Lots of changes to the kernel

svn path=/trunk/; revision=527
владелец 0deeaa0d
VOID CbInitDccb(PDCCB Dccb, PDEVICE_OBJECT DeviceObject, ULONG SectorSize,
ULONG NrSectors, ULONG PercentageToCache);
PCCB CbAcquireForRead(PDCCB Dccb, ULONG BlockNr);
VOID CbReleaseFromRead(PDCCB Dccb, PCCB Ccb);
#ifndef __INCLUDE_DDK_CCTYPES_H #ifndef __INCLUDE_DDK_CCTYPES_H
#define __INCLUDE_DDK_CCTYPES_H #define __INCLUDE_DDK_CCTYPES_H
typedef struct _CCB
{
ULONG BlockNr;
PVOID Buffer;
ULONG State;
ULONG ActiveReaders;
BOOLEAN WriteInProgress;
BOOLEAN ActiveWriter;
ULONG References;
KEVENT FinishedNotify;
KSPIN_LOCK Lock;
BOOLEAN Modified;
LIST_ENTRY Entry;
} CCB, *PCCB;
enum
{
CCB_INVALID,
CCB_NOT_CACHED,
CCB_CACHED,
CCB_DELETE_PENDING,
};
typedef struct _DCCB
/*
* PURPOSE: Device cache control block
*/
{
PCCB* HashTbl;
ULONG HashTblSize;
KSPIN_LOCK HashTblLock;
PDEVICE_OBJECT DeviceObject;
ULONG SectorSize;
LIST_ENTRY CcbListHead;
KSPIN_LOCK CcbListLock;
ULONG NrCcbs;
ULONG NrModifiedCcbs;
} DCCB, *PDCCB;
#endif /* __INCLUDE_DDK_CCTYPES_H */ #endif /* __INCLUDE_DDK_CCTYPES_H */
...@@ -231,20 +231,8 @@ enum ...@@ -231,20 +231,8 @@ enum
/* /*
* IRQ levels * IRQ levels
*/ */
enum #define PASSIVE_LEVEL (1)
{ #define APC_LEVEL (2)
PASSIVE_LEVEL, #define DISPATCH_LEVEL (3)
#define FIRST_DEVICE_SPECIFIC_LEVEL (4)
/* #define HIGH_LEVEL (FIRST_DEVICE_SPECIFIC_LEVEL + NR_DEVICE_SPECIFIC_LEVELS)
* Which order for these (only DISPATCH_LEVEL is important for now)
*/
APC_LEVEL,
DISPATCH_LEVEL,
/*
* Above here are device specific IRQ levels
*/
FIRST_DEVICE_SPECIFIC_LEVEL,
HIGH_LEVEL = FIRST_DEVICE_SPECIFIC_LEVEL + NR_DEVICE_SPECIFIC_LEVELS,
};
...@@ -67,42 +67,27 @@ enum ...@@ -67,42 +67,27 @@ enum
IRP_DEFER_IO_COMPLETION = 0x2000, IRP_DEFER_IO_COMPLETION = 0x2000,
}; };
/*
* I/O operation flags
*/
enum
{
SL_FORCE_ACCESS_CHECK = 0x1,
SL_OPEN_PAGING_FILE = 0x2,
SL_OPEN_TARGET_DIRECTORY = 0x4,
SL_CASE_SENSITIVE = 0x8,
SL_KEY_SPECIFIED = 0x10,
SL_OVERRIDE_VERIFY_VOLUME = 0x20,
SL_WRITE_THROUGH = 0x40,
SL_FT_SEQUENTIAL_WRITE = 0x80,
SL_FAIL_IMMEDIATELY = 0x100,
SL_EXCLUSIVE_LOCK = 0x200,
SL_WATCH_TREE = 0x2000,
SL_ALLOW_RAW_MOUNT = 0x4000,
};
#define SL_FORCE_ACCESS_CHECK (0x1) #define SL_FORCE_ACCESS_CHECK (0x1)
#define SL_OPEN_PAGING_FILE (0x2) #define SL_OPEN_PAGING_FILE (0x2)
#define SL_OPEN_TARGET_DIRECTORY (0x4) #define SL_OPEN_TARGET_DIRECTORY (0x4)
#define SL_CASE_SENSITIVE (0x8) #define SL_CASE_SENSITIVE (0x80)
#define SL_KEY_SPECIFIED (0x10)
#define SL_OVERRIDE_VERIFY_VOLUME (0x20) #define SL_KEY_SPECIFIED (0x1)
#define SL_WRITE_THROUGHT (0x40) #define SL_OVERRIDE_VERIFY_VOLUME (0x2)
#define SL_FT_SEQUENTIAL_WRITE (0x80) #define SL_WRITE_THROUGHT (0x4)
#define SL_FAIL_IMMEDIATELY (0x100) #define SL_FT_SEQUENTIAL_WRITE (0x8)
#define SL_EXCLUSIVE_LOCK (0x200)
#define SL_WATCH_TREE (0x2000)
#define SL_FAIL_IMMEDIATELY (0x1)
#define SL_EXCLUSIVE_LOCK (0x2)
#define SL_WATCH_TREE (0x1)
#define SL_RESTART_SCAN (0x1) #define SL_RESTART_SCAN (0x1)
#define SL_RETURN_SINGLE_ENTRY (0x2) #define SL_RETURN_SINGLE_ENTRY (0x2)
#define SL_INDEX_SPECIFIED (0x4) #define SL_INDEX_SPECIFIED (0x4)
#define SL_ALLOW_RAW_MOUNT (0x1)
#define SL_PENDING_RETURNED 0x01 #define SL_PENDING_RETURNED 0x01
#define SL_INVOKE_ON_CANCEL 0x20 #define SL_INVOKE_ON_CANCEL 0x20
#define SL_INVOKE_ON_SUCCESS 0x40 #define SL_INVOKE_ON_SUCCESS 0x40
......
...@@ -527,3 +527,5 @@ OUT PULONG ReturnedLength ...@@ -527,3 +527,5 @@ OUT PULONG ReturnedLength
); );
VOID IoRegisterFileSystem(PDEVICE_OBJECT DeviceObject); VOID IoRegisterFileSystem(PDEVICE_OBJECT DeviceObject);
PDEVICE_OBJECT IoGetAttachedDevice(PDEVICE_OBJECT DeviceObject); PDEVICE_OBJECT IoGetAttachedDevice(PDEVICE_OBJECT DeviceObject);
PFILE_OBJECT IoCreateStreamFileObject(PFILE_OBJECT FileObject,
PDEVICE_OBJECT DeviceObject);
...@@ -3,23 +3,21 @@ ...@@ -3,23 +3,21 @@
/* KERNEL FUNCTIONS ********************************************************/ /* KERNEL FUNCTIONS ********************************************************/
struct _KAPC; VOID KeInitializeApc(PKAPC Apc,
PKTHREAD Thread,
void KeInitializeApc( UCHAR StateIndex,
struct _KAPC *Apc, PKKERNEL_ROUTINE KernelRoutine,
PKTHREAD Thread, PKRUNDOWN_ROUTINE RundownRoutine,
UCHAR StateIndex, PKNORMAL_ROUTINE NormalRoutine,
PKKERNEL_ROUTINE KernelRoutine, UCHAR Mode,
PKRUNDOWN_ROUTINE RundownRoutine, PVOID Context);
PKNORMAL_ROUTINE NormalRoutine,
UCHAR Mode, VOID KeInsertQueueApc(PKAPC Apc,
PVOID Context PVOID SystemArgument1,
); PVOID SystemArgument2,
UCHAR Mode);
void KeInsertQueueApc(struct _KAPC *Apc, PVOID SystemArgument1, VOID KeAttachProcess(struct _EPROCESS* Process);
PVOID SystemArgument2, UCHAR Mode); VOID KeDetachProcess(VOID);
void KeAttachProcess(struct _EPROCESS* Process);
void KeDetachProcess(VOID);
VOID KeDrainApcQueue(VOID); VOID KeDrainApcQueue(VOID);
PKPROCESS KeGetCurrentProcess(VOID); PKPROCESS KeGetCurrentProcess(VOID);
...@@ -94,7 +92,9 @@ LONG KeSetBasePriorityThread(PKTHREAD Thread, LONG Increment); ...@@ -94,7 +92,9 @@ LONG KeSetBasePriorityThread(PKTHREAD Thread, LONG Increment);
LONG KeSetEvent(PKEVENT Event, KPRIORITY Increment, BOOLEAN Wait); LONG KeSetEvent(PKEVENT Event, KPRIORITY Increment, BOOLEAN Wait);
KPRIORITY KeSetPriorityThread(PKTHREAD Thread, KPRIORITY Priority); KPRIORITY KeSetPriorityThread(PKTHREAD Thread, KPRIORITY Priority);
BOOLEAN KeSetTimer(PKTIMER Timer, LARGE_INTEGER DueTime, PKDPC Dpc); BOOLEAN KeSetTimer(PKTIMER Timer, LARGE_INTEGER DueTime, PKDPC Dpc);
BOOLEAN KeSetTimerEx(PKTIMER Timer, LARGE_INTEGER DueTime, LONG Period, BOOLEAN KeSetTimerEx(PKTIMER Timer,
LARGE_INTEGER DueTime,
LONG Period,
PKDPC Dpc); PKDPC Dpc);
VOID KeStallExecutionProcessor(ULONG MicroSeconds); VOID KeStallExecutionProcessor(ULONG MicroSeconds);
BOOLEAN KeSynchronizeExecution(PKINTERRUPT Interrupt, BOOLEAN KeSynchronizeExecution(PKINTERRUPT Interrupt,
...@@ -108,12 +108,16 @@ NTSTATUS KeWaitForMultipleObjects(ULONG Count, ...@@ -108,12 +108,16 @@ NTSTATUS KeWaitForMultipleObjects(ULONG Count,
BOOLEAN Alertable, BOOLEAN Alertable,
PLARGE_INTEGER Timeout, PLARGE_INTEGER Timeout,
PKWAIT_BLOCK WaitBlockArray); PKWAIT_BLOCK WaitBlockArray);
NTSTATUS KeWaitForMutexObject(PKMUTEX Mutex, KWAIT_REASON WaitReason, NTSTATUS KeWaitForMutexObject(PKMUTEX Mutex,
KPROCESSOR_MODE WaitMode, BOOLEAN Alertable, KWAIT_REASON WaitReason,
KPROCESSOR_MODE WaitMode,
BOOLEAN Alertable,
PLARGE_INTEGER Timeout); PLARGE_INTEGER Timeout);
NTSTATUS KeWaitForSingleObject(PVOID Object, KWAIT_REASON WaitReason, NTSTATUS KeWaitForSingleObject(PVOID Object,
KWAIT_REASON WaitReason,
KPROCESSOR_MODE WaitMode, KPROCESSOR_MODE WaitMode,
BOOLEAN Alertable, PLARGE_INTEGER Timeout); BOOLEAN Alertable,
PLARGE_INTEGER Timeout);
/* /*
* FUNCTION: Initializes a spinlock * FUNCTION: Initializes a spinlock
...@@ -155,17 +159,6 @@ VOID KeBugCheckEx(ULONG BugCheckCode, ...@@ -155,17 +159,6 @@ VOID KeBugCheckEx(ULONG BugCheckCode,
*/ */
VOID KeBugCheck(ULONG BugCheckCode); VOID KeBugCheck(ULONG BugCheckCode);
// kmutant definition slightly modified from nt5 ddk
typedef struct _KMUTANT
{
DISPATCHER_HEADER Header;
LIST_ENTRY MutantListEntry;
struct _KTHREAD* OwnerThread;
BOOLEAN Abandoned;
UCHAR ApcDisable;
} KMUTANT, *PKMUTANT;
// io permission map has a 8k size // io permission map has a 8k size
// Each bit in the IOPM corresponds to an io port byte address. The bitmap // Each bit in the IOPM corresponds to an io port byte address. The bitmap
// is initialized to allow IO at any port. [ all bits set ]. // is initialized to allow IO at any port. [ all bits set ].
...@@ -186,7 +179,7 @@ typedef struct _IOPM ...@@ -186,7 +179,7 @@ typedef struct _IOPM
* is initialized to allow IO at any port. [ all bits set ]. The IOPL determines * is initialized to allow IO at any port. [ all bits set ]. The IOPL determines
* the minium privilege level required to perform IO prior to checking the permission map. * the minium privilege level required to perform IO prior to checking the permission map.
*/ */
void Ke386SetIoAccessMap(int NewMap, PIOPM *IoPermissionMap); VOID Ke386SetIoAccessMap(ULONG NewMap, PIOPM *IoPermissionMap);
/* /*
* FUNCTION: Queries the io permission map. * FUNCTION: Queries the io permission map.
...@@ -199,7 +192,7 @@ void Ke386SetIoAccessMap(int NewMap, PIOPM *IoPermissionMap); ...@@ -199,7 +192,7 @@ void Ke386SetIoAccessMap(int NewMap, PIOPM *IoPermissionMap);
* is initialized to allow IO at any port. [ all bits set ]. The IOPL determines * is initialized to allow IO at any port. [ all bits set ]. The IOPL determines
* the minium privilege level required to perform IO prior to checking the permission map. * the minium privilege level required to perform IO prior to checking the permission map.
*/ */
void Ke386QueryIoAccessMap(BOOLEAN NewMap, PIOPM *IoPermissionMap); VOID Ke386QueryIoAccessMap(BOOLEAN NewMap, PIOPM *IoPermissionMap);
/* /*
* FUNCTION: Set the process IOPL * FUNCTION: Set the process IOPL
...@@ -215,10 +208,8 @@ NTSTATUS Ke386IoSetAccessProcess(PEPROCESS Eprocess, BOOLEAN EnableIo); ...@@ -215,10 +208,8 @@ NTSTATUS Ke386IoSetAccessProcess(PEPROCESS Eprocess, BOOLEAN EnableIo);
* SelArray = * SelArray =
* NumOfSelectors = * NumOfSelectors =
*/ */
NTSTATUS KeI386ReleaseGdtSelectors( NTSTATUS KeI386ReleaseGdtSelectors(OUT PULONG SelArray,
OUT PULONG SelArray, IN ULONG NumOfSelectors);
IN ULONG NumOfSelectors
);
/* /*
* FUNCTION: Allocates a set of Global Descriptor Table Selectors * FUNCTION: Allocates a set of Global Descriptor Table Selectors
...@@ -226,17 +217,15 @@ NTSTATUS KeI386ReleaseGdtSelectors( ...@@ -226,17 +217,15 @@ NTSTATUS KeI386ReleaseGdtSelectors(
* SelArray = * SelArray =
* NumOfSelectors = * NumOfSelectors =
*/ */
NTSTATUS KeI386AllocateGdtSelectors( NTSTATUS KeI386AllocateGdtSelectors(OUT PULONG SelArray,
OUT PULONG SelArray, IN ULONG NumOfSelectors);
IN ULONG NumOfSelectors
);
/* /*
* FUNCTION: Raises a user mode exception * FUNCTION: Raises a user mode exception
* ARGUMENTS: * ARGUMENTS:
* ExceptionCode = Status code of the exception * ExceptionCode = Status code of the exception
*/ */
void KeRaiseUserException(NTSTATUS ExceptionCode); VOID KeRaiseUserException(NTSTATUS ExceptionCode);
#endif /* __INCLUDE_DDK_KEFUNCS_H */ #endif /* __INCLUDE_DDK_KEFUNCS_H */
...@@ -38,16 +38,37 @@ typedef struct ...@@ -38,16 +38,37 @@ typedef struct
typedef struct _DISPATCHER_HEADER typedef struct _DISPATCHER_HEADER
{ {
UCHAR Type; UCHAR Type;
UCHAR Absolute; UCHAR Absolute;
UCHAR Size; UCHAR Size;
UCHAR Inserted; UCHAR Inserted;
LONG SignalState; LONG SignalState;
LIST_ENTRY WaitListHead; LIST_ENTRY WaitListHead;
} DISPATCHER_HEADER; } DISPATCHER_HEADER;
typedef struct _KQUEUE
{
DISPATCHER_HEADER Header;
LIST_ENTRY EntryListHead;
ULONG CurrentCount;
ULONG MaximumCount;
LIST_ENTRY ThreadListEntry;
} KQUEUE, *PKQUEUE;
struct _KDPC; struct _KDPC;
/*
typedef struct _KTIMER
{
DISPATCHER_HEADER Header;
ULARGE_INTEGER DueTime;
LIST_ENTRY TimerListEntry;
struct _KDPC* Dpc;
LONG Period;
} KTIMER, *PKTIMER;
*/
typedef struct _KTIMER typedef struct _KTIMER
{ {
LIST_ENTRY entry; LIST_ENTRY entry;
...@@ -63,7 +84,7 @@ struct _KSPIN_LOCK; ...@@ -63,7 +84,7 @@ struct _KSPIN_LOCK;
typedef struct _KSPIN_LOCK typedef struct _KSPIN_LOCK
{ {
KIRQL irql; ULONG Lock;
} KSPIN_LOCK, *PKSPIN_LOCK; } KSPIN_LOCK, *PKSPIN_LOCK;
typedef struct _KDEVICE_QUEUE typedef struct _KDEVICE_QUEUE
...@@ -110,7 +131,7 @@ typedef struct ...@@ -110,7 +131,7 @@ typedef struct
struct _KTHREAD* OwnerThread; struct _KTHREAD* OwnerThread;
BOOLEAN Abandoned; BOOLEAN Abandoned;
UCHAR ApcDisable; UCHAR ApcDisable;
} KMUTEX, *PKMUTEX; } KMUTEX, *PKMUTEX, KMUTANT, *PKMUTANT;
typedef struct typedef struct
{ {
......
...@@ -18,12 +18,35 @@ typedef struct _BCB ...@@ -18,12 +18,35 @@ typedef struct _BCB
KSPIN_LOCK BcbLock; KSPIN_LOCK BcbLock;
} BCB, *PBCB; } BCB, *PBCB;
#define CACHE_SEGMENT_SIZE (0x1000)
struct _MEMORY_AREA;
typedef struct _CACHE_SEGMENT
{
PVOID BaseAddress;
struct _MEMORY_AREA* MemoryArea;
BOOLEAN Valid;
LIST_ENTRY ListEntry;
ULONG FileOffset;
KEVENT Lock;
ULONG ReferenceCount;
PBCB Bcb;
} CACHE_SEGMENT, *PCACHE_SEGMENT;
NTSTATUS CcFlushCachePage(PCACHE_SEGMENT CacheSeg);
NTSTATUS CcReleaseCachePage(PBCB Bcb,
PCACHE_SEGMENT CacheSeg,
BOOLEAN Valid);
NTSTATUS CcRequestCachePage(PBCB Bcb, NTSTATUS CcRequestCachePage(PBCB Bcb,
ULONG FileOffset, ULONG FileOffset,
PVOID* BaseAddress, PVOID* BaseAddress,
PBOOLEAN UptoDate); PBOOLEAN UptoDate,
PCACHE_SEGMENT* CacheSeg);
NTSTATUS CcInitializeFileCache(PFILE_OBJECT FileObject, NTSTATUS CcInitializeFileCache(PFILE_OBJECT FileObject,
PBCB* Bcb); PBCB* Bcb);
NTSTATUS CcReleaseFileCache(PFILE_OBJECT FileObject,
PBCB Bcb);
#include <ddk/cctypes.h> #include <ddk/cctypes.h>
......
...@@ -52,9 +52,9 @@ typedef struct _STARTUPINFOW { ...@@ -52,9 +52,9 @@ typedef struct _STARTUPINFOW {
WCHAR ImageFile[MAX_PATH]; WCHAR ImageFile[MAX_PATH];
WCHAR CommandLine[MAX_PATH]; WCHAR CommandLine[MAX_PATH];
WCHAR DllPath[MAX_PATH]; WCHAR DllPath[MAX_PATH];
LPWSTR Reserved[MAX_PATH]; WCHAR Reserved[MAX_PATH];
LPWSTR Desktop[MAX_PATH]; WCHAR Desktop[MAX_PATH];
LPWSTR Title[MAX_PATH]; WCHAR Title[MAX_PATH];
DWORD dwX; DWORD dwX;
DWORD dwY; DWORD dwY;
DWORD dwXSize; DWORD dwXSize;
...@@ -83,24 +83,24 @@ typedef struct _LDR { ...@@ -83,24 +83,24 @@ typedef struct _LDR {
typedef struct _NT_PEB typedef struct _NT_PEB
{ {
UCHAR InheritedAddressSpace; UCHAR InheritedAddressSpace; // 00
UCHAR ReadImageFileExecOptions; UCHAR ReadImageFileExecOptions; // 01h
UCHAR BeingDebugged; UCHAR BeingDebugged; // 02h
LONG ImageBaseAddress; LONG ImageBaseAddress; // 03h
LDR Ldr; LDR Ldr; // 07h
WORD NumberOfProcessors; WORD NumberOfProcessors; // 11h
WORD NtGlobalFlag; WORD NtGlobalFlag; // 13h
PPROCESSINFOW StartupInfo; PPROCESSINFOW StartupInfo; // 15h
HANDLE ProcessHeap; HANDLE ProcessHeap; // 19h
ATOMTABLE LocalAtomTable; ATOMTABLE LocalAtomTable; // 1Dh
LPCRITICAL_SECTION CriticalSection; LPCRITICAL_SECTION CriticalSection; // 35h
DWORD CriticalSectionTimeout; DWORD CriticalSectionTimeout; // 39h
WORD MajorVersion; WORD MajorVersion; // 3Dh
WORD MinorVersion; WORD MinorVersion; // 3Fh
WORD BuildNumber; WORD BuildNumber; // 41h
WORD PlatformId; WORD PlatformId; // 43h
} NT_PEB, *PNT_PEB; } NT_PEB, *PNT_PEB;
typedef struct _CLIENT_ID typedef struct _CLIENT_ID
...@@ -110,67 +110,116 @@ typedef struct _CLIENT_ID ...@@ -110,67 +110,116 @@ typedef struct _CLIENT_ID
} CLIENT_ID, *PCLIENT_ID; } CLIENT_ID, *PCLIENT_ID;
typedef struct _NT_TIB { typedef struct _NT_TIB {
struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; // 00h
PVOID StackBase; PVOID StackBase; // 04h
PVOID StackLimit; PVOID StackLimit; // 08h
PVOID SubSystemTib; PVOID SubSystemTib; // 0Ch
union { union {
PVOID FiberData; PVOID FiberData; // 10h
ULONG Version; ULONG Version; // 10h
} Fib; } Fib;
PVOID ArbitraryUserPointer; PVOID ArbitraryUserPointer; // 14h
struct _NT_TIB *Self; struct _NT_TIB *Self; // 18h
} NT_TIB, *PNT_TIB; } NT_TIB, *PNT_TIB;
typedef struct _NT_TEB typedef struct _NT_TEB
{ {
NT_TIB Tib; NT_TIB Tib; // 0
CLIENT_ID Cid; CLIENT_ID Cid; // 28
HANDLE RPCHandle; HANDLE RPCHandle; // 36
PVOID TlsData[TLS_MINIMUM_AVAILABLE]; PVOID TlsData[TLS_MINIMUM_AVAILABLE]; // 40
DWORD dwTlsIndex; DWORD dwTlsIndex; // 230
NT_PEB *Peb; NT_PEB *Peb; // 234
DWORD LastErrorCode; DWORD LastErrorCode; // 238
NTSTATUS LastStatusValue; NTSTATUS LastStatusValue; // 242
DWORD LockCount; DWORD LockCount; // 244
UCHAR HardErrorMode; UCHAR HardErrorMode; // 248
} NT_TEB; } NT_TEB;
typedef struct _KTHREAD struct _KPROCESS;
typedef struct _KAPC_STATE
{ {
DISPATCHER_HEADER DispatcherHeader; LIST_ENTRY ApcListHead[2];
TIME ElapsedTime; struct _KPROCESS* Process;
TIME KernelTime; UCHAR KernelApcInProgress;
TIME UserTime; UCHAR KernelApcPending;
STACK_INFORMATION StackInformation; USHORT UserApcPending;
PVOID ServiceDescriptorTable; // points to KeServiceDescriptorTable } KAPC_STATE, *PKAPC_STATE;
KAFFINITY Affinity;
KPRIORITY CurrentPriority; typedef struct _KTHREAD
KPRIORITY BasePriority; {
ULONG Quantum; DISPATCHER_HEADER DispatcherHeader; // For waiting for the thread
UCHAR ThreadState; //Thread state is a typeless enum, otherwise it should be const integer LIST_ENTRY MutantListHead;
ULONG FreezeCount; PVOID InitialStack;
LONG SuspendCount; ULONG StackLimit;
PTRAP_FRAME TrapFrame; NT_TEB* Teb;
PVOID *Tls; PVOID TlsArray;
KWAIT_BLOCK WaitBlock[4]; PVOID KernelStack;
struct _KMUTANT* MutantList; UCHAR DebugActive;
PLIST_ENTRY ApcList; UCHAR State;
UCHAR KernelApcDisable; USHORT Alerted;
KTIMER TimerBlock; UCHAR Iopl;
KDEVICE_QUEUE DeviceQueue; UCHAR NpxState;
NT_TEB* Teb; UCHAR Saturation;
KPRIORITY Priority;
/* KAPC_STATE ApcState;
* PURPOSE: CPU state ULONG ContextSwitches;
* NOTE: I have temporarily added this to give somewhere to store ULONG WaitStatus;
* cpu state when the thread isn't running KIRQL WaitIrql;
*/ ULONG WaitMode;
hal_thread_state Context; UCHAR WaitNext;
LIST_ENTRY Entry; UCHAR WaitReason;
ULONG LastTick; PVOID WaitBlockList;
} KTHREAD, *PKTHREAD; LIST_ENTRY WaitListEntry;
ULONG WaitTime;
KPRIORITY BasePriority;
UCHAR DecrementCount;
UCHAR PriorityDecrement;
UCHAR Quantum;
KWAIT_BLOCK WaitBlock[4];
PVOID LegoData; // ??
LONG KernelApcDisable;
KAFFINITY UserAffinity;
UCHAR SystemAffinityActive;
UCHAR Pad;
PKQUEUE Queue;
KTIMER Timer;
LIST_ENTRY QueueListEntry;
KAFFINITY Affinity;
UCHAR Preempted;
UCHAR ProcessReadyQueue;
UCHAR KernelStackResident;
UCHAR NextProcessor;
PVOID CallbackStack;
BOOL Win32Thread;
PVOID TrapFrame;
PVOID ApcStatePointer; // Is actually eight bytes
UCHAR EnableStackSwap;
UCHAR LargeStack;
UCHAR ResourceIndex;
UCHAR PreviousMode;
TIME KernelTime;
TIME UserTime;
KAPC_STATE SavedApcState;
UCHAR Alertable;
UCHAR ApcQueueable;
ULONG AutoAlignment;
PVOID StackBase;
KAPC SuspendApc;
KSEMAPHORE SuspendSemaphore;
LIST_ENTRY ThreadListEntry;
UCHAR FreezeCount;
ULONG SuspendCount;
UCHAR IdealProcessor;
UCHAR DisableBoost;
/* Provisionally added by David Welch */
hal_thread_state Context;
LIST_ENTRY Entry;
ULONG LastTick;
} KTHREAD, *PKTHREAD;
// According to documentation the stack should have a commited [ 1 page ] and // According to documentation the stack should have a commited [ 1 page ] and
// a reserved part [ 1 M ] but can be specified otherwise in the image file. // a reserved part [ 1 M ] but can be specified otherwise in the image file.
...@@ -243,7 +292,7 @@ typedef struct _ETHREAD { ...@@ -243,7 +292,7 @@ typedef struct _ETHREAD {
typedef struct _KPROCESS typedef struct _KPROCESS
{ {
DISPATCHER_HEADER DispatcherHeader; DISPATCHER_HEADER DispatcherHeader;
PVOID PageTableDirectory; // FIXME: I shoud point to a PTD PVOID PageTableDirectory; // FIXME: I should point to a PTD
TIME ElapsedTime; TIME ElapsedTime;
TIME KernelTime; TIME KernelTime;
TIME UserTime; TIME UserTime;
...@@ -268,9 +317,64 @@ typedef struct _KPROCESS ...@@ -268,9 +317,64 @@ typedef struct _KPROCESS
typedef struct _EPROCESS typedef struct _EPROCESS
{ {
KPROCESS Pcb; KPROCESS Pcb;
NTSTATUS ExitStatus;
ULONG UniqueProcessId; KEVENT LockEvent;
ULONG InheritedFromUniqueProcessId; ULONG LockCount;
TIME CreateTime;
TIME ExitTime;
PVOID LockOwner;
ULONG UniqueProcessId;
LIST_ENTRY ActiveProcessLinks;
ULONG QuotaPeakPoolUsage[2];
ULONG QuotaPoolUsage[2];
ULONG PagefileUsage;
ULONG CommitCharge;
ULONG PeakPagefileUsage;
ULONG PeakVirtualUsage;
LARGE_INTEGER VirtualSize;
PVOID Vm; // Actually 48 bytes
PVOID LastProtoPteFault;
PVOID DebugPort;
PVOID ExceptionPort;
PVOID ObjectTable;
PVOID Token;
KMUTEX WorkingSetLock;
PVOID WorkingSetPage;
UCHAR ProcessOutswapEnabled;
UCHAR ProcessOutswapped;
UCHAR AddressSpaceInitialized;
UCHAR AddressSpaceDeleted;
KMUTEX AddressCreationLock;
PVOID ForkInProgress;
PVOID VmOperation;
PKEVENT VmOperationEvent;
PVOID PageDirectoryPte;
LARGE_INTEGER LastFaultCount;
PVOID VadRoot;
PVOID VadHint;
PVOID CloneRoot;
ULONG NumberOfPrivatePages;
ULONG NumberOfLockedPages;
UCHAR ForkWasSuccessFul;
UCHAR ExitProcessCalled;
UCHAR CreateProcessReported;
HANDLE SectionHandle;
PNT_PEB Peb;
PVOID SectionBaseAddress;
PVOID QuotaBlock;
NTSTATUS LastThreadExitStatus;
LARGE_INTEGER WorkingSetWatch; //
ULONG InheritedFromUniqueProcessId;
ACCESS_MASK GrantedAccess;
ULONG DefaultHardErrorProcessing;
PVOID LdtInformation;
ULONG VadFreeHint;
PVOID VdmObjects;
KMUTANT ProcessMutant;
CHAR ImageFileName[16];
LARGE_INTEGER VmTrimFaultValue;
PVOID Win32Process; // Actually 12 bytes
PVOID Win32WindowStation;
} EPROCESS, *PEPROCESS; } EPROCESS, *PEPROCESS;
#define PROCESS_STATE_TERMINATED (1) #define PROCESS_STATE_TERMINATED (1)
......
...@@ -16,20 +16,44 @@ ...@@ -16,20 +16,44 @@
* Possible status codes * Possible status codes
* FIXME: These may not be the actual values used by NT * FIXME: These may not be the actual values used by NT
*/ */
enum
{
STATUS_SUCCESS = 0x0,
#define STATUS_SUCCESS (0x0)
#define STATUS_MORE_ENTRIES (0x105)
#define STATUS_NOTIFY_ENUM_DIR (0x10C)
#define STATUS_OBJECT_EXISTS (0x40000000)
#define STATUS_THREAD_WAS_SUSPENDED (0x40000001)
#define STATUS_WORKING_SET_LIMIT_RANGE (0x40000002)
#define STATUS_UNSUCCESSFUL (0xC0000001)
#define STATUS_NOT_IMPLEMENTED (0xC0000002)
#define STATUS_INVALID_INFO_CLASS (0xC0000003)
#define STATUS_INFO_LENGTH_MISMATCH (0xC0000004)
#define STATUS_ACCESS_VIOLATION (0xC0000005)
#define STATUS_IN_PAGE_ERROR (0xC0000006)
#define STATUS_PAGEFILE_QUOTA (0xC0000007)
#define STATUS_INVALID_HANDLE (0xC0000008)
#define STATUS_BAD_INITIAL_STACK (0xC0000009)
#define STATUS_BAD_INITIAL_PC (0xC000000A)
#define STATUS_INVALID_CID (0xC000000B)
#define STATUS_TIMER_NOT_CANCELED (0xC000000C)
#define STATUS_INVALID_PARAMETER (0xC000000D)
#define STATUS_NO_SUCH_DEVICE (0xC000000E)
#define STATUS_NO_SUCH_FILE (0xC000000F)
#define STATUS_GUARD_PAGE_VIOLATION (0x80000001)
#define STATUS_DATATYPE_MISALIGNMENT (0x80000002)
#define STATUS_BREAKPOINT (0x80000003)
#define STATUS_SINGLE_STEP (0x80000004)
#define STATUS_BUFFER_OVERFLOW (0x80000005)
#define STATUS_NO_MORE_FILES (0x80000006)
#define STATUS_WAKE_SYSTEM_DEBUGGER (0x80000007)
STATUS_MORE_ENTRIES=0x00000105,
STATUS_NOTIFY_ENUM_DIR=0x0000010C,
enum
STATUS_OBJECT_NAME_EXISTS=0x40000000, {
STATUS_THREAD_WAS_SUSPENDED,
STATUS_WORKING_SET_LIMIT_RANGE, STATUS_IMAGE_NOT_AT_BASE = (0x40000003),
STATUS_IMAGE_NOT_AT_BASE,
STATUS_RXACT_STATE_CREATED, STATUS_RXACT_STATE_CREATED,
STATUS_SEGMENT_NOTIFICATION, STATUS_SEGMENT_NOTIFICATION,
STATUS_LOCAL_USER_SESSION_KEY, STATUS_LOCAL_USER_SESSION_KEY,
...@@ -69,15 +93,6 @@ enum ...@@ -69,15 +93,6 @@ enum
STATUS_WX86_CREATEWX86TIB, STATUS_WX86_CREATEWX86TIB,
STATUS_GUARD_PAGE_VIOLATION=0x80000001,
STATUS_DATATYPE_MISALIGNMENT,
STATUS_BREAKPOINT,
STATUS_SINGLE_STEP,
STATUS_BUFFER_OVERFLOW,
STATUS_NO_MORE_FILES,
STATUS_WAKE_SYSTEM_DEBUGGER,
STATUS_HANDLES_CLOSED=0x8000000A, STATUS_HANDLES_CLOSED=0x8000000A,
STATUS_NO_INHERITANCE, STATUS_NO_INHERITANCE,
STATUS_GUID_SUBSTITUTION_MADE, STATUS_GUID_SUBSTITUTION_MADE,
...@@ -108,21 +123,6 @@ enum ...@@ -108,21 +123,6 @@ enum
STATUS_ALREADY_DISCONNECTED, STATUS_ALREADY_DISCONNECTED,
STATUS_LONGJUMP, STATUS_LONGJUMP,
STATUS_UNSUCCESSFUL=0xC0000001,
STATUS_NOT_IMPLEMENTED,
STATUS_INVALID_INFO_CLASS,
STATUS_INFO_LENGTH_MISMATCH,
STATUS_ACCESS_VIOLATION,
STATUS_IN_PAGE_ERROR,
STATUS_PAGEFILE_QUOTA,
STATUS_INVALID_HANDLE,
STATUS_BAD_INITIAL_STACK,
STATUS_BAD_INITIAL_PC,
STATUS_INVALID_CID,
STATUS_TIMER_NOT_CANCELED,
STATUS_INVALID_PARAMETER,
STATUS_NO_SUCH_DEVICE,
STATUS_NO_SUCH_FILE,
// c0000010 // c0000010
STATUS_INVALID_DEVICE_REQUEST, STATUS_INVALID_DEVICE_REQUEST,
......
...@@ -30,8 +30,8 @@ ...@@ -30,8 +30,8 @@
#define CHECKED #define CHECKED
#endif #endif
#ifdef CHECKED #ifndef NASSERT
#define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); for (;;); } #define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); KeBugCheck(0); }
#else #else
#define assert(x) #define assert(x)
#endif #endif
......
...@@ -96,6 +96,10 @@ NTSTATUS MmCopyMmInfo(PEPROCESS Src, PEPROCESS Dest); ...@@ -96,6 +96,10 @@ NTSTATUS MmCopyMmInfo(PEPROCESS Src, PEPROCESS Dest);
NTSTATUS MmReleaseMmInfo(PEPROCESS Process); NTSTATUS MmReleaseMmInfo(PEPROCESS Process);
NTSTATUS Mmi386ReleaseMmInfo(PEPROCESS Process); NTSTATUS Mmi386ReleaseMmInfo(PEPROCESS Process);
VOID MmDeletePageEntry(PEPROCESS Process, PVOID Address, BOOL FreePage); VOID MmDeletePageEntry(PEPROCESS Process, PVOID Address, BOOL FreePage);
NTSTATUS IoPageRead(PFILE_OBJECT FileObject,
PVOID Address,
PLARGE_INTEGER Offset,
PIO_STATUS_BLOCK StatusBlock);
#endif #endif
...@@ -19,37 +19,13 @@ VOID PsReleaseThread(PETHREAD Thread); ...@@ -19,37 +19,13 @@ VOID PsReleaseThread(PETHREAD Thread);
VOID PsBeginThread(PKSTART_ROUTINE StartRoutine, PVOID StartContext); VOID PsBeginThread(PKSTART_ROUTINE StartRoutine, PVOID StartContext);
VOID PsBeginThreadWithContextInternal(VOID); VOID PsBeginThreadWithContextInternal(VOID);
/* #define THREAD_STATE_INVALID (0)
* PURPOSE: Thread states #define THREAD_STATE_RUNNABLE (1)
*/ #define THREAD_STATE_RUNNING (2)
enum #define THREAD_STATE_SUSPENDED (3)
{ #define THREAD_STATE_TERMINATED (4)
/* #define THREAD_STATE_MAX (5)
* PURPOSE: Don't touch
*/
THREAD_STATE_INVALID,
/*
* PURPOSE: Waiting to be dispatched
*/
THREAD_STATE_RUNNABLE,
/*
* PURPOSE: Currently running
*/
THREAD_STATE_RUNNING,
/*
* PURPOSE: Doesn't want to run
*/
THREAD_STATE_SUSPENDED,
/*
* Waiting to be freed
*/
THREAD_STATE_TERMINATED,
};
/* /*
* Functions the HAL must provide * Functions the HAL must provide
*/ */
......
#include <windows.h> #include <windows.h>
#define UNIMPLEMENTED dprintf("%s at %s:%d is unimplemented\n",__FUNCTION__,__FILE__,__LINE__);
#ifdef NDEBUG #ifdef NDEBUG
#define DPRINT(args...) #define DPRINT(args...)
#define CHECKPOINT #define CHECKPOINT
...@@ -28,3 +30,4 @@ PVOID __ErrorReturnNull(ULONG ErrorCode); ...@@ -28,3 +30,4 @@ PVOID __ErrorReturnNull(ULONG ErrorCode);
BOOL KERNEL32_AnsiToUnicode(PWSTR DestStr, BOOL KERNEL32_AnsiToUnicode(PWSTR DestStr,
LPCSTR SrcStr, LPCSTR SrcStr,
ULONG MaxLen); ULONG MaxLen);
PWSTR InternalAnsiToUnicode(PWSTR Out, LPCSTR In, ULONG MaxLength);
...@@ -14,3 +14,4 @@ extern void dprintf(char* fmt,...); ...@@ -14,3 +14,4 @@ extern void dprintf(char* fmt,...);
#define MAGIC(c1,c2,c3,c4) ((c1) + ((c2)<<8) + ((c3)<<16) + ((c4)<<24)) #define MAGIC(c1,c2,c3,c4) ((c1) + ((c2)<<8) + ((c3)<<16) + ((c4)<<24))
#define MAGIC_HEAP MAGIC( 'H','E','A','P' ) #define MAGIC_HEAP MAGIC( 'H','E','A','P' )
...@@ -158,7 +158,7 @@ CLEAN_FILES = assert/*.o conio/*.o ctype/*.o direct/*.o dirent/*.o \ ...@@ -158,7 +158,7 @@ CLEAN_FILES = assert/*.o conio/*.o ctype/*.o direct/*.o dirent/*.o \
endif endif
crtdll.coff: crtdll.rc ../../include/reactos/resource.h crtdll.coff: crtdll.rc ../../include/reactos/resource.h
windres crtdll.rc crtdll.coff $(RC) crtdll.rc crtdll.coff
crtdll.a: $(OBJECTS) crtdll.a: $(OBJECTS)
$(LD) -r $(OBJECTS) -o crtdll.a $(LD) -r $(OBJECTS) -o crtdll.a
......
...@@ -65,12 +65,10 @@ LONG ...@@ -65,12 +65,10 @@ LONG
STDCALL STDCALL
UnhandledExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo) UnhandledExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo)
{ {
char message[80];
DWORD dbgRet; DWORD dbgRet;
HANDLE DebugPort; HANDLE DebugPort;
NTSTATUS errCode; NTSTATUS errCode;
DWORD DebuggerPresent;
if(ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_ACCESS_VIOLATION) { if(ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_ACCESS_VIOLATION) {
......
...@@ -187,7 +187,6 @@ WINBOOL STDCALL CopyFileExA(LPCSTR lpExistingFileName, ...@@ -187,7 +187,6 @@ WINBOOL STDCALL CopyFileExA(LPCSTR lpExistingFileName,
WINBOOL* pbCancel, WINBOOL* pbCancel,
DWORD dwCopyFlags) DWORD dwCopyFlags)
{ {
ULONG i;
WCHAR ExistingFileNameW[MAX_PATH]; WCHAR ExistingFileNameW[MAX_PATH];
WCHAR NewFileNameW[MAX_PATH]; WCHAR NewFileNameW[MAX_PATH];
......
...@@ -11,8 +11,9 @@ ...@@ -11,8 +11,9 @@
/* INCLUDES ******************************************************************/ /* INCLUDES ******************************************************************/
#include <windows.h> #include <windows.h>
#include <string.h> #include <wchar.h>
#include <ctype.h> #include <ctype.h>
#include <string.h>
#define NDEBUG #define NDEBUG
#include <kernel32/kernel32.h> #include <kernel32/kernel32.h>
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать