mirror of
https://github.com/reactos/reactos.git
synced 2025-08-10 22:25:55 +00:00
This commit was generated by cvs2svn to compensate for changes in r52,
which included commits to RCS files with non-trunk default branches. svn path=/trunk/; revision=53
This commit is contained in:
parent
645218d5c8
commit
ee81c811cd
102 changed files with 7111 additions and 4100 deletions
|
@ -1 +1 @@
|
|||
loaders\dos\loadros ntoskrnl\kimage.bin %1 %2 %3 %4
|
||||
loaders\dos\loadros ntoskrnl\kimage.bin services\dd\ide\ide.o services\fs\vfat\vfatfsd.o services\dd\keyboard\keyboard.o %2 %3 %4
|
||||
|
|
|
@ -20,8 +20,5 @@ IoInitializeDpc
|
|||
IoInitializeTimer
|
||||
IoStartTimer
|
||||
IoStopTimer
|
||||
|
||||
Partially implemented
|
||||
|
||||
IoCreateDevice
|
||||
IoCallDriver
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
#include "minix_fs.h"
|
||||
#include "minix.h"
|
||||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
||||
|
@ -34,6 +34,7 @@ BOOLEAN MinixReadSector(IN PDEVICE_OBJECT pDeviceObject,
|
|||
DPRINT("MinixReadSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n",
|
||||
pDeviceObject,DiskSector,Buffer);
|
||||
|
||||
sectorNumber.HighPart = 0;
|
||||
sectorNumber.LowPart = DiskSector * BLOCKSIZE;
|
||||
|
||||
KeInitializeEvent(&event, NotificationEvent, FALSE);
|
||||
|
@ -82,3 +83,51 @@ BOOLEAN MinixReadSector(IN PDEVICE_OBJECT pDeviceObject,
|
|||
ExFreePool(mbr);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOLEAN MinixWriteSector(IN PDEVICE_OBJECT pDeviceObject,
|
||||
IN ULONG DiskSector,
|
||||
IN UCHAR* Buffer)
|
||||
{
|
||||
LARGE_INTEGER sectorNumber;
|
||||
PIRP irp;
|
||||
IO_STATUS_BLOCK ioStatus;
|
||||
KEVENT event;
|
||||
NTSTATUS status;
|
||||
ULONG sectorSize;
|
||||
|
||||
DPRINT("MinixWriteSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n",
|
||||
pDeviceObject,DiskSector,Buffer);
|
||||
|
||||
sectorNumber.LowPart = DiskSector * BLOCKSIZE;
|
||||
|
||||
KeInitializeEvent(&event, NotificationEvent, FALSE);
|
||||
|
||||
sectorSize = BLOCKSIZE;
|
||||
|
||||
irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE,
|
||||
pDeviceObject,
|
||||
Buffer,
|
||||
sectorSize,
|
||||
§orNumber,
|
||||
&event,
|
||||
&ioStatus );
|
||||
|
||||
|
||||
status = IoCallDriver(pDeviceObject,
|
||||
irp);
|
||||
|
||||
if (status == STATUS_PENDING) {
|
||||
KeWaitForSingleObject(&event,
|
||||
Suspended,
|
||||
KernelMode,
|
||||
FALSE,
|
||||
NULL);
|
||||
status = ioStatus.Status;
|
||||
}
|
||||
|
||||
if (!NT_SUCCESS(status)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -1,2 +1,9 @@
|
|||
all: minix.o blockdev.o
|
||||
$(LD) -r minix.o blockdev.o -o minixfsd.o
|
||||
OBJECTS = block.o rw.o inode.o dir.o mount.o blockdev.o
|
||||
|
||||
all: minix.o
|
||||
|
||||
minix.o: $(OBJECTS)
|
||||
$(LD) -r $(OBJECTS) -o minix.o
|
||||
|
||||
WIN32_LEAN_AND_MEAN = yes
|
||||
include ../../../rules.mak
|
||||
|
|
|
@ -43,9 +43,127 @@ extern "C" {
|
|||
#endif
|
||||
#endif /* !NULL */
|
||||
|
||||
/*
|
||||
* Definitions needed for the ddk includes (we miss out win32 only stuff to
|
||||
* cut down on the compile time)
|
||||
*/
|
||||
typedef unsigned char UCHAR;
|
||||
typedef unsigned int UINT;
|
||||
typedef unsigned long ULONG;
|
||||
typedef unsigned short USHORT;
|
||||
typedef unsigned short WCHAR;
|
||||
typedef unsigned short WORD;
|
||||
typedef int WINBOOL;
|
||||
typedef unsigned char BOOLEAN;
|
||||
typedef unsigned int DWORD; /* was unsigned long */
|
||||
typedef unsigned short *LPWSTR;
|
||||
typedef unsigned short *PWSTR;
|
||||
typedef unsigned char *PUCHAR;
|
||||
typedef unsigned int *PUINT;
|
||||
typedef unsigned long *PULONG;
|
||||
typedef unsigned short *PUSHORT;
|
||||
typedef void *PVOID;
|
||||
typedef unsigned char BYTE;
|
||||
typedef void *LPVOID;
|
||||
|
||||
/* Check VOID before defining CHAR, SHORT, and LONG */
|
||||
#ifndef VOID
|
||||
#define VOID void
|
||||
typedef char CHAR;
|
||||
typedef short SHORT;
|
||||
typedef long LONG;
|
||||
#endif
|
||||
|
||||
typedef CHAR *PCHAR;
|
||||
typedef CHAR *PCH;
|
||||
typedef void *HANDLE;
|
||||
typedef char CCHAR;
|
||||
|
||||
typedef enum _SECURITY_IMPERSONATION_LEVEL {
|
||||
SecurityAnonymous,
|
||||
SecurityIdentification,
|
||||
SecurityImpersonation,
|
||||
SecurityDelegation
|
||||
} SECURITY_IMPERSONATION_LEVEL;
|
||||
|
||||
typedef enum tagTOKEN_TYPE {
|
||||
TokenPrimary = 1,
|
||||
TokenImpersonation
|
||||
} TOKEN_TYPE;
|
||||
|
||||
#define FALSE 0
|
||||
#define TRUE 1
|
||||
|
||||
typedef const unsigned short *PCWSTR;
|
||||
|
||||
typedef char* PCSZ;
|
||||
|
||||
#define CONST const
|
||||
|
||||
#ifdef i386
|
||||
#define STDCALL __attribute__ ((stdcall))
|
||||
#define CDECL __attribute((cdecl))
|
||||
#define CALLBACK WINAPI
|
||||
#define PASCAL WINAPI
|
||||
#else
|
||||
#define STDCALL
|
||||
#define CDECL
|
||||
#define CALLBACK
|
||||
#define PASCAL
|
||||
#endif
|
||||
#define WINAPI STDCALL
|
||||
#define APIENTRY STDCALL
|
||||
#define WINGDIAPI
|
||||
|
||||
typedef BYTE *PBOOLEAN;
|
||||
typedef HANDLE *PHANDLE;
|
||||
|
||||
typedef DWORD CALLBACK (*PTHREAD_START_ROUTINE) (LPVOID);
|
||||
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
|
||||
|
||||
typedef unsigned short ATOM;
|
||||
|
||||
#ifdef UNICODE
|
||||
typedef unsigned short *LPTCH;
|
||||
typedef unsigned short *LPTSTR;
|
||||
#else
|
||||
typedef char *LPTCH;
|
||||
typedef char *LPTSTR;
|
||||
#endif /* UNICODE */
|
||||
|
||||
typedef long *PLONG;
|
||||
typedef unsigned short *PWCHAR;
|
||||
typedef char *LPSTR;
|
||||
typedef double LONGLONG, *PLONGLONG;
|
||||
|
||||
typedef enum _MEDIA_TYPE {
|
||||
Unknown,
|
||||
F5_1Pt2_512,
|
||||
F3_1Pt44_512,
|
||||
F3_2Pt88_512,
|
||||
F3_20Pt8_512,
|
||||
F3_720_512,
|
||||
F5_360_512,
|
||||
F5_320_512,
|
||||
F5_320_1024,
|
||||
F5_180_512,
|
||||
F5_160_512,
|
||||
RemovableMedia,
|
||||
FixedMedia
|
||||
} MEDIA_TYPE;
|
||||
|
||||
#ifndef max
|
||||
#define max(a, b) (((a) > (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef min
|
||||
#define min(a, b) (((a) < (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
|
||||
|
||||
#ifndef RC_INVOKED
|
||||
|
||||
/* typedef ACMDRIVERENUMCB;
|
||||
|
@ -58,30 +176,15 @@ typedef ACMFORMATENUMCB;
|
|||
typedef ACMFORMATTAGENUMCB;
|
||||
typedef APPLET_PROC;
|
||||
*/
|
||||
typedef unsigned short ATOM;
|
||||
/* Changed from BOOL to WINBOOL to avoid Objective-C conflict */
|
||||
typedef int WINBOOL;
|
||||
typedef unsigned char BOOLEAN;
|
||||
typedef unsigned char BYTE;
|
||||
typedef unsigned long CALTYPE;
|
||||
typedef unsigned long CALID;
|
||||
typedef char CCHAR;
|
||||
typedef unsigned long COLORREF;
|
||||
#define CONST const
|
||||
|
||||
/* Check VOID before defining CHAR, SHORT, and LONG */
|
||||
#ifndef VOID
|
||||
#define VOID void
|
||||
typedef char CHAR;
|
||||
typedef short SHORT;
|
||||
typedef long LONG;
|
||||
#endif
|
||||
|
||||
/*
|
||||
typedef CTRYID;
|
||||
typedef DLGPROC;
|
||||
*/
|
||||
typedef unsigned int DWORD; /* was unsigned long */
|
||||
typedef double DWORDLONG, *PDWORDLONG;
|
||||
/*
|
||||
typedef EDITWORDBREAKPROC;
|
||||
|
@ -92,7 +195,6 @@ typedef ENUMRESTYPEPROC;
|
|||
*/
|
||||
typedef float FLOAT;
|
||||
/* typedef GLOBALHANDLE; */
|
||||
typedef void *HANDLE;
|
||||
typedef HANDLE HACCEL;
|
||||
typedef HANDLE HBITMAP;
|
||||
typedef HANDLE HBRUSH;
|
||||
|
@ -138,7 +240,6 @@ typedef unsigned short LANGID;
|
|||
typedef DWORD LCID;
|
||||
typedef DWORD LCTYPE;
|
||||
/* typedef LOCALHANDLE */
|
||||
typedef double LONGLONG, *PLONGLONG;
|
||||
typedef unsigned short *LP;
|
||||
typedef long LPARAM;
|
||||
typedef WINBOOL *LPBOOL;
|
||||
|
@ -147,7 +248,6 @@ typedef CONST CHAR *LPCCH;
|
|||
typedef CHAR *LPCH;
|
||||
typedef COLORREF *LPCOLORREF;
|
||||
typedef const char *LPCSTR;
|
||||
typedef char* PCSZ;
|
||||
|
||||
#ifdef UNICODE
|
||||
typedef const unsigned short *LPCTSTR;
|
||||
|
@ -163,41 +263,23 @@ typedef HANDLE *LPHANDLE;
|
|||
/* typedef LPHANDLER_FUNCTION; */
|
||||
typedef int *LPINT;
|
||||
typedef long *LPLONG;
|
||||
typedef char *LPSTR;
|
||||
|
||||
#ifdef UNICODE
|
||||
typedef unsigned short *LPTCH;
|
||||
typedef unsigned short *LPTSTR;
|
||||
#else
|
||||
typedef char *LPTCH;
|
||||
typedef char *LPTSTR;
|
||||
#endif /* UNICODE */
|
||||
|
||||
typedef long LRESULT;
|
||||
typedef void *LPVOID;
|
||||
typedef const void *LPCVOID;
|
||||
typedef unsigned short *LPWCH;
|
||||
typedef unsigned short *LPWORD;
|
||||
typedef unsigned short *LPWSTR;
|
||||
typedef unsigned short *PWSTR;
|
||||
/* typedef NPSTR; */
|
||||
typedef unsigned short *NWPSTR;
|
||||
typedef WINBOOL *PWINBOOL;
|
||||
typedef BYTE *PBOOLEAN;
|
||||
typedef BYTE *PBYTE;
|
||||
typedef const CHAR *PCCH;
|
||||
typedef CHAR *PCH;
|
||||
typedef CHAR *PCHAR;
|
||||
typedef const char *PCSTR;
|
||||
typedef const unsigned short *PCWCH;
|
||||
typedef const unsigned short *PCWSTR;
|
||||
typedef DWORD *PDWORD;
|
||||
typedef float *PFLOAT;
|
||||
typedef HANDLE *PHANDLE;
|
||||
/* typedef PHKEY; */
|
||||
typedef int *PINT;
|
||||
/* typedef LCID *PLCID; */
|
||||
typedef long *PLONG;
|
||||
typedef short *PSHORT;
|
||||
/* typedef PSID; */
|
||||
typedef char *PSTR;
|
||||
|
@ -215,13 +297,7 @@ typedef char *PTCHAR;
|
|||
typedef char *PTSTR;
|
||||
#endif /* UNICODE */
|
||||
|
||||
typedef unsigned char *PUCHAR;
|
||||
typedef unsigned int *PUINT;
|
||||
typedef unsigned long *PULONG;
|
||||
typedef unsigned short *PUSHORT;
|
||||
typedef void *PVOID;
|
||||
typedef unsigned short *PWCH;
|
||||
typedef unsigned short *PWCHAR;
|
||||
typedef unsigned short *PWORD;
|
||||
/*
|
||||
typedef PWSTR;
|
||||
|
@ -246,30 +322,10 @@ typedef char TCHAR;
|
|||
typedef BYTE BCHAR;
|
||||
#endif /* UNICODE */
|
||||
|
||||
typedef unsigned char UCHAR;
|
||||
typedef unsigned int UINT;
|
||||
typedef unsigned long ULONG;
|
||||
typedef unsigned short USHORT;
|
||||
typedef unsigned short WCHAR;
|
||||
typedef unsigned short WORD;
|
||||
typedef unsigned int WPARAM;
|
||||
/* typedef YIELDPROC; */
|
||||
|
||||
/* Only use __stdcall under WIN32 compiler */
|
||||
#ifdef i386
|
||||
#define STDCALL __attribute__ ((stdcall))
|
||||
#define CDECL __attribute((cdecl))
|
||||
#define CALLBACK WINAPI
|
||||
#define PASCAL WINAPI
|
||||
#else
|
||||
#define STDCALL
|
||||
#define CDECL
|
||||
#define CALLBACK
|
||||
#define PASCAL
|
||||
#endif
|
||||
#define WINAPI STDCALL
|
||||
#define APIENTRY STDCALL
|
||||
#define WINGDIAPI
|
||||
|
||||
#define _export
|
||||
|
||||
|
@ -281,21 +337,6 @@ typedef enum _ACL_INFORMATION_CLASS {
|
|||
AclSizeInformation
|
||||
} ACL_INFORMATION_CLASS;
|
||||
|
||||
typedef enum _MEDIA_TYPE {
|
||||
Unknown,
|
||||
F5_1Pt2_512,
|
||||
F3_1Pt44_512,
|
||||
F3_2Pt88_512,
|
||||
F3_20Pt8_512,
|
||||
F3_720_512,
|
||||
F5_360_512,
|
||||
F5_320_512,
|
||||
F5_320_1024,
|
||||
F5_180_512,
|
||||
F5_160_512,
|
||||
RemovableMedia,
|
||||
FixedMedia
|
||||
} MEDIA_TYPE;
|
||||
|
||||
#define RASCS_DONE 0x2000
|
||||
#define RASCS_PAUSED 0x1000
|
||||
|
@ -340,13 +381,6 @@ typedef enum _RASPROJECTION {
|
|||
RASP_PppIp = 0x8021
|
||||
} RASPROJECTION ;
|
||||
|
||||
typedef enum _SECURITY_IMPERSONATION_LEVEL {
|
||||
SecurityAnonymous,
|
||||
SecurityIdentification,
|
||||
SecurityImpersonation,
|
||||
SecurityDelegation
|
||||
} SECURITY_IMPERSONATION_LEVEL;
|
||||
|
||||
typedef enum _SID_NAME_USE {
|
||||
SidTypeUser = 1,
|
||||
SidTypeGroup,
|
||||
|
@ -371,11 +405,6 @@ typedef enum _TOKEN_INFORMATION_CLASS {
|
|||
TokenStatistics
|
||||
} TOKEN_INFORMATION_CLASS;
|
||||
|
||||
typedef enum tagTOKEN_TYPE {
|
||||
TokenPrimary = 1,
|
||||
TokenImpersonation
|
||||
} TOKEN_TYPE;
|
||||
|
||||
#endif /* ! defined (RC_INVOKED) */
|
||||
|
||||
/*
|
||||
|
@ -421,13 +450,6 @@ typedef enum tagTOKEN_TYPE {
|
|||
#define MAKEROP4(fore,back) (DWORD)((((back) << 8) & 0xFF000000) | (fore))
|
||||
#define MAKEWPARAM(l, h) ((WPARAM) MAKELONG(l, h))
|
||||
|
||||
#ifndef max
|
||||
#define max(a, b) (((a) > (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef min
|
||||
#define min(a, b) (((a) < (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#define PALETTEINDEX(i) ((COLORREF) (0x01000000 | (DWORD) (WORD) (i)))
|
||||
#define PALETTERGB(r, g, b) (0x02000000 | RGB(r, g, b))
|
||||
|
@ -451,8 +473,6 @@ typedef enum tagTOKEN_TYPE {
|
|||
typedef int CALLBACK (*BFFCALLBACK) (HWND, UINT, LPARAM, LPARAM);
|
||||
typedef UINT CALLBACK (*LPCCHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
|
||||
typedef UINT CALLBACK (*LPCFHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
|
||||
typedef DWORD CALLBACK (*PTHREAD_START_ROUTINE) (LPVOID);
|
||||
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
|
||||
typedef DWORD CALLBACK (*EDITSTREAMCALLBACK) (DWORD, LPBYTE, LONG, LONG);
|
||||
typedef UINT CALLBACK (*LPFRHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
|
||||
typedef UINT CALLBACK (*LPOFNHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
|
||||
|
@ -565,6 +585,8 @@ typedef DWORD CCSTYLEFLAGA, *PCCSTYLEFLAGA, *LPCCSTYLEFLAGA;
|
|||
|
||||
#endif /* ! defined (RC_INVOKED) */
|
||||
|
||||
#endif /* WIN32_LEAN_AND_MEAN */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
|
|
@ -94,3 +94,59 @@ PLIST_ENTRY ExInterlockedInsertHeadList(PLIST_ENTRY ListHead,
|
|||
|
||||
VOID ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem,
|
||||
WORK_QUEUE_TYPE QueueType);
|
||||
VOID ExRaiseStatus(NTSTATUS Status);
|
||||
VOID ExReinitializeResourceLite(PERESOURCE Resource);
|
||||
VOID ExReleaseFastMutex(PFAST_MUTEX Mutex);
|
||||
VOID ExReleaseFastMutexUnsafe(PFAST_MUTEX Mutex);
|
||||
VOID ExReleaseResource(PERESOURCE Resource);
|
||||
VOID ExReleaseResourceForThread(PERESOURCE Resource,
|
||||
ERESOURCE_THREAD ResourceThreadId);
|
||||
VOID ExReleaseResourceForThreadLite(PERESOURCE Resource,
|
||||
ERESOURCE_THREAD ResourceThreadId);
|
||||
VOID ExSystemTimeToLocalTime(PLARGE_INTEGER SystemTime,
|
||||
PLARGE_INTEGER LocalTime);
|
||||
BOOLEAN ExTryToAcquireFastMutex(PFAST_MUTEX FastMutex);
|
||||
BOOLEAN ExTryToAcquireResourceExclusiveLite(PERESOURCE Resource);
|
||||
PVOID InterlockedCompareExchange(PVOID* Destination,
|
||||
PVOID Exchange,
|
||||
PVOID Comperand);
|
||||
LONG InterlockedDecrement(PLONG Addend);
|
||||
LONG InterlockedExchange(PLONG Target, LONG Value);
|
||||
LONG InterlockedExchangeAdd(PLONG Addend, LONG Value);
|
||||
LONG InterlockedIncrement(PLONG Addend);
|
||||
|
||||
PVOID ExInterlockedAllocateFromZone(PZONE_HEADER Zone, PKSPIN_LOCK Lock);
|
||||
PVOID ExInterlockedFreeToZone(PZONE_HEADER Zone, PVOID Block,
|
||||
PKSPIN_LOCK Lock);
|
||||
NTSTATUS ExInterlockedExtendZone(PZONE_HEADER Zone, PVOID Segment,
|
||||
ULONG SegmentSize, PKSPIN_LOCK Lock);
|
||||
PSINGLE_LIST_ENTRY ExInterlockedPopEntryList(PSINGLE_LIST_ENTRY ListHead,
|
||||
PKSPIN_LOCK Lock);
|
||||
PSINGLE_LIST_ENTRY ExInterlockedPushEntryList(PSINGLE_LIST_ENTRY ListHead,
|
||||
PSINGLE_LIST_ENTRY ListEntry,
|
||||
PKSPIN_LOCK Lock);
|
||||
PSINGLE_LIST_ENTRY ExInterlockedPushEntrySList(PSLIST_HEADER ListHead,
|
||||
PSINGLE_LIST_ENTRY ListEntry,
|
||||
PKSPIN_LOCK Lock);
|
||||
PSINGLE_LIST_ENTRY ExInterlockedPopEntrySList(PSLIST_HEADER ListHead,
|
||||
PKSPIN_LOCK Lock);
|
||||
BOOLEAN ExIsFullZone(PZONE_HEADER Zone);
|
||||
BOOLEAN ExIsObjectInFirstZoneSegment(PZONE_HEADER Zone, PVOID Object);
|
||||
VOID ExLocalTimeToSystemTime(PLARGE_INTEGER LocalTime,
|
||||
PLARGE_INTEGER SystemTime);
|
||||
|
||||
typedef unsigned int (exception_hook)(CONTEXT* c, unsigned int exp);
|
||||
unsigned int ExHookException(exception_hook fn, unsigned int exp);
|
||||
|
||||
INTERLOCKED_RESULT ExInterlockedDecrementLong(PLONG Addend,
|
||||
PKSPIN_LOCK Lock);
|
||||
ULONG ExInterlockedExchangeUlong(PULONG Target,
|
||||
ULONG Value,
|
||||
PKSPIN_LOCK Lock);
|
||||
INTERLOCKED_RESULT ExInterlockedIncrementLong(PLONG Addend,
|
||||
PKSPIN_LOCK Lock);
|
||||
BOOLEAN ExIsResourceAcquiredExclusiveLite(PERESOURCE Resource);
|
||||
BOOLEAN ExIsResourceAcquiredSharedLite(PERESOURCE Resource);
|
||||
USHORT ExQueryDepthSListHead(PSLIST_HEADER SListHead);
|
||||
|
||||
|
||||
|
|
|
@ -51,76 +51,20 @@ enum
|
|||
*/
|
||||
enum
|
||||
{
|
||||
/*
|
||||
* Read any data from the actual backing media
|
||||
*/
|
||||
IRP_NOCACHE,
|
||||
|
||||
/*
|
||||
* The I/O operation is performing paging
|
||||
*/
|
||||
IRP_PAGING_IO,
|
||||
|
||||
/*
|
||||
* The IRP is for a mount operation
|
||||
*/
|
||||
IRP_MOUNT_COMPLETION,
|
||||
|
||||
/*
|
||||
* The API expects synchronous behaviour
|
||||
*/
|
||||
IRP_SYNCHRONOUS_API,
|
||||
|
||||
/*
|
||||
* The IRP is associated with a larger operation
|
||||
*/
|
||||
IRP_ASSOCIATED_IRP,
|
||||
|
||||
/*
|
||||
* The AssociatedIrp.SystemBuffer field is valid
|
||||
*/
|
||||
IRP_BUFFERED_IO,
|
||||
|
||||
/*
|
||||
* The system buffer was allocated from pool and should be deallocated
|
||||
* by the I/O manager
|
||||
*/
|
||||
IRP_DEALLOCATE_BUFFER,
|
||||
|
||||
/*
|
||||
* The IRP is for an input operation
|
||||
*/
|
||||
IRP_INPUT_OPERATION,
|
||||
|
||||
/*
|
||||
* The paging operation should complete synchronously
|
||||
*/
|
||||
IRP_SYNCHRONOUS_PAGING_IO,
|
||||
|
||||
/*
|
||||
* The IRP represents a filesystem create operation
|
||||
*/
|
||||
IRP_CREATE_OPERATION,
|
||||
|
||||
/*
|
||||
* The IRP represents a filesystem read operation
|
||||
*/
|
||||
IRP_READ_OPERATION,
|
||||
|
||||
/*
|
||||
* The IRP represents a filesystem write operation
|
||||
*/
|
||||
IRP_WRITE_OPERATION,
|
||||
|
||||
/*
|
||||
* The IRP represents a filesystem close operation
|
||||
*/
|
||||
IRP_CLOSE_OPERATION,
|
||||
|
||||
/*
|
||||
* Asynchronous behavior is advised but not required
|
||||
*/
|
||||
IRP_DEFER_IO_COMPLETION,
|
||||
IRP_NOCACHE = 0x1,
|
||||
IRP_PAGING_IO = 0x2,
|
||||
IRP_MOUNT_COMPLETION = 0x4,
|
||||
IRP_SYNCHRONOUS_API = 0x8,
|
||||
IRP_ASSOCIATED_IRP = 0x10,
|
||||
IRP_BUFFERED_IO = 0x20,
|
||||
IRP_DEALLOCATE_BUFFER = 0x40,
|
||||
IRP_INPUT_OPERATION = 0x80,
|
||||
IRP_SYNCHRONOUS_PAGING_IO = 0x100,
|
||||
IRP_CREATE_OPERATION = 0x200,
|
||||
IRP_READ_OPERATION = 0x400,
|
||||
IRP_WRITE_OPERATION = 0x800,
|
||||
IRP_CLOSE_OPERATION = 0x1000,
|
||||
IRP_DEFER_IO_COMPLETION = 0x2000,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -128,52 +72,27 @@ enum
|
|||
*/
|
||||
enum
|
||||
{
|
||||
/*
|
||||
* Force an access check even if opened in kernel mode
|
||||
*/
|
||||
SL_FORCE_ACCESS_CHECK,
|
||||
|
||||
/*
|
||||
* The file being opened is a paging file
|
||||
*/
|
||||
SL_OPEN_PAGING_FILE,
|
||||
|
||||
SL_OPEN_TARGET_DIRECTORY,
|
||||
|
||||
SL_CASE_SENSITIVE,
|
||||
|
||||
SL_KEY_SPECIFIED,
|
||||
|
||||
SL_OVERRIDE_VERIFY_VOLUME,
|
||||
|
||||
SL_WRITE_THROUGH,
|
||||
|
||||
SL_FT_SEQUENTIAL_WRITE,
|
||||
|
||||
SL_FAIL_IMMEDIATELY,
|
||||
|
||||
SL_EXCLUSIVE_LOCK,
|
||||
|
||||
SL_RESTART_SCAN,
|
||||
|
||||
SL_RETURN_SINGLE_ENTRY,
|
||||
|
||||
SL_INDEX_SPECIFIED,
|
||||
|
||||
SL_WATCH_TREE,
|
||||
|
||||
SL_ALLOW_RAW_MOUNT,
|
||||
|
||||
SL_PENDING_RETURNED,
|
||||
|
||||
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_RESTART_SCAN = 0x400,
|
||||
SL_RETURN_SINGLE_ENTRY = 0x800,
|
||||
SL_INDEX_SPECIFIED = 0x1000,
|
||||
SL_WATCH_TREE = 0x2000,
|
||||
SL_ALLOW_RAW_MOUNT = 0x4000,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
SL_INVOKE_ON_SUCCESS = 1,
|
||||
SL_INVOKE_ON_ERROR = 2,
|
||||
SL_INVOKE_ON_CANCEL = 4,
|
||||
};
|
||||
#define SL_PENDING_RETURNED 0x01
|
||||
#define SL_INVOKE_ON_CANCEL 0x20
|
||||
#define SL_INVOKE_ON_SUCCESS 0x40
|
||||
#define SL_INVOKE_ON_ERROR 0x80
|
||||
|
||||
/*
|
||||
* Possible flags for the device object flags
|
||||
|
@ -187,56 +106,60 @@ enum
|
|||
/*
|
||||
* Possible device types
|
||||
*/
|
||||
enum
|
||||
{
|
||||
/*
|
||||
* Standard define types
|
||||
*/
|
||||
FILE_DEVICE_BEEP,
|
||||
FILE_DEVICE_CDROM,
|
||||
FILE_DEVICE_CONTROLLER,
|
||||
FILE_DEVICE_DISK,
|
||||
FILE_DEVICE_INPORT_PORT,
|
||||
FILE_DEVICE_KEYBOARD,
|
||||
FILE_DEVICE_MIDI_IN,
|
||||
FILE_DEVICE_MIDI_OUT,
|
||||
FILE_DEVICE_MOUSE,
|
||||
FILE_DEVICE_NULL,
|
||||
FILE_DEVICE_PARALLEL_PORT,
|
||||
FILE_DEVICE_PRINTER,
|
||||
FILE_DEVICE_SCANNER,
|
||||
FILE_DEVICE_SERIAL_MOUSE_PORT,
|
||||
FILE_DEVICE_SERIAL_PORT,
|
||||
FILE_DEVICE_SCREEN,
|
||||
FILE_DEVICE_TAPE,
|
||||
FILE_DEVICE_UNKNOWN,
|
||||
FILE_DEVICE_VIDEO,
|
||||
FILE_DEVICE_VIRTUAL_DISK,
|
||||
FILE_DEVICE_WAVE_IN,
|
||||
FILE_DEVICE_WAVE_OUT,
|
||||
FILE_DEVICE_8042_PORT,
|
||||
FILE_DEVICE_FILE_SYSTEM,
|
||||
#define FILE_DEVICE_BEEP 0x00000001
|
||||
#define FILE_DEVICE_CD_ROM 0x00000002
|
||||
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
|
||||
#define FILE_DEVICE_CONTROLLER 0x00000004
|
||||
#define FILE_DEVICE_DATALINK 0x00000005
|
||||
#define FILE_DEVICE_DFS 0x00000006
|
||||
#define FILE_DEVICE_DISK 0x00000007
|
||||
#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
|
||||
#define FILE_DEVICE_FILE_SYSTEM 0x00000009
|
||||
#define FILE_DEVICE_INPORT_PORT 0x0000000a
|
||||
#define FILE_DEVICE_KEYBOARD 0x0000000b
|
||||
#define FILE_DEVICE_MAILSLOT 0x0000000c
|
||||
#define FILE_DEVICE_MIDI_IN 0x0000000d
|
||||
#define FILE_DEVICE_MIDI_OUT 0x0000000e
|
||||
#define FILE_DEVICE_MOUSE 0x0000000f
|
||||
#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
|
||||
#define FILE_DEVICE_NAMED_PIPE 0x00000011
|
||||
#define FILE_DEVICE_NETWORK 0x00000012
|
||||
#define FILE_DEVICE_NETWORK_BROWSER 0x00000013
|
||||
#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
|
||||
#define FILE_DEVICE_NULL 0x00000015
|
||||
#define FILE_DEVICE_PARALLEL_PORT 0x00000016
|
||||
#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
|
||||
#define FILE_DEVICE_PRINTER 0x00000018
|
||||
#define FILE_DEVICE_SCANNER 0x00000019
|
||||
#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
|
||||
#define FILE_DEVICE_SERIAL_PORT 0x0000001b
|
||||
#define FILE_DEVICE_SCREEN 0x0000001c
|
||||
#define FILE_DEVICE_SOUND 0x0000001d
|
||||
#define FILE_DEVICE_STREAMS 0x0000001e
|
||||
#define FILE_DEVICE_TAPE 0x0000001f
|
||||
#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
|
||||
#define FILE_DEVICE_TRANSPORT 0x00000021
|
||||
#define FILE_DEVICE_UNKNOWN 0x00000022
|
||||
#define FILE_DEVICE_VIDEO 0x00000023
|
||||
#define FILE_DEVICE_VIRTUAL_DISK 0x00000024
|
||||
#define FILE_DEVICE_WAVE_IN 0x00000025
|
||||
#define FILE_DEVICE_WAVE_OUT 0x00000026
|
||||
#define FILE_DEVICE_8042_PORT 0x00000027
|
||||
#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
|
||||
#define FILE_DEVICE_BATTERY 0x00000029
|
||||
#define FILE_DEVICE_BUS_EXTENDER 0x0000002a
|
||||
#define FILE_DEVICE_MODEM 0x0000002b
|
||||
#define FILE_DEVICE_VDM 0x0000002c
|
||||
|
||||
/*
|
||||
* Values beyond this are reserved for ISVs
|
||||
*/
|
||||
FILE_DEVICE_FIRST_FREE = 32768
|
||||
};
|
||||
#define FILE_REMOVABLE_MEDIA 0x00000001
|
||||
#define FILE_READ_ONLY_DEVICE 0x00000002
|
||||
#define FILE_FLOPPY_DISKETTE 0x00000004
|
||||
#define FILE_WRITE_ONCE_MEDIA 0x00000008
|
||||
#define FILE_REMOTE_DEVICE 0x00000010
|
||||
#define FILE_DEVICE_IS_MOUNTED 0x00000020
|
||||
#define FILE_VIRTUAL_VOLUME 0x00000040
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Possible device characteristics
|
||||
*/
|
||||
enum
|
||||
{
|
||||
FILE_REMOVABLE_MEDIA = 0x1,
|
||||
FILE_READ_ONLY_DEVICE = 0x2,
|
||||
FILE_FLOPPY_DISKETTE = 0x4,
|
||||
FILE_WRITE_ONCE_MEDIA = 0x8,
|
||||
FILE_REMOTE_DEVICE = 0x10,
|
||||
};
|
||||
|
||||
/*
|
||||
* PURPOSE: Bus types
|
||||
*/
|
||||
|
@ -286,22 +209,123 @@ enum
|
|||
IRP_MJ_MAXIMUM_FUNCTION,
|
||||
};
|
||||
|
||||
enum
|
||||
/*
|
||||
* PURPOSE: Details about the result of a file open or create
|
||||
* Minor function numbers for IRP_MJ_FILE_SYSTEM_CONTROL
|
||||
*/
|
||||
{
|
||||
FILE_CREATED,
|
||||
// FILE_OPENED,
|
||||
FILE_OVERWRITTEN,
|
||||
FILE_SUPERSEDED,
|
||||
FILE_EXISTS,
|
||||
FILE_DOES_NOT_EXIST,
|
||||
};
|
||||
|
||||
#define IRP_MN_USER_FS_REQUEST 0x00
|
||||
#define IRP_MN_MOUNT_VOLUME 0x01
|
||||
#define IRP_MN_VERIFY_VOLUME 0x02
|
||||
#define IRP_MN_LOAD_FILE_SYSTEM 0x03
|
||||
|
||||
#define IO_DISK_INCREMENT 4
|
||||
|
||||
#define FILE_WORD_ALIGNMENT 0x0001
|
||||
|
||||
/*
|
||||
* File disposition values
|
||||
*/
|
||||
#define FILE_CREATED 0x0000
|
||||
#define FILE_OPENED 0x0001
|
||||
#define FILE_OVERWRITTEN 0x0002
|
||||
#define FILE_SUPERSEDED 0x0003
|
||||
#define FILE_DOES_NOT_EXIST 0x0004
|
||||
|
||||
|
||||
/*
|
||||
* file creation flags
|
||||
*/
|
||||
#define FILE_DIRECTORY_FILE 0x00000001
|
||||
#define FILE_WRITE_THROUGH 0x00000002
|
||||
#define FILE_SEQUENTIAL_ONLY 0x00000004
|
||||
#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
|
||||
|
||||
#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
|
||||
#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
|
||||
#define FILE_NON_DIRECTORY_FILE 0x00000040
|
||||
#define FILE_CREATE_TREE_CONNECTION 0x00000080
|
||||
|
||||
#define FILE_COMPLETE_IF_OPLOCKED 0x00000100
|
||||
#define FILE_NO_EA_KNOWLEDGE 0x00000200
|
||||
|
||||
#define FILE_RANDOM_ACCESS 0x00000800
|
||||
|
||||
#define FILE_DELETE_ON_CLOSE 0x00001000
|
||||
#define FILE_OPEN_BY_FILE_ID 0x00002000
|
||||
#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
|
||||
#define FILE_NO_COMPRESSION 0x00008000
|
||||
|
||||
#define FILE_RESERVE_OPFILTER 0x00100000
|
||||
#define FILE_TRANSACTED_MODE 0x00200000
|
||||
#define FILE_OPEN_OFFLINE_FILE 0x00400000
|
||||
|
||||
#define FILE_VALID_OPTION_FLAGS 0x007fffff
|
||||
#define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
|
||||
#define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
|
||||
#define FILE_VALID_SET_FLAGS 0x00001036
|
||||
|
||||
/*
|
||||
* file information
|
||||
*/
|
||||
#define FileDirectoryInformation 1
|
||||
#define FileFullDirectoryInformation 2
|
||||
#define FileBothDirectoryInformation 3
|
||||
#define FileBasicInformation 4
|
||||
#define FileStandardInformation 5
|
||||
#define FileInternalInformation 6
|
||||
#define FileEaInformation 7
|
||||
#define FileAccessInformation 8
|
||||
#define FileNameInformation 9
|
||||
#define FileRenameInformation 10
|
||||
#define FileLinkInformation 11
|
||||
#define FileNamesInformation 12
|
||||
#define FileDispositionInformation 13
|
||||
#define FilePositionInformation 14
|
||||
#define FileFullEaInformation 15
|
||||
#define FileModeInformation 16
|
||||
#define FileAlignmentInformation 17
|
||||
#define FileAllInformation 18
|
||||
#define FileAllocationInformation 19
|
||||
#define FileEndOfFileInformation 20
|
||||
#define FileAlternateNameInformation 21
|
||||
#define FileStreamInformation 22
|
||||
#define FilePipeInformation 23
|
||||
#define FilePipeLocalInformation 24
|
||||
#define FilePipeRemoteInformation 25
|
||||
#define FileMailslotQueryInformation 26
|
||||
#define FileMailslotSetInformation 27
|
||||
#define FileCompressionInformation 28
|
||||
#define FileCopyOnWriteInformation 29
|
||||
#define FileCompletionInformation 30
|
||||
#define FileMoveClusterInformation 31
|
||||
#define FileOleClassIdInformation 32
|
||||
#define FileOleStateBitsInformation 33
|
||||
#define FileNetworkOpenInformation 34
|
||||
#define FileObjectIdInformation 35
|
||||
#define FileOleAllInformation 36
|
||||
#define FileOleDirectoryInformation 37
|
||||
#define FileContentIndexInformation 38
|
||||
#define FileInheritContentIndexInformation 39
|
||||
#define FileOleInformation 40
|
||||
#define FileMaximumInformation 41
|
||||
|
||||
|
||||
|
||||
typedef ULONG FS_INFORMATION_CLASS;
|
||||
|
||||
/*
|
||||
* file system information class values
|
||||
*/
|
||||
#define FileFsVolumeInformation 1
|
||||
#define FileFsLabelInformation 2
|
||||
#define FileFsSizeInformation 3
|
||||
#define FileFsDeviceInformation 4
|
||||
#define FileFsAttributeInformation 5
|
||||
#define FileFsControlInformation 6
|
||||
#define FileFsQuotaQueryInformation 7
|
||||
#define FileFsQuotaSetInformation 8
|
||||
#define FileFsMaximumInformation 9
|
||||
|
||||
#define IRP_MN_QUERY_DIRECTORY 0x01
|
||||
#define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
/* IO MANAGER ***************************************************************/
|
||||
|
||||
BOOLEAN IoRaiseInformationalHardError(NTSTATUS ErrorStatus,
|
||||
PUNICODE_STRING String,
|
||||
PKTHREAD Thread);
|
||||
|
||||
|
||||
/*
|
||||
* FUNCTION: Registers the driver with WMI
|
||||
* ARGUMENTS:
|
||||
|
@ -503,7 +508,6 @@ NTSTATUS IoWritePartitionTable(PDEVICE_OBJECT DeviceObject,
|
|||
ULONG NumberOfHeads,
|
||||
struct _DRIVE_LAYOUT_INFORMATION* PBuffer);
|
||||
|
||||
typedef ULONG FS_INFORMATION_CLASS;
|
||||
|
||||
// Preliminary guess
|
||||
NTKERNELAPI NTSTATUS IoQueryFileVolumeInformation(IN PFILE_OBJECT FileObject,
|
||||
|
|
|
@ -155,4 +155,88 @@ VOID KeBugCheckEx(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
|
||||
// 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 ].
|
||||
|
||||
typedef struct _IOPM
|
||||
{
|
||||
UCHAR Bitmap[8192];
|
||||
} IOPM, *PIOPM;
|
||||
|
||||
/*
|
||||
* FUNCTION: Provides the kernel with a new access map for a driver
|
||||
* ARGUMENTS:
|
||||
* NewMap: = If FALSE the kernel's map is set to all disabled. If TRUE
|
||||
* the kernel disables access to a particular port.
|
||||
* IoPortMap = Caller supplies storage for the io permission map.
|
||||
* REMARKS
|
||||
* 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 ]. The IOPL determines
|
||||
* the minium privilege level required to perform IO prior to checking the permission map.
|
||||
*/
|
||||
void Ke386SetIoAccessMap(int NewMap, PIOPM *IoPermissionMap);
|
||||
|
||||
/*
|
||||
* FUNCTION: Queries the io permission map.
|
||||
* ARGUMENTS:
|
||||
* NewMap: = If FALSE the kernel's map is set to all disabled. If TRUE
|
||||
* the kernel disables access to a particular port.
|
||||
* IoPortMap = Caller supplies storage for the io permission map.
|
||||
* REMARKS
|
||||
* 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 ]. The IOPL determines
|
||||
* the minium privilege level required to perform IO prior to checking the permission map.
|
||||
*/
|
||||
void Ke386QueryIoAccessMap(BOOLEAN NewMap, PIOPM *IoPermissionMap);
|
||||
|
||||
/*
|
||||
* FUNCTION: Set the process IOPL
|
||||
* ARGUMENTS:
|
||||
* Eprocess = Pointer to a executive process object
|
||||
* EnableIo = Specify TRUE to enable IO and FALSE to disable
|
||||
*/
|
||||
NTSTATUS Ke386IoSetAccessProcess(PEPROCESS Eprocess, BOOLEAN EnableIo);
|
||||
|
||||
/*
|
||||
* FUNCTION: Releases a set of Global Descriptor Table Selectors
|
||||
* ARGUMENTS:
|
||||
* SelArray =
|
||||
* NumOfSelectors =
|
||||
*/
|
||||
NTSTATUS KeI386ReleaseGdtSelectors(
|
||||
OUT PULONG SelArray,
|
||||
IN ULONG NumOfSelectors
|
||||
);
|
||||
|
||||
/*
|
||||
* FUNCTION: Allocates a set of Global Descriptor Table Selectors
|
||||
* ARGUMENTS:
|
||||
* SelArray =
|
||||
* NumOfSelectors =
|
||||
*/
|
||||
NTSTATUS KeI386AllocateGdtSelectors(
|
||||
OUT PULONG SelArray,
|
||||
IN ULONG NumOfSelectors
|
||||
);
|
||||
|
||||
/*
|
||||
* FUNCTION: Raises a user mode exception
|
||||
* ARGUMENTS:
|
||||
* ExceptionCode = Status code of the exception
|
||||
*/
|
||||
void KeRaiseUserException(NTSTATUS ExceptionCode);
|
||||
|
||||
|
||||
#endif /* __INCLUDE_DDK_KEFUNCS_H */
|
||||
|
|
|
@ -101,65 +101,6 @@ typedef struct _KDEVICE_QUEUE
|
|||
KSPIN_LOCK Lock;
|
||||
} KDEVICE_QUEUE, *PKDEVICE_QUEUE;
|
||||
|
||||
#if RIGHT_DEFINITION_PROVIDED_ABOVE
|
||||
#define _KTHREAD _ETHREAD
|
||||
|
||||
typedef struct _KTHREAD
|
||||
/*
|
||||
* PURPOSE: Describes a thread of execution
|
||||
*/
|
||||
{
|
||||
CSHORT Type;
|
||||
CSHORT Size;
|
||||
|
||||
/*
|
||||
* PURPOSE: Head of the queue of apcs
|
||||
*/
|
||||
LIST_ENTRY ApcQueueHead;
|
||||
|
||||
/*
|
||||
* PURPOSE: Entry in the linked list of threads
|
||||
*/
|
||||
LIST_ENTRY Entry;
|
||||
|
||||
/*
|
||||
* PURPOSE: Current state of the thread
|
||||
*/
|
||||
ULONG State;
|
||||
|
||||
/*
|
||||
* PURPOSE: Priority modifier of the thread
|
||||
*/
|
||||
ULONG Priority;
|
||||
|
||||
/*
|
||||
* PURPOSE: Pointer to our process
|
||||
*/
|
||||
struct _EPROCESS* Process;
|
||||
|
||||
/*
|
||||
* PURPOSE: Handle of our process
|
||||
*/
|
||||
HANDLE ProcessHandle;
|
||||
|
||||
/*
|
||||
* PURPOSE: Thread affinity mask
|
||||
*/
|
||||
ULONG AffinityMask;
|
||||
|
||||
/*
|
||||
* PURPOSE: Saved thread context
|
||||
*/
|
||||
hal_thread_state context;
|
||||
|
||||
/*
|
||||
* PURPOSE: Timeout for the thread to be woken up
|
||||
*/
|
||||
signed long long int wake_time;
|
||||
|
||||
} KTHREAD, *PKTHREAD, *PETHREAD;
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct _KAPC
|
||||
{
|
||||
|
|
|
@ -1,6 +1,13 @@
|
|||
/* MEMORY MANAGMENT ******************************************************/
|
||||
|
||||
#include <internal/hal/page.h>
|
||||
#include <internal/mmhal.h>
|
||||
|
||||
BOOLEAN MmIsNonPagedSystemAddressValid(PVOID VirtualAddress);
|
||||
BOOLEAN MmIsThisAnNtAsSystem(VOID);
|
||||
|
||||
#define PAGE_ROUND_UP(x) ( (((ULONG)x)%PAGESIZE) ? ((((ULONG)x)&(~0xfff))+0x1000) : ((ULONG)x) )
|
||||
#define PAGE_ROUND_DOWN(x) (((ULONG)x)&(~0xfff))
|
||||
|
||||
|
||||
/*
|
||||
* FUNCTION: Determines if the given virtual address is page aligned
|
||||
|
|
|
@ -22,13 +22,6 @@ extern "C"
|
|||
|
||||
#define QUAD_PART(LI) (*(LONGLONG *)(&LI))
|
||||
|
||||
|
||||
#define IO_DISK_INCREMENT 4
|
||||
|
||||
#define FILE_WORD_ALIGNMENT 0x0001
|
||||
|
||||
#define FILE_OPENED 0x0001
|
||||
|
||||
#include <ddk/status.h>
|
||||
#include <ddk/ntdef.h>
|
||||
#include <ddk/defines.h>
|
||||
|
@ -41,6 +34,7 @@ extern "C"
|
|||
#include <ddk/iotypes.h>
|
||||
#include <ddk/extypes.h>
|
||||
#include <ddk/pstypes.h>
|
||||
#include <ddk/zwtypes.h>
|
||||
#include <ddk/ioctrl.h>
|
||||
#include <internal/hal/ddk.h>
|
||||
|
||||
|
@ -53,6 +47,7 @@ extern "C"
|
|||
#include <ddk/psfuncs.h>
|
||||
#include <ddk/obfuncs.h>
|
||||
#include <ddk/dbgfuncs.h>
|
||||
#include <ddk/sefuncs.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
|
|
|
@ -6,5 +6,8 @@ struct _ETHREAD;
|
|||
struct _EPROCESS;
|
||||
|
||||
#define NTKERNELAPI
|
||||
#define NTSYSAPI
|
||||
#define NTAPI
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* ARGUMENTS:
|
||||
* Object = Object's body
|
||||
*/
|
||||
VOID ObDeferenceObject(PVOID Object);
|
||||
VOID ObDereferenceObject(PVOID Object);
|
||||
|
||||
/*
|
||||
* FUNCTION: Performs access validation on an object handle and if access
|
||||
|
|
|
@ -96,27 +96,13 @@ typedef struct _OBJECT
|
|||
* PURPOSE: Header for every object managed by the object manager
|
||||
*/
|
||||
{
|
||||
/*
|
||||
* PURPOSE: Name of this entry
|
||||
*/
|
||||
UNICODE_STRING name;
|
||||
|
||||
/*
|
||||
* PURPOSE: Our entry in our parents list of subdirectory
|
||||
*/
|
||||
LIST_ENTRY entry;
|
||||
|
||||
/*
|
||||
* PURPOSE: Number of non-handle references to this object
|
||||
*/
|
||||
UNICODE_STRING Name;
|
||||
LIST_ENTRY Entry;
|
||||
ULONG RefCount;
|
||||
|
||||
/*
|
||||
* PURPOSE: Number of handles opened to this object
|
||||
*/
|
||||
ULONG HandleCount;
|
||||
|
||||
BOOLEAN Permanent;
|
||||
struct _DIRECTORY_OBJECT* Parent;
|
||||
POBJECT_TYPE ObjectType;
|
||||
|
||||
/*
|
||||
* PURPOSE: Object type
|
||||
|
@ -141,3 +127,9 @@ typedef struct _OBJECT_ATTRIBUTES {
|
|||
SECURITY_DESCRIPTOR *SecurityDescriptor;
|
||||
SECURITY_QUALITY_OF_SERVICE *SecurityQualityOfService;
|
||||
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
|
||||
|
||||
typedef struct _HANDLE_TABLE
|
||||
{
|
||||
LIST_ENTRY ListHead;
|
||||
KSPIN_LOCK ListLock;
|
||||
} HANDLE_TABLE, *PHANDLE_TABLE;
|
||||
|
|
|
@ -25,7 +25,7 @@ NTSTATUS PsCreateSystemThread(PHANDLE ThreadHandle,
|
|||
PKSTART_ROUTINE StartRoutine,
|
||||
PVOID StartContext);
|
||||
NTSTATUS PsTerminateSystemThread(NTSTATUS ExitStatus);
|
||||
NTSTATUS PsSuspendThread(VOID);
|
||||
NTSTATUS PsWakeThread(PETHREAD Thread);
|
||||
VOID PsSuspendThread(PETHREAD Thread);
|
||||
VOID PsResumeThread(PETHREAD Thread);
|
||||
PETHREAD PsGetCurrentThread(VOID);
|
||||
struct _EPROCESS* PsGetCurrentProcess(VOID);
|
||||
|
|
|
@ -131,7 +131,7 @@ typedef struct _KTHREAD
|
|||
ULONG Quantum;
|
||||
UCHAR ThreadState; //Thread state is a typeless enum, otherwise it should be const integer
|
||||
ULONG FreezeCount;
|
||||
ULONG SuspendCount;
|
||||
LONG SuspendCount;
|
||||
PTRAP_FRAME TrapFrame;
|
||||
PVOID *Tls;
|
||||
KWAIT_BLOCK WaitBlock[4];
|
||||
|
@ -149,6 +149,7 @@ typedef struct _KTHREAD
|
|||
*/
|
||||
hal_thread_state Context;
|
||||
LIST_ENTRY Entry;
|
||||
ULONG LastTick;
|
||||
} KTHREAD, *PKTHREAD;
|
||||
|
||||
|
||||
|
@ -255,7 +256,8 @@ typedef struct _ETHREAD {
|
|||
} ETHREAD, *PETHREAD;
|
||||
|
||||
|
||||
typedef struct _KPROCESS {
|
||||
typedef struct _KPROCESS
|
||||
{
|
||||
DISPATCHER_HEADER DispatcherHeader;
|
||||
PVOID PageTableDirectory; // FIXME: I shoud point to a PTD
|
||||
TIME ElapsedTime;
|
||||
|
@ -275,6 +277,7 @@ typedef struct _KPROCESS {
|
|||
* Added by David Welch (welch@mcmail.com)
|
||||
*/
|
||||
LIST_ENTRY MemoryAreaList;
|
||||
HANDLE_TABLE HandleTable;
|
||||
} KPROCESS, *PKPROCESS;
|
||||
|
||||
typedef struct _EPROCESS
|
||||
|
|
|
@ -14,10 +14,6 @@
|
|||
typedef ULONG ACCESS_MODE, *PACCESS_MODE;
|
||||
typedef SECURITY_QUALITY_OF_SERVICE* PSECURITY_QUALITY_OF_SERVICE;
|
||||
|
||||
typedef struct _SECURITY_SUBJECT_CONTEXT
|
||||
{
|
||||
} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
|
||||
|
||||
typedef struct _SECURITY_DESCRIPTOR_CONTEXT
|
||||
{
|
||||
} SECURITY_DESCRIPTOR_CONTEXT, *PSECURITY_DESCRIPTOR_CONTEXT;
|
||||
|
@ -44,4 +40,13 @@ typedef struct _ACCESS_TOKEN {
|
|||
UCHAR VariablePart[0];
|
||||
} ACCESS_TOKEN, *PACCESS_TOKEN;
|
||||
|
||||
|
||||
typedef struct _SECURITY_SUBJECT_CONTEXT
|
||||
{
|
||||
PACCESS_TOKEN ClientToken;
|
||||
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
|
||||
PACCESS_TOKEN PrimaryToken;
|
||||
PVOID ProcessAuditId;
|
||||
} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
|
||||
|
||||
#endif
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -32,6 +32,224 @@
|
|||
#ifndef _GNU_H_WINDOWS32_DEFINES
|
||||
#define _GNU_H_WINDOWS32_DEFINES
|
||||
|
||||
#define WINBASEAPI
|
||||
|
||||
#define EXCEPTION_MAXIMUM_PARAMETERS (15)
|
||||
#define ANYSIZE_ARRAY (1)
|
||||
|
||||
#define STATUS_WAIT_0 (0x00000000L)
|
||||
#define STATUS_ABANDONED_WAIT_0 (0x00000080L)
|
||||
#define STATUS_USER_APC (0x000000C0L)
|
||||
#define STATUS_TIMEOUT (0x00000102L)
|
||||
#define STATUS_PENDING (0x00000103L)
|
||||
#define STATUS_GUARD_PAGE_VIOLATION (0x80000001L)
|
||||
#define STATUS_DATATYPE_MISALIGNMENT (0x80000002L)
|
||||
#define STATUS_BREAKPOINT (0x80000003L)
|
||||
#define STATUS_SINGLE_STEP (0x80000004L)
|
||||
#define STATUS_IN_PAGE_ERROR (0xC0000006L)
|
||||
#define STATUS_INVALID_HANDLE (0xC0000008L)
|
||||
#define STATUS_ILLEGAL_INSTRUCTION (0xC000001DL)
|
||||
#define STATUS_NONCONTINUABLE_EXCEPTION (0xC0000025L)
|
||||
#define STATUS_INVALID_DISPOSITION (0xC0000026L)
|
||||
#define STATUS_ARRAY_BOUNDS_EXCEEDED (0xC000008CL)
|
||||
#define STATUS_FLOAT_DENORMAL_OPERAND (0xC000008DL)
|
||||
#define STATUS_FLOAT_DIVIDE_BY_ZERO (0xC000008EL)
|
||||
#define STATUS_FLOAT_INEXACT_RESULT (0xC000008FL)
|
||||
#define STATUS_FLOAT_INVALID_OPERATION (0xC0000090L)
|
||||
#define STATUS_FLOAT_OVERFLOW (0xC0000091L)
|
||||
#define STATUS_FLOAT_STACK_CHECK (0xC0000092L)
|
||||
#define STATUS_FLOAT_UNDERFLOW (0xC0000093L)
|
||||
#define STATUS_INTEGER_DIVIDE_BY_ZERO (0xC0000094L)
|
||||
#define STATUS_INTEGER_OVERFLOW (0xC0000095L)
|
||||
#define STATUS_PRIVILEGED_INSTRUCTION (0xC0000096L)
|
||||
#define STATUS_STACK_OVERFLOW (0xC00000FDL)
|
||||
#define STATUS_CONTROL_C_EXIT (0xC000013AL)
|
||||
|
||||
#define SEC_COMMIT (134217728)
|
||||
#define SEC_IMAGE (16777216)
|
||||
#define SEC_NOCACHE (268435456)
|
||||
#define SEC_RESERVE (67108864)
|
||||
#define PAGE_READONLY (2)
|
||||
#define PAGE_READWRITE (4)
|
||||
#define PAGE_WRITECOPY (8)
|
||||
#define PAGE_EXECUTE (16)
|
||||
#define PAGE_EXECUTE_READ (32)
|
||||
#define PAGE_EXECUTE_READWRITE (64)
|
||||
#define PAGE_EXECUTE_WRITECOPY (128)
|
||||
#define PAGE_GUARD (256)
|
||||
#define PAGE_NOACCESS (1)
|
||||
#define PAGE_NOCACHE (512)
|
||||
#define MEM_COMMIT (4096)
|
||||
#define MEM_FREE (65536)
|
||||
#define MEM_RESERVE (8192)
|
||||
#define MEM_IMAGE (16777216)
|
||||
#define MEM_MAPPED (262144)
|
||||
#define MEM_PRIVATE (131072)
|
||||
#define MEM_DECOMMIT (16384)
|
||||
#define MEM_RELEASE (32768)
|
||||
#define MEM_TOP_DOWN (1048576)
|
||||
#define EXCEPTION_GUARD_PAGE (0x80000001L)
|
||||
#define SECTION_EXTEND_SIZE (0x10)
|
||||
#define SECTION_MAP_READ (0x4)
|
||||
#define SECTION_MAP_WRITE (0x2)
|
||||
#define SECTION_QUERY (0x1)
|
||||
#define SECTION_ALL_ACCESS (0xf001fL)
|
||||
|
||||
|
||||
/* DuplicateHandle, MapViewOfFile */
|
||||
#define DUPLICATE_CLOSE_SOURCE (1)
|
||||
#define DUPLICATE_SAME_ACCESS (2)
|
||||
#define FILE_MAP_ALL_ACCESS (0xf001fL)
|
||||
#define FILE_MAP_READ (4)
|
||||
#define FILE_MAP_WRITE (2)
|
||||
#define FILE_MAP_COPY (1)
|
||||
#define MUTEX_ALL_ACCESS (0x1f0001L)
|
||||
#define MUTEX_MODIFY_STATE (1)
|
||||
#define SYNCHRONIZE (0x100000L)
|
||||
#define SEMAPHORE_ALL_ACCESS (0x1f0003L)
|
||||
#define SEMAPHORE_MODIFY_STATE (2)
|
||||
#define EVENT_ALL_ACCESS (0x1f0003L)
|
||||
#define EVENT_MODIFY_STATE (2)
|
||||
#define KEY_ALL_ACCESS (0xf003fL)
|
||||
#define KEY_CREATE_LINK (32)
|
||||
#define KEY_CREATE_SUB_KEY (4)
|
||||
#define KEY_ENUMERATE_SUB_KEYS (8)
|
||||
#define KEY_EXECUTE (0x20019L)
|
||||
#define KEY_NOTIFY (16)
|
||||
#define KEY_QUERY_VALUE (1)
|
||||
#define KEY_READ (0x20019L)
|
||||
#define KEY_SET_VALUE (2)
|
||||
#define KEY_WRITE (0x20006L)
|
||||
#define PROCESS_ALL_ACCESS (0x1f0fffL)
|
||||
#define PROCESS_CREATE_PROCESS (128)
|
||||
#define PROCESS_CREATE_THREAD (2)
|
||||
#define PROCESS_DUP_HANDLE (64)
|
||||
#define PROCESS_QUERY_INFORMATION (1024)
|
||||
#define PROCESS_SET_INFORMATION (512)
|
||||
#define PROCESS_TERMINATE (1)
|
||||
#define PROCESS_VM_OPERATION (8)
|
||||
#define PROCESS_VM_READ (16)
|
||||
#define PROCESS_VM_WRITE (32)
|
||||
#define THREAD_ALL_ACCESS (0x1f03ffL)
|
||||
#define THREAD_DIRECT_IMPERSONATION (512)
|
||||
#define THREAD_GET_CONTEXT (8)
|
||||
#define THREAD_IMPERSONATE (256)
|
||||
#define THREAD_QUERY_INFORMATION (64)
|
||||
#define THREAD_SET_CONTEXT (16)
|
||||
#define THREAD_SET_INFORMATION (32)
|
||||
#define THREAD_SET_THREAD_TOKEN (128)
|
||||
#define THREAD_SUSPEND_RESUME (2)
|
||||
#define THREAD_TERMINATE (1)
|
||||
|
||||
#define PACKED __attribute__((packed))
|
||||
|
||||
#define THREAD_PRIORITY_ABOVE_NORMAL (1)
|
||||
#define THREAD_PRIORITY_BELOW_NORMAL (-1)
|
||||
#define THREAD_PRIORITY_HIGHEST (2)
|
||||
#define THREAD_PRIORITY_IDLE (-15)
|
||||
#define THREAD_PRIORITY_LOWEST (-2)
|
||||
#define THREAD_PRIORITY_NORMAL (0)
|
||||
#define THREAD_PRIORITY_TIME_CRITICAL (15)
|
||||
#define THREAD_PRIORITY_ERROR_RETURN (2147483647)
|
||||
|
||||
/* CreateFile, GetFileAttributes, SetFileAttributes */
|
||||
#define GENERIC_READ (0x80000000L)
|
||||
#define GENERIC_WRITE (0x40000000L)
|
||||
#define FILE_READ_DATA ( 0x0001 ) /* file & pipe */
|
||||
#define FILE_LIST_DIRECTORY ( 0x0001 ) /* directory */
|
||||
|
||||
#define FILE_WRITE_DATA ( 0x0002 ) /* file & pipe */
|
||||
#define FILE_ADD_FILE ( 0x0002 ) /* directory */
|
||||
|
||||
#define FILE_APPEND_DATA ( 0x0004 ) /* file */
|
||||
#define FILE_ADD_SUBDIRECTORY ( 0x0004 ) /* directory */
|
||||
#define FILE_CREATE_PIPE_INSTANCE ( 0x0004 ) /* named pipe */
|
||||
|
||||
#define FILE_READ_EA ( 0x0008 ) /* file & directory */
|
||||
#define FILE_READ_PROPERTIES FILE_READ_EA
|
||||
|
||||
#define FILE_WRITE_EA ( 0x0010 ) /* file & directory */
|
||||
#define FILE_WRITE_PROPERTIES FILE_WRITE_EA
|
||||
|
||||
#define FILE_EXECUTE ( 0x0020 ) /* file */
|
||||
#define FILE_TRAVERSE ( 0x0020 ) /* directory */
|
||||
|
||||
#define FILE_DELETE_CHILD ( 0x0040 ) /* directory */
|
||||
|
||||
#define FILE_READ_ATTRIBUTES ( 0x0080 ) /* all */
|
||||
|
||||
#define FILE_WRITE_ATTRIBUTES ( 0x0100 ) /* all */
|
||||
|
||||
#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
|
||||
|
||||
#define FILE_GENERIC_READ (STANDARD_RIGHTS_READ |\
|
||||
FILE_READ_DATA |\
|
||||
FILE_READ_ATTRIBUTES |\
|
||||
FILE_READ_EA |\
|
||||
SYNCHRONIZE)
|
||||
|
||||
|
||||
#define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
|
||||
FILE_WRITE_DATA |\
|
||||
FILE_WRITE_ATTRIBUTES |\
|
||||
FILE_WRITE_EA |\
|
||||
FILE_APPEND_DATA |\
|
||||
SYNCHRONIZE)
|
||||
|
||||
|
||||
#define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
|
||||
FILE_READ_ATTRIBUTES |\
|
||||
FILE_EXECUTE |\
|
||||
SYNCHRONIZE)
|
||||
|
||||
#define FILE_SHARE_DELETE (4)
|
||||
#define FILE_SHARE_READ (1)
|
||||
#define FILE_SHARE_WRITE (2)
|
||||
#define CONSOLE_TEXTMODE_BUFFER (1)
|
||||
#define CREATE_NEW (1)
|
||||
#define CREATE_ALWAYS (2)
|
||||
#define OPEN_EXISTING (3)
|
||||
#define OPEN_ALWAYS (4)
|
||||
#define TRUNCATE_EXISTING (5)
|
||||
#define FILE_ATTRIBUTE_ARCHIVE (32)
|
||||
#define FILE_ATTRIBUTE_COMPRESSED (2048)
|
||||
#define FILE_ATTRIBUTE_NORMAL (128)
|
||||
#define FILE_ATTRIBUTE_DIRECTORY (16)
|
||||
#define FILE_ATTRIBUTE_HIDDEN (2)
|
||||
#define FILE_ATTRIBUTE_READONLY (1)
|
||||
#define FILE_ATTRIBUTE_SYSTEM (4)
|
||||
#define FILE_ATTRIBUTE_TEMPORARY (256)
|
||||
#define FILE_FLAG_WRITE_THROUGH (2147483648)
|
||||
#define FILE_FLAG_OVERLAPPED (1073741824)
|
||||
#define FILE_FLAG_NO_BUFFERING (536870912)
|
||||
#define FILE_FLAG_RANDOM_ACCESS (268435456)
|
||||
#define FILE_FLAG_SEQUENTIAL_SCAN (134217728)
|
||||
#define FILE_FLAG_DELETE_ON_CLOSE (67108864)
|
||||
#define FILE_FLAG_BACKUP_SEMANTICS (33554432)
|
||||
#define FILE_FLAG_POSIX_SEMANTICS (16777216)
|
||||
#define SECURITY_ANONYMOUS (0)
|
||||
#define SECURITY_IDENTIFICATION (65536)
|
||||
#define SECURITY_IMPERSONATION (131072)
|
||||
#define SECURITY_DELEGATION (196608)
|
||||
#define SECURITY_CONTEXT_TRACKING (262144)
|
||||
#define SECURITY_EFFECTIVE_ONLY (524288)
|
||||
#define SECURITY_SQOS_PRESENT (1048576)
|
||||
|
||||
/* Standard rights */
|
||||
#define STANDARD_RIGHTS_REQUIRED (0xf0000L)
|
||||
#define STANDARD_RIGHTS_WRITE (0x20000L)
|
||||
#define STANDARD_RIGHTS_READ (0x20000L)
|
||||
#define STANDARD_RIGHTS_EXECUTE (0x20000L)
|
||||
#define STANDARD_RIGHTS_ALL (0x1f0000L)
|
||||
#define SPECIFIC_RIGHTS_ALL (0xffffL)
|
||||
|
||||
/* ACCESS_MASK */
|
||||
#define MAXIMUM_ALLOWED (0x2000000L)
|
||||
#define GENERIC_ALL (0x10000000L)
|
||||
|
||||
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
@ -45,7 +263,6 @@ extern "C" {
|
|||
#define SECURITY_DYNAMIC_TRACKING (1)
|
||||
#define MAX_DEFAULTCHAR (2)
|
||||
#define MAX_LEADBYTES (12)
|
||||
#define EXCEPTION_MAXIMUM_PARAMETERS (15)
|
||||
#define CCHDEVICENAME (32)
|
||||
#define CCHFORMNAME (32)
|
||||
#define MENU_TEXT_LEN (40)
|
||||
|
@ -54,7 +271,6 @@ extern "C" {
|
|||
#define NETBIOS_NAME_LEN (16)
|
||||
#define OFS_MAXPATHNAME (128)
|
||||
#define MAX_TAB_STOPS (32)
|
||||
#define ANYSIZE_ARRAY (1)
|
||||
#define RAS_MaxCallbackNumber (128)
|
||||
#define RAS_MaxDeviceName (128)
|
||||
#define RAS_MaxDeviceType (16)
|
||||
|
@ -382,119 +598,7 @@ extern "C" {
|
|||
#define DIB_PAL_COLORS (1)
|
||||
#define DIB_RGB_COLORS (0)
|
||||
|
||||
/* CreateFile, GetFileAttributes, SetFileAttributes */
|
||||
#define GENERIC_READ (0x80000000L)
|
||||
#define GENERIC_WRITE (0x40000000L)
|
||||
#define FILE_READ_DATA ( 0x0001 ) /* file & pipe */
|
||||
#define FILE_LIST_DIRECTORY ( 0x0001 ) /* directory */
|
||||
|
||||
#define FILE_WRITE_DATA ( 0x0002 ) /* file & pipe */
|
||||
#define FILE_ADD_FILE ( 0x0002 ) /* directory */
|
||||
|
||||
#define FILE_APPEND_DATA ( 0x0004 ) /* file */
|
||||
#define FILE_ADD_SUBDIRECTORY ( 0x0004 ) /* directory */
|
||||
#define FILE_CREATE_PIPE_INSTANCE ( 0x0004 ) /* named pipe */
|
||||
|
||||
#define FILE_READ_EA ( 0x0008 ) /* file & directory */
|
||||
#define FILE_READ_PROPERTIES FILE_READ_EA
|
||||
|
||||
#define FILE_WRITE_EA ( 0x0010 ) /* file & directory */
|
||||
#define FILE_WRITE_PROPERTIES FILE_WRITE_EA
|
||||
|
||||
#define FILE_EXECUTE ( 0x0020 ) /* file */
|
||||
#define FILE_TRAVERSE ( 0x0020 ) /* directory */
|
||||
|
||||
#define FILE_DELETE_CHILD ( 0x0040 ) /* directory */
|
||||
|
||||
#define FILE_READ_ATTRIBUTES ( 0x0080 ) /* all */
|
||||
|
||||
#define FILE_WRITE_ATTRIBUTES ( 0x0100 ) /* all */
|
||||
|
||||
#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
|
||||
|
||||
#define FILE_GENERIC_READ (STANDARD_RIGHTS_READ |\
|
||||
FILE_READ_DATA |\
|
||||
FILE_READ_ATTRIBUTES |\
|
||||
FILE_READ_EA |\
|
||||
SYNCHRONIZE)
|
||||
|
||||
|
||||
#define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
|
||||
FILE_WRITE_DATA |\
|
||||
FILE_WRITE_ATTRIBUTES |\
|
||||
FILE_WRITE_EA |\
|
||||
FILE_APPEND_DATA |\
|
||||
SYNCHRONIZE)
|
||||
|
||||
|
||||
#define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
|
||||
FILE_READ_ATTRIBUTES |\
|
||||
FILE_EXECUTE |\
|
||||
SYNCHRONIZE)
|
||||
|
||||
#define FILE_SHARE_DELETE (4)
|
||||
#define FILE_SHARE_READ (1)
|
||||
#define FILE_SHARE_WRITE (2)
|
||||
#define CONSOLE_TEXTMODE_BUFFER (1)
|
||||
#define CREATE_NEW (1)
|
||||
#define CREATE_ALWAYS (2)
|
||||
#define OPEN_EXISTING (3)
|
||||
#define OPEN_ALWAYS (4)
|
||||
#define TRUNCATE_EXISTING (5)
|
||||
#define FILE_ATTRIBUTE_ARCHIVE (32)
|
||||
#define FILE_ATTRIBUTE_COMPRESSED (2048)
|
||||
#define FILE_ATTRIBUTE_NORMAL (128)
|
||||
#define FILE_ATTRIBUTE_DIRECTORY (16)
|
||||
#define FILE_ATTRIBUTE_HIDDEN (2)
|
||||
#define FILE_ATTRIBUTE_READONLY (1)
|
||||
#define FILE_ATTRIBUTE_SYSTEM (4)
|
||||
#define FILE_ATTRIBUTE_TEMPORARY (256)
|
||||
#define FILE_FLAG_WRITE_THROUGH (2147483648)
|
||||
#define FILE_FLAG_OVERLAPPED (1073741824)
|
||||
#define FILE_FLAG_NO_BUFFERING (536870912)
|
||||
#define FILE_FLAG_RANDOM_ACCESS (268435456)
|
||||
#define FILE_FLAG_SEQUENTIAL_SCAN (134217728)
|
||||
#define FILE_FLAG_DELETE_ON_CLOSE (67108864)
|
||||
#define FILE_FLAG_BACKUP_SEMANTICS (33554432)
|
||||
#define FILE_FLAG_POSIX_SEMANTICS (16777216)
|
||||
#define SECURITY_ANONYMOUS (0)
|
||||
#define SECURITY_IDENTIFICATION (65536)
|
||||
#define SECURITY_IMPERSONATION (131072)
|
||||
#define SECURITY_DELEGATION (196608)
|
||||
#define SECURITY_CONTEXT_TRACKING (262144)
|
||||
#define SECURITY_EFFECTIVE_ONLY (524288)
|
||||
#define SECURITY_SQOS_PRESENT (1048576)
|
||||
|
||||
/* CreateFileMapping, VirtualAlloc, VirtualFree, VirtualProtect */
|
||||
#define SEC_COMMIT (134217728)
|
||||
#define SEC_IMAGE (16777216)
|
||||
#define SEC_NOCACHE (268435456)
|
||||
#define SEC_RESERVE (67108864)
|
||||
#define PAGE_READONLY (2)
|
||||
#define PAGE_READWRITE (4)
|
||||
#define PAGE_WRITECOPY (8)
|
||||
#define PAGE_EXECUTE (16)
|
||||
#define PAGE_EXECUTE_READ (32)
|
||||
#define PAGE_EXECUTE_READWRITE (64)
|
||||
#define PAGE_EXECUTE_WRITECOPY (128)
|
||||
#define PAGE_GUARD (256)
|
||||
#define PAGE_NOACCESS (1)
|
||||
#define PAGE_NOCACHE (512)
|
||||
#define MEM_COMMIT (4096)
|
||||
#define MEM_FREE (65536)
|
||||
#define MEM_RESERVE (8192)
|
||||
#define MEM_IMAGE (16777216)
|
||||
#define MEM_MAPPED (262144)
|
||||
#define MEM_PRIVATE (131072)
|
||||
#define MEM_DECOMMIT (16384)
|
||||
#define MEM_RELEASE (32768)
|
||||
#define MEM_TOP_DOWN (1048576)
|
||||
#define EXCEPTION_GUARD_PAGE (0x80000001L)
|
||||
#define SECTION_EXTEND_SIZE (0x10)
|
||||
#define SECTION_MAP_READ (0x4)
|
||||
#define SECTION_MAP_WRITE (0x2)
|
||||
#define SECTION_QUERY (0x1)
|
||||
#define SECTION_ALL_ACCESS (0xf001fL)
|
||||
|
||||
/* CreateFont */
|
||||
#define FW_DONTCARE (0)
|
||||
|
@ -1051,50 +1155,6 @@ extern "C" {
|
|||
#define DT_WORDBREAK (16)
|
||||
#define DT_INTERNAL (4096)
|
||||
|
||||
/* DuplicateHandle, MapViewOfFile */
|
||||
#define DUPLICATE_CLOSE_SOURCE (1)
|
||||
#define DUPLICATE_SAME_ACCESS (2)
|
||||
#define FILE_MAP_ALL_ACCESS (0xf001fL)
|
||||
#define FILE_MAP_READ (4)
|
||||
#define FILE_MAP_WRITE (2)
|
||||
#define FILE_MAP_COPY (1)
|
||||
#define MUTEX_ALL_ACCESS (0x1f0001L)
|
||||
#define MUTEX_MODIFY_STATE (1)
|
||||
#define SYNCHRONIZE (0x100000L)
|
||||
#define SEMAPHORE_ALL_ACCESS (0x1f0003L)
|
||||
#define SEMAPHORE_MODIFY_STATE (2)
|
||||
#define EVENT_ALL_ACCESS (0x1f0003L)
|
||||
#define EVENT_MODIFY_STATE (2)
|
||||
#define KEY_ALL_ACCESS (0xf003fL)
|
||||
#define KEY_CREATE_LINK (32)
|
||||
#define KEY_CREATE_SUB_KEY (4)
|
||||
#define KEY_ENUMERATE_SUB_KEYS (8)
|
||||
#define KEY_EXECUTE (0x20019L)
|
||||
#define KEY_NOTIFY (16)
|
||||
#define KEY_QUERY_VALUE (1)
|
||||
#define KEY_READ (0x20019L)
|
||||
#define KEY_SET_VALUE (2)
|
||||
#define KEY_WRITE (0x20006L)
|
||||
#define PROCESS_ALL_ACCESS (0x1f0fffL)
|
||||
#define PROCESS_CREATE_PROCESS (128)
|
||||
#define PROCESS_CREATE_THREAD (2)
|
||||
#define PROCESS_DUP_HANDLE (64)
|
||||
#define PROCESS_QUERY_INFORMATION (1024)
|
||||
#define PROCESS_SET_INFORMATION (512)
|
||||
#define PROCESS_TERMINATE (1)
|
||||
#define PROCESS_VM_OPERATION (8)
|
||||
#define PROCESS_VM_READ (16)
|
||||
#define PROCESS_VM_WRITE (32)
|
||||
#define THREAD_ALL_ACCESS (0x1f03ffL)
|
||||
#define THREAD_DIRECT_IMPERSONATION (512)
|
||||
#define THREAD_GET_CONTEXT (8)
|
||||
#define THREAD_IMPERSONATE (256)
|
||||
#define THREAD_QUERY_INFORMATION (64)
|
||||
#define THREAD_SET_CONTEXT (16)
|
||||
#define THREAD_SET_INFORMATION (32)
|
||||
#define THREAD_SET_THREAD_TOKEN (128)
|
||||
#define THREAD_SUSPEND_RESUME (2)
|
||||
#define THREAD_TERMINATE (1)
|
||||
|
||||
/* EditWordBreakProc */
|
||||
#define WB_ISDELIMITER (2)
|
||||
|
@ -1902,14 +1962,6 @@ extern "C" {
|
|||
#define VTA_CENTER (6)
|
||||
|
||||
/* GetThreadPriority */
|
||||
#define THREAD_PRIORITY_ABOVE_NORMAL (1)
|
||||
#define THREAD_PRIORITY_BELOW_NORMAL (-1)
|
||||
#define THREAD_PRIORITY_HIGHEST (2)
|
||||
#define THREAD_PRIORITY_IDLE (-15)
|
||||
#define THREAD_PRIORITY_LOWEST (-2)
|
||||
#define THREAD_PRIORITY_NORMAL (0)
|
||||
#define THREAD_PRIORITY_TIME_CRITICAL (15)
|
||||
#define THREAD_PRIORITY_ERROR_RETURN (2147483647)
|
||||
#define TLS_MINIMUM_AVAILABLE (64)
|
||||
|
||||
/* GetTimeFormat */
|
||||
|
@ -4110,17 +4162,6 @@ extern "C" {
|
|||
#define TAPE_DRIVE_WRITE_SETMARKS (-2130706432)
|
||||
#define TAPE_DRIVE_WRITE_SHORT_FMKS (-2080374784)
|
||||
|
||||
/* Standard rights */
|
||||
#define STANDARD_RIGHTS_REQUIRED (0xf0000L)
|
||||
#define STANDARD_RIGHTS_WRITE (0x20000L)
|
||||
#define STANDARD_RIGHTS_READ (0x20000L)
|
||||
#define STANDARD_RIGHTS_EXECUTE (0x20000L)
|
||||
#define STANDARD_RIGHTS_ALL (0x1f0000L)
|
||||
#define SPECIFIC_RIGHTS_ALL (0xffffL)
|
||||
|
||||
/* ACCESS_MASK */
|
||||
#define MAXIMUM_ALLOWED (0x2000000L)
|
||||
#define GENERIC_ALL (0x10000000L)
|
||||
|
||||
/* SID */
|
||||
#define SECURITY_NULL_RID (0L)
|
||||
|
@ -5052,33 +5093,6 @@ extern "C" {
|
|||
|
||||
#define POLYFILL_LAST (2)
|
||||
|
||||
#define STATUS_WAIT_0 (0x00000000L)
|
||||
#define STATUS_ABANDONED_WAIT_0 (0x00000080L)
|
||||
#define STATUS_USER_APC (0x000000C0L)
|
||||
#define STATUS_TIMEOUT (0x00000102L)
|
||||
#define STATUS_PENDING (0x00000103L)
|
||||
#define STATUS_GUARD_PAGE_VIOLATION (0x80000001L)
|
||||
#define STATUS_DATATYPE_MISALIGNMENT (0x80000002L)
|
||||
#define STATUS_BREAKPOINT (0x80000003L)
|
||||
#define STATUS_SINGLE_STEP (0x80000004L)
|
||||
#define STATUS_IN_PAGE_ERROR (0xC0000006L)
|
||||
#define STATUS_INVALID_HANDLE (0xC0000008L)
|
||||
#define STATUS_ILLEGAL_INSTRUCTION (0xC000001DL)
|
||||
#define STATUS_NONCONTINUABLE_EXCEPTION (0xC0000025L)
|
||||
#define STATUS_INVALID_DISPOSITION (0xC0000026L)
|
||||
#define STATUS_ARRAY_BOUNDS_EXCEEDED (0xC000008CL)
|
||||
#define STATUS_FLOAT_DENORMAL_OPERAND (0xC000008DL)
|
||||
#define STATUS_FLOAT_DIVIDE_BY_ZERO (0xC000008EL)
|
||||
#define STATUS_FLOAT_INEXACT_RESULT (0xC000008FL)
|
||||
#define STATUS_FLOAT_INVALID_OPERATION (0xC0000090L)
|
||||
#define STATUS_FLOAT_OVERFLOW (0xC0000091L)
|
||||
#define STATUS_FLOAT_STACK_CHECK (0xC0000092L)
|
||||
#define STATUS_FLOAT_UNDERFLOW (0xC0000093L)
|
||||
#define STATUS_INTEGER_DIVIDE_BY_ZERO (0xC0000094L)
|
||||
#define STATUS_INTEGER_OVERFLOW (0xC0000095L)
|
||||
#define STATUS_PRIVILEGED_INSTRUCTION (0xC0000096L)
|
||||
#define STATUS_STACK_OVERFLOW (0xC00000FDL)
|
||||
#define STATUS_CONTROL_C_EXIT (0xC000013AL)
|
||||
|
||||
#define EXCEPTION_CTRL_C
|
||||
|
||||
|
@ -5139,7 +5153,6 @@ DECLARE_HANDLE(HANDLE);
|
|||
|
||||
#define ASCIICHAR AsciiChar
|
||||
#define FAR
|
||||
#define PACKED __attribute__((packed))
|
||||
|
||||
#define FILTER_TEMP_DUPLICATE_ACCOUNT (0x0001)
|
||||
#define FILTER_NORMAL_ACCOUNT (0x0002)
|
||||
|
@ -5164,4 +5177,6 @@ DECLARE_HANDLE(HANDLE);
|
|||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* WIN32_LEAN_AND_MEAN */
|
||||
|
||||
#endif /* _GNU_H_WINDOWS32_DEFINES */
|
||||
|
|
|
@ -31,6 +31,8 @@
|
|||
#ifndef _GNU_H_WINDOWS32_FUNCTIONS
|
||||
#define _GNU_H_WINDOWS32_FUNCTIONS
|
||||
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
@ -7430,6 +7432,9 @@ DWORD STDCALL NetGroupEnum (LPWSTR, DWORD, LPBYTE*, DWORD, LPDWORD,
|
|||
DWORD STDCALL NetLocalGroupEnum (LPWSTR, DWORD, LPBYTE*, DWORD, LPDWORD,
|
||||
LPDWORD, LPDWORD);
|
||||
|
||||
|
||||
VOID CopyMemory(PVOID Destination, CONST VOID* Source, DWORD Length);
|
||||
|
||||
void WINAPI
|
||||
SHAddToRecentDocs (UINT, LPCVOID);
|
||||
|
||||
|
@ -7481,4 +7486,6 @@ SHLoadInProc (REFCLSID);
|
|||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* WIN32_LEAN_AND_MEAN */
|
||||
|
||||
#endif /* _GNU_H_WINDOWS32_FUNCTIONS */
|
||||
|
|
|
@ -38,6 +38,11 @@ extern char _ctmp;
|
|||
|
||||
#define upalpha ('A' - 'a')
|
||||
|
||||
extern inline int isspace(char c)
|
||||
{
|
||||
return(c==' '||c=='\t');
|
||||
}
|
||||
|
||||
extern inline char toupper(char c)
|
||||
{
|
||||
if ((c>='a') && (c<='z')) return (c+upalpha);
|
||||
|
|
|
@ -51,6 +51,7 @@ typedef struct
|
|||
unsigned char io_bitmap[1];
|
||||
} hal_thread_state;
|
||||
|
||||
|
||||
/*
|
||||
* FUNCTION: Probes for a PCI bus
|
||||
* RETURNS: True if found
|
||||
|
|
|
@ -14,6 +14,10 @@
|
|||
#include <ddk/ntddk.h>
|
||||
#include <internal/ob.h>
|
||||
|
||||
extern POBJECT_TYPE IoDeviceType;
|
||||
extern POBJECT_TYPE IoFileType;
|
||||
extern POBJECT_TYPE IoSymbolicLinkType;
|
||||
|
||||
/*
|
||||
* FUNCTION: Called to initalize a loaded driver
|
||||
* ARGUMENTS:
|
||||
|
@ -36,5 +40,9 @@ PIRP IoBuildFilesystemControlRequest(ULONG MinorFunction,
|
|||
PKEVENT UserEvent,
|
||||
PIO_STATUS_BLOCK IoStatusBlock,
|
||||
PDEVICE_OBJECT DeviceToMount);
|
||||
|
||||
NTSTATUS IoPageRead(PFILE_OBJECT FileObject,
|
||||
PVOID Address,
|
||||
PLARGE_INTEGER Offset,
|
||||
PIO_STATUS_BLOCK StatusBlock);
|
||||
VOID IoSecondStageCompletion(PIRP Irp, CCHAR PriorityBoost);
|
||||
#endif
|
||||
|
|
|
@ -15,6 +15,10 @@
|
|||
|
||||
/* INTERNAL KERNEL FUNCTIONS ************************************************/
|
||||
|
||||
VOID KeAcquireDispatcherDatabaseLock(BOOLEAN Wait);
|
||||
VOID KeReleaseDispatcherDatabaseLock(BOOLEAN Wait);
|
||||
VOID KeDispatcherObjectWake(DISPATCHER_HEADER* hdr);
|
||||
|
||||
VOID KiInterruptDispatch(ULONG irq);
|
||||
VOID KiDispatchInterrupt(ULONG irq);
|
||||
VOID KiTimerInterrupt(VOID);
|
||||
|
|
|
@ -5,8 +5,6 @@
|
|||
#ifndef __INCLUDE_INTERNAL_MM_H
|
||||
#define __INCLUDE_INTERNAL_MM_H
|
||||
|
||||
#define PAGE_SYSTEM (0x80000000)
|
||||
|
||||
#include <internal/linkage.h>
|
||||
#include <internal/ntoskrnl.h>
|
||||
#include <windows.h>
|
||||
|
@ -16,25 +14,31 @@
|
|||
enum
|
||||
{
|
||||
MEMORY_AREA_INVALID,
|
||||
MEMORY_AREA_SECTION_VIEW,
|
||||
MEMORY_AREA_SECTION_VIEW_COMMIT,
|
||||
MEMORY_AREA_CONTINUOUS_MEMORY,
|
||||
MEMORY_AREA_NO_CACHE,
|
||||
MEMORY_AREA_IO_MAPPING,
|
||||
MEMORY_AREA_SYSTEM,
|
||||
MEMORY_AREA_MDL_MAPPING,
|
||||
MEMORY_AREA_COMMIT,
|
||||
MEMORY_AREA_RESERVE,
|
||||
MEMORY_AREA_SECTION_VIEW_RESERVE,
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
CSHORT Type;
|
||||
CSHORT Size;
|
||||
FILE_OBJECT* File;
|
||||
} SECTION_OBJECT;
|
||||
LARGE_INTEGER MaximumSize;
|
||||
ULONG SectionPageProtection;
|
||||
ULONG AllocateAttributes;
|
||||
PFILE_OBJECT FileObject;
|
||||
} SECTION_OBJECT, *PSECTION_OBJECT;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ULONG Type;
|
||||
ULONG BaseAddress;
|
||||
PVOID BaseAddress;
|
||||
ULONG Length;
|
||||
ULONG Attributes;
|
||||
LIST_ENTRY Entry;
|
||||
|
@ -47,22 +51,28 @@ typedef struct
|
|||
ULONG ViewOffset;
|
||||
} SectionData;
|
||||
} Data;
|
||||
} MEMORY_AREA;
|
||||
} MEMORY_AREA, *PMEMORY_AREA;
|
||||
|
||||
|
||||
NTSTATUS MmCreateMemoryArea(KPROCESSOR_MODE Mode,
|
||||
PEPROCESS Process,
|
||||
ULONG Type,
|
||||
PULONG BaseAddress,
|
||||
PVOID* BaseAddress,
|
||||
ULONG Length,
|
||||
ULONG Attributes,
|
||||
MEMORY_AREA** Result);
|
||||
MEMORY_AREA* MmOpenMemoryAreaByAddress(ULONG Address);
|
||||
MEMORY_AREA* MmOpenMemoryAreaByAddress(PEPROCESS Process, PVOID Address);
|
||||
NTSTATUS MmInitMemoryAreas(VOID);
|
||||
VOID ExInitNonPagedPool(ULONG BaseAddress);
|
||||
NTSTATUS MmFreeMemoryArea(PVOID BaseAddress,
|
||||
NTSTATUS MmFreeMemoryArea(PEPROCESS Process,
|
||||
PVOID BaseAddress,
|
||||
ULONG Length,
|
||||
BOOLEAN FreePages);
|
||||
VOID MmDumpMemoryAreas(VOID);
|
||||
VOID MmDumpMemoryAreas(PLIST_ENTRY ListHead);
|
||||
NTSTATUS MmLockMemoryArea(MEMORY_AREA* MemoryArea);
|
||||
NTSTATUS MmUnlockMemoryArea(MEMORY_AREA* MemoryArea);
|
||||
NTSTATUS MmInitSectionImplementation(VOID);
|
||||
|
||||
|
||||
/*
|
||||
* FUNCTION: Gets a page with a restricted max physical address (i.e.
|
||||
|
@ -96,4 +106,13 @@ void mark_page_not_writable(unsigned int vaddr);
|
|||
|
||||
void VirtualInit(boot_param* bp);
|
||||
|
||||
#define MM_LOWEST_USER_ADDRESS (4096)
|
||||
|
||||
PMEMORY_AREA MmSplitMemoryArea(PEPROCESS Process,
|
||||
PMEMORY_AREA OriginalMemoryArea,
|
||||
PVOID BaseAddress,
|
||||
ULONG Length,
|
||||
ULONG NewType,
|
||||
ULONG NewAttributes);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -44,6 +44,8 @@ enum
|
|||
OBJTYP_DEVICE,
|
||||
OBJTYP_THREAD,
|
||||
OBJTYP_FILE,
|
||||
OBJTYP_PROCESS,
|
||||
OBJTYP_SECTION,
|
||||
OBJTYP_MAX,
|
||||
};
|
||||
|
||||
|
@ -51,27 +53,23 @@ BOOL ObAddObjectToNameSpace(PUNICODE_STRING path, POBJECT_HEADER Object);
|
|||
|
||||
VOID ObRegisterType(CSHORT id, OBJECT_TYPE* type);
|
||||
|
||||
VOID ObInitializeObjectHeader(CSHORT id, PWSTR name,
|
||||
VOID ObInitializeObjectHeader(POBJECT_TYPE Type, PWSTR name,
|
||||
POBJECT_HEADER obj);
|
||||
|
||||
/*
|
||||
* FUNCTION: Get the size of an object
|
||||
* ARGUMENTS:
|
||||
* Type = Object type
|
||||
* RETURNS: The size in bytes
|
||||
*/
|
||||
ULONG ObSizeOf(CSHORT Type);
|
||||
HANDLE ObAddHandle(PVOID obj);
|
||||
HANDLE ObInsertHandle(PKPROCESS Process, PVOID ObjectBody,
|
||||
ACCESS_MASK GrantedAccess, BOOLEAN Inherit);
|
||||
VOID ObDeleteHandle(HANDLE Handle);
|
||||
NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object,
|
||||
PWSTR* UnparsedSection);
|
||||
PVOID ObGetObjectByHandle(HANDLE h);
|
||||
|
||||
PVOID ObGenericCreateObject(PHANDLE Handle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
CSHORT Type);
|
||||
POBJECT_TYPE Type);
|
||||
NTSTATUS ObOpenObjectByName(POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
PVOID* Object, PWSTR* UnparsedSection);
|
||||
VOID ObInitializeHandleTable(PKPROCESS Parent, BOOLEAN Inherit,
|
||||
PKPROCESS Process);
|
||||
VOID ObRemoveEntry(POBJECT_HEADER Header);
|
||||
|
||||
/*
|
||||
* FUNCTION: Creates an entry within a directory
|
||||
|
@ -92,6 +90,18 @@ extern inline PVOID HEADER_TO_BODY(POBJECT_HEADER obj)
|
|||
return(((void *)obj)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER));
|
||||
}
|
||||
|
||||
#define OBJECT_ALLOC_SIZE(type) (ObSizeOf(type)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER))
|
||||
#define OBJECT_ALLOC_SIZE(type) (type->NonpagedPoolCharge+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER))
|
||||
|
||||
/*
|
||||
* PURPOSE: Defines a handle
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
PVOID ObjectBody;
|
||||
ACCESS_MASK GrantedAccess;
|
||||
BOOLEAN Inherit;
|
||||
} HANDLE_REP, *PHANDLE_REP;
|
||||
|
||||
PHANDLE_REP ObTranslateHandle(PKPROCESS Process, HANDLE h);
|
||||
|
||||
#endif /* __INCLUDE_INTERNAL_OBJMGR_H */
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
#include <internal/linkage.h>
|
||||
|
||||
static PVOID ExAllocatePagedPool(POOL_TYPE Type, ULONG size);
|
||||
static PVOID ExAllocateNonPagedPool(POOL_TYPE Type, ULONG size);
|
||||
PVOID ExAllocatePagedPoolWithTag(POOL_TYPE Type, ULONG size, ULONG Tag);
|
||||
PVOID ExAllocateNonPagedPoolWithTag(POOL_TYPE Type, ULONG size, ULONG Tag);
|
||||
|
||||
#endif /* __INTERNAL_POOL_H */
|
||||
|
|
|
@ -3,12 +3,16 @@
|
|||
|
||||
#include <internal/hal.h>
|
||||
|
||||
extern EPROCESS SystemProcess;
|
||||
extern PEPROCESS SystemProcess;
|
||||
extern HANDLE SystemProcessHandle;
|
||||
|
||||
extern POBJECT_TYPE PsThreadType;
|
||||
extern POBJECT_TYPE PsProcessType;
|
||||
|
||||
void PsInitThreadManagment(void);
|
||||
VOID PsInitProcessManagment(VOID);
|
||||
VOID PsInitIdleThread(VOID);
|
||||
VOID PsDispatchThread(VOID);
|
||||
|
||||
/*
|
||||
* PURPOSE: Thread states
|
||||
|
@ -45,9 +49,9 @@ enum
|
|||
* Functions the HAL must provide
|
||||
*/
|
||||
|
||||
void HalInitFirstTask(PKTHREAD thread);
|
||||
BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn,
|
||||
PVOID StartContext);
|
||||
void HalInitFirstTask(PETHREAD thread);
|
||||
BOOLEAN HalInitTask(PETHREAD thread, PKSTART_ROUTINE fn, PVOID StartContext);
|
||||
void HalTaskSwitch(PKTHREAD thread);
|
||||
NTSTATUS HalInitTaskWithContext(PETHREAD Thread, PCONTEXT Context);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -9,9 +9,9 @@
|
|||
#ifndef __VERSION_H
|
||||
#define __VERSION_H
|
||||
|
||||
#define KERNEL_VERSION "0.0.11"
|
||||
#define KERNEL_VERSION "0.0.12"
|
||||
#define KERNEL_MAJOR_VERSION 0
|
||||
#define KERNEL_MINOR_VERSION 0
|
||||
#define KERNEL_PATCH_LEVEL 11
|
||||
#define KERNEL_PATCH_LEVEL 12
|
||||
|
||||
#endif
|
||||
|
|
|
@ -105,6 +105,4 @@ typedef struct __HEAP
|
|||
HEAP_BLOCK Start __attribute__((aligned (8)));
|
||||
} HEAP, *PHEAP;
|
||||
|
||||
//PHEAP __ProcessHeap;
|
||||
|
||||
#endif /* __INCLUDE_KERNEL32_HEAP_H */
|
||||
|
|
|
@ -32,6 +32,334 @@
|
|||
#ifndef _GNU_H_WINDOWS32_STRUCTURES
|
||||
#define _GNU_H_WINDOWS32_STRUCTURES
|
||||
|
||||
typedef struct _LARGE_INTEGER {
|
||||
DWORD LowPart;
|
||||
LONG HighPart;
|
||||
} LARGE_INTEGER, *PLARGE_INTEGER;
|
||||
|
||||
typedef struct _LIST_ENTRY {
|
||||
struct _LIST_ENTRY *Flink;
|
||||
struct _LIST_ENTRY *Blink;
|
||||
} LIST_ENTRY, *PLIST_ENTRY;
|
||||
|
||||
typedef DWORD ACCESS_MASK;
|
||||
|
||||
|
||||
typedef struct _SID_IDENTIFIER_AUTHORITY {
|
||||
BYTE Value[6];
|
||||
} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY,
|
||||
*LPSID_IDENTIFIER_AUTHORITY;
|
||||
|
||||
|
||||
typedef struct _ACL {
|
||||
BYTE AclRevision;
|
||||
BYTE Sbz1;
|
||||
WORD AclSize;
|
||||
WORD AceCount;
|
||||
WORD Sbz2;
|
||||
} ACL, *PACL;
|
||||
|
||||
|
||||
typedef struct _SID {
|
||||
BYTE Revision;
|
||||
BYTE SubAuthorityCount;
|
||||
SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
|
||||
DWORD SubAuthority[ANYSIZE_ARRAY];
|
||||
} SID, *PSID;
|
||||
|
||||
typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
|
||||
|
||||
typedef struct _SECURITY_DESCRIPTOR {
|
||||
BYTE Revision;
|
||||
BYTE Sbz1;
|
||||
SECURITY_DESCRIPTOR_CONTROL Control;
|
||||
PSID Owner;
|
||||
PSID Group;
|
||||
PACL Sacl;
|
||||
PACL Dacl;
|
||||
} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
|
||||
|
||||
typedef struct _SECURITY_QUALITY_OF_SERVICE {
|
||||
DWORD Length;
|
||||
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
|
||||
/* SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode; */
|
||||
WINBOOL ContextTrackingMode;
|
||||
BOOLEAN EffectiveOnly;
|
||||
} SECURITY_QUALITY_OF_SERVICE;
|
||||
|
||||
typedef LARGE_INTEGER LUID, *PLUID;
|
||||
|
||||
typedef struct _TOKEN_SOURCE {
|
||||
CHAR SourceName[8];
|
||||
LUID SourceIdentifier;
|
||||
} TOKEN_SOURCE;
|
||||
|
||||
typedef struct _PARTITION_INFORMATION {
|
||||
BYTE PartitionType;
|
||||
BOOLEAN BootIndicator;
|
||||
BOOLEAN RecognizedPartition;
|
||||
BOOLEAN RewritePartition;
|
||||
LARGE_INTEGER StartingOffset;
|
||||
LARGE_INTEGER PartitionLength;
|
||||
LARGE_INTEGER HiddenSectors;
|
||||
} PARTITION_INFORMATION ;
|
||||
|
||||
typedef struct _SINGLE_LIST_ENTRY {
|
||||
struct _SINGLE_LIST_ENTRY *Next;
|
||||
} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
|
||||
|
||||
|
||||
typedef struct _CRITICAL_SECTION_DEBUG {
|
||||
WORD Type;
|
||||
WORD CreatorBackTraceIndex;
|
||||
struct _CRITICAL_SECTION *CriticalSection;
|
||||
LIST_ENTRY ProcessLocksList;
|
||||
DWORD EntryCount;
|
||||
DWORD ContentionCount;
|
||||
DWORD Depth;
|
||||
PVOID OwnerBackTrace[ 5 ];
|
||||
} CRITICAL_SECTION_DEBUG, *PCRITICAL_SECTION_DEBUG;
|
||||
|
||||
typedef struct _CRITICAL_SECTION {
|
||||
PCRITICAL_SECTION_DEBUG DebugInfo;
|
||||
LONG LockCount;
|
||||
LONG RecursionCount;
|
||||
HANDLE OwningThread;
|
||||
HANDLE LockSemaphore;
|
||||
DWORD Reserved;
|
||||
} CRITICAL_SECTION, *PCRITICAL_SECTION, *LPCRITICAL_SECTION;
|
||||
|
||||
typedef struct _ULARGE_INTEGER {
|
||||
DWORD LowPart;
|
||||
DWORD HighPart;
|
||||
} ULARGE_INTEGER, *PULARGE_INTEGER;
|
||||
|
||||
typedef struct _GENERIC_MAPPING {
|
||||
ACCESS_MASK GenericRead;
|
||||
ACCESS_MASK GenericWrite;
|
||||
ACCESS_MASK GenericExecute;
|
||||
ACCESS_MASK GenericAll;
|
||||
} GENERIC_MAPPING, *PGENERIC_MAPPING;
|
||||
|
||||
typedef struct _LUID_AND_ATTRIBUTES {
|
||||
LUID Luid;
|
||||
DWORD Attributes;
|
||||
} LUID_AND_ATTRIBUTES;
|
||||
|
||||
typedef struct _PRIVILEGE_SET {
|
||||
DWORD PrivilegeCount;
|
||||
DWORD Control;
|
||||
LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
|
||||
} PRIVILEGE_SET, *PPRIVILEGE_SET, *LPPRIVILEGE_SET;
|
||||
|
||||
#ifdef __i386__
|
||||
|
||||
typedef struct _FLOATING_SAVE_AREA {
|
||||
DWORD ControlWord;
|
||||
DWORD StatusWord;
|
||||
DWORD TagWord;
|
||||
DWORD ErrorOffset;
|
||||
DWORD ErrorSelector;
|
||||
DWORD DataOffset;
|
||||
DWORD DataSelector;
|
||||
BYTE RegisterArea[80];
|
||||
DWORD Cr0NpxState;
|
||||
} FLOATING_SAVE_AREA;
|
||||
|
||||
typedef struct _CONTEXT {
|
||||
DWORD ContextFlags;
|
||||
|
||||
DWORD Dr0;
|
||||
DWORD Dr1;
|
||||
DWORD Dr2;
|
||||
DWORD Dr3;
|
||||
DWORD Dr6;
|
||||
DWORD Dr7;
|
||||
|
||||
FLOATING_SAVE_AREA FloatSave;
|
||||
|
||||
DWORD SegGs;
|
||||
DWORD SegFs;
|
||||
DWORD SegEs;
|
||||
DWORD SegDs;
|
||||
|
||||
DWORD Edi;
|
||||
DWORD Esi;
|
||||
DWORD Ebx;
|
||||
DWORD Edx;
|
||||
DWORD Ecx;
|
||||
DWORD Eax;
|
||||
|
||||
DWORD Ebp;
|
||||
DWORD Eip;
|
||||
DWORD SegCs;
|
||||
DWORD EFlags;
|
||||
DWORD Esp;
|
||||
DWORD SegSs;
|
||||
} CONTEXT, *PCONTEXT, *LPCONTEXT;
|
||||
|
||||
#else /* __ppc__ */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* Floating point registers returned when CONTEXT_FLOATING_POINT is set */
|
||||
double Fpr0;
|
||||
double Fpr1;
|
||||
double Fpr2;
|
||||
double Fpr3;
|
||||
double Fpr4;
|
||||
double Fpr5;
|
||||
double Fpr6;
|
||||
double Fpr7;
|
||||
double Fpr8;
|
||||
double Fpr9;
|
||||
double Fpr10;
|
||||
double Fpr11;
|
||||
double Fpr12;
|
||||
double Fpr13;
|
||||
double Fpr14;
|
||||
double Fpr15;
|
||||
double Fpr16;
|
||||
double Fpr17;
|
||||
double Fpr18;
|
||||
double Fpr19;
|
||||
double Fpr20;
|
||||
double Fpr21;
|
||||
double Fpr22;
|
||||
double Fpr23;
|
||||
double Fpr24;
|
||||
double Fpr25;
|
||||
double Fpr26;
|
||||
double Fpr27;
|
||||
double Fpr28;
|
||||
double Fpr29;
|
||||
double Fpr30;
|
||||
double Fpr31;
|
||||
double Fpscr;
|
||||
|
||||
/* Integer registers returned when CONTEXT_INTEGER is set. */
|
||||
DWORD Gpr0;
|
||||
DWORD Gpr1;
|
||||
DWORD Gpr2;
|
||||
DWORD Gpr3;
|
||||
DWORD Gpr4;
|
||||
DWORD Gpr5;
|
||||
DWORD Gpr6;
|
||||
DWORD Gpr7;
|
||||
DWORD Gpr8;
|
||||
DWORD Gpr9;
|
||||
DWORD Gpr10;
|
||||
DWORD Gpr11;
|
||||
DWORD Gpr12;
|
||||
DWORD Gpr13;
|
||||
DWORD Gpr14;
|
||||
DWORD Gpr15;
|
||||
DWORD Gpr16;
|
||||
DWORD Gpr17;
|
||||
DWORD Gpr18;
|
||||
DWORD Gpr19;
|
||||
DWORD Gpr20;
|
||||
DWORD Gpr21;
|
||||
DWORD Gpr22;
|
||||
DWORD Gpr23;
|
||||
DWORD Gpr24;
|
||||
DWORD Gpr25;
|
||||
DWORD Gpr26;
|
||||
DWORD Gpr27;
|
||||
DWORD Gpr28;
|
||||
DWORD Gpr29;
|
||||
DWORD Gpr30;
|
||||
DWORD Gpr31;
|
||||
|
||||
DWORD Cr; /* Condition register */
|
||||
DWORD Xer; /* Fixed point exception register */
|
||||
|
||||
/* The following are set when CONTEXT_CONTROL is set. */
|
||||
DWORD Msr; /* Machine status register */
|
||||
DWORD Iar; /* Instruction address register */
|
||||
DWORD Lr; /* Link register */
|
||||
DWORD Ctr; /* Control register */
|
||||
|
||||
/* Control which context values are returned */
|
||||
DWORD ContextFlags;
|
||||
DWORD Fill[3];
|
||||
|
||||
/* Registers returned if CONTEXT_DEBUG_REGISTERS is set. */
|
||||
DWORD Dr0; /* Breakpoint Register 1 */
|
||||
DWORD Dr1; /* Breakpoint Register 2 */
|
||||
DWORD Dr2; /* Breakpoint Register 3 */
|
||||
DWORD Dr3; /* Breakpoint Register 4 */
|
||||
DWORD Dr4; /* Breakpoint Register 5 */
|
||||
DWORD Dr5; /* Breakpoint Register 6 */
|
||||
DWORD Dr6; /* Debug Status Register */
|
||||
DWORD Dr7; /* Debug Control Register */
|
||||
} CONTEXT, *PCONTEXT, *LPCONTEXT;
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct value_ent {
|
||||
LPTSTR ve_valuename;
|
||||
DWORD ve_valuelen;
|
||||
DWORD ve_valueptr;
|
||||
DWORD ve_type;
|
||||
} VALENT, *PVALENT;
|
||||
|
||||
|
||||
typedef struct _EXCEPTION_RECORD {
|
||||
DWORD ExceptionCode;
|
||||
DWORD ExceptionFlags;
|
||||
struct _EXCEPTION_RECORD *ExceptionRecord;
|
||||
PVOID ExceptionAddress;
|
||||
DWORD NumberParameters;
|
||||
DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
|
||||
} EXCEPTION_RECORD, *PEXCEPTION_RECORD, *LPEXCEPTION_RECORD;
|
||||
|
||||
typedef struct _DRIVE_LAYOUT_INFORMATION {
|
||||
DWORD PartitionCount;
|
||||
DWORD Signature;
|
||||
PARTITION_INFORMATION PartitionEntry[1];
|
||||
} DRIVE_LAYOUT_INFORMATION;
|
||||
|
||||
typedef struct _KEY_EVENT_RECORD {
|
||||
WINBOOL bKeyDown;
|
||||
WORD wRepeatCount;
|
||||
WORD wVirtualKeyCode;
|
||||
WORD wVirtualScanCode;
|
||||
|
||||
char AsciiChar;
|
||||
char pad;
|
||||
#if 0
|
||||
union {
|
||||
WCHAR UnicodeChar;
|
||||
CHAR AsciiChar;
|
||||
} uChar;
|
||||
#endif
|
||||
DWORD dwControlKeyState;
|
||||
} KEY_EVENT_RECORD PACKED;
|
||||
|
||||
typedef struct _COORD {
|
||||
SHORT X;
|
||||
SHORT Y;
|
||||
} COORD;
|
||||
|
||||
typedef struct _MOUSE_EVENT_RECORD {
|
||||
COORD dwMousePosition;
|
||||
DWORD dwButtonState;
|
||||
DWORD dwControlKeyState;
|
||||
DWORD dwEventFlags;
|
||||
} MOUSE_EVENT_RECORD;
|
||||
|
||||
typedef struct _DISK_GEOMETRY {
|
||||
LARGE_INTEGER Cylinders;
|
||||
MEDIA_TYPE MediaType;
|
||||
DWORD TracksPerCylinder;
|
||||
DWORD SectorsPerTrack;
|
||||
DWORD BytesPerSector;
|
||||
} DISK_GEOMETRY ;
|
||||
|
||||
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
@ -60,7 +388,6 @@ typedef struct _ACE_HEADER {
|
|||
WORD AceSize;
|
||||
} ACE_HEADER;
|
||||
|
||||
typedef DWORD ACCESS_MASK;
|
||||
typedef ACCESS_MASK REGSAM;
|
||||
|
||||
typedef struct _ACCESS_ALLOWED_ACE {
|
||||
|
@ -81,14 +408,6 @@ typedef struct tagACCESSTIMEOUT {
|
|||
DWORD iTimeOutMSec;
|
||||
} ACCESSTIMEOUT;
|
||||
|
||||
typedef struct _ACL {
|
||||
BYTE AclRevision;
|
||||
BYTE Sbz1;
|
||||
WORD AclSize;
|
||||
WORD AceCount;
|
||||
WORD Sbz2;
|
||||
} ACL, *PACL;
|
||||
|
||||
typedef struct _ACL_REVISION_INFORMATION {
|
||||
DWORD AclRevision;
|
||||
} ACL_REVISION_INFORMATION;
|
||||
|
@ -629,11 +948,6 @@ typedef struct _CONSOLE_CURSOR_INFO {
|
|||
WINBOOL bVisible;
|
||||
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
|
||||
|
||||
typedef struct _COORD {
|
||||
SHORT X;
|
||||
SHORT Y;
|
||||
} COORD;
|
||||
|
||||
typedef struct _SMALL_RECT {
|
||||
SHORT Left;
|
||||
SHORT Top;
|
||||
|
@ -649,183 +963,6 @@ typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
|
|||
COORD dwMaximumWindowSize;
|
||||
} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO ;
|
||||
|
||||
#ifdef __i386__
|
||||
|
||||
typedef struct _FLOATING_SAVE_AREA {
|
||||
DWORD ControlWord;
|
||||
DWORD StatusWord;
|
||||
DWORD TagWord;
|
||||
DWORD ErrorOffset;
|
||||
DWORD ErrorSelector;
|
||||
DWORD DataOffset;
|
||||
DWORD DataSelector;
|
||||
BYTE RegisterArea[80];
|
||||
DWORD Cr0NpxState;
|
||||
} FLOATING_SAVE_AREA;
|
||||
|
||||
typedef struct _CONTEXT {
|
||||
DWORD ContextFlags;
|
||||
|
||||
DWORD Dr0;
|
||||
DWORD Dr1;
|
||||
DWORD Dr2;
|
||||
DWORD Dr3;
|
||||
DWORD Dr6;
|
||||
DWORD Dr7;
|
||||
|
||||
FLOATING_SAVE_AREA FloatSave;
|
||||
|
||||
DWORD SegGs;
|
||||
DWORD SegFs;
|
||||
DWORD SegEs;
|
||||
DWORD SegDs;
|
||||
|
||||
DWORD Edi;
|
||||
DWORD Esi;
|
||||
DWORD Ebx;
|
||||
DWORD Edx;
|
||||
DWORD Ecx;
|
||||
DWORD Eax;
|
||||
|
||||
DWORD Ebp;
|
||||
DWORD Eip;
|
||||
DWORD SegCs;
|
||||
DWORD EFlags;
|
||||
DWORD Esp;
|
||||
DWORD SegSs;
|
||||
} CONTEXT, *PCONTEXT, *LPCONTEXT;
|
||||
|
||||
#else /* __ppc__ */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* Floating point registers returned when CONTEXT_FLOATING_POINT is set */
|
||||
double Fpr0;
|
||||
double Fpr1;
|
||||
double Fpr2;
|
||||
double Fpr3;
|
||||
double Fpr4;
|
||||
double Fpr5;
|
||||
double Fpr6;
|
||||
double Fpr7;
|
||||
double Fpr8;
|
||||
double Fpr9;
|
||||
double Fpr10;
|
||||
double Fpr11;
|
||||
double Fpr12;
|
||||
double Fpr13;
|
||||
double Fpr14;
|
||||
double Fpr15;
|
||||
double Fpr16;
|
||||
double Fpr17;
|
||||
double Fpr18;
|
||||
double Fpr19;
|
||||
double Fpr20;
|
||||
double Fpr21;
|
||||
double Fpr22;
|
||||
double Fpr23;
|
||||
double Fpr24;
|
||||
double Fpr25;
|
||||
double Fpr26;
|
||||
double Fpr27;
|
||||
double Fpr28;
|
||||
double Fpr29;
|
||||
double Fpr30;
|
||||
double Fpr31;
|
||||
double Fpscr;
|
||||
|
||||
/* Integer registers returned when CONTEXT_INTEGER is set. */
|
||||
DWORD Gpr0;
|
||||
DWORD Gpr1;
|
||||
DWORD Gpr2;
|
||||
DWORD Gpr3;
|
||||
DWORD Gpr4;
|
||||
DWORD Gpr5;
|
||||
DWORD Gpr6;
|
||||
DWORD Gpr7;
|
||||
DWORD Gpr8;
|
||||
DWORD Gpr9;
|
||||
DWORD Gpr10;
|
||||
DWORD Gpr11;
|
||||
DWORD Gpr12;
|
||||
DWORD Gpr13;
|
||||
DWORD Gpr14;
|
||||
DWORD Gpr15;
|
||||
DWORD Gpr16;
|
||||
DWORD Gpr17;
|
||||
DWORD Gpr18;
|
||||
DWORD Gpr19;
|
||||
DWORD Gpr20;
|
||||
DWORD Gpr21;
|
||||
DWORD Gpr22;
|
||||
DWORD Gpr23;
|
||||
DWORD Gpr24;
|
||||
DWORD Gpr25;
|
||||
DWORD Gpr26;
|
||||
DWORD Gpr27;
|
||||
DWORD Gpr28;
|
||||
DWORD Gpr29;
|
||||
DWORD Gpr30;
|
||||
DWORD Gpr31;
|
||||
|
||||
DWORD Cr; /* Condition register */
|
||||
DWORD Xer; /* Fixed point exception register */
|
||||
|
||||
/* The following are set when CONTEXT_CONTROL is set. */
|
||||
DWORD Msr; /* Machine status register */
|
||||
DWORD Iar; /* Instruction address register */
|
||||
DWORD Lr; /* Link register */
|
||||
DWORD Ctr; /* Control register */
|
||||
|
||||
/* Control which context values are returned */
|
||||
DWORD ContextFlags;
|
||||
DWORD Fill[3];
|
||||
|
||||
/* Registers returned if CONTEXT_DEBUG_REGISTERS is set. */
|
||||
DWORD Dr0; /* Breakpoint Register 1 */
|
||||
DWORD Dr1; /* Breakpoint Register 2 */
|
||||
DWORD Dr2; /* Breakpoint Register 3 */
|
||||
DWORD Dr3; /* Breakpoint Register 4 */
|
||||
DWORD Dr4; /* Breakpoint Register 5 */
|
||||
DWORD Dr5; /* Breakpoint Register 6 */
|
||||
DWORD Dr6; /* Debug Status Register */
|
||||
DWORD Dr7; /* Debug Control Register */
|
||||
} CONTEXT, *PCONTEXT, *LPCONTEXT;
|
||||
#endif
|
||||
|
||||
typedef struct _LIST_ENTRY {
|
||||
struct _LIST_ENTRY *Flink;
|
||||
struct _LIST_ENTRY *Blink;
|
||||
} LIST_ENTRY, *PLIST_ENTRY;
|
||||
|
||||
typedef struct _CRITICAL_SECTION_DEBUG {
|
||||
WORD Type;
|
||||
WORD CreatorBackTraceIndex;
|
||||
struct _CRITICAL_SECTION *CriticalSection;
|
||||
LIST_ENTRY ProcessLocksList;
|
||||
DWORD EntryCount;
|
||||
DWORD ContentionCount;
|
||||
DWORD Depth;
|
||||
PVOID OwnerBackTrace[ 5 ];
|
||||
} CRITICAL_SECTION_DEBUG, *PCRITICAL_SECTION_DEBUG;
|
||||
|
||||
typedef struct _CRITICAL_SECTION {
|
||||
PCRITICAL_SECTION_DEBUG DebugInfo;
|
||||
LONG LockCount;
|
||||
LONG RecursionCount;
|
||||
HANDLE OwningThread;
|
||||
HANDLE LockSemaphore;
|
||||
DWORD Reserved;
|
||||
} CRITICAL_SECTION, *PCRITICAL_SECTION, *LPCRITICAL_SECTION;
|
||||
|
||||
typedef struct _SECURITY_QUALITY_OF_SERVICE {
|
||||
DWORD Length;
|
||||
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
|
||||
/* SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode; */
|
||||
WINBOOL ContextTrackingMode;
|
||||
BOOLEAN EffectiveOnly;
|
||||
} SECURITY_QUALITY_OF_SERVICE;
|
||||
|
||||
typedef struct tagCONVCONTEXT {
|
||||
UINT cb;
|
||||
UINT wFlags;
|
||||
|
@ -1009,15 +1146,6 @@ typedef struct {
|
|||
BYTE rgb[1];
|
||||
} DDEUP;
|
||||
|
||||
typedef struct _EXCEPTION_RECORD {
|
||||
DWORD ExceptionCode;
|
||||
DWORD ExceptionFlags;
|
||||
struct _EXCEPTION_RECORD *ExceptionRecord;
|
||||
PVOID ExceptionAddress;
|
||||
DWORD NumberParameters;
|
||||
DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
|
||||
} EXCEPTION_RECORD, *PEXCEPTION_RECORD, *LPEXCEPTION_RECORD;
|
||||
|
||||
typedef struct _EXCEPTION_DEBUG_INFO {
|
||||
EXCEPTION_RECORD ExceptionRecord;
|
||||
DWORD dwFirstChance;
|
||||
|
@ -1177,19 +1305,6 @@ typedef struct tagDIBSECTION {
|
|||
DWORD dsOffset;
|
||||
} DIBSECTION;
|
||||
|
||||
typedef struct _LARGE_INTEGER {
|
||||
DWORD LowPart;
|
||||
LONG HighPart;
|
||||
} LARGE_INTEGER, *PLARGE_INTEGER;
|
||||
|
||||
typedef struct _DISK_GEOMETRY {
|
||||
LARGE_INTEGER Cylinders;
|
||||
MEDIA_TYPE MediaType;
|
||||
DWORD TracksPerCylinder;
|
||||
DWORD SectorsPerTrack;
|
||||
DWORD BytesPerSector;
|
||||
} DISK_GEOMETRY ;
|
||||
|
||||
typedef struct _DISK_PERFORMANCE {
|
||||
LARGE_INTEGER BytesRead;
|
||||
LARGE_INTEGER BytesWritten;
|
||||
|
@ -1274,21 +1389,7 @@ typedef struct {
|
|||
UINT uiLengthDrawn;
|
||||
} DRAWTEXTPARAMS, *LPDRAWTEXTPARAMS;
|
||||
|
||||
typedef struct _PARTITION_INFORMATION {
|
||||
BYTE PartitionType;
|
||||
BOOLEAN BootIndicator;
|
||||
BOOLEAN RecognizedPartition;
|
||||
BOOLEAN RewritePartition;
|
||||
LARGE_INTEGER StartingOffset;
|
||||
LARGE_INTEGER PartitionLength;
|
||||
LARGE_INTEGER HiddenSectors;
|
||||
} PARTITION_INFORMATION ;
|
||||
|
||||
typedef struct _DRIVE_LAYOUT_INFORMATION {
|
||||
DWORD PartitionCount;
|
||||
DWORD Signature;
|
||||
PARTITION_INFORMATION PartitionEntry[1];
|
||||
} DRIVE_LAYOUT_INFORMATION;
|
||||
|
||||
typedef struct _DRIVER_INFO_1 {
|
||||
LPTSTR pName;
|
||||
|
@ -2255,12 +2356,6 @@ typedef struct tagGCP_RESULTS {
|
|||
UINT nMaxFit;
|
||||
} GCP_RESULTS, *LPGCP_RESULTS;
|
||||
|
||||
typedef struct _GENERIC_MAPPING {
|
||||
ACCESS_MASK GenericRead;
|
||||
ACCESS_MASK GenericWrite;
|
||||
ACCESS_MASK GenericExecute;
|
||||
ACCESS_MASK GenericAll;
|
||||
} GENERIC_MAPPING, *PGENERIC_MAPPING;
|
||||
|
||||
typedef struct _GLYPHMETRICS {
|
||||
UINT gmBlackBoxX;
|
||||
|
@ -2366,30 +2461,6 @@ typedef struct _IMAGEINFO {
|
|||
RECT rcImage;
|
||||
} IMAGEINFO;
|
||||
|
||||
typedef struct _KEY_EVENT_RECORD {
|
||||
WINBOOL bKeyDown;
|
||||
WORD wRepeatCount;
|
||||
WORD wVirtualKeyCode;
|
||||
WORD wVirtualScanCode;
|
||||
|
||||
char AsciiChar;
|
||||
char pad;
|
||||
#if 0
|
||||
union {
|
||||
WCHAR UnicodeChar;
|
||||
CHAR AsciiChar;
|
||||
} uChar;
|
||||
#endif
|
||||
DWORD dwControlKeyState;
|
||||
} KEY_EVENT_RECORD PACKED;
|
||||
|
||||
typedef struct _MOUSE_EVENT_RECORD {
|
||||
COORD dwMousePosition;
|
||||
DWORD dwButtonState;
|
||||
DWORD dwControlKeyState;
|
||||
DWORD dwEventFlags;
|
||||
} MOUSE_EVENT_RECORD;
|
||||
|
||||
typedef struct _WINDOW_BUFFER_SIZE_RECORD {
|
||||
COORD dwSize;
|
||||
} WINDOW_BUFFER_SIZE_RECORD;
|
||||
|
@ -2439,29 +2510,6 @@ typedef struct _JOB_INFO_1 {
|
|||
SYSTEMTIME Submitted;
|
||||
} JOB_INFO_1;
|
||||
|
||||
typedef struct _SID_IDENTIFIER_AUTHORITY {
|
||||
BYTE Value[6];
|
||||
} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY,
|
||||
*LPSID_IDENTIFIER_AUTHORITY;
|
||||
|
||||
typedef struct _SID {
|
||||
BYTE Revision;
|
||||
BYTE SubAuthorityCount;
|
||||
SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
|
||||
DWORD SubAuthority[ANYSIZE_ARRAY];
|
||||
} SID, *PSID;
|
||||
|
||||
typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
|
||||
|
||||
typedef struct _SECURITY_DESCRIPTOR {
|
||||
BYTE Revision;
|
||||
BYTE Sbz1;
|
||||
SECURITY_DESCRIPTOR_CONTROL Control;
|
||||
PSID Owner;
|
||||
PSID Group;
|
||||
PACL Sacl;
|
||||
PACL Dacl;
|
||||
} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
|
||||
|
||||
typedef struct _JOB_INFO_2 {
|
||||
DWORD JobId;
|
||||
|
@ -2541,12 +2589,7 @@ typedef struct _LOCALGROUP_MEMBERS_INFO_3 {
|
|||
|
||||
typedef long FXPT16DOT16, * LPFXPT16DOT16;
|
||||
|
||||
typedef LARGE_INTEGER LUID, *PLUID;
|
||||
|
||||
typedef struct _LUID_AND_ATTRIBUTES {
|
||||
LUID Luid;
|
||||
DWORD Attributes;
|
||||
} LUID_AND_ATTRIBUTES;
|
||||
|
||||
typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
|
||||
typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
|
||||
|
@ -3472,11 +3515,6 @@ typedef struct _PRINTPROCESSOR_INFO_1 {
|
|||
LPTSTR pName;
|
||||
} PRINTPROCESSOR_INFO_1;
|
||||
|
||||
typedef struct _PRIVILEGE_SET {
|
||||
DWORD PrivilegeCount;
|
||||
DWORD Control;
|
||||
LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
|
||||
} PRIVILEGE_SET, *PPRIVILEGE_SET, *LPPRIVILEGE_SET;
|
||||
|
||||
typedef struct _PROCESS_HEAP_ENTRY {
|
||||
PVOID lpData;
|
||||
|
@ -3839,9 +3877,6 @@ typedef struct _SID_AND_ATTRIBUTES {
|
|||
typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
|
||||
typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
|
||||
|
||||
typedef struct _SINGLE_LIST_ENTRY {
|
||||
struct _SINGLE_LIST_ENTRY *Next;
|
||||
} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
|
||||
|
||||
typedef struct tagSOUNDSENTRY {
|
||||
UINT cbSize;
|
||||
|
@ -4084,11 +4119,6 @@ typedef struct tagTOGGLEKEYS {
|
|||
DWORD dwFlags;
|
||||
} TOGGLEKEYS;
|
||||
|
||||
typedef struct _TOKEN_SOURCE {
|
||||
CHAR SourceName[8];
|
||||
LUID SourceIdentifier;
|
||||
} TOKEN_SOURCE;
|
||||
|
||||
typedef struct _TOKEN_CONTROL {
|
||||
LUID TokenId;
|
||||
LUID AuthenticationId;
|
||||
|
@ -4217,11 +4247,6 @@ typedef struct {
|
|||
UINT nInc;
|
||||
} UDACCEL;
|
||||
|
||||
typedef struct _ULARGE_INTEGER {
|
||||
DWORD LowPart;
|
||||
DWORD HighPart;
|
||||
} ULARGE_INTEGER, *PULARGE_INTEGER;
|
||||
|
||||
typedef struct _UNIVERSAL_NAME_INFO {
|
||||
LPTSTR lpUniversalName;
|
||||
} UNIVERSAL_NAME_INFO;
|
||||
|
@ -4232,13 +4257,6 @@ typedef struct tagUSEROBJECTFLAGS {
|
|||
DWORD dwFlags;
|
||||
} USEROBJECTFLAGS;
|
||||
|
||||
typedef struct value_ent {
|
||||
LPTSTR ve_valuename;
|
||||
DWORD ve_valuelen;
|
||||
DWORD ve_valueptr;
|
||||
DWORD ve_type;
|
||||
} VALENT, *PVALENT;
|
||||
|
||||
typedef struct _VERIFY_INFORMATION {
|
||||
LARGE_INTEGER StartingOffset;
|
||||
DWORD Length;
|
||||
|
@ -4555,5 +4573,7 @@ typedef struct
|
|||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* WIN32_LEAN_AND_MEAN */
|
||||
|
||||
#endif /* _GNU_H_WINDOWS32_STRUCTURES */
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
#include <base.h>
|
||||
|
||||
/* WIN32 messages */
|
||||
#ifndef _WIN32_LEAN_AND_MEAN
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#include <messages.h>
|
||||
#endif
|
||||
|
||||
|
@ -54,20 +54,22 @@
|
|||
#include <structs.h>
|
||||
|
||||
/* WIN32 functions */
|
||||
#ifndef _WIN32_LEAN_AND_MEAN
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#include <funcs.h>
|
||||
#endif
|
||||
|
||||
#endif /* ! defined (RC_INVOKED) */
|
||||
|
||||
/* WIN32 error codes */
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#include <errors.h>
|
||||
#endif
|
||||
|
||||
#ifndef RC_INVOKED
|
||||
|
||||
/* Windows sockets specification version 1.1 */
|
||||
#ifdef Win32_Winsock
|
||||
#ifndef _WIN32_LEAN_AND_MEAN
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#include <sockets.h>
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -36,6 +36,11 @@ extern size_t wcsnlen(const wchar_t * s, size_t count);
|
|||
extern int wcsicmp(const wchar_t* cs,const wchar_t * ct);
|
||||
extern int wcsnicmp(const wchar_t* cs,const wchar_t * ct, size_t count);
|
||||
|
||||
WCHAR wtoupper(WCHAR c);
|
||||
WCHAR wtolower(WCHAR c);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1,32 +1,16 @@
|
|||
|
||||
/*
|
||||
* Win32 File Api functions
|
||||
* Author: Boudewijn Dekker
|
||||
* to do: many more to add ..
|
||||
*/
|
||||
|
||||
|
||||
#undef WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
|
||||
// AnsiOrOemtoUnicode
|
||||
// pupose: internal procedure used in file api
|
||||
|
||||
NTSTATUS AnsiOrOemtoUnicode(PUNICODE_STRING DestinationString,PANSI_STRING SourceString, BOOLEAN AllocateDestinationString);
|
||||
#include <ddk/ntddk.h>
|
||||
|
||||
|
||||
BOOLEAN bIsFileApiAnsi; // set the file api to ansi or oem
|
||||
|
||||
|
||||
NTSTATUS AnsiOrOemtoUnicode(PUNICODE_STRING DestinationString,PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
|
||||
{
|
||||
if ( bIsFileApiAnsi ) {
|
||||
return __AnsiStringToUnicodeString(DestinationString, SourceString, AllocateDestinationString);
|
||||
else
|
||||
return __OemStringToUnicodeString(DestinationString, SourceString, AllocateDestinationString);
|
||||
|
||||
}
|
||||
|
||||
|
||||
WINBASEAPI
|
||||
VOID
|
||||
WINAPI
|
||||
|
@ -36,7 +20,59 @@ SetFileApisToOEM(VOID)
|
|||
return;
|
||||
}
|
||||
|
||||
HANDLE STDCALL CreateFileA(LPCSTR lpFileName,
|
||||
DWORD dwDesiredAccess,
|
||||
DWORD dwShareMode,
|
||||
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
||||
DWORD dwCreationDisposition,
|
||||
DWORD dwFlagsAndAttributes,
|
||||
HANDLE hTemplateFile)
|
||||
{
|
||||
HANDLE FileHandle;
|
||||
NTSTATUS Status;
|
||||
WCHAR FileNameW[255];
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
ULONG i = 0;
|
||||
UNICODE_STRING FileNameString;
|
||||
ULONG Flags = 0;
|
||||
|
||||
if (!(dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED))
|
||||
{
|
||||
Flags = Flags | FILE_SYNCHRONOUS_IO_ALERT;
|
||||
}
|
||||
|
||||
FileNameString.Length = 0;
|
||||
|
||||
while ((*lpFileName)!=0)
|
||||
{
|
||||
FileNameW[i] = *lpFileName;
|
||||
lpFileName++;
|
||||
i++;
|
||||
FileNameString.Length++;
|
||||
}
|
||||
FileNameW[i] = 0;
|
||||
FileNameString.Length++;
|
||||
|
||||
FileNameString.Buffer = &FileNameW;
|
||||
FileNameString.MaximumLength = FileNameString.Length;
|
||||
|
||||
ObjectAttributes.RootDirectory = NULL;
|
||||
ObjectAttributes.ObjectName = &FileNameString;
|
||||
|
||||
Status = NtCreateFile(&FileHandle,
|
||||
dwDesiredAccess,
|
||||
&ObjectAttributes,
|
||||
&IoStatusBlock,
|
||||
NULL,
|
||||
dwFlagsAndAttributes,
|
||||
dwShareMode,
|
||||
dwCreationDisposition,
|
||||
Flags,
|
||||
NULL,
|
||||
0);
|
||||
return(FileHandle);
|
||||
}
|
||||
|
||||
WINBASEAPI
|
||||
VOID
|
||||
|
@ -49,10 +85,275 @@ SetFileApisToANSI(VOID)
|
|||
|
||||
|
||||
WINBASEAPI
|
||||
BOOLEAN
|
||||
WINAPI
|
||||
WINBOOL
|
||||
STDCALL
|
||||
AreFileApisANSI(VOID)
|
||||
{
|
||||
return bIsFileApiAnsi;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
BOOL STDCALL WriteFile(HANDLE hFile,
|
||||
LPCVOID lpBuffer,
|
||||
DWORD nNumberOfBytesToWrite,
|
||||
LPDWORD lpNumberOfBytesWritten,
|
||||
LPOVERLAPPED lpOverLapped)
|
||||
{
|
||||
//FIXME: WriteFile should write to a console if appropriate
|
||||
LARGE_INTEGER Offset;
|
||||
HANDLE hEvent = NULL;
|
||||
NTSTATUS errCode;
|
||||
|
||||
if (lpOverLapped != NULL )
|
||||
{
|
||||
Offset.LowPart = lpOverLapped->Offset;
|
||||
Offset.HighPart = lpOverLapped->OffsetHigh;
|
||||
lpOverLapped->Internal = STATUS_PENDING;
|
||||
hEvent= lpOverLapped->hEvent;
|
||||
}
|
||||
errCode = NtWriteFile(hFile,hEvent,NULL,NULL,
|
||||
(PIO_STATUS_BLOCK)lpOverLapped,
|
||||
lpBuffer,
|
||||
nNumberOfBytesToWrite,
|
||||
&Offset,
|
||||
NULL);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
SetLastError(RtlNtStatusToDosError(errCode));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
WINBOOL STDCALL ReadFile(HANDLE hFile,
|
||||
LPVOID lpBuffer,
|
||||
DWORD nNumberOfBytesToRead,
|
||||
LPDWORD lpNumberOfBytesRead,
|
||||
LPOVERLAPPED lpOverLapped)
|
||||
{
|
||||
//FIXME ReadFile should write to a console if appropriate
|
||||
HANDLE hEvent = NULL;
|
||||
LARGE_INTEGER Offset;
|
||||
NTSTATUS errCode;
|
||||
PIO_STATUS_BLOCK IoStatusBlock;
|
||||
IO_STATUS_BLOCK IIosb;
|
||||
OVERLAPPED IOverlapped;
|
||||
|
||||
if ( lpOverLapped != NULL )
|
||||
{
|
||||
Offset.LowPart = lpOverLapped->Offset;
|
||||
Offset.HighPart = lpOverLapped->OffsetHigh;
|
||||
lpOverLapped->Internal = STATUS_PENDING;
|
||||
hEvent = lpOverLapped->hEvent;
|
||||
IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped;
|
||||
}
|
||||
else
|
||||
{
|
||||
IoStatusBlock = &IIosb;
|
||||
}
|
||||
|
||||
errCode = NtReadFile(hFile,
|
||||
hEvent,
|
||||
NULL,
|
||||
NULL,
|
||||
IoStatusBlock,
|
||||
lpBuffer,
|
||||
nNumberOfBytesToRead,
|
||||
&Offset,
|
||||
NULL);
|
||||
if ( errCode < 0 )
|
||||
{
|
||||
SetLastError(RtlNtStatusToDosError(errCode));
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
ReadFileEx(
|
||||
HANDLE hFile,
|
||||
LPVOID lpBuffer,
|
||||
DWORD nNumberOfBytesToRead,
|
||||
LPOVERLAPPED lpOverLapped,
|
||||
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
|
||||
)
|
||||
{
|
||||
HANDLE hEvent = NULL;
|
||||
LARGE_INTEGER Offset;
|
||||
NTSTATUS errCode;
|
||||
|
||||
if ( lpOverLapped != NULL ) {
|
||||
Offset.LowPart = lpOverLapped->Offset;
|
||||
Offset.HighPart = lpOverLapped->OffsetHigh;
|
||||
lpOverLapped->Internal = STATUS_PENDING;
|
||||
hEvent = lpOverLapped->hEvent;
|
||||
}
|
||||
|
||||
|
||||
|
||||
errCode = NtReadFile(hFile,
|
||||
hEvent,
|
||||
(PIO_APC_ROUTINE)lpCompletionRoutine,
|
||||
NULL,
|
||||
(PIO_STATUS_BLOCK)lpOverLapped,
|
||||
lpBuffer,
|
||||
nNumberOfBytesToRead,
|
||||
&Offset,
|
||||
NULL);
|
||||
if ( errCode < 0 ) {
|
||||
SetLastError(RtlNtStatusToDosError(errCode));
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
LockFile(
|
||||
HANDLE hFile,
|
||||
DWORD dwFileOffsetLow,
|
||||
DWORD dwFileOffsetHigh,
|
||||
DWORD nNumberOfBytesToLockLow,
|
||||
DWORD nNumberOfBytesToLockHigh
|
||||
)
|
||||
{
|
||||
DWORD dwReserved;
|
||||
OVERLAPPED Overlapped;
|
||||
|
||||
Overlapped.Offset = dwFileOffsetLow;
|
||||
Overlapped.OffsetHigh = dwFileOffsetHigh;
|
||||
dwReserved = 0;
|
||||
|
||||
return LockFileEx(hFile, LOCKFILE_FAIL_IMMEDIATELY|LOCKFILE_EXCLUSIVE_LOCK,dwReserved,nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, &Overlapped ) ;
|
||||
|
||||
}
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
LockFileEx(
|
||||
HANDLE hFile,
|
||||
DWORD dwFlags,
|
||||
DWORD dwReserved,
|
||||
DWORD nNumberOfBytesToLockLow,
|
||||
DWORD nNumberOfBytesToLockHigh,
|
||||
LPOVERLAPPED lpOverlapped
|
||||
)
|
||||
{
|
||||
LARGE_INTEGER BytesToLock;
|
||||
BOOL LockImmediate;
|
||||
BOOL LockExclusive;
|
||||
NTSTATUS errCode;
|
||||
LARGE_INTEGER Offset;
|
||||
|
||||
if(dwReserved != 0)
|
||||
{
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
lpOverlapped->Internal = STATUS_PENDING;
|
||||
|
||||
Offset.LowPart = lpOverlapped->Offset;
|
||||
Offset.HighPart = lpOverlapped->OffsetHigh;
|
||||
|
||||
if ( (dwFlags & LOCKFILE_FAIL_IMMEDIATELY) == LOCKFILE_FAIL_IMMEDIATELY )
|
||||
LockImmediate = TRUE;
|
||||
else
|
||||
LockImmediate = FALSE;
|
||||
|
||||
if ( (dwFlags & LOCKFILE_EXCLUSIVE_LOCK) == LOCKFILE_EXCLUSIVE_LOCK )
|
||||
LockExclusive = TRUE;
|
||||
else
|
||||
LockExclusive = FALSE;
|
||||
|
||||
BytesToLock.LowPart = nNumberOfBytesToLockLow;
|
||||
BytesToLock.HighPart = nNumberOfBytesToLockHigh;
|
||||
|
||||
errCode = NtLockFile(hFile,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
(PIO_STATUS_BLOCK)lpOverlapped,
|
||||
&Offset,
|
||||
&BytesToLock,
|
||||
NULL,
|
||||
LockImmediate,
|
||||
LockExclusive);
|
||||
if ( errCode < 0 )
|
||||
{
|
||||
SetLastError(RtlNtStatusToDosError(errCode));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
UnlockFile(
|
||||
HANDLE hFile,
|
||||
DWORD dwFileOffsetLow,
|
||||
DWORD dwFileOffsetHigh,
|
||||
DWORD nNumberOfBytesToUnlockLow,
|
||||
DWORD nNumberOfBytesToUnlockHigh
|
||||
)
|
||||
{
|
||||
DWORD dwReserved;
|
||||
OVERLAPPED Overlapped;
|
||||
Overlapped.Offset = dwFileOffsetLow;
|
||||
Overlapped.OffsetHigh = dwFileOffsetHigh;
|
||||
dwReserved = 0;
|
||||
return UnlockFileEx(hFile, dwReserved, nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh, &Overlapped);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
WINBOOL STDCALL UnlockFileEx(HANDLE hFile,
|
||||
DWORD dwReserved,
|
||||
DWORD nNumberOfBytesToUnLockLow,
|
||||
DWORD nNumberOfBytesToUnLockHigh,
|
||||
LPOVERLAPPED lpOverlapped)
|
||||
{
|
||||
LARGE_INTEGER BytesToUnLock;
|
||||
LARGE_INTEGER StartAddress;
|
||||
NTSTATUS errCode;
|
||||
|
||||
if(dwReserved != 0)
|
||||
{
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
return FALSE;
|
||||
}
|
||||
if ( lpOverlapped == NULL )
|
||||
{
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BytesToUnLock.LowPart = nNumberOfBytesToUnLockLow;
|
||||
BytesToUnLock.HighPart = nNumberOfBytesToUnLockHigh;
|
||||
|
||||
StartAddress.LowPart = lpOverlapped->Offset;
|
||||
StartAddress.HighPart = lpOverlapped->OffsetHigh;
|
||||
|
||||
errCode = NtUnlockFile(hFile,
|
||||
(PIO_STATUS_BLOCK)lpOverlapped,
|
||||
StartAddress,
|
||||
BytesToUnLock,
|
||||
NULL);
|
||||
if ( errCode < 0 ) {
|
||||
SetLastError(RtlNtStatusToDosError(errCode));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -5,10 +5,11 @@
|
|||
* todo: check the _lopen for correctness
|
||||
*/
|
||||
|
||||
#undef WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <string.h>
|
||||
#include <wstring.h>
|
||||
|
||||
#include <fcntl.h>
|
||||
|
||||
|
||||
|
||||
|
@ -26,8 +27,7 @@ long _hread(
|
|||
|
||||
}
|
||||
|
||||
long
|
||||
_lread(HFILE fd,LPVOID buffer,long count)
|
||||
UINT STDCALL _lread(HFILE fd,LPVOID buffer,UINT count)
|
||||
{
|
||||
return _hread(fd,buffer, count);
|
||||
}
|
||||
|
@ -54,14 +54,15 @@ long _hwrite(
|
|||
|
||||
}
|
||||
|
||||
|
||||
long _lwrite(
|
||||
UINT
|
||||
STDCALL
|
||||
_lwrite(
|
||||
HFILE hFile,
|
||||
LPCSTR lpBuffer,
|
||||
long lBytes
|
||||
UINT uBytes
|
||||
)
|
||||
{
|
||||
return _hwrite(hFile,lpBuffer,lBytes);
|
||||
return _hwrite(hFile,lpBuffer,uBytes);
|
||||
}
|
||||
|
||||
#define OF_OPENMASK (OF_READ|OF_READWRITE|OF_WRITE|OF_CREATE)
|
||||
|
@ -123,7 +124,7 @@ int _lclose(
|
|||
if ( CloseHandle((HANDLE)hFile) )
|
||||
return 0;
|
||||
else
|
||||
rerturn -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
LONG _llseek(
|
||||
|
|
|
@ -1,9 +1,30 @@
|
|||
all: dummy
|
||||
all: kernel32.a
|
||||
|
||||
OBJECTS = file/file.o file/lfile.o mem/virtual.o mem/local.o mem/global.o
|
||||
SYNCH_OBJECTS = synch/critical.o
|
||||
|
||||
kernel32_lib: $(OBJECTS)
|
||||
$(LD) --oformat=coff-go32 -Ttext b0000000 $(LDFLAGS) $(OBJECTS) -o kernel32.dll
|
||||
#MISC_OBJECTS = misc/atom.o
|
||||
MISC_OBJECTS = misc/error.o
|
||||
|
||||
#FILE_OBJECTS = file/file.o file/lfile.o
|
||||
FILE_OBJECTS = file/file.o file/curdir.o
|
||||
|
||||
MEM_OBJECTS = mem/virtual.o mem/heap.o mem/utils.o
|
||||
|
||||
#THREAD_OBJECTS = thread/thread.o
|
||||
|
||||
PROCESS_OBJECTS = process/proc.o
|
||||
|
||||
STRING_OBJECTS = string/lstring.o
|
||||
|
||||
INTERNAL_OBJECTS = internal/dprintf.o internal/vsprintf.o
|
||||
|
||||
OBJECTS = $(MISC_OBJECTS) $(FILE_OBJECTS) $(THREAD_OBJECTS) \
|
||||
$(PROCESS_OBJECTS) $(STRING_OBJECTS) $(MEM_OBJECTS) \
|
||||
$(INTERNAL_OBJECTS) $(SYNCH_OBJECTS)
|
||||
|
||||
|
||||
kernel32.a: $(OBJECTS)
|
||||
$(AR) vrcs kernel32.a $(OBJECTS)
|
||||
|
||||
dummy:
|
||||
|
||||
|
|
|
@ -26,7 +26,9 @@
|
|||
* Put the type definitions of the heap in a seperate header. Boudewijn Dekker
|
||||
*/
|
||||
|
||||
#include <kernel32/kernel32.h>
|
||||
#include <kernel32/heap.h>
|
||||
#include <internal/string.h>
|
||||
|
||||
static HEAP_BUCKET __HeapDefaultBuckets[]=
|
||||
{
|
||||
|
@ -40,13 +42,14 @@ static HEAP_BUCKET __HeapDefaultBuckets[]=
|
|||
{ NULL, 256, 15, 4088 },
|
||||
};
|
||||
|
||||
PHEAP __ProcessHeap;
|
||||
|
||||
static BOOL __HeapCommit(PHEAP pheap, LPVOID start, LPVOID end);
|
||||
static BOOL __HeapDecommit(PHEAP pheap, LPVOID start, LPVOID end);
|
||||
static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag);
|
||||
static VOID __HeapFreeRest(PHEAP pheap, PHEAP_BLOCK pfree, ULONG allocsize,
|
||||
ULONG newsize);
|
||||
static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, ULONG size);
|
||||
static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size);
|
||||
static BOOL __HeapFree(PHEAP pheap, ULONG flags, LPVOID pmem);
|
||||
static PHEAP_SUBALLOC __HeapAllocSub(PHEAP pheap, PHEAP_BUCKET pbucket);
|
||||
static LPVOID __HeapAllocFragment(PHEAP pheap, ULONG flags, ULONG size);
|
||||
|
@ -67,12 +70,14 @@ static BOOL __HeapCommit(PHEAP pheap, LPVOID start, LPVOID end)
|
|||
{
|
||||
dprintf("__HeapCommit( 0x%lX, 0x%lX, 0x%lX)\n",
|
||||
(ULONG) pheap, (ULONG) start, (ULONG) end);
|
||||
#ifdef NOT
|
||||
__VirtualDump();
|
||||
#endif
|
||||
|
||||
if(end >= pheap->LastBlock)
|
||||
pheap->LastBlock=end;
|
||||
return __VirtualCommit(start, end-start, PAGE_READWRITE);
|
||||
if (VirtualAlloc(start,end-start,MEM_COMMIT,PAGE_READWRITE)!=start)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
|
@ -89,7 +94,8 @@ static BOOL __HeapDecommit(PHEAP pheap, LPVOID start, LPVOID end)
|
|||
#endif
|
||||
if((end >= pheap->LastBlock)&&(start<= pheap->LastBlock))
|
||||
pheap->LastBlock=start;
|
||||
return __VirtualDecommit(start, end-start );
|
||||
|
||||
return(VirtualFree(start,end-start,MEM_RESERVE));
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
|
@ -107,6 +113,9 @@ static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag)
|
|||
ULONG freesize;
|
||||
ULONG allocsize;
|
||||
|
||||
dprintf("__HeapAlloc(pheap %x, flags %x, size %d, tag %x)\n",
|
||||
pheap,flags,size,tag);
|
||||
|
||||
pfree=&(pheap->Start);
|
||||
allocsize=SIZE_ROUND(size);
|
||||
freesize=HEAP_SIZE(pfree);
|
||||
|
@ -154,7 +163,7 @@ static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag)
|
|||
/* update our administration */
|
||||
palloc->Size= size | tag;
|
||||
if((flags | pheap->Flags)& HEAP_ZERO_MEMORY)
|
||||
memset((LPVOID)palloc+HEAP_ADMIN_SIZE, 0, allocsize);
|
||||
FillMemory((LPVOID)palloc+HEAP_ADMIN_SIZE, allocsize, 0);
|
||||
return (LPVOID)palloc+HEAP_ADMIN_SIZE;
|
||||
}
|
||||
|
||||
|
@ -236,7 +245,7 @@ static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size)
|
|||
/* alloc a new fragment */
|
||||
pmem=__HeapAllocFragment(pheap, flags, size);
|
||||
if(pmem)
|
||||
memcpy(pmem, pold, size);
|
||||
CopyMemory(pmem, pold, size);
|
||||
return pmem;
|
||||
}
|
||||
#endif
|
||||
|
@ -300,7 +309,7 @@ static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size)
|
|||
oldsize=HEAP_SIZE(prealloc);
|
||||
pmem=__HeapAlloc(pheap, flags, size, HEAP_NORMAL_TAG);
|
||||
if(pmem)
|
||||
memcpy(pmem, pold, oldsize);
|
||||
CopyMemory(pmem, pold, oldsize);
|
||||
if((flags|pheap->Flags)&HEAP_ZERO_MEMORY)
|
||||
memset(pmem + oldsize, 0, size-oldsize);
|
||||
__HeapFree(pheap, flags, pold);
|
||||
|
@ -502,7 +511,7 @@ static LPVOID __HeapReAllocFragment(PHEAP pheap, ULONG flags,
|
|||
pmem=__HeapAllocFragment(pheap, flags, size);
|
||||
|
||||
if(pmem)
|
||||
memcpy(pmem, pold, size);
|
||||
CopyMemory(pmem, pold, size);
|
||||
if((flags|pheap->Flags)&HEAP_ZERO_MEMORY)
|
||||
memset(pmem+pfrag->Size, 0, size-pfrag->Size);
|
||||
|
||||
|
@ -581,11 +590,14 @@ PHEAP __HeapPrepare(LPVOID base, ULONG minsize, ULONG maxsize, ULONG flags)
|
|||
{
|
||||
PHEAP pheap=(PHEAP) base;
|
||||
|
||||
dprintf("__HeapPrepare(base %x, minsize %d, maxsize %d, flags %x)\n",
|
||||
base,minsize,maxsize,flags);
|
||||
|
||||
pheap->Magic=MAGIC_HEAP;
|
||||
pheap->End= ((LPVOID)pheap)+minsize;
|
||||
pheap->Flags=flags;
|
||||
pheap->LastBlock=(LPVOID)pheap + PAGESIZE;
|
||||
memcpy(pheap->Bucket,__HeapDefaultBuckets,sizeof(__HeapDefaultBuckets));
|
||||
CopyMemory(pheap->Bucket,__HeapDefaultBuckets,sizeof(__HeapDefaultBuckets));
|
||||
if(__ProcessHeap)
|
||||
{
|
||||
pheap->NextHeap=__ProcessHeap->NextHeap;
|
||||
|
@ -611,8 +623,8 @@ PHEAP __HeapPrepare(LPVOID base, ULONG minsize, ULONG maxsize, ULONG flags)
|
|||
|
||||
VOID WINAPI __HeapInit(LPVOID base, ULONG minsize, ULONG maxsize)
|
||||
{
|
||||
mmap(base, PAGESIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE,
|
||||
__DevZero, 0);
|
||||
VirtualAlloc(base,maxsize,MEM_RESERVE,PAGE_READWRITE);
|
||||
VirtualAlloc(base,PAGESIZE,MEM_COMMIT,PAGE_READWRITE);
|
||||
|
||||
__HeapPrepare(base, minsize, maxsize, 0);
|
||||
}
|
||||
|
@ -621,16 +633,14 @@ VOID WINAPI __HeapInit(LPVOID base, ULONG minsize, ULONG maxsize)
|
|||
/*********************************************************************
|
||||
* HeapCreate -- KERNEL32 *
|
||||
*********************************************************************/
|
||||
|
||||
HANDLE WINAPI HeapCreate(ULONG flags, ULONG minsize, ULONG maxsize)
|
||||
HANDLE STDCALL HeapCreate(DWORD flags, DWORD minsize, DWORD maxsize)
|
||||
{
|
||||
PHEAP pheap;
|
||||
|
||||
aprintf("HeapCreate( 0x%lX, 0x%lX, 0x%lX )\n", flags, minsize, maxsize);
|
||||
|
||||
pheap = __VirtualReserve(NULL, minsize, PAGE_READWRITE | MEM_TOP_DOWN);
|
||||
__VirtualCommit(pheap, PAGESIZE, PAGE_READWRITE);
|
||||
__VirtualDump();
|
||||
pheap = VirtualAlloc(NULL, minsize, MEM_TOP_DOWN, PAGE_READWRITE);
|
||||
VirtualAlloc(pheap, PAGESIZE, MEM_COMMIT, PAGE_READWRITE);
|
||||
return (HANDLE) __HeapPrepare(pheap, minsize, maxsize, flags);
|
||||
}
|
||||
|
||||
|
@ -647,7 +657,7 @@ BOOL WINAPI HeapDestroy(HANDLE hheap)
|
|||
return __ErrorReturnFalse(ERROR_INVALID_PARAMETER);
|
||||
|
||||
DeleteCriticalSection(&(pheap->Synchronize));
|
||||
__VirtualRelease(pheap);
|
||||
VirtualFree(pheap,0,MEM_RELEASE);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -655,7 +665,7 @@ BOOL WINAPI HeapDestroy(HANDLE hheap)
|
|||
/*********************************************************************
|
||||
* HeapAlloc -- KERNEL32 *
|
||||
*********************************************************************/
|
||||
LPVOID WINAPI HeapAlloc(HANDLE hheap, ULONG flags, ULONG size)
|
||||
LPVOID STDCALL HeapAlloc(HANDLE hheap, DWORD flags, DWORD size)
|
||||
{
|
||||
PHEAP pheap=hheap;
|
||||
LPVOID retval;
|
||||
|
@ -684,7 +694,7 @@ LPVOID WINAPI HeapAlloc(HANDLE hheap, ULONG flags, ULONG size)
|
|||
/*********************************************************************
|
||||
* HeapReAlloc -- KERNEL32 *
|
||||
*********************************************************************/
|
||||
LPVOID WINAPI HeapReAlloc(HANDLE hheap, ULONG flags, LPVOID ptr, ULONG size)
|
||||
LPVOID STDCALL HeapReAlloc(HANDLE hheap, DWORD flags, LPVOID ptr, DWORD size)
|
||||
{
|
||||
PHEAP pheap=hheap;
|
||||
PHEAP_BLOCK pfree=((PHEAP_BLOCK)ptr-1);
|
||||
|
@ -714,7 +724,7 @@ LPVOID WINAPI HeapReAlloc(HANDLE hheap, ULONG flags, LPVOID ptr, ULONG size)
|
|||
/*********************************************************************
|
||||
* HeapFree -- KERNEL32 *
|
||||
*********************************************************************/
|
||||
BOOL WINAPI HeapFree(HANDLE hheap, ULONG flags, LPVOID ptr)
|
||||
WINBOOL STDCALL HeapFree(HANDLE hheap, DWORD flags, LPVOID ptr)
|
||||
{
|
||||
PHEAP pheap=hheap;
|
||||
PHEAP_BLOCK pfree=(PHEAP_BLOCK)((LPVOID)ptr-HEAP_ADMIN_SIZE);
|
||||
|
|
|
@ -9,11 +9,92 @@
|
|||
/* INCLUDES ******************************************************************/
|
||||
|
||||
#include <windows.h>
|
||||
#include <ddk/ntddk.h>
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
LPVOID STDCALL VirtualAllocEx(HANDLE hProcess,
|
||||
LPVOID lpAddress,
|
||||
DWORD dwSize,
|
||||
DWORD flAllocationType,
|
||||
DWORD flProtect)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = ZwAllocateVirtualMemory(hProcess,
|
||||
&lpAddress,
|
||||
0,
|
||||
dwSize,
|
||||
flAllocationType,
|
||||
flProtect);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
return(lpAddress);
|
||||
}
|
||||
|
||||
LPVOID STDCALL VirtualAlloc(LPVOID lpAddress,
|
||||
DWORD dwSize,
|
||||
DWORD flAllocationType,
|
||||
DWORD flProtect)
|
||||
{
|
||||
return(VirtualAllocEx(GetCurrentProcess(),lpAddress,dwSize,flAllocationType,
|
||||
flProtect));
|
||||
}
|
||||
|
||||
WINBOOL STDCALL VirtualFreeEx(HANDLE hProcess,
|
||||
LPVOID lpAddress,
|
||||
DWORD dwSize,
|
||||
DWORD dwFreeType)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = ZwFreeVirtualMemory(hProcess,
|
||||
&lpAddress,
|
||||
dwSize,
|
||||
dwFreeType);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
WINBOOL STDCALL VirtualFree(LPVOID lpAddress, DWORD dwSize, DWORD dwFreeType)
|
||||
{
|
||||
return(VirtualFreeEx(GetCurrentProcess(),lpAddress,dwSize,dwFreeType));
|
||||
}
|
||||
|
||||
WINBOOL STDCALL VirtualProtect(LPVOID lpAddress,
|
||||
DWORD dwSize,
|
||||
DWORD flNewProtect,
|
||||
PDWORD lpflOldProtect)
|
||||
{
|
||||
return(VirtualProtectEx(GetCurrentProcess(),
|
||||
lpAddress,
|
||||
dwSize,
|
||||
flNewProtect,
|
||||
lpflOldProtect));
|
||||
}
|
||||
|
||||
|
||||
WINBOOL STDCALL VirtualProtectEx(HANDLE hProcess,
|
||||
LPVOID lpAddress,
|
||||
DWORD dwSize,
|
||||
DWORD flNewProtect,
|
||||
PDWORD lpflOldProtect)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = ZwProtectVirtualMemory(hProcess,
|
||||
lpAddress,
|
||||
dwSize,
|
||||
flNewProtect,
|
||||
lpflOldProtect);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
return(TRUE);
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
#include <windows.h>
|
||||
#include <process.h>
|
||||
/*
|
||||
* Win32 Process Api functions
|
||||
|
@ -14,14 +15,18 @@
|
|||
#define NT_CURRENT_THREAD 0xFFFFFFFE
|
||||
|
||||
|
||||
WINBASEAPI
|
||||
HANDLE
|
||||
WINAPI
|
||||
GetCurrentProcess()
|
||||
HANDLE STDCALL GetCurrentProcess(VOID)
|
||||
{
|
||||
return NT_CURRENT_PROCESS;
|
||||
}
|
||||
|
||||
HANDLE STDCALL GetCurrentThread()
|
||||
{
|
||||
return NT_CURRENT_PROCESS;
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
WINBASEAPI
|
||||
DWORD
|
||||
WINAPI
|
||||
|
@ -31,14 +36,6 @@ GetCurrentProcessId()
|
|||
}
|
||||
|
||||
|
||||
WINBASEAPI
|
||||
HANDLE
|
||||
WINAPI
|
||||
GetCurrentThread()
|
||||
{
|
||||
return NT_CURRENT_PROCESS;
|
||||
}
|
||||
|
||||
WINBASEAPI
|
||||
DWORD
|
||||
WINAPI
|
||||
|
@ -135,3 +132,5 @@ BOOL FlushInstructionCache(
|
|||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
all: genntdll$(EXE_POSTFIX)
|
||||
all: ntdll.a
|
||||
|
||||
OBJECTS = napi.o
|
||||
|
||||
ntdll.a: $(OBJECTS)
|
||||
$(AR) vcsr ntdll.a $(OBJECTS)
|
||||
|
||||
genntdll$(EXE_POSTFIX): genntdll.c
|
||||
$(NATIVE_CC) -g genntdll.c -o genntdll$(EXE_POSTFIX)
|
||||
dummy:
|
||||
|
||||
include ../../rules.mak
|
||||
|
|
|
@ -15,7 +15,12 @@ include rules.mak
|
|||
#
|
||||
# Required to run the system
|
||||
#
|
||||
COMPONENTS = kernel lib
|
||||
COMPONENTS = iface_native ntoskrnl kernel32 ntdll crtdll mingw32
|
||||
|
||||
#
|
||||
# Select the server(s) you want to build
|
||||
#
|
||||
SERVERS = win32 posix linux os2
|
||||
|
||||
#
|
||||
# Select the loader(s) you want to build
|
||||
|
@ -23,26 +28,81 @@ COMPONENTS = kernel lib
|
|||
LOADERS = dos
|
||||
|
||||
#
|
||||
# Select the modules you want
|
||||
# Select the device drivers and filesystems you want
|
||||
#
|
||||
MODULES = parallel keyboard
|
||||
KERNEL_SERVICES = parallel keyboard null mouse serial sound ide test sdisk \
|
||||
minix vfat
|
||||
|
||||
all: $(COMPONENTS) $(LOADERS) $(MODULES)
|
||||
APPS = hello shell
|
||||
|
||||
all: $(COMPONENTS) $(LOADERS) $(KERNEL_SERVICES) $(APPS)
|
||||
|
||||
clean: dummy
|
||||
make -C iface/native clean
|
||||
|
||||
#
|
||||
# Applications
|
||||
#
|
||||
hello: dummy
|
||||
make -C apps/hello
|
||||
|
||||
cmd: dummy
|
||||
make -C apps/cmd
|
||||
|
||||
shell: dummy
|
||||
make -C apps/shell
|
||||
|
||||
#
|
||||
# Interfaces
|
||||
#
|
||||
iface_native: dummy
|
||||
make -C iface/native
|
||||
|
||||
#
|
||||
# Device driver rules
|
||||
#
|
||||
vfat: dummy
|
||||
make -C services/fs/vfat
|
||||
|
||||
sdisk: dummy
|
||||
make -C services/dd/sdisk
|
||||
|
||||
minix: dummy
|
||||
make -C services/fs/minix
|
||||
|
||||
template: dummy
|
||||
make -C services/fs/template
|
||||
|
||||
|
||||
ide-test: dummy
|
||||
make -C services/dd/ide-test
|
||||
|
||||
ide: dummy
|
||||
make -C services/ide
|
||||
make -C services/dd/ide
|
||||
|
||||
test: dummy
|
||||
make -C services/dd/test
|
||||
|
||||
test1: dummy
|
||||
make -C services/dd/test1
|
||||
|
||||
null: dummy
|
||||
make -C services/dd/null
|
||||
|
||||
parallel: dummy
|
||||
make -C services/parallel
|
||||
make -C services/dd/parallel
|
||||
|
||||
keyboard: dummy
|
||||
make -C services/keyboard
|
||||
make -C services/dd/keyboard
|
||||
|
||||
mouse: dummy
|
||||
make -C services/mouse
|
||||
make -C services/dd/mouse
|
||||
|
||||
serial: dummy
|
||||
make -C services/dd/serial
|
||||
|
||||
sound: dummy
|
||||
make -C services/dd/sound
|
||||
|
||||
#
|
||||
# Kernel loaders
|
||||
|
@ -55,10 +115,19 @@ dos: dummy
|
|||
# Required system components
|
||||
#
|
||||
|
||||
kernel: dummy
|
||||
ntoskrnl: dummy
|
||||
make -C ntoskrnl
|
||||
|
||||
lib: dummy
|
||||
make -C lib
|
||||
kernel32: dummy
|
||||
make -C lib/kernel32
|
||||
|
||||
ntdll: dummy
|
||||
make -C lib/ntdll
|
||||
|
||||
crtdll: dummy
|
||||
make -C lib/crtdll
|
||||
|
||||
mingw32: dummy
|
||||
make -C lib/mingw32
|
||||
|
||||
dummy:
|
||||
|
|
|
@ -16,6 +16,11 @@
|
|||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
NTSTATUS STDCALL NtSystemDebugControl(VOID)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
VOID DbgBreakPoint(VOID)
|
||||
{
|
||||
__asm__("int $3\n\t");
|
||||
|
|
|
@ -23,9 +23,12 @@ VOID ExCallUserCallBack(PVOID fn)
|
|||
{
|
||||
}
|
||||
|
||||
VOID NtReturnFromCallBack(VOID)
|
||||
/*
|
||||
* FUNCTION: Returns from a user callback
|
||||
*/
|
||||
NTSTATUS STDCALL NtCallbackReturn(VOID)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtW32Call(VOID)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
|
|
@ -16,6 +16,28 @@
|
|||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
NTSTATUS STDCALL NtSetSystemTime(IN PLARGE_INTEGER SystemTime,
|
||||
IN PLARGE_INTEGER NewSystemTime OPTIONAL)
|
||||
{
|
||||
return(ZwSetSystemTime(SystemTime,NewSystemTime));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwSetSystemTime(IN PLARGE_INTEGER SystemTime,
|
||||
IN PLARGE_INTEGER NewSystemTime OPTIONAL)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtQuerySystemTime (OUT TIME *CurrentTime)
|
||||
{
|
||||
return(ZwQuerySystemTime(CurrentTime));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwQuerySystemTime (OUT TIME *CurrentTime)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
VOID ExLocalTimeToSystemTime(PLARGE_INTEGER LocalTime,
|
||||
PLARGE_INTEGER SystemTime)
|
||||
{
|
||||
|
|
|
@ -142,7 +142,7 @@ VOID ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem,
|
|||
ASSERT_IRQL(DISPATCH_LEVEL);
|
||||
|
||||
/*
|
||||
* Insert the item in the appropiate queue and wake on any thread
|
||||
* Insert the item in the appropiate queue and wake up any thread
|
||||
* waiting for something to do
|
||||
*/
|
||||
switch(QueueType)
|
||||
|
@ -152,5 +152,5 @@ VOID ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem,
|
|||
&normal_work_queue.Lock);
|
||||
KeSetEvent(&normal_work_queue.Busy,IO_NO_INCREMENT,FALSE);
|
||||
break;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -377,3 +377,10 @@ ZwUnmapViewOfSection
|
|||
ZwWriteFile
|
||||
sprintf
|
||||
wcschr
|
||||
wcsncat
|
||||
wcsncpy
|
||||
wtolower
|
||||
wtoupper
|
||||
CbInitDccb
|
||||
CbAcquireForRead
|
||||
CbReleaseFromRead
|
||||
|
|
|
@ -18,8 +18,8 @@
|
|||
#include <ddk/ntddk.h>
|
||||
#include <internal/mm.h>
|
||||
#include <internal/string.h>
|
||||
#include <internal/hal/page.h>
|
||||
#include <internal/hal/segment.h>
|
||||
#include <internal/mmhal.h>
|
||||
#include <internal/i386/segment.h>
|
||||
|
||||
/* TYPES ******************************************************************/
|
||||
|
||||
|
|
|
@ -13,16 +13,16 @@
|
|||
#include <windows.h>
|
||||
#include <internal/ntoskrnl.h>
|
||||
#include <internal/ke.h>
|
||||
#include <internal/hal/segment.h>
|
||||
#include <internal/hal/page.h>
|
||||
#include <internal/i386/segment.h>
|
||||
#include <internal/mmhal.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
/* GLOBALS *****************************************************************/
|
||||
|
||||
typedef unsigned int (exception_hook)(CONTEXT* c, unsigned int exp);
|
||||
asmlinkage unsigned int ExHookException(exception_hook fn, UINT exp);
|
||||
asmlinkage int page_fault_handler(unsigned int cs,
|
||||
unsigned int eip);
|
||||
|
||||
extern descriptor idt[256];
|
||||
static exception_hook* exception_hooks[256]={NULL,};
|
||||
|
@ -30,43 +30,74 @@ static exception_hook* exception_hooks[256]={NULL,};
|
|||
#define _STR(x) #x
|
||||
#define STR(x) _STR(x)
|
||||
|
||||
extern void interrupt_handler2e(void);
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
#define EXCEPTION_HANDLER_WITH_ERROR(x,y) \
|
||||
void exception_handler##y (void); \
|
||||
__asm__("\n\t_exception_handler"##x":\n\t" \
|
||||
"pushl %gs\n\t" \
|
||||
"pushl %fs\n\t" \
|
||||
"pushl %es\n\t" \
|
||||
"pushl %ds\n\t" \
|
||||
"pushl $"##x"\n\t" \
|
||||
"pusha\n\t" \
|
||||
"movw $"STR(KERNEL_DS)",%ax\n\t" \
|
||||
"movw %ax,%ds\n\t" \
|
||||
"movw %ax,%es\n\t" \
|
||||
"movw %ax,%fs\n\t" \
|
||||
"movw %ax,%gs\n\t" \
|
||||
"call _exception_handler\n\t" \
|
||||
"popa\n\t" \
|
||||
"addl $8,%esp\n\t" \
|
||||
"addl $4,%esp\n\t" \
|
||||
"popl %ds\n\t" \
|
||||
"popl %es\n\t" \
|
||||
"popl %fs\n\t" \
|
||||
"popl %gs\n\t" \
|
||||
"addl $4,%esp\n\t" \
|
||||
"iret\n\t")
|
||||
|
||||
#define EXCEPTION_HANDLER_WITHOUT_ERROR(x,y) \
|
||||
asmlinkage void exception_handler##y (void); \
|
||||
__asm__("\n\t_exception_handler"##x":\n\t" \
|
||||
"pushl $0\n\t" \
|
||||
"pushl %gs\n\t" \
|
||||
"pushl %fs\n\t" \
|
||||
"pushl %es\n\t" \
|
||||
"pushl %ds\n\t" \
|
||||
"pushl $"##x"\n\t" \
|
||||
"pusha\n\t" \
|
||||
"movw $"STR(KERNEL_DS)",%ax\n\t" \
|
||||
"movw %ax,%ds\n\t" \
|
||||
"movw %ax,%es\n\t" \
|
||||
"movw %ax,%fs\n\t" \
|
||||
"movw %ax,%gs\n\t" \
|
||||
"call _exception_handler\n\t" \
|
||||
"popa\n\t" \
|
||||
"addl $8,%esp\n\t" \
|
||||
"addl $4,%esp\n\t" \
|
||||
"popl %ds\n\t" \
|
||||
"popl %es\n\t" \
|
||||
"popl %fs\n\t" \
|
||||
"popl %gs\n\t" \
|
||||
"addl $4,%esp\n\t" \
|
||||
"iret\n\t")
|
||||
|
||||
asmlinkage void exception_handler_unknown(void);
|
||||
__asm__("\n\t_exception_handler_unknown:\n\t"
|
||||
"pushl $0\n\t"
|
||||
"pushl %gs\n\t"
|
||||
"pushl %fs\n\t"
|
||||
"pushl %es\n\t"
|
||||
"pushl %ds\n\t"
|
||||
"pushl %ds\n\t"
|
||||
"pushl $0xff\n\t"
|
||||
"pusha\n\t"
|
||||
"movw $"STR(KERNEL_DS)",%ax\n\t"
|
||||
"movw %ax,%ds\n\t"
|
||||
"movw %ax,%es\n\t"
|
||||
"movw %ax,%fs\n\t"
|
||||
"movw %ax,%gs\n\t"
|
||||
"call _exception_handler\n\t"
|
||||
"popa\n\t"
|
||||
"addl $8,%esp\n\t"
|
||||
|
@ -87,14 +118,7 @@ EXCEPTION_HANDLER_WITH_ERROR("10",10);
|
|||
EXCEPTION_HANDLER_WITH_ERROR("11",11);
|
||||
EXCEPTION_HANDLER_WITH_ERROR("12",12);
|
||||
EXCEPTION_HANDLER_WITH_ERROR("13",13);
|
||||
|
||||
/*
|
||||
* The page fault handler is defined by the memory managment because it is
|
||||
* special
|
||||
*/
|
||||
//EXCEPTION_HANDLER_WITH_ERROR("14",14);
|
||||
asmlinkage void exception_handler14(void);
|
||||
|
||||
EXCEPTION_HANDLER_WITH_ERROR("14",14);
|
||||
EXCEPTION_HANDLER_WITH_ERROR("15",15);
|
||||
EXCEPTION_HANDLER_WITHOUT_ERROR("16",16);
|
||||
|
||||
|
@ -107,6 +131,9 @@ asmlinkage void exception_handler(unsigned int edi,
|
|||
unsigned int eax,
|
||||
unsigned int type,
|
||||
unsigned int ds,
|
||||
unsigned int es,
|
||||
unsigned int fs,
|
||||
unsigned int gs,
|
||||
unsigned int error_code,
|
||||
unsigned int eip,
|
||||
unsigned int cs, unsigned int eflags,
|
||||
|
@ -124,6 +151,19 @@ asmlinkage void exception_handler(unsigned int edi,
|
|||
|
||||
__asm__("cli\n\t");
|
||||
|
||||
if (type==14)
|
||||
{
|
||||
if (page_fault_handler(cs&0xffff,eip))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (type==1)
|
||||
{
|
||||
DbgPrint("Trap at CS:EIP %x:%x\n",cs&0xffff,eip);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Activate any hook for the exception
|
||||
*/
|
||||
|
@ -137,6 +177,8 @@ asmlinkage void exception_handler(unsigned int edi,
|
|||
*/
|
||||
printk("Exception: %d(%x)\n",type,error_code&0xffff);
|
||||
printk("CS:EIP %x:%x\n",cs&0xffff,eip);
|
||||
printk("DS %x ES %x FS %x GS %x\n",ds&0xffff,es&0xffff,fs&0xffff,
|
||||
gs&0xfff);
|
||||
// for(;;);
|
||||
printk("EAX: %.8x EBX: %.8x ECX: %.8x\n",eax,ebx,ecx);
|
||||
printk("EDX: %.8x EBP: %.8x ESI: %.8x\n",edx,ebp,esi);
|
||||
|
@ -145,6 +187,10 @@ asmlinkage void exception_handler(unsigned int edi,
|
|||
{
|
||||
printk("ESP %.8x\n",esp);
|
||||
}
|
||||
else
|
||||
{
|
||||
printk("ESP %.8x\n",esp);
|
||||
}
|
||||
|
||||
__asm__("movl %%cr2,%0\n\t"
|
||||
: "=d" (cr2));
|
||||
|
@ -181,6 +227,15 @@ asmlinkage void exception_handler(unsigned int edi,
|
|||
for(;;);
|
||||
}
|
||||
|
||||
static void set_system_call_gate(unsigned int sel, unsigned int func)
|
||||
{
|
||||
DPRINT("sel %x %d\n",sel,sel);
|
||||
idt[sel].a = (((int)func)&0xffff) +
|
||||
(KERNEL_CS << 16);
|
||||
idt[sel].b = 0xef00 + (((int)func)&0xffff0000);
|
||||
DPRINT("idt[sel].b %x\n",idt[sel].b);
|
||||
}
|
||||
|
||||
static void set_interrupt_gate(unsigned int sel, unsigned int func)
|
||||
{
|
||||
idt[sel].a = (((int)func)&0xffff) +
|
||||
|
@ -232,4 +287,6 @@ asmlinkage void KeInitExceptions(void)
|
|||
{
|
||||
set_interrupt_gate(i,(int)exception_handler_unknown);
|
||||
}
|
||||
|
||||
set_system_call_gate(0x2e,(int)interrupt_handler2e);
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include <internal/linkage.h>
|
||||
#include <internal/string.h>
|
||||
|
||||
#include <internal/hal/segment.h>
|
||||
#include <internal/i386/segment.h>
|
||||
#include <internal/hal/io.h>
|
||||
|
||||
#define NDEBUG
|
||||
|
@ -35,7 +35,7 @@
|
|||
/* GLOBALS *****************************************************************/
|
||||
|
||||
#define NR_IRQS (16)
|
||||
#define IRQ_BASE (0x20)
|
||||
#define IRQ_BASE (0x40)
|
||||
|
||||
asmlinkage void irq_handler_0(void);
|
||||
asmlinkage void irq_handler_1(void);
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
BOOL HalIsaProbe()
|
||||
BOOL HalIsaProbe(VOID)
|
||||
/*
|
||||
* FUNCTION: Probes for an ISA bus
|
||||
* RETURNS: True if detected
|
||||
|
@ -28,5 +28,5 @@ BOOL HalIsaProbe()
|
|||
/*
|
||||
* Probe for plug and play support
|
||||
*/
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
/* INCLUDES ***************************************************************/
|
||||
|
||||
#include <internal/hal/page.h>
|
||||
#include <internal/mmhal.h>
|
||||
#include <internal/mm.h>
|
||||
#include <internal/string.h>
|
||||
#include <internal/bitops.h>
|
||||
|
@ -29,6 +29,81 @@
|
|||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
||||
static ULONG ProtectToPTE(ULONG flProtect)
|
||||
{
|
||||
ULONG Attributes = 0;
|
||||
|
||||
if (flProtect & PAGE_NOACCESS || flProtect & PAGE_GUARD)
|
||||
{
|
||||
Attributes = 0;
|
||||
}
|
||||
if (flProtect & PAGE_READWRITE || flProtect & PAGE_EXECUTE_READWRITE)
|
||||
{
|
||||
Attributes = PA_WRITE;
|
||||
}
|
||||
if (flProtect & PAGE_READONLY || flProtect & PAGE_EXECUTE ||
|
||||
flProtect & PAGE_EXECUTE_READ)
|
||||
{
|
||||
Attributes = PA_READ;
|
||||
}
|
||||
return(Attributes);
|
||||
}
|
||||
|
||||
PULONG MmGetPageEntry(PEPROCESS Process, ULONG Address)
|
||||
{
|
||||
unsigned int page_table;
|
||||
unsigned int* page_tlb;
|
||||
unsigned int* page_dir = linear_to_physical(
|
||||
Process->Pcb.PageTableDirectory);
|
||||
|
||||
DPRINT("vaddr %x ",vaddr);
|
||||
page_tlb = (unsigned int *)physical_to_linear(
|
||||
PAGE_MASK(page_dir[VADDR_TO_PD_OFFSET(Address)]));
|
||||
DPRINT("page_tlb %x\n",page_tlb);
|
||||
|
||||
if (PAGE_MASK(page_dir[VADDR_TO_PD_OFFSET(Address)])==0)
|
||||
{
|
||||
DPRINT("Creating new page directory\n",0);
|
||||
page_table = get_free_page(); // Returns a physical address
|
||||
page_tlb=(unsigned int *)physical_to_linear(page_table);
|
||||
memset(page_tlb,0,PAGESIZE);
|
||||
page_dir[VADDR_TO_PD_OFFSET(Address)]=page_table+0x7;
|
||||
|
||||
}
|
||||
return(&page_tlb[VADDR_TO_PT_OFFSET(Address)/4]);
|
||||
}
|
||||
|
||||
BOOLEAN MmIsPagePresent(PEPROCESS Process, PVOID Address)
|
||||
{
|
||||
return((*MmGetPageEntry(Process, Address)) & PA_PRESENT);
|
||||
}
|
||||
|
||||
VOID MmSetPage(PEPROCESS Process,
|
||||
PVOID Address,
|
||||
ULONG flProtect,
|
||||
ULONG PhysicalAddress)
|
||||
{
|
||||
|
||||
ULONG Attributes = 0;
|
||||
|
||||
Attributes = ProtectToPTE(flProtect);
|
||||
|
||||
(*MmGetPageEntry(Process, Address)) = PhysicalAddress | Attributes;
|
||||
}
|
||||
|
||||
VOID MmSetPageProtect(PEPROCESS Process,
|
||||
PVOID Address,
|
||||
ULONG flProtect)
|
||||
{
|
||||
ULONG Attributes = 0;
|
||||
PULONG PageEntry;
|
||||
|
||||
Attributes = ProtectToPTE(flProtect);
|
||||
|
||||
PageEntry = MmGetPageEntry(Process,Address);
|
||||
(*PageEntry) = PAGE_MASK(*PageEntry) | Attributes;
|
||||
}
|
||||
|
||||
/*
|
||||
* The mark_page_xxxx manipulate the attributes of a page. Use the
|
||||
* higher level functions for synchronization. These functions only work
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
* FILE: mkernel/hal/eisa.c
|
||||
* FILE: ntoskrnl/hal/x86/pci.c
|
||||
* PURPOSE: Interfaces to the PCI bus
|
||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
||||
* UPDATE HISTORY:
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
#include <internal/ntoskrnl.h>
|
||||
#include <internal/string.h>
|
||||
#include <internal/hal/page.h>
|
||||
#include <internal/mmhal.h>
|
||||
#include <internal/hal/io.h>
|
||||
|
||||
#include <internal/debug.h>
|
||||
|
@ -66,6 +66,7 @@ static unsigned char mode03[] = {0x67,0x00,0x03,0x00,0x03,0x00,0x02,
|
|||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
||||
|
||||
void HalSwitchToBlueScreen(void)
|
||||
/*
|
||||
* FUNCTION: Switches the monitor to text mode and writes a blue background
|
||||
|
@ -94,6 +95,14 @@ void HalSwitchToBlueScreen(void)
|
|||
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS STDCALL NtDisplayString(IN PUNICODE_STRING DisplayString)
|
||||
{
|
||||
// DbgPrint("DisplayString %x\n",DisplayString);
|
||||
DbgPrint("%s",DisplayString);
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
void HalDisplayString(char* string)
|
||||
/*
|
||||
* FUNCTION: Switches the screen to HAL console mode (BSOD) if not there
|
||||
|
|
|
@ -2,4 +2,4 @@ HAL_OBJECTS = hal/x86/head.o hal/x86/irq.o hal/x86/exp.o hal/x86/isa.o \
|
|||
hal/x86/pci.o hal/x86/irqhand.o hal/x86/page.o hal/x86/halinit.o \
|
||||
hal/x86/irql.o hal/x86/bios32.o hal/x86/thread.o hal/x86/spinlock.o \
|
||||
hal/x86/printk.o hal/x86/mp.o hal/x86/dma.o hal/x86/bus.o hal/x86/mbr.o \
|
||||
hal/x86/sysinfo.o
|
||||
hal/x86/sysinfo.o hal/x86/usercall.o
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
#include <internal/ps.h>
|
||||
#include <internal/string.h>
|
||||
#include <internal/hal.h>
|
||||
#include <internal/hal/segment.h>
|
||||
#include <internal/hal/page.h>
|
||||
#include <internal/i386/segment.h>
|
||||
#include <internal/mmhal.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
@ -29,7 +29,7 @@
|
|||
|
||||
static char null_ldt[8]={0,};
|
||||
static unsigned int null_ldt_sel=0;
|
||||
static PKTHREAD FirstThread=NULL;
|
||||
static PETHREAD FirstThread=NULL;
|
||||
|
||||
/* FUNCTIONS **************************************************************/
|
||||
|
||||
|
@ -42,6 +42,7 @@ void HalTaskSwitch(PKTHREAD thread)
|
|||
* again
|
||||
*/
|
||||
{
|
||||
DPRINT("Scheduling thread %x\n",thread);
|
||||
DPRINT("Scheduling thread %x\n",thread->Context.nr);
|
||||
DPRINT("previous task %x reserved1 %x esp0 %x ss0 %x\n",
|
||||
thread->Context.previous_task,thread->Context.reserved1,
|
||||
|
@ -75,7 +76,6 @@ void HalTaskSwitch(PKTHREAD thread)
|
|||
: /* No outputs */
|
||||
: "m" (*(((unsigned char *)(&(thread->Context.nr)))-4) )
|
||||
: "ax","dx");
|
||||
// set_breakpoint(0,&(FirstThread->Context.gs),HBP_READWRITE,HBP_DWORD);
|
||||
}
|
||||
|
||||
static unsigned int allocate_tss_descriptor(void)
|
||||
|
@ -114,8 +114,129 @@ static void begin_thread(PKSTART_ROUTINE fn, PVOID start_context)
|
|||
for(;;);
|
||||
}
|
||||
|
||||
BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn,
|
||||
PVOID StartContext)
|
||||
#define FLAG_NT (1<<14)
|
||||
#define FLAG_VM (1<<17)
|
||||
#define FLAG_IF (1<<9)
|
||||
#define FLAG_IOPL ((1<<12)+(1<<13))
|
||||
|
||||
NTSTATUS KeValidateUserContext(PCONTEXT Context)
|
||||
/*
|
||||
* FUNCTION: Validates a processor context
|
||||
* ARGUMENTS:
|
||||
* Context = Context to validate
|
||||
* RETURNS: Status
|
||||
* NOTE: This only validates the context as not violating system security, it
|
||||
* doesn't guararantee the thread won't crash at some point
|
||||
* NOTE2: This relies on there only being two selectors which can access
|
||||
* system space
|
||||
*/
|
||||
{
|
||||
if (Context->Eip >= KERNEL_BASE)
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
if (Context->SegCs == KERNEL_CS)
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
if (Context->SegDs == KERNEL_DS)
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
if (Context->SegEs == KERNEL_DS)
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
if (Context->SegFs == KERNEL_DS)
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
if (Context->SegGs == KERNEL_DS)
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
if ((Context->EFlags & FLAG_IOPL) != 0 ||
|
||||
(Context->EFlags & FLAG_NT) ||
|
||||
(Context->EFlags & FLAG_VM) ||
|
||||
(!(Context->EFlags & FLAG_IF)))
|
||||
{
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS HalInitTaskWithContext(PETHREAD Thread, PCONTEXT Context)
|
||||
/*
|
||||
* FUNCTION: Initialize a task with a user mode context
|
||||
* ARGUMENTS:
|
||||
* Thread = Thread to initialize
|
||||
* Context = Processor context to initialize it with
|
||||
* RETURNS: Status
|
||||
*/
|
||||
{
|
||||
unsigned int desc;
|
||||
unsigned int length;
|
||||
unsigned int base;
|
||||
unsigned int* kernel_stack;
|
||||
NTSTATUS Status;
|
||||
|
||||
DPRINT("HalInitTaskWithContext(Thread %x, Context %x)\n",
|
||||
Thread,Context);
|
||||
|
||||
assert(sizeof(hal_thread_state)>=0x68);
|
||||
|
||||
if ((Status=KeValidateUserContext(Context))!=STATUS_SUCCESS)
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
desc = allocate_tss_descriptor();
|
||||
length = sizeof(hal_thread_state) - 1;
|
||||
base = (unsigned int)(&(Thread->Tcb.Context));
|
||||
kernel_stack = ExAllocatePool(NonPagedPool,PAGESIZE);
|
||||
|
||||
/*
|
||||
* Setup a TSS descriptor
|
||||
*/
|
||||
gdt[desc].a = (length & 0xffff) | ((base & 0xffff) << 16);
|
||||
gdt[desc].b = ((base & 0xff0000)>>16) | 0x8900 | (length & 0xf0000)
|
||||
| (base & 0xff000000);
|
||||
|
||||
/*
|
||||
* Initialize the thread context
|
||||
*/
|
||||
memset(&Thread->Tcb.Context,0,sizeof(hal_thread_state));
|
||||
Thread->Tcb.Context.ldt = null_ldt_sel;
|
||||
Thread->Tcb.Context.eflags = Context->EFlags;
|
||||
Thread->Tcb.Context.iomap_base = FIELD_OFFSET(hal_thread_state,io_bitmap);
|
||||
Thread->Tcb.Context.esp0 = (ULONG)&kernel_stack[1021];
|
||||
Thread->Tcb.Context.ss0 = KERNEL_DS;
|
||||
Thread->Tcb.Context.esp = Context->Esp;
|
||||
Thread->Tcb.Context.ss = Context->SegSs;
|
||||
Thread->Tcb.Context.cs = Context->SegCs;
|
||||
Thread->Tcb.Context.eip = Context->Eip;
|
||||
Thread->Tcb.Context.io_bitmap[0] = 0xff;
|
||||
Thread->Tcb.Context.cr3 =
|
||||
linear_to_physical(Thread->ThreadsProcess->Pcb.PageTableDirectory);
|
||||
Thread->Tcb.Context.ds = Context->SegDs;
|
||||
Thread->Tcb.Context.es = Context->SegEs;
|
||||
Thread->Tcb.Context.fs = Context->SegFs;
|
||||
Thread->Tcb.Context.gs = Context->SegGs;
|
||||
Thread->Tcb.Context.eax = Context->Eax;
|
||||
Thread->Tcb.Context.ebx = Context->Ebx;
|
||||
Thread->Tcb.Context.ecx = Context->Ecx;
|
||||
Thread->Tcb.Context.edx = Context->Edx;
|
||||
Thread->Tcb.Context.edi = Context->Edi;
|
||||
Thread->Tcb.Context.esi = Context->Esi;
|
||||
Thread->Tcb.Context.ebp = Context->Ebp;
|
||||
|
||||
Thread->Tcb.Context.nr = desc * 8;
|
||||
DPRINT("Allocated %x\n",desc*8);
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
BOOLEAN HalInitTask(PETHREAD thread, PKSTART_ROUTINE fn, PVOID StartContext)
|
||||
/*
|
||||
* FUNCTION: Initializes the HAL portion of a thread object
|
||||
* ARGUMENTS:
|
||||
|
@ -127,11 +248,12 @@ BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn,
|
|||
{
|
||||
unsigned int desc = allocate_tss_descriptor();
|
||||
unsigned int length = sizeof(hal_thread_state) - 1;
|
||||
unsigned int base = (unsigned int)(&(thread->Context));
|
||||
unsigned int base = (unsigned int)(&(thread->Tcb.Context));
|
||||
unsigned int* kernel_stack = ExAllocatePool(NonPagedPool,4096);
|
||||
|
||||
DPRINT("HalInitTask(Thread %x, fn %x, StartContext %x)\n",
|
||||
thread,fn,StartContext);
|
||||
DPRINT("thread->ThreadsProcess %x\n",thread->ThreadsProcess);
|
||||
|
||||
/*
|
||||
* Make sure
|
||||
|
@ -156,30 +278,31 @@ BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn,
|
|||
/*
|
||||
* Initialize the thread context
|
||||
*/
|
||||
memset(&thread->Context,0,sizeof(hal_thread_state));
|
||||
thread->Context.ldt = null_ldt_sel;
|
||||
thread->Context.eflags = (1<<1)+(1<<9);
|
||||
thread->Context.iomap_base = FIELD_OFFSET(hal_thread_state,io_bitmap);
|
||||
thread->Context.esp0 = &kernel_stack[1021];
|
||||
thread->Context.ss0 = KERNEL_DS;
|
||||
thread->Context.esp = &kernel_stack[1021];
|
||||
thread->Context.ss = KERNEL_DS;
|
||||
thread->Context.cs = KERNEL_CS;
|
||||
thread->Context.eip = (unsigned long)begin_thread;
|
||||
thread->Context.io_bitmap[0] = 0xff;
|
||||
thread->Context.cr3 = ((unsigned int)get_page_directory()) - IDMAP_BASE;
|
||||
thread->Context.ds = KERNEL_DS;
|
||||
thread->Context.es = KERNEL_DS;
|
||||
thread->Context.fs = KERNEL_DS;
|
||||
thread->Context.gs = KERNEL_DS;
|
||||
thread->Context.nr = desc * 8;
|
||||
memset(&thread->Tcb.Context,0,sizeof(hal_thread_state));
|
||||
thread->Tcb.Context.ldt = null_ldt_sel;
|
||||
thread->Tcb.Context.eflags = (1<<1)+(1<<9);
|
||||
thread->Tcb.Context.iomap_base = FIELD_OFFSET(hal_thread_state,io_bitmap);
|
||||
thread->Tcb.Context.esp0 = &kernel_stack[1021];
|
||||
thread->Tcb.Context.ss0 = KERNEL_DS;
|
||||
thread->Tcb.Context.esp = &kernel_stack[1021];
|
||||
thread->Tcb.Context.ss = KERNEL_DS;
|
||||
thread->Tcb.Context.cs = KERNEL_CS;
|
||||
thread->Tcb.Context.eip = (unsigned long)begin_thread;
|
||||
thread->Tcb.Context.io_bitmap[0] = 0xff;
|
||||
thread->Tcb.Context.cr3 =
|
||||
linear_to_physical(thread->ThreadsProcess->Pcb.PageTableDirectory);
|
||||
thread->Tcb.Context.ds = KERNEL_DS;
|
||||
thread->Tcb.Context.es = KERNEL_DS;
|
||||
thread->Tcb.Context.fs = KERNEL_DS;
|
||||
thread->Tcb.Context.gs = KERNEL_DS;
|
||||
thread->Tcb.Context.nr = desc * 8;
|
||||
DPRINT("Allocated %x\n",desc*8);
|
||||
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
void HalInitFirstTask(PKTHREAD thread)
|
||||
void HalInitFirstTask(PETHREAD thread)
|
||||
/*
|
||||
* FUNCTION: Called to setup the HAL portion of a thread object for the
|
||||
* initial thread
|
||||
|
@ -208,6 +331,6 @@ void HalInitFirstTask(PKTHREAD thread)
|
|||
*/
|
||||
__asm__("ltr %%ax"
|
||||
: /* no output */
|
||||
: "a" (thread->Context.nr));
|
||||
: "a" (thread->Tcb.Context.nr));
|
||||
FirstThread = thread;
|
||||
}
|
||||
|
|
|
@ -1,46 +1,35 @@
|
|||
;
|
||||
;
|
||||
|
||||
%include "internal/hal/segment.inc"
|
||||
%include 'internal/hal/segment.inc'
|
||||
|
||||
bits 32
|
||||
section .text
|
||||
extern _SystemServiceTable
|
||||
extern __SystemServiceTable
|
||||
global _interrupt_handler2e
|
||||
|
||||
_kernel_mode_call_handler:
|
||||
|
||||
;
|
||||
; Save some registers
|
||||
;
|
||||
_interrupt_handler2e:
|
||||
push ds
|
||||
push es
|
||||
push esi
|
||||
push edi
|
||||
|
||||
;
|
||||
; Transfer the parameters from user mode
|
||||
;
|
||||
push USER_DS
|
||||
pop es
|
||||
mov bx,KERNEL_DS
|
||||
mov es,bx
|
||||
|
||||
mov edx,esi
|
||||
mov esp,edi
|
||||
mov ecx,_SystemServiceTable[eax*4]
|
||||
mov esi,edx
|
||||
mov ecx,[es:__SystemServiceTable+eax*8]
|
||||
sub esp,ecx
|
||||
cld
|
||||
mov edi,esp
|
||||
rep movsb
|
||||
|
||||
;
|
||||
; Call the actual service routine
|
||||
;
|
||||
mov eax,_SystemServiceTable[eax*4+4]
|
||||
jmp eax
|
||||
mov ds,bx
|
||||
|
||||
mov eax,[__SystemServiceTable+4+eax*8]
|
||||
call eax
|
||||
|
||||
;
|
||||
; Restore registers and return
|
||||
;
|
||||
pop edi
|
||||
pop esi
|
||||
pop es
|
||||
pop ds
|
||||
ret
|
||||
iret
|
||||
|
|
|
@ -21,6 +21,18 @@ static KSPIN_LOCK CancelSpinLock = {0,};
|
|||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
NTSTATUS STDCALL NtCancelIoFile(IN HANDLE FileHandle,
|
||||
OUT PIO_STATUS_BLOCK IoStatusBlock)
|
||||
{
|
||||
return(ZwCancelIoFile(FileHandle,IoStatusBlock));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwCancelIoFile(IN HANDLE FileHandle,
|
||||
OUT PIO_STATUS_BLOCK IoStatusBlock)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
BOOLEAN IoCancelIrp(PIRP Irp)
|
||||
{
|
||||
KIRQL oldlvl;
|
||||
|
|
|
@ -22,6 +22,41 @@
|
|||
|
||||
/* FUNCTIONS *************************************************************/
|
||||
|
||||
NTSTATUS STDCALL NtDeleteFile(IN POBJECT_ATTRIBUTES ObjectAttributes)
|
||||
{
|
||||
return(ZwDeleteFile(ObjectAttributes));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwDeleteFile(IN POBJECT_ATTRIBUTES ObjectAttributes)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS NtCreateFile(PHANDLE FileHandle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
PIO_STATUS_BLOCK IoStatusBlock,
|
||||
PLARGE_INTEGER AllocateSize,
|
||||
ULONG FileAttributes,
|
||||
ULONG ShareAccess,
|
||||
ULONG CreateDisposition,
|
||||
ULONG CreateOptions,
|
||||
PVOID EaBuffer,
|
||||
ULONG EaLength)
|
||||
{
|
||||
return(ZwCreateFile(FileHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes,
|
||||
IoStatusBlock,
|
||||
AllocateSize,
|
||||
FileAttributes,
|
||||
ShareAccess,
|
||||
CreateDisposition,
|
||||
CreateOptions,
|
||||
EaBuffer,
|
||||
EaLength));
|
||||
}
|
||||
|
||||
NTSTATUS ZwCreateFile(PHANDLE FileHandle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
|
@ -56,7 +91,144 @@ NTSTATUS ZwCreateFile(PHANDLE FileHandle,
|
|||
* RETURNS: Status
|
||||
*/
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
PVOID Object;
|
||||
NTSTATUS Status;
|
||||
PIRP Irp;
|
||||
KEVENT Event;
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
PFILE_OBJECT FileObject;
|
||||
PIO_STACK_LOCATION StackLoc;
|
||||
PWSTR Remainder;
|
||||
|
||||
DPRINT("ZwCreateFile(FileHandle %x, DesiredAccess %x, "
|
||||
"ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %w)\n",
|
||||
FileHandle,DesiredAccess,ObjectAttributes,
|
||||
ObjectAttributes->ObjectName->Buffer);
|
||||
|
||||
assert_irql(PASSIVE_LEVEL);
|
||||
|
||||
*FileHandle=0;
|
||||
|
||||
FileObject = ObGenericCreateObject(FileHandle,DesiredAccess,NULL,IoFileType);
|
||||
memset(FileObject,0,sizeof(FILE_OBJECT));
|
||||
|
||||
Status = ObOpenObjectByName(ObjectAttributes,&Object,&Remainder);
|
||||
|
||||
if (Status != STATUS_SUCCESS && Status != STATUS_FS_QUERY_REQUIRED)
|
||||
{
|
||||
DPRINT("%s() = Failed to find object\n",__FUNCTION__);
|
||||
ZwClose(*FileHandle);
|
||||
*FileHandle=0;
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
|
||||
DeviceObject = (PDEVICE_OBJECT)Object;
|
||||
DeviceObject = IoGetAttachedDevice(DeviceObject);
|
||||
DPRINT("DeviceObject %x\n",DeviceObject);
|
||||
|
||||
if (Status == STATUS_SUCCESS)
|
||||
{
|
||||
CHECKPOINT;
|
||||
FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN;
|
||||
FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool,
|
||||
ObjectAttributes->ObjectName->Length);
|
||||
FileObject->FileName.Length = ObjectAttributes->Length;
|
||||
RtlCopyUnicodeString(&(FileObject->FileName),
|
||||
ObjectAttributes->ObjectName);
|
||||
}
|
||||
else
|
||||
{
|
||||
CHECKPOINT;
|
||||
if (DeviceObject->DeviceType != FILE_DEVICE_FILE_SYSTEM &&
|
||||
DeviceObject->DeviceType != FILE_DEVICE_DISK)
|
||||
{
|
||||
ZwClose(*FileHandle);
|
||||
*FileHandle=0;
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
if (!(DeviceObject->Vpb->Flags & VPB_MOUNTED))
|
||||
{
|
||||
Status = IoTryToMountStorageDevice(DeviceObject);
|
||||
if (Status!=STATUS_SUCCESS)
|
||||
{
|
||||
ZwClose(*FileHandle);
|
||||
*FileHandle=0;
|
||||
return(Status);
|
||||
}
|
||||
DeviceObject = IoGetAttachedDevice(DeviceObject);
|
||||
}
|
||||
DPRINT("Remainder %w\n",Remainder);
|
||||
FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool,
|
||||
wstrlen(Remainder));
|
||||
RtlInitUnicodeString(&(FileObject->FileName),Remainder);
|
||||
DPRINT("FileObject->FileName.Buffer %x %w\n",
|
||||
FileObject->FileName.Buffer,FileObject->FileName.Buffer);
|
||||
}
|
||||
CHECKPOINT;
|
||||
|
||||
if (CreateOptions & FILE_SYNCHRONOUS_IO_ALERT)
|
||||
{
|
||||
FileObject->Flags = FileObject->Flags | FO_ALERTABLE_IO;
|
||||
FileObject->Flags = FileObject->Flags | FO_SYNCHRONOUS_IO;
|
||||
}
|
||||
if (CreateOptions & FILE_SYNCHRONOUS_IO_NONALERT)
|
||||
{
|
||||
FileObject->Flags = FileObject->Flags | FO_SYNCHRONOUS_IO;
|
||||
}
|
||||
|
||||
FileObject->DeviceObject=DeviceObject;
|
||||
FileObject->Vpb=DeviceObject->Vpb;
|
||||
|
||||
KeInitializeEvent(&Event,NotificationEvent,FALSE);
|
||||
|
||||
Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
|
||||
if (Irp==NULL)
|
||||
{
|
||||
ZwClose(*FileHandle);
|
||||
*FileHandle=0;
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
StackLoc = IoGetNextIrpStackLocation(Irp);
|
||||
StackLoc->MajorFunction = IRP_MJ_CREATE;
|
||||
StackLoc->MinorFunction = 0;
|
||||
StackLoc->Flags = 0;
|
||||
StackLoc->Control = 0;
|
||||
StackLoc->DeviceObject = DeviceObject;
|
||||
StackLoc->FileObject=FileObject;
|
||||
Status = IoCallDriver(DeviceObject,Irp);
|
||||
if (Status==STATUS_PENDING)
|
||||
{
|
||||
KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
|
||||
Status = IoStatusBlock->Status;
|
||||
}
|
||||
|
||||
if (Status!=STATUS_SUCCESS)
|
||||
{
|
||||
ZwClose(*FileHandle);
|
||||
*FileHandle=0;
|
||||
}
|
||||
|
||||
DPRINT("*FileHandle %x\n",*FileHandle);
|
||||
|
||||
return(Status);
|
||||
|
||||
}
|
||||
|
||||
NTSTATUS NtOpenFile(PHANDLE FileHandle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
PIO_STATUS_BLOCK IoStatusBlock,
|
||||
ULONG ShareAccess,
|
||||
ULONG OpenOptions)
|
||||
{
|
||||
return(ZwOpenFile(FileHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes,
|
||||
IoStatusBlock,
|
||||
ShareAccess,
|
||||
OpenOptions));
|
||||
}
|
||||
|
||||
NTSTATUS ZwOpenFile(PHANDLE FileHandle,
|
||||
|
@ -79,119 +251,17 @@ NTSTATUS ZwOpenFile(PHANDLE FileHandle,
|
|||
* NOTE: Undocumented
|
||||
*/
|
||||
{
|
||||
PVOID Object;
|
||||
NTSTATUS Status;
|
||||
PIRP Irp;
|
||||
KEVENT Event;
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
PFILE_OBJECT FileObject;
|
||||
PIO_STACK_LOCATION StackLoc;
|
||||
PWSTR Remainder;
|
||||
|
||||
DPRINT("ZwOpenFile(FileHandle %x, ObjectAttributes %x, "
|
||||
"ObjectAttributes->ObjectName->Buffer %w)\n",FileHandle,
|
||||
ObjectAttributes,ObjectAttributes->ObjectName->Buffer);
|
||||
|
||||
assert_irql(PASSIVE_LEVEL);
|
||||
|
||||
*FileHandle=0;
|
||||
|
||||
FileObject = ObGenericCreateObject(FileHandle,0,NULL,OBJTYP_FILE);
|
||||
memset(FileObject,0,sizeof(FILE_OBJECT));
|
||||
|
||||
Status = ObOpenObjectByName(ObjectAttributes,&Object,&Remainder);
|
||||
|
||||
if (Status != STATUS_SUCCESS && Status != STATUS_FS_QUERY_REQUIRED)
|
||||
{
|
||||
DPRINT("%s() = Failed to find object\n",__FUNCTION__);
|
||||
ObDeleteHandle(*FileHandle);
|
||||
*FileHandle=0;
|
||||
ExFreePool(FileObject);
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
|
||||
DeviceObject = (PDEVICE_OBJECT)Object;
|
||||
DeviceObject = IoGetAttachedDevice(DeviceObject);
|
||||
DPRINT("DeviceObject %x\n",DeviceObject);
|
||||
|
||||
if (Status == STATUS_SUCCESS)
|
||||
{
|
||||
CHECKPOINT;
|
||||
FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN;
|
||||
FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool,
|
||||
ObjectAttributes->Length);
|
||||
RtlCopyUnicodeString(&(FileObject->FileName),
|
||||
ObjectAttributes->ObjectName);
|
||||
}
|
||||
else
|
||||
{
|
||||
CHECKPOINT;
|
||||
if (DeviceObject->DeviceType != FILE_DEVICE_FILE_SYSTEM &&
|
||||
DeviceObject->DeviceType != FILE_DEVICE_DISK)
|
||||
{
|
||||
ObDeleteHandle(*FileHandle);
|
||||
*FileHandle=0;
|
||||
ExFreePool(FileObject);
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
if (!(DeviceObject->Vpb->Flags & VPB_MOUNTED))
|
||||
{
|
||||
Status = IoTryToMountStorageDevice(DeviceObject);
|
||||
if (Status!=STATUS_SUCCESS)
|
||||
{
|
||||
ObDeleteHandle(*FileHandle);
|
||||
*FileHandle=0;
|
||||
ExFreePool(FileObject);
|
||||
return(Status);
|
||||
}
|
||||
DeviceObject = IoGetAttachedDevice(DeviceObject);
|
||||
}
|
||||
DPRINT("Remainder %w\n",Remainder);
|
||||
FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool,
|
||||
wstrlen(Remainder));
|
||||
RtlInitUnicodeString(&(FileObject->FileName),Remainder);
|
||||
DPRINT("FileObject->FileName.Buffer %x %w\n",
|
||||
FileObject->FileName.Buffer,FileObject->FileName.Buffer);
|
||||
}
|
||||
CHECKPOINT;
|
||||
|
||||
FileObject->DeviceObject=DeviceObject;
|
||||
FileObject->Vpb=DeviceObject->Vpb;
|
||||
|
||||
KeInitializeEvent(&Event,NotificationEvent,FALSE);
|
||||
|
||||
Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
|
||||
if (Irp==NULL)
|
||||
{
|
||||
ObDeleteHandle(*FileHandle);
|
||||
*FileHandle=0;
|
||||
ExFreePool(FileObject);
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
StackLoc = IoGetNextIrpStackLocation(Irp);
|
||||
StackLoc->MajorFunction = IRP_MJ_CREATE;
|
||||
StackLoc->MinorFunction = 0;
|
||||
StackLoc->Flags = 0;
|
||||
StackLoc->Control = 0;
|
||||
StackLoc->DeviceObject = DeviceObject;
|
||||
StackLoc->FileObject=FileObject;
|
||||
Status = IoCallDriver(DeviceObject,Irp);
|
||||
if (Status==STATUS_PENDING)
|
||||
{
|
||||
KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
|
||||
Status = IoStatusBlock->Status;
|
||||
}
|
||||
|
||||
if (Status!=STATUS_SUCCESS)
|
||||
{
|
||||
ObDeleteHandle(*FileHandle);
|
||||
*FileHandle=0;
|
||||
ExFreePool(FileObject);
|
||||
}
|
||||
|
||||
return(Status);
|
||||
return(ZwCreateFile(FileHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes,
|
||||
IoStatusBlock,
|
||||
NULL,
|
||||
0,
|
||||
ShareAccess,
|
||||
FILE_OPEN,
|
||||
OpenOptions,
|
||||
NULL,
|
||||
0));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -21,6 +21,27 @@
|
|||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
NtUnloadDriver(
|
||||
IN PUNICODE_STRING DriverServiceName
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
ZwUnloadDriver(
|
||||
IN PUNICODE_STRING DriverServiceName
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS NtLoadDriver(PUNICODE_STRING DriverServiceName)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS ZwLoadDriver(PUNICODE_STRING DriverServiceName)
|
||||
/*
|
||||
* FUNCTION: Loads a driver
|
||||
|
@ -187,11 +208,11 @@ NTSTATUS IoCreateDevice(PDRIVER_OBJECT DriverObject,
|
|||
if (DeviceName!=NULL)
|
||||
{
|
||||
InitializeObjectAttributes(&dev_attr,DeviceName,0,NULL,NULL);
|
||||
dev = ObGenericCreateObject(&devh,0,&dev_attr,OBJTYP_DEVICE);
|
||||
dev = ObGenericCreateObject(&devh,0,&dev_attr,IoDeviceType);
|
||||
}
|
||||
else
|
||||
{
|
||||
dev = ObGenericCreateObject(&devh,0,NULL,OBJTYP_DEVICE);
|
||||
dev = ObGenericCreateObject(&devh,0,NULL,IoDeviceType);
|
||||
}
|
||||
|
||||
*DeviceObject=NULL;
|
||||
|
|
|
@ -11,38 +11,48 @@
|
|||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <ddk/ntddk.h>
|
||||
#include <internal/mm.h>
|
||||
|
||||
#include <internal/debug.h>
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
VOID MmUnlockPagableImageSection(PVOID ImageSectionHandle)
|
||||
/*
|
||||
* FUNCTION: Releases a section of driver code or driver data, previously
|
||||
* locked into system space with MmLockPagableCodeSection,
|
||||
* MmLockPagableDataSection or MmLockPagableSectionByHandle
|
||||
* ARGUMENTS:
|
||||
* ImageSectionHandle = Handle returned by MmLockPagableCodeSection or
|
||||
* MmLockPagableDataSection
|
||||
*/
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
MmUnlockMemoryArea((MEMORY_AREA *)ImageSectionHandle);
|
||||
}
|
||||
|
||||
VOID MmLockPagableSectionByHandle(PVOID ImageSectionHandle)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
MmLockMemoryArea((MEMORY_AREA *)ImageSectionHandle);
|
||||
}
|
||||
|
||||
PVOID MmLockPagableCodeSection(PVOID AddressWithinSection)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
PVOID Handle;
|
||||
Handle = MmOpenMemoryAreaByAddress(NULL,AddressWithinSection);
|
||||
MmLockPagableSectionByHandle(Handle);
|
||||
return(Handle);
|
||||
}
|
||||
|
||||
PVOID MmLockPagableDataSection(PVOID AddressWithinSection)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return(MmLockPagableCodeSection(AddressWithinSection));
|
||||
}
|
||||
|
||||
VOID MmPageEntireDriver(PVOID AddressWithinSection)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
VOID MmResetDriverPaging(PVOID AddressWithinSection)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
|
|
|
@ -25,6 +25,15 @@ NTSTATUS ZwQueryInformationFile(HANDLE FileHandle,
|
|||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS NtQueryInformationFile(HANDLE FileHandle,
|
||||
PIO_STATUS_BLOCK IoStatusBlock,
|
||||
PVOID FileInformation,
|
||||
ULONG Length,
|
||||
FILE_INFORMATION_CLASS FileInformationClass)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS ZwSetInformationFile(HANDLE FileHandle,
|
||||
PIO_STATUS_BLOCK IoStatusBlock,
|
||||
PVOID FileInformation,
|
||||
|
@ -34,7 +43,90 @@ NTSTATUS ZwSetInformationFile(HANDLE FileHandle,
|
|||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS NtSetInformationFile(HANDLE FileHandle,
|
||||
PIO_STATUS_BLOCK IoStatusBlock,
|
||||
PVOID FileInformation,
|
||||
ULONG Length,
|
||||
FILE_INFORMATION_CLASS FileInformationClass)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
PGENERIC_MAPPING IoGetFileObjectGenericMapping()
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
NtQueryAttributesFile(
|
||||
IN HANDLE FileHandle,
|
||||
IN PVOID Buffer
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
ZwQueryAttributesFile(
|
||||
IN HANDLE FileHandle,
|
||||
IN PVOID Buffer
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
NtQueryFullAttributesFile(
|
||||
IN HANDLE FileHandle,
|
||||
IN PVOID Attributes
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
ZwQueryFullAttributesFile(
|
||||
IN HANDLE FileHandle,
|
||||
IN PVOID Attributes
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
NtQueryEaFile(
|
||||
IN HANDLE FileHandle,
|
||||
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||||
OUT PVOID Buffer,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN ReturnSingleEntry,
|
||||
IN PVOID EaList OPTIONAL,
|
||||
IN ULONG EaListLength,
|
||||
IN PULONG EaIndex OPTIONAL,
|
||||
IN BOOLEAN RestartScan
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
NtSetEaFile(
|
||||
IN HANDLE FileHandle,
|
||||
IN PIO_STATUS_BLOCK IoStatusBlock,
|
||||
PVOID EaBuffer,
|
||||
ULONG EaBufferSize
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
ZwSetEaFile(
|
||||
IN HANDLE FileHandle,
|
||||
IN PIO_STATUS_BLOCK IoStatusBlock,
|
||||
PVOID EaBuffer,
|
||||
ULONG EaBufferSize
|
||||
)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -31,6 +31,51 @@ static LIST_ENTRY FileSystemListHead = {NULL,NULL};
|
|||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
NtFsControlFile(
|
||||
IN HANDLE DeviceHandle,
|
||||
IN HANDLE Event OPTIONAL,
|
||||
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
|
||||
IN PVOID ApcContext OPTIONAL,
|
||||
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||||
IN ULONG IoControlCode,
|
||||
IN PVOID InputBuffer,
|
||||
IN ULONG InputBufferSize,
|
||||
OUT PVOID OutputBuffer,
|
||||
IN ULONG OutputBufferSize
|
||||
)
|
||||
{
|
||||
return(ZwFsControlFile(DeviceHandle,
|
||||
Event,
|
||||
ApcRoutine,
|
||||
ApcContext,
|
||||
IoStatusBlock,
|
||||
IoControlCode,
|
||||
InputBuffer,
|
||||
InputBufferSize,
|
||||
OutputBuffer,
|
||||
OutputBufferSize));
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
ZwFsControlFile(
|
||||
IN HANDLE DeviceHandle,
|
||||
IN HANDLE Event OPTIONAL,
|
||||
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
|
||||
IN PVOID ApcContext OPTIONAL,
|
||||
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||||
IN ULONG IoControlCode,
|
||||
IN PVOID InputBuffer,
|
||||
IN ULONG InputBufferSize,
|
||||
OUT PVOID OutputBuffer,
|
||||
IN ULONG OutputBufferSize
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
VOID IoInitFileSystemImplementation(VOID)
|
||||
{
|
||||
InitializeListHead(&FileSystemListHead);
|
||||
|
@ -142,6 +187,7 @@ VOID IoUnregisterFileSystem(PDEVICE_OBJECT DeviceObject)
|
|||
if (current->DeviceObject == DeviceObject)
|
||||
{
|
||||
RemoveEntryList(current_entry);
|
||||
ExFreePool(current);
|
||||
KeReleaseSpinLock(&FileSystemListLock,oldlvl);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -20,3 +20,37 @@ ULONG IoGetFunctionCodeFromCtlCode(ULONG ControlCode)
|
|||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
NtDeviceIoControlFile(
|
||||
IN HANDLE DeviceHandle,
|
||||
IN HANDLE Event OPTIONAL,
|
||||
IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
|
||||
IN PVOID UserApcContext OPTIONAL,
|
||||
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||||
IN ULONG IoControlCode,
|
||||
IN PVOID InputBuffer,
|
||||
IN ULONG InputBufferSize,
|
||||
OUT PVOID OutputBuffer,
|
||||
IN ULONG OutputBufferSize
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
ZwDeviceIoControlFile(
|
||||
IN HANDLE DeviceHandle,
|
||||
IN HANDLE Event OPTIONAL,
|
||||
IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
|
||||
IN PVOID UserApcContext OPTIONAL,
|
||||
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||||
IN ULONG IoControlCode,
|
||||
IN PVOID InputBuffer,
|
||||
IN ULONG InputBufferSize,
|
||||
OUT PVOID OutputBuffer,
|
||||
IN ULONG OutputBufferSize
|
||||
)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -13,45 +13,15 @@
|
|||
#include <windows.h>
|
||||
#include <ddk/ntddk.h>
|
||||
#include <internal/ob.h>
|
||||
#include <internal/io.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
/* GLOBALS *******************************************************************/
|
||||
|
||||
OBJECT_TYPE DeviceObjectType = {{0,0,NULL},
|
||||
0,
|
||||
0,
|
||||
ULONG_MAX,
|
||||
ULONG_MAX,
|
||||
sizeof(DEVICE_OBJECT),
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
};
|
||||
|
||||
OBJECT_TYPE FileObjectType = {{0,0,NULL},
|
||||
0,
|
||||
0,
|
||||
ULONG_MAX,
|
||||
ULONG_MAX,
|
||||
sizeof(FILE_OBJECT),
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
};
|
||||
POBJECT_TYPE IoDeviceType = NULL;
|
||||
POBJECT_TYPE IoFileType = NULL;
|
||||
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
@ -60,31 +30,63 @@ VOID IoInit(VOID)
|
|||
{
|
||||
OBJECT_ATTRIBUTES attr;
|
||||
HANDLE handle;
|
||||
UNICODE_STRING string;
|
||||
ANSI_STRING astring;
|
||||
UNICODE_STRING UnicodeString;
|
||||
ANSI_STRING AnsiString;
|
||||
|
||||
/*
|
||||
* Register iomgr types
|
||||
*/
|
||||
RtlInitAnsiString(&astring,"Device");
|
||||
RtlAnsiStringToUnicodeString(&DeviceObjectType.TypeName,&astring,TRUE);
|
||||
ObRegisterType(OBJTYP_DEVICE,&DeviceObjectType);
|
||||
IoDeviceType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
||||
|
||||
RtlInitAnsiString(&astring,"File");
|
||||
RtlAnsiStringToUnicodeString(&FileObjectType.TypeName,&astring,TRUE);
|
||||
ObRegisterType(OBJTYP_FILE,&FileObjectType);
|
||||
IoDeviceType->TotalObjects = 0;
|
||||
IoDeviceType->TotalHandles = 0;
|
||||
IoDeviceType->MaxObjects = ULONG_MAX;
|
||||
IoDeviceType->MaxHandles = ULONG_MAX;
|
||||
IoDeviceType->PagedPoolCharge = 0;
|
||||
IoDeviceType->NonpagedPoolCharge = sizeof(DEVICE_OBJECT);
|
||||
IoDeviceType->Dump = NULL;
|
||||
IoDeviceType->Open = NULL;
|
||||
IoDeviceType->Close = NULL;
|
||||
IoDeviceType->Delete = NULL;
|
||||
IoDeviceType->Parse = NULL;
|
||||
IoDeviceType->Security = NULL;
|
||||
IoDeviceType->QueryName = NULL;
|
||||
IoDeviceType->OkayToClose = NULL;
|
||||
|
||||
RtlInitAnsiString(&AnsiString,"Device");
|
||||
RtlAnsiStringToUnicodeString(&IoDeviceType->TypeName,&AnsiString,TRUE);
|
||||
|
||||
IoFileType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
||||
|
||||
IoFileType->TotalObjects = 0;
|
||||
IoFileType->TotalHandles = 0;
|
||||
IoFileType->MaxObjects = ULONG_MAX;
|
||||
IoFileType->MaxHandles = ULONG_MAX;
|
||||
IoFileType->PagedPoolCharge = 0;
|
||||
IoFileType->NonpagedPoolCharge = sizeof(FILE_OBJECT);
|
||||
IoFileType->Dump = NULL;
|
||||
IoFileType->Open = NULL;
|
||||
IoFileType->Close = NULL;
|
||||
IoFileType->Delete = NULL;
|
||||
IoFileType->Parse = NULL;
|
||||
IoFileType->Security = NULL;
|
||||
IoFileType->QueryName = NULL;
|
||||
IoFileType->OkayToClose = NULL;
|
||||
|
||||
RtlInitAnsiString(&AnsiString,"File");
|
||||
RtlAnsiStringToUnicodeString(&IoFileType->TypeName,&AnsiString,TRUE);
|
||||
|
||||
/*
|
||||
* Create the device directory
|
||||
*/
|
||||
RtlInitAnsiString(&astring,"\\Device");
|
||||
RtlAnsiStringToUnicodeString(&string,&astring,TRUE);
|
||||
InitializeObjectAttributes(&attr,&string,0,NULL,NULL);
|
||||
RtlInitAnsiString(&AnsiString,"\\Device");
|
||||
RtlAnsiStringToUnicodeString(&UnicodeString,&AnsiString,TRUE);
|
||||
InitializeObjectAttributes(&attr,&UnicodeString,0,NULL,NULL);
|
||||
ZwCreateDirectoryObject(&handle,0,&attr);
|
||||
|
||||
RtlInitAnsiString(&astring,"\\??");
|
||||
RtlAnsiStringToUnicodeString(&string,&astring,TRUE);
|
||||
InitializeObjectAttributes(&attr,&string,0,NULL,NULL);
|
||||
RtlInitAnsiString(&AnsiString,"\\??");
|
||||
RtlAnsiStringToUnicodeString(&UnicodeString,&AnsiString,TRUE);
|
||||
InitializeObjectAttributes(&attr,&UnicodeString,0,NULL,NULL);
|
||||
ZwCreateDirectoryObject(&handle,0,&attr);
|
||||
|
||||
IoInitCancelHandling();
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <internal/hal/page.h>
|
||||
#include <internal/mmhal.h>
|
||||
#include <ddk/ntddk.h>
|
||||
|
||||
#include <internal/debug.h>
|
||||
|
|
|
@ -14,11 +14,15 @@
|
|||
|
||||
#include <internal/debug.h>
|
||||
|
||||
/* GLOBALS *******************************************************************/
|
||||
|
||||
static CONFIGURATION_INFORMATION SystemConfigurationInformation = {0,};
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
PCONFIGURATION_INFORMATION IoGetConfigurationInformation()
|
||||
PCONFIGURATION_INFORMATION IoGetConfigurationInformation(VOID)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return(&SystemConfigurationInformation);
|
||||
}
|
||||
|
||||
NTSTATUS IoReportResourceUsage(PUNICODE_STRING DriverClassName,
|
||||
|
|
|
@ -26,25 +26,46 @@ typedef struct
|
|||
OBJECT_ATTRIBUTES Target;
|
||||
} SYMLNK_OBJECT, *PSYMLNK_OBJECT;
|
||||
|
||||
OBJECT_TYPE SymlinkObjectType = {{NULL,0,0},
|
||||
0,
|
||||
0,
|
||||
ULONG_MAX,
|
||||
ULONG_MAX,
|
||||
sizeof(SYMLNK_OBJECT),
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
};
|
||||
POBJECT_TYPE IoSymbolicLinkType = NULL;
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
VOID IoInitSymbolicLinkImplementation(VOID)
|
||||
{
|
||||
ANSI_STRING AnsiString;
|
||||
|
||||
IoSymbolicLinkType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
||||
|
||||
IoSymbolicLinkType->TotalObjects = 0;
|
||||
IoSymbolicLinkType->TotalHandles = 0;
|
||||
IoSymbolicLinkType->MaxObjects = ULONG_MAX;
|
||||
IoSymbolicLinkType->MaxHandles = ULONG_MAX;
|
||||
IoSymbolicLinkType->PagedPoolCharge = 0;
|
||||
IoSymbolicLinkType->NonpagedPoolCharge = sizeof(SYMLNK_OBJECT);
|
||||
IoSymbolicLinkType->Dump = NULL;
|
||||
IoSymbolicLinkType->Open = NULL;
|
||||
IoSymbolicLinkType->Close = NULL;
|
||||
IoSymbolicLinkType->Delete = NULL;
|
||||
IoSymbolicLinkType->Parse = NULL;
|
||||
IoSymbolicLinkType->Security = NULL;
|
||||
IoSymbolicLinkType->QueryName = NULL;
|
||||
IoSymbolicLinkType->OkayToClose = NULL;
|
||||
|
||||
RtlInitAnsiString(&AnsiString,"Symbolic Link");
|
||||
RtlAnsiStringToUnicodeString(&IoSymbolicLinkType->TypeName,
|
||||
&AnsiString,TRUE);
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS NtOpenSymbolicLinkObject(OUT PHANDLE LinkHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes)
|
||||
{
|
||||
return(ZwOpenSymbolicLinkObject(LinkHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes));
|
||||
}
|
||||
|
||||
NTSTATUS ZwOpenSymbolicLinkObject(OUT PHANDLE LinkHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes)
|
||||
|
@ -58,20 +79,34 @@ NTSTATUS ZwOpenSymbolicLinkObject(OUT PHANDLE LinkHandle,
|
|||
{
|
||||
return(Status);
|
||||
}
|
||||
*LinkHandle = ObAddHandle(Object);
|
||||
*LinkHandle = ObInsertHandle(KeGetCurrentProcess(),Object,
|
||||
DesiredAccess,FALSE);
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS NtQuerySymbolicLinkObject(IN HANDLE LinkHandle,
|
||||
IN OUT PUNICODE_STRING LinkTarget,
|
||||
OUT PULONG ReturnedLength OPTIONAL)
|
||||
{
|
||||
return(ZwQuerySymbolicLinkObject(LinkHandle,LinkTarget,ReturnedLength));
|
||||
}
|
||||
|
||||
NTSTATUS ZwQuerySymbolicLinkObject(IN HANDLE LinkHandle,
|
||||
IN OUT PUNICODE_STRING LinkTarget,
|
||||
OUT PULONG ReturnedLength OPTIONAL)
|
||||
{
|
||||
COMMON_BODY_HEADER* hdr = ObGetObjectByHandle(LinkHandle);
|
||||
PSYMLNK_OBJECT SymlinkObject = (PSYMLNK_OBJECT)hdr;
|
||||
PSYMLNK_OBJECT SymlinkObject;
|
||||
NTSTATUS Status;
|
||||
|
||||
if (hdr==NULL)
|
||||
Status = ObReferenceObjectByHandle(LinkHandle,
|
||||
SYMBOLIC_LINK_QUERY,
|
||||
IoSymbolicLinkType,
|
||||
UserMode,
|
||||
(PVOID*)&SymlinkObject,
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(STATUS_INVALID_HANDLE);
|
||||
return(Status);
|
||||
}
|
||||
|
||||
RtlCopyUnicodeString(LinkTarget,SymlinkObject->Target.ObjectName);
|
||||
|
@ -97,15 +132,6 @@ POBJECT IoOpenSymlink(POBJECT _Symlink)
|
|||
return(Result);
|
||||
}
|
||||
|
||||
VOID IoInitSymbolicLinkImplementation(VOID)
|
||||
{
|
||||
ANSI_STRING astring;
|
||||
|
||||
RtlInitAnsiString(&astring,"Symbolic Link");
|
||||
RtlAnsiStringToUnicodeString(&SymlinkObjectType.TypeName,&astring,TRUE);
|
||||
ObRegisterType(OBJTYP_SYMLNK,&SymlinkObjectType);
|
||||
}
|
||||
|
||||
NTSTATUS IoCreateUnprotectedSymbolicLink(PUNICODE_STRING SymbolicLinkName,
|
||||
PUNICODE_STRING DeviceName)
|
||||
{
|
||||
|
@ -124,12 +150,15 @@ NTSTATUS IoCreateSymbolicLink(PUNICODE_STRING SymbolicLinkName,
|
|||
SymbolicLinkName->Buffer,DeviceName->Buffer);
|
||||
|
||||
InitializeObjectAttributes(&ObjectAttributes,SymbolicLinkName,0,NULL,NULL);
|
||||
SymbolicLink = ObGenericCreateObject(&SymbolicLinkHandle,0,
|
||||
&ObjectAttributes,OBJTYP_SYMLNK);
|
||||
SymbolicLink = ObGenericCreateObject(&SymbolicLinkHandle,
|
||||
SYMBOLIC_LINK_ALL_ACCESS,
|
||||
&ObjectAttributes,
|
||||
IoSymbolicLinkType);
|
||||
if (SymbolicLink == NULL)
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
SymbolicLink->TargetName.Buffer = ExAllocatePool(NonPagedPool,
|
||||
((wstrlen(DeviceName->Buffer)+1)*2));
|
||||
SymbolicLink->TargetName.MaximumLength = wstrlen(DeviceName->Buffer);
|
||||
|
@ -146,3 +175,25 @@ NTSTATUS IoDeleteSymbolicLink(PUNICODE_STRING DeviceName)
|
|||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtCreateSymbolicLinkObject(
|
||||
OUT PHANDLE SymbolicLinkHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
IN PUNICODE_STRING Name)
|
||||
{
|
||||
return(NtCreateSymbolicLinkObject(SymbolicLinkHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes,
|
||||
Name));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwCreateSymbolicLinkObject(
|
||||
OUT PHANDLE SymbolicLinkHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
IN PUNICODE_STRING Name)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
|
|
|
@ -33,6 +33,8 @@ NTSTATUS IoInitializeTimer(PDEVICE_OBJECT DeviceObject,
|
|||
DeviceObject->Timer = ExAllocatePool(NonPagedPool,sizeof(IO_TIMER));
|
||||
KeInitializeTimer(&(DeviceObject->Timer->timer));
|
||||
KeInitializeDpc(&(DeviceObject->Timer->dpc),TimerRoutine,Context);
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
VOID IoStartTimer(PDEVICE_OBJECT DeviceObject)
|
||||
|
|
|
@ -12,25 +12,95 @@
|
|||
|
||||
#include <ddk/ntddk.h>
|
||||
#include <internal/string.h>
|
||||
#include <internal/i386/segment.h>
|
||||
#include <internal/ps.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
extern VOID KeApcProlog(VOID);
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
VOID KeDrainApcQueue(VOID)
|
||||
VOID KeApcProlog2(PKAPC Apc)
|
||||
{
|
||||
PLIST_ENTRY current_entry;
|
||||
PKAPC current;
|
||||
PKTHREAD CurrentThread=KeGetCurrentThread();
|
||||
|
||||
while ((current_entry=RemoveHeadList(CurrentThread->ApcList))!=NULL)
|
||||
{
|
||||
current = CONTAINING_RECORD(current_entry,KAPC,ApcListEntry);
|
||||
current->NormalRoutine(current->NormalContext,
|
||||
current->SystemArgument1,
|
||||
current->SystemArgument2);
|
||||
current_entry = current_entry->Flink;
|
||||
Apc->KernelRoutine(Apc,
|
||||
&Apc->NormalRoutine,
|
||||
&Apc->NormalContext,
|
||||
&Apc->SystemArgument2,
|
||||
&Apc->SystemArgument2);
|
||||
PsSuspendThread(CONTAINING_RECORD(Apc->Thread,ETHREAD,Tcb));
|
||||
}
|
||||
|
||||
VOID KeDeliverKernelApc(PKAPC Apc)
|
||||
/*
|
||||
* FUNCTION: Simulates an interrupt on the target thread which will transfer
|
||||
* control to a kernel mode routine
|
||||
*/
|
||||
{
|
||||
PKTHREAD TargetThread;
|
||||
PULONG Stack;
|
||||
|
||||
TargetThread = Apc->Thread;
|
||||
|
||||
if (TargetThread == KeGetCurrentThread())
|
||||
{
|
||||
Apc->KernelRoutine(Apc,
|
||||
&Apc->NormalRoutine,
|
||||
&Apc->NormalContext,
|
||||
&Apc->SystemArgument2,
|
||||
&Apc->SystemArgument2);
|
||||
return;
|
||||
}
|
||||
|
||||
if (TargetThread->Context.cs == KERNEL_CS)
|
||||
{
|
||||
TargetThread->Context.esp = TargetThread->Context.esp - 16;
|
||||
Stack = (PULONG)TargetThread->Context.esp;
|
||||
Stack[0] = TargetThread->Context.eax;
|
||||
Stack[1] = TargetThread->Context.eip;
|
||||
Stack[2] = TargetThread->Context.cs;
|
||||
Stack[3] = TargetThread->Context.eflags;
|
||||
TargetThread->Context.eip = KeApcProlog;
|
||||
TargetThread->Context.eax = (ULONG)Apc;
|
||||
}
|
||||
else
|
||||
{
|
||||
TargetThread->Context.esp = TargetThread->Context.esp - 40;
|
||||
Stack = (PULONG)TargetThread->Context.esp;
|
||||
Stack[9] = TargetThread->Context.ss;
|
||||
Stack[8] = TargetThread->Context.esp;
|
||||
Stack[7] = TargetThread->Context.gs;
|
||||
Stack[6] = TargetThread->Context.fs;
|
||||
Stack[5] = TargetThread->Context.ds;
|
||||
Stack[4] = TargetThread->Context.es;
|
||||
Stack[3] = TargetThread->Context.eflags;
|
||||
Stack[2] = TargetThread->Context.cs;
|
||||
Stack[1] = TargetThread->Context.eip;
|
||||
Stack[0] = TargetThread->Context.eax;
|
||||
TargetThread->Context.eip = KeApcProlog;
|
||||
TargetThread->Context.eax = (ULONG)Apc;
|
||||
}
|
||||
|
||||
PsResumeThread(CONTAINING_RECORD(TargetThread,ETHREAD,Tcb));
|
||||
}
|
||||
|
||||
void KeInsertQueueApc(struct _KAPC *Apc, PVOID SystemArgument1,
|
||||
PVOID SystemArgument2, UCHAR Mode)
|
||||
{
|
||||
KIRQL oldlvl;
|
||||
|
||||
DPRINT("KeInsertQueueApc(Apc %x, SystemArgument1 %x, "
|
||||
"SystemArgument2 %x, Mode %d)\n",Apc,SystemArgument1,
|
||||
SystemArgument2,Mode);
|
||||
|
||||
KeRaiseIrql(DISPATCH_LEVEL,&oldlvl);
|
||||
|
||||
if (Apc->KernelRoutine != NULL)
|
||||
{
|
||||
KeDeliverKernelApc(Apc);
|
||||
}
|
||||
KeLowerIrql(oldlvl);
|
||||
}
|
||||
|
||||
VOID KeInitializeApc(PKAPC Apc,
|
||||
|
@ -55,18 +125,35 @@ VOID KeInitializeApc(PKAPC Apc,
|
|||
Apc->ApcMode=Mode;
|
||||
}
|
||||
|
||||
void KeInsertQueueApc(PKAPC Apc, PVOID SystemArgument1,
|
||||
PVOID SystemArgument2, UCHAR Mode)
|
||||
|
||||
NTSTATUS STDCALL NtQueueApcThread(HANDLE ThreadHandle,
|
||||
PKNORMAL_ROUTINE ApcRoutine,
|
||||
PVOID NormalContext,
|
||||
PVOID SystemArgument1,
|
||||
PVOID SystemArgument2)
|
||||
{
|
||||
Apc->SystemArgument1=SystemArgument1;
|
||||
Apc->SystemArgument2=SystemArgument2;
|
||||
Apc->ApcMode=Mode;
|
||||
if (Apc->Inserted)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Apc->Inserted=TRUE;
|
||||
InsertTailList(Apc->Thread->ApcList,&Apc->ApcListEntry);
|
||||
return;
|
||||
return(NtQueueApcThread(ThreadHandle,
|
||||
ApcRoutine,
|
||||
NormalContext,
|
||||
SystemArgument1,
|
||||
SystemArgument2));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwQueueApcThread(HANDLE ThreadHandle,
|
||||
PKNORMAL_ROUTINE ApcRoutine,
|
||||
PVOID NormalContext,
|
||||
PVOID SystemArgument1,
|
||||
PVOID SystemArgument2)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtTestAlert(VOID)
|
||||
{
|
||||
return(ZwTestAlert());
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwTestAlert(VOID)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ VOID KeInitializeBugCheck(VOID)
|
|||
|
||||
VOID KeInitializeCallbackRecord(PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
BOOLEAN KeRegisterBugCheckCallback(PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
|
||||
|
@ -64,6 +65,7 @@ VOID KeBugCheckEx(ULONG BugCheckCode,
|
|||
DbgPrint("Bug detected (code %x param %x %x %x %x)\n",BugCheckCode,
|
||||
BugCheckParameter1,BugCheckParameter2,BugCheckParameter3,
|
||||
BugCheckParameter4);
|
||||
*((unsigned int *)0)=0;
|
||||
for(;;);
|
||||
}
|
||||
|
||||
|
|
|
@ -18,3 +18,24 @@ VOID ExRaiseStatus(NTSTATUS Status)
|
|||
DbgPrint("ExRaiseStatus(%d)\n",Status);
|
||||
for(;;);
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
NtRaiseException(
|
||||
IN PEXCEPTION_RECORD ExceptionRecord,
|
||||
IN PCONTEXT Context,
|
||||
IN BOOL IsDebugger OPTIONAL
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
ZwRaiseException(
|
||||
IN PEXCEPTION_RECORD ExceptionRecord,
|
||||
IN PCONTEXT Context,
|
||||
IN BOOL IsDebugger OPTIONAL
|
||||
)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <windows.h>
|
||||
#include <ddk/ntddk.h>
|
||||
#include <internal/ke.h>
|
||||
#include <internal/ps.h>
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
/* INCLUDE *****************************************************************/
|
||||
|
||||
#include <windows.h>
|
||||
#include <ddk/ntddk.h>
|
||||
|
||||
/* GLOBALS *****************************************************************/
|
||||
|
||||
|
@ -44,3 +45,11 @@ VOID STDCALL SetLastError(DWORD dwErrCode)
|
|||
error_code=dwErrCode;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS STDCALL NtRaiseHardError(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtSetDefaultHardErrorPort(VOID)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <ddk/ntddk.h>
|
||||
#include <internal/ke.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
|
|
@ -5,379 +5,15 @@
|
|||
*
|
||||
*/
|
||||
#include <internal/symbol.h>
|
||||
#include <ddk/ntddk.h>
|
||||
#include <ddk/ntifs.h>
|
||||
#include <internal/ke.h>
|
||||
#include <internal/ntoskrnl.h>
|
||||
#include <internal/mm.h>
|
||||
#include <wstring.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void free_page(void);
|
||||
void get_dma_page(void);
|
||||
void DbgPrint(void);
|
||||
void printk(void);
|
||||
void ExAcquireFastMutex(void);
|
||||
void ExAcquireFastMutexUnsafe(void);
|
||||
void ExAcquireResourceExclusive(void);
|
||||
void ExAcquireResourceExclusiveLite(void);
|
||||
void ExAcquireResourceSharedLite(void);
|
||||
void ExAcquireSharedStarveExclusive(void);
|
||||
void ExAcquireSharedWaitForExclusive(void);
|
||||
void ExAllocateFromNPagedLookasideList(void);
|
||||
void ExAllocateFromPagedLookasideList(void);
|
||||
void ExAllocateFromZone(void);
|
||||
void ExAllocatePool(void);
|
||||
void ExAllocatePoolWithQuota(void);
|
||||
void ExAllocatePoolWithQuotaTag(void);
|
||||
void ExAllocatePoolWithTag(void);
|
||||
void ExConvertExclusiveToSharedLite(void);
|
||||
void ExDeleteNPagedLookasideList(void);
|
||||
void ExDeletePagedLookasideList(void);
|
||||
void ExDeleteResource(void);
|
||||
void ExDeleteResourceLite(void);
|
||||
void ExExtendZone(void);
|
||||
void ExFreePool(void);
|
||||
void ExFreeToNPagedLookasideList(void);
|
||||
void ExFreeToPagedLookasideList(void);
|
||||
void ExFreeToZone(void);
|
||||
void ExGetCurrentResourceThread(void);
|
||||
void ExGetExclusiveWaiterCount(void);
|
||||
void ExGetSharedWaiterCount(void);
|
||||
void ExHookException(void);
|
||||
void ExInitializeFastMutex(void);
|
||||
void ExInitializeNPagedLookasideList(void);
|
||||
void ExInitializePagedLookasideList(void);
|
||||
void ExInitializeResource(void);
|
||||
void ExInitializeResourceLite(void);
|
||||
void ExInitializeSListHead(void);
|
||||
void ExInitializeWorkItem(void);
|
||||
void ExInitializeZone(void);
|
||||
void ExInterlockedAddLargeInteger(void);
|
||||
void ExInterlockedAddUlong(void);
|
||||
void ExInterlockedAllocateFromZone(void);
|
||||
void ExInterlockedDecrementLong(void);
|
||||
void ExInterlockedExchangeUlong(void);
|
||||
void ExInterlockedExtendZone(void);
|
||||
void ExInterlockedFreeToZone(void);
|
||||
void ExInterlockedIncrementLong(void);
|
||||
void ExInterlockedInsertHeadList(void);
|
||||
void ExInterlockedInsertTailList(void);
|
||||
void ExInterlockedPopEntryList(void);
|
||||
void ExInterlockedPopEntrySList(void);
|
||||
void ExInterlockedPushEntryList(void);
|
||||
void ExInterlockedPushEntrySList(void);
|
||||
void ExInterlockedRemoveHeadList(void);
|
||||
void ExIsFullZone(void);
|
||||
void ExIsObjectInFirstZoneSegment(void);
|
||||
void ExIsResourceAcquiredExclusiveLite(void);
|
||||
void ExIsResourceAcquiredSharedLite(void);
|
||||
void ExLocalTimeToSystemTime(void);
|
||||
void ExQueryDepthSListHead(void);
|
||||
void ExQueueWorkItem(void);
|
||||
void ExRaiseStatus(void);
|
||||
void ExReinitializeResourceLite(void);
|
||||
void ExReleaseFastMutex(void);
|
||||
void ExReleaseFastMutexUnsafe(void);
|
||||
void ExReleaseResource(void);
|
||||
void ExReleaseResourceForThread(void);
|
||||
void ExReleaseResourceForThreadLite(void);
|
||||
void ExSystemTimeToLocalTime(void);
|
||||
void ExTryToAcquireFastMutex(void);
|
||||
void ExTryToAcquireResourceExclusiveLite(void);
|
||||
void InterlockedCompareExchange(void);
|
||||
void InterlockedExchange(void);
|
||||
void InterlockedExchangeAdd(void);
|
||||
void InterlockedIncrement(void);
|
||||
void HalAllocateCommonBuffer(void);
|
||||
void HalAssignSlotResources(void);
|
||||
void HalExamineMBR(void);
|
||||
void HalFreeCommonBuffer(void);
|
||||
void HalGetAdapter(void);
|
||||
void HalGetBusData(void);
|
||||
void HalGetBusDataByOffset(void);
|
||||
void HalGetDmaAlignmentRequirement(void);
|
||||
void HalGetInterruptVector(void);
|
||||
void HalQuerySystemInformation(void);
|
||||
void HalReadDmaCounter(void);
|
||||
void HalSetBusData(void);
|
||||
void HalSetBusDataByOffset(void);
|
||||
void HalTranslateBusAddress(void);
|
||||
void IoAcquireCancelSpinLock(void);
|
||||
void IoAllocateAdapterChannel(void);
|
||||
void IoAllocateController(void);
|
||||
void IoAllocateErrorLogEntry(void);
|
||||
void IoAllocateIrp(void);
|
||||
void IoAllocateMdl(void);
|
||||
void IoAssignArcName(void);
|
||||
void IoAssignResources(void);
|
||||
void IoAttachDevice(void);
|
||||
void IoAttachDeviceByPointer(void);
|
||||
void IoAttachDeviceToDeviceStack(void);
|
||||
void IoBuildAsynchronousFsdRequest(void);
|
||||
void IoBuildDeviceIoControlRequest(void);
|
||||
void IoBuildPartialMdl(void);
|
||||
void IoBuildSynchronousFsdRequest(void);
|
||||
void IoCallDriver(void);
|
||||
void IoCancelIrp(void);
|
||||
void IoCheckShareAccess(void);
|
||||
void IoCompleteRequest(void);
|
||||
void IoConnectInterrupt(void);
|
||||
void IoCreateController(void);
|
||||
void IoCreateDevice(void);
|
||||
void IoCreateNotificationEvent(void);
|
||||
void IoCreateSymbolicLink(void);
|
||||
void IoCreateSynchronizationEvent(void);
|
||||
void IoCreateUnprotectedSymbolicLink(void);
|
||||
void IoDeassignArcName(void);
|
||||
void IoDeleteController(void);
|
||||
void IoDeleteDevice(void);
|
||||
void IoDeleteSymbolicLink(void);
|
||||
void IoDetachDevice(void);
|
||||
void IoDisconnectInterrupt(void);
|
||||
void IoFlushAdapterBuffers(void);
|
||||
void IoFreeAdapterChannel(void);
|
||||
void IoFreeController(void);
|
||||
void IoFreeIrp(void);
|
||||
void IoFreeMapRegisters(void);
|
||||
void IoFreeMdl(void);
|
||||
void IoGetConfigurationInformation(void);
|
||||
void IoGetCurrentIrpStackLocation(void);
|
||||
void IoGetCurrentProcess(void);
|
||||
void IoGetDeviceObjectPointer(void);
|
||||
void IoGetDeviceToVerify(void);
|
||||
void IoGetFileObjectGenericMapping(void);
|
||||
void IoGetFunctionCodeFromCtlCode(void);
|
||||
void IoGetInitialStack(void);
|
||||
void IoGetNextIrpStackLocation(void);
|
||||
void IoGetRelatedDeviceObject(void);
|
||||
void IoInitializeDpcRequest(void);
|
||||
void IoInitializeIrp(void);
|
||||
void IoInitializeTimer(void);
|
||||
void IoIsErrorUserInduced(void);
|
||||
void IoIsTotalDeviceFailure(void);
|
||||
void IoMakeAssociatedIrp(void);
|
||||
void IoMapTransfer(void);
|
||||
void IoMarkIrpPending(void);
|
||||
void IoQueryDeviceDescription(void);
|
||||
void IoRaiseHardError(void);
|
||||
void IoRaiseInformationalHardError(void);
|
||||
void IoReadPartitionTable(void);
|
||||
void IoRegisterDriverReinitialization(void);
|
||||
void IoRegisterFileSystem(void);
|
||||
void IoRegisterShutdownNotification(void);
|
||||
void IoReleaseCancelSpinLock(void);
|
||||
void IoRemoveShareAccess(void);
|
||||
void IoReportResourceUsage(void);
|
||||
void IoRequestDpc(void);
|
||||
void IoSetCancelRoutine(void);
|
||||
void IoSetCompletionRoutine(void);
|
||||
void IoSetHardErrorOrVerifyDevice(void);
|
||||
void IoSetNextIrpStackLocation(void);
|
||||
void IoSetPartitionInformation(void);
|
||||
void IoSetShareAccess(void);
|
||||
void IoSizeOfIrp(void);
|
||||
void IoStartNextPacket(void);
|
||||
void IoStartNextPacketByKey(void);
|
||||
void IoStartPacket(void);
|
||||
void IoStartTimer(void);
|
||||
void IoStopTimer(void);
|
||||
void IoUnregisterShutdownNotification(void);
|
||||
void IoUpdateShareAccess(void);
|
||||
void IoWriteErrorLogEntry(void);
|
||||
void IoWritePartitionTable(void);
|
||||
void KeAcquireSpinLock(void);
|
||||
void KeAcquireSpinLockAtDpcLevel(void);
|
||||
void KeBugCheck(void);
|
||||
void KeBugCheckEx(void);
|
||||
void KeCancelTimer(void);
|
||||
void KeClearEvent(void);
|
||||
void KeDelayExecutionThread(void);
|
||||
void KeDeregisterBugCheckCallback(void);
|
||||
void KeEnterCriticalRegion(void);
|
||||
void KeFlushIoBuffers(void);
|
||||
void KeGetCurrentIrql(void);
|
||||
void KeGetCurrentProcessorNumber(void);
|
||||
void KeGetDcacheFillSize(void);
|
||||
void KeInitializeCallbackRecord(void);
|
||||
void KeInitializeDeviceQueue(void);
|
||||
void KeInitializeDpc(void);
|
||||
void KeInitializeEvent(void);
|
||||
void KeInitializeMutex(void);
|
||||
void KeInitializeSemaphore(void);
|
||||
void KeInitializeSpinLock(void);
|
||||
void KeInitializeTimer(void);
|
||||
void KeInitializeTimerEx(void);
|
||||
void KeInsertByKeyDeviceQueue(void);
|
||||
void KeInsertDeviceQueue(void);
|
||||
void KeInsertQueueDpc(void);
|
||||
void KeLeaveCriticalRegion(void);
|
||||
void KeLowerIrql(void);
|
||||
void KeQueryPerformanceCounter(void);
|
||||
void KeQuerySystemTime(void);
|
||||
void KeQueryTickCount(void);
|
||||
void KeQueryTimeIncrement(void);
|
||||
void KeRaiseIrql(void);
|
||||
void KeReadStateEvent(void);
|
||||
void KeReadStateMutex(void);
|
||||
void KeReadStateSemaphore(void);
|
||||
void KeReadStateTimer(void);
|
||||
void KeRegisterBugCheckCallback(void);
|
||||
void KeReleaseMutex(void);
|
||||
void KeReleaseSemaphore(void);
|
||||
void KeReleaseSpinLock(void);
|
||||
void KeReleaseSpinLockFromDpcLevel(void);
|
||||
void KeRemoveByKeyDeviceQueue(void);
|
||||
void KeRemoveDeviceQueue(void);
|
||||
void KeRemoveQueueDpc(void);
|
||||
void KeResetEvent(void);
|
||||
void KeSetBasePriorityThread(void);
|
||||
void KeSetEvent(void);
|
||||
void KeSetPriorityThread(void);
|
||||
void KeSetTimer(void);
|
||||
void KeSetTimerEx(void);
|
||||
void KeStallExecutionProcessor(void);
|
||||
void KeSynchronizeExecution(void);
|
||||
void KeWaitForMultipleObjects(void);
|
||||
void KeWaitForMutexObject(void);
|
||||
void KeWaitForSingleObject(void);
|
||||
void MmAllocateContiguousMemory(void);
|
||||
void MmAllocateNonCachedMemory(void);
|
||||
void MmBuildMdlForNonPagedPool(void);
|
||||
void MmCreateMdl(void);
|
||||
void MmFreeContiguousMemory(void);
|
||||
void MmFreeNonCachedMemory(void);
|
||||
void MmGetMdlByteCount(void);
|
||||
void MmGetMdlByteOffset(void);
|
||||
void MmGetMdlVirtualAddress(void);
|
||||
void MmGetPhysicalAddress(void);
|
||||
void MmGetSystemAddressForMdl(void);
|
||||
void MmInitializeMdl(void);
|
||||
void MmIsAddressValid(void);
|
||||
void MmIsNonPagedSystemAddressValid(void);
|
||||
void MmIsThisAnNtAsSystem(void);
|
||||
void MmLockPagableCodeSection(void);
|
||||
void MmLockPagableDataSection(void);
|
||||
void MmLockPagableSectionByHandle(void);
|
||||
void MmMapIoSpace(void);
|
||||
void MmMapLockedPages(void);
|
||||
void MmPageEntireDriver(void);
|
||||
void MmResetDriverPaging(void);
|
||||
void MmPrepareMdlForReuse(void);
|
||||
void MmProbeAndLockPages(void);
|
||||
void MmQuerySystemSize(void);
|
||||
void MmSizeOfMdl(void);
|
||||
void MmUnlockPages(void);
|
||||
void MmUnlockPagableImageSection(void);
|
||||
void MmUnmapIoSpace(void);
|
||||
void MmUnmapLockedPages(void);
|
||||
void ObDereferenceObject(void);
|
||||
void ObReferenceObjectByHandle(void);
|
||||
void ObReferenceObjectByPointer(void);
|
||||
void PsCreateSystemThread(void);
|
||||
void PsGetCurrentProcess(void);
|
||||
void PsGetCurrentThread(void);
|
||||
void PsTerminateSystemThread(void);
|
||||
void InitializeListHead(void);
|
||||
void InitializeObjectAttributes(void);
|
||||
void InsertHeadList(void);
|
||||
void InsertTailList(void);
|
||||
void PopEntryList(void);
|
||||
void PushEntryList(void);
|
||||
void RemoveEntryList(void);
|
||||
void RemoveHeadList(void);
|
||||
void RemoveTailList(void);
|
||||
void RtlAnsiStringToUnicodeSize(void);
|
||||
void RtlAnsiStringToUnicodeString(void);
|
||||
void RtlAppendUnicodeStringToString(void);
|
||||
void RtlAppendUnicodeToString(void);
|
||||
void RtlCharToInteger(void);
|
||||
void RtlCheckRegistryKey(void);
|
||||
void RtlCompareMemory(void);
|
||||
void RtlCompareString(void);
|
||||
void RtlCompareUnicodeString(void);
|
||||
void RtlConvertLongToLargeInteger(void);
|
||||
void RtlConvertUlongToLargeInteger(void);
|
||||
void RtlCopyBytes(void);
|
||||
void RtlCopyMemory(void);
|
||||
void RtlCopyString(void);
|
||||
void RtlCopyUnicodeString(void);
|
||||
void RtlCreateRegistryKey(void);
|
||||
void RtlCreateSecurityDescriptor(void);
|
||||
void RtlDeleteRegistryValue(void);
|
||||
void RtlEnlargedIntegerMultiply(void);
|
||||
void RtlEnlargedUnsignedDivide(void);
|
||||
void RtlEnlargedUnsignedMultiply(void);
|
||||
void RtlEqualString(void);
|
||||
void RtlEqualUnicodeString(void);
|
||||
void RtlExtendedIntegerMultiply(void);
|
||||
void RtlExtendedLargeIntegerDivide(void);
|
||||
void RtlExtendedMagicDivide(void);
|
||||
void RtlFillMemory(void);
|
||||
void RtlFreeAnsiString(void);
|
||||
void RtlFreeUnicodeString(void);
|
||||
void RtlInitAnsiString(void);
|
||||
void RtlInitString(void);
|
||||
void RtlInitUnicodeString(void);
|
||||
void RtlIntegerToUnicodeString(void);
|
||||
void RtlLargeIntegerAdd(void);
|
||||
void RtlLargeIntegerAnd(void);
|
||||
void RtlLargeIntegerArithmeticShift(void);
|
||||
void RtlLargeIntegerDivide(void);
|
||||
void RtlLargeIntegerEqualTo(void);
|
||||
void RtlLargeIntegerEqualToZero(void);
|
||||
void RtlLargeIntegerGreaterThan(void);
|
||||
void RtlLargeIntegerGreaterThanOrEqualTo(void);
|
||||
void RtlLargeIntegerGreaterThanOrEqualToZero(void);
|
||||
void RtlLargeIntegerGreaterThanZero(void);
|
||||
void RtlLargeIntegerLessThan(void);
|
||||
void RtlLargeIntegerLessThanOrEqualTo(void);
|
||||
void RtlLargeIntegerLessThanZero(void);
|
||||
void RtlLargeIntegerNegate(void);
|
||||
void RtlLargeIntegerNotEqualTo(void);
|
||||
void RtlLargeIntegerShiftLeft(void);
|
||||
void RtlLargeIntegerShiftRight(void);
|
||||
void RtlLargeIntegerSubtract(void);
|
||||
void RtlLengthSecurityDescriptor(void);
|
||||
void RtlMoveMemory(void);
|
||||
void RtlQueryRegistryValues(void);
|
||||
void RtlRetrieveUlong(void);
|
||||
void RtlRetrieveUshort(void);
|
||||
void RtlSetDaclSecurityDescriptor(void);
|
||||
void RtlStoreUlong(void);
|
||||
void RtlStoreUshort(void);
|
||||
void RtlTimeFieldsToTime(void);
|
||||
void RtlTimeToTimeFields(void);
|
||||
void RtlUnicodeStringToAnsiString(void);
|
||||
void RtlUnicodeStringToInteger(void);
|
||||
void RtlUpcaseUnicodeString(void);
|
||||
void RtlUpperString(void);
|
||||
void RtlValidSecurityDescriptor(void);
|
||||
void RtlWriteRegistryValue(void);
|
||||
void RtlZeroMemory(void);
|
||||
void SeAccessCheck(void);
|
||||
void SeAssignSecurity(void);
|
||||
void SeDeassignSecurity(void);
|
||||
void SeSinglePrivilegeCheck(void);
|
||||
void ZwClose(void);
|
||||
void ZwCreateDirectoryObject(void);
|
||||
void ZwCreateFile(void);
|
||||
void ZwCreateKey(void);
|
||||
void ZwDeleteKey(void);
|
||||
void ZwEnumerateKey(void);
|
||||
void ZwEnumerateValueKey(void);
|
||||
void ZwFlushKey(void);
|
||||
void ZwMakeTemporaryObject(void);
|
||||
void ZwMapViewOfSection(void);
|
||||
void ZwOpenFile(void);
|
||||
void ZwOpenKey(void);
|
||||
void ZwOpenSection(void);
|
||||
void ZwQueryInformationFile(void);
|
||||
void ZwQueryKey(void);
|
||||
void ZwQueryValueKey(void);
|
||||
void ZwReadFile(void);
|
||||
void ZwSetInformationFile(void);
|
||||
void ZwSetInformationThread(void);
|
||||
void ZwSetValueKey(void);
|
||||
void ZwUnmapViewOfSection(void);
|
||||
void ZwWriteFile(void);
|
||||
void sprintf(void);
|
||||
void wcschr(void);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -752,5 +388,12 @@ export symbol_table[]={
|
|||
{"_ZwWriteFile",(unsigned int)ZwWriteFile},
|
||||
{"_sprintf",(unsigned int)sprintf},
|
||||
{"_wcschr",(unsigned int)wcschr},
|
||||
{"_wcsncat",(unsigned int)wcsncat},
|
||||
{"_wcsncpy",(unsigned int)wcsncpy},
|
||||
{"_wtolower",(unsigned int)wtolower},
|
||||
{"_wtoupper",(unsigned int)wtoupper},
|
||||
{"_CbInitDccb",(unsigned int)CbInitDccb},
|
||||
{"_CbAcquireForRead",(unsigned int)CbAcquireForRead},
|
||||
{"_CbReleaseFromRead",(unsigned int)CbReleaseFromRead},
|
||||
{NULL,NULL},
|
||||
};
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
VOID KeInit()
|
||||
VOID KeInit(VOID)
|
||||
{
|
||||
KeInitDpc();
|
||||
KeInitializeBugCheck();
|
||||
|
|
|
@ -37,5 +37,6 @@ LONG KeReleaseSemaphore(PKSEMAPHORE Semaphore,
|
|||
LONG Adjustment,
|
||||
BOOLEAN Wait)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
|
|
|
@ -53,12 +53,12 @@ static LIST_ENTRY timer_list_head = {NULL,NULL};
|
|||
static KSPIN_LOCK timer_list_lock = {0,};
|
||||
|
||||
|
||||
#define MICROSECONDS_TO_CALIBRATE (1000000)
|
||||
#define MICROSECONDS_PER_TICK (54945)
|
||||
#define MICROSECONDS_IN_A_SECOND (10000000)
|
||||
#define TICKS_PER_SECOND_APPROX (18)
|
||||
|
||||
static unsigned int loops_per_microsecond = 17;
|
||||
#define MICROSECONDS_PER_TICK (54945)
|
||||
#define TICKS_TO_CALIBRATE (1)
|
||||
#define CALIBRATE_PERIOD (MICROSECONDS_PER_TICK * TICKS_TO_CALIBRATE)
|
||||
|
||||
static unsigned int loops_per_microsecond = 100;
|
||||
|
||||
/* FUNCTIONS **************************************************************/
|
||||
|
||||
|
@ -68,37 +68,80 @@ void KeCalibrateTimerLoop()
|
|||
unsigned int end_tick;
|
||||
unsigned int nr_ticks;
|
||||
unsigned int i;
|
||||
unsigned int microseconds;
|
||||
|
||||
return;
|
||||
|
||||
for (i=0;i<5;i++)
|
||||
for (i=0;i<20;i++)
|
||||
{
|
||||
|
||||
start_tick = ticks;
|
||||
microseconds = 0;
|
||||
while (start_tick == ticks);
|
||||
KeStallExecutionProcessor(MICROSECONDS_TO_CALIBRATE);
|
||||
end_tick = ticks;
|
||||
while (end_tick==ticks);
|
||||
|
||||
nr_ticks = end_tick - start_tick;
|
||||
loops_per_microsecond = (loops_per_microsecond * MICROSECONDS_TO_CALIBRATE)
|
||||
/ (nr_ticks*MICROSECONDS_PER_TICK);
|
||||
|
||||
DbgPrint("nr_ticks %d\n",nr_ticks);
|
||||
DbgPrint("loops_per_microsecond %d\n",loops_per_microsecond);
|
||||
DbgPrint("Processor speed (approx) %d\n",
|
||||
(6*loops_per_microsecond)/1000);
|
||||
|
||||
if (nr_ticks == (TICKS_PER_SECOND_APPROX * MICROSECONDS_TO_CALIBRATE)
|
||||
/ MICROSECONDS_IN_A_SECOND)
|
||||
while (ticks == (start_tick+TICKS_TO_CALIBRATE))
|
||||
{
|
||||
DbgPrint("Testing loop\n");
|
||||
KeStallExecutionProcessor(10000);
|
||||
DbgPrint("Finished loop\n");
|
||||
return;
|
||||
KeStallExecutionProcessor(1);
|
||||
microseconds++;
|
||||
};
|
||||
|
||||
// DbgPrint("microseconds %d\n",microseconds);
|
||||
|
||||
if (microseconds > (CALIBRATE_PERIOD+1000))
|
||||
{
|
||||
loops_per_microsecond = loops_per_microsecond + 1;
|
||||
}
|
||||
if (microseconds < (CALIBRATE_PERIOD-1000))
|
||||
{
|
||||
loops_per_microsecond = loops_per_microsecond - 1;
|
||||
}
|
||||
// DbgPrint("loops_per_microsecond %d\n",loops_per_microsecond);
|
||||
}
|
||||
// for(;;);
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS STDCALL NtQueryTimerResolution (OUT PULONG MinimumResolution,
|
||||
OUT PULONG MaximumResolution,
|
||||
OUT PULONG ActualResolution)
|
||||
{
|
||||
return(ZwQueryTimerResolution(MinimumResolution,MaximumResolution,
|
||||
ActualResolution));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwQueryTimerResolution (OUT PULONG MinimumResolution,
|
||||
OUT PULONG MaximumResolution,
|
||||
OUT PULONG ActualResolution)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtSetTimerResolution(IN ULONG RequestedResolution,
|
||||
IN BOOL SetOrUnset,
|
||||
OUT PULONG ActualResolution)
|
||||
{
|
||||
return(ZwSetTimerResolution(RequestedResolution,
|
||||
SetOrUnset,
|
||||
ActualResolution));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwSetTimerResolution(IN ULONG RequestedResolution,
|
||||
IN BOOL SetOrUnset,
|
||||
OUT PULONG ActualResolution)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtQueryPerformanceCounter(IN PLARGE_INTEGER Counter,
|
||||
IN PLARGE_INTEGER Frequency)
|
||||
{
|
||||
return(ZwQueryPerformanceCounter(Counter,
|
||||
Frequency));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwQueryPerformanceCounter(IN PLARGE_INTEGER Counter,
|
||||
IN PLARGE_INTEGER Frequency)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS KeAddThreadTimeout(PKTHREAD Thread, PLARGE_INTEGER Interval)
|
||||
{
|
||||
|
@ -106,6 +149,19 @@ NTSTATUS KeAddThreadTimeout(PKTHREAD Thread, PLARGE_INTEGER Interval)
|
|||
KeSetTimer(&(Thread->TimerBlock),*Interval,NULL);
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS STDCALL NtDelayExecution(IN BOOLEAN Alertable,
|
||||
IN TIME *Interval)
|
||||
{
|
||||
return(ZwDelayExecution(Alertable,Interval));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwDelayExecution(IN BOOLEAN Alertable,
|
||||
IN TIME *Interval)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS KeDelayExecutionThread(KPROCESSOR_MODE WaitMode,
|
||||
BOOLEAN Alertable,
|
||||
PLARGE_INTEGER Interval)
|
||||
|
@ -211,6 +267,15 @@ VOID KeQuerySystemTime(PLARGE_INTEGER CurrentTime)
|
|||
ULLToLargeInteger(system_time,CurrentTime);
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtGetTickCount(PULONG UpTime)
|
||||
{
|
||||
return(ZwGetTickCount(UpTime));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwGetTickCount(PULONG UpTime)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
BOOLEAN KeSetTimer(PKTIMER Timer, LARGE_INTEGER DueTime, PKDPC Dpc)
|
||||
/*
|
||||
|
|
|
@ -80,7 +80,7 @@ VOID KeDispatcherObjectWakeAll(DISPATCHER_HEADER* hdr)
|
|||
current = CONTAINING_RECORD(current_entry,KWAIT_BLOCK,
|
||||
WaitListEntry);
|
||||
DPRINT("Waking %x\n",current->Thread);
|
||||
PsWakeThread((PETHREAD)current->Thread);
|
||||
PsResumeThread(CONTAINING_RECORD(current->Thread,ETHREAD,Tcb));
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -101,7 +101,7 @@ BOOLEAN KeDispatcherObjectWakeOne(DISPATCHER_HEADER* hdr)
|
|||
WaitListEntry);
|
||||
DPRINT("current_entry %x current %x\n",current_entry,current);
|
||||
DPRINT("Waking %x\n",current->Thread);
|
||||
PsWakeThread((PETHREAD)current->Thread);
|
||||
PsResumeThread(CONTAINING_RECORD(current->Thread,ETHREAD,Tcb));
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
|
@ -146,15 +146,17 @@ NTSTATUS KeWaitForSingleObject(PVOID Object,
|
|||
{
|
||||
DISPATCHER_HEADER* hdr = (DISPATCHER_HEADER *)Object;
|
||||
KWAIT_BLOCK blk;
|
||||
KIRQL oldlvl;
|
||||
|
||||
DPRINT("Entering KeWaitForSingleObject(Object %x)\n",Object);
|
||||
|
||||
KeAcquireDispatcherDatabaseLock(FALSE);
|
||||
|
||||
if (hdr->SignalState)
|
||||
{
|
||||
if (hdr->Type == SynchronizationEvent)
|
||||
{
|
||||
hdr->SignalState=FALSE;
|
||||
}
|
||||
KeReleaseDispatcherDatabaseLock(FALSE);
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
@ -173,7 +175,7 @@ NTSTATUS KeWaitForSingleObject(PVOID Object,
|
|||
// DPRINT("hdr->WaitListHead.Flink %x hdr->WaitListHead.Blink %x\n",
|
||||
// hdr->WaitListHead.Flink,hdr->WaitListHead.Blink);
|
||||
KeReleaseDispatcherDatabaseLock(FALSE);
|
||||
PsSuspendThread();
|
||||
PsSuspendThread(PsGetCurrentThread());
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
@ -193,3 +195,63 @@ VOID KeInitializeDispatcher(VOID)
|
|||
{
|
||||
KeInitializeSpinLock(&DispatcherDatabaseLock);
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtWaitForMultipleObjects (IN ULONG Count,
|
||||
IN PHANDLE Object[],
|
||||
IN CINT WaitType,
|
||||
IN BOOLEAN Alertable,
|
||||
IN PLARGE_INTEGER Time)
|
||||
{
|
||||
return(ZwWaitForMultipleObjects(Count,
|
||||
Object,
|
||||
WaitType,
|
||||
Alertable,
|
||||
Time));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwWaitForMultipleObjects (IN ULONG Count,
|
||||
IN PHANDLE Object[],
|
||||
IN CINT WaitType,
|
||||
IN BOOLEAN Alertable,
|
||||
IN PLARGE_INTEGER Time)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtWaitForSingleObject (IN PHANDLE Object,
|
||||
IN BOOLEAN Alertable,
|
||||
IN PLARGE_INTEGER Time)
|
||||
{
|
||||
return(ZwWaitForSingleObject(Object,
|
||||
Alertable,
|
||||
Time));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwWaitForSingleObject (IN PHANDLE Object,
|
||||
IN BOOLEAN Alertable,
|
||||
IN PLARGE_INTEGER Time)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS STDCALL NtSignalAndWaitForSingleObject(
|
||||
IN HANDLE EventHandle,
|
||||
IN BOOLEAN Alertable,
|
||||
IN PLARGE_INTEGER Time,
|
||||
PULONG NumberOfWaitingThreads OPTIONAL)
|
||||
{
|
||||
return(ZwSignalAndWaitForSingleObject(EventHandle,
|
||||
Alertable,
|
||||
Time,
|
||||
NumberOfWaitingThreads));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwSignalAndWaitForSingleObject(
|
||||
IN HANDLE EventHandle,
|
||||
IN BOOLEAN Alertable,
|
||||
IN PLARGE_INTEGER Time,
|
||||
PULONG NumberOfWaitingThreads OPTIONAL)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
/* INCLUDES ****************************************************************/
|
||||
|
||||
#include <internal/stddef.h>
|
||||
#include <internal/hal/page.h>
|
||||
#include <internal/mmhal.h>
|
||||
#include <internal/mm.h>
|
||||
#include <internal/ntoskrnl.h>
|
||||
#include <internal/bitops.h>
|
||||
|
@ -166,7 +166,7 @@ unsigned int get_free_page(void)
|
|||
unsigned int eflags;
|
||||
__asm__("pushf\n\tpop %0\n\tcli\n\t"
|
||||
: "=d" (eflags));
|
||||
CHECKPOINT;
|
||||
|
||||
/*
|
||||
* If we are totally out of memory then panic
|
||||
*/
|
||||
|
@ -175,9 +175,9 @@ unsigned int get_free_page(void)
|
|||
printk("CRITICAL: Unable to allocate page\n");
|
||||
KeBugCheck(KBUG_OUT_OF_MEMORY);
|
||||
}
|
||||
CHECKPOINT;
|
||||
|
||||
addr = 0;
|
||||
CHECKPOINT;
|
||||
|
||||
if (free_page_list_head->nr_pages>1)
|
||||
{
|
||||
free_page_list_head->nr_pages--;
|
||||
|
@ -189,14 +189,14 @@ unsigned int get_free_page(void)
|
|||
addr = (unsigned int)free_page_list_head;
|
||||
free_page_list_head = free_page_list_head -> next;
|
||||
}
|
||||
CHECKPOINT;
|
||||
|
||||
__asm__("push %0\n\tpopf\n\t"
|
||||
:
|
||||
: "d" (eflags));
|
||||
|
||||
addr = addr - (IDMAP_BASE);
|
||||
DPRINT("allocated %x\n",addr);
|
||||
CHECKPOINT;
|
||||
|
||||
return(addr);
|
||||
}
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
#include <internal/bitops.h>
|
||||
#include <internal/string.h>
|
||||
|
||||
#include <internal/hal/page.h>
|
||||
#include <internal/mmhal.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
@ -115,6 +115,7 @@ void MmInitalize(boot_param* bp)
|
|||
{
|
||||
set_page(i,0,0);
|
||||
}
|
||||
set_page(0,0,0);
|
||||
FLUSH_TLB;
|
||||
CHECKPOINT;
|
||||
/*
|
||||
|
@ -122,51 +123,3 @@ void MmInitalize(boot_param* bp)
|
|||
*/
|
||||
VirtualInit(bp);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
void* MmMapIoSpace(unsigned int physical_address, unsigned int size,
|
||||
unsigned int cachable)
|
||||
/*
|
||||
* FUNCTION: Make a portion of io space accessible to a device driver
|
||||
*/
|
||||
{
|
||||
/*
|
||||
* Determine here if the mapping is legel
|
||||
*/
|
||||
|
||||
/*
|
||||
* Find an address to place the mapping
|
||||
*/
|
||||
memory_area_desc* current = memory_area_list_head;
|
||||
memory_area_desc* new_area=ExAllocateMemory(sizeof(memory_area_desc));
|
||||
size = PAGE_ROUND_UP(size);
|
||||
|
||||
while (current!=NULL)
|
||||
{
|
||||
if ( current->next==NULL ||
|
||||
(current->next->base - (current->base+current->length))
|
||||
>= size)
|
||||
{
|
||||
new_area->base=current->base+current->length;
|
||||
new_area->length=size;
|
||||
new_area->next=current->next;
|
||||
current->next=new_area;
|
||||
}
|
||||
current=current->next;
|
||||
}
|
||||
|
||||
/*
|
||||
* Map the desired physical memory
|
||||
*/
|
||||
for (int i=0;i<size;i++)
|
||||
{
|
||||
set_page(new_area->base+i,
|
||||
PA_READ | PA_WRITE | PA_EXECUTE | PA_SYSTEM,
|
||||
physical_address+i);
|
||||
}
|
||||
|
||||
return((void *)new_area->base);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1,24 +1,37 @@
|
|||
%include 'internal/hal/segment.inc'
|
||||
|
||||
|
||||
%define PREFIX(a) _(a)
|
||||
|
||||
BITS 32
|
||||
GLOBAL _exception_handler14
|
||||
EXTERN _exception_handler
|
||||
EXTERN _page_fault_handler
|
||||
extern PREFIX(page_fault_handler)
|
||||
extern PREFIX exception_handler
|
||||
segment .text
|
||||
|
||||
_exception_handler14:
|
||||
DECLARE_GLOBAL_SYMBOL exception_handler14
|
||||
cli
|
||||
push gs
|
||||
push fs
|
||||
push es
|
||||
push ds
|
||||
push dword 14
|
||||
pushad
|
||||
mov ax,KERNEL_DS
|
||||
mov ds,ax
|
||||
mov es,ax
|
||||
mov fs,ax
|
||||
mov gs,ax
|
||||
call _page_fault_handler
|
||||
cmp eax,0
|
||||
jne _ret_from_exp
|
||||
call _exception_handler
|
||||
_ret_from_exp:
|
||||
popad
|
||||
add esp,12
|
||||
add esp,4
|
||||
pop ds
|
||||
pop es
|
||||
pop fs
|
||||
pop gs
|
||||
add esp,4
|
||||
iretd
|
||||
|
||||
|
|
|
@ -4,539 +4,57 @@
|
|||
* FILE: ntoskrnl/mm/pool.c
|
||||
* PURPOSE: Implements the kernel memory pool
|
||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
||||
* UPDATE HISTORY:
|
||||
* 27/05/98: Created
|
||||
* 10/06/98: Bug fixes by Iwan Fatahi (i_fatahi@hotmail.com)
|
||||
* in take_block (if current bigger than required)
|
||||
* in remove_from_used_list
|
||||
* in ExFreePool
|
||||
* 23/08/98: Fixes from Robert Bergkvist (fragdance@hotmail.com)
|
||||
*/
|
||||
|
||||
/* INCLUDES ****************************************************************/
|
||||
|
||||
#include <internal/string.h>
|
||||
#include <internal/stddef.h>
|
||||
#include <internal/mm.h>
|
||||
#include <internal/hal/page.h>
|
||||
#include <internal/pool.h>
|
||||
#include <internal/bitops.h>
|
||||
#include <internal/ntoskrnl.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
#include <ddk/ntddk.h>
|
||||
#include <internal/pool.h>
|
||||
|
||||
/* TYPES *******************************************************************/
|
||||
|
||||
/*
|
||||
* fields present at the start of a block (this is for internal use only)
|
||||
*/
|
||||
typedef struct _block_hdr
|
||||
{
|
||||
unsigned int size;
|
||||
struct _block_hdr* previous;
|
||||
struct _block_hdr* next;
|
||||
} block_hdr;
|
||||
//#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
/* GLOBALS *****************************************************************/
|
||||
|
||||
/*
|
||||
* Memory managment initalized symbol for the base of the pool
|
||||
*/
|
||||
unsigned int kernel_pool_base = 0;
|
||||
|
||||
/*
|
||||
* Pointer to the first block in the free list
|
||||
*/
|
||||
static block_hdr* free_list_head = NULL;
|
||||
static block_hdr* used_list_head = NULL;
|
||||
static unsigned int nr_free_blocks = 0;
|
||||
static unsigned int nr_used_blocks = 0;
|
||||
|
||||
#define ALLOC_MAP_SIZE (NONPAGED_POOL_SIZE / PAGESIZE)
|
||||
|
||||
/*
|
||||
* One bit for each page in the kmalloc region
|
||||
* If set then the page is used by a kmalloc block
|
||||
*/
|
||||
static unsigned int alloc_map[ALLOC_MAP_SIZE/32]={0,};
|
||||
#define TAG_NONE (ULONG)(('N'<<0) + ('o'<<8) + ('n'<<16) + ('e'<<24))
|
||||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
||||
VOID ExInitNonPagedPool(ULONG BaseAddress)
|
||||
{
|
||||
kernel_pool_base=BaseAddress;
|
||||
}
|
||||
|
||||
static void validate_free_list(void)
|
||||
PVOID ExAllocatePool(POOL_TYPE PoolType, ULONG NumberOfBytes)
|
||||
/*
|
||||
* FUNCTION: Validate the integrity of the list of free blocks
|
||||
*/
|
||||
{
|
||||
block_hdr* current=free_list_head;
|
||||
unsigned int blocks_seen=0;
|
||||
|
||||
while (current!=NULL)
|
||||
{
|
||||
unsigned int base_addr = (int)current;
|
||||
if (base_addr < (kernel_pool_base) ||
|
||||
(base_addr+current->size) >
|
||||
(kernel_pool_base)+NONPAGED_POOL_SIZE)
|
||||
{
|
||||
printk("Block %x found outside pool area\n",current);
|
||||
printk("Size %d\n",current->size);
|
||||
printk("Limits are %x %x\n",kernel_pool_base,
|
||||
kernel_pool_base+NONPAGED_POOL_SIZE);
|
||||
KeBugCheck(KBUG_POOL_FREE_LIST_CORRUPT);
|
||||
}
|
||||
blocks_seen++;
|
||||
if (blocks_seen > nr_free_blocks)
|
||||
{
|
||||
printk("Too many blocks on list\n");
|
||||
KeBugCheck(KBUG_POOL_FREE_LIST_CORRUPT);
|
||||
}
|
||||
// verify_for_write(base_addr,current->size);
|
||||
if (current->next!=NULL&¤t->next->previous!=current)
|
||||
{
|
||||
printk("%s:%d:Break in list (current %x next %x "
|
||||
"current->next->previous %x)\n",
|
||||
__FILE__,__LINE__,current,current->next,
|
||||
current->next->previous);
|
||||
KeBugCheck(KBUG_POOL_FREE_LIST_CORRUPT);
|
||||
}
|
||||
current=current->next;
|
||||
}
|
||||
}
|
||||
|
||||
static void validate_used_list(void)
|
||||
/*
|
||||
* FUNCTION: Validate the integrity of the list of used blocks
|
||||
*/
|
||||
{
|
||||
block_hdr* current=used_list_head;
|
||||
unsigned int blocks_seen=0;
|
||||
|
||||
while (current!=NULL)
|
||||
{
|
||||
unsigned int base_addr = (int)current;
|
||||
if (base_addr < (kernel_pool_base) ||
|
||||
(base_addr+current->size) >
|
||||
(kernel_pool_base)+NONPAGED_POOL_SIZE)
|
||||
{
|
||||
printk("Block %x found outside pool area\n",current);
|
||||
for(;;);
|
||||
}
|
||||
blocks_seen++;
|
||||
if (blocks_seen > nr_used_blocks)
|
||||
{
|
||||
printk("Too many blocks on list\n");
|
||||
for(;;);
|
||||
}
|
||||
// verify_for_write(base_addr,current->size);
|
||||
if (current->next!=NULL&¤t->next->previous!=current)
|
||||
{
|
||||
printk("Break in list (current %x next %x)\n",
|
||||
current,current->next);
|
||||
for(;;);
|
||||
}
|
||||
current=current->next;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void check_duplicates(block_hdr* blk)
|
||||
/*
|
||||
* FUNCTION: Check a block has no duplicates
|
||||
* FUNCTION: Allocates pool memory of a specified type and returns a pointer
|
||||
* to the allocated block. This routine is used for general purpose allocation
|
||||
* of memory
|
||||
* ARGUMENTS:
|
||||
* blk = block to check
|
||||
* NOTE: Bug checks if duplicates are found
|
||||
* PoolType
|
||||
* Specifies the type of memory to allocate which can be one
|
||||
* of the following:
|
||||
*
|
||||
* NonPagedPool
|
||||
* NonPagedPoolMustSucceed
|
||||
* NonPagedPoolCacheAligned
|
||||
* NonPagedPoolCacheAlignedMustS
|
||||
* PagedPool
|
||||
* PagedPoolCacheAligned
|
||||
*
|
||||
* NumberOfBytes
|
||||
* Specifies the number of bytes to allocate
|
||||
* RETURNS: The allocated block on success
|
||||
* NULL on failure
|
||||
*/
|
||||
{
|
||||
unsigned int base = (int)blk;
|
||||
unsigned int last = ((int)blk) + +sizeof(block_hdr) + blk->size;
|
||||
|
||||
block_hdr* current=free_list_head;
|
||||
while (current!=NULL)
|
||||
{
|
||||
if ( (int)current > base && (int)current < last )
|
||||
{
|
||||
printk("intersecting blocks on list\n");
|
||||
for(;;);
|
||||
}
|
||||
if ( (int)current < base &&
|
||||
((int)current + current->size + sizeof(block_hdr))
|
||||
> base )
|
||||
{
|
||||
printk("intersecting blocks on list\n");
|
||||
for(;;);
|
||||
}
|
||||
current=current->next;
|
||||
}
|
||||
current=used_list_head;
|
||||
while (current!=NULL)
|
||||
{
|
||||
if ( (int)current > base && (int)current < last )
|
||||
{
|
||||
printk("intersecting blocks on list\n");
|
||||
for(;;);
|
||||
}
|
||||
if ( (int)current < base &&
|
||||
((int)current + current->size + sizeof(block_hdr))
|
||||
> base )
|
||||
{
|
||||
printk("intersecting blocks on list\n");
|
||||
for(;;);
|
||||
}
|
||||
current=current->next;
|
||||
return(ExAllocatePoolWithTag(PoolType,NumberOfBytes,TAG_NONE));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void validate_kernel_pool(void)
|
||||
/*
|
||||
* FUNCTION: Checks the integrity of the kernel memory heap
|
||||
*/
|
||||
{
|
||||
block_hdr* current=NULL;
|
||||
|
||||
validate_free_list();
|
||||
validate_used_list();
|
||||
|
||||
current=free_list_head;
|
||||
while (current!=NULL)
|
||||
{
|
||||
check_duplicates(current);
|
||||
current=current->next;
|
||||
}
|
||||
current=used_list_head;
|
||||
while (current!=NULL)
|
||||
{
|
||||
check_duplicates(current);
|
||||
current=current->next;
|
||||
}
|
||||
}
|
||||
|
||||
static void add_to_free_list(block_hdr* blk)
|
||||
/*
|
||||
* FUNCTION: add the block to the free list (internal)
|
||||
*/
|
||||
{
|
||||
blk->next=free_list_head;
|
||||
blk->previous=NULL;
|
||||
if (free_list_head!=NULL)
|
||||
{
|
||||
free_list_head->previous=blk;
|
||||
}
|
||||
free_list_head=blk;
|
||||
nr_free_blocks++;
|
||||
}
|
||||
|
||||
static void add_to_used_list(block_hdr* blk)
|
||||
/*
|
||||
* FUNCTION: add the block to the used list (internal)
|
||||
*/
|
||||
{
|
||||
blk->next=used_list_head;
|
||||
blk->previous=NULL;
|
||||
if (used_list_head!=NULL)
|
||||
{
|
||||
used_list_head->previous=blk;
|
||||
}
|
||||
used_list_head=blk;
|
||||
nr_used_blocks++;
|
||||
}
|
||||
|
||||
|
||||
static void remove_from_free_list(block_hdr* current)
|
||||
{
|
||||
if (current->next==NULL&¤t->previous==NULL)
|
||||
{
|
||||
free_list_head=NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (current->next==NULL)
|
||||
{
|
||||
current->previous->next=NULL;
|
||||
}
|
||||
else if (current->previous==NULL)
|
||||
{
|
||||
current->next->previous=NULL;
|
||||
free_list_head=current->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
current->next->previous=current->previous;
|
||||
current->previous->next=current->next;
|
||||
}
|
||||
}
|
||||
nr_free_blocks--;
|
||||
}
|
||||
|
||||
#ifdef BROKEN_VERSION_OF_REMOVE_FROM_FREE_LIST
|
||||
static void remove_from_free_list(block_hdr* current)
|
||||
{
|
||||
if (current->next==NULL&¤t->previous==NULL)
|
||||
{
|
||||
free_list_head=NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (current->next==NULL)
|
||||
{
|
||||
current->previous->next=NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
current->previous->next=current->next;
|
||||
}
|
||||
if (current->previous==NULL)
|
||||
{
|
||||
current->next->previous=NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
current->next->previous=current->previous;
|
||||
}
|
||||
}
|
||||
nr_free_blocks--;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void remove_from_used_list(block_hdr* current)
|
||||
{
|
||||
if (current->next==NULL&¤t->previous==NULL)
|
||||
{
|
||||
used_list_head=NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (current->previous==NULL)
|
||||
{
|
||||
current->next->previous=NULL;
|
||||
used_list_head=current->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
current->previous->next=current->next;
|
||||
}
|
||||
if (current->next!=NULL)
|
||||
{
|
||||
current->next->previous=current->previous;
|
||||
}
|
||||
else
|
||||
{
|
||||
current->previous->next=NULL;
|
||||
}
|
||||
}
|
||||
nr_used_blocks--;
|
||||
}
|
||||
|
||||
|
||||
inline static void* block_to_address(block_hdr* blk)
|
||||
/*
|
||||
* FUNCTION: Translate a block header address to the corresponding block
|
||||
* address (internal)
|
||||
*/
|
||||
{
|
||||
return ( (void *) ((int)blk + sizeof(block_hdr)) );
|
||||
}
|
||||
|
||||
inline static block_hdr* address_to_block(void* addr)
|
||||
{
|
||||
return (block_hdr *)
|
||||
( ((int)addr) - sizeof(block_hdr) );
|
||||
}
|
||||
|
||||
static unsigned int alloc_pool_region(unsigned int nr_pages)
|
||||
/*
|
||||
* FUNCTION: Allocates a region of pages within the nonpaged pool area
|
||||
*/
|
||||
{
|
||||
unsigned int start = 0;
|
||||
unsigned int length = 0;
|
||||
unsigned int i,j;
|
||||
|
||||
DPRINT("alloc_pool_region(nr_pages = %d)\n",nr_pages);
|
||||
|
||||
for (i=1; i<ALLOC_MAP_SIZE;i++)
|
||||
{
|
||||
if (!test_bit(i%32,&alloc_map[i/32]))
|
||||
{
|
||||
if (length == 0)
|
||||
{
|
||||
start=i;
|
||||
length = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
length++;
|
||||
}
|
||||
if (length==nr_pages)
|
||||
{
|
||||
DPRINT("found region at %d for %d\n",start,
|
||||
length);
|
||||
for (j=start;j<(start+length);j++)
|
||||
{
|
||||
DPRINT("Writing %x\n",&alloc_map[j/32]);
|
||||
set_bit(j%32,&alloc_map[j/32]);
|
||||
}
|
||||
DPRINT("returning %x\n",(start*PAGESIZE)
|
||||
+kernel_pool_base);
|
||||
return((start*PAGESIZE)+kernel_pool_base);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
start=0;
|
||||
length=0;
|
||||
}
|
||||
}
|
||||
printk("CRITICAL: Out of kmalloc space\n");
|
||||
for(;;);
|
||||
return(0);
|
||||
}
|
||||
|
||||
static block_hdr* grow_kernel_pool(unsigned int size)
|
||||
/*
|
||||
* FUNCTION: Grow the executive heap to accomodate a block of at least 'size'
|
||||
* bytes
|
||||
*/
|
||||
{
|
||||
unsigned int total_size = size + sizeof(block_hdr);
|
||||
unsigned int nr_pages = PAGE_ROUND_UP(total_size) / PAGESIZE;
|
||||
unsigned int start = alloc_pool_region(nr_pages);
|
||||
block_hdr* used_blk=NULL;
|
||||
block_hdr* free_blk=NULL;
|
||||
int i;
|
||||
|
||||
DPRINT("growing heap for block size %d, ",size);
|
||||
DPRINT("start %x\n",start);
|
||||
|
||||
for (i=0;i<nr_pages;i++)
|
||||
{
|
||||
set_page(start+(i*PAGESIZE),PA_SYSTEM | PA_WRITE | PA_READ,
|
||||
get_free_page());
|
||||
}
|
||||
|
||||
|
||||
if ((PAGESIZE-(total_size%PAGESIZE))>(2*sizeof(block_hdr)))
|
||||
{
|
||||
used_blk = (struct _block_hdr *)start;
|
||||
DPRINT("Creating block at %x\n",start);
|
||||
used_blk->size = size;
|
||||
add_to_used_list(used_blk);
|
||||
|
||||
free_blk = (block_hdr *)(start + sizeof(block_hdr) + size);
|
||||
DPRINT("Creating block at %x\n",free_blk);
|
||||
free_blk->size = (nr_pages * PAGESIZE) -((sizeof(block_hdr)*2) + size);
|
||||
add_to_free_list(free_blk);
|
||||
}
|
||||
else
|
||||
{
|
||||
used_blk = (struct _block_hdr *)start;
|
||||
used_blk->size = nr_pages * PAGESIZE;
|
||||
add_to_used_list(used_blk);
|
||||
}
|
||||
|
||||
validate_kernel_pool();
|
||||
return(used_blk);
|
||||
}
|
||||
|
||||
static void* take_block(block_hdr* current, unsigned int size)
|
||||
/*
|
||||
* FUNCTION: Allocate a used block of least 'size' from the specified
|
||||
* free block
|
||||
* RETURNS: The address of the created memory block
|
||||
*/
|
||||
{
|
||||
/*
|
||||
* If the block is much bigger than required then split it and
|
||||
* return a pointer to the allocated section. If the difference
|
||||
* between the sizes is marginal it makes no sense to have the
|
||||
* extra overhead
|
||||
*/
|
||||
if (current->size > (1 + size + sizeof(block_hdr)))
|
||||
{
|
||||
/*
|
||||
* Replace the bigger block with a smaller block in the
|
||||
* same position in the list
|
||||
*/
|
||||
block_hdr* free_blk = (block_hdr *)(((int)current)
|
||||
+ sizeof(block_hdr) + size);
|
||||
free_blk->next = current->next;
|
||||
free_blk->previous = current->previous;
|
||||
if (current->next)
|
||||
{
|
||||
current->next->previous = free_blk;
|
||||
}
|
||||
if (current->previous)
|
||||
{
|
||||
current->previous->next = free_blk;
|
||||
}
|
||||
free_blk->size = current->size - (sizeof(block_hdr) + size);
|
||||
if (current==free_list_head)
|
||||
{
|
||||
free_list_head=free_blk;
|
||||
}
|
||||
|
||||
current->size=size;
|
||||
add_to_used_list(current);
|
||||
|
||||
validate_kernel_pool();
|
||||
return(block_to_address(current));
|
||||
}
|
||||
|
||||
/*
|
||||
* Otherwise allocate the whole block
|
||||
*/
|
||||
remove_from_free_list(current);
|
||||
add_to_used_list(current);
|
||||
|
||||
validate_kernel_pool();
|
||||
return(block_to_address(current));
|
||||
}
|
||||
|
||||
asmlinkage VOID ExFreePool(PVOID block)
|
||||
/*
|
||||
* FUNCTION: Releases previously allocated memory
|
||||
* ARGUMENTS:
|
||||
* block = block to free
|
||||
*/
|
||||
{
|
||||
block_hdr* blk=address_to_block(block);
|
||||
DPRINT("(%s:%d) freeing block %x\n",__FILE__,__LINE__,blk);
|
||||
|
||||
validate_kernel_pool();
|
||||
/*
|
||||
* Please don't change the order
|
||||
*/
|
||||
remove_from_used_list(blk);
|
||||
add_to_free_list(blk);
|
||||
|
||||
validate_kernel_pool();
|
||||
}
|
||||
|
||||
#define CACHE_ALIGNMENT (16)
|
||||
|
||||
PVOID ExAllocatePool(ULONG type, ULONG size)
|
||||
/*
|
||||
* FUNCTION: Allocates memory from the pool
|
||||
* ARGUMENTS:
|
||||
* size = minimum size of the block to be allocated
|
||||
* type = the type of memory to use for the block
|
||||
* RETURNS:
|
||||
* the address of the block if it succeeds
|
||||
*/
|
||||
PVOID ExAllocatePoolWithTag(ULONG type, ULONG size, ULONG Tag)
|
||||
{
|
||||
PVOID Block;
|
||||
|
||||
if (type == NonPagedPoolCacheAligned ||
|
||||
type == NonPagedPoolCacheAlignedMustS)
|
||||
{
|
||||
size = size + CACHE_ALIGNMENT;
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
switch(type)
|
||||
|
@ -545,12 +63,12 @@ PVOID ExAllocatePool(ULONG type, ULONG size)
|
|||
case NonPagedPoolMustSucceed:
|
||||
case NonPagedPoolCacheAligned:
|
||||
case NonPagedPoolCacheAlignedMustS:
|
||||
Block = ExAllocateNonPagedPool(type,size);
|
||||
Block = ExAllocateNonPagedPoolWithTag(type,size,Tag);
|
||||
break;
|
||||
|
||||
case PagedPool:
|
||||
case PagedPoolCacheAligned:
|
||||
Block = ExAllocatePagedPool(type,size);
|
||||
Block = ExAllocatePagedPoolWithTag(type,size,Tag);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -562,68 +80,16 @@ PVOID ExAllocatePool(ULONG type, ULONG size)
|
|||
{
|
||||
KeBugCheck(MUST_SUCCEED_POOL_EMPTY);
|
||||
}
|
||||
if (type == NonPagedPoolCacheAligned ||
|
||||
type == NonPagedPoolCacheAlignedMustS)
|
||||
{
|
||||
Block = Block + CACHE_ALIGNMENT - (((int)Block)%CACHE_ALIGNMENT);
|
||||
}
|
||||
return(Block);
|
||||
}
|
||||
|
||||
static PVOID ExAllocatePagedPool(ULONG type, ULONG size)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
static PVOID ExAllocateNonPagedPool(ULONG type, ULONG size)
|
||||
{
|
||||
block_hdr* current=NULL;
|
||||
void* block;
|
||||
|
||||
DPRINT("kmalloc(size %d)\n",size);
|
||||
validate_kernel_pool();
|
||||
|
||||
/*
|
||||
* accomodate this useful idiom
|
||||
*/
|
||||
if (size==0)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Look for an already created block of sufficent size
|
||||
*/
|
||||
current=free_list_head;
|
||||
|
||||
while (current!=NULL)
|
||||
{
|
||||
DPRINT("current %x size %x next %x\n",current,current->size,
|
||||
current->next);
|
||||
if (current->size>=size)
|
||||
{
|
||||
DPRINT("found block %x of size %d\n",current,size);
|
||||
block=take_block(current,size);
|
||||
memset(block,0,size);
|
||||
return(block);
|
||||
}
|
||||
current=current->next;
|
||||
}
|
||||
|
||||
/*
|
||||
* Otherwise create a new block
|
||||
*/
|
||||
block=block_to_address(grow_kernel_pool(size));
|
||||
memset(block,0,size);
|
||||
return(block);
|
||||
}
|
||||
|
||||
PVOID ExAllocatePoolWithQuota(POOL_TYPE PoolType, ULONG NumberOfBytes)
|
||||
PVOID ExAllocatePoolWithQuotaTag(POOL_TYPE PoolType, ULONG NumberOfBytes,
|
||||
ULONG Tag)
|
||||
{
|
||||
PVOID Block;
|
||||
PKTHREAD current = KeGetCurrentThread();
|
||||
|
||||
Block = ExAllocatePool(PoolType,NumberOfBytes);
|
||||
Block = ExAllocatePoolWithTag(PoolType,NumberOfBytes,Tag);
|
||||
switch(PoolType)
|
||||
{
|
||||
case NonPagedPool:
|
||||
|
@ -641,29 +107,8 @@ PVOID ExAllocatePoolWithQuota(POOL_TYPE PoolType, ULONG NumberOfBytes)
|
|||
return(Block);
|
||||
}
|
||||
|
||||
PVOID ExAllocatePoolWithQuotaTag(POOL_TYPE PoolType, ULONG NumberOfBytes,
|
||||
ULONG Tag)
|
||||
PVOID ExAllocatePoolWithQuota(POOL_TYPE PoolType, ULONG NumberOfBytes)
|
||||
{
|
||||
PVOID Block;
|
||||
Block=ExAllocatePoolWithQuota(PoolType,NumberOfBytes+sizeof(ULONG));
|
||||
((ULONG *)Block)[0]=Tag;
|
||||
return(Block+4);
|
||||
return(ExAllocatePoolWithQuotaTag(PoolType,NumberOfBytes,TAG_NONE));
|
||||
}
|
||||
|
||||
PVOID ExAllocatePoolWithTag(POOL_TYPE PoolType, ULONG NumberOfBytes,
|
||||
ULONG Tag)
|
||||
/*
|
||||
* FUNCTION: Allocates pool memory and inserts a caller supplied tag before
|
||||
* the block allocated
|
||||
* ARGUMENTS:
|
||||
* PoolType = Type of memory to allocate
|
||||
* NumberOfBytes = Number of bytes to allocate
|
||||
* Tag = Tag
|
||||
* RETURNS: The address of the block allocated
|
||||
*/
|
||||
{
|
||||
PVOID Block;
|
||||
Block=ExAllocatePool(PoolType,NumberOfBytes+sizeof(ULONG));
|
||||
((ULONG *)Block)[0]=Tag;
|
||||
return(Block+4);
|
||||
}
|
||||
|
|
|
@ -12,11 +12,63 @@
|
|||
|
||||
#include <ddk/ntddk.h>
|
||||
#include <internal/mm.h>
|
||||
#include <internal/ob.h>
|
||||
#include <internal/io.h>
|
||||
#include <internal/ps.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
/* GLOBALS *******************************************************************/
|
||||
|
||||
POBJECT_TYPE MmSectionType = NULL;
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
NTSTATUS MmInitSectionImplementation(VOID)
|
||||
{
|
||||
ANSI_STRING AnsiString;
|
||||
|
||||
MmSectionType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
||||
|
||||
MmSectionType->TotalObjects = 0;
|
||||
MmSectionType->TotalHandles = 0;
|
||||
MmSectionType->MaxObjects = ULONG_MAX;
|
||||
MmSectionType->MaxHandles = ULONG_MAX;
|
||||
MmSectionType->PagedPoolCharge = 0;
|
||||
MmSectionType->NonpagedPoolCharge = sizeof(SECTION_OBJECT);
|
||||
MmSectionType->Dump = NULL;
|
||||
MmSectionType->Open = NULL;
|
||||
MmSectionType->Close = NULL;
|
||||
MmSectionType->Delete = NULL;
|
||||
MmSectionType->Parse = NULL;
|
||||
MmSectionType->Security = NULL;
|
||||
MmSectionType->QueryName = NULL;
|
||||
MmSectionType->OkayToClose = NULL;
|
||||
|
||||
RtlInitAnsiString(&AnsiString,"Section");
|
||||
RtlAnsiStringToUnicodeString(&MmSectionType->TypeName,
|
||||
&AnsiString,TRUE);
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtCreateSection(OUT PHANDLE SectionHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
||||
IN PLARGE_INTEGER MaximumSize OPTIONAL,
|
||||
IN ULONG SectionPageProtection OPTIONAL,
|
||||
IN ULONG AllocationAttributes,
|
||||
IN HANDLE FileHandle OPTIONAL)
|
||||
{
|
||||
return(ZwCreateSection(SectionHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes,
|
||||
MaximumSize,
|
||||
SectionPageProtection,
|
||||
AllocationAttributes,
|
||||
FileHandle));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwCreateSection(OUT PHANDLE SectionHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
||||
|
@ -49,13 +101,98 @@ NTSTATUS STDCALL ZwCreateSection(OUT PHANDLE SectionHandle,
|
|||
* RETURNS: Status
|
||||
*/
|
||||
{
|
||||
PSECTION_OBJECT Section;
|
||||
NTSTATUS Status;
|
||||
|
||||
DPRINT("ZwCreateSection()\n");
|
||||
|
||||
Section = ObGenericCreateObject(SectionHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes,
|
||||
MmSectionType);
|
||||
|
||||
if (MaximumSize != NULL)
|
||||
{
|
||||
Section->MaximumSize = *MaximumSize;
|
||||
}
|
||||
else
|
||||
{
|
||||
Section->MaximumSize.HighPart = 0;
|
||||
Section->MaximumSize.LowPart = 0xffffffff;
|
||||
}
|
||||
Section->SectionPageProtection = SectionPageProtection;
|
||||
Status = ObReferenceObjectByHandle(FileHandle,
|
||||
FILE_READ_DATA,
|
||||
IoFileType,
|
||||
UserMode,
|
||||
(PVOID*)&Section->FileObject,
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
Section->AllocateAttributes = AllocationAttributes;
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS NtOpenSection(PHANDLE SectionHandle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ObjectAttributes)
|
||||
{
|
||||
return(ZwOpenSection(SectionHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes));
|
||||
}
|
||||
|
||||
NTSTATUS ZwOpenSection(PHANDLE SectionHandle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ObjectAttributes)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
PVOID Object;
|
||||
NTSTATUS Status;
|
||||
PWSTR Ignored;
|
||||
|
||||
*SectionHandle = 0;
|
||||
|
||||
Status = ObOpenObjectByName(ObjectAttributes,&Object,&Ignored);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
if (BODY_TO_HEADER(Object)->ObjectType!=MmSectionType)
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
*SectionHandle = ObInsertHandle(KeGetCurrentProcess(),Object,
|
||||
DesiredAccess,FALSE);
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS NtMapViewOfSection(HANDLE SectionHandle,
|
||||
HANDLE ProcessHandle,
|
||||
PVOID* BaseAddress,
|
||||
ULONG ZeroBits,
|
||||
ULONG CommitSize,
|
||||
PLARGE_INTEGER SectionOffset,
|
||||
PULONG ViewSize,
|
||||
SECTION_INHERIT InheritDisposition,
|
||||
ULONG AllocationType,
|
||||
ULONG Protect)
|
||||
{
|
||||
return(ZwMapViewOfSection(SectionHandle,
|
||||
ProcessHandle,
|
||||
BaseAddress,
|
||||
ZeroBits,
|
||||
CommitSize,
|
||||
SectionOffset,
|
||||
ViewSize,
|
||||
InheritDisposition,
|
||||
AllocationType,
|
||||
Protect));
|
||||
}
|
||||
|
||||
NTSTATUS ZwMapViewOfSection(HANDLE SectionHandle,
|
||||
|
@ -68,11 +205,146 @@ NTSTATUS ZwMapViewOfSection(HANDLE SectionHandle,
|
|||
SECTION_INHERIT InheritDisposition,
|
||||
ULONG AllocationType,
|
||||
ULONG Protect)
|
||||
/*
|
||||
* FUNCTION: Maps a view of a section into the virtual address space of a
|
||||
* process
|
||||
* ARGUMENTS:
|
||||
* SectionHandle = Handle of the section
|
||||
* ProcessHandle = Handle of the process
|
||||
* BaseAddress = Desired base address (or NULL) on entry
|
||||
* Actual base address of the view on exit
|
||||
* ZeroBits = Number of high order address bits that must be zero
|
||||
* CommitSize = Size in bytes of the initially committed section of
|
||||
* the view
|
||||
* SectionOffset = Offset in bytes from the beginning of the section
|
||||
* to the beginning of the view
|
||||
* ViewSize = Desired length of map (or zero to map all) on entry
|
||||
* Actual length mapped on exit
|
||||
* InheritDisposition = Specified how the view is to be shared with
|
||||
* child processes
|
||||
* AllocateType = Type of allocation for the pages
|
||||
* Protect = Protection for the committed region of the view
|
||||
* RETURNS: Status
|
||||
*/
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
PSECTION_OBJECT Section;
|
||||
PEPROCESS Process;
|
||||
MEMORY_AREA* Result;
|
||||
NTSTATUS Status;
|
||||
|
||||
DPRINT("ZwMapViewOfSection(SectionHandle %x, ProcessHandle %x)\n",
|
||||
SectionHandle,ProcessHandle);
|
||||
|
||||
Status = ObReferenceObjectByHandle(SectionHandle,
|
||||
SECTION_MAP_READ,
|
||||
MmSectionType,
|
||||
UserMode,
|
||||
(PVOID*)&Section,
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
DPRINT("%s() = %x\n",Status);
|
||||
return(Status);
|
||||
}
|
||||
|
||||
Status = ObReferenceObjectByHandle(ProcessHandle,
|
||||
PROCESS_VM_OPERATION,
|
||||
PsProcessType,
|
||||
UserMode,
|
||||
(PVOID*)&Process,
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
if ((*ViewSize) > Section->MaximumSize.LowPart)
|
||||
{
|
||||
(*ViewSize) = Section->MaximumSize.LowPart;
|
||||
}
|
||||
|
||||
MmCreateMemoryArea(UserMode,
|
||||
Process,
|
||||
MEMORY_AREA_SECTION_VIEW_COMMIT,
|
||||
BaseAddress,
|
||||
*ViewSize,
|
||||
Protect,
|
||||
&Result);
|
||||
Result->Data.SectionData.Section = Section;
|
||||
Result->Data.SectionData.ViewOffset = SectionOffset->LowPart;
|
||||
|
||||
DPRINT("*BaseAddress %x\n",*BaseAddress);
|
||||
DPRINT("Result->Data.SectionData.Section->FileObject %x\n",
|
||||
Result->Data.SectionData.Section->FileObject);
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS NtUnmapViewOfSection(HANDLE ProcessHandle, PVOID BaseAddress)
|
||||
{
|
||||
return(ZwUnmapViewOfSection(ProcessHandle,BaseAddress));
|
||||
}
|
||||
|
||||
NTSTATUS ZwUnmapViewOfSection(HANDLE ProcessHandle, PVOID BaseAddress)
|
||||
{
|
||||
PEPROCESS Process;
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = ObReferenceObjectByHandle(ProcessHandle,
|
||||
PROCESS_VM_OPERATION,
|
||||
PsProcessType,
|
||||
UserMode,
|
||||
(PVOID*)&Process,
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
return(MmFreeMemoryArea(Process,BaseAddress,0,TRUE));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtQuerySection(IN HANDLE SectionHandle,
|
||||
IN CINT SectionInformationClass,
|
||||
OUT PVOID SectionInformation,
|
||||
IN ULONG Length,
|
||||
OUT PULONG ResultLength)
|
||||
{
|
||||
return(ZwQuerySection(SectionHandle,
|
||||
SectionInformationClass,
|
||||
SectionInformation,
|
||||
Length,
|
||||
ResultLength));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwQuerySection(IN HANDLE SectionHandle,
|
||||
IN CINT SectionInformationClass,
|
||||
OUT PVOID SectionInformation,
|
||||
IN ULONG Length,
|
||||
OUT PULONG ResultLength)
|
||||
/*
|
||||
* FUNCTION: Queries the information of a section object.
|
||||
* ARGUMENTS:
|
||||
* SectionHandle = Handle to the section link object
|
||||
* SectionInformationClass = Index to a certain information structure
|
||||
* SectionInformation (OUT)= Caller supplies storage for resulting
|
||||
* information
|
||||
* Length = Size of the supplied storage
|
||||
* ResultLength = Data written
|
||||
* RETURNS: Status
|
||||
*
|
||||
*/
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtExtendSection(IN HANDLE SectionHandle,
|
||||
IN ULONG NewMaximumSize)
|
||||
{
|
||||
return(ZwExtendSection(SectionHandle,NewMaximumSize));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwExtendSection(IN HANDLE SectionHandle,
|
||||
IN ULONG NewMaximumSize)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ PVOID MmAllocateSection(ULONG Length)
|
|||
|
||||
Result = 0;
|
||||
Status = MmCreateMemoryArea(KernelMode,
|
||||
PsGetCurrentProcess(),
|
||||
MEMORY_AREA_SYSTEM,
|
||||
&Result,
|
||||
Length,
|
||||
|
@ -71,6 +72,7 @@ PVOID MmMapIoSpace(PHYSICAL_ADDRESS PhysicalAddress,
|
|||
|
||||
Result=0;
|
||||
Status = MmCreateMemoryArea(KernelMode,
|
||||
PsGetCurrentProcess(),
|
||||
MEMORY_AREA_IO_MAPPING,
|
||||
&Result,
|
||||
NumberOfBytes,
|
||||
|
@ -94,7 +96,8 @@ PVOID MmMapIoSpace(PHYSICAL_ADDRESS PhysicalAddress,
|
|||
|
||||
VOID MmUnmapIoSpace(PVOID BaseAddress, ULONG NumberOfBytes)
|
||||
{
|
||||
(void)MmFreeMemoryArea(BaseAddress,NumberOfBytes,FALSE);
|
||||
(void)MmFreeMemoryArea(PsGetCurrentProcess(),BaseAddress,NumberOfBytes,
|
||||
FALSE);
|
||||
}
|
||||
|
||||
PVOID MmAllocateNonCachedMemory(ULONG NumberOfBytes)
|
||||
|
@ -106,6 +109,7 @@ PVOID MmAllocateNonCachedMemory(ULONG NumberOfBytes)
|
|||
|
||||
Result=0;
|
||||
Status = MmCreateMemoryArea(KernelMode,
|
||||
PsGetCurrentProcess(),
|
||||
MEMORY_AREA_NO_CACHE,
|
||||
&Result,
|
||||
NumberOfBytes,
|
||||
|
@ -126,5 +130,5 @@ PVOID MmAllocateNonCachedMemory(ULONG NumberOfBytes)
|
|||
|
||||
VOID MmFreeNonCachedMemory(PVOID BaseAddress, ULONG NumberOfBytes)
|
||||
{
|
||||
MmFreeMemoryArea(BaseAddress,NumberOfBytes,TRUE);
|
||||
MmFreeMemoryArea(PsGetCurrentProcess(),BaseAddress,NumberOfBytes,TRUE);
|
||||
}
|
||||
|
|
|
@ -7,15 +7,19 @@
|
|||
* UPDATE HISTORY:
|
||||
* 09/4/98: Created
|
||||
* 10/6/98: Corrections from Fatahi (i_fatahi@hotmail.com)
|
||||
* 30/9/98: Implemented ZwxxxVirtualMemory functions
|
||||
*/
|
||||
|
||||
/* INCLUDE *****************************************************************/
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include <internal/hal/segment.h>
|
||||
#include <internal/i386/segment.h>
|
||||
#include <internal/mm.h>
|
||||
#include <internal/hal/page.h>
|
||||
#include <internal/mmhal.h>
|
||||
#include <internal/ob.h>
|
||||
#include <internal/io.h>
|
||||
#include <internal/ps.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
@ -25,10 +29,6 @@
|
|||
extern unsigned int etext;
|
||||
extern unsigned int end;
|
||||
|
||||
/*
|
||||
* These two are statically declared because mm is initalized before the
|
||||
* memory pool
|
||||
*/
|
||||
static MEMORY_AREA* kernel_text_desc = NULL;
|
||||
static MEMORY_AREA* kernel_data_desc = NULL;
|
||||
static MEMORY_AREA* kernel_param_desc = NULL;
|
||||
|
@ -45,7 +45,7 @@ void VirtualInit(boot_param* bp)
|
|||
*/
|
||||
{
|
||||
unsigned int kernel_len = bp->end_mem - bp->start_mem;
|
||||
ULONG BaseAddress;
|
||||
PVOID BaseAddress;
|
||||
ULONG Length;
|
||||
ULONG ParamLength = kernel_len;
|
||||
|
||||
|
@ -58,17 +58,18 @@ void VirtualInit(boot_param* bp)
|
|||
/*
|
||||
* Setup the system area descriptor list
|
||||
*/
|
||||
BaseAddress = KERNEL_BASE;
|
||||
BaseAddress = (PVOID)KERNEL_BASE;
|
||||
Length = PAGE_ROUND_UP(((ULONG)&etext)) - KERNEL_BASE;
|
||||
ParamLength = ParamLength - Length;
|
||||
MmCreateMemoryArea(KernelMode,MEMORY_AREA_SYSTEM,&BaseAddress,
|
||||
MmCreateMemoryArea(KernelMode,NULL,MEMORY_AREA_SYSTEM,&BaseAddress,
|
||||
Length,0,&kernel_text_desc);
|
||||
|
||||
Length = PAGE_ROUND_UP(((ULONG)&end)) - PAGE_ROUND_UP(((ULONG)&etext));
|
||||
ParamLength = ParamLength - Length;
|
||||
DPRINT("Length %x\n",Length);
|
||||
BaseAddress = PAGE_ROUND_UP(((ULONG)&etext));
|
||||
BaseAddress = (PVOID)PAGE_ROUND_UP(((ULONG)&etext));
|
||||
MmCreateMemoryArea(KernelMode,
|
||||
NULL,
|
||||
MEMORY_AREA_SYSTEM,
|
||||
&BaseAddress,
|
||||
Length,
|
||||
|
@ -76,37 +77,61 @@ void VirtualInit(boot_param* bp)
|
|||
&kernel_data_desc);
|
||||
|
||||
|
||||
BaseAddress = PAGE_ROUND_UP(((ULONG)&end));
|
||||
BaseAddress = (PVOID)PAGE_ROUND_UP(((ULONG)&end));
|
||||
Length = ParamLength;
|
||||
MmCreateMemoryArea(KernelMode,MEMORY_AREA_SYSTEM,&BaseAddress,
|
||||
MmCreateMemoryArea(KernelMode,NULL,MEMORY_AREA_SYSTEM,&BaseAddress,
|
||||
Length,0,&kernel_param_desc);
|
||||
|
||||
BaseAddress = KERNEL_BASE+ PAGE_ROUND_UP(kernel_len) + PAGESIZE;
|
||||
BaseAddress = (PVOID)(KERNEL_BASE + PAGE_ROUND_UP(kernel_len) + PAGESIZE);
|
||||
Length = NONPAGED_POOL_SIZE;
|
||||
MmCreateMemoryArea(KernelMode,MEMORY_AREA_SYSTEM,&BaseAddress,
|
||||
MmCreateMemoryArea(KernelMode,NULL,MEMORY_AREA_SYSTEM,&BaseAddress,
|
||||
Length,0,&kernel_pool_desc);
|
||||
|
||||
MmDumpMemoryAreas();
|
||||
// MmDumpMemoryAreas();
|
||||
CHECKPOINT;
|
||||
|
||||
MmInitSectionImplementation();
|
||||
}
|
||||
|
||||
NTSTATUS MmSectionHandleFault(MEMORY_AREA* MemoryArea, ULONG Address)
|
||||
ULONG MmCommitedSectionHandleFault(MEMORY_AREA* MemoryArea, ULONG Address)
|
||||
{
|
||||
set_page(Address,0x7,get_free_page());
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
NTSTATUS MmSectionHandleFault(MEMORY_AREA* MemoryArea, PVOID Address)
|
||||
{
|
||||
LARGE_INTEGER Offset;
|
||||
IO_STATUS_BLOCK IoStatus;
|
||||
|
||||
DPRINT("MmSectionHandleFault(MemoryArea %x, Address %x)\n",
|
||||
MemoryArea,Address);
|
||||
|
||||
set_page(Address,0x7,get_free_page());
|
||||
|
||||
Offset.LowPart = (Address - MemoryArea->BaseAddress) +
|
||||
MemoryArea->Data.SectionData.ViewOffset;
|
||||
|
||||
DPRINT("MemoryArea->Data.SectionData.Section->FileObject %x\n",
|
||||
MemoryArea->Data.SectionData.Section->FileObject);
|
||||
|
||||
if (MemoryArea->Data.SectionData.Section->FileObject == NULL)
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
IoPageRead(MemoryArea->Data.SectionData.Section->FileObject,
|
||||
(PVOID)Address,
|
||||
&Offset,
|
||||
&IoStatus);
|
||||
|
||||
DPRINT("Returning from MmSectionHandleFault()\n");
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
asmlinkage int page_fault_handler(unsigned int edi,
|
||||
unsigned int esi, unsigned int ebp,
|
||||
unsigned int esp, unsigned int ebx,
|
||||
unsigned int edx, unsigned int ecx,
|
||||
unsigned int eax,
|
||||
unsigned int type,
|
||||
unsigned int ds,
|
||||
unsigned short int error_code,
|
||||
unsigned int eip,
|
||||
unsigned int cs, unsigned int eflags,
|
||||
unsigned int esp0, unsigned int ss0)
|
||||
asmlinkage int page_fault_handler(unsigned int cs,
|
||||
unsigned int eip)
|
||||
/*
|
||||
* FUNCTION: Handle a page fault
|
||||
*/
|
||||
|
@ -121,15 +146,15 @@ asmlinkage int page_fault_handler(unsigned int edi,
|
|||
*/
|
||||
unsigned int cr2;
|
||||
__asm__("movl %%cr2,%0\n\t" : "=d" (cr2));
|
||||
DbgPrint("Page fault at address %x with eip %x\n",cr2,eip);
|
||||
DPRINT("Page fault at address %x with eip %x\n",cr2,eip);
|
||||
|
||||
cr2 = PAGE_ROUND_DOWN(cr2);
|
||||
|
||||
if (KeGetCurrentIrql()!=PASSIVE_LEVEL)
|
||||
{
|
||||
DbgPrint("Recursive page fault detected\n");
|
||||
KeBugCheck(0);
|
||||
for(;;);
|
||||
return(0);
|
||||
// KeBugCheck(0);
|
||||
}
|
||||
|
||||
KeRaiseIrql(DISPATCH_LEVEL,&oldlvl);
|
||||
|
@ -154,7 +179,7 @@ asmlinkage int page_fault_handler(unsigned int edi,
|
|||
FaultMode = KernelMode;
|
||||
}
|
||||
|
||||
MemoryArea = MmOpenMemoryAreaByAddress(cr2);
|
||||
MemoryArea = MmOpenMemoryAreaByAddress(PsGetCurrentProcess(),(PVOID)cr2);
|
||||
if (MemoryArea==NULL)
|
||||
{
|
||||
printk("%s:%d\n",__FILE__,__LINE__);
|
||||
|
@ -167,8 +192,20 @@ asmlinkage int page_fault_handler(unsigned int edi,
|
|||
stat = 0;
|
||||
break;
|
||||
|
||||
case MEMORY_AREA_SECTION_VIEW:
|
||||
stat = MmSectionHandleFault(MemoryArea,cr2);
|
||||
case MEMORY_AREA_SECTION_VIEW_COMMIT:
|
||||
if (MmSectionHandleFault(MemoryArea,cr2)==STATUS_SUCCESS)
|
||||
{
|
||||
stat=1;
|
||||
}
|
||||
else
|
||||
{
|
||||
stat = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case MEMORY_AREA_COMMIT:
|
||||
stat = MmCommitedSectionHandleFault(MemoryArea,cr2);
|
||||
break;
|
||||
|
||||
default:
|
||||
stat = 0;
|
||||
|
@ -181,7 +218,6 @@ asmlinkage int page_fault_handler(unsigned int edi,
|
|||
return(stat);
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN MmIsNonPagedSystemAddressValid(PVOID VirtualAddress)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
|
@ -198,7 +234,503 @@ BOOLEAN MmIsAddressValid(PVOID VirtualAddress)
|
|||
* succeed. Is this realistic for RISC processors which don't
|
||||
* allow byte granular access?
|
||||
*/
|
||||
{
|
||||
MEMORY_AREA* MemoryArea;
|
||||
|
||||
MemoryArea = MmOpenMemoryAreaByAddress(PsGetCurrentProcess(),
|
||||
VirtualAddress);
|
||||
|
||||
if (MemoryArea == NULL)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtAllocateVirtualMemory(IN HANDLE ProcessHandle,
|
||||
OUT PVOID *BaseAddress,
|
||||
IN ULONG ZeroBits,
|
||||
IN ULONG RegionSize,
|
||||
IN ULONG AllocationType,
|
||||
IN ULONG Protect)
|
||||
{
|
||||
return(ZwAllocateVirtualMemory(ProcessHandle,
|
||||
BaseAddress,
|
||||
ZeroBits,
|
||||
RegionSize,
|
||||
AllocationType,
|
||||
Protect));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwAllocateVirtualMemory(IN HANDLE ProcessHandle,
|
||||
OUT PVOID *BaseAddress,
|
||||
IN ULONG ZeroBits,
|
||||
IN ULONG RegionSize,
|
||||
IN ULONG AllocationType,
|
||||
IN ULONG Protect)
|
||||
/*
|
||||
* FUNCTION: Allocates a block of virtual memory in the process address space
|
||||
* ARGUMENTS:
|
||||
* ProcessHandle = The handle of the process which owns the virtual memory
|
||||
* BaseAddress = A pointer to the virtual memory allocated. If you
|
||||
* supply a non zero value the system will try to
|
||||
* allocate the memory at the address supplied. It round
|
||||
* it down to a multiple of the page size.
|
||||
* ZeroBits = (OPTIONAL) You can specify the number of high order bits
|
||||
* that must be zero, ensuring that the memory will be
|
||||
* allocated at a address below a certain value.
|
||||
* RegionSize = The number of bytes to allocate
|
||||
* AllocationType = Indicates the type of virtual memory you like to
|
||||
* allocated, can be one of the values : MEM_COMMIT,
|
||||
* MEM_RESERVE, MEM_RESET, MEM_TOP_DOWN
|
||||
* Protect = Indicates the protection type of the pages allocated, can be
|
||||
* a combination of PAGE_READONLY, PAGE_READWRITE,
|
||||
* PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_GUARD,
|
||||
* PAGE_NOACCESS
|
||||
* REMARKS:
|
||||
* This function maps to the win32 VirtualAllocEx. Virtual memory is
|
||||
* process based so the protocol starts with a ProcessHandle. I
|
||||
* splitted the functionality of obtaining the actual address and
|
||||
* specifying the start address in two parameters ( BaseAddress and
|
||||
* StartAddress ) The NumberOfBytesAllocated specify the range and the
|
||||
* AllocationType and ProctectionType map to the other two parameters.
|
||||
* RETURNS: Status
|
||||
*/
|
||||
{
|
||||
PEPROCESS Process;
|
||||
MEMORY_AREA* MemoryArea;
|
||||
ULONG Type;
|
||||
ULONG i;
|
||||
NTSTATUS Status;
|
||||
|
||||
DbgPrint("ZwAllocateVirtualMemory(ProcessHandle %x, *BaseAddress %x, "
|
||||
"ZeroBits %d, RegionSize %d, AllocationType %x, Protect %x)\n",
|
||||
ProcessHandle,*BaseAddress,ZeroBits,RegionSize,AllocationType,
|
||||
Protect);
|
||||
|
||||
Status = ObReferenceObjectByHandle(ProcessHandle,
|
||||
PROCESS_VM_OPERATION,
|
||||
NULL,
|
||||
UserMode,
|
||||
(PVOID*)(&Process),
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
DbgPrint("ZwAllocateVirtualMemory() = %x\n",Status);
|
||||
return(Status);
|
||||
}
|
||||
|
||||
if (AllocationType & MEM_RESERVE)
|
||||
{
|
||||
Type = MEMORY_AREA_RESERVE;
|
||||
}
|
||||
else
|
||||
{
|
||||
Type = MEMORY_AREA_COMMIT;
|
||||
}
|
||||
|
||||
if ((*BaseAddress) != 0)
|
||||
{
|
||||
MemoryArea = MmOpenMemoryAreaByAddress(Process, *BaseAddress);
|
||||
|
||||
if (MemoryArea != NULL)
|
||||
{
|
||||
if (MemoryArea->BaseAddress == (*BaseAddress) &&
|
||||
MemoryArea->Length == RegionSize)
|
||||
{
|
||||
MemoryArea->Type = Type;
|
||||
MemoryArea->Attributes =Protect;
|
||||
DbgPrint("*BaseAddress %x\n",*BaseAddress);
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
MemoryArea = MmSplitMemoryArea(Process,
|
||||
MemoryArea,
|
||||
*BaseAddress,
|
||||
RegionSize,
|
||||
Type,
|
||||
Protect);
|
||||
DbgPrint("*BaseAddress %x\n",*BaseAddress);
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
}
|
||||
|
||||
Status = MmCreateMemoryArea(UserMode,
|
||||
Process,
|
||||
Type,
|
||||
(PULONG)BaseAddress,
|
||||
RegionSize,
|
||||
Protect,
|
||||
&MemoryArea);
|
||||
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
DbgPrint("ZwAllocateVirtualMemory() = %x\n",Status);
|
||||
return(Status);
|
||||
}
|
||||
|
||||
DbgPrint("*BaseAddress %x\n",*BaseAddress);
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtFlushVirtualMemory(IN HANDLE ProcessHandle,
|
||||
IN PVOID BaseAddress,
|
||||
IN ULONG NumberOfBytesToFlush,
|
||||
OUT PULONG NumberOfBytesFlushed OPTIONAL)
|
||||
{
|
||||
return(ZwFlushVirtualMemory(ProcessHandle,
|
||||
BaseAddress,
|
||||
NumberOfBytesToFlush,
|
||||
NumberOfBytesFlushed));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwFlushVirtualMemory(IN HANDLE ProcessHandle,
|
||||
IN PVOID BaseAddress,
|
||||
IN ULONG NumberOfBytesToFlush,
|
||||
OUT PULONG NumberOfBytesFlushed OPTIONAL)
|
||||
|
||||
/*
|
||||
* FUNCTION: Flushes virtual memory to file
|
||||
* ARGUMENTS:
|
||||
* ProcessHandle = Points to the process that allocated the virtual
|
||||
* memory
|
||||
* BaseAddress = Points to the memory address
|
||||
* NumberOfBytesToFlush = Limits the range to flush,
|
||||
* NumberOfBytesFlushed = Actual number of bytes flushed
|
||||
* RETURNS: Status
|
||||
*/
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtFreeVirtualMemory(IN HANDLE ProcessHandle,
|
||||
IN PVOID *BaseAddress,
|
||||
IN ULONG RegionSize,
|
||||
IN ULONG FreeType)
|
||||
{
|
||||
return(ZwFreeVirtualMemory(ProcessHandle,
|
||||
BaseAddress,
|
||||
RegionSize,
|
||||
FreeType));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwFreeVirtualMemory(IN HANDLE ProcessHandle,
|
||||
IN PVOID *BaseAddress,
|
||||
IN ULONG RegionSize,
|
||||
IN ULONG FreeType)
|
||||
|
||||
/*
|
||||
* FUNCTION: Frees a range of virtual memory
|
||||
* ARGUMENTS:
|
||||
* ProcessHandle = Points to the process that allocated the virtual
|
||||
* memory
|
||||
* BaseAddress = Points to the memory address, rounded down to a
|
||||
* multiple of the pagesize
|
||||
* RegionSize = Limits the range to free, rounded up to a multiple of
|
||||
* the paging size
|
||||
* FreeType = Can be one of the values: MEM_DECOMMIT, or MEM_RELEASE
|
||||
* RETURNS: Status
|
||||
*/
|
||||
{
|
||||
MEMORY_AREA* MemoryArea;
|
||||
NTSTATUS Status;
|
||||
PEPROCESS Process;
|
||||
|
||||
Status = ObReferenceObjectByHandle(ProcessHandle,
|
||||
PROCESS_VM_OPERATION,
|
||||
PsProcessType,
|
||||
UserMode,
|
||||
(PVOID*)(&Process),
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
DbgPrint("ZwFreeVirtualMemory() = %x\n",Status);
|
||||
return(Status);
|
||||
}
|
||||
|
||||
MemoryArea = MmOpenMemoryAreaByAddress(Process,*BaseAddress);
|
||||
if (MemoryArea == NULL)
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
if (FreeType == MEM_RELEASE)
|
||||
{
|
||||
if (MemoryArea->BaseAddress != (*BaseAddress))
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
MmFreeMemoryArea(PsGetCurrentProcess(),
|
||||
BaseAddress,
|
||||
0,
|
||||
TRUE);
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtLockVirtualMemory(HANDLE ProcessHandle,
|
||||
PVOID BaseAddress,
|
||||
ULONG NumberOfBytesToLock,
|
||||
PULONG NumberOfBytesLocked)
|
||||
{
|
||||
return(ZwLockVirtualMemory(ProcessHandle,
|
||||
BaseAddress,
|
||||
NumberOfBytesToLock,
|
||||
NumberOfBytesLocked));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwLockVirtualMemory(HANDLE ProcessHandle,
|
||||
PVOID BaseAddress,
|
||||
ULONG NumberOfBytesToLock,
|
||||
PULONG NumberOfBytesLocked)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtProtectVirtualMemory(IN HANDLE ProcessHandle,
|
||||
IN PVOID BaseAddress,
|
||||
IN ULONG NumberOfBytesToProtect,
|
||||
IN ULONG NewAccessProtection,
|
||||
OUT PULONG OldAccessProtection)
|
||||
{
|
||||
return(ZwProtectVirtualMemory(ProcessHandle,
|
||||
BaseAddress,
|
||||
NumberOfBytesToProtect,
|
||||
NewAccessProtection,
|
||||
OldAccessProtection));
|
||||
}
|
||||
|
||||
VOID MmChangeAreaProtection(PEPROCESS Process,
|
||||
PVOID BaseAddress,
|
||||
ULONG Length,
|
||||
ULONG Protect)
|
||||
{
|
||||
ULONG i;
|
||||
|
||||
for (i=0; i<(Length/PAGESIZE); i++)
|
||||
{
|
||||
if (MmIsPagePresent(Process, BaseAddress + (i*PAGESIZE)))
|
||||
{
|
||||
MmSetPageProtect(Process, BaseAddress + (i*PAGESIZE), Protect);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwProtectVirtualMemory(IN HANDLE ProcessHandle,
|
||||
IN PVOID BaseAddress,
|
||||
IN ULONG NumberOfBytesToProtect,
|
||||
IN ULONG NewAccessProtection,
|
||||
OUT PULONG OldAccessProtection)
|
||||
{
|
||||
PMEMORY_AREA MemoryArea;
|
||||
PEPROCESS Process;
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = ObReferenceObjectByHandle(ProcessHandle,
|
||||
PROCESS_VM_OPERATION,
|
||||
PsProcessType,
|
||||
UserMode,
|
||||
(PVOID*)(&Process),
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
DbgPrint("ZwProtectVirtualMemory() = %x\n",Status);
|
||||
return(Status);
|
||||
}
|
||||
|
||||
MemoryArea = MmOpenMemoryAreaByAddress(Process,BaseAddress);
|
||||
if (MemoryArea == NULL)
|
||||
{
|
||||
DbgPrint("ZwProtectVirtualMemory() = %x\n",STATUS_UNSUCCESSFUL);
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
*OldAccessProtection = MemoryArea->Attributes;
|
||||
|
||||
if (MemoryArea->BaseAddress == BaseAddress &&
|
||||
MemoryArea->Length == NumberOfBytesToProtect)
|
||||
{
|
||||
MemoryArea->Attributes = NewAccessProtection;
|
||||
}
|
||||
else
|
||||
{
|
||||
MemoryArea = MmSplitMemoryArea(Process,
|
||||
MemoryArea,
|
||||
BaseAddress,
|
||||
NumberOfBytesToProtect,
|
||||
MemoryArea->Type,
|
||||
NewAccessProtection);
|
||||
}
|
||||
MmChangeAreaProtection(Process,BaseAddress,NumberOfBytesToProtect,
|
||||
NewAccessProtection);
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS STDCALL NtQueryVirtualMemory(IN HANDLE ProcessHandle,
|
||||
IN PVOID Address,
|
||||
IN IN CINT VirtualMemoryInformationClass,
|
||||
OUT PVOID VirtualMemoryInformation,
|
||||
IN ULONG Length,
|
||||
OUT PULONG ResultLength)
|
||||
{
|
||||
return(ZwQueryVirtualMemory(ProcessHandle,
|
||||
Address,
|
||||
VirtualMemoryInformationClass,
|
||||
VirtualMemoryInformation,
|
||||
Length,
|
||||
ResultLength));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwQueryVirtualMemory(IN HANDLE ProcessHandle,
|
||||
IN PVOID Address,
|
||||
IN CINT VirtualMemoryInformationClass,
|
||||
OUT PVOID VirtualMemoryInformation,
|
||||
IN ULONG Length,
|
||||
OUT PULONG ResultLength)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtReadVirtualMemory(IN HANDLE ProcessHandle,
|
||||
IN PVOID BaseAddress,
|
||||
OUT PVOID Buffer,
|
||||
IN ULONG NumberOfBytesToRead,
|
||||
OUT PULONG NumberOfBytesRead)
|
||||
{
|
||||
return(ZwReadVirtualMemory(ProcessHandle,
|
||||
BaseAddress,
|
||||
Buffer,
|
||||
NumberOfBytesToRead,
|
||||
NumberOfBytesRead));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwReadVirtualMemory(IN HANDLE ProcessHandle,
|
||||
IN PVOID BaseAddress,
|
||||
OUT PVOID Buffer,
|
||||
IN ULONG NumberOfBytesToRead,
|
||||
OUT PULONG NumberOfBytesRead)
|
||||
{
|
||||
PEPROCESS Process;
|
||||
MEMORY_AREA* MemoryArea;
|
||||
ULONG i;
|
||||
NTSTATUS Status;
|
||||
PULONG CurrentEntry;
|
||||
|
||||
Status = ObReferenceObjectByHandle(ProcessHandle,
|
||||
PROCESS_VM_READ,
|
||||
NULL,
|
||||
UserMode,
|
||||
(PVOID*)(&Process),
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
MemoryArea = MmOpenMemoryAreaByAddress(Process,BaseAddress);
|
||||
|
||||
if (MemoryArea == NULL)
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
if (MemoryArea->Length > NumberOfBytesToRead)
|
||||
{
|
||||
NumberOfBytesToRead = MemoryArea->Length;
|
||||
}
|
||||
|
||||
*NumberOfBytesRead = NumberOfBytesToRead;
|
||||
|
||||
for (i=0; i<(NumberOfBytesToRead/PAGESIZE); i++)
|
||||
{
|
||||
CurrentEntry = MmGetPageEntry(Process, BaseAddress + (i*PAGESIZE));
|
||||
RtlCopyMemory(Buffer + (i*PAGESIZE),
|
||||
(PVOID)physical_to_linear(PAGE_MASK(*CurrentEntry)),
|
||||
PAGESIZE);
|
||||
|
||||
}
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtUnlockVirtualMemory(HANDLE ProcessHandle,
|
||||
PVOID BaseAddress,
|
||||
ULONG NumberOfBytesToUnlock,
|
||||
PULONG NumberOfBytesUnlocked OPTIONAL)
|
||||
{
|
||||
return(ZwUnlockVirtualMemory(ProcessHandle,
|
||||
BaseAddress,
|
||||
NumberOfBytesToUnlock,
|
||||
NumberOfBytesUnlocked));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwUnlockVirtualMemory(HANDLE ProcessHandle,
|
||||
PVOID BaseAddress,
|
||||
ULONG NumberOfBytesToUnlock,
|
||||
PULONG NumberOfBytesUnlocked OPTIONAL)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtWriteVirtualMemory(IN HANDLE ProcessHandle,
|
||||
IN PVOID BaseAddress,
|
||||
IN PVOID Buffer,
|
||||
IN ULONG NumberOfBytesToWrite,
|
||||
OUT PULONG NumberOfBytesWritten)
|
||||
{
|
||||
return(ZwWriteVirtualMemory(ProcessHandle,
|
||||
BaseAddress,
|
||||
Buffer,
|
||||
NumberOfBytesToWrite,
|
||||
NumberOfBytesWritten));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwWriteVirtualMemory(IN HANDLE ProcessHandle,
|
||||
IN PVOID BaseAddress,
|
||||
IN PVOID Buffer,
|
||||
IN ULONG NumberOfBytesToWrite,
|
||||
OUT PULONG NumberOfBytesWritten)
|
||||
{
|
||||
PEPROCESS Process;
|
||||
MEMORY_AREA* MemoryArea;
|
||||
ULONG i;
|
||||
NTSTATUS Status;
|
||||
PULONG CurrentEntry;
|
||||
|
||||
Status = ObReferenceObjectByHandle(ProcessHandle,
|
||||
PROCESS_VM_WRITE,
|
||||
NULL,
|
||||
UserMode,
|
||||
(PVOID*)(&Process),
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
MemoryArea = MmOpenMemoryAreaByAddress(Process,BaseAddress);
|
||||
|
||||
if (MemoryArea == NULL)
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
if (MemoryArea->Length > NumberOfBytesToWrite)
|
||||
{
|
||||
NumberOfBytesToWrite = MemoryArea->Length;
|
||||
}
|
||||
|
||||
*NumberOfBytesWritten = NumberOfBytesToWrite;
|
||||
|
||||
for (i=0; i<(NumberOfBytesToWrite/PAGESIZE); i++)
|
||||
{
|
||||
CurrentEntry = MmGetPageEntry(Process, BaseAddress + (i*PAGESIZE));
|
||||
RtlCopyMemory((PVOID)physical_to_linear(PAGE_MASK(*CurrentEntry)),
|
||||
Buffer + (i*PAGESIZE),
|
||||
PAGESIZE);
|
||||
|
||||
}
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
|
|
@ -20,14 +20,6 @@
|
|||
|
||||
/* TYPES *******************************************************************/
|
||||
|
||||
/*
|
||||
* PURPOSE: Defines a handle
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
PVOID obj;
|
||||
} HANDLE_REP, *PHANDLE_REP;
|
||||
|
||||
#define HANDLE_BLOCK_ENTRIES ((PAGESIZE-sizeof(LIST_ENTRY))/sizeof(HANDLE_REP))
|
||||
|
||||
/*
|
||||
|
@ -39,37 +31,116 @@ typedef struct
|
|||
HANDLE_REP handles[HANDLE_BLOCK_ENTRIES];
|
||||
} HANDLE_BLOCK;
|
||||
|
||||
/* GLOBALS *****************************************************************/
|
||||
|
||||
/*
|
||||
* PURPOSE: Head of the list of handle blocks
|
||||
*/
|
||||
LIST_ENTRY handle_list_head = {NULL,NULL};
|
||||
KSPIN_LOCK handle_list_lock = {0};
|
||||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
||||
VOID ObjDestroyHandleTable(VOID)
|
||||
|
||||
NTSTATUS STDCALL NtDuplicateObject(IN HANDLE SourceProcessHandle,
|
||||
IN PHANDLE SourceHandle,
|
||||
IN HANDLE TargetProcessHandle,
|
||||
OUT PHANDLE TargetHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN BOOLEAN InheritHandle,
|
||||
ULONG Options)
|
||||
{
|
||||
return(ZwDuplicateObject(SourceProcessHandle,
|
||||
SourceHandle,
|
||||
TargetProcessHandle,
|
||||
TargetHandle,
|
||||
DesiredAccess,
|
||||
InheritHandle,
|
||||
Options));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwDuplicateObject(IN HANDLE SourceProcessHandle,
|
||||
IN PHANDLE SourceHandle,
|
||||
IN HANDLE TargetProcessHandle,
|
||||
OUT PHANDLE TargetHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN BOOLEAN InheritHandle,
|
||||
ULONG Options)
|
||||
/*
|
||||
* FUNCTION: Copies a handle from one process space to another
|
||||
* ARGUMENTS:
|
||||
* SourceProcessHandle = The source process owning the handle. The
|
||||
* source process should have opened
|
||||
* the SourceHandle with PROCESS_DUP_HANDLE
|
||||
* access.
|
||||
* SourceHandle = The handle to the object.
|
||||
* TargetProcessHandle = The destination process owning the handle
|
||||
* TargetHandle (OUT) = Caller should supply storage for the
|
||||
* duplicated handle.
|
||||
* DesiredAccess = The desired access to the handle.
|
||||
* InheritHandle = Indicates wheter the new handle will be inheritable
|
||||
* or not.
|
||||
* Options = Specifies special actions upon duplicating the handle.
|
||||
* Can be one of the values DUPLICATE_CLOSE_SOURCE |
|
||||
* DUPLICATE_SAME_ACCESS. DUPLICATE_CLOSE_SOURCE specifies
|
||||
* that the source handle should be closed after duplicating.
|
||||
* DUPLICATE_SAME_ACCESS specifies to ignore the
|
||||
* DesiredAccess paramter and just grant the same access to
|
||||
* the new handle.
|
||||
* RETURNS: Status
|
||||
* REMARKS: This function maps to the win32 DuplicateHandle.
|
||||
*/
|
||||
{
|
||||
PEPROCESS SourceProcess;
|
||||
PEPROCESS TargetProcess;
|
||||
PHANDLE_REP SourceHandleRep;
|
||||
|
||||
ObReferenceObjectByHandle(SourceProcessHandle,
|
||||
PROCESS_DUP_HANDLE,
|
||||
NULL,
|
||||
UserMode,
|
||||
(PVOID*)&SourceProcess,
|
||||
NULL);
|
||||
ObReferenceObjectByHandle(TargetProcessHandle,
|
||||
PROCESS_DUP_HANDLE,
|
||||
NULL,
|
||||
UserMode,
|
||||
(PVOID*)&TargetProcess,
|
||||
NULL);
|
||||
|
||||
SourceHandleRep = ObTranslateHandle(&SourceProcess->Pcb,*SourceHandle);
|
||||
|
||||
if (Options & DUPLICATE_SAME_ACCESS)
|
||||
{
|
||||
DesiredAccess = SourceHandleRep->GrantedAccess;
|
||||
}
|
||||
|
||||
*TargetHandle = ObInsertHandle(&TargetProcess,SourceHandleRep->ObjectBody,
|
||||
DesiredAccess,InheritHandle);
|
||||
|
||||
if (Options & DUPLICATE_CLOSE_SOURCE)
|
||||
{
|
||||
ZwClose(*SourceHandle);
|
||||
}
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
VOID ObDestroyHandleTable(PKPROCESS Process)
|
||||
/*
|
||||
* FUNCTION: Destroys the current process's handle table
|
||||
* NOTE: No references to handles in the table should be made during this
|
||||
* operation
|
||||
*/
|
||||
{
|
||||
PLIST_ENTRY current=ExInterlockedRemoveHeadList(&handle_list_head,
|
||||
&handle_list_lock);
|
||||
PLIST_ENTRY current=NULL;
|
||||
unsigned int i;
|
||||
|
||||
current = ExInterlockedRemoveHeadList(&(Process->HandleTable.ListHead),
|
||||
&(Process->HandleTable.ListLock));
|
||||
|
||||
while (current!=NULL)
|
||||
{
|
||||
HANDLE_BLOCK* blk = (HANDLE_BLOCK *)current;
|
||||
HANDLE_BLOCK* blk = CONTAINING_RECORD(current,HANDLE_BLOCK,entry);
|
||||
|
||||
/*
|
||||
* Deference every handle in block
|
||||
*/
|
||||
for (i=0;i<HANDLE_BLOCK_ENTRIES;i++)
|
||||
{
|
||||
ObDereferenceObject(blk->handles[i].obj);
|
||||
ObDereferenceObject(blk->handles[i].ObjectBody);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -77,70 +148,75 @@ VOID ObjDestroyHandleTable(VOID)
|
|||
*/
|
||||
ExFreePool(blk);
|
||||
|
||||
current = ExInterlockedRemoveHeadList(&handle_list_head,
|
||||
&handle_list_lock);
|
||||
current = ExInterlockedRemoveHeadList(&(Process->HandleTable.ListHead),
|
||||
&(Process->HandleTable.ListLock));
|
||||
}
|
||||
}
|
||||
|
||||
VOID ObjInitializeHandleTable(HANDLE parent)
|
||||
VOID ObInitializeHandleTable(PKPROCESS Parent, BOOLEAN Inherit,
|
||||
PKPROCESS Process)
|
||||
/*
|
||||
* FUNCTION: Initializes a handle table for the current process
|
||||
* FUNCTION: Initializes a handle table
|
||||
* ARGUMENTS:
|
||||
* parent = Parent process (or NULL if this is the first process)
|
||||
* Inherit = True if the process should inherit its parents objects
|
||||
* Process = Process whose handle table is to be initialized
|
||||
*/
|
||||
{
|
||||
DPRINT("ObjInitializeHandleTable(parent %x)\n",parent);
|
||||
DPRINT("ObInitializeHandleTable(parent %x, Inherit %d, Process %x)\n",
|
||||
Parent,Inherit,Process);
|
||||
|
||||
InitializeListHead(&handle_list_head);
|
||||
KeInitializeSpinLock(&handle_list_lock);
|
||||
InitializeListHead(&(Process->HandleTable.ListHead));
|
||||
KeInitializeSpinLock(&(Process->HandleTable.ListLock));
|
||||
}
|
||||
|
||||
static PHANDLE_REP ObTranslateHandle(HANDLE* h)
|
||||
PHANDLE_REP ObTranslateHandle(PKPROCESS Process, HANDLE h)
|
||||
/*
|
||||
* FUNCTION: Get the data structure for a handle
|
||||
* ARGUMENTS:
|
||||
* Process = Process to get the handle for
|
||||
* h = Handle
|
||||
* ARGUMENTS: A pointer to the information about the handle on success,
|
||||
* NULL on failure
|
||||
*/
|
||||
{
|
||||
PLIST_ENTRY current = handle_list_head.Flink;
|
||||
PLIST_ENTRY current;
|
||||
unsigned int handle = ((unsigned int)h) - 1;
|
||||
unsigned int count=handle/HANDLE_BLOCK_ENTRIES;
|
||||
HANDLE_BLOCK* blk = NULL;
|
||||
unsigned int i;
|
||||
|
||||
DPRINT("ObTranslateHandle(Process %x, h %x)\n",Process,h);
|
||||
|
||||
current = Process->HandleTable.ListHead.Flink;
|
||||
DPRINT("current %x\n",current);
|
||||
|
||||
for (i=0;i<count;i++)
|
||||
{
|
||||
current = current->Flink;
|
||||
if (current==(&handle_list_head))
|
||||
if (current==(&(Process->HandleTable.ListHead)))
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
blk = (HANDLE_BLOCK *)current;
|
||||
blk = CONTAINING_RECORD(current,HANDLE_BLOCK,entry);
|
||||
return(&(blk->handles[handle%HANDLE_BLOCK_ENTRIES]));
|
||||
}
|
||||
|
||||
PVOID ObGetObjectByHandle(HANDLE h)
|
||||
/*
|
||||
* FUNCTION: Translate a handle to the corresponding object
|
||||
* ARGUMENTS:
|
||||
* h = Handle to translate
|
||||
* RETURNS: The object
|
||||
*/
|
||||
{
|
||||
DPRINT("ObGetObjectByHandle(h %x)\n",h);
|
||||
|
||||
if (h==NULL)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
return(ObTranslateHandle(h)->obj);
|
||||
}
|
||||
|
||||
VOID ObDeleteHandle(HANDLE Handle)
|
||||
{
|
||||
PHANDLE_REP Rep = ObTranslateHandle(Handle);
|
||||
Rep->obj=NULL;
|
||||
PHANDLE_REP Rep;
|
||||
|
||||
DPRINT("ObDeleteHandle(Handle %x)\n",Handle);
|
||||
|
||||
Rep = ObTranslateHandle(KeGetCurrentProcess(),Handle);
|
||||
Rep->ObjectBody=NULL;
|
||||
DPRINT("Finished ObDeleteHandle()\n");
|
||||
}
|
||||
|
||||
HANDLE ObAddHandle(PVOID obj)
|
||||
HANDLE ObInsertHandle(PKPROCESS Process, PVOID ObjectBody,
|
||||
ACCESS_MASK GrantedAccess, BOOLEAN Inherit)
|
||||
/*
|
||||
* FUNCTION: Add a handle referencing an object
|
||||
* ARGUMENTS:
|
||||
|
@ -149,29 +225,33 @@ HANDLE ObAddHandle(PVOID obj)
|
|||
* NOTE: THe handle is valid only in the context of the current process
|
||||
*/
|
||||
{
|
||||
LIST_ENTRY* current = handle_list_head.Flink;
|
||||
LIST_ENTRY* current;
|
||||
unsigned int handle=1;
|
||||
unsigned int i;
|
||||
HANDLE_BLOCK* new_blk = NULL;
|
||||
|
||||
DPRINT("ObAddHandle(obj %x)\n",obj);
|
||||
DPRINT("ObAddHandle(Process %x, obj %x)\n",Process,ObjectBody);
|
||||
|
||||
current = Process->HandleTable.ListHead.Flink;
|
||||
|
||||
/*
|
||||
* Scan through the currently allocated handle blocks looking for a free
|
||||
* slot
|
||||
*/
|
||||
while (current!=(&handle_list_head))
|
||||
while (current!=(&(Process->HandleTable.ListHead)))
|
||||
{
|
||||
HANDLE_BLOCK* blk = (HANDLE_BLOCK *)current;
|
||||
HANDLE_BLOCK* blk = CONTAINING_RECORD(current,HANDLE_BLOCK,entry);
|
||||
|
||||
DPRINT("Current %x\n",current);
|
||||
|
||||
for (i=0;i<HANDLE_BLOCK_ENTRIES;i++)
|
||||
{
|
||||
DPRINT("Considering slot %d containing %x\n",i,blk->handles[i]);
|
||||
if (blk->handles[i].obj==NULL)
|
||||
if (blk->handles[i].ObjectBody==NULL)
|
||||
{
|
||||
blk->handles[i].obj=obj;
|
||||
blk->handles[i].ObjectBody = ObjectBody;
|
||||
blk->handles[i].GrantedAccess = GrantedAccess;
|
||||
blk->handles[i].Inherit = Inherit;
|
||||
return((HANDLE)(handle+i));
|
||||
}
|
||||
}
|
||||
|
@ -185,9 +265,12 @@ HANDLE ObAddHandle(PVOID obj)
|
|||
*/
|
||||
new_blk = (HANDLE_BLOCK *)ExAllocatePool(NonPagedPool,sizeof(HANDLE_BLOCK));
|
||||
memset(new_blk,0,sizeof(HANDLE_BLOCK));
|
||||
ExInterlockedInsertTailList(&handle_list_head,&new_blk->entry,
|
||||
&handle_list_lock);
|
||||
new_blk->handles[0].obj=obj;
|
||||
ExInterlockedInsertTailList(&(Process->HandleTable.ListHead),
|
||||
&new_blk->entry,
|
||||
&(Process->HandleTable.ListLock));
|
||||
new_blk->handles[0].ObjectBody = ObjectBody;
|
||||
new_blk->handles[0].GrantedAccess = GrantedAccess;
|
||||
new_blk->handles[0].Inherit = Inherit;
|
||||
return((HANDLE)handle);
|
||||
}
|
||||
|
||||
|
|
|
@ -22,23 +22,7 @@
|
|||
|
||||
/* GLOBALS ****************************************************************/
|
||||
|
||||
OBJECT_TYPE DirectoryObjectType = {{0,0,NULL},
|
||||
0,
|
||||
0,
|
||||
ULONG_MAX,
|
||||
ULONG_MAX,
|
||||
sizeof(DIRECTORY_OBJECT),
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
};
|
||||
|
||||
POBJECT_TYPE ObDirectoryType = NULL;
|
||||
|
||||
static struct
|
||||
{
|
||||
|
@ -50,6 +34,15 @@ static struct
|
|||
|
||||
/* FUNCTIONS **************************************************************/
|
||||
|
||||
NTSTATUS NtOpenDirectoryObject(PHANDLE DirectoryHandle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ObjectAttributes)
|
||||
{
|
||||
return(ZwOpenDirectoryObject(DirectoryHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes));
|
||||
}
|
||||
|
||||
NTSTATUS ZwOpenDirectoryObject(PHANDLE DirectoryHandle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ObjectAttributes)
|
||||
|
@ -80,11 +73,29 @@ NTSTATUS ZwOpenDirectoryObject(PHANDLE DirectoryHandle,
|
|||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
*DirectoryHandle = ObAddHandle(Object);
|
||||
*DirectoryHandle = ObInsertHandle(KeGetCurrentProcess(),Object,
|
||||
DesiredAccess,FALSE);
|
||||
CHECKPOINT;
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS NtQueryDirectoryObject(IN HANDLE DirObjHandle,
|
||||
OUT POBJDIR_INFORMATION DirObjInformation,
|
||||
IN ULONG BufferLength,
|
||||
IN BOOLEAN GetNextIndex,
|
||||
IN BOOLEAN IgnoreInputIndex,
|
||||
IN OUT PULONG ObjectIndex,
|
||||
OUT PULONG DataWritten OPTIONAL)
|
||||
{
|
||||
return(ZwQueryDirectoryObject(DirObjHandle,
|
||||
DirObjInformation,
|
||||
BufferLength,
|
||||
GetNextIndex,
|
||||
IgnoreInputIndex,
|
||||
ObjectIndex,
|
||||
DataWritten));
|
||||
}
|
||||
|
||||
NTSTATUS ZwQueryDirectoryObject(IN HANDLE DirObjHandle,
|
||||
OUT POBJDIR_INFORMATION DirObjInformation,
|
||||
IN ULONG BufferLength,
|
||||
|
@ -111,18 +122,29 @@ NTSTATUS ZwQueryDirectoryObject(IN HANDLE DirObjHandle,
|
|||
* RETURNS: Status
|
||||
*/
|
||||
{
|
||||
COMMON_BODY_HEADER* hdr = ObGetObjectByHandle(DirObjHandle);
|
||||
PDIRECTORY_OBJECT dir = (PDIRECTORY_OBJECT)hdr;
|
||||
PDIRECTORY_OBJECT dir = NULL;
|
||||
ULONG EntriesToRead;
|
||||
PLIST_ENTRY current_entry;
|
||||
POBJECT_HEADER current;
|
||||
ULONG i=0;
|
||||
ULONG EntriesToSkip;
|
||||
NTSTATUS Status;
|
||||
|
||||
DPRINT("ZwQueryDirectoryObject(DirObjHandle %x)\n",DirObjHandle);
|
||||
DPRINT("dir %x namespc_root %x\n",dir,HEADER_TO_BODY(&(namespc_root.hdr)));
|
||||
|
||||
assert_irql(PASSIVE_LEVEL);
|
||||
// assert_irql(PASSIVE_LEVEL);
|
||||
|
||||
Status = ObReferenceObjectByHandle(DirObjHandle,
|
||||
DIRECTORY_QUERY,
|
||||
ObDirectoryType,
|
||||
UserMode,
|
||||
(PVOID*)&dir,
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
EntriesToRead = BufferLength / sizeof(OBJDIR_INFORMATION);
|
||||
*DataWritten = 0;
|
||||
|
@ -152,16 +174,16 @@ NTSTATUS ZwQueryDirectoryObject(IN HANDLE DirObjHandle,
|
|||
*/
|
||||
while ( i<EntriesToRead && current_entry!=(&(dir->head)))
|
||||
{
|
||||
current = CONTAINING_RECORD(current_entry,OBJECT_HEADER,entry);
|
||||
DPRINT("Scanning %w\n",current->name.Buffer);
|
||||
current = CONTAINING_RECORD(current_entry,OBJECT_HEADER,Entry);
|
||||
DPRINT("Scanning %w\n",current->Name.Buffer);
|
||||
DirObjInformation[i].ObjectName.Buffer =
|
||||
ExAllocatePool(NonPagedPool,current->name.Length);
|
||||
DirObjInformation[i].ObjectName.Length = current->name.Length;
|
||||
DirObjInformation[i].ObjectName.MaximumLength = current->name.Length;
|
||||
ExAllocatePool(NonPagedPool,(current->Name.Length+1)*2);
|
||||
DirObjInformation[i].ObjectName.Length = current->Name.Length;
|
||||
DirObjInformation[i].ObjectName.MaximumLength = current->Name.Length;
|
||||
DPRINT("DirObjInformation[i].ObjectName.Buffer %x\n",
|
||||
DirObjInformation[i].ObjectName.Buffer);
|
||||
RtlCopyUnicodeString(&DirObjInformation[i].ObjectName,
|
||||
&(current->name));
|
||||
&(current->Name));
|
||||
i++;
|
||||
current_entry = current_entry->Flink;
|
||||
(*DataWritten) = (*DataWritten) + sizeof(OBJDIR_INFORMATION);
|
||||
|
@ -194,7 +216,7 @@ NTSTATUS ObReferenceObjectByName(PUNICODE_STRING ObjectPath,
|
|||
PACCESS_STATE PassedAccessState,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_TYPE ObjectType,
|
||||
KPROCESSOR_MODE Accessmode,
|
||||
KPROCESSOR_MODE AccessMode,
|
||||
PVOID ParseContext,
|
||||
PVOID* ObjectPtr)
|
||||
{
|
||||
|
@ -210,6 +232,8 @@ NTSTATUS ObOpenObjectByName(POBJECT_ATTRIBUTES ObjectAttributes,
|
|||
ObjectAttributes,Object);
|
||||
DPRINT("ObjectAttributes = {ObjectName %x ObjectName->Buffer %w}\n",
|
||||
ObjectAttributes->ObjectName,ObjectAttributes->ObjectName->Buffer);
|
||||
DPRINT("ObjectAttributes->ObjectName->Length %d\n",
|
||||
ObjectAttributes->ObjectName->Length);
|
||||
|
||||
*Object = NULL;
|
||||
Status = ObLookupObject(ObjectAttributes->RootDirectory,
|
||||
|
@ -217,6 +241,8 @@ NTSTATUS ObOpenObjectByName(POBJECT_ATTRIBUTES ObjectAttributes,
|
|||
Object,
|
||||
UnparsedSection);
|
||||
DPRINT("*Object %x\n",*Object);
|
||||
DPRINT("ObjectAttributes->ObjectName->Length %d\n",
|
||||
ObjectAttributes->ObjectName->Length);
|
||||
return(Status);
|
||||
}
|
||||
|
||||
|
@ -225,15 +251,40 @@ void ObInit(void)
|
|||
* FUNCTION: Initialize the object manager namespace
|
||||
*/
|
||||
{
|
||||
ANSI_STRING ansi_str;
|
||||
ANSI_STRING AnsiString;
|
||||
|
||||
ObInitializeObjectHeader(OBJTYP_DIRECTORY,NULL,&namespc_root.hdr);
|
||||
ObDirectoryType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
||||
|
||||
ObDirectoryType->TotalObjects = 0;
|
||||
ObDirectoryType->TotalHandles = 0;
|
||||
ObDirectoryType->MaxObjects = ULONG_MAX;
|
||||
ObDirectoryType->MaxHandles = ULONG_MAX;
|
||||
ObDirectoryType->PagedPoolCharge = 0;
|
||||
ObDirectoryType->NonpagedPoolCharge = sizeof(DIRECTORY_OBJECT);
|
||||
ObDirectoryType->Dump = NULL;
|
||||
ObDirectoryType->Open = NULL;
|
||||
ObDirectoryType->Close = NULL;
|
||||
ObDirectoryType->Delete = NULL;
|
||||
ObDirectoryType->Parse = NULL;
|
||||
ObDirectoryType->Security = NULL;
|
||||
ObDirectoryType->QueryName = NULL;
|
||||
ObDirectoryType->OkayToClose = NULL;
|
||||
|
||||
RtlInitAnsiString(&AnsiString,"Directory");
|
||||
RtlAnsiStringToUnicodeString(&ObDirectoryType->TypeName,
|
||||
&AnsiString,TRUE);
|
||||
|
||||
ObInitializeObjectHeader(ObDirectoryType,NULL,&namespc_root.hdr);
|
||||
InitializeListHead(&namespc_root.head);
|
||||
}
|
||||
|
||||
RtlInitAnsiString(&ansi_str,"Directory");
|
||||
RtlAnsiStringToUnicodeString(&DirectoryObjectType.TypeName,&ansi_str,
|
||||
TRUE);
|
||||
ObRegisterType(OBJTYP_DIRECTORY,&DirectoryObjectType);
|
||||
NTSTATUS NtCreateDirectoryObject(PHANDLE DirectoryHandle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ObjectAttributes)
|
||||
{
|
||||
return(ZwCreateDirectoryObject(DirectoryHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes));
|
||||
}
|
||||
|
||||
NTSTATUS ZwCreateDirectoryObject(PHANDLE DirectoryHandle,
|
||||
|
@ -254,7 +305,7 @@ NTSTATUS ZwCreateDirectoryObject(PHANDLE DirectoryHandle,
|
|||
PDIRECTORY_OBJECT dir;
|
||||
|
||||
dir = ObGenericCreateObject(DirectoryHandle,DesiredAccess,ObjectAttributes,
|
||||
OBJTYP_DIRECTORY);
|
||||
ObDirectoryType);
|
||||
|
||||
/*
|
||||
* Initialize the object body
|
||||
|
@ -326,9 +377,9 @@ static PVOID ObDirLookup(PDIRECTORY_OBJECT dir, PWSTR name)
|
|||
}
|
||||
while (current!=(&(dir->head)))
|
||||
{
|
||||
current_obj = CONTAINING_RECORD(current,OBJECT_HEADER,entry);
|
||||
DPRINT("Scanning %w\n",current_obj->name.Buffer);
|
||||
if ( wcscmp(current_obj->name.Buffer, name)==0)
|
||||
current_obj = CONTAINING_RECORD(current,OBJECT_HEADER,Entry);
|
||||
DPRINT("Scanning %w\n",current_obj->Name.Buffer);
|
||||
if ( wcscmp(current_obj->Name.Buffer, name)==0)
|
||||
{
|
||||
return(HEADER_TO_BODY(current_obj));
|
||||
}
|
||||
|
@ -338,6 +389,16 @@ static PVOID ObDirLookup(PDIRECTORY_OBJECT dir, PWSTR name)
|
|||
return(NULL);
|
||||
}
|
||||
|
||||
VOID ObRemoveEntry(POBJECT_HEADER Header)
|
||||
{
|
||||
KIRQL oldlvl;
|
||||
|
||||
DPRINT("ObRemoveEntry(Header %x)\n",Header);
|
||||
|
||||
KeAcquireSpinLock(&(Header->Parent->Lock),&oldlvl);
|
||||
RemoveEntryList(&(Header->Entry));
|
||||
KeReleaseSpinLock(&(Header->Parent->Lock),oldlvl);
|
||||
}
|
||||
|
||||
VOID ObCreateEntry(PDIRECTORY_OBJECT parent,POBJECT_HEADER Object)
|
||||
/*
|
||||
|
@ -348,14 +409,13 @@ VOID ObCreateEntry(PDIRECTORY_OBJECT parent,POBJECT_HEADER Object)
|
|||
* Object = Header of the object to add the entry for
|
||||
*/
|
||||
{
|
||||
DPRINT("ObjCreateEntry(%x,%x,%x,%w)\n",parent,Object,Object->name.Buffer,
|
||||
Object->name.Buffer);
|
||||
assert(parent->Type == OBJTYP_DIRECTORY);
|
||||
DPRINT("ObjCreateEntry(%x,%x,%x,%w)\n",parent,Object,Object->Name.Buffer,
|
||||
Object->Name.Buffer);
|
||||
|
||||
/*
|
||||
* Insert ourselves in our parents list
|
||||
*/
|
||||
InsertTailList(&parent->head,&Object->entry);
|
||||
InsertTailList(&parent->head,&Object->Entry);
|
||||
}
|
||||
|
||||
NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object,
|
||||
|
@ -411,7 +471,8 @@ NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object,
|
|||
next = &string[0];
|
||||
current = next+1;
|
||||
|
||||
while (next!=NULL && current_dir->Type==OBJTYP_DIRECTORY)
|
||||
while (next!=NULL &&
|
||||
BODY_TO_HEADER(current_dir)->ObjectType==ObDirectoryType)
|
||||
{
|
||||
*next = '\\';
|
||||
current = next+1;
|
||||
|
@ -433,15 +494,10 @@ NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object,
|
|||
{
|
||||
DbgPrint("(%s:%d) Path component not found\n",__FILE__,
|
||||
__LINE__);
|
||||
ExFreePool(string);
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
DPRINT("current_dir %x\n",current_dir);
|
||||
DPRINT("current_dir->Type %d OBJTYP_SYMLNK %d OBJTYP_DIRECTORY %d\n",
|
||||
current_dir->Type,OBJTYP_SYMLNK,OBJTYP_DIRECTORY);
|
||||
DPRINT("&(current_dir->Type) %x\n",&(current_dir->Type));
|
||||
if (current_dir->Type==OBJTYP_SYMLNK)
|
||||
if (BODY_TO_HEADER(current_dir)->ObjectType==IoSymbolicLinkType)
|
||||
{
|
||||
current_dir = IoOpenSymlink(current_dir);
|
||||
}
|
||||
|
@ -465,17 +521,13 @@ NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object,
|
|||
CHECKPOINT;
|
||||
*next = '\\';
|
||||
*UnparsedSection = next;
|
||||
switch(current_dir->Type)
|
||||
if (BODY_TO_HEADER(current_dir)->ObjectType == IoDeviceType)
|
||||
{
|
||||
case OBJTYP_DEVICE:
|
||||
CHECKPOINT;
|
||||
Status = STATUS_FS_QUERY_REQUIRED;
|
||||
break;
|
||||
|
||||
default:
|
||||
current_dir = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
Status = STATUS_UNSUCCESSFUL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
CHECKPOINT;
|
||||
|
|
|
@ -17,35 +17,93 @@
|
|||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
/* GLOBALS ****************************************************************/
|
||||
|
||||
/*
|
||||
* List of pointers to object types
|
||||
*/
|
||||
static POBJECT_TYPE ObjectTypes[OBJTYP_MAX]={NULL,};
|
||||
|
||||
/* FUNCTIONS ************************************************************/
|
||||
|
||||
NTSTATUS STDCALL NtSetInformationObject(IN HANDLE ObjectHandle,
|
||||
IN CINT ObjectInformationClass,
|
||||
IN PVOID ObjectInformation,
|
||||
IN ULONG Length)
|
||||
{
|
||||
return(ZwSetInformationObject(ObjectHandle,
|
||||
ObjectInformationClass,
|
||||
ObjectInformation,
|
||||
Length));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwSetInformationObject(IN HANDLE ObjectHandle,
|
||||
IN CINT ObjectInformationClass,
|
||||
IN PVOID ObjectInformation,
|
||||
IN ULONG Length)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtQueryObject(IN HANDLE ObjectHandle,
|
||||
IN CINT ObjectInformationClass,
|
||||
OUT PVOID ObjectInformation,
|
||||
IN ULONG Length,
|
||||
OUT PULONG ResultLength)
|
||||
{
|
||||
return(ZwQueryObject(ObjectHandle,
|
||||
ObjectInformationClass,
|
||||
ObjectInformation,
|
||||
Length,
|
||||
ResultLength));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwQueryObject(IN HANDLE ObjectHandle,
|
||||
IN CINT ObjectInformationClass,
|
||||
OUT PVOID ObjectInformation,
|
||||
IN ULONG Length,
|
||||
OUT PULONG ResultLength)
|
||||
{
|
||||
UNIMPLEMENTED
|
||||
}
|
||||
|
||||
NTSTATUS NtMakeTemporaryObject(HANDLE Handle)
|
||||
{
|
||||
return(ZwMakeTemporaryObject(Handle));
|
||||
}
|
||||
|
||||
NTSTATUS ZwMakeTemporaryObject(HANDLE Handle)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
PVOID Object;
|
||||
NTSTATUS Status;
|
||||
POBJECT_HEADER ObjectHeader;
|
||||
|
||||
Status = ObReferenceObjectByHandle(Handle,
|
||||
0,
|
||||
NULL,
|
||||
KernelMode,
|
||||
&Object,
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
ObjectHeader = BODY_TO_HEADER(Object);
|
||||
ObjectHeader->Permanent = FALSE;
|
||||
|
||||
ObDereferenceObject(Object);
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
PVOID ObGenericCreateObject(PHANDLE Handle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
CSHORT Type)
|
||||
POBJECT_TYPE Type)
|
||||
{
|
||||
POBJECT_HEADER hdr = NULL;
|
||||
UNICODE_STRING ObjectName;
|
||||
PWSTR path;
|
||||
PWSTR name;
|
||||
PDIRECTORY_OBJECT parent;
|
||||
PWSTR Ignored;
|
||||
|
||||
DPRINT("ObGenericCreateObject(Handle %x, DesiredAccess %x,"
|
||||
"ObjectAttributes %x, Type %d)\n",Handle,DesiredAccess,ObjectAttributes,
|
||||
Type);
|
||||
"ObjectAttributes %x, Type %x)\n",Handle,DesiredAccess,
|
||||
ObjectAttributes,Type);
|
||||
|
||||
/*
|
||||
* Allocate the object body and header
|
||||
|
@ -62,7 +120,13 @@ PVOID ObGenericCreateObject(PHANDLE Handle,
|
|||
if (ObjectAttributes==NULL)
|
||||
{
|
||||
ObInitializeObjectHeader(Type,NULL,hdr);
|
||||
*Handle = ObAddHandle(HEADER_TO_BODY(hdr));
|
||||
if (Handle != NULL)
|
||||
{
|
||||
*Handle = ObInsertHandle(KeGetCurrentProcess(),
|
||||
HEADER_TO_BODY(hdr),
|
||||
DesiredAccess,
|
||||
FALSE);
|
||||
}
|
||||
return(HEADER_TO_BODY(hdr));
|
||||
}
|
||||
|
||||
|
@ -107,31 +171,19 @@ PVOID ObGenericCreateObject(PHANDLE Handle,
|
|||
ObCreateEntry(hdr->Parent,hdr);
|
||||
|
||||
DPRINT("Handle %x\n",Handle);
|
||||
*Handle = ObAddHandle(HEADER_TO_BODY(hdr));
|
||||
if (Handle != NULL)
|
||||
{
|
||||
*Handle = ObInsertHandle(KeGetCurrentProcess(),
|
||||
HEADER_TO_BODY(hdr),
|
||||
DesiredAccess,
|
||||
FALSE);
|
||||
}
|
||||
|
||||
return(HEADER_TO_BODY(hdr));
|
||||
}
|
||||
|
||||
ULONG ObSizeOf(CSHORT Type)
|
||||
{
|
||||
DPRINT("ObSizeOf(Type %d)\n",Type);
|
||||
DPRINT("ObSizeOf() Returning %d\n",ObjectTypes[Type]->PagedPoolCharge);
|
||||
return(ObjectTypes[Type]->PagedPoolCharge);
|
||||
}
|
||||
|
||||
VOID ObRegisterType(CSHORT id, POBJECT_TYPE type)
|
||||
/*
|
||||
* FUNCTION: Registers a new type of object
|
||||
* ARGUMENTS:
|
||||
* typ = Pointer to the type definition to register
|
||||
*/
|
||||
{
|
||||
DPRINT("ObRegisterType(id %d, type %x)\n",id,type);
|
||||
ObjectTypes[id]=type;
|
||||
}
|
||||
|
||||
VOID ObInitializeObjectHeader(CSHORT id, PWSTR name,
|
||||
POBJECT_HEADER obj)
|
||||
VOID ObInitializeObjectHeader(POBJECT_TYPE Type, PWSTR name,
|
||||
POBJECT_HEADER ObjectHeader)
|
||||
/*
|
||||
* FUNCTION: Creates a new object
|
||||
* ARGUMENT:
|
||||
|
@ -141,38 +193,25 @@ VOID ObInitializeObjectHeader(CSHORT id, PWSTR name,
|
|||
{
|
||||
PWSTR temp_name;
|
||||
|
||||
if (name!=NULL)
|
||||
{
|
||||
DPRINT("ObInitializeObjectHeader(id %d name %w obj %x)\n",id,
|
||||
name,obj);
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT("ObInitializeObjectHeader(id %d name %x obj %x)\n",id,
|
||||
name,obj);
|
||||
}
|
||||
DPRINT("ObInitializeObjectHeader(id %x name %w obj %x)\n",Type,
|
||||
name,ObjectHeader);
|
||||
|
||||
obj->HandleCount = 0;
|
||||
obj->RefCount = 0;
|
||||
obj->Type = id;
|
||||
ObjectHeader->HandleCount = 0;
|
||||
ObjectHeader->RefCount = 0;
|
||||
ObjectHeader->ObjectType = Type;
|
||||
ObjectHeader->Permanent = FALSE;
|
||||
if (name==NULL)
|
||||
{
|
||||
obj->name.Length=0;
|
||||
obj->name.Buffer=NULL;
|
||||
ObjectHeader->Name.Length=0;
|
||||
ObjectHeader->Name.Buffer=NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT("name %w\n",name);
|
||||
obj->name.MaximumLength = wstrlen(name);
|
||||
obj->name.Buffer = ExAllocatePool(NonPagedPool,
|
||||
(obj->name.MaximumLength+1)*2);
|
||||
DPRINT("name %w\n",name);
|
||||
RtlInitUnicodeString(&obj->name,name);
|
||||
DPRINT("name %w\n",obj->name.Buffer);
|
||||
ObjectHeader->Name.MaximumLength = wstrlen(name);
|
||||
ObjectHeader->Name.Buffer = ExAllocatePool(NonPagedPool,
|
||||
(ObjectHeader->Name.MaximumLength+1)*2);
|
||||
RtlInitUnicodeString(&ObjectHeader->Name,name);
|
||||
}
|
||||
DPRINT("obj->Type %d\n",obj->Type);
|
||||
DPRINT("obj %x\n",obj);
|
||||
DPRINT("&(obj->Type) %x\n",&(obj->Type));
|
||||
}
|
||||
|
||||
|
||||
|
@ -199,6 +238,17 @@ NTSTATUS ObReferenceObjectByPointer(PVOID ObjectBody,
|
|||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS ObPerformRetentionChecks(POBJECT_HEADER Header)
|
||||
{
|
||||
if (Header->RefCount == 0 && Header->HandleCount == 0 &&
|
||||
!Header->Permanent)
|
||||
{
|
||||
ObRemoveEntry(Header);
|
||||
ExFreePool(Header);
|
||||
}
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
VOID ObDereferenceObject(PVOID ObjectBody)
|
||||
/*
|
||||
* FUNCTION: Decrements a given object's reference count and performs
|
||||
|
@ -207,8 +257,15 @@ VOID ObDereferenceObject(PVOID ObjectBody)
|
|||
* ObjectBody = Body of the object
|
||||
*/
|
||||
{
|
||||
POBJECT_HEADER Object = BODY_TO_HEADER(ObjectBody);
|
||||
Object->RefCount--;
|
||||
POBJECT_HEADER Header = BODY_TO_HEADER(ObjectBody);
|
||||
Header->RefCount--;
|
||||
ObPerformRetentionChecks(Header);
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS NtClose(HANDLE Handle)
|
||||
{
|
||||
return(ZwClose(Handle));
|
||||
}
|
||||
|
||||
NTSTATUS ZwClose(HANDLE Handle)
|
||||
|
@ -220,15 +277,25 @@ NTSTATUS ZwClose(HANDLE Handle)
|
|||
*/
|
||||
{
|
||||
PVOID ObjectBody;
|
||||
POBJECT_HEADER Header;
|
||||
PHANDLE_REP HandleRep;
|
||||
|
||||
assert_irql(PASSIVE_LEVEL);
|
||||
|
||||
ObjectBody = ObGetObjectByHandle(Handle);
|
||||
if (ObjectBody == NULL)
|
||||
HandleRep = ObTranslateHandle(KeGetCurrentProcess(),Handle);
|
||||
if (HandleRep == NULL)
|
||||
{
|
||||
return(STATUS_INVALID_HANDLE);
|
||||
}
|
||||
ObDereferenceObject(ObjectBody);
|
||||
ObjectBody = HandleRep->ObjectBody;
|
||||
|
||||
HandleRep->ObjectBody = NULL;
|
||||
|
||||
Header = BODY_TO_HEADER(ObjectBody);
|
||||
|
||||
Header->HandleCount--;
|
||||
ObPerformRetentionChecks(Header);
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
@ -254,18 +321,47 @@ NTSTATUS ObReferenceObjectByHandle(HANDLE Handle,
|
|||
* RETURNS: Status
|
||||
*/
|
||||
{
|
||||
PVOID ObjectBody;
|
||||
PHANDLE_REP HandleRep;
|
||||
POBJECT_HEADER ObjectHeader;
|
||||
|
||||
ASSERT_IRQL(PASSIVE_LEVEL);
|
||||
assert(HandleInformationPtr==NULL);
|
||||
assert(Object!=NULL);
|
||||
assert(Handle!=NULL);
|
||||
|
||||
ObjectBody = ObGetObjectByHandle(Handle);
|
||||
if (ObjectBody == NULL)
|
||||
DPRINT("ObReferenceObjectByHandle(Handle %x, DesiredAccess %x, "
|
||||
"ObjectType %x, AccessMode %d, Object %x)\n",Handle,DesiredAccess,
|
||||
ObjectType,AccessMode,Object);
|
||||
|
||||
if (Handle == NtCurrentProcess())
|
||||
{
|
||||
*Object = PsGetCurrentProcess();
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
if (Handle == NtCurrentThread())
|
||||
{
|
||||
*Object = PsGetCurrentThread();
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
HandleRep = ObTranslateHandle(KeGetCurrentProcess(),Handle);
|
||||
if (HandleRep == NULL || HandleRep->ObjectBody == NULL)
|
||||
{
|
||||
return(STATUS_INVALID_HANDLE);
|
||||
}
|
||||
return(ObReferenceObjectByPointer(ObjectBody,DesiredAccess,
|
||||
ObjectType,AccessMode));
|
||||
|
||||
ObjectHeader = BODY_TO_HEADER(HandleRep->ObjectBody);
|
||||
|
||||
if (ObjectType != NULL && ObjectType != ObjectHeader->ObjectType)
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
if (!(HandleRep->GrantedAccess & DesiredAccess))
|
||||
{
|
||||
return(STATUS_ACCESS_DENIED);
|
||||
}
|
||||
|
||||
ObjectHeader->RefCount++;
|
||||
|
||||
*Object = HandleRep->ObjectBody;
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
|
|
@ -22,16 +22,28 @@ HANDLE IdleThreadHandle = NULL;
|
|||
|
||||
static VOID PsIdleThreadMain(PVOID Context)
|
||||
{
|
||||
for(;;);
|
||||
for(;;)
|
||||
{
|
||||
// DbgPrint("Idling.... ");
|
||||
ZwYieldExecution();
|
||||
}
|
||||
}
|
||||
|
||||
VOID PsInitIdleThread(VOID)
|
||||
{
|
||||
KPRIORITY Priority;
|
||||
|
||||
PsCreateSystemThread(&IdleThreadHandle,
|
||||
0,
|
||||
THREAD_ALL_ACCESS,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
PsIdleThreadMain,
|
||||
NULL);
|
||||
|
||||
Priority = THREAD_PRIORITY_IDLE;
|
||||
ZwSetInformationThread(IdleThreadHandle,
|
||||
ThreadPriority,
|
||||
&Priority,
|
||||
sizeof(Priority));
|
||||
}
|
||||
|
|
|
@ -11,23 +11,70 @@
|
|||
/* INCLUDES ******************************************************************/
|
||||
|
||||
#include <ddk/ntddk.h>
|
||||
#include <internal/ob.h>
|
||||
#include <internal/mm.h>
|
||||
#include <internal/string.h>
|
||||
|
||||
#define NDEBUG
|
||||
//#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
/* GLOBALS ******************************************************************/
|
||||
|
||||
EPROCESS SystemProcess = {{0},};
|
||||
PEPROCESS SystemProcess = NULL;
|
||||
HANDLE SystemProcessHandle = NULL;
|
||||
|
||||
POBJECT_TYPE PsProcessType = NULL;
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
VOID PsInitProcessManagment(VOID)
|
||||
{
|
||||
InitializeListHead(&(SystemProcess.Pcb.MemoryAreaList));
|
||||
ANSI_STRING AnsiString;
|
||||
PKPROCESS KProcess;
|
||||
|
||||
/*
|
||||
* Register the process object type
|
||||
*/
|
||||
|
||||
PsProcessType = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE));
|
||||
|
||||
PsProcessType->TotalObjects = 0;
|
||||
PsProcessType->TotalHandles = 0;
|
||||
PsProcessType->MaxObjects = ULONG_MAX;
|
||||
PsProcessType->MaxHandles = ULONG_MAX;
|
||||
PsProcessType->PagedPoolCharge = 0;
|
||||
PsProcessType->NonpagedPoolCharge = sizeof(EPROCESS);
|
||||
PsProcessType->Dump = NULL;
|
||||
PsProcessType->Open = NULL;
|
||||
PsProcessType->Close = NULL;
|
||||
PsProcessType->Delete = NULL;
|
||||
PsProcessType->Parse = NULL;
|
||||
PsProcessType->Security = NULL;
|
||||
PsProcessType->QueryName = NULL;
|
||||
PsProcessType->OkayToClose = NULL;
|
||||
|
||||
RtlInitAnsiString(&AnsiString,"Process");
|
||||
RtlAnsiStringToUnicodeString(&PsProcessType->TypeName,&AnsiString,TRUE);
|
||||
|
||||
/*
|
||||
* Initialize the system process
|
||||
*/
|
||||
SystemProcess = ObGenericCreateObject(NULL,PROCESS_ALL_ACCESS,NULL,
|
||||
PsProcessType);
|
||||
KProcess = &SystemProcess->Pcb;
|
||||
|
||||
InitializeListHead(&(KProcess->MemoryAreaList));
|
||||
ObInitializeHandleTable(NULL,FALSE,KProcess);
|
||||
KProcess->PageTableDirectory = get_page_directory();
|
||||
|
||||
SystemProcessHandle = ObInsertHandle(KProcess,SystemProcess,
|
||||
PROCESS_ALL_ACCESS,FALSE);
|
||||
}
|
||||
|
||||
PKPROCESS KeGetCurrentProcess(VOID)
|
||||
/*
|
||||
* FUNCTION: Returns a pointer to the current process
|
||||
*/
|
||||
{
|
||||
return(&(PsGetCurrentProcess()->Pcb));
|
||||
}
|
||||
|
@ -37,7 +84,233 @@ struct _EPROCESS* PsGetCurrentProcess(VOID)
|
|||
* FUNCTION: Returns a pointer to the current process
|
||||
*/
|
||||
{
|
||||
DPRINT("PsGetCurrentProcess() = %x\n",PsGetCurrentThread()->ThreadsProcess);
|
||||
if (PsGetCurrentThread()==NULL
|
||||
|| PsGetCurrentThread()->ThreadsProcess==NULL)
|
||||
{
|
||||
return(SystemProcess);
|
||||
}
|
||||
else
|
||||
{
|
||||
return(PsGetCurrentThread()->ThreadsProcess);
|
||||
}
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtCreateProcess(
|
||||
OUT PHANDLE ProcessHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
||||
IN HANDLE ParentProcessHandle,
|
||||
IN BOOLEAN InheritObjectTable,
|
||||
IN HANDLE SectionHandle OPTIONAL,
|
||||
IN HANDLE DebugPort OPTIONAL,
|
||||
IN HANDLE ExceptionPort OPTIONAL)
|
||||
{
|
||||
return(ZwCreateProcess(ProcessHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes,
|
||||
ParentProcessHandle,
|
||||
InheritObjectTable,
|
||||
SectionHandle,
|
||||
DebugPort,
|
||||
ExceptionPort));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwCreateProcess(
|
||||
OUT PHANDLE ProcessHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
||||
IN HANDLE ParentProcessHandle,
|
||||
IN BOOLEAN InheritObjectTable,
|
||||
IN HANDLE SectionHandle OPTIONAL,
|
||||
IN HANDLE DebugPort OPTIONAL,
|
||||
IN HANDLE ExceptionPort OPTIONAL)
|
||||
/*
|
||||
* FUNCTION: Creates a process.
|
||||
* ARGUMENTS:
|
||||
* ProcessHandle (OUT) = Caller supplied storage for the resulting
|
||||
* handle
|
||||
* DesiredAccess = Specifies the allowed or desired access to the
|
||||
* process can be a combination of
|
||||
* STANDARD_RIGHTS_REQUIRED| ..
|
||||
* ObjectAttribute = Initialized attributes for the object, contains
|
||||
* the rootdirectory and the filename
|
||||
* ParentProcess = Handle to the parent process.
|
||||
* InheritObjectTable = Specifies to inherit the objects of the parent
|
||||
* process if true.
|
||||
* SectionHandle = Handle to a section object to back the image file
|
||||
* DebugPort = Handle to a DebugPort if NULL the system default debug
|
||||
* port will be used.
|
||||
* ExceptionPort = Handle to a exception port.
|
||||
* REMARKS:
|
||||
* This function maps to the win32 CreateProcess.
|
||||
* RETURNS: Status
|
||||
*/
|
||||
{
|
||||
PEPROCESS Process;
|
||||
PEPROCESS ParentProcess;
|
||||
PULONG PageDirectory;
|
||||
PULONG CurrentPageDirectory;
|
||||
ULONG i;
|
||||
PKPROCESS KProcess;
|
||||
ULONG Base;
|
||||
ULONG Length;
|
||||
LARGE_INTEGER Offset;
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = ObReferenceObjectByHandle(ParentProcessHandle,
|
||||
PROCESS_CREATE_PROCESS,
|
||||
PsProcessType,
|
||||
UserMode,
|
||||
&ParentProcessHandle,
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
DPRINT("ZwCreateProcess() = %x\n",Status);
|
||||
return(Status);
|
||||
}
|
||||
|
||||
Process = ObGenericCreateObject(ProcessHandle,DesiredAccess,
|
||||
ObjectAttributes,PsProcessType);
|
||||
KProcess = &(Process->Pcb);
|
||||
|
||||
InitializeListHead(&(KProcess->MemoryAreaList));
|
||||
ObInitializeHandleTable(KProcess,InheritObjectTable,KProcess);
|
||||
|
||||
PageDirectory = physical_to_linear((ULONG)get_free_page());
|
||||
KProcess->PageTableDirectory = PageDirectory;
|
||||
|
||||
CurrentPageDirectory = get_page_directory();
|
||||
|
||||
memset(PageDirectory,0,PAGESIZE);
|
||||
for (i=768;i<1024;i++)
|
||||
{
|
||||
PageDirectory[i]=CurrentPageDirectory[i];
|
||||
}
|
||||
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS STDCALL NtTerminateProcess(IN HANDLE ProcessHandle,
|
||||
IN NTSTATUS ExitStatus)
|
||||
{
|
||||
return(ZwTerminateProcess(ProcessHandle,ExitStatus));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwTerminateProcess(IN HANDLE ProcessHandle,
|
||||
IN NTSTATUS ExitStatus)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS STDCALL NtOpenProcess (OUT PHANDLE ProcessHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
IN PCLIENT_ID ClientId)
|
||||
{
|
||||
return(ZwOpenProcess(ProcessHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes,
|
||||
ClientId));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwOpenProcess (OUT PHANDLE ProcessHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
IN PCLIENT_ID ClientId)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtQueryInformationProcess(
|
||||
IN HANDLE ProcessHandle,
|
||||
IN CINT ProcessInformationClass,
|
||||
OUT PVOID ProcessInformation,
|
||||
IN ULONG ProcessInformationLength,
|
||||
OUT PULONG ReturnLength)
|
||||
{
|
||||
return(ZwQueryInformationProcess(ProcessHandle,
|
||||
ProcessInformationClass,
|
||||
ProcessInformation,
|
||||
ProcessInformationLength,
|
||||
ReturnLength));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwQueryInformationProcess(
|
||||
IN HANDLE ProcessHandle,
|
||||
IN CINT ProcessInformationClass,
|
||||
OUT PVOID ProcessInformation,
|
||||
IN ULONG ProcessInformationLength,
|
||||
OUT PULONG ReturnLength)
|
||||
{
|
||||
PEPROCESS Process;
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = ObReferenceObjectByHandle(ProcessHandle,
|
||||
PROCESS_QUERY_INFORMATION,
|
||||
PsProcessType,
|
||||
UserMode,
|
||||
&ProcessHandle,
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
switch (ProcessInformationClass)
|
||||
{
|
||||
case ProcessBasicInformation:
|
||||
case ProcessQuotaLimits:
|
||||
case ProcessIoCounters:
|
||||
case ProcessVmCounters:
|
||||
case ProcessTimes:
|
||||
case ProcessBasePriority:
|
||||
case ProcessRaisePriority:
|
||||
case ProcessDebugPort:
|
||||
case ProcessExceptionPort:
|
||||
case ProcessAccessToken:
|
||||
case ProcessLdtInformation:
|
||||
case ProcessLdtSize:
|
||||
case ProcessDefaultHardErrorMode:
|
||||
case ProcessIoPortHandlers:
|
||||
case ProcessWorkingSetWatch:
|
||||
case ProcessUserModeIOPL:
|
||||
case ProcessEnableAlignmentFaultFixup:
|
||||
case ProcessPriorityClass:
|
||||
case ProcessWx86Information:
|
||||
case ProcessHandleCount:
|
||||
case ProcessAffinityMask:
|
||||
default:
|
||||
Status = STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
return(Status);
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
NtSetInformationProcess(
|
||||
IN HANDLE ProcessHandle,
|
||||
IN CINT ProcessInformationClass,
|
||||
IN PVOID ProcessInformation,
|
||||
IN ULONG ProcessInformationLength
|
||||
)
|
||||
{
|
||||
return(ZwSetInformationProcess(ProcessHandle,
|
||||
ProcessInformationClass,
|
||||
ProcessInformation,
|
||||
ProcessInformationLength));
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
ZwSetInformationProcess(
|
||||
IN HANDLE ProcessHandle,
|
||||
IN CINT ProcessInformationClass,
|
||||
IN PVOID ProcessInformation,
|
||||
IN ULONG ProcessInformationLength
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
|
||||
VOID PsInit(VOID)
|
||||
{
|
||||
ObjInitializeHandleTable(NULL);
|
||||
PsInitProcessManagment();
|
||||
PsInitThreadManagment();
|
||||
PsInitIdleThread();
|
||||
|
|
|
@ -33,32 +33,13 @@
|
|||
|
||||
/* GLOBALS ******************************************************************/
|
||||
|
||||
OBJECT_TYPE ThreadObjectType = {{NULL,0,0},
|
||||
0,
|
||||
0,
|
||||
ULONG_MAX,
|
||||
ULONG_MAX,
|
||||
sizeof(ETHREAD),
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
};
|
||||
POBJECT_TYPE PsThreadType = NULL;
|
||||
|
||||
#define NR_THREAD_PRIORITY_LEVELS (32)
|
||||
#define NR_THREAD_PRIORITY_LEVELS (31)
|
||||
#define THREAD_PRIORITY_MAX (15)
|
||||
|
||||
static KSPIN_LOCK ThreadListLock = {0,};
|
||||
|
||||
/*
|
||||
* PURPOSE: List of all threads currently active
|
||||
*/
|
||||
static LIST_ENTRY ThreadListHead = {NULL,NULL};
|
||||
|
||||
/*
|
||||
* PURPOSE: List of threads associated with each priority level
|
||||
*/
|
||||
|
@ -71,17 +52,9 @@ static ULONG NextThreadUniqueId = 0;
|
|||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
||||
NTSTATUS ZwSetInformationThread(HANDLE ThreadHandle,
|
||||
THREADINFOCLASS ThreadInformationClass,
|
||||
PVOID ThreadInformation,
|
||||
ULONG ThreadInformationLength)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
PKTHREAD KeGetCurrentThread(VOID)
|
||||
{
|
||||
return((PKTHREAD)CurrentThread);
|
||||
return(&(CurrentThread->Tcb));
|
||||
}
|
||||
|
||||
PETHREAD PsGetCurrentThread(VOID)
|
||||
|
@ -89,30 +62,53 @@ PETHREAD PsGetCurrentThread(VOID)
|
|||
return((PETHREAD)KeGetCurrentThread());
|
||||
}
|
||||
|
||||
#if CAN_WE_DARE_TO_TRY_THIS
|
||||
void PsDispatchThread(void)
|
||||
static VOID PsInsertIntoThreadList(KPRIORITY Priority, PETHREAD Thread)
|
||||
{
|
||||
int i;
|
||||
KIRQL oldlvl;
|
||||
|
||||
for (i=0; i<NR_THREAD_PRIORITY_LEVELS; i++)
|
||||
{
|
||||
if (PsDispatchSpecificPriorityThread(i))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
DPRINT("PsInsertIntoThreadList(Priority %d, Thread %x)\n",Priority,Thread);
|
||||
|
||||
void PsDispatchThread(void)
|
||||
/*
|
||||
* FUNCTION: Chooses a thread, possibly the current one if it is runnable
|
||||
* and dispatches it
|
||||
*/
|
||||
KeAcquireSpinLock(&ThreadListLock,&oldlvl);
|
||||
InsertTailList(&PriorityListHead[THREAD_PRIORITY_MAX+Priority],
|
||||
&Thread->Tcb.Entry);
|
||||
KeReleaseSpinLock(&ThreadListLock,oldlvl);
|
||||
}
|
||||
|
||||
static PETHREAD PsScanThreadList(KPRIORITY Priority)
|
||||
{
|
||||
KIRQL irql;
|
||||
PLIST_ENTRY current_entry;
|
||||
PKTHREAD current;
|
||||
PETHREAD current;
|
||||
PETHREAD oldest = NULL;
|
||||
ULONG oldest_time = 0;
|
||||
|
||||
DPRINT("PsScanThreadList(Priority %d)\n",Priority);
|
||||
|
||||
current_entry = PriorityListHead[THREAD_PRIORITY_MAX+Priority].Flink;
|
||||
while (current_entry != &PriorityListHead[THREAD_PRIORITY_MAX+Priority])
|
||||
{
|
||||
current = CONTAINING_RECORD(current_entry,ETHREAD,Tcb.Entry);
|
||||
if (current->Tcb.ThreadState == THREAD_STATE_RUNNABLE)
|
||||
{
|
||||
if (oldest == NULL || oldest_time > current->Tcb.LastTick)
|
||||
{
|
||||
oldest = current;
|
||||
oldest_time = current->Tcb.LastTick;
|
||||
}
|
||||
}
|
||||
current_entry = current_entry->Flink;
|
||||
}
|
||||
DPRINT("PsScanThreadList() = %x\n",oldest);
|
||||
return(oldest);
|
||||
}
|
||||
|
||||
VOID PsDispatchThread(VOID)
|
||||
{
|
||||
KPRIORITY CurrentPriority;
|
||||
PETHREAD Candidate;
|
||||
KIRQL irql;
|
||||
LARGE_INTEGER TickCount;
|
||||
|
||||
KeAcquireSpinLock(&ThreadListLock,&irql);
|
||||
|
||||
if (!DoneInitYet)
|
||||
{
|
||||
|
@ -121,60 +117,123 @@ void PsDispatchThread(void)
|
|||
|
||||
DPRINT("PsDispatchThread() Current %x\n",CurrentThread);
|
||||
|
||||
/*
|
||||
* Bump overselves up to a higher IRQ level during this
|
||||
*/
|
||||
KeAcquireSpinLock(&ThreadListLock,&irql);
|
||||
|
||||
/*
|
||||
* If this was an involuntary reschedule then the current thread will still
|
||||
* be eligible to run later
|
||||
*/
|
||||
if (CurrentThread->Tcb.ThreadState==THREAD_STATE_RUNNING)
|
||||
{
|
||||
CurrentThread->Tcb.ThreadState=THREAD_STATE_RUNNABLE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Simple round robin algorithm, iterate through and dispatch the first
|
||||
* runnable thread
|
||||
*/
|
||||
current = CONTAINING_RECORD(ThreadListHead.Flink,KTHREAD,Entry);
|
||||
current_entry = ThreadListHead.Flink;
|
||||
|
||||
while (current_entry!=(&ThreadListHead))
|
||||
for (CurrentPriority=THREAD_PRIORITY_TIME_CRITICAL;
|
||||
CurrentPriority>=THREAD_PRIORITY_IDLE;
|
||||
CurrentPriority--)
|
||||
{
|
||||
DPRINT("Scanning %x ",current);
|
||||
DPRINT("State %x Runnable %x\n",current->ThreadState,
|
||||
THREAD_STATE_RUNNABLE);
|
||||
if (current->ThreadState == THREAD_STATE_RUNNABLE &&
|
||||
current != (PKTHREAD)CurrentThread)
|
||||
Candidate = PsScanThreadList(CurrentPriority);
|
||||
if (Candidate == CurrentThread)
|
||||
{
|
||||
DPRINT("Scheduling this one %x\n",current);
|
||||
CurrentThread = current;
|
||||
DPRINT("Scheduling current thread\n");
|
||||
KeQueryTickCount(&TickCount);
|
||||
CurrentThread->Tcb.LastTick = TickCount.LowPart;
|
||||
CurrentThread->Tcb.ThreadState = THREAD_STATE_RUNNING;
|
||||
KeReleaseSpinLock(&ThreadListLock,irql);
|
||||
HalTaskSwitch(current);
|
||||
return;
|
||||
}
|
||||
current_entry = current->Entry.Flink;
|
||||
current = CONTAINING_RECORD(current_entry,KTHREAD,Entry);
|
||||
}
|
||||
|
||||
/*
|
||||
* If there are no other threads then continue with the current one if
|
||||
* possible
|
||||
*/
|
||||
if (CurrentThread->Tcb.ThreadState == THREAD_STATE_RUNNABLE)
|
||||
if (Candidate != NULL)
|
||||
{
|
||||
DPRINT("Scheduling %x\n",Candidate);
|
||||
|
||||
Candidate->Tcb.ThreadState = THREAD_STATE_RUNNING;
|
||||
|
||||
KeQueryTickCount(&TickCount);
|
||||
CurrentThread->Tcb.LastTick = TickCount.LowPart;
|
||||
|
||||
CurrentThread = Candidate;
|
||||
|
||||
KeReleaseSpinLock(&ThreadListLock,irql);
|
||||
KeLowerIrql(PASSIVE_LEVEL);
|
||||
HalTaskSwitch(&CurrentThread->Tcb);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Disaster
|
||||
*/
|
||||
printk("Out of threads at %s:%d\n",__FILE__,__LINE__);
|
||||
for(;;);
|
||||
NTSTATUS PsInitializeThread(HANDLE ProcessHandle,
|
||||
PETHREAD* ThreadPtr,
|
||||
PHANDLE ThreadHandle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ThreadAttributes)
|
||||
{
|
||||
ULONG ThreadId;
|
||||
ULONG ProcessId;
|
||||
PETHREAD Thread;
|
||||
NTSTATUS Status;
|
||||
|
||||
Thread = ObGenericCreateObject(ThreadHandle,
|
||||
DesiredAccess,
|
||||
ThreadAttributes,
|
||||
PsThreadType);
|
||||
DPRINT("Thread = %x\n",Thread);
|
||||
Thread->Tcb.LastTick = 0;
|
||||
Thread->Tcb.ThreadState=THREAD_STATE_SUSPENDED;
|
||||
Thread->Tcb.BasePriority=THREAD_PRIORITY_NORMAL;
|
||||
Thread->Tcb.CurrentPriority=THREAD_PRIORITY_NORMAL;
|
||||
Thread->Tcb.ApcList=ExAllocatePool(NonPagedPool,sizeof(LIST_ENTRY));
|
||||
Thread->Tcb.SuspendCount = 1;
|
||||
if (ProcessHandle!=NULL)
|
||||
{
|
||||
Status = ObReferenceObjectByHandle(ProcessHandle,
|
||||
PROCESS_CREATE_THREAD,
|
||||
PsProcessType,
|
||||
UserMode,
|
||||
(PVOID*)&Thread->ThreadsProcess,
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Thread->ThreadsProcess=SystemProcess;
|
||||
}
|
||||
InitializeListHead(Thread->Tcb.ApcList);
|
||||
InitializeListHead(&(Thread->IrpList));
|
||||
Thread->Cid.UniqueThread=NextThreadUniqueId++;
|
||||
// thread->Cid.ThreadId=InterlockedIncrement(&NextThreadUniqueId);
|
||||
PsInsertIntoThreadList(Thread->Tcb.CurrentPriority,Thread);
|
||||
|
||||
*ThreadPtr = Thread;
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
VOID PsResumeThread(PETHREAD Thread)
|
||||
{
|
||||
DPRINT("PsResumeThread(Thread %x)\n",Thread);
|
||||
|
||||
Thread->Tcb.SuspendCount--;
|
||||
DPRINT("Thread->Tcb.SuspendCount %d\n",Thread->Tcb.SuspendCount);
|
||||
DPRINT("Thread->Tcb.ThreadState %d THREAD_STATE_RUNNING %d\n",
|
||||
Thread->Tcb.ThreadState,THREAD_STATE_RUNNING);
|
||||
if (Thread->Tcb.SuspendCount <= 0 &&
|
||||
Thread->Tcb.ThreadState != THREAD_STATE_RUNNING)
|
||||
{
|
||||
DPRINT("Setting thread to runnable\n");
|
||||
Thread->Tcb.ThreadState = THREAD_STATE_RUNNABLE;
|
||||
}
|
||||
DPRINT("Finished PsResumeThread()\n");
|
||||
}
|
||||
|
||||
VOID PsSuspendThread(PETHREAD Thread)
|
||||
{
|
||||
DPRINT("PsSuspendThread(Thread %x)\n",Thread);
|
||||
Thread->Tcb.SuspendCount++;
|
||||
if (Thread->Tcb.SuspendCount > 0)
|
||||
{
|
||||
Thread->Tcb.ThreadState = THREAD_STATE_SUSPENDED;
|
||||
if (Thread == CurrentThread)
|
||||
{
|
||||
PsDispatchThread();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PsInitThreadManagment(void)
|
||||
|
@ -182,67 +241,50 @@ void PsInitThreadManagment(void)
|
|||
* FUNCTION: Initialize thread managment
|
||||
*/
|
||||
{
|
||||
PETHREAD first_thread;
|
||||
PETHREAD FirstThread;
|
||||
ULONG i;
|
||||
ANSI_STRING AnsiString;
|
||||
HANDLE FirstThreadHandle;
|
||||
|
||||
InitializeListHead(&ThreadListHead);
|
||||
KeInitializeSpinLock(&ThreadListLock);
|
||||
for (i=0; i<NR_THREAD_PRIORITY_LEVELS; i++)
|
||||
{
|
||||
InitializeListHead(&PriorityListHead[i]);
|
||||
}
|
||||
|
||||
ObRegisterType(OBJTYP_THREAD,&ThreadObjectType);
|
||||
PsThreadType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
||||
|
||||
first_thread = ExAllocatePool(NonPagedPool,sizeof(ETHREAD));
|
||||
first_thread->Tcb.ThreadState = THREAD_STATE_RUNNING;
|
||||
HalInitFirstTask((PKTHREAD)first_thread);
|
||||
ExInterlockedInsertHeadList(&ThreadListHead,&first_thread->Tcb.Entry,
|
||||
&ThreadListLock);
|
||||
CurrentThread = first_thread;
|
||||
RtlInitAnsiString(&AnsiString,"Thread");
|
||||
RtlAnsiStringToUnicodeString(&PsThreadType->TypeName,&AnsiString,TRUE);
|
||||
|
||||
PsThreadType->TotalObjects = 0;
|
||||
PsThreadType->TotalHandles = 0;
|
||||
PsThreadType->MaxObjects = 0;
|
||||
PsThreadType->MaxHandles = 0;
|
||||
PsThreadType->PagedPoolCharge = 0;
|
||||
PsThreadType->NonpagedPoolCharge = sizeof(ETHREAD);
|
||||
PsThreadType->Dump = NULL;
|
||||
PsThreadType->Open = NULL;
|
||||
PsThreadType->Close = NULL;
|
||||
PsThreadType->Delete = NULL;
|
||||
PsThreadType->Parse = NULL;
|
||||
PsThreadType->Security = NULL;
|
||||
PsThreadType->QueryName = NULL;
|
||||
PsThreadType->OkayToClose = NULL;
|
||||
|
||||
PsInitializeThread(NULL,&FirstThread,&FirstThreadHandle,
|
||||
THREAD_ALL_ACCESS,NULL);
|
||||
HalInitFirstTask(FirstThread);
|
||||
FirstThread->Tcb.ThreadState = THREAD_STATE_RUNNING;
|
||||
FirstThread->Tcb.SuspendCount = 0;
|
||||
|
||||
DPRINT("FirstThread %x\n",FirstThread);
|
||||
|
||||
CurrentThread = FirstThread;
|
||||
|
||||
DoneInitYet = TRUE;
|
||||
}
|
||||
|
||||
NTSTATUS PsWakeThread(PETHREAD Thread)
|
||||
{
|
||||
Thread->Tcb.ThreadState = THREAD_STATE_RUNNABLE;
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS PsSuspendThread(VOID)
|
||||
/*
|
||||
* FUNCTION: Suspend the current thread
|
||||
*/
|
||||
{
|
||||
KIRQL oldlvl;
|
||||
|
||||
DPRINT("suspending %x\n",CurrentThread);
|
||||
|
||||
/*
|
||||
* NOTE: When we return from PsDispatchThread the spinlock will be
|
||||
* released
|
||||
*/
|
||||
CurrentThread->Tcb.ThreadState = THREAD_STATE_SUSPENDED;
|
||||
PsDispatchThread();
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
|
||||
NTSTATUS PsTerminateSystemThread(NTSTATUS ExitStatus)
|
||||
/*
|
||||
* FUNCTION: Terminates the current thread
|
||||
* ARGUMENTS:
|
||||
* ExitStatus = Status to pass to the creater
|
||||
* RETURNS: Doesn't
|
||||
*/
|
||||
{
|
||||
KIRQL oldlvl;
|
||||
|
||||
DPRINT("terminating %x\n",CurrentThread);
|
||||
KeRaiseIrql(DISPATCH_LEVEL,&oldlvl);
|
||||
CurrentThread->Tcb.ThreadState = THREAD_STATE_TERMINATED;
|
||||
RemoveEntryList(&CurrentThread->Tcb.Entry);
|
||||
PsDispatchThread();
|
||||
for(;;);
|
||||
}
|
||||
|
||||
NTSTATUS NtCreateThread(PHANDLE ThreadHandle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
|
@ -252,6 +294,50 @@ NTSTATUS NtCreateThread(PHANDLE ThreadHandle,
|
|||
PINITIAL_TEB InitialTeb,
|
||||
BOOLEAN CreateSuspended)
|
||||
{
|
||||
return(ZwCreateThread(ThreadHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes,
|
||||
ProcessHandle,
|
||||
Client,
|
||||
ThreadContext,
|
||||
InitialTeb,
|
||||
CreateSuspended));
|
||||
}
|
||||
|
||||
NTSTATUS ZwCreateThread(PHANDLE ThreadHandle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
HANDLE ProcessHandle,
|
||||
PCLIENT_ID Client,
|
||||
PCONTEXT ThreadContext,
|
||||
PINITIAL_TEB InitialTeb,
|
||||
BOOLEAN CreateSuspended)
|
||||
{
|
||||
PETHREAD Thread;
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = PsInitializeThread(ProcessHandle,&Thread,ThreadHandle,
|
||||
DesiredAccess,ObjectAttributes);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
HalInitTaskWithContext(Thread,ThreadContext);
|
||||
Thread->StartAddress=NULL;
|
||||
|
||||
if (Client!=NULL)
|
||||
{
|
||||
*Client=Thread->Cid;
|
||||
}
|
||||
|
||||
if (!CreateSuspended)
|
||||
{
|
||||
DPRINT("Not creating suspended\n");
|
||||
PsResumeThread(Thread);
|
||||
}
|
||||
DPRINT("Finished PsCreateThread()\n");
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS PsCreateSystemThread(PHANDLE ThreadHandle,
|
||||
|
@ -278,40 +364,29 @@ NTSTATUS PsCreateSystemThread(PHANDLE ThreadHandle,
|
|||
* RETURNS: Success or failure status
|
||||
*/
|
||||
{
|
||||
PETHREAD thread;
|
||||
ULONG ThreadId;
|
||||
ULONG ProcessId;
|
||||
PETHREAD Thread;
|
||||
NTSTATUS Status;
|
||||
|
||||
thread = ObGenericCreateObject(ThreadHandle,0,NULL,OBJTYP_THREAD);
|
||||
DPRINT("Allocating thread %x\n",thread);
|
||||
DPRINT("PsCreateSystemThread(ThreadHandle %x, ProcessHandle %x)\n",
|
||||
ThreadHandle,ProcessHandle);
|
||||
|
||||
Status = PsInitializeThread(ProcessHandle,&Thread,ThreadHandle,
|
||||
DesiredAccess,ObjectAttributes);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
Thread->StartAddress=StartRoutine;
|
||||
HalInitTask(Thread,StartRoutine,StartContext);
|
||||
|
||||
thread->Tcb.ThreadState=THREAD_STATE_RUNNABLE;
|
||||
thread->Tcb.BasePriority=0;
|
||||
thread->Tcb.CurrentPriority=0;
|
||||
thread->Tcb.ApcList=ExAllocatePool(NonPagedPool,sizeof(LIST_ENTRY));
|
||||
InitializeListHead(thread->Tcb.ApcList);
|
||||
HalInitTask(&(thread->Tcb),StartRoutine,StartContext);
|
||||
InitializeListHead(&(thread->IrpList));
|
||||
thread->Cid.UniqueThread=NextThreadUniqueId++;
|
||||
// thread->Cid.ThreadId=InterlockedIncrement(&NextThreadUniqueId);
|
||||
if (ClientId!=NULL)
|
||||
{
|
||||
*ClientId=thread->Cid;
|
||||
*ClientId=Thread->Cid;
|
||||
}
|
||||
|
||||
if (ProcessHandle!=NULL)
|
||||
{
|
||||
thread->ThreadsProcess=ObGetObjectByHandle(ProcessHandle);
|
||||
}
|
||||
else
|
||||
{
|
||||
thread->ThreadsProcess=&SystemProcess;
|
||||
}
|
||||
thread->StartAddress=StartRoutine;
|
||||
PsResumeThread(Thread);
|
||||
|
||||
|
||||
ExInterlockedInsertHeadList(&ThreadListHead,&thread->Tcb.Entry,
|
||||
&ThreadListLock);
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
@ -321,6 +396,191 @@ LONG KeSetBasePriorityThread(PKTHREAD Thread, LONG Increment)
|
|||
}
|
||||
|
||||
KPRIORITY KeSetPriorityThread(PKTHREAD Thread, KPRIORITY Priority)
|
||||
{
|
||||
KPRIORITY OldPriority;
|
||||
OldPriority = Thread->CurrentPriority;
|
||||
Thread->CurrentPriority = Priority;
|
||||
|
||||
RemoveEntryList(&Thread->Entry);
|
||||
PsInsertIntoThreadList(Thread->CurrentPriority,
|
||||
CONTAINING_RECORD(Thread,ETHREAD,Tcb));
|
||||
|
||||
return(OldPriority);
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtAlertResumeThread(IN HANDLE ThreadHandle,
|
||||
OUT PULONG SuspendCount)
|
||||
{
|
||||
return(ZwAlertResumeThread(ThreadHandle,SuspendCount));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwAlertResumeThread(IN HANDLE ThreadHandle,
|
||||
OUT PULONG SuspendCount)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtAlertThread(IN HANDLE ThreadHandle)
|
||||
{
|
||||
return(ZwAlertThread(ThreadHandle));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwAlertThread(IN HANDLE ThreadHandle)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtGetContextThread(IN HANDLE ThreadHandle,
|
||||
OUT PCONTEXT Context)
|
||||
{
|
||||
return(ZwGetContextThread(ThreadHandle,Context));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwGetContextThread(IN HANDLE ThreadHandle,
|
||||
OUT PCONTEXT Context)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtOpenThread(OUT PHANDLE ThreadHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
IN PCLIENT_ID ClientId)
|
||||
{
|
||||
return(ZwOpenThread(ThreadHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes,
|
||||
ClientId));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwOpenThread(OUT PHANDLE ThreadHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
IN PCLIENT_ID ClientId)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtResumeThread(IN HANDLE ThreadHandle,
|
||||
IN PULONG SuspendCount)
|
||||
{
|
||||
return(ZwResumeThread(ThreadHandle,SuspendCount));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwResumeThread(IN HANDLE ThreadHandle,
|
||||
IN PULONG SuspendCount)
|
||||
/*
|
||||
* FUNCTION: Decrements a thread's resume count
|
||||
* ARGUMENTS:
|
||||
* ThreadHandle = Handle to the thread that should be resumed
|
||||
* ResumeCount = The resulting resume count.
|
||||
* REMARK:
|
||||
* A thread is resumed if its suspend count is 0. This procedure maps to
|
||||
* the win32 ResumeThread function. ( documentation about the the suspend count can be found here aswell )
|
||||
* RETURNS: Status
|
||||
*/
|
||||
{
|
||||
PETHREAD Thread;
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = ObReferenceObjectByHandle(ThreadHandle,
|
||||
THREAD_SUSPEND_RESUME,
|
||||
PsThreadType,
|
||||
UserMode,
|
||||
(PVOID*)&Thread,
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
(*SuspendCount) = InterlockedDecrement(&Thread->Tcb.SuspendCount);
|
||||
if (Thread->Tcb.SuspendCount <= 0)
|
||||
{
|
||||
Thread->Tcb.ThreadState = THREAD_STATE_RUNNABLE;
|
||||
}
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtSetContextThread(IN HANDLE ThreadHandle,
|
||||
IN PCONTEXT Context)
|
||||
{
|
||||
return(ZwSetContextThread(ThreadHandle,Context));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwSetContextThread(IN HANDLE ThreadHandle,
|
||||
IN PCONTEXT Context)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtSuspendThread(IN HANDLE ThreadHandle,
|
||||
IN PULONG PreviousSuspendCount)
|
||||
{
|
||||
return(ZwSuspendThread(ThreadHandle,PreviousSuspendCount));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwSuspendThread(IN HANDLE ThreadHandle,
|
||||
IN PULONG PreviousSuspendCount)
|
||||
/*
|
||||
* FUNCTION: Increments a thread's suspend count
|
||||
* ARGUMENTS:
|
||||
* ThreadHandle = Handle to the thread that should be resumed
|
||||
* PreviousSuspendCount = The resulting/previous suspend count.
|
||||
* REMARK:
|
||||
* A thread will be suspended if its suspend count is greater than 0.
|
||||
* This procedure maps to the win32 SuspendThread function. (
|
||||
* documentation about the the suspend count can be found here aswell )
|
||||
* The suspend count is not increased if it is greater than
|
||||
* MAXIMUM_SUSPEND_COUNT.
|
||||
* RETURNS: Status
|
||||
*/
|
||||
{
|
||||
PETHREAD Thread;
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = ObReferenceObjectByHandle(ThreadHandle,
|
||||
THREAD_SUSPEND_RESUME,
|
||||
PsThreadType,
|
||||
UserMode,
|
||||
(PVOID*)&Thread,
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
(*PreviousSuspendCount) = InterlockedIncrement(&Thread->Tcb.SuspendCount);
|
||||
if (Thread->Tcb.SuspendCount > 0)
|
||||
{
|
||||
Thread->Tcb.ThreadState = THREAD_STATE_SUSPENDED;
|
||||
if (Thread == PsGetCurrentThread())
|
||||
{
|
||||
PsDispatchThread();
|
||||
}
|
||||
}
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtContinue(IN PCONTEXT Context, IN CINT IrqLevel)
|
||||
{
|
||||
return(ZwContinue(Context,IrqLevel));
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwContinue(IN PCONTEXT Context, IN CINT IrqLevel)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtYieldExecution(VOID)
|
||||
{
|
||||
return(ZwYieldExecution());
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL ZwYieldExecution(VOID)
|
||||
{
|
||||
PsDispatchThread();
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
|
|
@ -1,23 +1,21 @@
|
|||
bits 32
|
||||
section .text
|
||||
|
||||
global _InterlockedIncrement
|
||||
_InterlockedIncrement
|
||||
DECLARE_GLOBAL_SYMBOL InterlockedIncrement
|
||||
mov eax,1
|
||||
mov ebx,[esp+4]
|
||||
xadd [ebx],eax
|
||||
ret
|
||||
|
||||
global _InterlockedDecrement
|
||||
_InterlockedDecrement:
|
||||
|
||||
DECLARE_GLOBAL_SYMBOL InterlockedDecrement
|
||||
mov eax,0xffffffff
|
||||
mov ebx,[esp+4]
|
||||
xadd [ebx],eax
|
||||
dec eax
|
||||
ret
|
||||
|
||||
global _InterlockedExchange
|
||||
_InterlockedExchange:
|
||||
DECLARE_GLOBAL_SYMBOL InterlockedExchange
|
||||
push ebp
|
||||
mov ebp,esp
|
||||
|
||||
|
@ -35,15 +33,13 @@ _InterlockedExchange:
|
|||
pop ebp
|
||||
ret
|
||||
|
||||
global _InterlockedExchangeAdd
|
||||
_InterlockedExchangeAdd:
|
||||
DECLARE_GLOBAL_SYMBOL InterlockedExchangeAdd
|
||||
mov eax,[esp+8]
|
||||
mov ebx,[esp+4]
|
||||
xadd [ebx],eax
|
||||
ret
|
||||
|
||||
global _InterlockedCompareExchange
|
||||
_InterlockedCompareExchange:
|
||||
DECLARE_GLOBAL_SYMBOL InterlockedCompareExchange
|
||||
mov eax,[esp+12]
|
||||
mov edx,[esp+8]
|
||||
mov ebx,[esp+4]
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
#define Aa_Difference 'A'-'a';
|
||||
#define Aa_Difference ('A'-'a')
|
||||
|
||||
PUNICODE_STRING RtlDuplicateUnicodeString(PUNICODE_STRING Dest,
|
||||
PUNICODE_STRING Src)
|
||||
|
@ -40,12 +40,19 @@ WCHAR wtoupper(WCHAR c)
|
|||
{
|
||||
if((c>='a') && (c<='z')) return c+Aa_Difference;
|
||||
return c;
|
||||
};
|
||||
}
|
||||
|
||||
WCHAR wtolower(WCHAR c)
|
||||
{
|
||||
// DPRINT("c %c (c-Aa_Difference) %c\n",(char)c,(char)(c-Aa_Difference));
|
||||
if((c>='A') && (c<='Z')) return c-Aa_Difference;
|
||||
return c;
|
||||
}
|
||||
|
||||
ULONG RtlAnsiStringToUnicodeSize(IN PANSI_STRING AnsiString)
|
||||
{
|
||||
return AnsiString->Length*2;
|
||||
};
|
||||
}
|
||||
|
||||
NTSTATUS RtlAnsiStringToUnicodeString(IN OUT PUNICODE_STRING DestinationString,
|
||||
IN PANSI_STRING SourceString, IN BOOLEAN AllocateDestinationString)
|
||||
|
|
|
@ -17,6 +17,39 @@
|
|||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
wchar_t * wcsncat(wchar_t * dest,const wchar_t * src,size_t count)
|
||||
{
|
||||
int i,j;
|
||||
|
||||
for (j=0;dest[j]!=0;j++);
|
||||
for (i=0;i<count;i++)
|
||||
{
|
||||
dest[j+i] = src[i];
|
||||
if (src[i] == 0)
|
||||
{
|
||||
return(dest);
|
||||
}
|
||||
}
|
||||
dest[j+i]=0;
|
||||
return(dest);
|
||||
}
|
||||
|
||||
wchar_t * wcsncpy(wchar_t * dest,const wchar_t *src,size_t count)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0;i<count;i++)
|
||||
{
|
||||
dest[i] = src[i];
|
||||
if (src[i] == 0)
|
||||
{
|
||||
return(dest);
|
||||
}
|
||||
}
|
||||
dest[i]=0;
|
||||
return(dest);
|
||||
}
|
||||
|
||||
wchar_t* wcsrchr(const wchar_t* str, wchar_t ch)
|
||||
{
|
||||
unsigned int len = 0;
|
||||
|
|
|
@ -16,6 +16,133 @@
|
|||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
||||
NTSTATUS STDCALL NtQueryInformationToken(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtQuerySecurityObject(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtSetSecurityObject(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtSetInformationToken(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtPrivilegeCheck(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtPrivilegedServiceAuditAlarm(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtPrivilegeObjectAuditAlarm(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtOpenObjectAuditAlarm(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtOpenProcessToken(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtOpenThreadToken(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtDuplicateToken(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtImpersonateClientOfPort(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtImpersonateThread(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtCreateToken(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtDeleteObjectAuditAlarm(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
NtAllocateLocallyUniqueId(
|
||||
OUT PVOID LocallyUniqueId
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
ZwAllocateLocallyUniqueId(
|
||||
OUT PVOID LocallyUniqueId
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtAccessCheckAndAuditAlarm(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtAdjustGroupsToken(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtAdjustPrivilegesToken(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtAllocateUuids(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL NtCloseObjectAuditAlarm(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
NtAccessCheck(
|
||||
IN PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||
IN HANDLE ClientToken,
|
||||
IN ULONG DesiredAcces,
|
||||
IN PGENERIC_MAPPING GenericMapping,
|
||||
OUT PRIVILEGE_SET PrivilegeSet,
|
||||
OUT PULONG ReturnLength,
|
||||
OUT PULONG GrantedAccess,
|
||||
OUT PULONG AccessStatus
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
ZwAccessCheck(
|
||||
IN PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||
IN HANDLE ClientToken,
|
||||
IN ULONG DesiredAcces,
|
||||
IN PGENERIC_MAPPING GenericMapping,
|
||||
OUT PRIVILEGE_SET PrivilegeSet,
|
||||
OUT PULONG ReturnLength,
|
||||
OUT PULONG GrantedAccess,
|
||||
OUT PULONG AccessStatus
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS RtlCreateSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||
ULONG Revision)
|
||||
{
|
||||
|
|
|
@ -26,12 +26,13 @@ static HANDLE KeyboardHandle = NULL;
|
|||
static unsigned char TstReadLineReadChar(VOID)
|
||||
{
|
||||
KEY_EVENT_RECORD key[2];
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
|
||||
ZwReadFile(KeyboardHandle,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&IoStatusBlock,
|
||||
&key[0],
|
||||
sizeof(KEY_EVENT_RECORD)*2,
|
||||
0,
|
||||
|
@ -49,7 +50,6 @@ VOID TstReadLine(ULONG Length, PCHAR Buffer)
|
|||
for (i=0;i<Length;i++)
|
||||
{
|
||||
tmp = TstReadLineReadChar();
|
||||
DbgPrint("%c",tmp);
|
||||
// DbgPrint("%x %x ",tmp,'\n');
|
||||
switch (tmp)
|
||||
{
|
||||
|
@ -59,6 +59,7 @@ VOID TstReadLine(ULONG Length, PCHAR Buffer)
|
|||
return;
|
||||
|
||||
default:
|
||||
DbgPrint("%c",tmp);
|
||||
*current = tmp;
|
||||
current++;
|
||||
}
|
||||
|
@ -79,7 +80,12 @@ VOID TstReadLineInit(VOID)
|
|||
RtlInitAnsiString(&afilename,"\\Device\\Keyboard");
|
||||
RtlAnsiStringToUnicodeString(&ufilename,&afilename,TRUE);
|
||||
InitializeObjectAttributes(&attr,&ufilename,0,NULL,NULL);
|
||||
ZwOpenFile(&KeyboardHandle,0,&attr,NULL,0,0);
|
||||
ZwOpenFile(&KeyboardHandle,
|
||||
FILE_GENERIC_READ,
|
||||
&attr,
|
||||
NULL,
|
||||
0,
|
||||
FILE_SYNCHRONOUS_IO_NONALERT);
|
||||
if (KeyboardHandle==NULL)
|
||||
{
|
||||
DbgPrint("Failed to open keyboard\n");
|
||||
|
|
|
@ -14,8 +14,9 @@
|
|||
#include <ddk/ntddk.h>
|
||||
#include <internal/kernel.h>
|
||||
#include <internal/string.h>
|
||||
#include <internal/ctype.h>
|
||||
|
||||
#define NDEBUG
|
||||
//#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
int ShellChangeDir(char* args);
|
||||
|
@ -27,6 +28,7 @@ VOID TstReadLine(ULONG Length, PCHAR Buffer);
|
|||
|
||||
static HANDLE CurrentDirHandle = NULL;
|
||||
static UNICODE_STRING CurrentDirName = {NULL,0,0};
|
||||
static char current_dir_name[255] = {0,};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
@ -43,8 +45,38 @@ command commands[]=
|
|||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
char* eat_white_space(char* s)
|
||||
{
|
||||
while (isspace(*s))
|
||||
{
|
||||
s++;
|
||||
}
|
||||
return(s);
|
||||
}
|
||||
|
||||
int ShellChangeDir(char* args)
|
||||
{
|
||||
char* end;
|
||||
ANSI_STRING astr;
|
||||
OBJECT_ATTRIBUTES attr;
|
||||
|
||||
DPRINT("ShellChangeDir(args %s)\n",args);
|
||||
|
||||
args = eat_white_space(args);
|
||||
end = strchr(args,' ');
|
||||
if (end!=NULL)
|
||||
{
|
||||
*end=0;
|
||||
}
|
||||
strcat(current_dir_name,args);
|
||||
|
||||
DPRINT("current_dir_name %s\n",current_dir_name);
|
||||
|
||||
RtlInitAnsiString(&astr,current_dir_name);
|
||||
RtlAnsiStringToUnicodeString(&CurrentDirName,&astr,TRUE);
|
||||
InitializeObjectAttributes(&attr,&CurrentDirName,0,NULL,NULL);
|
||||
ZwClose(CurrentDirHandle);
|
||||
ZwOpenDirectoryObject(&CurrentDirHandle,0,&attr);
|
||||
}
|
||||
|
||||
int ShellListDir(char* args)
|
||||
|
@ -54,6 +86,8 @@ int ShellListDir(char* args)
|
|||
ULONG Length;
|
||||
ULONG i;
|
||||
|
||||
DbgPrint("ShellListDir(args %s)\n",args);
|
||||
|
||||
ZwQueryDirectoryObject(CurrentDirHandle,
|
||||
&(DirObj[0]),
|
||||
sizeof(DirObj),
|
||||
|
@ -76,13 +110,18 @@ VOID ShellDisplayPrompt()
|
|||
VOID ShellProcessCommand(char* cmd)
|
||||
{
|
||||
unsigned int i=0;
|
||||
DbgPrint("Processing cmd '%s'\n",cmd);
|
||||
while (commands[i].name!=NULL)
|
||||
{
|
||||
DbgPrint("Scanning %s i %d\n",commands[i].name,i);
|
||||
if (strncmp(cmd,commands[i].name,strlen(commands[i].name))==0)
|
||||
{
|
||||
commands[i].fn(cmd+strlen(commands[i].name));
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
DbgPrint("Unknown command\n");
|
||||
}
|
||||
|
||||
NTSTATUS TstShell(VOID)
|
||||
|
@ -96,6 +135,7 @@ NTSTATUS TstShell(VOID)
|
|||
|
||||
RtlInitAnsiString(&astr,"\\");
|
||||
RtlAnsiStringToUnicodeString(&CurrentDirName,&astr,TRUE);
|
||||
strcpy(current_dir_name,"\\");
|
||||
|
||||
RtlInitAnsiString(&afilename,"\\");
|
||||
RtlAnsiStringToUnicodeString(&ufilename,&afilename,TRUE);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue