which included commits to RCS files with non-trunk default branches.
svn path=/trunk/; revision=53
-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
IoInitializeTimer
IoStartTimer
IoStopTimer
-
-Partially implemented
-
IoCreateDevice
IoCallDriver
#define NDEBUG
#include <internal/debug.h>
-#include "minix_fs.h"
+#include "minix.h"
/* FUNCTIONS ***************************************************************/
DPRINT("MinixReadSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n",
pDeviceObject,DiskSector,Buffer);
+ sectorNumber.HighPart = 0;
sectorNumber.LowPart = DiskSector * BLOCKSIZE;
KeInitializeEvent(&event, NotificationEvent, FALSE);
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;
+}
-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
#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;
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;
*/
typedef float FLOAT;
/* typedef GLOBALHANDLE; */
-typedef void *HANDLE;
typedef HANDLE HACCEL;
typedef HANDLE HBITMAP;
typedef HANDLE HBRUSH;
typedef DWORD LCID;
typedef DWORD LCTYPE;
/* typedef LOCALHANDLE */
-typedef double LONGLONG, *PLONGLONG;
typedef unsigned short *LP;
typedef long LPARAM;
typedef WINBOOL *LPBOOL;
typedef CHAR *LPCH;
typedef COLORREF *LPCOLORREF;
typedef const char *LPCSTR;
-typedef char* PCSZ;
#ifdef UNICODE
typedef const unsigned short *LPCTSTR;
/* 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;
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;
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
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
RASP_PppIpx = 0x802B,
RASP_PppIp = 0x8021
} RASPROJECTION ;
-
-typedef enum _SECURITY_IMPERSONATION_LEVEL {
- SecurityAnonymous,
- SecurityIdentification,
- SecurityImpersonation,
- SecurityDelegation
-} SECURITY_IMPERSONATION_LEVEL;
-
+
typedef enum _SID_NAME_USE {
SidTypeUser = 1,
SidTypeGroup,
TokenImpersonationLevel,
TokenStatistics
} TOKEN_INFORMATION_CLASS;
-
-typedef enum tagTOKEN_TYPE {
- TokenPrimary = 1,
- TokenImpersonation
-} TOKEN_TYPE;
-
+
#endif /* ! defined (RC_INVOKED) */
/*
#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))
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);
#endif /* ! defined (RC_INVOKED) */
+#endif /* WIN32_LEAN_AND_MEAN */
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
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);
+
+
*/
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,
};
/*
*/
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
/*
* 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,
-
- /*
- * Values beyond this are reserved for ISVs
- */
- FILE_DEVICE_FIRST_FREE = 32768
-};
+#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
+#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
*/
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
/* IO MANAGER ***************************************************************/
+BOOLEAN IoRaiseInformationalHardError(NTSTATUS ErrorStatus,
+ PUNICODE_STRING String,
+ PKTHREAD Thread);
+
+
/*
* FUNCTION: Registers the driver with WMI
* ARGUMENTS:
ULONG NumberOfHeads,
struct _DRIVE_LAYOUT_INFORMATION* PBuffer);
-typedef ULONG FS_INFORMATION_CLASS;
// Preliminary guess
NTKERNELAPI NTSTATUS IoQueryFileVolumeInformation(IN PFILE_OBJECT FileObject,
*/
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 */
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
{
/* 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
#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>
#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>
#include <ddk/psfuncs.h>
#include <ddk/obfuncs.h>
#include <ddk/dbgfuncs.h>
-
+#include <ddk/sefuncs.h>
+
#ifdef __cplusplus
};
#endif
struct _EPROCESS;
#define NTKERNELAPI
+#define NTSYSAPI
+#define NTAPI
+
#endif
* ARGUMENTS:
* Object = Object's body
*/
-VOID ObDeferenceObject(PVOID Object);
+VOID ObDereferenceObject(PVOID Object);
/*
* FUNCTION: Performs access validation on an object handle and if access
* 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
- */
- ULONG RefCount;
-
- /*
- * PURPOSE: Number of handles opened to this object
- */
- ULONG HandleCount;
-
- struct _DIRECTORY_OBJECT* Parent;
+ UNICODE_STRING Name;
+ LIST_ENTRY Entry;
+ ULONG RefCount;
+ ULONG HandleCount;
+ BOOLEAN Permanent;
+ struct _DIRECTORY_OBJECT* Parent;
+ POBJECT_TYPE ObjectType;
/*
* PURPOSE: Object type
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;
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);
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];
*/
hal_thread_state Context;
LIST_ENTRY Entry;
+ ULONG LastTick;
} KTHREAD, *PKTHREAD;
} ETHREAD, *PETHREAD;
-typedef struct _KPROCESS {
- DISPATCHER_HEADER DispatcherHeader;
- PVOID PageTableDirectory; // FIXME: I shoud point to a PTD
- TIME ElapsedTime;
- TIME KernelTime;
- TIME UserTime;
- LIST_ENTRY InOutSwap; // ??
- KSPIN_LOCK SpinLock;
- KAFFINITY Affinity;
- ULONG StackCount;
- KPRIORITY BasePriority;
- ULONG DefaultThreadQuantum;
- UCHAR ProcessState;
- ULONG ThreadSeed;
- UCHAR DisableBoost;
+typedef struct _KPROCESS
+{
+ DISPATCHER_HEADER DispatcherHeader;
+ PVOID PageTableDirectory; // FIXME: I shoud point to a PTD
+ TIME ElapsedTime;
+ TIME KernelTime;
+ TIME UserTime;
+ LIST_ENTRY InOutSwap; // ??
+ KSPIN_LOCK SpinLock;
+ KAFFINITY Affinity;
+ ULONG StackCount;
+ KPRIORITY BasePriority;
+ ULONG DefaultThreadQuantum;
+ UCHAR ProcessState;
+ ULONG ThreadSeed;
+ UCHAR DisableBoost;
/*
* Added by David Welch (welch@mcmail.com)
*/
LIST_ENTRY MemoryAreaList;
+ HANDLE_TABLE HandleTable;
} KPROCESS, *PKPROCESS;
typedef struct _EPROCESS
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;
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
* 13/07/98: Reorganised things a bit (David Welch)
* 04/08/98: Added some documentation (Boudewijn Dekker)
* 14/08/98: Added type TIME and change variable type from [1] to [0]
+ * 14/09/98: Added for each Nt call a corresponding Zw Call
*/
#ifndef __DDK_ZW_H
#include <windows.h>
-typedef struct _OBJDIR_INFORMATION {
- UNICODE_STRING ObjectName;
- UNICODE_STRING ObjectTypeName; // Directory, Device ...
- UCHAR Data[0];
-} OBJDIR_INFORMATION, *POBJDIR_INFORMATION;
-
-
-/*
- * FUNCTION: Closes an object handle
- * ARGUMENTS:
- * Handle = Handle to the object
- * RETURNS: Status
- */
-NTSTATUS ZwClose(HANDLE Handle);
-
-/*
- * FUNCTION: Creates or opens a directory object, which is a container for
- * other objects
- * ARGUMENTS:
- * DirectoryHandle (OUT) = Points to a variable which stores the
- * handle for the directory on success
- * DesiredAccess = Type of access the caller requires to the directory
- * ObjectAttributes = Structures specifing the object attributes,
- * initialized with InitializeObjectAttributes
- * RETURNS: Status
- */
-NTSTATUS ZwCreateDirectoryObject(PHANDLE DirectoryHandle,
- ACCESS_MASK DesiredAccess,
- POBJECT_ATTRIBUTES ObjectAttributes);
-
-/*
- * FUNCTION: Creates or opens a registry key
- * ARGUMENTS:
- * KeyHandle (OUT) = Points to a variable which stores the handle
- * for the key on success
- * DesiredAccess = Access desired by the caller to the key
- * ObjectAttributes = Initialized object attributes for the key
- * TitleIndex = Who knows?
- * Class = Object class of the key?
- * CreateOptions = Options for the key creation
- * Disposition (OUT) = Points to a variable which a status value
- * indicating whether a new key was created
- * RETURNS: Status
- */
-NTSTATUS ZwCreateKey(PHANDLE KeyHandle, ACCESS_MASK DesiredAccess,
- POBJECT_ATTRIBUTES ObjectAttributes,
- ULONG TitleIndex, PUNICODE_STRING Class,
- ULONG CreateOptions, PULONG Disposition);
-
-/*
- * FUNCTION: Deletes a registry key
- * ARGUMENTS:
- * KeyHandle = Handle of the key
- * RETURNS: Status
- */
-NTSTATUS ZwDeleteKey(HANDLE KeyHandle);
-
-/*
- * FUNCTION: Returns information about the subkeys of an open key
- * ARGUMENTS:
- * KeyHandle = Handle of the key whose subkeys are to enumerated
- * Index = zero based index of the subkey for which information is
- * request
- * KeyInformationClass = Type of information returned
- * KeyInformation (OUT) = Caller allocated buffer for the information
- * about the key
- * Length = Length in bytes of the KeyInformation buffer
- * ResultLength (OUT) = Caller allocated storage which holds
- * the number of bytes of information retrieved
- * on return
- * RETURNS: Status
- */
-NTSTATUS ZwEnumerateKey(HANDLE KeyHandle, ULONG Index,
- KEY_INFORMATION_CLASS KeyInformationClass,
- PVOID KeyInformation, ULONG Length,
- PULONG ResultLength);
-
-/*
- * FUNCTION: Returns information about the value entries of an open key
- * ARGUMENTS:
- * KeyHandle = Handle of the key whose value entries are to enumerated
- * Index = zero based index of the subkey for which information is
- * request
- * KeyInformationClass = Type of information returned
- * KeyInformation (OUT) = Caller allocated buffer for the information
- * about the key
- * Length = Length in bytes of the KeyInformation buffer
- * ResultLength (OUT) = Caller allocated storage which holds
- * the number of bytes of information retrieved
- * on return
- * RETURNS: Status
- */
-NTSTATUS ZwEnumerateValueKey(HANDLE KeyHandle, ULONG Index,
- KEY_VALUE_INFORMATION_CLASS KeyInformationClass,
- PVOID KeyInformation, ULONG Length,
- PULONG ResultLength);
-
-
-/*
- * FUNCTION: Forces a registry key to be committed to disk
- * ARGUMENTS:
- * KeyHandle = Handle of the key to be written to disk
- * RETURNS: Status
- */
-NTSTATUS ZwFlushKey(HANDLE KeyHandle);
-
-/*
- * FUNCTION: Changes the attributes of an object to temporary
- * ARGUMENTS:
- * Handle = Handle for the object
- * RETURNS: Status
- */
-NTSTATUS ZwMakeTemporaryObject(HANDLE Handle);
-
-/*
- * 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
- */
-NTSTATUS ZwMapViewOfSection(HANDLE SectionHandle,
- HANDLE ProcessHandle,
- PVOID* BaseAddress,
- ULONG ZeroBits,
- ULONG CommitSize,
- PLARGE_INTEGER SectionOffset,
- PULONG ViewSize,
- SECTION_INHERIT InheritDisposition,
- ULONG AllocationType,
- ULONG Protect);
-
-/*
- * FUNCTION: Opens an existing key in the registry
- * ARGUMENTS:
- * KeyHandle (OUT) = Caller supplied storage for the resulting handle
- * DesiredAccess = Requested access to the key
- * ObjectAttribute = Initialized attributes for the object
- * RETURNS: Status
- */
-NTSTATUS ZwOpenKey(PHANDLE KeyHandle, ACCESS_MASK DesiredAccess,
- POBJECT_ATTRIBUTES ObjectAttributes);
-
-/*
- * FUNCTION: Opens an existing section object
- * ARGUMENTS:
- * KeyHandle (OUT) = Caller supplied storage for the resulting handle
- * DesiredAccess = Requested access to the key
- * ObjectAttribute = Initialized attributes for the object
- * RETURNS: Status
- */
-NTSTATUS ZwOpenSection(PHANDLE KeyHandle, ACCESS_MASK DesiredAccess,
- POBJECT_ATTRIBUTES ObjectAttributes);
-
-NTSTATUS ZwQueryDirectoryObject(IN HANDLE DirObjHandle,
- OUT POBJDIR_INFORMATION DirObjInformation,
- IN ULONG BufferLength,
- IN BOOLEAN GetNextIndex,
- IN BOOLEAN IgnoreInputIndex,
- IN OUT PULONG ObjectIndex,
- OUT PULONG DataWritten OPTIONAL);
-
-/*
- * FUNCTION: Returns information about an open file
- * ARGUMENTS:
- * FileHandle = Handle of the file to be queried
- * IoStatusBlock (OUT) = Caller supplied storage for the result
- * FileInformation (OUT) = Caller supplied storage for the file
- * information
- * Length = Length in bytes of the buffer for file information
- * FileInformationClass = Type of information to be returned
- * RETURNS: Status
- */
-NTSTATUS ZwQueryInformationFile(HANDLE FileHandle,
- PIO_STATUS_BLOCK IoStatusBlock,
- PVOID FileInformation,
- ULONG Length,
- FILE_INFORMATION_CLASS FileInformationClass);
-
-
-
-NTSTATUS ZwReadFile(HANDLE FileHandle,
- HANDLE EventHandle,
- PIO_APC_ROUTINE ApcRoutine,
- PVOID ApcContext,
- PIO_STATUS_BLOCK IoStatusBlock,
- PVOID Buffer,
- ULONG Length,
- PLARGE_INTEGER ByteOffset,
- PULONG Key);
-
-
-
-
-
-#define NtCurrentProcess() ( (HANDLE) 0xFFFFFFFF )
-#define NtCurrentThread() ( (HANDLE) 0xFFFFFFFE )
-
-
-
-// event access mask
-
-#define EVENT_READ_ACCESS 1
-#define EVENT_WRITE_ACCESS 2
-
-
-// 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 disposition values
-
-
-#define FILE_SUPERSEDE 0x0000
-#define FILE_OPEN 0x0001
-#define FILE_CREATE 0x0002
-#define FILE_OPEN_IF 0x0003
-#define FILE_OVERWRITE 0x0004
-#define FILE_OVERWRITE_IF 0x0005
-#define FILE_MAXIMUM_DISPOSITION 0x0005
-
-
-
-
-//process query / set information class
-
-#define ProcessBasicInformation 0
-#define ProcessQuotaLimits 1
-#define ProcessIoCounters 2
-#define ProcessVmCounters 3
-#define ProcessTimes 4
-#define ProcessBasePriority 5
-#define ProcessRaisePriority 6
-#define ProcessDebugPort 7
-#define ProcessExceptionPort 8
-#define ProcessAccessToken 9
-#define ProcessLdtInformation 10
-#define ProcessLdtSize 11
-#define ProcessDefaultHardErrorMode 12
-#define ProcessIoPortHandlers 13
-#define ProcessPooledUsageAndLimits 14
-#define ProcessWorkingSetWatch 15
-#define ProcessUserModeIOPL 16
-#define ProcessEnableAlignmentFaultFixup 17
-#define ProcessPriorityClass 18
-#define ProcessWx86Information 19
-#define ProcessHandleCount 20
-#define ProcessAffinityMask 21
-#define MaxProcessInfoClass 22
-
-// thread query / set information class
-#define ThreadBasicInformation 0
-#define ThreadTimes 1
-#define ThreadPriority 2
-#define ThreadBasePriority 3
-#define ThreadAffinityMask 4
-#define ThreadImpersonationToken 5
-#define ThreadDescriptorTableEntry 6
-#define ThreadEnableAlignmentFaultFixup 7
-#define ThreadEventPair 8
-#define ThreadQuerySetWin32StartAddress 9
-#define ThreadZeroTlsCell 10
-#define ThreadPerformanceCount 11
-#define ThreadAmILastThread 12
-#define ThreadIdealProcessor 13
-#define ThreadPriorityBoost 14
-#define MaxThreadInfoClass 15
-
-
-
-// key query information class
-
-#define KeyBasicInformation 0
-#define KeyNodeInformation 1
-#define KeyFullInformation 2
-
-
-// key set information class
-
-#define KeyWriteTimeInformation 0
-
-// key value information class
-
-#define KeyValueBasicInformation 0
-#define KeyValueFullInformation 1
-#define KeyValuePartialInformation 2
-
-// object handle information
-
-#define ObjectBasicInformation 0
-#define ObjectNameInformation 1
-#define ObjectTypeInformation 2
-#define ObjectAllInformation 3
-#define ObjectDataInformation 4
-
-// semaphore information
-
-#define SemaphoreBasicInformation 0
-
-// event information
-
-#define EventBasicInformation 0
-
-
-// system information
-
-#define SystemPerformanceInformation 5
-#define SystemCacheInformation 21
-#define SystemTimeAdjustmentInformation 28
-
-
-// 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
-
-
-
-//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
-
-
-// shutdown action
-
-typedef enum SHUTDOWN_ACTION_TAG {
- ShutdownNoReboot,
- ShutdownReboot,
- ShutdownPowerOff
-} SHUTDOWN_ACTION;
-
-
-
-// wait type
-
-#define WaitAll 0
-#define WaitAny 1
-
-
-// key restore flags
-
-#define REG_WHOLE_HIVE_VOLATILE 1
-#define REG_REFRESH_HIVE 2
-
-
-// object type access rights
-
-#define OBJECT_TYPE_CREATE 0x0001
-#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
-
-
-// directory access rights
-
-#define DIRECTORY_QUERY 0x0001
-#define DIRECTORY_TRAVERSE 0x0002
-#define DIRECTORY_CREATE_OBJECT 0x0004
-#define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
-
-#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
-
-// symbolic link access rights
-
-#define SYMBOLIC_LINK_QUERY 0x0001
-#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
-
-typedef struct _PROCESS_WS_WATCH_INFORMATION
-{
- PVOID FaultingPc;
- PVOID FaultingVa;
-} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
-
-typedef struct _PROCESS_BASIC_INFORMATION
-{
- NTSTATUS ExitStatus;
- PNT_PEB PebBaseAddress;
- KAFFINITY AffinityMask;
- KPRIORITY BasePriority;
- ULONG UniqueProcessId;
- ULONG InheritedFromUniqueProcessId;
-} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
-
-typedef struct _QUOTA_LIMITS
-{
- ULONG PagedPoolLimit;
- ULONG NonPagedPoolLimit;
- ULONG MinimumWorkingSetSize;
- ULONG MaximumWorkingSetSize;
- ULONG PagefileLimit;
- TIME TimeLimit;
-} QUOTA_LIMITS, *PQUOTA_LIMITS;
-
-typedef struct _IO_COUNTERS
-{
- ULONG ReadOperationCount;
- ULONG WriteOperationCount;
- ULONG OtherOperationCount;
- LARGE_INTEGER ReadTransferCount;
- LARGE_INTEGER WriteTransferCount;
- LARGE_INTEGER OtherTransferCount;
-} IO_COUNTERS, *PIO_COUNTERS;
-
-
-typedef struct _VM_COUNTERS_
-{
- ULONG PeakVirtualSize;
- ULONG VirtualSize;
- ULONG PageFaultCount;
- ULONG PeakWorkingSetSize;
- ULONG WorkingSetSize;
- ULONG QuotaPeakPagedPoolUsage;
- ULONG QuotaPagedPoolUsage;
- ULONG QuotaPeakNonPagedPoolUsage;
- ULONG QuotaNonPagedPoolUsage;
- ULONG PagefileUsage;
- ULONG PeakPagefileUsage;
-} VM_COUNTERS, *PVM_COUNTERS;
-
-
-typedef struct _POOLED_USAGE_AND_LIMITS_
-{
- ULONG PeakPagedPoolUsage;
- ULONG PagedPoolUsage;
- ULONG PagedPoolLimit;
- ULONG PeakNonPagedPoolUsage;
- ULONG NonPagedPoolUsage;
- ULONG NonPagedPoolLimit;
- ULONG PeakPagefileUsage;
- ULONG PagefileUsage;
- ULONG PagefileLimit;
-} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
-
-
-typedef struct _PROCESS_ACCESS_TOKEN
-{
- HANDLE Token;
- HANDLE Thread;
-} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
-
-typedef struct _KERNEL_USER_TIMES
-{
- TIME CreateTime;
- TIME ExitTime;
- TIME KernelTime;
- TIME UserTime;
-} KERNEL_USER_TIMES;
-typedef KERNEL_USER_TIMES *PKERNEL_USER_TIMES;
-
-// thread information
-
-// incompatible with MS NT
-
-typedef struct _THREAD_BASIC_INFORMATION
-{
- NTSTATUS ExitStatus;
- PVOID TebBaseAddress;
- KAFFINITY AffinityMask;
- KPRIORITY BasePriority;
- ULONG UniqueThreadId;
-} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
-
-// object information
-
-typedef struct _OBJECT_NAME_INFORMATION
-{
- UNICODE_STRING Name;
-} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
-
-
-
-typedef struct _OBJECT_DATA_INFORMATION
-{
- BOOL bInheritHanlde;
- BOOL bProtectFromClose;
-} OBJECT_DATA_INFORMATION, *POBJECT_DATA_INFORMATION;
-
-
-typedef struct _OBJECT_TYPE_INFORMATION
-{
- UNICODE_STRING Name;
- UNICODE_STRING Type;
- ULONG TotalHandles;
- ULONG ReferenceCount;
-} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
-
-// system information
-
-typedef struct _SYSTEM_TIME_ADJUSTMENT
-{
- ULONG TimeAdjustment;
- BOOL TimeAdjustmentDisabled;
-} SYSTEM_TIME_ADJUSTMENT, *PSYSTEM_TIME_ADJUSTMENT;
-
-typedef struct _SYSTEM_CONFIGURATION_INFO {
- union {
- ULONG OemId;
- struct {
- WORD ProcessorArchitecture;
- WORD Reserved;
- } tag1;
- } tag2;
- ULONG PageSize;
- PVOID MinimumApplicationAddress;
- PVOID MaximumApplicationAddress;
- ULONG ActiveProcessorMask;
- ULONG NumberOfProcessors;
- ULONG ProcessorType;
- ULONG AllocationGranularity;
- WORD ProcessorLevel;
- WORD ProcessorRevision;
-} SYSTEM_CONFIGURATION_INFO, *PSYSTEM_CONFIGURATION_INFO;
-
-
-typedef struct _SYSTEM_CACHE_INFORMATION {
- ULONG CurrentSize;
- ULONG PeakSize;
- ULONG PageFaultCount;
- ULONG MinimumWorkingSet;
- ULONG MaximumWorkingSet;
- ULONG Unused[4];
-} SYSTEM_CACHE_INFORMATION;
-
-
-
-// file information
-
-typedef struct _FILE_BASIC_INFORMATION
-{
- TIME CreationTime;
- TIME LastAccessTime;
- TIME LastWriteTime;
- TIME ChangeTime;
- ULONG FileAttributes;
-} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
-
-typedef struct _FILE_STANDARD_INFORMATION
-{
- LARGE_INTEGER AllocationSize;
- LARGE_INTEGER EndOfFile;
- ULONG NumberOfLinks;
- BOOLEAN DeletePending;
- BOOLEAN Directory;
-} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
-
-typedef struct _FILE_POSITION_INFORMATION
-{
- LARGE_INTEGER CurrentByteOffset;
-} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
-
-typedef struct _FILE_ALIGNMENT_INFORMATION
-{
- ULONG AlignmentRequirement;
-} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
-
-typedef struct _FILE_DISPOSITION_INFORMATION
-{
- BOOLEAN DeleteFile;
-} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
-
-typedef struct _FILE_END_OF_FILE_INFORMATION
-{
- LARGE_INTEGER EndOfFile;
-} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
-
-typedef struct _FILE_NETWORK_OPEN_INFORMATION {
- TIME CreationTime;
- TIME LastAccessTime;
- TIME LastWriteTime;
- TIME ChangeTime;
- LARGE_INTEGER AllocationSize;
- LARGE_INTEGER EndOfFile;
- ULONG FileAttributes;
-} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
-
-typedef struct _FILE_FULL_EA_INFORMATION
-{
- ULONG NextEntryOffset;
- UCHAR Flags;
- UCHAR EaNameLength;
- USHORT EaValueLength;
- CHAR *EaName;
-} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
-
-
-typedef struct _FILE_EA_INFORMATION {
- ULONG EaSize;
-} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
-
-
-typedef struct _FILE_GET_EA_INFORMATION {
- ULONG NextEntryOffset;
- UCHAR EaNameLength;
- CHAR EaName[0];
-} FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;
-
-typedef struct _FILE_STREAM_INFORMATION {
- ULONG NextEntryOffset;
- ULONG StreamNameLength;
- LARGE_INTEGER StreamSize;
- LARGE_INTEGER StreamAllocationSize;
- WCHAR StreamName[0];
-} FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION;
-
-typedef struct _FILE_ALLOCATION_INFORMATION {
- LARGE_INTEGER AllocationSize;
-} FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
-
-typedef struct _FILE_NAME_INFORMATION {
- ULONG FileNameLength;
- WCHAR FileName[0];
-} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
-
-typedef struct _FILE_NAMES_INFORMATION {
- ULONG NextEntryOffset;
- ULONG FileIndex;
- ULONG FileNameLength;
- WCHAR FileName[0];
-} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
-
-
-typedef struct _FILE_RENAME_INFORMATION {
- BOOLEAN Replace;
- HANDLE RootDir;
- ULONG FileNameLength;
- WCHAR FileName[0];
-} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
-
-
-typedef struct _FILE_INTERNAL_INFORMATION {
- LARGE_INTEGER IndexNumber;
-} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
-
-typedef struct _FILE_ACCESS_INFORMATION {
- ACCESS_MASK AccessFlags;
-} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
-
-
-typedef struct _FILE_MODE_INFORMATION {
- ULONG Mode;
-} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
-
-typedef struct _FILE_COMPRESSION_INFORMATION {
- LARGE_INTEGER CompressedFileSize;
- USHORT CompressionFormat;
- UCHAR CompressionUnitShift;
- UCHAR ChunkShift;
- UCHAR ClusterShift;
- UCHAR Reserved[3];
-} FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
-
-typedef struct _FILE_ALL_INFORMATION {
- FILE_BASIC_INFORMATION BasicInformation;
- FILE_STANDARD_INFORMATION StandardInformation;
- FILE_INTERNAL_INFORMATION InternalInformation;
- FILE_EA_INFORMATION EaInformation;
- FILE_ACCESS_INFORMATION AccessInformation;
- FILE_POSITION_INFORMATION PositionInformation;
- FILE_MODE_INFORMATION ModeInformation;
- FILE_ALIGNMENT_INFORMATION AlignmentInformation;
- FILE_NAME_INFORMATION NameInformation;
-} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
-
-// file system information structures
-
-typedef struct _FILE_FS_DEVICE_INFORMATION {
- DEVICE_TYPE DeviceType;
- ULONG Characteristics;
-} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
-
-
-/* device type can be one of the following values:
-
- FILE_DEVICE_BEEP 0x00000001
- FILE_DEVICE_CD_ROM 0x00000002
- FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
- FILE_DEVICE_CONTROLLER 0x00000004
- FILE_DEVICE_DATALINK 0x00000005
- FILE_DEVICE_DFS 0x00000006
- FILE_DEVICE_DISK 0x00000007
- FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
- FILE_DEVICE_FILE_SYSTEM 0x00000009
- FILE_DEVICE_INPORT_PORT 0x0000000a
- FILE_DEVICE_KEYBOARD 0x0000000b
- FILE_DEVICE_MAILSLOT 0x0000000c
- FILE_DEVICE_MIDI_IN 0x0000000d
- FILE_DEVICE_MIDI_OUT 0x0000000e
- FILE_DEVICE_MOUSE 0x0000000f
- FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
- FILE_DEVICE_NAMED_PIPE 0x00000011
- FILE_DEVICE_NETWORK 0x00000012
- FILE_DEVICE_NETWORK_BROWSER 0x00000013
- FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
- FILE_DEVICE_NULL 0x00000015
- FILE_DEVICE_PARALLEL_PORT 0x00000016
- FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
- FILE_DEVICE_PRINTER 0x00000018
- FILE_DEVICE_SCANNER 0x00000019
- FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
- FILE_DEVICE_SERIAL_PORT 0x0000001b
- FILE_DEVICE_SCREEN 0x0000001c
- FILE_DEVICE_SOUND 0x0000001d
- FILE_DEVICE_STREAMS 0x0000001e
- FILE_DEVICE_TAPE 0x0000001f
- FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
- FILE_DEVICE_TRANSPORT 0x00000021
- FILE_DEVICE_UNKNOWN 0x00000022
- FILE_DEVICE_VIDEO 0x00000023
- FILE_DEVICE_VIRTUAL_DISK 0x00000024
- FILE_DEVICE_WAVE_IN 0x00000025
- FILE_DEVICE_WAVE_OUT 0x00000026
- FILE_DEVICE_8042_PORT 0x00000027
- FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
- FILE_DEVICE_BATTERY 0x00000029
- FILE_DEVICE_BUS_EXTENDER 0x0000002a
- FILE_DEVICE_MODEM 0x0000002b
- FILE_DEVICE_VDM 0x0000002c
- */
-
-/*
- characteristics is one of the following values:
-
- FILE_REMOVABLE_MEDIA 0x00000001
- FILE_READ_ONLY_DEVICE 0x00000002
- FILE_FLOPPY_DISKETTE 0x00000004
- FILE_WRITE_ONCE_MEDIA 0x00000008
- FILE_REMOTE_DEVICE 0x00000010
- FILE_DEVICE_IS_MOUNTED 0x00000020
- FILE_VIRTUAL_VOLUME 0x00000040
-*/
-
-typedef struct _FILE_FS_VOLUME_INFORMATION {
- TIME VolumeCreationTime;
- ULONG VolumeSerialNumber;
- ULONG VolumeLabelLength;
- BOOLEAN SupportsObjects;
- WCHAR VolumeLabel[0];
-} FILE_FS_VOLUME_INFORMATION;
-
-typedef struct _FILE_FS_SIZE_INFORMATION {
- LARGE_INTEGER TotalAllocationUnits;
- LARGE_INTEGER AvailableAllocationUnits;
- ULONG SectorsPerAllocationUnit;
- ULONG BytesPerSector;
-} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
-
-typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
- ULONG FileSystemAttributes;
- LONG MaximumComponentNameLength;
- ULONG FileSystemNameLength;
- WCHAR FileSystemName[0];
-} FILE_FS_ATTRIBUTE_INFORMATION;
-
-/*
- FileSystemAttributes is one of the following values:
-
- FILE_CASE_SENSITIVE_SEARCH 0x00000001
- FILE_CASE_PRESERVED_NAMES 0x00000002
- FILE_UNICODE_ON_DISK 0x00000004
- FILE_PERSISTENT_ACLS 0x00000008
- FILE_FILE_COMPRESSION 0x00000010
- FILE_VOLUME_QUOTAS 0x00000020
- FILE_VOLUME_IS_COMPRESSED 0x00008000
-*/
-typedef struct _FILE_FS_LABEL_INFORMATION {
- ULONG VolumeLabelLength;
- WCHAR VolumeLabel[0];
-} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
-
-// read file scatter / write file scatter
-//FIXME I am a win32 struct aswell
-
-typedef union _FILE_SEGMENT_ELEMENT {
- PVOID Buffer;
- ULONG Alignment;
-}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
-
-// directory information
-
-
-typedef struct _FILE_DIRECTORY_INFORMATION {
- ULONG NextEntryOffset;
- ULONG FileIndex;
- TIME CreationTime;
- TIME LastAccessTime;
- TIME LastWriteTime;
- TIME ChangeTime;
- LARGE_INTEGER EndOfFile;
- LARGE_INTEGER AllocationSize;
- ULONG FileAttributes;
- ULONG FileNameLength;
- WCHAR FileName[0];
-} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
-
-typedef struct _FILE_FULL_DIRECTORY_INFORMATION {
- ULONG NextEntryOffset;
- ULONG FileIndex;
- TIME CreationTime;
- TIME LastAccessTime;
- TIME LastWriteTime;
- TIME ChangeTime;
- LARGE_INTEGER EndOfFile;
- LARGE_INTEGER AllocationSize;
- ULONG FileAttributes;
- ULONG FileNameLength;
- ULONG EaSize;
- WCHAR FileName[0];
-} FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION;
-
-
-typedef struct _FILE_BOTH_DIRECTORY_INFORMATION {
- ULONG NextEntryOffset;
- ULONG FileIndex;
- TIME CreationTime;
- TIME LastAccessTime;
- TIME LastWriteTime;
- TIME ChangeTime;
- LARGE_INTEGER EndOfFile;
- LARGE_INTEGER AllocationSize;
- ULONG FileAttributes;
- ULONG FileNameLength;
- ULONG EaSize;
- CHAR ShortNameLength;
- WCHAR ShortName[12]; // 8.3 name
- WCHAR FileName[0];
-} FILE_BOTH_DIRECTORY_INFORMATION, *PFILE_BOTH_DIRECTORY_INFORMATION;
-
-
-/*
- NotifyFilter / CompletionFilter:
-
- FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001
- FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002
- FILE_NOTIFY_CHANGE_NAME 0x00000003
- FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004
- FILE_NOTIFY_CHANGE_SIZE 0x00000008
- FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
- FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020
- FILE_NOTIFY_CHANGE_CREATION 0x00000040
- FILE_NOTIFY_CHANGE_EA 0x00000080
- FILE_NOTIFY_CHANGE_SECURITY 0x00000100
- FILE_NOTIFY_CHANGE_STREAM_NAME 0x00000200
- FILE_NOTIFY_CHANGE_STREAM_SIZE 0x00000400
- FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
-*/
-
-typedef struct _FILE_NOTIFY_INFORMATION {
- ULONG NextEntryOffset;
- ULONG Action;
- ULONG FileNameLength;
- WCHAR FileName[0];
-} FILE_NOTIFY_INFORMATION;
-
-
-/*
- Action is one of the following values:
-
- FILE_ACTION_ADDED 0x00000001
- FILE_ACTION_REMOVED 0x00000002
- FILE_ACTION_MODIFIED 0x00000003
- FILE_ACTION_RENAMED_OLD_NAME 0x00000004
- FILE_ACTION_RENAMED_NEW_NAME 0x00000005
- FILE_ACTION_ADDED_STREAM 0x00000006
- FILE_ACTION_REMOVED_STREAM 0x00000007
- FILE_ACTION_MODIFIED_STREAM 0x00000008
-
-*/
-
-
-//FIXME: I am a win32 object
-typedef
-VOID
-(*PTIMERAPCROUTINE)(
- LPVOID lpArgToCompletionRoutine,
- DWORD dwTimerLowValue,
- DWORD dwTimerHighValue
- );
-
-// NtProcessStartup parameters
-
-typedef struct _ENVIRONMENT_INFORMATION {
- ULONG Unknown[21];
- UNICODE_STRING CommandLine;
- UNICODE_STRING ImageFile;
-} ENVIRONMENT_INFORMATION, *PENVIRONMENT_INFORMATION;
-
-
-typedef struct _STARTUP_ARGUMENT {
- ULONG Unknown[3];
- PENVIRONMENT_INFORMATION Environment;
-} STARTUP_ARGUMENT, *PSTARTUP_ARGUMENT;
-
-
-// File System Control commands ( related to defragging )
-
-#define FSCTL_READ_MFT_RECORD 0x90068 // NTFS only
-#define FSCTL_GET_VOLUME_BITMAP 0x9006F
-#define FSCTL_GET_RETRIEVAL_POINTERS 0x90073
-#define FSCTL_MOVE_FILE 0x90074
-
-typedef struct _MAPPING_PAIR
-{
- ULONGLONG Vcn;
- ULONGLONG Lcn;
-} MAPPING_PAIR, *PMAPPING_PAIR;
-
-typedef struct _GET_RETRIEVAL_DESCRIPTOR
-{
- ULONG NumberOfPairs;
- ULONGLONG StartVcn;
- MAPPING_PAIR Pair[0];
-} GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR;
-
-typedef struct _BITMAP_DESCRIPTOR
-{
- ULONGLONG StartLcn;
- ULONGLONG ClustersToEndOfVol;
- BYTE Map[0];
-} BITMAP_DESCRIPTOR, *PBITMAP_DESCRIPTOR;
-
-typedef struct _MOVEFILE_DESCRIPTOR
-{
- HANDLE FileHandle;
- ULONG Reserved;
- LARGE_INTEGER StartVcn;
- LARGE_INTEGER TargetLcn;
- ULONG NumVcns;
- ULONG Reserved1;
-} MOVEFILE_DESCRIPTOR, *PMOVEFILE_DESCRIPTOR;
-
-
-// semaphore information
-
-typedef struct _SEMAPHORE_BASIC_INFORMATION
-{
- ULONG CurrentCount;
- ULONG MaximumCount;
-} SEMAPHORE_BASIC_INFORMATION, *PSEMAPHORE_BASIC_INFORMATION;
-
-// event information
-
-typedef struct _EVENT_BASIC_INFORMATION
-{
- BOOL AutomaticReset;
- BOOL Signaled;
-} EVENT_BASIC_INFORMATION, *PEVENT_INFORMATION;
-
-
-
+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
+ );
/*
* FUNCTION: Adds an atom to the global atom table
* ARGUMENTS:
- Atom (OUT) = Caller supplies storage for the resulting atom.
+ * Atom (OUT) = Caller supplies storage for the resulting atom.
* AtomString = The string to add to the atom table.
* REMARKS: The arguments map to the win32 add GlobalAddAtom.
* RETURNS: Status
OUT ATOM *Atom,
IN PUNICODE_STRING AtomString
);
+
+
+NTSTATUS
+STDCALL
+ZwAddAtom(
+ OUT ATOM *Atom,
+ IN PUNICODE_STRING AtomString
+ );
/*
* FUNCTION: Decrements a thread's suspend count and places it in an alerted
* state.
OUT PULONG SuspendCount
);
+NTSTATUS
+STDCALL
+ZwAlertResumeThread(
+ IN HANDLE ThreadHandle,
+ OUT PULONG SuspendCount
+ );
+
/*
* FUNCTION: Puts the thread in a alerted state
* ARGUMENTS:
IN HANDLE ThreadHandle
);
+NTSTATUS
+STDCALL
+ZwAlertThread(
+ IN HANDLE ThreadHandle
+ );
+
+
/*
* FUNCTION: Allocates a locally unique id
* ARGUMENTS:
OUT PVOID LocallyUniqueId
);
+NTSTATUS
+STDCALL
+ZwAllocateLocallyUniqueId(
+ OUT PVOID LocallyUniqueId
+ );
+
+
/*
* FUNCTION: Allocates a block of virtual memory in the process address space
* ARGUMENTS:
IN ULONG Protect
);
+NTSTATUS
+STDCALL
+ZwAllocateVirtualMemory(
+ IN HANDLE ProcessHandle,
+ OUT PVOID *BaseAddress,
+ IN ULONG ZeroBits,
+ IN ULONG RegionSize,
+ IN ULONG AllocationType,
+ IN ULONG Protect
+ );
+/*
+ * FUNCTION: Returns from a callback into user mode
+ * ARGUMENTS:
+ * RETURN Status
+ */
+//FIXME: this function might need 3 parameters
+NTSTATUS
+STDCALL
+NtCallbackReturn(
+ VOID
+ );
+
+NTSTATUS
+STDCALL
+ZwCallbackReturn(
+ VOID
+ );
+
/*
* FUNCTION: Cancels a IO request
* ARGUMENTS:
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock
);
+
+NTSTATUS
+STDCALL
+ZwCancelIoFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock
+ );
/*
* FUNCTION: Cancels a timer
* ARGUMENTS:
* TimerHandle = Handle to the timer
- ElapsedTime = Specifies the elapsed time the timer has run so far.
+ * CurrentState = Specifies the state of the timer when cancelled.
* REMARKS:
- The arguments to this function map to the function CancelWaitableTimer.
+ * The arguments to this function map to the function CancelWaitableTimer.
* RETURNS: Status
*/
NTSTATUS
STDCALL
NtCancelTimer(
+ IN HANDLE TimerHandle,
+ OUT PBOOLEAN CurrentState OPTIONAL
+ );
+
+NTSTATUS
+STDCALL
+ZwCancelTimer(
IN HANDLE TimerHandle,
OUT ULONG ElapsedTime
);
IN HANDLE EventHandle
);
+NTSTATUS
+STDCALL
+ZwClearEvent(
+ IN HANDLE EventHandle
+ );
+
/*
* FUNCTION: Closes an object handle
* ARGUMENTS:
IN HANDLE Handle
);
+NTSTATUS
+STDCALL
+ZwClose(
+ IN HANDLE Handle
+ );
+
/*
* FUNCTION: Continues a thread with the specified context
* ARGUMENTS:
* Context = Specifies the processor context
+ * IrqLevel = Specifies the Interupt Request Level to continue with. Can
+ * be PASSIVE_LEVEL or APC_LEVEL
* REMARKS
- * NtContinue can be used to continue after a exception.
+ * NtContinue can be used to continue after an exception or apc.
* RETURNS: Status
*/
//FIXME This function might need another parameter
+
NTSTATUS
STDCALL
NtContinue(
- IN PCONTEXT Context
+ IN PCONTEXT Context,
+ IN CINT IrqLevel
+ );
+
+NTSTATUS
+STDCALL
+ZwContinue(
+ IN PCONTEXT Context,
+ IN CINT IrqLevel
);
+
/*
* FUNCTION: Creates a directory object
* ARGUMENTS:
* handle, a access mask and a OBJECT_ATTRIBUTES structure to map the path name and the SECURITY_ATTRIBUTES.
* RETURNS: Status
*/
+
NTSTATUS
STDCALL
NtCreateDirectoryObject(
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
+
+NTSTATUS
+STDCALL
+ZwCreateDirectoryObject(
+ OUT PHANDLE DirectoryHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes
+ );
+
/*
* FUNCTION: Creates an event object
* ARGUMENTS:
* DesiredAccess = Specifies access to the event
* ObjectAttribute = Initialized attributes for the object
* ManualReset = manual-reset or auto-reset if true you have to reset the state of the event manually
- using NtResetEvent/NtClearEvent. if false the system will reset the event to a non-signalled state
- automatically after the system has rescheduled a thread waiting on the event.
+ * using NtResetEvent/NtClearEvent. if false the system will reset the event to a non-signalled state
+ * automatically after the system has rescheduled a thread waiting on the event.
* InitialState = specifies the initial state of the event to be signaled ( TRUE ) or non-signalled (FALSE).
* REMARKS: This function maps to the win32 CreateEvent. Demanding a out variable of type HANDLE,
* a access mask and a OBJECT_ATTRIBUTES structure mapping to the SECURITY_ATTRIBUTES. ManualReset and InitialState are
* both parameters aswell ( possibly the order is reversed ).
* RETURNS: Status
*/
+
NTSTATUS
STDCALL
NtCreateEvent(
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
- IN BOOL ManualReset,
- IN BOOL InitialState
+ IN BOOLEAN ManualReset,
+ IN BOOLEAN InitialState
+ );
+
+NTSTATUS
+STDCALL
+ZwCreateEvent(
+ OUT PHANDLE FileHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN BOOLEAN ManualReset,
+ IN BOOLEAN InitialState
);
/*
IN POBJECT_ATTRIBUTES ObjectAttributes
);
+NTSTATUS
+STDCALL
+ZwCreateEventPair(
+ OUT PHANDLE FileHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes
+ );
+
/*
* FUNCTION: Creates or opens a file, directory or device object.
* EaLength = Extended Attributes buffer size, applies only to files and directories.
* REMARKS: This function maps to the win32 CreateFile.
* RETURNS: Status
- */
+ */
+
NTSTATUS
STDCALL
NtCreateFile(
IN PVOID EaBuffer OPTIONAL,
IN ULONG EaLength
);
+
+NTSTATUS
+STDCALL
+ZwCreateFile(
+ OUT PHANDLE FileHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PLARGE_INTEGER AllocationSize OPTIONAL,
+ IN ULONG FileAttributes,
+ IN ULONG ShareAccess,
+ IN ULONG CreateDisposition,
+ IN ULONG CreateOptions,
+ IN PVOID EaBuffer OPTIONAL,
+ IN ULONG EaLength
+ );
+
/*
* FUNCTION: Creates or opens a file, directory or device object.
* ARGUMENTS:
* RETURNS:
* Status
*/
+
NTSTATUS
STDCALL
NtCreateIoCompletion(
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG NumberOfConcurrentThreads
);
+
+NTSTATUS
+STDCALL
+ZwCreateIoCompletion(
+ OUT PHANDLE CompletionPort,
+ IN ACCESS_MASK DesiredAccess,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN ULONG NumberOfConcurrentThreads
+ );
+
/*
* FUNCTION: Creates a registry key
* ARGUMENTS:
* KEY_NOTIFY
* KEY_CREATE_LINK A symbolic link to the key can be created.
* ObjectAttributes = The name of the key may be specified directly in the name field
- * of object attributes or relative
- * to a key in rootdirectory.
- * Class = Specifies the kind of data.
+ * of object attributes or relative to a key in rootdirectory.
+ * TitleIndex = Might specify the position in the sequential order of subkeys.
+ * Class = Specifies the kind of data, for example REG_SZ for string data. [ ??? ]
* CreateOptions = Specifies additional options with which the key is created
* REG_OPTION_VOLATILE The key is not preserved across boots.
* REG_OPTION_NON_VOLATILE The key is preserved accross boots.
* RETURNS:
* Status
*/
+
NTSTATUS
STDCALL
NtCreateKey(
IN PULONG Disposition OPTIONAL
);
+NTSTATUS
+STDCALL
+ZwCreateKey(
+ OUT PHANDLE KeyHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN ULONG TitleIndex,
+ IN PUNICODE_STRING Class OPTIONAL,
+ IN ULONG CreateOptions,
+ IN PULONG Disposition OPTIONAL
+ );
+
//NtCreateMailslotFile
OUT PHANDLE MutantHandle,
IN ACCESS_MASK DesiredAccess,
IN OBJECT_ATTRIBUTES ObjectAttributes,
- IN BOOL InitialOwner
+ IN BOOLEAN InitialOwner
+ );
+
+NTSTATUS
+STDCALL
+ZwCreateMutant(
+ OUT PHANDLE MutantHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN OBJECT_ATTRIBUTES ObjectAttributes,
+ IN BOOLEAN InitialOwner
);
//NtCreateNamedPipeFile
* PageFileName = Name of the pagefile
* MinimumSize = Specifies the minimum size
* MaximumSize = Specifies the maximum size
- * ActualSize = Specifies the actual size
+ * ActualSize(OUT) = Specifies the actual size
* RETURNS: Status
-*/
+ */
+
NTSTATUS
STDCALL
NtCreatePagingFile(
IN ULONG MaxiumSize,
OUT PULONG ActualSize
);
+
+NTSTATUS
+STDCALL
+ZwCreatePagingFile(
+ IN PUNICODE_STRING PageFileName,
+ IN ULONG MiniumSize,
+ IN ULONG MaxiumSize,
+ OUT PULONG ActualSize
+ );
+
/*
* FUNCTION: Creates a process.
* ARGUMENTS:
IN HANDLE DebugPort OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL
);
+
+NTSTATUS
+STDCALL
+ZwCreateProcess(
+ OUT PHANDLE ProcessHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+ IN HANDLE ParentProcess,
+ IN BOOLEAN InheritObjectTable,
+ IN HANDLE SectionHandle OPTIONAL,
+ IN HANDLE DebugPort OPTIONAL,
+ IN HANDLE ExceptionPort OPTIONAL
+ );
+
/*
* FUNCTION: Creates a section object.
* ARGUMENTS:
* FileHanlde = Handle to a file to create a section mapped to a file instead of a memory backed section.
* RETURNS: Status
*/
+
+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
+ );
+
NTSTATUS
STDCALL
-NtCreateSection(
+ZwCreateSection(
OUT PHANDLE SectionHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN ULONG AllocationAttributes,
IN HANDLE FileHandle OPTIONAL
);
+
/*
* FUNCTION: Creates a semaphore object for interprocess synchronization.
* ARGUMENTS:
IN ULONG InitialCount,
IN ULONG MaximumCount
);
+
+NTSTATUS
+STDCALL
+ZwCreateSemaphore(
+ OUT PHANDLE SemaphoreHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+ IN ULONG InitialCount,
+ IN ULONG MaximumCount
+ );
+
/*
* FUNCTION: Creates a symbolic link object
* ARGUMENTS:
* SymbolicLinkHandle (OUT) = Caller supplied storage for the resulting handle
* DesiredAccess = Specifies the allowed or desired access to the thread.
* ObjectAttributes = Initialized attributes for the object.
- * Name =
- * REMARKS:
- * This function map to the win32 function CreateThread.
+ * Name = Target name of the symbolic link
* RETURNS: Status
*/
NTSTATUS
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PUNICODE_STRING Name
);
+
+NTSTATUS
+STDCALL
+ZwCreateSymbolicLinkObject(
+ OUT PHANDLE SymbolicLinkHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN PUNICODE_STRING Name
+ );
+
/*
* FUNCTION: Creates a user mode thread
* ARGUMENTS:
* ProcessHandle = Handle to the threads parent process.
* ClientId (OUT) = Caller supplies storage for returned process id and thread id.
* ThreadContext = Initial processor context for the thread.
- * InitialTeb = Initial Thread Environment Block for the Thread.
+ * InitialTeb = Initial user mode stack context for the thread.
* CreateSuspended = Specifies if the thread is ready for scheduling
* REMARKS:
- * This function maps to the win32 function CreateThread. The exact arguments are from the usenet. [<6f7cqj$tq9$1@nnrp1.dejanews.com>]
+ * This function maps to the win32 function CreateThread.
* RETURNS: Status
*/
NTSTATUS
IN PINITIAL_TEB InitialTeb,
IN BOOLEAN CreateSuspended
);
+
+NTSTATUS
+STDCALL
+ZwCreateThread(
+ OUT PHANDLE ThreadHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+ IN HANDLE ProcessHandle,
+ OUT PCLIENT_ID ClientId,
+ IN PCONTEXT ThreadContext,
+ IN PINITIAL_TEB InitialTeb,
+ IN BOOLEAN CreateSuspended
+ );
/*
* FUNCTION: Creates a waitable timer.
* ARGUMENTS:
* TimerHandle (OUT) = Caller supplied storage for the resulting handle
* DesiredAccess = Specifies the allowed or desired access to the timer.
* ObjectAttributes = Initialized attributes for the object.
- * ManualReset = Specifies if the timer should be reset manually.
+ * TimerType = Specifies if the timer should be reset manually.
* REMARKS:
* This function maps to the win32 CreateWaitableTimer. lpTimerAttributes and lpTimerName map to
* corresponding fields in OBJECT_ATTRIBUTES structure.
OUT PHANDLE TimerHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
- IN BOOL ManualReset
+ IN CINT TimerType
+ );
+
+NTSTATUS
+STDCALL
+ZwCreateTimer(
+ OUT PHANDLE TimerHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+ IN CINT TimerType
);
+
+
/*
* FUNCTION: Returns the callers thread TEB.
- * ARGUMENTS:
- * Teb (OUT) = Caller supplied storage for the resulting TEB.
- * RETURNS: Status
+ * RETURNS: The resulting teb.
*/
-NTSTATUS
+NT_TEB *
STDCALL
-NtCurrentTeb(
- NT_TEB *CurrentTeb
+NtCurrentTeb(VOID
);
/*
NTSTATUS
STDCALL
NtDelayExecution(
- IN BOOL Alertable,
- IN PLARGE_INTEGER Interval
+ IN BOOLEAN Alertable,
+ IN TIME *Interval
+ );
+
+NTSTATUS
+STDCALL
+ZwDelayExecution(
+ IN BOOLEAN Alertable,
+ IN TIME *Interval
);
+
/*
* FUNCTION: Deletes an atom from the global atom table
* ARGUMENTS:
- * Atom = Atom to delete
+ * Atom = Identifies the atom to delete
* REMARKS:
- The function maps to the win32 GlobalDeleteAtom
+ * The function maps to the win32 GlobalDeleteAtom
* RETURNS: Status
*/
NTSTATUS
IN ATOM Atom
);
+NTSTATUS
+STDCALL
+ZwDeleteAtom(
+ IN ATOM Atom
+ );
+
/*
* FUNCTION: Deletes a file
* ARGUMENTS:
- * ObjectAttributes = Handle to the file which should be deleted
+ * ObjectAttributes = Name of the file which should be deleted
* REMARKS:
- This system call is functionally equivalent to NtSetInformationFile
- setting the disposition information.
+ * This system call is functionally equivalent to NtSetInformationFile
+ * setting the disposition information.
* The function maps to the win32 DeleteFile.
* RETURNS: Status
*/
IN POBJECT_ATTRIBUTES ObjectAttributes
);
+NTSTATUS
+STDCALL
+ZwDeleteFile(
+ IN POBJECT_ATTRIBUTES ObjectAttributes
+ );
+
/*
* FUNCTION: Deletes a registry key
* ARGUMENTS:
NtDeleteKey(
IN HANDLE KeyHandle
);
+NTSTATUS
+STDCALL
+ZwDeleteKey(
+ IN HANDLE KeyHandle
+ );
+
/*
* FUNCTION: Deletes a value from a registry key
* ARGUMENTS:
IN HANDLE KeyHandle,
IN PUNICODE_STRING ValueName
);
+
+NTSTATUS
+STDCALL
+ZwDeleteValueKey(
+ IN HANDLE KeyHandle,
+ IN PUNICODE_STRING ValueName
+ );
/*
* FUNCTION: Sends IOCTL to the io sub system
* ARGUMENTS:
* DeviceHandle = Points to the handle that is created by NtCreateFile
* Event = Event to synchronize on STATUS_PENDING
- * ApcRoutine =
- * ApcContext =
- * IoStatusBlock = Caller should supply storage for
+ * ApcRoutine = Asynchroneous procedure callback
+ * ApcContext = Callback context.
+ * IoStatusBlock = Caller should supply storage for extra information..
* IoControlCode = Contains the IO Control command. This is an
* index to the structures in InputBuffer and OutputBuffer.
* InputBuffer = Caller should supply storage for input buffer if IOTL expects one.
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
+ );
/*
* FUNCTION: Displays a string on the blue screen
* ARGUMENTS:
NtDisplayString(
IN PUNICODE_STRING DisplayString
);
+
+NTSTATUS
+STDCALL
+ZwDisplayString(
+ IN PUNICODE_STRING DisplayString
+ );
+
/*
- * FUNCTION: Displays a string on the blue screen
+ * FUNCTION: Copies a handle from one process space to another
* ARGUMENTS:
- * SourceProcessHandle = The string to display
- SourceHandle =
- TargetProcessHandle =
- TargetHandle =
- DesiredAccess =
- InheritHandle =
+ * 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.
*/
NTSTATUS
IN PHANDLE SourceHandle,
IN HANDLE TargetProcessHandle,
OUT PHANDLE TargetHandle,
- IN ULONG DesiredAccess,
- IN BOOL InheritHandle
+ IN ACCESS_MASK DesiredAccess,
+ IN BOOLEAN InheritHandle,
+ ULONG 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: Returns information about the subkeys of an open key
NtEnumerateKey(
IN HANDLE KeyHandle,
IN ULONG Index,
- IN CINT KeyInformationClass,
+ IN KEY_INFORMATION_CLASS KeyInformationClass,
+ OUT PVOID KeyInformation,
+ IN ULONG Length,
+ OUT PULONG ResultLength
+ );
+
+NTSTATUS
+STDCALL
+ZwEnumerateKey(
+ IN HANDLE KeyHandle,
+ IN ULONG Index,
+ IN KEY_INFORMATION_CLASS KeyInformationClass,
OUT PVOID KeyInformation,
IN ULONG Length,
OUT PULONG ResultLength
NtEnumerateValueKey(
IN HANDLE KeyHandle,
IN ULONG Index,
- IN CINT KeyValueInformationClass,
+ IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
+ OUT PVOID KeyValueInformation,
+ IN ULONG Length,
+ OUT PULONG ResultLength
+ );
+
+NTSTATUS
+STDCALL
+ZwEnumerateValueKey(
+ IN HANDLE KeyHandle,
+ IN ULONG Index,
+ IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
OUT PVOID KeyValueInformation,
IN ULONG Length,
OUT PULONG ResultLength
IN HANDLE SectionHandle,
IN ULONG NewMaximumSize
);
+NTSTATUS
+STDCALL
+ZwExtendSection(
+ IN HANDLE SectionHandle,
+ IN ULONG NewMaximumSize
+ );
+
/*
* FUNCTION: Finds a atom
* ARGUMENTS:
* AtomString = String to search for.
* RETURNS: Status
* REMARKS:
- This funciton maps to the win32 GlobalFindAtom
+ * This funciton maps to the win32 GlobalFindAtom
*/
NTSTATUS
STDCALL
OUT ATOM *Atom,
IN PUNICODE_STRING AtomString
);
+
+NTSTATUS
+STDCALL
+ZwFindAtom(
+ OUT ATOM *Atom,
+ IN PUNICODE_STRING AtomString
+ );
/*
* FUNCTION: Flushes chached file data to disk
* ARGUMENTS:
* FileHandle = Points to the file
- IoStatusBlock = Caller must supply storage to receive the result of the flush
- buffers operation. The information field is set to number of bytes
- flushed to disk.
+ * IoStatusBlock = Caller must supply storage to receive the result of the flush
+ * buffers operation. The information field is set to number of bytes
+ * flushed to disk.
* RETURNS: Status
* REMARKS:
- This funciton maps to the win32 FlushFileBuffers
+ * This funciton maps to the win32 FlushFileBuffers
*/
NTSTATUS
STDCALL
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock
);
+
+NTSTATUS
+STDCALL
+ZwFlushBuffersFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock
+ );
/*
* FUNCTION: Flushes a the processors instruction cache
* ARGUMENTS:
* ProcessHandle = Points to the process owning the cache
- BaseAddress = // might this be a image address ????
- NumberOfBytesToFlush =
+ * BaseAddress = // might this be a image address ????
+ * NumberOfBytesToFlush =
* RETURNS: Status
* REMARKS:
- This funciton is used by debuggers
+ * This funciton is used by debuggers
*/
NTSTATUS
STDCALL
IN PVOID BaseAddress,
IN UINT NumberOfBytesToFlush
);
+NTSTATUS
+STDCALL
+ZwFlushInstructionCache(
+ IN HANDLE ProcessHandle,
+ IN PVOID BaseAddress,
+ IN UINT NumberOfBytesToFlush
+ );
/*
* FUNCTION: Flushes a registry key to disk
* ARGUMENTS:
* KeyHandle = Points to the registry key handle
* RETURNS: Status
* REMARKS:
- This funciton maps to the win32 RegFlushKey.
+ * This funciton maps to the win32 RegFlushKey.
*/
NTSTATUS
STDCALL
IN HANDLE KeyHandle
);
+NTSTATUS
+STDCALL
+ZwFlushKey(
+ IN HANDLE KeyHandle
+ );
+
/*
* FUNCTION: Flushes virtual memory to file
* ARGUMENTS:
* NumberOfBytesFlushed = Actual number of bytes flushed
* RETURNS: Status
* REMARKS:
- Check return status on STATUS_NOT_MAPPED_DATA
+ * Check return status on STATUS_NOT_MAPPED_DATA
*/
NTSTATUS
STDCALL
IN ULONG NumberOfBytesToFlush,
OUT PULONG NumberOfBytesFlushed OPTIONAL
);
+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
+ * FUNCTION: Flushes the dirty pages to file
* RETURNS: Status
- * REMARKS:
- Check return status on STATUS_NOT_MAPPED_DATA
*/
-VOID
+NTSTATUS
STDCALL
NtFlushWriteBuffer (
VOID
- );
+ );
+NTSTATUS
+STDCALL
+ZwFlushWriteBuffer (
+ VOID
+ );
/*
* FUNCTION: Frees a range of virtual memory
* ARGUMENTS:
NTSTATUS
STDCALL
NtFreeVirtualMemory(
- IN PHANDLE ProcessHandle,
+ IN HANDLE ProcessHandle,
IN PVOID *BaseAddress,
IN ULONG RegionSize,
IN ULONG FreeType
- );
+ );
+
+NTSTATUS
+STDCALL
+ZwFreeVirtualMemory(
+ IN HANDLE ProcessHandle,
+ IN PVOID *BaseAddress,
+ IN ULONG RegionSize,
+ IN ULONG FreeType
+ );
/*
* FUNCTION: Sends FSCTL to the filesystem
* ApcContext =
* IoStatusBlock = Caller should supply storage for
* IoControlCode = Contains the File System Control command. This is an
- index to the structures in InputBuffer and OutputBuffer.
- FSCTL_GET_RETRIEVAL_POINTERS MAPPING_PAIR
- FSCTL_GET_RETRIEVAL_POINTERS GET_RETRIEVAL_DESCRIPTOR
- FSCTL_GET_VOLUME_BITMAP BITMAP_DESCRIPTOR
- FSCTL_MOVE_FILE MOVEFILE_DESCRIPTOR
-
+ * index to the structures in InputBuffer and OutputBuffer.
+ * FSCTL_GET_RETRIEVAL_POINTERS MAPPING_PAIR
+ * FSCTL_GET_RETRIEVAL_POINTERS GET_RETRIEVAL_DESCRIPTOR
+ * FSCTL_GET_VOLUME_BITMAP BITMAP_DESCRIPTOR
+ * FSCTL_MOVE_FILE MOVEFILE_DESCRIPTOR
+ *
* InputBuffer = Caller should supply storage for input buffer if FCTL expects one.
* InputBufferSize = Size of the input bufffer
* OutputBuffer = Caller should supply storage for output buffer if FCTL expects one.
* OutputBufferSize = Size of the input bufffer
- * RETURNS: Status
+ * RETURNS: Status [ STATUS_SUCCESS | STATUS_PENDING | STATUS_ACCESS_DENIED | STATUS_INSUFFICIENT_RESOURCES |
+ * STATUS_INVALID_PARAMETER | STATUS_INVALID_DEVICE_REQUEST ]
*/
NTSTATUS
STDCALL
IN ULONG 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
+ );
+
/*
* FUNCTION: Retrieves the processor context of a thread
* ARGUMENTS:
IN HANDLE ThreadHandle,
OUT PCONTEXT Context
);
+
+NTSTATUS
+STDCALL
+ZwGetContextThread(
+ IN HANDLE ThreadHandle,
+ OUT PCONTEXT Context
+ );
/*
* FUNCTION: Retrieves the uptime of the system
* ARGUMENTS:
PULONG UpTime
);
+NTSTATUS
+STDCALL
+ZwGetTickCount(
+ PULONG UpTime
+ );
+
//-- NtImpersonateThread
/*
NTSTATUS
STDCALL
NtInitializeRegistry(
- BOOL SetUpBoot
+ BOOLEAN SetUpBoot
+ );
+NTSTATUS
+STDCALL
+ZwInitializeRegistry(
+ BOOLEAN SetUpBoot
);
+
/*
* FUNCTION: Loads a driver.
* ARGUMENTS:
IN PUNICODE_STRING DriverServiceName
);
+NTSTATUS
+STDCALL
+ZwLoadDriver(
+ IN PUNICODE_STRING DriverServiceName
+ );
+
//-- NtLoadKey2
/*
* FUNCTION: Loads a registry key.
PHANDLE KeyHandle,
OBJECT_ATTRIBUTES ObjectAttributes
);
+NTSTATUS
+STDCALL
+ZwLoadKey(
+ PHANDLE KeyHandle,
+ OBJECT_ATTRIBUTES ObjectAttributes
+ );
/*
* FUNCTION: Locks a range of bytes in a file.
* ARGUMENTS:
* the completion status and information about the requested lock operation.
* ByteOffset = Offset
* Length = Number of bytes to lock.
- * Key =
- * FailImmediatedly =
- * ExclusiveLock =
+ * Key = Special value to give other threads the possibility to unlock the file
+ by supplying the key in a call to NtUnlockFile.
+ * FailImmediatedly = If false the request will block untill the lock is obtained.
+ * ExclusiveLock = Specifies whether a exclusive or a shared lock is obtained.
* REMARK:
- This procedure maps to the win32 procedure LockFileEx
- * RETURNS: Status
+ This procedure maps to the win32 procedure LockFileEx. STATUS_PENDING is returned if the lock could
+ not be obtained immediately, the device queue is busy and the IRP is queued.
+ * RETURNS: Status [ STATUS_SUCCESS | STATUS_PENDING | STATUS_ACCESS_DENIED | STATUS_INSUFFICIENT_RESOURCES |
+ STATUS_INVALID_PARAMETER | STATUS_INVALID_DEVICE_REQUEST | STATUS_LOCK_NOT_GRANTED ]
+
*/
NTSTATUS
STDCALL
NtLockFile(
- IN HANDLE FileHandle,
- IN HANDLE Event OPTIONAL,
- IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
- IN PVOID ApcContext OPTIONAL,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- IN PLARGE_INTEGER ByteOffset,
- IN PLARGE_INTEGER Length,
- IN ULONG Key,
- IN BOOLEAN FailImmediatedly,
- IN BOOLEAN ExclusiveLock
- );
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PLARGE_INTEGER ByteOffset,
+ IN PLARGE_INTEGER Length,
+ IN PULONG Key,
+ IN BOOLEAN FailImmediatedly,
+ IN BOOLEAN ExclusiveLock
+ );
+
+NTSTATUS
+STDCALL
+ZwLockFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PLARGE_INTEGER ByteOffset,
+ IN PLARGE_INTEGER Length,
+ IN PULONG Key,
+ IN BOOLEAN FailImmediatedly,
+ IN BOOLEAN ExclusiveLock
+ );
/*
* FUNCTION: Locks a range of virtual memory.
* ARGUMENTS:
* NumberOfBytesLocked (OUT) = Number of bytes actually locked.
* REMARK:
This procedure maps to the win32 procedure VirtualLock
- * RETURNS: Status
+ * RETURNS: Status [STATUS_SUCCESS | STATUS_WAS_LOCKED ]
*/
NTSTATUS
STDCALL
ULONG NumberOfBytesToLock,
PULONG NumberOfBytesLocked
);
+NTSTATUS
+STDCALL
+ZwLockVirtualMemory(
+ HANDLE ProcessHandle,
+ PVOID BaseAddress,
+ ULONG NumberOfBytesToLock,
+ PULONG NumberOfBytesLocked
+ );
/*
* FUNCTION: Makes temporary object that will be removed at next boot.
* ARGUMENTS:
NtMakeTemporaryObject(
IN HANDLE Handle
);
+
+NTSTATUS
+STDCALL
+ZwMakeTemporaryObject(
+ IN HANDLE Handle
+ );
/*
* FUNCTION: Maps a view of a section into the virtual address space of a
* process
* Protect = Protection for the committed region of the view
* RETURNS: Status
*/
-NTSTATUS STDCALL
+NTSTATUS
+STDCALL
NtMapViewOfSection(
- IN HANDLE SectionHandle,
- IN HANDLE ProcessHandle,
- IN OUT PVOID *BaseAddress,
- IN ULONG ZeroBits,
- IN ULONG CommitSize,
- IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
- IN OUT PULONG ViewSize,
- IN SECTION_INHERIT InheritDisposition,
- IN ULONG AllocationType,
- IN ULONG AccessProtection
+ IN HANDLE SectionHandle,
+ IN HANDLE ProcessHandle,
+ IN OUT PVOID *BaseAddress,
+ IN ULONG ZeroBits,
+ IN ULONG CommitSize,
+ IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
+ IN OUT PULONG ViewSize,
+ IN SECTION_INHERIT InheritDisposition,
+ IN ULONG AllocationType,
+ IN ULONG AccessProtection
+ );
+
+NTSTATUS
+STDCALL
+ZwMapViewOfSection(
+ IN HANDLE SectionHandle,
+ IN HANDLE ProcessHandle,
+ IN OUT PVOID *BaseAddress,
+ IN ULONG ZeroBits,
+ IN ULONG CommitSize,
+ IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
+ IN OUT PULONG ViewSize,
+ IN SECTION_INHERIT InheritDisposition,
+ IN ULONG AllocationType,
+ IN ULONG AccessProtection
);
/*
OUT PVOID Buffer,
IN ULONG BufferSize,
IN ULONG CompletionFilter,
- IN BOOL WatchTree
+ IN BOOLEAN WatchTree
+ );
+
+NTSTATUS
+STDCALL
+ZwNotifyChangeDirectoryFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID Buffer,
+ IN ULONG BufferSize,
+ IN ULONG CompletionFilter,
+ IN BOOLEAN WatchTree
);
+
+/*
+ * FUNCTION: Installs a notfication callback on registry changes
+ * ARGUMENTS:
+ KeyHandle = Handle to the registry key
+ Event = Event that should be signalled on modification of the key
+ ApcRoutine = Routine that should be called on modification of the key
+ ApcContext = Argument to the ApcRoutine
+ IoStatusBlock = ???
+ CompletionFilter = Specifies the kind of notification the caller likes to receive.
+ Can be a combination of the following values:
+
+ REG_NOTIFY_CHANGE_NAME
+ REG_NOTIFY_CHANGE_ATTRIBUTES
+ REG_NOTIFY_CHANGE_LAST_SET
+ REG_NOTIFY_CHANGE_SECURITY
+
+
+ Asynchroneous = If TRUE the changes are reported by signalling an event if false
+ the function will not return before a change occurs.
+ ChangeBuffer = Will return the old value
+ Length = Size of the change buffer
+ WatchSubtree = Indicates if the caller likes to receive a notification of changes in
+ sub keys or not.
+ * REMARKS: If the key is closed the event is signalled aswell.
+ * RETURNS: Status
+ */
+
NTSTATUS
STDCALL
NtNotifyChangeKey(
IN BOOLEAN WatchSubtree
);
+NTSTATUS
+STDCALL
+ZwNotifyChangeKey(
+ IN HANDLE KeyHandle,
+ IN HANDLE Event,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN ULONG CompletionFilter,
+ IN BOOLEAN Asynchroneous,
+ OUT PVOID ChangeBuffer,
+ IN ULONG Length,
+ IN BOOLEAN WatchSubtree
+ );
+
/*
* FUNCTION: Opens an existing directory object
* ARGUMENTS:
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
+NTSTATUS
+STDCALL
+ZwOpenDirectoryObject(
+ OUT PHANDLE FileHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes
+ );
+
/*
* FUNCTION: Opens an existing event
* ARGUMENTS:
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
+
+NTSTATUS
+STDCALL
+ZwOpenEvent(
+ OUT PHANDLE EventHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes
+ );
/*
* FUNCTION: Opens an existing file
* ARGUMENTS:
IN ULONG OpenOptions
);
+NTSTATUS
+STDCALL
+ZwOpenFile(
+ OUT PHANDLE FileHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN ULONG ShareAccess,
+ IN ULONG OpenOptions
+ );
+
/*
* FUNCTION: Opens an existing io completion object
* ARGUMENTS:
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
+
+NTSTATUS
+STDCALL
+ZwOpenIoCompletion(
+ OUT PHANDLE CompetionPort,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes
+ );
/*
* FUNCTION: Opens an existing key in the registry
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
+
+NTSTATUS
+STDCALL
+ZwOpenKey(
+ OUT PHANDLE KeyHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes
+ );
/*
* FUNCTION: Opens an existing key in the registry
* ARGUMENTS:
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
+NTSTATUS
+STDCALL
+ZwOpenMutant(
+ OUT PHANDLE MutantHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes
+ );
/*
* FUNCTION: Opens an existing process
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId
);
+NTSTATUS
+STDCALL
+ZwOpenProcess (
+ OUT PHANDLE ProcessHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN PCLIENT_ID ClientId
+ );
/*
* FUNCTION: Opens an existing section object
* ARGUMENTS:
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
+NTSTATUS
+STDCALL
+ZwOpenSection(
+ OUT PHANDLE SectionHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes
+ );
/*
* FUNCTION: Opens an existing semaphore
* ARGUMENTS:
IN ACCESS_MASK DesiredAcces,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
+NTSTATUS
+STDCALL
+ZwOpenSemaphore(
+ IN HANDLE SemaphoreHandle,
+ IN ACCESS_MASK DesiredAcces,
+ IN POBJECT_ATTRIBUTES ObjectAttributes
+ );
/*
* FUNCTION: Opens an existing symbolic link
* ARGUMENTS:
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
+NTSTATUS
+STDCALL
+ZwOpenSymbolicLinkObject(
+ OUT PHANDLE SymbolicLinkHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes
+ );
/*
* FUNCTION: Opens an existing thread
* ARGUMENTS:
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId
);
+NTSTATUS
+STDCALL
+ZwOpenThread(
+ OUT PHANDLE ThreadHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN PCLIENT_ID ClientId
+ );
/*
* FUNCTION: Opens an existing timer
* ARGUMENTS:
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
+NTSTATUS
+STDCALL
+ZwOpenTimer(
+ OUT PHANDLE TimerHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes
+ );
/*
* FUNCTION: Entry point for native applications
* ARGUMENTS:
* Argument = Arguments passed to the application by the system [ at boot time ]
* REMARKS:
- * Native applications should use this function instead of a main.
+ * Native applications should use this function instead of a main. Calling proces should terminate itself.
* RETURNS: Status
*/
void NtProcessStartup(
IN ULONG NewAccessProtection,
OUT PULONG OldAccessProtection
);
+NTSTATUS
+STDCALL
+ZwProtectVirtualMemory(
+ IN HANDLE ProcessHandle,
+ IN PVOID BaseAddress,
+ IN ULONG NumberOfBytesToProtect,
+ IN ULONG NewAccessProtection,
+ OUT PULONG OldAccessProtection
+ );
+
/*
* FUNCTION: Signals an event and resets it afterwards.
* ARGUMENTS:
* EventHandle = Handle to the event
- * PulseCount = Number of times the action should be repeated
+ * PulseCount = Number of times the action is repeated
* RETURNS: Status
*/
NTSTATUS
IN PULONG PulseCount OPTIONAL
);
-//-- NtQueryAttributesFile
+NTSTATUS
+STDCALL
+ZwPulseEvent(
+ IN HANDLE EventHandle,
+ IN PULONG PulseCount OPTIONAL
+ );
+
+/*
+ * FUNCTION: Queries the attributes of a file
+ * ARGUMENTS:
+ * FileHandle = Handle to the file
+ * Buffer = Caller supplies storage for the attributes
+ * RETURNS: Status
+ */
+
+NTSTATUS
+STDCALL
+NtQueryAttributesFile(
+ IN HANDLE FileHandle,
+ IN PVOID Buffer
+ );
+
+NTSTATUS
+STDCALL
+ZwQueryAttributesFile(
+ IN HANDLE FileHandle,
+ IN PVOID Buffer
+ );
+
-// FileNameInformation - FILE_NAMES_INFORMATION
+/*
+ * FUNCTION: Queries a directory file.
+ * ARGUMENTS:
+ * FileHandle = Handle to a directory file
+ * EventHandle = Handle to the event signaled on completion
+ * ApcRoutine = Asynchroneous procedure callback, called on completion
+ * ApcContext = Argument to the apc.
+ * IoStatusBlock = Caller supplies storage for extended status information.
+ * FileInformation = Caller supplies storage for the resulting information.
+ *
+ * FileNameInformation FILE_NAMES_INFORMATION
+ * FileDirectoryInformation FILE_DIRECTORY_INFORMATION
+ * FileFullDirectoryInformation FILE_FULL_DIRECTORY_INFORMATION
+ * FileBothDirectoryInformation FILE_BOTH_DIR_INFORMATION
+ *
+ * Length = Size of the storage supplied
+ * FileInformationClass = Indicates the type of information requested.
+ * ReturnSingleEntry = Specify true if caller only requests the first directory found.
+ * FileName = Initial directory name to query, that may contain wild cards.
+ * RestartScan = Number of times the action should be repeated
+ * RETURNS: Status [ STATUS_SUCCESS, STATUS_ACCESS_DENIED, STATUS_INSUFFICIENT_RESOURCES,
+ * STATUS_INVALID_PARAMETER, STATUS_INVALID_DEVICE_REQUEST, STATUS_BUFFER_OVERFLOW,
+ * STATUS_INVALID_INFO_CLASS, STATUS_NO_SUCH_FILE, STATUS_NO_MORE_FILES ]
+ */
NTSTATUS
STDCALL
IN PUNICODE_STRING FileName OPTIONAL,
IN BOOLEAN RestartScan
);
+
+NTSTATUS
+STDCALL
+ZwQueryDirectoryFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID FileInformation,
+ IN ULONG Length,
+ IN FILE_INFORMATION_CLASS FileInformationClass,
+ IN BOOLEAN ReturnSingleEntry,
+ IN PUNICODE_STRING FileName OPTIONAL,
+ IN BOOLEAN RestartScan
+ );
/*
* FUNCTION: Query information about the content of a directory object
OUT PULONG DataWritten OPTIONAL
);
+NTSTATUS
+STDCALL
+ZwQueryDirectoryObject(
+ IN HANDLE DirObjHandle,
+ OUT POBJDIR_INFORMATION DirObjInformation,
+ IN ULONG BufferLength,
+ IN BOOLEAN GetNextIndex,
+ IN BOOLEAN IgnoreInputIndex,
+ IN OUT PULONG ObjectIndex,
+ OUT PULONG DataWritten OPTIONAL
+ );
+
+/*
+ * FUNCTION: Queries the extended attributes of a file
+ * ARGUMENTS:
+ * FileHandle = Handle to the event
+ * IoStatusBlock = Number of times the action is repeated
+ * Buffer
+ * Length
+ * ReturnSingleEntry
+ * EaList
+ * EaListLength
+ * EaIndex
+ * RestartScan
+ * RETURNS: Status
+ */
+
NTSTATUS
STDCALL
NtQueryEaFile(
IN PULONG EaIndex OPTIONAL,
IN BOOLEAN RestartScan
);
+
+NTSTATUS
+STDCALL
+ZwQueryEaFile(
+ 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
+ );
/*
* FUNCTION: Queries an event
* ARGUMENTS:
IN ULONG EventInformationLength,
OUT PULONG ReturnLength
);
-//-- NtQueryFullAttributesFile
-//-- NtQueryInformationAtom
+
+NTSTATUS
+STDCALL
+ZwQueryEvent(
+ IN HANDLE EventHandle,
+ IN CINT EventInformationClass,
+ OUT PVOID EventInformation,
+ IN ULONG EventInformationLength,
+ OUT PULONG ReturnLength
+ );
+NTSTATUS
+STDCALL
+NtQueryFullAttributesFile(
+ IN HANDLE FileHandle,
+ IN PVOID Attributes
+ );
+NTSTATUS
+STDCALL
+ZwQueryFullAttributesFile(
+ IN HANDLE FileHandle,
+ IN PVOID Attributes
+ );
+
+NTSTATUS
+STDCALL
+NtQueryInformationAtom(
+ IN HANDLE AtomHandle,
+ IN CINT AtomInformationClass,
+ OUT PVOID AtomInformation,
+ IN ULONG AtomInformationLength,
+ OUT PULONG ReturnLength
+ );
+NTSTATUS
+STDCALL
+NtQueryInformationAtom(
+ IN HANDLE AtomHandle,
+ IN CINT AtomInformationClass,
+ OUT PVOID AtomInformation,
+ IN ULONG AtomInformationLength,
+ OUT PULONG ReturnLength
+ );
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG Length,
- IN CINT FileInformationClass
+ IN FILE_INFORMATION_CLASS FileInformationClass
);
+NTSTATUS ZwQueryInformationFile(HANDLE FileHandle,
+ PIO_STATUS_BLOCK IoStatusBlock,
+ PVOID FileInformation,
+ ULONG Length,
+ FILE_INFORMATION_CLASS FileInformationClass);
+
/*
* FUNCTION: Queries the information of a process object.
* ARGUMENTS:
ProcessExceptionPort HANDLE
ProcessAccessToken PROCESS_ACCESS_TOKEN
ProcessLdtInformation LDT_ENTRY ??
- ProcessLdtSize ??
+ ProcessLdtSize ULONG
ProcessDefaultHardErrorMode ULONG
ProcessIoPortHandlers // kernel mode only
ProcessPooledUsageAndLimits POOLED_USAGE_AND_LIMITS
ProcessHandleCount ULONG
ProcessAffinityMask ULONG
ProcessPooledQuotaLimits QUOTA_LIMITS
- MaxProcessInfoClass ??
+ MaxProcessInfoClass
* ProcessInformation = Caller supplies storage for the process information structure
* ProcessInformationLength = Size of the process information structure
OUT PULONG ReturnLength
);
+NTSTATUS
+STDCALL
+ZwQueryInformationProcess(
+ IN HANDLE ProcessHandle,
+ IN CINT ProcessInformationClass,
+ OUT PVOID ProcessInformation,
+ IN ULONG ProcessInformationLength,
+ OUT PULONG ReturnLength
+ );
+
/*
* ThreadHandle = Handle to the thread object
* ThreadInformationClass = Index to a certain information structure
- ThreadBasicInformation THREAD_BASIC_INFORMATION
- ThreadTimes KERNEL_USER_TIMES
- ThreadPriority KPRIORITY
- ThreadBasePriority KPRIORITY
- ThreadAffinityMask KAFFINITY
+ ThreadBasicInformation THREAD_BASIC_INFORMATION
+ ThreadTimes KERNEL_USER_TIMES
+ ThreadPriority KPRIORITY
+ ThreadBasePriority KPRIORITY
+ ThreadAffinityMask KAFFINITY
ThreadImpersonationToken
ThreadDescriptorTableEntry
ThreadEnableAlignmentFaultFixup
STDCALL
NtQueryInformationThread(
IN HANDLE ThreadHandle,
- IN CINT ThreadInformationClass,
+ IN THREADINFOCLASS ThreadInformationClass,
OUT PVOID ThreadInformation,
IN ULONG ThreadInformationLength,
OUT PULONG ReturnLength
NTSTATUS
STDCALL
-NtQueryIoCompletion(
+ZwQueryIoCompletion(
IN HANDLE CompletionPort,
IN CINT CompletionInformationClass,
OUT PVOID CompletionInformation,
STDCALL
NtQueryKey(
IN HANDLE KeyHandle,
- IN CINT KeyInformationClass,
+ IN KEY_INFORMATION_CLASS KeyInformationClass,
+ OUT PVOID KeyInformation,
+ IN ULONG Length,
+ OUT PULONG ResultLength
+ );
+
+NTSTATUS
+STDCALL
+ZwQueryKey(
+ IN HANDLE KeyHandle,
+ IN KEY_INFORMATION_CLASS KeyInformationClass,
OUT PVOID KeyInformation,
IN ULONG Length,
OUT PULONG ResultLength
);
+// draft
-// preliminary guess
+NTSTATUS
+STDCALL
+NtQueryMultipleValueKey(
+ HANDLE KeyHandle,
+ PVALENT ListOfValuesToQuery,
+ ULONG NumberOfItems,
+ PVOID MultipleValueInformation,
+ ULONG Length,
+ PULONG ReturnLength
+);
NTSTATUS
STDCALL
-NtQueryMultipleValueKey(
+ZwQueryMultipleValueKey(
HANDLE KeyHandle,
PVALENT ListOfValuesToQuery,
ULONG NumberOfItems,
IN ULONG Length,
OUT PULONG ResultLength
);
-
+
+NTSTATUS
+STDCALL
+ZwQueryMutant(
+ IN HANDLE MutantHandle,
+ IN CINT MutantInformationClass,
+ OUT PVOID MutantInformation,
+ IN ULONG Length,
+ OUT PULONG ResultLength
+ );
/*
* FUNCTION: Queries the information of a object.
* ARGUMENTS:
IN ULONG Length,
OUT PULONG ResultLength
);
+NTSTATUS
+STDCALL
+ZwQueryObject(
+ IN HANDLE ObjectHandle,
+ IN CINT ObjectInformationClass,
+ OUT PVOID ObjectInformation,
+ IN ULONG Length,
+ OUT PULONG ResultLength
+ );
/*
* FUNCTION: Queries the system ( high-resolution ) performance counter.
IN PLARGE_INTEGER Counter,
IN PLARGE_INTEGER Frequency
);
+
+NTSTATUS
+STDCALL
+ZwQueryPerformanceCounter(
+ IN PLARGE_INTEGER Counter,
+ IN PLARGE_INTEGER Frequency
+ );
/*
* FUNCTION: Queries the information of a section object.
* ARGUMENTS:
IN ULONG Length,
OUT PULONG ResultLength
);
+NTSTATUS
+STDCALL
+ZwQuerySection(
+ IN HANDLE SectionHandle,
+ IN CINT SectionInformationClass,
+ OUT PVOID SectionInformation,
+ IN ULONG Length,
+ OUT PULONG ResultLength
+ );
/*
ULONG Length,
PULONG ReturnLength
);
+NTSTATUS
+STDCALL
+ZwQuerySemaphore(
+ HANDLE SemaphoreHandle,
+ CINT SemaphoreInformationClass,
+ OUT PVOID SemaphoreInformation,
+ ULONG Length,
+ PULONG ReturnLength
+ );
/*
* FUNCTION: Queries the information of a symbolic link object.
* ARGUMENTS:
* SymbolicLinkHandle = Handle to the symbolic link object
- * LinkName = resolved name of link
+ * LinkTarget = resolved name of link
* DataWritten = size of the LinkName.
* RETURNS: Status
*
NTSTATUS
STDCALL
NtQuerySymbolicLinkObject(
+ IN HANDLE SymLinkObjHandle,
+ OUT PUNICODE_STRING LinkTarget,
+ OUT PULONG DataWritten OPTIONAL
+ );
+
+NTSTATUS
+STDCALL
+ZwQuerySymbolicLinkObject(
IN HANDLE SymLinkObjHandle,
OUT PUNICODE_STRING LinkName,
OUT PULONG DataWritten OPTIONAL
);
-//-- NtQuerySystemEnvironmentValue
+
+
+/*
+ * FUNCTION: Queries a system environment variable.
+ * ARGUMENTS:
+ * Name = Name of the variable
+ * Value (OUT) = value of the variable
+ * Length = size of the buffer
+ * ReturnLength = data written
+ * RETURNS: Status
+ *
+*/
+NTSTATUS
+STDCALL
+NtQuerySystemEnvironmentValue(
+ IN PUNICODE_STRING Name,
+ OUT PVOID Value,
+ ULONG Length,
+ PULONG ReturnLength
+ );
+NTSTATUS
+STDCALL
+ZwQuerySystemEnvironmentValue(
+ IN PUNICODE_STRING Name,
+ OUT PVOID Value,
+ ULONG Length,
+ PULONG ReturnLength
+ );
/*
SystemTimeAdjustmentInformation SYSTEM_TIME_ADJUSTMENT
SystemCacheInformation SYSTEM_CACHE_INFORMATION
+ SystemConfigurationInformation CONFIGURATION_INFORMATION
* SystemInformation = caller supplies storage for the information structure
* Length = size of the structure
IN ULONG Length,
OUT PULONG ResultLength
);
+NTSTATUS
+STDCALL
+ZwQuerySystemInformation(
+ IN CINT SystemInformationClass,
+ OUT PVOID SystemInformation,
+ IN ULONG Length,
+ OUT PULONG ResultLength
+ );
/*
* FUNCTION: Retrieves the system time
NTSTATUS
STDCALL
NtQuerySystemTime (
- OUT PLARGE_INTEGER CurrentTime
+ OUT TIME *CurrentTime
+ );
+
+NTSTATUS
+STDCALL
+ZwQuerySystemTime (
+ OUT TIME *CurrentTime
+ );
+
+/*
+ * FUNCTION: Queries information about a timer
+ * ARGUMENTS:
+ * TimerHandle = Handle to the timer
+ TimerValueInformationClass = Index to a certain information structure
+ TimerValueInformation = Caller supplies storage for the information structure
+ Length = Size of the information structure
+ ResultLength = Data written
+ * RETURNS: Status
+ *
+*/
+NTSTATUS
+STDCALL
+NtQueryTimer(
+ IN HANDLE TimerHandle,
+ IN CINT TimerInformationClass,
+ OUT PVOID TimerInformation,
+ IN ULONG Length,
+ OUT PULONG ResultLength
+ );
+NTSTATUS
+STDCALL
+ZwQueryTimer(
+ IN HANDLE TimerHandle,
+ IN CINT TimerInformationClass,
+ OUT PVOID TimerInformation,
+ IN ULONG Length,
+ OUT PULONG ResultLength
);
-//-- NtQueryTimer
/*
* FUNCTION: Queries the timer resolution
*/
-NTSTATUS
+NTSTATUS
+STDCALL
NtQueryTimerResolution (
OUT PULONG MinimumResolution,
OUT PULONG MaximumResolution,
OUT PULONG ActualResolution
);
+NTSTATUS
+STDCALL
+ZwQueryTimerResolution (
+ OUT PULONG MinimumResolution,
+ OUT PULONG MaximumResolution,
+ OUT PULONG ActualResolution
+ );
+
/*
* FUNCTION: Queries a registry key value
* ARGUMENTS:
NtQueryValueKey(
IN HANDLE KeyHandle,
IN PUNICODE_STRING ValueName,
- IN CINT KeyValueInformationClass,
+ IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
+ OUT PVOID KeyValueInformation,
+ IN ULONG Length,
+ OUT PULONG ResultLength
+ );
+
+NTSTATUS
+STDCALL
+ZwQueryValueKey(
+ IN HANDLE KeyHandle,
+ IN PUNICODE_STRING ValueName,
+ IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
OUT PVOID KeyValueInformation,
IN ULONG Length,
OUT PULONG ResultLength
+
/*
* FUNCTION: Queries the virtual memory information.
* ARGUMENTS:
IN ULONG Length,
OUT PULONG ResultLength
);
+NTSTATUS
+STDCALL
+ZwQueryVirtualMemory(
+ IN HANDLE ProcessHandle,
+ IN PVOID Address,
+ IN IN CINT VirtualMemoryInformationClass,
+ OUT PVOID VirtualMemoryInformation,
+ IN ULONG Length,
+ OUT PULONG ResultLength
+ );
+
/*
* FUNCTION: Queries the volume information
* ARGUMENTS:
- * FileHandle =
+ * FileHandle = Handle to a file object on the target volume
ReturnLength = DataWritten
FSInformation = Caller should supply storage for the information structure.
Length = Size of the information structure
FileFsQuotaSetInformation --
FileFsMaximumInformation
- * RETURNS: Status
+ * RETURNS: Status [ STATUS_SUCCESS | STATUS_INSUFFICIENT_RESOURCES | STATUS_INVALID_PARAMETER |
+ STATUS_INVALID_DEVICE_REQUEST | STATUS_BUFFER_OVERFLOW ]
*
*/
NTSTATUS
IN ULONG Length,
IN CINT FSInformationClass
);
-// NtQueueApcThread
+
+NTSTATUS
+STDCALL
+ZwQueryVolumeInformationFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID FSInformation,
+ IN ULONG Length,
+ IN CINT FSInformationClass
+ );
+// draft
+// FIXME: Should I specify if the apc is user or kernel mode somewhere ??
+/*
+ * FUNCTION: Queues a (user) apc to a thread.
+ * ARGUMENTS:
+ ThreadHandle = Thread to which the apc is queued.
+ ApcRoutine = Points to the apc routine
+ NormalContext = Argument to Apc Routine
+ * SystemArgument1 = Argument of the Apc Routine
+ SystemArgument2 = Argument of the Apc Routine
+ * REMARK: If the apc is queued against a thread of a different process than the calling thread
+ the apc routine should be specified in the address space of the queued thread's process.
+ * RETURNS: Status
+*/
+
+NTSTATUS
+STDCALL
+NtQueueApcThread(
+ HANDLE ThreadHandle,
+ PKNORMAL_ROUTINE ApcRoutine,
+ PVOID NormalContext,
+ PVOID SystemArgument1,
+ PVOID SystemArgument2);
+
+NTSTATUS
+STDCALL
+ZwQueueApcThread(
+ HANDLE ThreadHandle,
+ PKNORMAL_ROUTINE ApcRoutine,
+ PVOID NormalContext,
+ PVOID SystemArgument1,
+ PVOID SystemArgument2);
/*
* FUNCTION: Raises an exception
* ARGUMENTS:
IN BOOL IsDebugger OPTIONAL
);
+NTSTATUS
+STDCALL
+ZwRaiseException(
+ IN PEXCEPTION_RECORD ExceptionRecord,
+ IN PCONTEXT Context,
+ IN BOOL IsDebugger OPTIONAL
+ );
+
//NtRaiseHardError
/*
* FUNCTION: Read a file
Buffer = Caller should supply storage to receive the information
BufferLength = Size of the buffer
ByteOffset = Offset to start reading the file
- Key = unused
+ Key = If a range is lock a matching key will allow the read to continue.
* RETURNS: Status
*
*/
IN PLARGE_INTEGER ByteOffset OPTIONAL,
IN PULONG Key OPTIONAL
);
+
+NTSTATUS
+STDCALL
+ZwReadFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
+ IN PVOID UserApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID Buffer,
+ IN ULONG BufferLength,
+ IN PLARGE_INTEGER ByteOffset OPTIONAL,
+ IN PULONG Key OPTIONAL
+ );
/*
* FUNCTION: Read a file using scattered io
* ARGUMENTS:
BufferDescription = Caller should supply storage to receive the information
BufferLength = Size of the buffer
ByteOffset = Offset to start reading the file
- Key = unused
+ Key = Key = If a range is lock a matching key will allow the read to continue.
* RETURNS: Status
*
*/
IN PLARGE_INTEGER ByteOffset,
IN PULONG Key OPTIONAL
);
+
+NTSTATUS
+STDCALL
+ZwReadFileScatter(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
+ IN PVOID UserApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK UserIoStatusBlock,
+ IN FILE_SEGMENT_ELEMENT BufferDescription[],
+ IN ULONG BufferLength,
+ IN PLARGE_INTEGER ByteOffset,
+ IN PULONG Key OPTIONAL
+ );
/*
* FUNCTION: Copies a range of virtual memory to a buffer
* ARGUMENTS:
NTSTATUS
STDCALL
NtReadVirtualMemory(
+ IN HANDLE ProcessHandle,
+ IN PVOID BaseAddress,
+ OUT PVOID Buffer,
+ IN ULONG NumberOfBytesToRead,
+ OUT PULONG NumberOfBytesRead
+ );
+NTSTATUS
+STDCALL
+ZwReadVirtualMemory(
IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
OUT PVOID Buffer,
IN ULONG NumberOfBytesToRead,
OUT PULONG NumberOfBytesRead
);
-//FIXME: Is the parameters correctly named ? ThreadHandle might be a TerminationPort
+
+
/*
* FUNCTION: Debugger can register for thread termination
* ARGUMENTS:
- * ThreadHandle =
+ * TerminationPort = Port on which the debugger likes to be notified.
* RETURNS: Status
*/
NTSTATUS
STDCALL
NtRegisterThreadTerminatePort(
- HANDLE ThreadHandle
+ HANDLE TerminationPort
+ );
+NTSTATUS
+STDCALL
+ZwRegisterThreadTerminatePort(
+ HANDLE TerminationPort
);
/*
* FUNCTION: Releases a mutant
* ARGUMENTS:
- * MutantHandle =
+ * MutantHandle = Handle to the mutant
* ReleaseCount =
* RETURNS: Status
*/
IN HANDLE MutantHandle,
IN PULONG ReleaseCount OPTIONAL
);
+
+NTSTATUS
+STDCALL
+ZwReleaseMutant(
+ IN HANDLE MutantHandle,
+ IN PULONG ReleaseCount OPTIONAL
+ );
/*
* FUNCTION: Releases a semaphore
* ARGUMENTS:
* SemaphoreHandle = Handle to the semaphore object
- * ReleaseCount =
- * PreviousCount =
+ * ReleaseCount = Number to decrease the semaphore count
+ * PreviousCount = Previous semaphore count
* RETURNS: Status
*/
NTSTATUS
IN ULONG ReleaseCount,
IN PULONG PreviousCount
);
+
+NTSTATUS
+STDCALL
+ZwReleaseSemaphore(
+ IN HANDLE SemaphoreHandle,
+ IN ULONG ReleaseCount,
+ IN PULONG PreviousCount
+ );
/*
* FUNCTION: Removes an io completion
* ARGUMENTS:
* CompletionPort (OUT) = Caller supplied storage for the resulting handle
* CompletionKey = Requested access to the key
- * IoStatusBlock =
- * ObjectAttribute = Initialized attributes for the object
- * CompletionStatus =
- * WaitTime =
+ * IoStatusBlock = Caller provides storage for extended status information
+ * CompletionStatus = Current status of the io operation.
+ * WaitTime = Time to wait if ..
* RETURNS: Status
*/
NTSTATUS
OUT PULONG CompletionStatus,
ULONG WaitTime
);
+
+NTSTATUS
+STDCALL
+ZwRemoveIoCompletion(
+ IN HANDLE CompletionPort,
+ OUT PULONG CompletionKey,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PULONG CompletionStatus,
+ ULONG WaitTime
+ );
/*
* FUNCTION: Replaces one registry key with another
* ARGUMENTS:
IN HANDLE Key,
IN POBJECT_ATTRIBUTES ReplacedObjectAttributes
);
+NTSTATUS
+STDCALL
+ZwReplaceKey(
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN HANDLE Key,
+ IN POBJECT_ATTRIBUTES ReplacedObjectAttributes
+ );
+
/*
* FUNCTION: Resets a event to a non signaled state
* ARGUMENTS:
HANDLE EventHandle,
PULONG NumberOfWaitingThreads OPTIONAL
);
-//Preliminary guess
+NTSTATUS
+STDCALL
+ZwResetEvent(
+ HANDLE EventHandle,
+ PULONG NumberOfWaitingThreads OPTIONAL
+ );
+//draft
NTSTATUS
STDCALL
NtRestoreKey(
HANDLE FileHandle,
ULONG RestoreFlags
);
+
+NTSTATUS
+STDCALL
+ZwRestoreKey(
+ HANDLE KeyHandle,
+ HANDLE FileHandle,
+ ULONG RestoreFlags
+ );
/*
* FUNCTION: Decrements a thread's resume count
* ARGUMENTS:
IN HANDLE ThreadHandle,
IN PULONG SuspendCount
);
+NTSTATUS
+STDCALL
+ZwResumeThread(
+ IN HANDLE ThreadHandle,
+ IN PULONG SuspendCount
+ );
/*
* FUNCTION: Writes the content of a registry key to ascii file
* ARGUMENTS:
IN HANDLE KeyHandle,
IN HANDLE FileHandle
);
+NTSTATUS
+STDCALL
+ZwSaveKey(
+ IN HANDLE KeyHandle,
+ IN HANDLE FileHandle
+ );
/*
* FUNCTION: Sets the context of a specified thread.
* ARGUMENTS:
IN HANDLE ThreadHandle,
IN PCONTEXT Context
);
+NTSTATUS
+STDCALL
+ZwSetContextThread(
+ IN HANDLE ThreadHandle,
+ IN PCONTEXT Context
+ );
/*
* FUNCTION: Sets the extended attributes of a file.
* ARGUMENTS:
*/
NTSTATUS
STDCALL
-NtSetEaFile(
+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
);
-//FIXME Shoud I have input EVENT_BASIC_INFORMATION ??
+//FIXME: should I return the event state ?
/*
- * FUNCTION: Sets the attributes of an event.
+ * FUNCTION: Sets the event to a signalled state.
* ARGUMENTS:
* EventHandle = Handle to the event
- * Count = The resulting count.
+ * NumberOfThreadsReleased = The number of threads released
* REMARK:
* This procedure maps to the win32 SetEvent function.
* RETURNS: Status
STDCALL
NtSetEvent(
IN HANDLE EventHandle,
- PULONG Count
+ PULONG NumberOfThreadsReleased
+ );
+
+NTSTATUS
+STDCALL
+ZwSetEvent(
+ IN HANDLE EventHandle,
+ PULONG NumberOfThreadsReleased
);
/*
IN HANDLE EventPair
);
+NTSTATUS
+STDCALL
+ZwSetHighEventPair(
+ IN HANDLE EventPair
+ );
/*
* FUNCTION: Sets the high part of an event pair and wait for the low part
* ARGUMENTS:
NtSetHighWaitLowEventPair(
IN HANDLE EventPair
);
+NTSTATUS
+STDCALL
+ZwSetHighWaitLowEventPair(
+ IN HANDLE EventPair
+ );
/*
* FUNCTION: Sets the information of a file object.
IN PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID FileInformation,
IN ULONG Length,
- IN CINT FileInformationClass
+ IN FILE_INFORMATION_CLASS FileInformationClass
+ );
+NTSTATUS
+STDCALL
+ZwSetInformationFile(
+ IN HANDLE FileHandle,
+ IN PIO_STATUS_BLOCK IoStatusBlock,
+ IN PVOID FileInformation,
+ IN ULONG Length,
+ IN FILE_INFORMATION_CLASS FileInformationClass
);
+
/*
* FUNCTION: Sets the information of a registry key.
* ARGUMENTS:
IN PVOID KeyInformation,
IN ULONG KeyInformationLength
);
+
+NTSTATUS
+STDCALL
+ZwSetInformationKey(
+ IN HANDLE KeyHandle,
+ IN CINT KeyInformationClass,
+ IN PVOID KeyInformation,
+ IN ULONG KeyInformationLength
+ );
/*
* FUNCTION: Changes a set of object specific parameters
* ARGUMENTS:
IN ULONG Length
);
+NTSTATUS
+STDCALL
+ZwSetInformationObject(
+ IN HANDLE ObjectHandle,
+ IN CINT ObjectInformationClass,
+ IN PVOID ObjectInformation,
+ IN ULONG Length
+ );
+
/*
* FUNCTION: Changes a set of process specific parameters
* ARGUMENTS:
IN PVOID ProcessInformation,
IN ULONG ProcessInformationLength
);
+NTSTATUS
+STDCALL
+ZwSetInformationProcess(
+ IN HANDLE ProcessHandle,
+ IN CINT ProcessInformationClass,
+ IN PVOID ProcessInformation,
+ IN ULONG ProcessInformationLength
+ );
/*
* FUNCTION: Changes a set of thread specific parameters
* ARGUMENTS:
STDCALL
NtSetInformationThread(
IN HANDLE ThreadHandle,
- IN CINT ThreadInformationClass,
+ IN THREADINFOCLASS ThreadInformationClass,
IN PVOID ThreadInformation,
IN ULONG ThreadInformationLength
);
-//FIXME: Are the arguments correct
+NTSTATUS
+STDCALL
+ZwSetInformationThread(
+ IN HANDLE ThreadHandle,
+ IN THREADINFOCLASS ThreadInformationClass,
+ IN PVOID ThreadInformation,
+ IN ULONG ThreadInformationLength
+ );
+
+ //FIXME: Are the arguments correct
// Might be a ordinary set function
/*
* FUNCTION: Sets an io completion
IN ULONG NumberOfBytesToTransfer,
OUT PULONG NumberOfBytesTransferred
);
+NTSTATUS
+STDCALL
+ZwSetIoCompletion(
+ IN HANDLE CompletionPort,
+ IN ULONG CompletionKey,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN ULONG NumberOfBytesToTransfer,
+ OUT PULONG NumberOfBytesTransferred
+ );
//FIXME: Should I have more parameters ?
/*
* FUNCTION: Initializes the Local Descriptor Table
LdtEntry =
* RETURNS: Status
*/
-NTSTATUS
-STDCALL
-NtSetLdtEntries(
- HANDLE ProcessHandle,
- PVOID LdtEntry // LDT_ENTR
- );
+//NTSTATUS
+//STDCALL
+//NtSetLdtEntries(
+// HANDLE ProcessHandle,
+// PVOID LdtEntry // LDT_ENTR
+// );
/*
* FUNCTION: Sets the low part of an event pair
NtSetLowEventPair(
HANDLE EventPair
);
-
+NTSTATUS
+STDCALL
+ZwSetLowEventPair(
+ HANDLE EventPair
+ );
/*
* FUNCTION: Sets the low part of an event pair and wait for the high part
* ARGUMENTS:
NtSetLowWaitHighEventPair(
HANDLE EventPair
);
+NTSTATUS
+STDCALL
+ZwSetLowWaitHighEventPair(
+ HANDLE EventPair
+ );
//FIXME: Should Value be a void pointer or a pointer to a unicode string ?
/*
NTSTATUS
STDCALL
NtSetSystemEnvironmentValue(
- IN PUNICODE_STRING ValueName,
- IN PVOID Value
+ IN PUNICODE_STRING VariableName,
+ IN PUNICODE_STRING Value
+ );
+NTSTATUS
+STDCALL
+ZwSetSystemEnvironmentValue(
+ IN PUNICODE_STRING VariableName,
+ IN PUNICODE_STRING Value
);
-
/*
* FUNCTION: Sets system parameters
* ARGUMENTS:
IN ULONG SystemInformationLength
);
+NTSTATUS
+STDCALL
+ZwSetSystemInformation(
+ IN CINT SystemInformationClass,
+ IN PVOID SystemInformation,
+ IN ULONG SystemInformationLength
+ );
+
/*
* FUNCTION: Sets the system time
* ARGUMENTS:
IN PLARGE_INTEGER SystemTime,
IN PLARGE_INTEGER NewSystemTime OPTIONAL
);
+NTSTATUS
+STDCALL
+ZwSetSystemTime(
+ IN PLARGE_INTEGER SystemTime,
+ IN PLARGE_INTEGER NewSystemTime OPTIONAL
+ );
/*
* FUNCTION: Sets the characteristics of a timer
* ARGUMENTS:
- * TimerHandle =
- * DueTime =
- * CompletionRoutine =
- * ArgToCompletionRoutine =
- * Resume =
- * Period =
+ * TimerHandle = Handle to the timer
+ * DueTime = Time before the timer becomes signalled for the first time.
+ * TimerApcRoutine = Completion routine can be called on time completion
+ * TimerContext = Argument to the completion routine
+ * Resume = Specifies if the timer should repeated after completing one cycle
+ * Period = Cycle of the timer
+ * REMARKS: This routine maps to the win32 SetWaitableTimer.
* RETURNS: Status
*/
NTSTATUS
NtSetTimer(
IN HANDLE TimerHandle,
IN PLARGE_INTEGER DueTime,
- IN PTIMERAPCROUTINE CompletionRoutine,
- IN PVOID ArgToCompletionRoutine,
- IN BOOL Resume,
- IN ULONG Period
+ IN PTIMERAPCROUTINE TimerApcRoutine,
+ IN PVOID TimerContext,
+ IN BOOL WakeTimer,
+ IN ULONG Period OPTIONAL,
+ OUT PBOOLEAN PreviousState OPTIONAL
+ );
+NTSTATUS
+STDCALL
+ZwSetTimer(
+ IN HANDLE TimerHandle,
+ IN PLARGE_INTEGER DueTime,
+ IN PTIMERAPCROUTINE TimerApcRoutine,
+ IN PVOID TimerContext,
+ IN BOOL WakeTimer,
+ IN ULONG Period OPTIONAL,
+ OUT PBOOLEAN PreviousState OPTIONAL
);
/*
* FUNCTION: Sets the frequency of the system timer
IN BOOL SetOrUnset,
OUT PULONG ActualResolution
);
+NTSTATUS
+STDCALL
+ZwSetTimerResolution(
+ IN ULONG RequestedResolution,
+ IN BOOL SetOrUnset,
+ OUT PULONG ActualResolution
+ );
/*
* FUNCTION: Sets the value of a registry key
* ARGUMENTS:
* ValueName = Name of the value entry to change
* TitleIndex = pointer to a structure containing the new volume information
* Type = Type of the registry key. Can be one of the values:
- * REG_BINARY
+ * REG_BINARY Unspecified binary data
* REG_DWORD A 32 bit value
* REG_DWORD_LITTLE_ENDIAN Same as REG_DWORD
* REG_DWORD_BIG_ENDIAN A 32 bit value whose least significant byte is at the highest address
IN PVOID Data,
IN ULONG DataSize
);
+NTSTATUS
+STDCALL
+ZwSetValueKey(
+ IN HANDLE KeyHandle,
+ IN PUNICODE_STRING ValueName,
+ IN ULONG TitleIndex OPTIONAL,
+ IN ULONG Type,
+ IN PVOID Data,
+ IN ULONG DataSize
+ );
/*
* FUNCTION: Sets the volume information of a file.
* ARGUMENTS:
PVOID VolumeInformation,
ULONG Length
);
+
+NTSTATUS
+STDCALL
+ZwSetVolumeInformationFile(
+ IN HANDLE FileHandle,
+ IN CINT VolumeInformationClass,
+ PVOID VolumeInformation,
+ ULONG Length
+ );
/*
* FUNCTION: Shuts the system down
* ARGUMENTS:
- * Action:
+ * Action: Specifies the type of shutdown, it can be one of the following values:
+ ShutdownNoReboot, ShutdownReboot, ShutdownPowerOff
* RETURNS: Status
*/
NTSTATUS
NtShutdownSystem(
IN SHUTDOWN_ACTION Action
);
+
+NTSTATUS
+STDCALL
+ZwShutdownSystem(
+ IN SHUTDOWN_ACTION Action
+ );
/*
* FUNCTION: Signals an event and wait for it to be signaled again.
* ARGUMENTS:
IN PLARGE_INTEGER Time,
PULONG NumberOfWaitingThreads OPTIONAL
);
+
+NTSTATUS
+STDCALL
+ZwSignalAndWaitForSingleObject(
+ IN HANDLE EventHandle,
+ IN BOOLEAN Alertable,
+ IN PLARGE_INTEGER Time,
+ PULONG NumberOfWaitingThreads OPTIONAL
+ );
/*
* FUNCTION: Increments a thread's resume count
* ARGUMENTS:
IN HANDLE ThreadHandle,
IN PULONG PreviousSuspendCount
);
+NTSTATUS
+STDCALL
+ZwSuspendThread(
+ IN HANDLE ThreadHandle,
+ IN PULONG PreviousSuspendCount
+ );
//--NtSystemDebugControl
/*
IN HANDLE ProcessHandle ,
IN NTSTATUS ExitStatus
);
+NTSTATUS
+STDCALL
+ZwTerminateProcess(
+ IN HANDLE ProcessHandle ,
+ IN NTSTATUS ExitStatus
+ );
/*
* FUNCTION: Terminates the execution of a thread.
* ARGUMENTS:
IN HANDLE ThreadHandle ,
IN NTSTATUS ExitStatus
);
+NTSTATUS
+STDCALL
+ZwTerminateThread(
+ IN HANDLE ThreadHandle ,
+ IN NTSTATUS ExitStatus
+ );
/*
- * FUNCTION: Test to see if there are any pending alerts for the calling thread
+ * FUNCTION: Tests to see if there are any pending alerts for the calling thread
* RETURNS: Status
*/
NTSTATUS
NtTestAlert(
VOID
);
+NTSTATUS
+STDCALL
+ZwTestAlert(
+ VOID
+ );
/*
* FUNCTION: Unloads a driver.
* ARGUMENTS:
NtUnloadDriver(
IN PUNICODE_STRING DriverServiceName
);
+NTSTATUS
+STDCALL
+ZwUnloadDriver(
+ IN PUNICODE_STRING DriverServiceName
+ );
//FIXME: NtUnloadKey needs more arguments
/*
- * FUNCTION: Unload a registry key.
+ * FUNCTION: Unloads a registry key.
* ARGUMENTS:
* KeyHandle = Handle to the registry key
* REMARK:
NtUnloadKey(
HANDLE KeyHandle
);
+NTSTATUS
+STDCALL
+ZwUnloadKey(
+ HANDLE KeyHandle
+ );
/*
* FUNCTION: Unlocks a range of bytes in a file.
The information field is set to the number of bytes unlocked.
* ByteOffset = Offset to start the range of bytes to unlock
* Length = Number of bytes to unlock.
- * Key =
+ * Key = Special value to enable other threads to unlock a file than the
+ thread that locked the file. The key supplied must match with the one obtained
+ in a previous call to NtLockFile.
* REMARK:
- This procedure maps to the win32 procedure UnlockFileEx
- * RETURNS: Status
+ This procedure maps to the win32 procedure UnlockFileEx. STATUS_PENDING is returned if the lock could
+ not be obtained immediately, the device queue is busy and the IRP is queued.
+ * RETURNS: Status [ STATUS_SUCCESS | STATUS_PENDING | STATUS_ACCESS_DENIED | STATUS_INSUFFICIENT_RESOURCES |
+ STATUS_INVALID_PARAMETER | STATUS_INVALID_DEVICE_REQUEST | STATUS_RANGE_NOT_LOCKED ]
*/
NTSTATUS
STDCALL
NtUnlockFile(
IN HANDLE FileHandle,
- OUT IO_STATUS_BLOCK IoStatusBlock,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN LARGE_INTEGER ByteOffset,
+ IN LARGE_INTEGER Lenght,
+ OUT PULONG Key OPTIONAL
+ );
+NTSTATUS
+STDCALL
+ZwUnlockFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
IN LARGE_INTEGER ByteOffset,
IN LARGE_INTEGER Lenght,
OUT PULONG Key OPTIONAL
* NumberOfBytesUnlocked (OUT) = Number of bytes actually unlocked.
* REMARK:
This procedure maps to the win32 procedure VirtualUnlock
- * RETURNS: Status
+ * RETURNS: Status [ STATUS_SUCCESS | STATUS_PAGE_WAS_ULOCKED ]
*/
NTSTATUS
STDCALL
ULONG NumberOfBytesToUnlock,
PULONG NumberOfBytesUnlocked OPTIONAL
);
+
+NTSTATUS
+STDCALL
+ZwUnlockVirtualMemory(
+ HANDLE ProcessHandle,
+ PVOID BaseAddress,
+ ULONG NumberOfBytesToUnlock,
+ PULONG NumberOfBytesUnlocked OPTIONAL
+ );
/*
* FUNCTION: Unmaps a piece of virtual memory backed by a file.
* ARGUMENTS:
IN HANDLE ProcessHandle,
IN PVOID BaseAddress
);
+NTSTATUS
+STDCALL
+ZwUnmapViewOfSection(
+ IN HANDLE ProcessHandle,
+ IN PVOID BaseAddress
+ );
/*
* FUNCTION: Waits for multiple objects to become signalled.
* ARGUMENTS:
* Count = The number of objects
* Object = The array of object handles
- * WaitType =
+ * WaitType = Can be one of the values UserMode or KernelMode
* Alertable = If true the wait is alertable.
* Time = The maximum wait time.
* REMARKS:
STDCALL
NtWaitForMultipleObjects (
IN ULONG Count,
- IN PHANDLE Object[0],
+ IN PHANDLE Object[],
+ IN CINT WaitType,
+ IN BOOLEAN Alertable,
+ IN PLARGE_INTEGER Time
+ );
+
+NTSTATUS
+STDCALL
+ZwWaitForMultipleObjects (
+ IN ULONG Count,
+ IN PHANDLE Object[],
IN CINT WaitType,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Time
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Time
);
+
+NTSTATUS
+STDCALL
+ZwWaitForSingleObject (
+ IN PHANDLE Object,
+ IN BOOLEAN Alertable,
+ IN PLARGE_INTEGER Time
+ );
+
+NTSTATUS
+STDCALL
+NtWaitLowEventPair(
+ IN HANDLE EventHandle
+ );
+
+NTSTATUS
+STDCALL
+ZwWaitLowEventPair(
+ IN HANDLE EventHandle
+ );
/*
* FUNCTION: Writes data to a file
* ARGUMENTS:
* FileHandle = The handle a file ( from NtCreateFile )
- * Event =
+ * Event = Specifies a event that will become signalled when the write operation completes.
* ApcRoutine = Asynchroneous Procedure Callback [ Should not be used by device drivers ]
* ApcContext = Argument to the Apc Routine
* IoStatusBlock = Caller should supply storage for a structure containing the completion status and information about the requested write operation.
* REMARKS:
* This function maps to the win32 WriteFile.
* Callers to NtWriteFile should run at IRQL PASSIVE_LEVEL.
- * RETURNS: Status
+ * RETURNS: Status [ STATUS_SUCCESS | STATUS_PENDING | STATUS_ACCESS_DENIED | STATUS_INSUFFICIENT_RESOURCES
+ STATUS_INVALID_PARAMETER | STATUS_INVALID_DEVICE_REQUEST | STATUS_FILE_LOCK_CONFLICT ]
*/
NTSTATUS
STDCALL
NtWriteFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PVOID Buffer,
+ IN ULONG Length,
+ IN PLARGE_INTEGER ByteOffset,
+ IN PULONG Key OPTIONAL
+ );
+
+NTSTATUS
+STDCALL
+ZwWriteFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
* ByteOffset = Points to a file offset. If a combination of Length and BytesOfSet is past the end-of-file mark the file will be enlarged.
* BytesOffset is ignored if the file is created with FILE_APPEND_DATA in the DesiredAccess. BytesOffset is also ignored if
* the file is created with CreateOptions flags FILE_SYNCHRONOUS_IO_ALERT or FILE_SYNCHRONOUS_IO_NONALERT set, in that case a offset
- * should be created by specifying FILE_USE_FILE_POINTER_POSITION.
- * Key = Unused
+ * should be created by specifying FILE_USE_FILE_POINTER_POSITION. Use FILE_WRITE_TO_END_OF_FILE to write to the EOF.
+ * Key = If a matching key [ a key provided at NtLockFile ] is provided the write operation will continue even if a byte range is locked.
* REMARKS:
* This function maps to the win32 WriteFile.
* Callers to NtWriteFile should run at IRQL PASSIVE_LEVEL.
- * RETURNS: Status
+ * RETURNS: Status [ STATUS_SUCCESS | STATUS_PENDING | STATUS_ACCESS_DENIED | STATUS_INSUFFICIENT_RESOURCES
+ STATUS_INVALID_PARAMETER | STATUS_INVALID_DEVICE_REQUEST | STATUS_FILE_LOCK_CONFLICT ]
*/
NTSTATUS
-STDCALL NtWriteFileScatter(
+STDCALL
+NtWriteFileGather(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN FILE_SEGMENT_ELEMENT BufferDescription[],
+ IN ULONG BufferLength,
+ IN PLARGE_INTEGER ByteOffset,
+ IN PULONG Key OPTIONAL
+ );
+
+NTSTATUS
+STDCALL
+ZwWriteFileGather(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PULONG Key OPTIONAL
);
+
/*
* FUNCTION: Writes a range of virtual memory
* ARGUMENTS:
IN ULONG NumberOfBytesToWrite,
OUT PULONG NumberOfBytesWritten
);
+
+NTSTATUS
+STDCALL
+ZwWriteVirtualMemory(
+ IN HANDLE ProcessHandle,
+ IN PVOID BaseAddress,
+ IN PVOID Buffer,
+ IN ULONG NumberOfBytesToWrite,
+ OUT PULONG NumberOfBytesWritten
+ );
/*
* FUNCTION: Yields the callers thread.
* RETURNS: Status
VOID
);
+NTSTATUS
+STDCALL
+ZwYieldExecution(
+ VOID
+ );
+/*
+ * These prototypes are unknown as yet
+ */
+NTSTATUS STDCALL NtAcceptConnectPort(VOID);
+NTSTATUS STDCALL NtAccessCheckAndAuditAlarm(VOID);
+NTSTATUS STDCALL NtAdjustGroupsToken(VOID);
+NTSTATUS STDCALL NtAdjustPrivilegesToken(VOID);
+NTSTATUS STDCALL NtAllocateUuids(VOID);
+NTSTATUS STDCALL NtCloseObjectAuditAlarm(VOID);
+NTSTATUS STDCALL NtCompleteConnectPort(VOID);
+NTSTATUS STDCALL NtConnectPort(VOID);
+NTSTATUS STDCALL NtCreateMailslotFile(VOID);
+NTSTATUS STDCALL NtCreateNamedPipeFile(VOID);
+NTSTATUS STDCALL NtCreatePort(VOID);
+NTSTATUS STDCALL NtCreateProfile(VOID);
+NTSTATUS STDCALL NtCreateToken(VOID);
+NTSTATUS STDCALL NtDeleteObjectAuditAlarm(VOID);
+NTSTATUS STDCALL NtDuplicateToken(VOID);
+NTSTATUS STDCALL NtGetPlugPlayEvent(VOID);
+NTSTATUS STDCALL NtImpersonateClientOfPort(VOID);
+NTSTATUS STDCALL NtImpersonateThread(VOID);
+NTSTATUS STDCALL NtListenPort(VOID);
+NTSTATUS STDCALL NtLoadKey2(VOID);
+NTSTATUS STDCALL NtOpenEventPair(VOID);
+NTSTATUS STDCALL NtOpenObjectAuditAlarm(VOID);
+NTSTATUS STDCALL NtOpenProcessToken(VOID);
+NTSTATUS STDCALL NtOpenThreadToken(VOID);
+NTSTATUS STDCALL NtPlugPlayControl(VOID);
+NTSTATUS STDCALL NtPrivilegeCheck(VOID);
+NTSTATUS STDCALL NtPrivilegedServiceAuditAlarm(VOID);
+NTSTATUS STDCALL NtPrivilegeObjectAuditAlarm(VOID);
+NTSTATUS STDCALL NtQueryDefaultLocale(VOID);
+NTSTATUS STDCALL NtQueryIoCompletion(VOID);
+NTSTATUS STDCALL NtQueryInformationPort(VOID);
+NTSTATUS STDCALL NtQueryInformationToken(VOID);
+NTSTATUS STDCALL NtQueryIntervalProfile(VOID);
+NTSTATUS STDCALL NtQueryOleDirectoryFile(VOID);
+NTSTATUS STDCALL NtQuerySecurityObject(VOID);
+NTSTATUS STDCALL NtRaiseHardError(VOID);
+NTSTATUS STDCALL NtReadRequestData(VOID);
+NTSTATUS STDCALL NtReplyPort(VOID);
+NTSTATUS STDCALL NtReplyWaitReceivePort(VOID);
+NTSTATUS STDCALL NtReplyWaitReplyPort(VOID);
+NTSTATUS STDCALL NtRequestPort(VOID);
+NTSTATUS STDCALL NtSetDefaultHardErrorPort(VOID);
+NTSTATUS STDCALL NtSetDefaultLocale(VOID);
+NTSTATUS STDCALL NtSetInformationToken(VOID);
+NTSTATUS STDCALL NtSetIntervalProfile(VOID);
+NTSTATUS STDCALL NtSetLdtEntries(VOID);
+NTSTATUS STDCALL NtSetSecurityObject(VOID);
+NTSTATUS STDCALL NtSetSystemPowerState(VOID);
+NTSTATUS STDCALL NtStartProfile(VOID);
+NTSTATUS STDCALL NtStopProfile(VOID);
+NTSTATUS STDCALL NtSystemDebugControl(VOID);
+NTSTATUS STDCALL NtVdmControl(VOID);
+NTSTATUS STDCALL NtWaitHighEventPair(VOID);
+NTSTATUS STDCALL NtWriteRequestData(VOID);
+NTSTATUS STDCALL NtW32Call(VOID);
+NTSTATUS STDCALL NtCreateChannel(VOID);
+NTSTATUS STDCALL NtListenChannel(VOID);
+NTSTATUS STDCALL NtOpenChannel(VOID);
+NTSTATUS STDCALL NtReplyWaitSendChannel(VOID);
+NTSTATUS STDCALL NtSendWaitReplyChannel(VOID);
+NTSTATUS STDCALL NtSetContextChannel(VOID);
+NTSTATUS STDCALL NtRequestWaitReplyPort(VOID);
+
#endif /* __DDK_ZW_H */
#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 */
#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)
#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)
#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)
#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)
#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 */
#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)
#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
#define ASCIICHAR AsciiChar
#define FAR
-#define PACKED __attribute__((packed))
#define FILTER_TEMP_DUPLICATE_ACCOUNT (0x0001)
#define FILTER_NORMAL_ACCOUNT (0x0002)
}
#endif /* __cplusplus */
+#endif /* WIN32_LEAN_AND_MEAN */
+
#endif /* _GNU_H_WINDOWS32_DEFINES */
#ifndef _GNU_H_WINDOWS32_FUNCTIONS
#define _GNU_H_WINDOWS32_FUNCTIONS
+#ifndef WIN32_LEAN_AND_MEAN
+
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
DWORD STDCALL NetLocalGroupEnum (LPWSTR, DWORD, LPBYTE*, DWORD, LPDWORD,
LPDWORD, LPDWORD);
+
+VOID CopyMemory(PVOID Destination, CONST VOID* Source, DWORD Length);
+
void WINAPI
SHAddToRecentDocs (UINT, LPCVOID);
}
#endif /* __cplusplus */
+#endif /* WIN32_LEAN_AND_MEAN */
+
#endif /* _GNU_H_WINDOWS32_FUNCTIONS */
#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);
unsigned char io_bitmap[1];
} hal_thread_state;
+
/*
* FUNCTION: Probes for a PCI bus
* RETURNS: True if found
#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:
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
/* 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);
#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>
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;
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.
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
OBJTYP_DEVICE,
OBJTYP_THREAD,
OBJTYP_FILE,
+ OBJTYP_PROCESS,
+ OBJTYP_SECTION,
OBJTYP_MAX,
};
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
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 */
#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 */
#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
* 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
#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
HEAP_BLOCK Start __attribute__((aligned (8)));
} HEAP, *PHEAP;
-//PHEAP __ProcessHeap;
-
#endif /* __INCLUDE_KERNEL32_HEAP_H */
#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 */
-
+
typedef struct _ABC {
int abcA;
UINT abcB;
WORD AceSize;
} ACE_HEADER;
-typedef DWORD ACCESS_MASK;
typedef ACCESS_MASK REGSAM;
typedef struct _ACCESS_ALLOWED_ACE {
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;
WORD wReserved;
DCB dcb;
DWORD dwProviderSubType;
- DWORD dwProviderOffset;
- DWORD dwProviderSize;
- WCHAR wcProviderData[1];
-} COMMCONFIG, *LPCOMMCONFIG;
-
-typedef struct _COMMPROP {
- WORD wPacketLength;
- WORD wPacketVersion;
- DWORD dwServiceMask;
- DWORD dwReserved1;
- DWORD dwMaxTxQueue;
- DWORD dwMaxRxQueue;
- DWORD dwMaxBaud;
- DWORD dwProvSubType;
- DWORD dwProvCapabilities;
- DWORD dwSettableParams;
- DWORD dwSettableBaud;
- WORD wSettableData;
- WORD wSettableStopParity;
- DWORD dwCurrentTxQueue;
- DWORD dwCurrentRxQueue;
- DWORD dwProvSpec1;
- DWORD dwProvSpec2;
- WCHAR wcProvChar[1];
-} COMMPROP, *LPCOMMPROP;
-
-typedef struct _COMMTIMEOUTS {
- DWORD ReadIntervalTimeout;
- DWORD ReadTotalTimeoutMultiplier;
- DWORD ReadTotalTimeoutConstant;
- DWORD WriteTotalTimeoutMultiplier;
- DWORD WriteTotalTimeoutConstant;
-} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
-
-typedef struct tagCOMPAREITEMSTRUCT {
- UINT CtlType;
- UINT CtlID;
- HWND hwndItem;
- UINT itemID1;
- DWORD itemData1;
- UINT itemID2;
- DWORD itemData2;
-} COMPAREITEMSTRUCT;
-
-typedef struct {
- COLORREF crText;
- COLORREF crBackground;
- DWORD dwEffects;
-} COMPCOLOR;
-
-typedef struct _tagCOMPOSITIONFORM {
- DWORD dwStyle;
- POINT ptCurrentPos;
- RECT rcArea;
-} COMPOSITIONFORM, *LPCOMPOSITIONFORM;
-
-typedef struct _COMSTAT {
- DWORD fCtsHold : 1;
- DWORD fDsrHold : 1;
- DWORD fRlsdHold : 1;
- DWORD fXoffHold : 1;
- DWORD fXoffSent : 1;
- DWORD fEof : 1;
- DWORD fTxim : 1;
- DWORD fReserved : 25;
- DWORD cbInQue;
- DWORD cbOutQue;
-} COMSTAT, *LPCOMSTAT;
-
-typedef struct _CONSOLE_CURSOR_INFO {
- DWORD dwSize;
- WINBOOL bVisible;
-} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
-
-typedef struct _COORD {
- SHORT X;
- SHORT Y;
-} COORD;
-
-typedef struct _SMALL_RECT {
- SHORT Left;
- SHORT Top;
- SHORT Right;
- SHORT Bottom;
-} SMALL_RECT, *PSMALL_RECT;
-
-typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
- COORD dwSize;
- COORD dwCursorPosition;
- WORD wAttributes;
- SMALL_RECT srWindow;
- 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 dwProviderOffset;
+ DWORD dwProviderSize;
+ WCHAR wcProviderData[1];
+} COMMCONFIG, *LPCOMMCONFIG;
- DWORD Cr; /* Condition register */
- DWORD Xer; /* Fixed point exception register */
+typedef struct _COMMPROP {
+ WORD wPacketLength;
+ WORD wPacketVersion;
+ DWORD dwServiceMask;
+ DWORD dwReserved1;
+ DWORD dwMaxTxQueue;
+ DWORD dwMaxRxQueue;
+ DWORD dwMaxBaud;
+ DWORD dwProvSubType;
+ DWORD dwProvCapabilities;
+ DWORD dwSettableParams;
+ DWORD dwSettableBaud;
+ WORD wSettableData;
+ WORD wSettableStopParity;
+ DWORD dwCurrentTxQueue;
+ DWORD dwCurrentRxQueue;
+ DWORD dwProvSpec1;
+ DWORD dwProvSpec2;
+ WCHAR wcProvChar[1];
+} COMMPROP, *LPCOMMPROP;
- /* 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 */
+typedef struct _COMMTIMEOUTS {
+ DWORD ReadIntervalTimeout;
+ DWORD ReadTotalTimeoutMultiplier;
+ DWORD ReadTotalTimeoutConstant;
+ DWORD WriteTotalTimeoutMultiplier;
+ DWORD WriteTotalTimeoutConstant;
+} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
- /* Control which context values are returned */
- DWORD ContextFlags;
- DWORD Fill[3];
+typedef struct tagCOMPAREITEMSTRUCT {
+ UINT CtlType;
+ UINT CtlID;
+ HWND hwndItem;
+ UINT itemID1;
+ DWORD itemData1;
+ UINT itemID2;
+ DWORD itemData2;
+} COMPAREITEMSTRUCT;
- /* 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 {
+ COLORREF crText;
+ COLORREF crBackground;
+ DWORD dwEffects;
+} COMPCOLOR;
-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 _tagCOMPOSITIONFORM {
+ DWORD dwStyle;
+ POINT ptCurrentPos;
+ RECT rcArea;
+} COMPOSITIONFORM, *LPCOMPOSITIONFORM;
-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 _COMSTAT {
+ DWORD fCtsHold : 1;
+ DWORD fDsrHold : 1;
+ DWORD fRlsdHold : 1;
+ DWORD fXoffHold : 1;
+ DWORD fXoffSent : 1;
+ DWORD fEof : 1;
+ DWORD fTxim : 1;
+ DWORD fReserved : 25;
+ DWORD cbInQue;
+ DWORD cbOutQue;
+} COMSTAT, *LPCOMSTAT;
-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 _CONSOLE_CURSOR_INFO {
+ DWORD dwSize;
+ WINBOOL bVisible;
+} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
+
+typedef struct _SMALL_RECT {
+ SHORT Left;
+ SHORT Top;
+ SHORT Right;
+ SHORT Bottom;
+} SMALL_RECT, *PSMALL_RECT;
+
+typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
+ COORD dwSize;
+ COORD dwCursorPosition;
+ WORD wAttributes;
+ SMALL_RECT srWindow;
+ COORD dwMaximumWindowSize;
+} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO ;
typedef struct tagCONVCONTEXT {
UINT cb;
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;
HANDLE dshSection;
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;
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;
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;
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;
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;
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;
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;
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;
DWORD cbSize;
DWORD dwFlags;
} TOGGLEKEYS;
-
-typedef struct _TOKEN_SOURCE {
- CHAR SourceName[8];
- LUID SourceIdentifier;
-} TOKEN_SOURCE;
typedef struct _TOKEN_CONTROL {
LUID TokenId;
UINT nSec;
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;
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;
}
#endif /* __cplusplus */
+#endif /* WIN32_LEAN_AND_MEAN */
+
#endif /* _GNU_H_WINDOWS32_STRUCTURES */
#include <base.h>
/* WIN32 messages */
-#ifndef _WIN32_LEAN_AND_MEAN
+#ifndef WIN32_LEAN_AND_MEAN
#include <messages.h>
#endif
#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
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
-
/*
* 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
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
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;
+}
+
+
* todo: check the _lopen for correctness
*/
+#undef WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <string.h>
#include <wstring.h>
-
+#include <fcntl.h>
}
-long
-_lread(HFILE fd,LPVOID buffer,long count)
+UINT STDCALL _lread(HFILE fd,LPVOID buffer,UINT count)
{
return _hread(fd,buffer, count);
}
}
-
-long _lwrite(
- HFILE hFile,
- LPCSTR lpBuffer,
- long lBytes
- )
+UINT
+STDCALL
+_lwrite(
+ HFILE hFile,
+ LPCSTR lpBuffer,
+ UINT uBytes
+ )
{
- return _hwrite(hFile,lpBuffer,lBytes);
+ return _hwrite(hFile,lpBuffer,uBytes);
}
#define OF_OPENMASK (OF_READ|OF_READWRITE|OF_WRITE|OF_CREATE)
if ( CloseHandle((HANDLE)hFile) )
return 0;
else
- rerturn -1;
+ return -1;
}
LONG _llseek(
-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:
* 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[]=
{
{ 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);
{
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);
}
/*********************************************************************
#endif
if((end >= pheap->LastBlock)&&(start<= pheap->LastBlock))
pheap->LastBlock=start;
- return __VirtualDecommit(start, end-start );
+
+ return(VirtualFree(start,end-start,MEM_RESERVE));
}
/*********************************************************************
LPVOID commitend;
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);
/* 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;
}
/* alloc a new fragment */
pmem=__HeapAllocFragment(pheap, flags, size);
if(pmem)
- memcpy(pmem, pold, size);
+ CopyMemory(pmem, pold, size);
return pmem;
}
#endif
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);
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);
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;
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);
}
/*********************************************************************
* 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);
}
return __ErrorReturnFalse(ERROR_INVALID_PARAMETER);
DeleteCriticalSection(&(pheap->Synchronize));
- __VirtualRelease(pheap);
-
+ VirtualFree(pheap,0,MEM_RELEASE);
+
return TRUE;
}
/*********************************************************************
* 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;
/*********************************************************************
* 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);
/*********************************************************************
* 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);
/* 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);
+}
+#include <windows.h>
#include <process.h>
/*
* Win32 Process Api functions
#define NT_CURRENT_THREAD 0xFFFFFFFE
-WINBASEAPI
-HANDLE
-WINAPI
-GetCurrentProcess()
+HANDLE STDCALL GetCurrentProcess(VOID)
{
return NT_CURRENT_PROCESS;
}
-WINBASEAPI
-DWORD
-WINAPI
-GetCurrentProcessId()
+HANDLE STDCALL GetCurrentThread()
{
- return GetTeb()->dwProcessId;
+ return NT_CURRENT_PROCESS;
}
+#if 0
WINBASEAPI
-HANDLE
+DWORD
WINAPI
-GetCurrentThread()
+GetCurrentProcessId()
{
- return NT_CURRENT_PROCESS;
+ return GetTeb()->dwProcessId;
}
+
WINBASEAPI
DWORD
WINAPI
return FALSE;
}
}
+
+#endif
-all: genntdll$(EXE_POSTFIX)
+all: ntdll.a
-genntdll$(EXE_POSTFIX): genntdll.c
- $(NATIVE_CC) -g genntdll.c -o genntdll$(EXE_POSTFIX)
+OBJECTS = napi.o
+
+ntdll.a: $(OBJECTS)
+ $(AR) vcsr ntdll.a $(OBJECTS)
+
dummy:
include ../../rules.mak
#
# Select your host
#
-#HOST = djgpp-linux
-#HOST = mingw32-linux
+#HOST = djgpp-linux
+#HOST = mingw32-linux
HOST = djgpp-msdos
-#HOST = mingw32-windows
+#HOST = mingw32-windows
-include rules.mak
+include rules.mak
#
# Required to run the system
#
-COMPONENTS = kernel lib
+COMPONENTS = iface_native ntoskrnl kernel32 ntdll crtdll mingw32
#
-# Select the loader(s) you want to build
+# Select the server(s) you want to build
#
-LOADERS = dos
+SERVERS = win32 posix linux os2
#
-# Select the modules you want
+# Select the loader(s) you want to build
#
-MODULES = parallel keyboard
+LOADERS = dos
-all: $(COMPONENTS) $(LOADERS) $(MODULES)
+#
+# Select the device drivers and filesystems you want
+#
+KERNEL_SERVICES = parallel keyboard null mouse serial sound ide test sdisk \
+ minix vfat
+
+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
#
-# Device driver rules
+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
#
dos: dummy
- make -C loaders/dos
+ make -C loaders/dos
#
# Required system components
#
-kernel: dummy
- make -C ntoskrnl
+ntoskrnl: dummy
+ make -C ntoskrnl
+
+kernel32: dummy
+ make -C lib/kernel32
+
+ntdll: dummy
+ make -C lib/ntdll
+
+crtdll: dummy
+ make -C lib/crtdll
-lib: dummy
- make -C lib
+mingw32: dummy
+ make -C lib/mingw32
dummy:
/* FUNCTIONS *****************************************************************/
+NTSTATUS STDCALL NtSystemDebugControl(VOID)
+{
+ UNIMPLEMENTED;
+}
+
VOID DbgBreakPoint(VOID)
{
__asm__("int $3\n\t");
{
}
-VOID NtReturnFromCallBack(VOID)
-/*
- * FUNCTION: Returns from a user callback
- */
+NTSTATUS STDCALL NtCallbackReturn(VOID)
+{
+ UNIMPLEMENTED;
+}
+
+NTSTATUS STDCALL NtW32Call(VOID)
{
+ UNIMPLEMENTED;
}
/* 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)
{
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)
&normal_work_queue.Lock);
KeSetEvent(&normal_work_queue.Busy,IO_NO_INCREMENT,FALSE);
break;
- };
+ }
}
ZwWriteFile
sprintf
wcschr
+wcsncat
+wcsncpy
+wtolower
+wtoupper
+CbInitDccb
+CbAcquireForRead
+CbReleaseFromRead
#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 ******************************************************************/
#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,};
#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"
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);
unsigned int esi, unsigned int ebp,
unsigned int esp, unsigned int ebx,
unsigned int edx, unsigned int ecx,
- unsigned int eax,
+ unsigned int eax,
unsigned int type,
- unsigned int ds,
+ 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,
__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
*/
*/
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);
{
printk("ESP %.8x\n",esp);
}
+ else
+ {
+ printk("ESP %.8x\n",esp);
+ }
__asm__("movl %%cr2,%0\n\t"
: "=d" (cr2));
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) +
{
set_interrupt_gate(i,(int)exception_handler_unknown);
}
+
+ set_system_call_gate(0x2e,(int)interrupt_handler2e);
}
#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
/* 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);
/* FUNCTIONS *****************************************************************/
-BOOL HalIsaProbe()
+BOOL HalIsaProbe(VOID)
/*
* FUNCTION: Probes for an ISA bus
* RETURNS: True if detected
/*
* Probe for plug and play support
*/
-
+ return(TRUE);
}
/* INCLUDES ***************************************************************/
-#include <internal/hal/page.h>
+#include <internal/mmhal.h>
#include <internal/mm.h>
#include <internal/string.h>
#include <internal/bitops.h>
/* 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
/*
* 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:
#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>
/* FUNCTIONS ***************************************************************/
+
void HalSwitchToBlueScreen(void)
/*
* FUNCTION: Switches the monitor to text mode and writes a blue background
}
+
+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
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
#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>
static char null_ldt[8]={0,};
static unsigned int null_ldt_sel=0;
-static PKTHREAD FirstThread=NULL;
+static PETHREAD FirstThread=NULL;
/* FUNCTIONS **************************************************************/
* 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,
: /* 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)
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:
{
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
*/
/*
* 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
*/
__asm__("ltr %%ax"
: /* no output */
- : "a" (thread->Context.nr));
+ : "a" (thread->Tcb.Context.nr));
FirstThread = thread;
}
;
;
-%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
- ;
- push ds
- push es
- push esi
- push edi
-
- ;
- ; Transfer the parameters from user mode
- ;
- push USER_DS
- pop es
-
- mov edx,esi
- mov esp,edi
- mov ecx,_SystemServiceTable[eax*4]
- sub esp,ecx
- cld
- rep movsb
-
- ;
- ; Call the actual service routine
- ;
- mov eax,_SystemServiceTable[eax*4+4]
- jmp eax
-
- ;
- ; Restore registers and return
- ;
- pop edi
- pop esi
- pop es
- pop ds
- ret
+_interrupt_handler2e:
+ push ds
+ push es
+ push esi
+ push edi
+
+ mov bx,KERNEL_DS
+ mov es,bx
+
+ mov esi,edx
+ mov ecx,[es:__SystemServiceTable+eax*8]
+ sub esp,ecx
+ mov edi,esp
+ rep movsb
+
+ mov ds,bx
+
+ mov eax,[__SystemServiceTable+4+eax*8]
+ call eax
+
+ pop edi
+ pop esi
+ pop es
+ pop ds
+ iret
/* 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;
/* 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,
* EaLength = Undocumented
* RETURNS: Status
*/
-{
- UNIMPLEMENTED;
-}
-
-NTSTATUS ZwOpenFile(PHANDLE FileHandle,
- ACCESS_MASK DesiredAccess,
- POBJECT_ATTRIBUTES ObjectAttributes,
- PIO_STATUS_BLOCK IoStatusBlock,
- ULONG ShareAccess,
- ULONG OpenOptions)
-/*
- * FUNCTION: Opens a file (simpler than ZwCreateFile)
- * ARGUMENTS:
- * FileHandle (OUT) = Variable that receives the file handle on return
- * DesiredAccess = Access desired by the caller to the file
- * ObjectAttributes = Structue describing the file to be opened
- * IoStatusBlock (OUT) = Receives details about the result of the
- * operation
- * ShareAccess = Type of shared access the caller requires
- * OpenOptions = Options for the file open
- * RETURNS: Status
- * NOTE: Undocumented
- */
{
PVOID Object;
NTSTATUS Status;
PIO_STACK_LOCATION StackLoc;
PWSTR Remainder;
- DPRINT("ZwOpenFile(FileHandle %x, ObjectAttributes %x, "
- "ObjectAttributes->ObjectName->Buffer %w)\n",FileHandle,
- ObjectAttributes,ObjectAttributes->ObjectName->Buffer);
+ 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,0,NULL,OBJTYP_FILE);
+ 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__);
- ObDeleteHandle(*FileHandle);
+ ZwClose(*FileHandle);
*FileHandle=0;
- ExFreePool(FileObject);
return(STATUS_UNSUCCESSFUL);
}
CHECKPOINT;
FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN;
FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool,
- ObjectAttributes->Length);
+ ObjectAttributes->ObjectName->Length);
+ FileObject->FileName.Length = ObjectAttributes->Length;
RtlCopyUnicodeString(&(FileObject->FileName),
ObjectAttributes->ObjectName);
}
if (DeviceObject->DeviceType != FILE_DEVICE_FILE_SYSTEM &&
DeviceObject->DeviceType != FILE_DEVICE_DISK)
{
- ObDeleteHandle(*FileHandle);
+ ZwClose(*FileHandle);
*FileHandle=0;
- ExFreePool(FileObject);
return(STATUS_UNSUCCESSFUL);
}
if (!(DeviceObject->Vpb->Flags & VPB_MOUNTED))
Status = IoTryToMountStorageDevice(DeviceObject);
if (Status!=STATUS_SUCCESS)
{
- ObDeleteHandle(*FileHandle);
+ ZwClose(*FileHandle);
*FileHandle=0;
- ExFreePool(FileObject);
return(Status);
}
DeviceObject = IoGetAttachedDevice(DeviceObject);
}
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;
Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
if (Irp==NULL)
{
- ObDeleteHandle(*FileHandle);
+ ZwClose(*FileHandle);
*FileHandle=0;
- ExFreePool(FileObject);
return(STATUS_UNSUCCESSFUL);
}
if (Status!=STATUS_SUCCESS)
{
- ObDeleteHandle(*FileHandle);
+ ZwClose(*FileHandle);
*FileHandle=0;
- ExFreePool(FileObject);
}
+ 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,
+ ACCESS_MASK DesiredAccess,
+ POBJECT_ATTRIBUTES ObjectAttributes,
+ PIO_STATUS_BLOCK IoStatusBlock,
+ ULONG ShareAccess,
+ ULONG OpenOptions)
+/*
+ * FUNCTION: Opens a file (simpler than ZwCreateFile)
+ * ARGUMENTS:
+ * FileHandle (OUT) = Variable that receives the file handle on return
+ * DesiredAccess = Access desired by the caller to the file
+ * ObjectAttributes = Structue describing the file to be opened
+ * IoStatusBlock (OUT) = Receives details about the result of the
+ * operation
+ * ShareAccess = Type of shared access the caller requires
+ * OpenOptions = Options for the file open
+ * RETURNS: Status
+ * NOTE: Undocumented
+ */
+{
+ return(ZwCreateFile(FileHandle,
+ DesiredAccess,
+ ObjectAttributes,
+ IoStatusBlock,
+ NULL,
+ 0,
+ ShareAccess,
+ FILE_OPEN,
+ OpenOptions,
+ NULL,
+ 0));
}
/* 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
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;
/* 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;
}
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,
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
+ )
+{
+}
/* 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);
if (current->DeviceObject == DeviceObject)
{
RemoveEntryList(current_entry);
+ ExFreePool(current);
KeReleaseSpinLock(&FileSystemListLock,oldlvl);
return;
}
{
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
+ )
+{
+}
#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 ****************************************************************/
{
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);
-
- RtlInitAnsiString(&astring,"File");
- RtlAnsiStringToUnicodeString(&FileObjectType.TypeName,&astring,TRUE);
- ObRegisterType(OBJTYP_FILE,&FileObjectType);
+ IoDeviceType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
+
+ 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();
/* INCLUDES *****************************************************************/
-#include <internal/hal/page.h>
+#include <internal/mmhal.h>
#include <ddk/ntddk.h>
#include <internal/debug.h>
#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,
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)
{
return(Status);
}
- *LinkHandle = ObAddHandle(Object);
+ *LinkHandle = ObInsertHandle(KeGetCurrentProcess(),Object,
+ DesiredAccess,FALSE);
return(STATUS_SUCCESS);
}
-NTSTATUS ZwQuerySymbolicLinkObject(IN HANDLE LinkHandle,
+NTSTATUS NtQuerySymbolicLinkObject(IN HANDLE LinkHandle,
IN OUT PUNICODE_STRING LinkTarget,
OUT PULONG ReturnedLength OPTIONAL)
{
- COMMON_BODY_HEADER* hdr = ObGetObjectByHandle(LinkHandle);
- PSYMLNK_OBJECT SymlinkObject = (PSYMLNK_OBJECT)hdr;
+ return(ZwQuerySymbolicLinkObject(LinkHandle,LinkTarget,ReturnedLength));
+}
- if (hdr==NULL)
+NTSTATUS ZwQuerySymbolicLinkObject(IN HANDLE LinkHandle,
+ IN OUT PUNICODE_STRING LinkTarget,
+ OUT PULONG ReturnedLength OPTIONAL)
+{
+ PSYMLNK_OBJECT SymlinkObject;
+ NTSTATUS Status;
+
+ 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);
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)
{
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);
{
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;
+}
+
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)
#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)
+{
+ 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)
{
- PLIST_ENTRY current_entry;
- PKAPC current;
- PKTHREAD CurrentThread=KeGetCurrentThread();
+ KIRQL oldlvl;
+
+ DPRINT("KeInsertQueueApc(Apc %x, SystemArgument1 %x, "
+ "SystemArgument2 %x, Mode %d)\n",Apc,SystemArgument1,
+ SystemArgument2,Mode);
- while ((current_entry=RemoveHeadList(CurrentThread->ApcList))!=NULL)
+ KeRaiseIrql(DISPATCH_LEVEL,&oldlvl);
+
+ if (Apc->KernelRoutine != NULL)
{
- current = CONTAINING_RECORD(current_entry,KAPC,ApcListEntry);
- current->NormalRoutine(current->NormalContext,
- current->SystemArgument1,
- current->SystemArgument2);
- current_entry = current_entry->Flink;
+ KeDeliverKernelApc(Apc);
}
+ KeLowerIrql(oldlvl);
}
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;
+}
VOID KeInitializeCallbackRecord(PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
{
+ UNIMPLEMENTED;
}
BOOLEAN KeRegisterBugCheckCallback(PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
DbgPrint("Bug detected (code %x param %x %x %x %x)\n",BugCheckCode,
BugCheckParameter1,BugCheckParameter2,BugCheckParameter3,
BugCheckParameter4);
+ *((unsigned int *)0)=0;
for(;;);
}
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
+ )
+{
+}
#include <windows.h>
#include <ddk/ntddk.h>
#include <internal/ke.h>
+#include <internal/ps.h>
/* FUNCTIONS ****************************************************************/
/* INCLUDE *****************************************************************/
#include <windows.h>
+#include <ddk/ntddk.h>
/* GLOBALS *****************************************************************/
error_code=dwErrCode;
}
+
+NTSTATUS STDCALL NtRaiseHardError(VOID)
+{
+}
+
+NTSTATUS STDCALL NtSetDefaultHardErrorPort(VOID)
+{
+}
/* INCLUDES *****************************************************************/
#include <ddk/ntddk.h>
+#include <internal/ke.h>
#define NDEBUG
#include <internal/debug.h>
*
*/
#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
{"_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},
};
/* FUNCTIONS *****************************************************************/
-VOID KeInit()
+VOID KeInit(VOID)
{
KeInitDpc();
KeInitializeBugCheck();
LONG Adjustment,
BOOLEAN Wait)
{
+ UNIMPLEMENTED;
}
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)
+#define TICKS_TO_CALIBRATE (1)
+#define CALIBRATE_PERIOD (MICROSECONDS_PER_TICK * TICKS_TO_CALIBRATE)
-static unsigned int loops_per_microsecond = 17;
+static unsigned int loops_per_microsecond = 100;
/* FUNCTIONS **************************************************************/
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;
- 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)
- {
- DbgPrint("Testing loop\n");
- KeStallExecutionProcessor(10000);
- DbgPrint("Finished loop\n");
- return;
- }
+ microseconds = 0;
+ while (start_tick == ticks);
+ while (ticks == (start_tick+TICKS_TO_CALIBRATE))
+ {
+ 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)
{
KeInitializeTimer(&(Thread->TimerBlock));
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)
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)
/*
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));
};
}
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);
}
{
DISPATCHER_HEADER* hdr = (DISPATCHER_HEADER *)Object;
KWAIT_BLOCK blk;
- KIRQL oldlvl;
DPRINT("Entering KeWaitForSingleObject(Object %x)\n",Object);
if (hdr->SignalState)
{
- hdr->SignalState=FALSE;
- KeReleaseDispatcherDatabaseLock(FALSE);
- return(STATUS_SUCCESS);
+ if (hdr->Type == SynchronizationEvent)
+ {
+ hdr->SignalState=FALSE;
+ }
+ KeReleaseDispatcherDatabaseLock(FALSE);
+ return(STATUS_SUCCESS);
}
if (Timeout!=NULL)
// DPRINT("hdr->WaitListHead.Flink %x hdr->WaitListHead.Blink %x\n",
// hdr->WaitListHead.Flink,hdr->WaitListHead.Blink);
KeReleaseDispatcherDatabaseLock(FALSE);
- PsSuspendThread();
+ PsSuspendThread(PsGetCurrentThread());
return(STATUS_SUCCESS);
}
{
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;
+}
/* 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>
unsigned int eflags;
__asm__("pushf\n\tpop %0\n\tcli\n\t"
: "=d" (eflags));
- CHECKPOINT;
+
/*
* If we are totally out of memory then panic
*/
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--;
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);
}
#include <internal/bitops.h>
#include <internal/string.h>
-#include <internal/hal/page.h>
+#include <internal/mmhal.h>
#define NDEBUG
#include <internal/debug.h>
{
set_page(i,0,0);
}
+ set_page(0,0,0);
FLUSH_TLB;
CHECKPOINT;
/*
*/
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
%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
* 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)
-/*
- * 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
- * ARGUMENTS:
- * blk = block to check
- * NOTE: Bug checks if duplicates are found
- */
-{
- 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;
- }
-
-}
-
-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)
+PVOID ExAllocatePool(POOL_TYPE PoolType, ULONG NumberOfBytes)
/*
- * FUNCTION: Releases previously allocated memory
+ * 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:
- * block = block to free
+ * 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
*/
{
- 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();
+ return(ExAllocatePoolWithTag(PoolType,NumberOfBytes,TAG_NONE));
}
-#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)
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:
{
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:
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);
-}
#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 ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN PLARGE_INTEGER MaximumSize OPTIONAL,
IN ULONG SectionPageProtection OPTIONAL,
* 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,
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;
}
Result = 0;
Status = MmCreateMemoryArea(KernelMode,
+ PsGetCurrentProcess(),
MEMORY_AREA_SYSTEM,
&Result,
Length,
Result=0;
Status = MmCreateMemoryArea(KernelMode,
+ PsGetCurrentProcess(),
MEMORY_AREA_IO_MAPPING,
&Result,
NumberOfBytes,
VOID MmUnmapIoSpace(PVOID BaseAddress, ULONG NumberOfBytes)
{
- (void)MmFreeMemoryArea(BaseAddress,NumberOfBytes,FALSE);
+ (void)MmFreeMemoryArea(PsGetCurrentProcess(),BaseAddress,NumberOfBytes,
+ FALSE);
}
PVOID MmAllocateNonCachedMemory(ULONG NumberOfBytes)
Result=0;
Status = MmCreateMemoryArea(KernelMode,
+ PsGetCurrentProcess(),
MEMORY_AREA_NO_CACHE,
&Result,
NumberOfBytes,
VOID MmFreeNonCachedMemory(PVOID BaseAddress, ULONG NumberOfBytes)
{
- MmFreeMemoryArea(BaseAddress,NumberOfBytes,TRUE);
+ MmFreeMemoryArea(PsGetCurrentProcess(),BaseAddress,NumberOfBytes,TRUE);
}
* 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>
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;
*/
{
unsigned int kernel_len = bp->end_mem - bp->start_mem;
- ULONG BaseAddress;
+ PVOID BaseAddress;
ULONG Length;
ULONG ParamLength = kernel_len;
/*
* 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,
&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();
+}
+
+ULONG MmCommitedSectionHandleFault(MEMORY_AREA* MemoryArea, ULONG Address)
+{
+ set_page(Address,0x7,get_free_page());
+ return(TRUE);
}
-NTSTATUS MmSectionHandleFault(MEMORY_AREA* MemoryArea, ULONG Address)
+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
*/
*/
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);
FaultMode = KernelMode;
}
- MemoryArea = MmOpenMemoryAreaByAddress(cr2);
+ MemoryArea = MmOpenMemoryAreaByAddress(PsGetCurrentProcess(),(PVOID)cr2);
if (MemoryArea==NULL)
{
printk("%s:%d\n",__FILE__,__LINE__);
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;
return(stat);
}
-
BOOLEAN MmIsNonPagedSystemAddressValid(PVOID VirtualAddress)
{
UNIMPLEMENTED;
* 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);
+}
+
/* TYPES *******************************************************************/
-/*
- * PURPOSE: Defines a handle
- */
-typedef struct
-{
- PVOID obj;
-} HANDLE_REP, *PHANDLE_REP;
-
#define HANDLE_BLOCK_ENTRIES ((PAGESIZE-sizeof(LIST_ENTRY))/sizeof(HANDLE_REP))
/*
HANDLE_REP handles[HANDLE_BLOCK_ENTRIES];
} HANDLE_BLOCK;
-/* GLOBALS *****************************************************************/
+/* FUNCTIONS ***************************************************************/
+
+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)
/*
- * PURPOSE: Head of the list of handle blocks
+ * 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.
*/
-LIST_ENTRY handle_list_head = {NULL,NULL};
-KSPIN_LOCK handle_list_lock = {0};
-
-/* FUNCTIONS ***************************************************************/
+{
+ 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 ObjDestroyHandleTable(VOID)
+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);
}
/*
*/
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
- */
+VOID ObDeleteHandle(HANDLE Handle)
{
- DPRINT("ObGetObjectByHandle(h %x)\n",h);
+ PHANDLE_REP Rep;
- if (h==NULL)
- {
- return(NULL);
- }
+ DPRINT("ObDeleteHandle(Handle %x)\n",Handle);
- return(ObTranslateHandle(h)->obj);
+ Rep = ObTranslateHandle(KeGetCurrentProcess(),Handle);
+ Rep->ObjectBody=NULL;
+ DPRINT("Finished ObDeleteHandle()\n");
}
-VOID ObDeleteHandle(HANDLE Handle)
-{
- PHANDLE_REP Rep = ObTranslateHandle(Handle);
- Rep->obj=NULL;
-}
-
-HANDLE ObAddHandle(PVOID obj)
+HANDLE ObInsertHandle(PKPROCESS Process, PVOID ObjectBody,
+ ACCESS_MASK GrantedAccess, BOOLEAN Inherit)
/*
* FUNCTION: Add a handle referencing an object
* ARGUMENTS:
* 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));
}
}
*/
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);
}
/* 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
{
/* 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)
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,
* 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;
*/
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);
PACCESS_STATE PassedAccessState,
ACCESS_MASK DesiredAccess,
POBJECT_TYPE ObjectType,
- KPROCESSOR_MODE Accessmode,
+ KPROCESSOR_MODE AccessMode,
PVOID ParseContext,
PVOID* ObjectPtr)
{
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,
Object,
UnparsedSection);
DPRINT("*Object %x\n",*Object);
+ DPRINT("ObjectAttributes->ObjectName->Length %d\n",
+ ObjectAttributes->ObjectName->Length);
return(Status);
}
* FUNCTION: Initialize the object manager namespace
*/
{
- ANSI_STRING ansi_str;
+ ANSI_STRING AnsiString;
- ObInitializeObjectHeader(OBJTYP_DIRECTORY,NULL,&namespc_root.hdr);
- InitializeListHead(&namespc_root.head);
+ 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);
- RtlInitAnsiString(&ansi_str,"Directory");
- RtlAnsiStringToUnicodeString(&DirectoryObjectType.TypeName,&ansi_str,
- TRUE);
- ObRegisterType(OBJTYP_DIRECTORY,&DirectoryObjectType);
+ ObInitializeObjectHeader(ObDirectoryType,NULL,&namespc_root.hdr);
+ InitializeListHead(&namespc_root.head);
+}
+
+NTSTATUS NtCreateDirectoryObject(PHANDLE DirectoryHandle,
+ ACCESS_MASK DesiredAccess,
+ POBJECT_ATTRIBUTES ObjectAttributes)
+{
+ return(ZwCreateDirectoryObject(DirectoryHandle,
+ DesiredAccess,
+ ObjectAttributes));
}
NTSTATUS ZwCreateDirectoryObject(PHANDLE DirectoryHandle,
PDIRECTORY_OBJECT dir;
dir = ObGenericCreateObject(DirectoryHandle,DesiredAccess,ObjectAttributes,
- OBJTYP_DIRECTORY);
+ ObDirectoryType);
/*
* Initialize the object body
}
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));
}
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)
/*
* 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,
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;
{
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);
}
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;
- Status = STATUS_UNSUCCESSFUL;
- break;
}
+ else
+ {
+ Status = STATUS_UNSUCCESSFUL;
+ }
}
CHECKPOINT;
*Object = current_dir;
#define NDEBUG
#include <internal/debug.h>
-/* GLOBALS ****************************************************************/
+/* FUNCTIONS ************************************************************/
-/*
- * List of pointers to object types
- */
-static POBJECT_TYPE ObjectTypes[OBJTYP_MAX]={NULL,};
+NTSTATUS STDCALL NtSetInformationObject(IN HANDLE ObjectHandle,
+ IN CINT ObjectInformationClass,
+ IN PVOID ObjectInformation,
+ IN ULONG Length)
+{
+ return(ZwSetInformationObject(ObjectHandle,
+ ObjectInformationClass,
+ ObjectInformation,
+ Length));
+}
-/* FUNCTIONS ************************************************************/
+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
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));
}
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:
{
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));
}
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
* 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)
*/
{
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);
}
* 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);
+ }
+
+ ObjectHeader = BODY_TO_HEADER(HandleRep->ObjectBody);
+
+ if (ObjectType != NULL && ObjectType != ObjectHeader->ObjectType)
+ {
+ return(STATUS_UNSUCCESSFUL);
}
- return(ObReferenceObjectByPointer(ObjectBody,DesiredAccess,
- ObjectType,AccessMode));
+
+ if (!(HandleRep->GrantedAccess & DesiredAccess))
+ {
+ return(STATUS_ACCESS_DENIED);
+ }
+
+ ObjectHeader->RefCount++;
+
+ *Object = HandleRep->ObjectBody;
+
+ return(STATUS_SUCCESS);
}
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));
}
/* 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));
}
* FUNCTION: Returns a pointer to the current process
*/
{
- DPRINT("PsGetCurrentProcess() = %x\n",PsGetCurrentThread()->ThreadsProcess);
- return(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;
+}
VOID PsInit(VOID)
{
- ObjInitializeHandleTable(NULL);
PsInitProcessManagment();
PsInitThreadManagment();
PsInitIdleThread();
/* GLOBALS ******************************************************************/
-OBJECT_TYPE ThreadObjectType = {{NULL,0,0},
- 0,
- 0,
- ULONG_MAX,
- ULONG_MAX,
- sizeof(ETHREAD),
- 0,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- };
-
-#define NR_THREAD_PRIORITY_LEVELS (32)
+POBJECT_TYPE PsThreadType = NULL;
-static KSPIN_LOCK ThreadListLock = {0,};
+#define NR_THREAD_PRIORITY_LEVELS (31)
+#define THREAD_PRIORITY_MAX (15)
-/*
- * PURPOSE: List of all threads currently active
- */
-static LIST_ENTRY ThreadListHead = {NULL,NULL};
+static KSPIN_LOCK ThreadListLock = {0,};
/*
* PURPOSE: List of threads associated with each priority level
/* FUNCTIONS ***************************************************************/
-NTSTATUS ZwSetInformationThread(HANDLE ThreadHandle,
- THREADINFOCLASS ThreadInformationClass,
- PVOID ThreadInformation,
- ULONG ThreadInformationLength)
-{
- UNIMPLEMENTED;
-}
-
PKTHREAD KeGetCurrentThread(VOID)
{
- return((PKTHREAD)CurrentThread);
+ return(&(CurrentThread->Tcb));
}
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++)
+ DPRINT("PsInsertIntoThreadList(Priority %d, Thread %x)\n",Priority,Thread);
+
+ KeAcquireSpinLock(&ThreadListLock,&oldlvl);
+ InsertTailList(&PriorityListHead[THREAD_PRIORITY_MAX+Priority],
+ &Thread->Tcb.Entry);
+ KeReleaseSpinLock(&ThreadListLock,oldlvl);
+}
+
+static PETHREAD PsScanThreadList(KPRIORITY Priority)
+{
+ PLIST_ENTRY current_entry;
+ 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])
{
- if (PsDispatchSpecificPriorityThread(i))
+ current = CONTAINING_RECORD(current_entry,ETHREAD,Tcb.Entry);
+ if (current->Tcb.ThreadState == THREAD_STATE_RUNNABLE)
{
- return;
+ 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);
}
-#endif
-void PsDispatchThread(void)
-/*
- * FUNCTION: Chooses a thread, possibly the current one if it is runnable
- * and dispatches it
- */
+VOID PsDispatchThread(VOID)
{
+ KPRIORITY CurrentPriority;
+ PETHREAD Candidate;
KIRQL irql;
- PLIST_ENTRY current_entry;
- PKTHREAD current;
+ LARGE_INTEGER TickCount;
+
+ KeAcquireSpinLock(&ThreadListLock,&irql);
if (!DoneInitYet)
{
}
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)
- {
- DPRINT("Scheduling this one %x\n",current);
- CurrentThread = current;
+ Candidate = PsScanThreadList(CurrentPriority);
+ if (Candidate == CurrentThread)
+ {
+ 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 (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;
+ }
}
+}
+
+NTSTATUS PsInitializeThread(HANDLE ProcessHandle,
+ PETHREAD* ThreadPtr,
+ PHANDLE ThreadHandle,
+ ACCESS_MASK DesiredAccess,
+ POBJECT_ATTRIBUTES ThreadAttributes)
+{
+ ULONG ThreadId;
+ ULONG ProcessId;
+ PETHREAD Thread;
+ NTSTATUS Status;
- /*
- * If there are no other threads then continue with the current one if
- * possible
- */
- if (CurrentThread->Tcb.ThreadState == THREAD_STATE_RUNNABLE)
+ 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)
{
- return;
+ 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);
- /*
- * Disaster
- */
- printk("Out of threads at %s:%d\n",__FILE__,__LINE__);
- for(;;);
+ *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)
* 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);
- DoneInitYet = TRUE;
-}
-
-NTSTATUS PsWakeThread(PETHREAD Thread)
-{
- Thread->Tcb.ThreadState = THREAD_STATE_RUNNABLE;
- return(STATUS_SUCCESS);
-}
+ 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;
-NTSTATUS PsSuspendThread(VOID)
-/*
- * FUNCTION: Suspend the current thread
- */
-{
- KIRQL oldlvl;
+ DPRINT("FirstThread %x\n",FirstThread);
- DPRINT("suspending %x\n",CurrentThread);
+ CurrentThread = FirstThread;
- /*
- * NOTE: When we return from PsDispatchThread the spinlock will be
- * released
- */
- CurrentThread->Tcb.ThreadState = THREAD_STATE_SUSPENDED;
- PsDispatchThread();
- return(STATUS_SUCCESS);
+ DoneInitYet = TRUE;
}
-
-
-NTSTATUS PsTerminateSystemThread(NTSTATUS ExitStatus)
-/*
- * FUNCTION: Terminates the current thread
- * ARGUMENTS:
- * ExitStatus = Status to pass to the creater
- * RETURNS: Doesn't
- */
+NTSTATUS NtCreateThread(PHANDLE ThreadHandle,
+ ACCESS_MASK DesiredAccess,
+ POBJECT_ATTRIBUTES ObjectAttributes,
+ HANDLE ProcessHandle,
+ PCLIENT_ID Client,
+ PCONTEXT ThreadContext,
+ PINITIAL_TEB InitialTeb,
+ BOOLEAN CreateSuspended)
{
- KIRQL oldlvl;
-
- DPRINT("terminating %x\n",CurrentThread);
- KeRaiseIrql(DISPATCH_LEVEL,&oldlvl);
- CurrentThread->Tcb.ThreadState = THREAD_STATE_TERMINATED;
- RemoveEntryList(&CurrentThread->Tcb.Entry);
- PsDispatchThread();
- for(;;);
+ return(ZwCreateThread(ThreadHandle,
+ DesiredAccess,
+ ObjectAttributes,
+ ProcessHandle,
+ Client,
+ ThreadContext,
+ InitialTeb,
+ CreateSuspended));
}
-NTSTATUS NtCreateThread(PHANDLE ThreadHandle,
+NTSTATUS ZwCreateThread(PHANDLE ThreadHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
HANDLE ProcessHandle,
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,
* 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);
-
- 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);
+ 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);
+
if (ClientId!=NULL)
{
- *ClientId=thread->Cid;
+ *ClientId=Thread->Cid;
+ }
+
+ PsResumeThread(Thread);
+
+ return(STATUS_SUCCESS);
+}
+
+LONG KeSetBasePriorityThread(PKTHREAD Thread, LONG Increment)
+{
+ UNIMPLEMENTED;
+}
+
+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);
}
- if (ProcessHandle!=NULL)
- {
- thread->ThreadsProcess=ObGetObjectByHandle(ProcessHandle);
+ (*SuspendCount) = InterlockedDecrement(&Thread->Tcb.SuspendCount);
+ if (Thread->Tcb.SuspendCount <= 0)
+ {
+ Thread->Tcb.ThreadState = THREAD_STATE_RUNNABLE;
}
- else
+
+ 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)
{
- thread->ThreadsProcess=&SystemProcess;
+ return(Status);
}
- thread->StartAddress=StartRoutine;
+ (*PreviousSuspendCount) = InterlockedIncrement(&Thread->Tcb.SuspendCount);
+ if (Thread->Tcb.SuspendCount > 0)
+ {
+ Thread->Tcb.ThreadState = THREAD_STATE_SUSPENDED;
+ if (Thread == PsGetCurrentThread())
+ {
+ PsDispatchThread();
+ }
+ }
- ExInterlockedInsertHeadList(&ThreadListHead,&thread->Tcb.Entry,
- &ThreadListLock);
return(STATUS_SUCCESS);
}
-LONG KeSetBasePriorityThread(PKTHREAD Thread, LONG Increment)
+NTSTATUS STDCALL NtContinue(IN PCONTEXT Context, IN CINT IrqLevel)
{
- UNIMPLEMENTED;
+ return(ZwContinue(Context,IrqLevel));
}
-KPRIORITY KeSetPriorityThread(PKTHREAD Thread, KPRIORITY Priority)
+NTSTATUS STDCALL ZwContinue(IN PCONTEXT Context, IN CINT IrqLevel)
{
UNIMPLEMENTED;
}
+
+NTSTATUS STDCALL NtYieldExecution(VOID)
+{
+ return(ZwYieldExecution());
+}
+
+NTSTATUS STDCALL ZwYieldExecution(VOID)
+{
+ PsDispatchThread();
+ return(STATUS_SUCCESS);
+}
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
mov esp,ebp
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]
#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)
{
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)
/* 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;
/* 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)
{
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,
for (i=0;i<Length;i++)
{
tmp = TstReadLineReadChar();
- DbgPrint("%c",tmp);
// DbgPrint("%x %x ",tmp,'\n');
switch (tmp)
{
return;
default:
+ DbgPrint("%c",tmp);
*current = tmp;
current++;
}
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");
#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);
static HANDLE CurrentDirHandle = NULL;
static UNICODE_STRING CurrentDirName = {NULL,0,0};
+static char current_dir_name[255] = {0,};
typedef struct
{
/* 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)
ULONG Length;
ULONG i;
+ DbgPrint("ShellListDir(args %s)\n",args);
+
ZwQueryDirectoryObject(CurrentDirHandle,
&(DirObj[0]),
sizeof(DirObj),
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)
RtlInitAnsiString(&astr,"\\");
RtlAnsiStringToUnicodeString(&CurrentDirName,&astr,TRUE);
+ strcpy(current_dir_name,"\\");
RtlInitAnsiString(&afilename,"\\");
RtlAnsiStringToUnicodeString(&ufilename,&afilename,TRUE);
fprintf(stdout,"*/\n");
fprintf(stdout,"#include <internal/symbol.h>\n");
-
+ fprintf(stdout,"#include <ddk/ntddk.h>\n");
+ fprintf(stdout,"#include <ddk/ntifs.h>\n");
+ fprintf(stdout,"#include <internal/ke.h>\n");
+ fprintf(stdout,"#include <internal/ntoskrnl.h>\n");
+ fprintf(stdout,"#include <internal/mm.h>\n");
+ fprintf(stdout,"#include <wstring.h>\n");
+
while (!feof(stdin))
{
read_line(buffer);
fprintf(stdout,"#endif\n");
for (j=0;j<i;j++)
{
- fprintf(stdout,"void %s(void);\n",sym[j]);
+// fprintf(stdout,"void %s(void);\n",sym[j]);
}
fprintf(stdout,"#ifdef __cplusplus\n");
fprintf(stdout,"}\n");