diff --git a/reactos/boot.bat b/reactos/boot.bat index 513c1077868..82893e32eb2 100644 --- a/reactos/boot.bat +++ b/reactos/boot.bat @@ -1 +1 @@ -loaders\dos\loadros ntoskrnl\kimage.bin %1 %2 %3 %4 +loaders\dos\loadros ntoskrnl\kimage.bin services\dd\ide\ide.o services\fs\vfat\vfatfsd.o services\dd\keyboard\keyboard.o %2 %3 %4 diff --git a/reactos/doc/ddkfuncs.txt b/reactos/doc/ddkfuncs.txt index f7fbdfb1c69..c0bcacea251 100644 --- a/reactos/doc/ddkfuncs.txt +++ b/reactos/doc/ddkfuncs.txt @@ -20,8 +20,5 @@ IoInitializeDpc IoInitializeTimer IoStartTimer IoStopTimer - -Partially implemented - IoCreateDevice IoCallDriver diff --git a/reactos/drivers/fs/minix/blockdev.c b/reactos/drivers/fs/minix/blockdev.c index 2964d04cbe0..d04eeeee4d3 100644 --- a/reactos/drivers/fs/minix/blockdev.c +++ b/reactos/drivers/fs/minix/blockdev.c @@ -15,7 +15,7 @@ #define NDEBUG #include -#include "minix_fs.h" +#include "minix.h" /* FUNCTIONS ***************************************************************/ @@ -34,6 +34,7 @@ BOOLEAN MinixReadSector(IN PDEVICE_OBJECT pDeviceObject, DPRINT("MinixReadSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n", pDeviceObject,DiskSector,Buffer); + sectorNumber.HighPart = 0; sectorNumber.LowPart = DiskSector * BLOCKSIZE; KeInitializeEvent(&event, NotificationEvent, FALSE); @@ -82,3 +83,51 @@ BOOLEAN MinixReadSector(IN PDEVICE_OBJECT pDeviceObject, ExFreePool(mbr); return TRUE; } + +BOOLEAN MinixWriteSector(IN PDEVICE_OBJECT pDeviceObject, + IN ULONG DiskSector, + IN UCHAR* Buffer) +{ + LARGE_INTEGER sectorNumber; + PIRP irp; + IO_STATUS_BLOCK ioStatus; + KEVENT event; + NTSTATUS status; + ULONG sectorSize; + + DPRINT("MinixWriteSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n", + pDeviceObject,DiskSector,Buffer); + + sectorNumber.LowPart = DiskSector * BLOCKSIZE; + + KeInitializeEvent(&event, NotificationEvent, FALSE); + + sectorSize = BLOCKSIZE; + + irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE, + pDeviceObject, + Buffer, + sectorSize, + §orNumber, + &event, + &ioStatus ); + + + status = IoCallDriver(pDeviceObject, + irp); + + if (status == STATUS_PENDING) { + KeWaitForSingleObject(&event, + Suspended, + KernelMode, + FALSE, + NULL); + status = ioStatus.Status; + } + + if (!NT_SUCCESS(status)) { + return FALSE; + } + + return TRUE; +} diff --git a/reactos/drivers/fs/minix/makefile_rex b/reactos/drivers/fs/minix/makefile_rex index 47d8002d22d..45090a1d75c 100644 --- a/reactos/drivers/fs/minix/makefile_rex +++ b/reactos/drivers/fs/minix/makefile_rex @@ -1,2 +1,9 @@ -all: minix.o blockdev.o - $(LD) -r minix.o blockdev.o -o minixfsd.o +OBJECTS = block.o rw.o inode.o dir.o mount.o blockdev.o + +all: minix.o + +minix.o: $(OBJECTS) + $(LD) -r $(OBJECTS) -o minix.o + +WIN32_LEAN_AND_MEAN = yes +include ../../../rules.mak diff --git a/reactos/include/base.h b/reactos/include/base.h index 7be8db3aa87..7242dc38b0c 100644 --- a/reactos/include/base.h +++ b/reactos/include/base.h @@ -43,9 +43,127 @@ extern "C" { #endif #endif /* !NULL */ +/* + * Definitions needed for the ddk includes (we miss out win32 only stuff to + * cut down on the compile time) + */ +typedef unsigned char UCHAR; +typedef unsigned int UINT; +typedef unsigned long ULONG; +typedef unsigned short USHORT; +typedef unsigned short WCHAR; +typedef unsigned short WORD; +typedef int WINBOOL; +typedef unsigned char BOOLEAN; +typedef unsigned int DWORD; /* was unsigned long */ +typedef unsigned short *LPWSTR; +typedef unsigned short *PWSTR; +typedef unsigned char *PUCHAR; +typedef unsigned int *PUINT; +typedef unsigned long *PULONG; +typedef unsigned short *PUSHORT; +typedef void *PVOID; +typedef unsigned char BYTE; +typedef void *LPVOID; + +/* Check VOID before defining CHAR, SHORT, and LONG */ +#ifndef VOID +#define VOID void +typedef char CHAR; +typedef short SHORT; +typedef long LONG; +#endif + +typedef CHAR *PCHAR; +typedef CHAR *PCH; +typedef void *HANDLE; +typedef char CCHAR; + +typedef enum _SECURITY_IMPERSONATION_LEVEL { + SecurityAnonymous, + SecurityIdentification, + SecurityImpersonation, + SecurityDelegation +} SECURITY_IMPERSONATION_LEVEL; + +typedef enum tagTOKEN_TYPE { + TokenPrimary = 1, + TokenImpersonation +} TOKEN_TYPE; + #define FALSE 0 #define TRUE 1 + typedef const unsigned short *PCWSTR; + +typedef char* PCSZ; + +#define CONST const + +#ifdef i386 +#define STDCALL __attribute__ ((stdcall)) +#define CDECL __attribute((cdecl)) +#define CALLBACK WINAPI +#define PASCAL WINAPI +#else +#define STDCALL +#define CDECL +#define CALLBACK +#define PASCAL +#endif +#define WINAPI STDCALL +#define APIENTRY STDCALL +#define WINGDIAPI + +typedef BYTE *PBOOLEAN; +typedef HANDLE *PHANDLE; + +typedef DWORD CALLBACK (*PTHREAD_START_ROUTINE) (LPVOID); +typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE; + + typedef unsigned short ATOM; + + #ifdef UNICODE +typedef unsigned short *LPTCH; +typedef unsigned short *LPTSTR; +#else +typedef char *LPTCH; +typedef char *LPTSTR; +#endif /* UNICODE */ + +typedef long *PLONG; +typedef unsigned short *PWCHAR; +typedef char *LPSTR; +typedef double LONGLONG, *PLONGLONG; + + typedef enum _MEDIA_TYPE { + Unknown, + F5_1Pt2_512, + F3_1Pt44_512, + F3_2Pt88_512, + F3_20Pt8_512, + F3_720_512, + F5_360_512, + F5_320_512, + F5_320_1024, + F5_180_512, + F5_160_512, + RemovableMedia, + FixedMedia +} MEDIA_TYPE; + +#ifndef max +#define max(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef min +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#endif + + +#ifndef WIN32_LEAN_AND_MEAN + + #ifndef RC_INVOKED /* typedef ACMDRIVERENUMCB; @@ -58,30 +176,15 @@ typedef ACMFORMATENUMCB; typedef ACMFORMATTAGENUMCB; typedef APPLET_PROC; */ -typedef unsigned short ATOM; /* Changed from BOOL to WINBOOL to avoid Objective-C conflict */ -typedef int WINBOOL; -typedef unsigned char BOOLEAN; -typedef unsigned char BYTE; typedef unsigned long CALTYPE; typedef unsigned long CALID; -typedef char CCHAR; typedef unsigned long COLORREF; -#define CONST const - -/* Check VOID before defining CHAR, SHORT, and LONG */ -#ifndef VOID -#define VOID void -typedef char CHAR; -typedef short SHORT; -typedef long LONG; -#endif /* typedef CTRYID; typedef DLGPROC; */ -typedef unsigned int DWORD; /* was unsigned long */ typedef double DWORDLONG, *PDWORDLONG; /* typedef EDITWORDBREAKPROC; @@ -92,7 +195,6 @@ typedef ENUMRESTYPEPROC; */ typedef float FLOAT; /* typedef GLOBALHANDLE; */ -typedef void *HANDLE; typedef HANDLE HACCEL; typedef HANDLE HBITMAP; typedef HANDLE HBRUSH; @@ -138,7 +240,6 @@ typedef unsigned short LANGID; typedef DWORD LCID; typedef DWORD LCTYPE; /* typedef LOCALHANDLE */ -typedef double LONGLONG, *PLONGLONG; typedef unsigned short *LP; typedef long LPARAM; typedef WINBOOL *LPBOOL; @@ -147,7 +248,6 @@ typedef CONST CHAR *LPCCH; typedef CHAR *LPCH; typedef COLORREF *LPCOLORREF; typedef const char *LPCSTR; -typedef char* PCSZ; #ifdef UNICODE typedef const unsigned short *LPCTSTR; @@ -163,41 +263,23 @@ typedef HANDLE *LPHANDLE; /* typedef LPHANDLER_FUNCTION; */ typedef int *LPINT; typedef long *LPLONG; -typedef char *LPSTR; - -#ifdef UNICODE -typedef unsigned short *LPTCH; -typedef unsigned short *LPTSTR; -#else -typedef char *LPTCH; -typedef char *LPTSTR; -#endif /* UNICODE */ typedef long LRESULT; -typedef void *LPVOID; typedef const void *LPCVOID; typedef unsigned short *LPWCH; typedef unsigned short *LPWORD; -typedef unsigned short *LPWSTR; -typedef unsigned short *PWSTR; /* typedef NPSTR; */ typedef unsigned short *NWPSTR; typedef WINBOOL *PWINBOOL; -typedef BYTE *PBOOLEAN; typedef BYTE *PBYTE; typedef const CHAR *PCCH; -typedef CHAR *PCH; -typedef CHAR *PCHAR; typedef const char *PCSTR; typedef const unsigned short *PCWCH; -typedef const unsigned short *PCWSTR; typedef DWORD *PDWORD; typedef float *PFLOAT; -typedef HANDLE *PHANDLE; /* typedef PHKEY; */ typedef int *PINT; /* typedef LCID *PLCID; */ -typedef long *PLONG; typedef short *PSHORT; /* typedef PSID; */ typedef char *PSTR; @@ -215,13 +297,7 @@ typedef char *PTCHAR; typedef char *PTSTR; #endif /* UNICODE */ -typedef unsigned char *PUCHAR; -typedef unsigned int *PUINT; -typedef unsigned long *PULONG; -typedef unsigned short *PUSHORT; -typedef void *PVOID; typedef unsigned short *PWCH; -typedef unsigned short *PWCHAR; typedef unsigned short *PWORD; /* typedef PWSTR; @@ -246,30 +322,10 @@ typedef char TCHAR; typedef BYTE BCHAR; #endif /* UNICODE */ -typedef unsigned char UCHAR; -typedef unsigned int UINT; -typedef unsigned long ULONG; -typedef unsigned short USHORT; -typedef unsigned short WCHAR; -typedef unsigned short WORD; typedef unsigned int WPARAM; /* typedef YIELDPROC; */ /* Only use __stdcall under WIN32 compiler */ -#ifdef i386 -#define STDCALL __attribute__ ((stdcall)) -#define CDECL __attribute((cdecl)) -#define CALLBACK WINAPI -#define PASCAL WINAPI -#else -#define STDCALL -#define CDECL -#define CALLBACK -#define PASCAL -#endif -#define WINAPI STDCALL -#define APIENTRY STDCALL -#define WINGDIAPI #define _export @@ -281,21 +337,6 @@ typedef enum _ACL_INFORMATION_CLASS { AclSizeInformation } ACL_INFORMATION_CLASS; -typedef enum _MEDIA_TYPE { - Unknown, - F5_1Pt2_512, - F3_1Pt44_512, - F3_2Pt88_512, - F3_20Pt8_512, - F3_720_512, - F5_360_512, - F5_320_512, - F5_320_1024, - F5_180_512, - F5_160_512, - RemovableMedia, - FixedMedia -} MEDIA_TYPE; #define RASCS_DONE 0x2000 #define RASCS_PAUSED 0x1000 @@ -339,14 +380,7 @@ typedef enum _RASPROJECTION { 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, @@ -370,12 +404,7 @@ typedef enum _TOKEN_INFORMATION_CLASS { TokenImpersonationLevel, TokenStatistics } TOKEN_INFORMATION_CLASS; - -typedef enum tagTOKEN_TYPE { - TokenPrimary = 1, - TokenImpersonation -} TOKEN_TYPE; - + #endif /* ! defined (RC_INVOKED) */ /* @@ -421,13 +450,6 @@ typedef enum tagTOKEN_TYPE { #define MAKEROP4(fore,back) (DWORD)((((back) << 8) & 0xFF000000) | (fore)) #define MAKEWPARAM(l, h) ((WPARAM) MAKELONG(l, h)) -#ifndef max -#define max(a, b) (((a) > (b)) ? (a) : (b)) -#endif - -#ifndef min -#define min(a, b) (((a) < (b)) ? (a) : (b)) -#endif #define PALETTEINDEX(i) ((COLORREF) (0x01000000 | (DWORD) (WORD) (i))) #define PALETTERGB(r, g, b) (0x02000000 | RGB(r, g, b)) @@ -451,8 +473,6 @@ typedef enum tagTOKEN_TYPE { typedef int CALLBACK (*BFFCALLBACK) (HWND, UINT, LPARAM, LPARAM); typedef UINT CALLBACK (*LPCCHOOKPROC) (HWND, UINT, WPARAM, LPARAM); typedef UINT CALLBACK (*LPCFHOOKPROC) (HWND, UINT, WPARAM, LPARAM); -typedef DWORD CALLBACK (*PTHREAD_START_ROUTINE) (LPVOID); -typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE; typedef DWORD CALLBACK (*EDITSTREAMCALLBACK) (DWORD, LPBYTE, LONG, LONG); typedef UINT CALLBACK (*LPFRHOOKPROC) (HWND, UINT, WPARAM, LPARAM); typedef UINT CALLBACK (*LPOFNHOOKPROC) (HWND, UINT, WPARAM, LPARAM); @@ -565,6 +585,8 @@ typedef DWORD CCSTYLEFLAGA, *PCCSTYLEFLAGA, *LPCCSTYLEFLAGA; #endif /* ! defined (RC_INVOKED) */ +#endif /* WIN32_LEAN_AND_MEAN */ + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/reactos/include/ddk/exfuncs.h b/reactos/include/ddk/exfuncs.h index 54145414f82..ca491a85717 100644 --- a/reactos/include/ddk/exfuncs.h +++ b/reactos/include/ddk/exfuncs.h @@ -94,3 +94,59 @@ PLIST_ENTRY ExInterlockedInsertHeadList(PLIST_ENTRY ListHead, VOID ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem, WORK_QUEUE_TYPE QueueType); +VOID ExRaiseStatus(NTSTATUS Status); +VOID ExReinitializeResourceLite(PERESOURCE Resource); +VOID ExReleaseFastMutex(PFAST_MUTEX Mutex); +VOID ExReleaseFastMutexUnsafe(PFAST_MUTEX Mutex); +VOID ExReleaseResource(PERESOURCE Resource); +VOID ExReleaseResourceForThread(PERESOURCE Resource, + ERESOURCE_THREAD ResourceThreadId); +VOID ExReleaseResourceForThreadLite(PERESOURCE Resource, + ERESOURCE_THREAD ResourceThreadId); +VOID ExSystemTimeToLocalTime(PLARGE_INTEGER SystemTime, + PLARGE_INTEGER LocalTime); +BOOLEAN ExTryToAcquireFastMutex(PFAST_MUTEX FastMutex); +BOOLEAN ExTryToAcquireResourceExclusiveLite(PERESOURCE Resource); +PVOID InterlockedCompareExchange(PVOID* Destination, + PVOID Exchange, + PVOID Comperand); +LONG InterlockedDecrement(PLONG Addend); +LONG InterlockedExchange(PLONG Target, LONG Value); +LONG InterlockedExchangeAdd(PLONG Addend, LONG Value); +LONG InterlockedIncrement(PLONG Addend); + +PVOID ExInterlockedAllocateFromZone(PZONE_HEADER Zone, PKSPIN_LOCK Lock); +PVOID ExInterlockedFreeToZone(PZONE_HEADER Zone, PVOID Block, + PKSPIN_LOCK Lock); +NTSTATUS ExInterlockedExtendZone(PZONE_HEADER Zone, PVOID Segment, + ULONG SegmentSize, PKSPIN_LOCK Lock); +PSINGLE_LIST_ENTRY ExInterlockedPopEntryList(PSINGLE_LIST_ENTRY ListHead, + PKSPIN_LOCK Lock); +PSINGLE_LIST_ENTRY ExInterlockedPushEntryList(PSINGLE_LIST_ENTRY ListHead, + PSINGLE_LIST_ENTRY ListEntry, + PKSPIN_LOCK Lock); +PSINGLE_LIST_ENTRY ExInterlockedPushEntrySList(PSLIST_HEADER ListHead, + PSINGLE_LIST_ENTRY ListEntry, + PKSPIN_LOCK Lock); +PSINGLE_LIST_ENTRY ExInterlockedPopEntrySList(PSLIST_HEADER ListHead, + PKSPIN_LOCK Lock); +BOOLEAN ExIsFullZone(PZONE_HEADER Zone); +BOOLEAN ExIsObjectInFirstZoneSegment(PZONE_HEADER Zone, PVOID Object); +VOID ExLocalTimeToSystemTime(PLARGE_INTEGER LocalTime, + PLARGE_INTEGER SystemTime); + +typedef unsigned int (exception_hook)(CONTEXT* c, unsigned int exp); +unsigned int ExHookException(exception_hook fn, unsigned int exp); + +INTERLOCKED_RESULT ExInterlockedDecrementLong(PLONG Addend, + PKSPIN_LOCK Lock); +ULONG ExInterlockedExchangeUlong(PULONG Target, + ULONG Value, + PKSPIN_LOCK Lock); +INTERLOCKED_RESULT ExInterlockedIncrementLong(PLONG Addend, + PKSPIN_LOCK Lock); +BOOLEAN ExIsResourceAcquiredExclusiveLite(PERESOURCE Resource); +BOOLEAN ExIsResourceAcquiredSharedLite(PERESOURCE Resource); +USHORT ExQueryDepthSListHead(PSLIST_HEADER SListHead); + + diff --git a/reactos/include/ddk/iodef.h b/reactos/include/ddk/iodef.h index 194c8d0367a..4dbe70c0078 100644 --- a/reactos/include/ddk/iodef.h +++ b/reactos/include/ddk/iodef.h @@ -51,76 +51,20 @@ enum */ enum { - /* - * Read any data from the actual backing media - */ - IRP_NOCACHE, - - /* - * The I/O operation is performing paging - */ - IRP_PAGING_IO, - - /* - * The IRP is for a mount operation - */ - IRP_MOUNT_COMPLETION, - - /* - * The API expects synchronous behaviour - */ - IRP_SYNCHRONOUS_API, - - /* - * The IRP is associated with a larger operation - */ - IRP_ASSOCIATED_IRP, - - /* - * The AssociatedIrp.SystemBuffer field is valid - */ - IRP_BUFFERED_IO, - - /* - * The system buffer was allocated from pool and should be deallocated - * by the I/O manager - */ - IRP_DEALLOCATE_BUFFER, - - /* - * The IRP is for an input operation - */ - IRP_INPUT_OPERATION, - - /* - * The paging operation should complete synchronously - */ - IRP_SYNCHRONOUS_PAGING_IO, - - /* - * The IRP represents a filesystem create operation - */ - IRP_CREATE_OPERATION, - - /* - * The IRP represents a filesystem read operation - */ - IRP_READ_OPERATION, - - /* - * The IRP represents a filesystem write operation - */ - IRP_WRITE_OPERATION, - - /* - * The IRP represents a filesystem close operation - */ - IRP_CLOSE_OPERATION, - - /* - * Asynchronous behavior is advised but not required - */ - IRP_DEFER_IO_COMPLETION, + IRP_NOCACHE = 0x1, + IRP_PAGING_IO = 0x2, + IRP_MOUNT_COMPLETION = 0x4, + IRP_SYNCHRONOUS_API = 0x8, + IRP_ASSOCIATED_IRP = 0x10, + IRP_BUFFERED_IO = 0x20, + IRP_DEALLOCATE_BUFFER = 0x40, + IRP_INPUT_OPERATION = 0x80, + IRP_SYNCHRONOUS_PAGING_IO = 0x100, + IRP_CREATE_OPERATION = 0x200, + IRP_READ_OPERATION = 0x400, + IRP_WRITE_OPERATION = 0x800, + IRP_CLOSE_OPERATION = 0x1000, + IRP_DEFER_IO_COMPLETION = 0x2000, }; /* @@ -128,52 +72,27 @@ enum */ enum { - /* - * Force an access check even if opened in kernel mode - */ - SL_FORCE_ACCESS_CHECK, - - /* - * The file being opened is a paging file - */ - SL_OPEN_PAGING_FILE, - - SL_OPEN_TARGET_DIRECTORY, - - SL_CASE_SENSITIVE, - - SL_KEY_SPECIFIED, - - SL_OVERRIDE_VERIFY_VOLUME, - - SL_WRITE_THROUGH, - - SL_FT_SEQUENTIAL_WRITE, - - SL_FAIL_IMMEDIATELY, - - SL_EXCLUSIVE_LOCK, - - SL_RESTART_SCAN, - - SL_RETURN_SINGLE_ENTRY, - - SL_INDEX_SPECIFIED, - - SL_WATCH_TREE, - - SL_ALLOW_RAW_MOUNT, - - SL_PENDING_RETURNED, - + SL_FORCE_ACCESS_CHECK = 0x1, + SL_OPEN_PAGING_FILE = 0x2, + SL_OPEN_TARGET_DIRECTORY = 0x4, + SL_CASE_SENSITIVE = 0x8, + SL_KEY_SPECIFIED = 0x10, + SL_OVERRIDE_VERIFY_VOLUME = 0x20, + SL_WRITE_THROUGH = 0x40, + SL_FT_SEQUENTIAL_WRITE = 0x80, + SL_FAIL_IMMEDIATELY = 0x100, + SL_EXCLUSIVE_LOCK = 0x200, + SL_RESTART_SCAN = 0x400, + SL_RETURN_SINGLE_ENTRY = 0x800, + SL_INDEX_SPECIFIED = 0x1000, + SL_WATCH_TREE = 0x2000, + SL_ALLOW_RAW_MOUNT = 0x4000, }; -enum -{ - SL_INVOKE_ON_SUCCESS = 1, - SL_INVOKE_ON_ERROR = 2, - SL_INVOKE_ON_CANCEL = 4, -}; +#define SL_PENDING_RETURNED 0x01 +#define SL_INVOKE_ON_CANCEL 0x20 +#define SL_INVOKE_ON_SUCCESS 0x40 +#define SL_INVOKE_ON_ERROR 0x80 /* * Possible flags for the device object flags @@ -187,56 +106,60 @@ enum /* * Possible device types */ -enum -{ - /* - * Standard define types - */ - FILE_DEVICE_BEEP, - FILE_DEVICE_CDROM, - FILE_DEVICE_CONTROLLER, - FILE_DEVICE_DISK, - FILE_DEVICE_INPORT_PORT, - FILE_DEVICE_KEYBOARD, - FILE_DEVICE_MIDI_IN, - FILE_DEVICE_MIDI_OUT, - FILE_DEVICE_MOUSE, - FILE_DEVICE_NULL, - FILE_DEVICE_PARALLEL_PORT, - FILE_DEVICE_PRINTER, - FILE_DEVICE_SCANNER, - FILE_DEVICE_SERIAL_MOUSE_PORT, - FILE_DEVICE_SERIAL_PORT, - FILE_DEVICE_SCREEN, - FILE_DEVICE_TAPE, - FILE_DEVICE_UNKNOWN, - FILE_DEVICE_VIDEO, - FILE_DEVICE_VIRTUAL_DISK, - FILE_DEVICE_WAVE_IN, - FILE_DEVICE_WAVE_OUT, - FILE_DEVICE_8042_PORT, - FILE_DEVICE_FILE_SYSTEM, - - /* - * 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 */ @@ -286,22 +209,123 @@ enum IRP_MJ_MAXIMUM_FUNCTION, }; -enum /* - * PURPOSE: Details about the result of a file open or create + * Minor function numbers for IRP_MJ_FILE_SYSTEM_CONTROL */ -{ - FILE_CREATED, -// FILE_OPENED, - FILE_OVERWRITTEN, - FILE_SUPERSEDED, - FILE_EXISTS, - FILE_DOES_NOT_EXIST, -}; - #define IRP_MN_USER_FS_REQUEST 0x00 #define IRP_MN_MOUNT_VOLUME 0x01 #define IRP_MN_VERIFY_VOLUME 0x02 #define IRP_MN_LOAD_FILE_SYSTEM 0x03 +#define IO_DISK_INCREMENT 4 + +#define FILE_WORD_ALIGNMENT 0x0001 + +/* + * File disposition values + */ +#define FILE_CREATED 0x0000 +#define FILE_OPENED 0x0001 +#define FILE_OVERWRITTEN 0x0002 +#define FILE_SUPERSEDED 0x0003 +#define FILE_DOES_NOT_EXIST 0x0004 + + +/* + * file creation flags + */ +#define FILE_DIRECTORY_FILE 0x00000001 +#define FILE_WRITE_THROUGH 0x00000002 +#define FILE_SEQUENTIAL_ONLY 0x00000004 +#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008 + +#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010 +#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 +#define FILE_NON_DIRECTORY_FILE 0x00000040 +#define FILE_CREATE_TREE_CONNECTION 0x00000080 + +#define FILE_COMPLETE_IF_OPLOCKED 0x00000100 +#define FILE_NO_EA_KNOWLEDGE 0x00000200 + +#define FILE_RANDOM_ACCESS 0x00000800 + +#define FILE_DELETE_ON_CLOSE 0x00001000 +#define FILE_OPEN_BY_FILE_ID 0x00002000 +#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000 +#define FILE_NO_COMPRESSION 0x00008000 + +#define FILE_RESERVE_OPFILTER 0x00100000 +#define FILE_TRANSACTED_MODE 0x00200000 +#define FILE_OPEN_OFFLINE_FILE 0x00400000 + +#define FILE_VALID_OPTION_FLAGS 0x007fffff +#define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032 +#define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032 +#define FILE_VALID_SET_FLAGS 0x00001036 + +/* + * file information + */ +#define FileDirectoryInformation 1 +#define FileFullDirectoryInformation 2 +#define FileBothDirectoryInformation 3 +#define FileBasicInformation 4 +#define FileStandardInformation 5 +#define FileInternalInformation 6 +#define FileEaInformation 7 +#define FileAccessInformation 8 +#define FileNameInformation 9 +#define FileRenameInformation 10 +#define FileLinkInformation 11 +#define FileNamesInformation 12 +#define FileDispositionInformation 13 +#define FilePositionInformation 14 +#define FileFullEaInformation 15 +#define FileModeInformation 16 +#define FileAlignmentInformation 17 +#define FileAllInformation 18 +#define FileAllocationInformation 19 +#define FileEndOfFileInformation 20 +#define FileAlternateNameInformation 21 +#define FileStreamInformation 22 +#define FilePipeInformation 23 +#define FilePipeLocalInformation 24 +#define FilePipeRemoteInformation 25 +#define FileMailslotQueryInformation 26 +#define FileMailslotSetInformation 27 +#define FileCompressionInformation 28 +#define FileCopyOnWriteInformation 29 +#define FileCompletionInformation 30 +#define FileMoveClusterInformation 31 +#define FileOleClassIdInformation 32 +#define FileOleStateBitsInformation 33 +#define FileNetworkOpenInformation 34 +#define FileObjectIdInformation 35 +#define FileOleAllInformation 36 +#define FileOleDirectoryInformation 37 +#define FileContentIndexInformation 38 +#define FileInheritContentIndexInformation 39 +#define FileOleInformation 40 +#define FileMaximumInformation 41 + + + +typedef ULONG FS_INFORMATION_CLASS; + +/* + * file system information class values + */ +#define FileFsVolumeInformation 1 +#define FileFsLabelInformation 2 +#define FileFsSizeInformation 3 +#define FileFsDeviceInformation 4 +#define FileFsAttributeInformation 5 +#define FileFsControlInformation 6 +#define FileFsQuotaQueryInformation 7 +#define FileFsQuotaSetInformation 8 +#define FileFsMaximumInformation 9 + +#define IRP_MN_QUERY_DIRECTORY 0x01 +#define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02 + #endif diff --git a/reactos/include/ddk/iofuncs.h b/reactos/include/ddk/iofuncs.h index a3f2eadea29..2f66cc99e69 100644 --- a/reactos/include/ddk/iofuncs.h +++ b/reactos/include/ddk/iofuncs.h @@ -1,5 +1,10 @@ /* IO MANAGER ***************************************************************/ +BOOLEAN IoRaiseInformationalHardError(NTSTATUS ErrorStatus, + PUNICODE_STRING String, + PKTHREAD Thread); + + /* * FUNCTION: Registers the driver with WMI * ARGUMENTS: @@ -503,7 +508,6 @@ NTSTATUS IoWritePartitionTable(PDEVICE_OBJECT DeviceObject, ULONG NumberOfHeads, struct _DRIVE_LAYOUT_INFORMATION* PBuffer); -typedef ULONG FS_INFORMATION_CLASS; // Preliminary guess NTKERNELAPI NTSTATUS IoQueryFileVolumeInformation(IN PFILE_OBJECT FileObject, diff --git a/reactos/include/ddk/kefuncs.h b/reactos/include/ddk/kefuncs.h index 57be2f4cdf4..2d35f8092a0 100644 --- a/reactos/include/ddk/kefuncs.h +++ b/reactos/include/ddk/kefuncs.h @@ -155,4 +155,88 @@ VOID KeBugCheckEx(ULONG BugCheckCode, */ VOID KeBugCheck(ULONG BugCheckCode); +// kmutant definition slightly modified from nt5 ddk + +typedef struct _KMUTANT +{ + DISPATCHER_HEADER Header; + LIST_ENTRY MutantListEntry; + struct _KTHREAD* OwnerThread; + BOOLEAN Abandoned; + UCHAR ApcDisable; +} KMUTANT, *PKMUTANT; + +// io permission map has a 8k size +// Each bit in the IOPM corresponds to an io port byte address. The bitmap +// is initialized to allow IO at any port. [ all bits set ]. + +typedef struct _IOPM +{ + UCHAR Bitmap[8192]; +} IOPM, *PIOPM; + +/* + * FUNCTION: Provides the kernel with a new access map for a driver + * ARGUMENTS: + * NewMap: = If FALSE the kernel's map is set to all disabled. If TRUE + * the kernel disables access to a particular port. + * IoPortMap = Caller supplies storage for the io permission map. + * REMARKS + * Each bit in the IOPM corresponds to an io port byte address. The bitmap + * is initialized to allow IO at any port. [ all bits set ]. The IOPL determines + * the minium privilege level required to perform IO prior to checking the permission map. + */ +void Ke386SetIoAccessMap(int NewMap, PIOPM *IoPermissionMap); + +/* + * FUNCTION: Queries the io permission map. + * ARGUMENTS: + * NewMap: = If FALSE the kernel's map is set to all disabled. If TRUE + * the kernel disables access to a particular port. + * IoPortMap = Caller supplies storage for the io permission map. + * REMARKS + * Each bit in the IOPM corresponds to an io port byte address. The bitmap + * is initialized to allow IO at any port. [ all bits set ]. The IOPL determines + * the minium privilege level required to perform IO prior to checking the permission map. + */ +void Ke386QueryIoAccessMap(BOOLEAN NewMap, PIOPM *IoPermissionMap); + +/* + * FUNCTION: Set the process IOPL + * ARGUMENTS: + * Eprocess = Pointer to a executive process object + * EnableIo = Specify TRUE to enable IO and FALSE to disable + */ +NTSTATUS Ke386IoSetAccessProcess(PEPROCESS Eprocess, BOOLEAN EnableIo); + +/* + * FUNCTION: Releases a set of Global Descriptor Table Selectors + * ARGUMENTS: + * SelArray = + * NumOfSelectors = + */ +NTSTATUS KeI386ReleaseGdtSelectors( + OUT PULONG SelArray, + IN ULONG NumOfSelectors + ); + +/* + * FUNCTION: Allocates a set of Global Descriptor Table Selectors + * ARGUMENTS: + * SelArray = + * NumOfSelectors = + */ +NTSTATUS KeI386AllocateGdtSelectors( + OUT PULONG SelArray, + IN ULONG NumOfSelectors + ); + +/* + * FUNCTION: Raises a user mode exception + * ARGUMENTS: + * ExceptionCode = Status code of the exception + */ +void KeRaiseUserException(NTSTATUS ExceptionCode); + + #endif /* __INCLUDE_DDK_KEFUNCS_H */ diff --git a/reactos/include/ddk/ketypes.h b/reactos/include/ddk/ketypes.h index f994625ccb7..2138953e012 100644 --- a/reactos/include/ddk/ketypes.h +++ b/reactos/include/ddk/ketypes.h @@ -101,65 +101,6 @@ typedef struct _KDEVICE_QUEUE KSPIN_LOCK Lock; } KDEVICE_QUEUE, *PKDEVICE_QUEUE; -#if RIGHT_DEFINITION_PROVIDED_ABOVE -#define _KTHREAD _ETHREAD - -typedef struct _KTHREAD -/* - * PURPOSE: Describes a thread of execution - */ -{ - CSHORT Type; - CSHORT Size; - - /* - * PURPOSE: Head of the queue of apcs - */ - LIST_ENTRY ApcQueueHead; - - /* - * PURPOSE: Entry in the linked list of threads - */ - LIST_ENTRY Entry; - - /* - * PURPOSE: Current state of the thread - */ - ULONG State; - - /* - * PURPOSE: Priority modifier of the thread - */ - ULONG Priority; - - /* - * PURPOSE: Pointer to our process - */ - struct _EPROCESS* Process; - - /* - * PURPOSE: Handle of our process - */ - HANDLE ProcessHandle; - - /* - * PURPOSE: Thread affinity mask - */ - ULONG AffinityMask; - - /* - * PURPOSE: Saved thread context - */ - hal_thread_state context; - - /* - * PURPOSE: Timeout for the thread to be woken up - */ - signed long long int wake_time; - -} KTHREAD, *PKTHREAD, *PETHREAD; -#endif - typedef struct _KAPC { diff --git a/reactos/include/ddk/mmfuncs.h b/reactos/include/ddk/mmfuncs.h index 2cdbd268848..57135ab0bb7 100644 --- a/reactos/include/ddk/mmfuncs.h +++ b/reactos/include/ddk/mmfuncs.h @@ -1,6 +1,13 @@ /* MEMORY MANAGMENT ******************************************************/ -#include +#include + +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 diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index 835171b1765..0ab393be9b8 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/include/ddk/ntddk.h @@ -22,13 +22,6 @@ extern "C" #define QUAD_PART(LI) (*(LONGLONG *)(&LI)) - -#define IO_DISK_INCREMENT 4 - -#define FILE_WORD_ALIGNMENT 0x0001 - -#define FILE_OPENED 0x0001 - #include #include #include @@ -41,6 +34,7 @@ extern "C" #include #include #include +#include #include #include @@ -53,7 +47,8 @@ extern "C" #include #include #include - +#include + #ifdef __cplusplus }; #endif diff --git a/reactos/include/ddk/ntdef.h b/reactos/include/ddk/ntdef.h index c64c7c1490b..264adc16039 100644 --- a/reactos/include/ddk/ntdef.h +++ b/reactos/include/ddk/ntdef.h @@ -6,5 +6,8 @@ struct _ETHREAD; struct _EPROCESS; #define NTKERNELAPI +#define NTSYSAPI +#define NTAPI + #endif diff --git a/reactos/include/ddk/obfuncs.h b/reactos/include/ddk/obfuncs.h index 2544a340b8e..a405072a271 100644 --- a/reactos/include/ddk/obfuncs.h +++ b/reactos/include/ddk/obfuncs.h @@ -6,7 +6,7 @@ * ARGUMENTS: * Object = Object's body */ -VOID ObDeferenceObject(PVOID Object); +VOID ObDereferenceObject(PVOID Object); /* * FUNCTION: Performs access validation on an object handle and if access diff --git a/reactos/include/ddk/obtypes.h b/reactos/include/ddk/obtypes.h index b7b0bc4da1e..cf6f3f26bae 100644 --- a/reactos/include/ddk/obtypes.h +++ b/reactos/include/ddk/obtypes.h @@ -96,27 +96,13 @@ typedef struct _OBJECT * PURPOSE: Header for every object managed by the object manager */ { - /* - * PURPOSE: Name of this entry - */ - UNICODE_STRING name; - - /* - * PURPOSE: Our entry in our parents list of subdirectory - */ - LIST_ENTRY entry; - - /* - * PURPOSE: Number of non-handle references to this object - */ - 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 @@ -141,3 +127,9 @@ typedef struct _OBJECT_ATTRIBUTES { SECURITY_DESCRIPTOR *SecurityDescriptor; SECURITY_QUALITY_OF_SERVICE *SecurityQualityOfService; } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; + +typedef struct _HANDLE_TABLE +{ + LIST_ENTRY ListHead; + KSPIN_LOCK ListLock; +} HANDLE_TABLE, *PHANDLE_TABLE; diff --git a/reactos/include/ddk/psfuncs.h b/reactos/include/ddk/psfuncs.h index 329a8acd234..c95268d8f98 100644 --- a/reactos/include/ddk/psfuncs.h +++ b/reactos/include/ddk/psfuncs.h @@ -25,7 +25,7 @@ NTSTATUS PsCreateSystemThread(PHANDLE ThreadHandle, PKSTART_ROUTINE StartRoutine, PVOID StartContext); NTSTATUS PsTerminateSystemThread(NTSTATUS ExitStatus); -NTSTATUS PsSuspendThread(VOID); -NTSTATUS PsWakeThread(PETHREAD Thread); +VOID PsSuspendThread(PETHREAD Thread); +VOID PsResumeThread(PETHREAD Thread); PETHREAD PsGetCurrentThread(VOID); struct _EPROCESS* PsGetCurrentProcess(VOID); diff --git a/reactos/include/ddk/pstypes.h b/reactos/include/ddk/pstypes.h index 75617ce75db..327e38a566f 100644 --- a/reactos/include/ddk/pstypes.h +++ b/reactos/include/ddk/pstypes.h @@ -131,7 +131,7 @@ typedef struct _KTHREAD ULONG Quantum; UCHAR ThreadState; //Thread state is a typeless enum, otherwise it should be const integer ULONG FreezeCount; - ULONG SuspendCount; + LONG SuspendCount; PTRAP_FRAME TrapFrame; PVOID *Tls; KWAIT_BLOCK WaitBlock[4]; @@ -149,6 +149,7 @@ typedef struct _KTHREAD */ hal_thread_state Context; LIST_ENTRY Entry; + ULONG LastTick; } KTHREAD, *PKTHREAD; @@ -255,26 +256,28 @@ typedef struct _ETHREAD { } 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 diff --git a/reactos/include/ddk/setypes.h b/reactos/include/ddk/setypes.h index 0897180f3a3..c689f8d5555 100644 --- a/reactos/include/ddk/setypes.h +++ b/reactos/include/ddk/setypes.h @@ -14,10 +14,6 @@ typedef ULONG ACCESS_MODE, *PACCESS_MODE; typedef SECURITY_QUALITY_OF_SERVICE* PSECURITY_QUALITY_OF_SERVICE; -typedef struct _SECURITY_SUBJECT_CONTEXT -{ -} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT; - typedef struct _SECURITY_DESCRIPTOR_CONTEXT { } SECURITY_DESCRIPTOR_CONTEXT, *PSECURITY_DESCRIPTOR_CONTEXT; @@ -44,4 +40,13 @@ typedef struct _ACCESS_TOKEN { UCHAR VariablePart[0]; } ACCESS_TOKEN, *PACCESS_TOKEN; + +typedef struct _SECURITY_SUBJECT_CONTEXT +{ + PACCESS_TOKEN ClientToken; + SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; + PACCESS_TOKEN PrimaryToken; + PVOID ProcessAuditId; +} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT; + #endif diff --git a/reactos/include/ddk/zw.h b/reactos/include/ddk/zw.h index 8e345c4c766..12c712e6a0a 100644 --- a/reactos/include/ddk/zw.h +++ b/reactos/include/ddk/zw.h @@ -9,6 +9,7 @@ * 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 @@ -16,1050 +17,35 @@ #include -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 @@ -1070,6 +56,14 @@ NtAddAtom( 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. @@ -1087,6 +81,13 @@ NtAlertResumeThread( OUT PULONG SuspendCount ); +NTSTATUS +STDCALL +ZwAlertResumeThread( + IN HANDLE ThreadHandle, + OUT PULONG SuspendCount + ); + /* * FUNCTION: Puts the thread in a alerted state * ARGUMENTS: @@ -1099,6 +100,13 @@ NtAlertThread( IN HANDLE ThreadHandle ); +NTSTATUS +STDCALL +ZwAlertThread( + IN HANDLE ThreadHandle + ); + + /* * FUNCTION: Allocates a locally unique id * ARGUMENTS: @@ -1111,6 +119,13 @@ NtAllocateLocallyUniqueId( OUT PVOID LocallyUniqueId ); +NTSTATUS +STDCALL +ZwAllocateLocallyUniqueId( + OUT PVOID LocallyUniqueId + ); + + /* * FUNCTION: Allocates a block of virtual memory in the process address space * ARGUMENTS: @@ -1144,6 +159,34 @@ NtAllocateVirtualMemory( 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: @@ -1160,18 +203,32 @@ NtCancelIoFile( 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 ); @@ -1190,6 +247,12 @@ NtClearEvent( IN HANDLE EventHandle ); +NTSTATUS +STDCALL +ZwClearEvent( + IN HANDLE EventHandle + ); + /* * FUNCTION: Closes an object handle * ARGUMENTS: @@ -1205,22 +268,40 @@ NtClose( 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: @@ -1231,6 +312,7 @@ NtContinue( * handle, a access mask and a OBJECT_ATTRIBUTES structure to map the path name and the SECURITY_ATTRIBUTES. * RETURNS: Status */ + NTSTATUS STDCALL NtCreateDirectoryObject( @@ -1238,6 +320,15 @@ 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: @@ -1245,22 +336,33 @@ NtCreateDirectoryObject( * 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 ); /* @@ -1279,6 +381,14 @@ NtCreateEventPair( 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. @@ -1297,7 +407,8 @@ NtCreateEventPair( * EaLength = Extended Attributes buffer size, applies only to files and directories. * REMARKS: This function maps to the win32 CreateFile. * RETURNS: Status - */ + */ + NTSTATUS STDCALL NtCreateFile( @@ -1313,6 +424,23 @@ 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: @@ -1324,6 +452,7 @@ NtCreateFile( * RETURNS: * Status */ + NTSTATUS STDCALL NtCreateIoCompletion( @@ -1332,6 +461,16 @@ 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: @@ -1347,9 +486,9 @@ NtCreateIoCompletion( * 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. @@ -1360,6 +499,7 @@ NtCreateIoCompletion( * RETURNS: * Status */ + NTSTATUS STDCALL NtCreateKey( @@ -1372,6 +512,18 @@ 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 @@ -1393,7 +545,16 @@ NtCreateMutant( 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 @@ -1404,9 +565,10 @@ NtCreateMutant( * 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( @@ -1415,6 +577,16 @@ 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: @@ -1443,6 +615,20 @@ NtCreateProcess( 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: @@ -1457,6 +643,7 @@ NtCreateProcess( * FileHanlde = Handle to a file to create a section mapped to a file instead of a memory backed section. * RETURNS: Status */ + NTSTATUS STDCALL NtCreateSection( @@ -1468,6 +655,19 @@ NtCreateSection( IN ULONG AllocationAttributes, IN HANDLE FileHandle OPTIONAL ); + +NTSTATUS +STDCALL +ZwCreateSection( + 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 + ); + /* * FUNCTION: Creates a semaphore object for interprocess synchronization. * ARGUMENTS: @@ -1491,15 +691,24 @@ NtCreateSemaphore( 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 @@ -1510,6 +719,16 @@ NtCreateSymbolicLinkObject( 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: @@ -1519,10 +738,10 @@ NtCreateSymbolicLinkObject( * 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 @@ -1537,13 +756,26 @@ NtCreateThread( 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. @@ -1556,18 +788,26 @@ NtCreateTimer( OUT PHANDLE TimerHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN BOOL ManualReset + IN CINT TimerType ); -/* - * FUNCTION: Returns the callers thread TEB. - * ARGUMENTS: - * Teb (OUT) = Caller supplied storage for the resulting TEB. - * RETURNS: Status - */ + NTSTATUS STDCALL -NtCurrentTeb( - NT_TEB *CurrentTeb +ZwCreateTimer( + OUT PHANDLE TimerHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN CINT TimerType + ); + + +/* + * FUNCTION: Returns the callers thread TEB. + * RETURNS: The resulting teb. + */ +NT_TEB * +STDCALL +NtCurrentTeb(VOID ); /* @@ -1580,16 +820,24 @@ NtCurrentTeb( 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 @@ -1598,13 +846,19 @@ NtDeleteAtom( 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 */ @@ -1614,6 +868,12 @@ NtDeleteFile( IN POBJECT_ATTRIBUTES ObjectAttributes ); +NTSTATUS +STDCALL +ZwDeleteFile( + IN POBJECT_ATTRIBUTES ObjectAttributes + ); + /* * FUNCTION: Deletes a registry key * ARGUMENTS: @@ -1625,6 +885,12 @@ STDCALL NtDeleteKey( IN HANDLE KeyHandle ); +NTSTATUS +STDCALL +ZwDeleteKey( + IN HANDLE KeyHandle + ); + /* * FUNCTION: Deletes a value from a registry key * ARGUMENTS: @@ -1639,14 +905,21 @@ NtDeleteValueKey( 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. @@ -1670,6 +943,21 @@ NtDeviceIoControlFile( 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: @@ -1682,16 +970,31 @@ STDCALL 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 @@ -1701,8 +1004,21 @@ NtDuplicateObject( 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 @@ -1724,7 +1040,18 @@ STDCALL 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 @@ -1749,7 +1076,18 @@ STDCALL 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 @@ -1767,6 +1105,13 @@ NtExtendSection( IN HANDLE SectionHandle, IN ULONG NewMaximumSize ); +NTSTATUS +STDCALL +ZwExtendSection( + IN HANDLE SectionHandle, + IN ULONG NewMaximumSize + ); + /* * FUNCTION: Finds a atom * ARGUMENTS: @@ -1774,7 +1119,7 @@ NtExtendSection( * AtomString = String to search for. * RETURNS: Status * REMARKS: - This funciton maps to the win32 GlobalFindAtom + * This funciton maps to the win32 GlobalFindAtom */ NTSTATUS STDCALL @@ -1782,16 +1127,23 @@ NtFindAtom( 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 @@ -1799,15 +1151,22 @@ NtFlushBuffersFile( 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 @@ -1816,13 +1175,20 @@ NtFlushInstructionCache( 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 @@ -1830,6 +1196,12 @@ NtFlushKey( IN HANDLE KeyHandle ); +NTSTATUS +STDCALL +ZwFlushKey( + IN HANDLE KeyHandle + ); + /* * FUNCTION: Flushes virtual memory to file * ARGUMENTS: @@ -1839,7 +1211,7 @@ NtFlushKey( * 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 @@ -1849,22 +1221,28 @@ NtFlushVirtualMemory( 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: @@ -1878,11 +1256,20 @@ NtFlushWriteBuffer ( 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 @@ -1893,17 +1280,18 @@ NtFreeVirtualMemory( * 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 @@ -1920,6 +1308,21 @@ NtFsControlFile( 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: @@ -1934,6 +1337,13 @@ NtGetContextThread( IN HANDLE ThreadHandle, OUT PCONTEXT Context ); + +NTSTATUS +STDCALL +ZwGetContextThread( + IN HANDLE ThreadHandle, + OUT PCONTEXT Context + ); /* * FUNCTION: Retrieves the uptime of the system * ARGUMENTS: @@ -1946,6 +1356,12 @@ NtGetTickCount( PULONG UpTime ); +NTSTATUS +STDCALL +ZwGetTickCount( + PULONG UpTime + ); + //-- NtImpersonateThread /* @@ -1957,8 +1373,14 @@ NtGetTickCount( NTSTATUS STDCALL NtInitializeRegistry( - BOOL SetUpBoot + BOOLEAN SetUpBoot ); +NTSTATUS +STDCALL +ZwInitializeRegistry( + BOOLEAN SetUpBoot + ); + /* * FUNCTION: Loads a driver. * ARGUMENTS: @@ -1971,6 +1393,12 @@ NtLoadDriver( IN PUNICODE_STRING DriverServiceName ); +NTSTATUS +STDCALL +ZwLoadDriver( + IN PUNICODE_STRING DriverServiceName + ); + //-- NtLoadKey2 /* * FUNCTION: Loads a registry key. @@ -1987,6 +1415,12 @@ NtLoadKey( PHANDLE KeyHandle, OBJECT_ATTRIBUTES ObjectAttributes ); +NTSTATUS +STDCALL +ZwLoadKey( + PHANDLE KeyHandle, + OBJECT_ATTRIBUTES ObjectAttributes + ); /* * FUNCTION: Locks a range of bytes in a file. * ARGUMENTS: @@ -1998,27 +1432,46 @@ NtLoadKey( * 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: @@ -2028,7 +1481,7 @@ NtLockFile( * 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 @@ -2038,6 +1491,14 @@ NtLockVirtualMemory( 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: @@ -2050,6 +1511,12 @@ STDCALL 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 @@ -2071,18 +1538,34 @@ NtMakeTemporaryObject( * 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 ); /* @@ -2127,8 +1610,50 @@ NtNotifyChangeDirectoryFile( 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( @@ -2144,6 +1669,21 @@ 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: @@ -2160,6 +1700,14 @@ NtOpenDirectoryObject( 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: @@ -2175,6 +1723,14 @@ NtOpenEvent( 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: @@ -2197,6 +1753,17 @@ NtOpenFile( 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: @@ -2213,6 +1780,14 @@ NtOpenIoCompletion( 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 @@ -2229,6 +1804,14 @@ NtOpenKey( 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: @@ -2244,6 +1827,13 @@ NtOpenMutant( 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 @@ -2262,6 +1852,14 @@ NtOpenProcess ( 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: @@ -2277,6 +1875,13 @@ NtOpenSection( 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: @@ -2292,6 +1897,13 @@ NtOpenSemaphore( 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: @@ -2307,6 +1919,13 @@ NtOpenSymbolicLinkObject( 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: @@ -2324,6 +1943,14 @@ NtOpenThread( 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: @@ -2339,12 +1966,19 @@ NtOpenTimer( 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( @@ -2375,12 +2009,22 @@ NtProtectVirtualMemory( 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 @@ -2390,9 +2034,60 @@ NtPulseEvent( IN PULONG PulseCount OPTIONAL ); -//-- NtQueryAttributesFile +NTSTATUS +STDCALL +ZwPulseEvent( + IN HANDLE EventHandle, + IN PULONG PulseCount OPTIONAL + ); -// FileNameInformation - FILE_NAMES_INFORMATION +/* + * 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 + ); + + +/* + * 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 @@ -2409,6 +2104,22 @@ NtQueryDirectoryFile( 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 @@ -2434,6 +2145,33 @@ NtQueryDirectoryObject( 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( @@ -2447,6 +2185,20 @@ 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: @@ -2471,8 +2223,47 @@ NtQueryEvent( 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 + ); @@ -2540,9 +2331,15 @@ NtQueryInformationFile( 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: @@ -2560,7 +2357,7 @@ NtQueryInformationFile( ProcessExceptionPort HANDLE ProcessAccessToken PROCESS_ACCESS_TOKEN ProcessLdtInformation LDT_ENTRY ?? - ProcessLdtSize ?? + ProcessLdtSize ULONG ProcessDefaultHardErrorMode ULONG ProcessIoPortHandlers // kernel mode only ProcessPooledUsageAndLimits POOLED_USAGE_AND_LIMITS @@ -2572,7 +2369,7 @@ NtQueryInformationFile( 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 @@ -2598,6 +2395,16 @@ NtQueryInformationProcess( OUT PULONG ReturnLength ); +NTSTATUS +STDCALL +ZwQueryInformationProcess( + IN HANDLE ProcessHandle, + IN CINT ProcessInformationClass, + OUT PVOID ProcessInformation, + IN ULONG ProcessInformationLength, + OUT PULONG ReturnLength + ); + /* @@ -2606,11 +2413,11 @@ NtQueryInformationProcess( * 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 @@ -2639,7 +2446,7 @@ NTSTATUS STDCALL NtQueryInformationThread( IN HANDLE ThreadHandle, - IN CINT ThreadInformationClass, + IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength @@ -2647,7 +2454,7 @@ NtQueryInformationThread( NTSTATUS STDCALL -NtQueryIoCompletion( +ZwQueryIoCompletion( IN HANDLE CompletionPort, IN CINT CompletionInformationClass, OUT PVOID CompletionInformation, @@ -2669,15 +2476,24 @@ NTSTATUS 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 ); - -// preliminary guess +// draft NTSTATUS STDCALL @@ -2690,6 +2506,17 @@ NtQueryMultipleValueKey( PULONG ReturnLength ); +NTSTATUS +STDCALL +ZwQueryMultipleValueKey( + HANDLE KeyHandle, + PVALENT ListOfValuesToQuery, + ULONG NumberOfItems, + PVOID MultipleValueInformation, + ULONG Length, + PULONG ReturnLength +); + /* * FUNCTION: Queries the information of a mutant object. * ARGUMENTS: @@ -2708,7 +2535,16 @@ NtQueryMutant( 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: @@ -2734,6 +2570,15 @@ NtQueryObject( 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. @@ -2752,6 +2597,13 @@ NtQueryPerformanceCounter( 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: @@ -2772,6 +2624,15 @@ NtQuerySection( IN ULONG Length, OUT PULONG ResultLength ); +NTSTATUS +STDCALL +ZwQuerySection( + IN HANDLE SectionHandle, + IN CINT SectionInformationClass, + OUT PVOID SectionInformation, + IN ULONG Length, + OUT PULONG ResultLength + ); /* @@ -2795,12 +2656,21 @@ NtQuerySemaphore( 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 * @@ -2808,11 +2678,46 @@ NtQuerySemaphore( 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 + ); /* @@ -2822,6 +2727,7 @@ NtQuerySymbolicLinkObject( SystemTimeAdjustmentInformation SYSTEM_TIME_ADJUSTMENT SystemCacheInformation SYSTEM_CACHE_INFORMATION + SystemConfigurationInformation CONFIGURATION_INFORMATION * SystemInformation = caller supplies storage for the information structure * Length = size of the structure @@ -2837,6 +2743,14 @@ NtQuerySystemInformation( 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 @@ -2849,9 +2763,44 @@ NtQuerySystemInformation( 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 @@ -2864,13 +2813,22 @@ NtQuerySystemTime ( */ -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: @@ -2893,12 +2851,24 @@ STDCALL 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 + ); + + /* @@ -2927,10 +2897,21 @@ NtQueryVirtualMemory( 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 @@ -2946,7 +2927,8 @@ NtQueryVirtualMemory( FileFsQuotaSetInformation -- FileFsMaximumInformation - * RETURNS: Status + * RETURNS: Status [ STATUS_SUCCESS | STATUS_INSUFFICIENT_RESOURCES | STATUS_INVALID_PARAMETER | + STATUS_INVALID_DEVICE_REQUEST | STATUS_BUFFER_OVERFLOW ] * */ NTSTATUS @@ -2958,7 +2940,48 @@ NtQueryVolumeInformationFile( 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: @@ -2978,6 +3001,14 @@ NtRaiseException( IN BOOL IsDebugger OPTIONAL ); +NTSTATUS +STDCALL +ZwRaiseException( + IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context, + IN BOOL IsDebugger OPTIONAL + ); + //NtRaiseHardError /* * FUNCTION: Read a file @@ -2990,7 +3021,7 @@ NtRaiseException( 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 * */ @@ -3009,6 +3040,20 @@ NtReadFile( 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: @@ -3020,7 +3065,7 @@ NtReadFile( 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 * */ @@ -3037,6 +3082,20 @@ NtReadFileScatter( 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: @@ -3051,29 +3110,44 @@ NtReadFileScatter( 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 */ @@ -3083,12 +3157,19 @@ NtReleaseMutant( 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 @@ -3098,15 +3179,22 @@ NtReleaseSemaphore( 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 @@ -3118,6 +3206,16 @@ NtRemoveIoCompletion( 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: @@ -3133,6 +3231,14 @@ NtReplaceKey( 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: @@ -3146,7 +3252,13 @@ NtResetEvent( HANDLE EventHandle, PULONG NumberOfWaitingThreads OPTIONAL ); -//Preliminary guess +NTSTATUS +STDCALL +ZwResetEvent( + HANDLE EventHandle, + PULONG NumberOfWaitingThreads OPTIONAL + ); +//draft NTSTATUS STDCALL NtRestoreKey( @@ -3154,6 +3266,14 @@ NtRestoreKey( HANDLE FileHandle, ULONG RestoreFlags ); + +NTSTATUS +STDCALL +ZwRestoreKey( + HANDLE KeyHandle, + HANDLE FileHandle, + ULONG RestoreFlags + ); /* * FUNCTION: Decrements a thread's resume count * ARGUMENTS: @@ -3170,6 +3290,12 @@ NtResumeThread( 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: @@ -3186,6 +3312,12 @@ NtSaveKey( IN HANDLE KeyHandle, IN HANDLE FileHandle ); +NTSTATUS +STDCALL +ZwSaveKey( + IN HANDLE KeyHandle, + IN HANDLE FileHandle + ); /* * FUNCTION: Sets the context of a specified thread. * ARGUMENTS: @@ -3200,6 +3332,12 @@ NtSetContextThread( IN HANDLE ThreadHandle, IN PCONTEXT Context ); +NTSTATUS +STDCALL +ZwSetContextThread( + IN HANDLE ThreadHandle, + IN PCONTEXT Context + ); /* * FUNCTION: Sets the extended attributes of a file. * ARGUMENTS: @@ -3218,14 +3356,22 @@ NtSetEaFile( 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 @@ -3235,7 +3381,14 @@ NTSTATUS STDCALL NtSetEvent( IN HANDLE EventHandle, - PULONG Count + PULONG NumberOfThreadsReleased + ); + +NTSTATUS +STDCALL +ZwSetEvent( + IN HANDLE EventHandle, + PULONG NumberOfThreadsReleased ); /* @@ -3251,6 +3404,11 @@ NtSetHighEventPair( 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: @@ -3262,6 +3420,11 @@ STDCALL NtSetHighWaitLowEventPair( IN HANDLE EventPair ); +NTSTATUS +STDCALL +ZwSetHighWaitLowEventPair( + IN HANDLE EventPair + ); /* * FUNCTION: Sets the information of a file object. @@ -3292,8 +3455,18 @@ NtSetInformationFile( 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 + ); + /* @@ -3318,6 +3491,15 @@ NtSetInformationKey( 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: @@ -3345,6 +3527,15 @@ NtSetInformationObject( 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: @@ -3374,6 +3565,14 @@ NtSetInformationProcess( 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: @@ -3397,11 +3596,20 @@ NTSTATUS 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 @@ -3422,6 +3630,15 @@ NtSetIoCompletion( 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 @@ -3430,12 +3647,12 @@ NtSetIoCompletion( 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 @@ -3449,7 +3666,11 @@ STDCALL NtSetLowEventPair( HANDLE EventPair ); - +NTSTATUS +STDCALL +ZwSetLowEventPair( + HANDLE EventPair + ); /* * FUNCTION: Sets the low part of an event pair and wait for the high part * ARGUMENTS: @@ -3461,6 +3682,11 @@ STDCALL NtSetLowWaitHighEventPair( HANDLE EventPair ); +NTSTATUS +STDCALL +ZwSetLowWaitHighEventPair( + HANDLE EventPair + ); //FIXME: Should Value be a void pointer or a pointer to a unicode string ? /* @@ -3473,10 +3699,15 @@ NtSetLowWaitHighEventPair( 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: @@ -3497,6 +3728,14 @@ NtSetSystemInformation( IN ULONG SystemInformationLength ); +NTSTATUS +STDCALL +ZwSetSystemInformation( + IN CINT SystemInformationClass, + IN PVOID SystemInformation, + IN ULONG SystemInformationLength + ); + /* * FUNCTION: Sets the system time * ARGUMENTS: @@ -3510,15 +3749,22 @@ NtSetSystemTime( 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 @@ -3526,10 +3772,22 @@ STDCALL 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 @@ -3546,6 +3804,13 @@ NtSetTimerResolution( 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: @@ -3553,7 +3818,7 @@ NtSetTimerResolution( * 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 @@ -3579,6 +3844,16 @@ NtSetValueKey( 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: @@ -3596,10 +3871,20 @@ NtSetVolumeInformationFile( 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 @@ -3607,6 +3892,12 @@ STDCALL 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: @@ -3625,6 +3916,15 @@ NtSignalAndWaitForSingleObject( 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: @@ -3642,6 +3942,12 @@ NtSuspendThread( IN HANDLE ThreadHandle, IN PULONG PreviousSuspendCount ); +NTSTATUS +STDCALL +ZwSuspendThread( + IN HANDLE ThreadHandle, + IN PULONG PreviousSuspendCount + ); //--NtSystemDebugControl /* @@ -3659,6 +3965,12 @@ NtTerminateProcess( IN HANDLE ProcessHandle , IN NTSTATUS ExitStatus ); +NTSTATUS +STDCALL +ZwTerminateProcess( + IN HANDLE ProcessHandle , + IN NTSTATUS ExitStatus + ); /* * FUNCTION: Terminates the execution of a thread. * ARGUMENTS: @@ -3672,8 +3984,14 @@ NtTerminateThread( 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 @@ -3681,6 +3999,11 @@ STDCALL NtTestAlert( VOID ); +NTSTATUS +STDCALL +ZwTestAlert( + VOID + ); /* * FUNCTION: Unloads a driver. * ARGUMENTS: @@ -3692,10 +4015,15 @@ STDCALL 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: @@ -3707,6 +4035,11 @@ STDCALL NtUnloadKey( HANDLE KeyHandle ); +NTSTATUS +STDCALL +ZwUnloadKey( + HANDLE KeyHandle + ); /* * FUNCTION: Unlocks a range of bytes in a file. @@ -3717,16 +4050,29 @@ NtUnloadKey( 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 @@ -3741,7 +4087,7 @@ NtUnlockFile( * 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 @@ -3751,6 +4097,15 @@ NtUnlockVirtualMemory( 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: @@ -3766,12 +4121,18 @@ NtUnmapViewOfSection( 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: @@ -3782,7 +4143,17 @@ NTSTATUS 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 @@ -3804,11 +4175,31 @@ NtWaitForSingleObject ( 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. @@ -3822,11 +4213,26 @@ NtWaitForSingleObject ( * 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, @@ -3851,16 +4257,18 @@ NtWriteFile( * 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, @@ -3872,6 +4280,21 @@ STDCALL NtWriteFileScatter( IN PULONG Key OPTIONAL ); +NTSTATUS +STDCALL +ZwWriteFileGather( + 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 + ); + + /* * FUNCTION: Writes a range of virtual memory * ARGUMENTS: @@ -3893,6 +4316,16 @@ NtWriteVirtualMemory( 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 @@ -3903,6 +4336,77 @@ NtYieldExecution( 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 */ diff --git a/reactos/include/defines.h b/reactos/include/defines.h index 1cd80df3e70..26ece09e508 100644 --- a/reactos/include/defines.h +++ b/reactos/include/defines.h @@ -32,6 +32,224 @@ #ifndef _GNU_H_WINDOWS32_DEFINES #define _GNU_H_WINDOWS32_DEFINES +#define WINBASEAPI + +#define EXCEPTION_MAXIMUM_PARAMETERS (15) +#define ANYSIZE_ARRAY (1) + +#define STATUS_WAIT_0 (0x00000000L) +#define STATUS_ABANDONED_WAIT_0 (0x00000080L) +#define STATUS_USER_APC (0x000000C0L) +#define STATUS_TIMEOUT (0x00000102L) +#define STATUS_PENDING (0x00000103L) +#define STATUS_GUARD_PAGE_VIOLATION (0x80000001L) +#define STATUS_DATATYPE_MISALIGNMENT (0x80000002L) +#define STATUS_BREAKPOINT (0x80000003L) +#define STATUS_SINGLE_STEP (0x80000004L) +#define STATUS_IN_PAGE_ERROR (0xC0000006L) +#define STATUS_INVALID_HANDLE (0xC0000008L) +#define STATUS_ILLEGAL_INSTRUCTION (0xC000001DL) +#define STATUS_NONCONTINUABLE_EXCEPTION (0xC0000025L) +#define STATUS_INVALID_DISPOSITION (0xC0000026L) +#define STATUS_ARRAY_BOUNDS_EXCEEDED (0xC000008CL) +#define STATUS_FLOAT_DENORMAL_OPERAND (0xC000008DL) +#define STATUS_FLOAT_DIVIDE_BY_ZERO (0xC000008EL) +#define STATUS_FLOAT_INEXACT_RESULT (0xC000008FL) +#define STATUS_FLOAT_INVALID_OPERATION (0xC0000090L) +#define STATUS_FLOAT_OVERFLOW (0xC0000091L) +#define STATUS_FLOAT_STACK_CHECK (0xC0000092L) +#define STATUS_FLOAT_UNDERFLOW (0xC0000093L) +#define STATUS_INTEGER_DIVIDE_BY_ZERO (0xC0000094L) +#define STATUS_INTEGER_OVERFLOW (0xC0000095L) +#define STATUS_PRIVILEGED_INSTRUCTION (0xC0000096L) +#define STATUS_STACK_OVERFLOW (0xC00000FDL) +#define STATUS_CONTROL_C_EXIT (0xC000013AL) + +#define SEC_COMMIT (134217728) +#define SEC_IMAGE (16777216) +#define SEC_NOCACHE (268435456) +#define SEC_RESERVE (67108864) +#define PAGE_READONLY (2) +#define PAGE_READWRITE (4) +#define PAGE_WRITECOPY (8) +#define PAGE_EXECUTE (16) +#define PAGE_EXECUTE_READ (32) +#define PAGE_EXECUTE_READWRITE (64) +#define PAGE_EXECUTE_WRITECOPY (128) +#define PAGE_GUARD (256) +#define PAGE_NOACCESS (1) +#define PAGE_NOCACHE (512) +#define MEM_COMMIT (4096) +#define MEM_FREE (65536) +#define MEM_RESERVE (8192) +#define MEM_IMAGE (16777216) +#define MEM_MAPPED (262144) +#define MEM_PRIVATE (131072) +#define MEM_DECOMMIT (16384) +#define MEM_RELEASE (32768) +#define MEM_TOP_DOWN (1048576) +#define EXCEPTION_GUARD_PAGE (0x80000001L) +#define SECTION_EXTEND_SIZE (0x10) +#define SECTION_MAP_READ (0x4) +#define SECTION_MAP_WRITE (0x2) +#define SECTION_QUERY (0x1) +#define SECTION_ALL_ACCESS (0xf001fL) + + +/* DuplicateHandle, MapViewOfFile */ +#define DUPLICATE_CLOSE_SOURCE (1) +#define DUPLICATE_SAME_ACCESS (2) +#define FILE_MAP_ALL_ACCESS (0xf001fL) +#define FILE_MAP_READ (4) +#define FILE_MAP_WRITE (2) +#define FILE_MAP_COPY (1) +#define MUTEX_ALL_ACCESS (0x1f0001L) +#define MUTEX_MODIFY_STATE (1) +#define SYNCHRONIZE (0x100000L) +#define SEMAPHORE_ALL_ACCESS (0x1f0003L) +#define SEMAPHORE_MODIFY_STATE (2) +#define EVENT_ALL_ACCESS (0x1f0003L) +#define EVENT_MODIFY_STATE (2) +#define KEY_ALL_ACCESS (0xf003fL) +#define KEY_CREATE_LINK (32) +#define KEY_CREATE_SUB_KEY (4) +#define KEY_ENUMERATE_SUB_KEYS (8) +#define KEY_EXECUTE (0x20019L) +#define KEY_NOTIFY (16) +#define KEY_QUERY_VALUE (1) +#define KEY_READ (0x20019L) +#define KEY_SET_VALUE (2) +#define KEY_WRITE (0x20006L) +#define PROCESS_ALL_ACCESS (0x1f0fffL) +#define PROCESS_CREATE_PROCESS (128) +#define PROCESS_CREATE_THREAD (2) +#define PROCESS_DUP_HANDLE (64) +#define PROCESS_QUERY_INFORMATION (1024) +#define PROCESS_SET_INFORMATION (512) +#define PROCESS_TERMINATE (1) +#define PROCESS_VM_OPERATION (8) +#define PROCESS_VM_READ (16) +#define PROCESS_VM_WRITE (32) +#define THREAD_ALL_ACCESS (0x1f03ffL) +#define THREAD_DIRECT_IMPERSONATION (512) +#define THREAD_GET_CONTEXT (8) +#define THREAD_IMPERSONATE (256) +#define THREAD_QUERY_INFORMATION (64) +#define THREAD_SET_CONTEXT (16) +#define THREAD_SET_INFORMATION (32) +#define THREAD_SET_THREAD_TOKEN (128) +#define THREAD_SUSPEND_RESUME (2) +#define THREAD_TERMINATE (1) + +#define PACKED __attribute__((packed)) + +#define THREAD_PRIORITY_ABOVE_NORMAL (1) +#define THREAD_PRIORITY_BELOW_NORMAL (-1) +#define THREAD_PRIORITY_HIGHEST (2) +#define THREAD_PRIORITY_IDLE (-15) +#define THREAD_PRIORITY_LOWEST (-2) +#define THREAD_PRIORITY_NORMAL (0) +#define THREAD_PRIORITY_TIME_CRITICAL (15) +#define THREAD_PRIORITY_ERROR_RETURN (2147483647) + +/* CreateFile, GetFileAttributes, SetFileAttributes */ +#define GENERIC_READ (0x80000000L) +#define GENERIC_WRITE (0x40000000L) +#define FILE_READ_DATA ( 0x0001 ) /* file & pipe */ +#define FILE_LIST_DIRECTORY ( 0x0001 ) /* directory */ + +#define FILE_WRITE_DATA ( 0x0002 ) /* file & pipe */ +#define FILE_ADD_FILE ( 0x0002 ) /* directory */ + +#define FILE_APPEND_DATA ( 0x0004 ) /* file */ +#define FILE_ADD_SUBDIRECTORY ( 0x0004 ) /* directory */ +#define FILE_CREATE_PIPE_INSTANCE ( 0x0004 ) /* named pipe */ + +#define FILE_READ_EA ( 0x0008 ) /* file & directory */ +#define FILE_READ_PROPERTIES FILE_READ_EA + +#define FILE_WRITE_EA ( 0x0010 ) /* file & directory */ +#define FILE_WRITE_PROPERTIES FILE_WRITE_EA + +#define FILE_EXECUTE ( 0x0020 ) /* file */ +#define FILE_TRAVERSE ( 0x0020 ) /* directory */ + +#define FILE_DELETE_CHILD ( 0x0040 ) /* directory */ + +#define FILE_READ_ATTRIBUTES ( 0x0080 ) /* all */ + +#define FILE_WRITE_ATTRIBUTES ( 0x0100 ) /* all */ + +#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF) + +#define FILE_GENERIC_READ (STANDARD_RIGHTS_READ |\ + FILE_READ_DATA |\ + FILE_READ_ATTRIBUTES |\ + FILE_READ_EA |\ + SYNCHRONIZE) + + +#define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ + FILE_WRITE_DATA |\ + FILE_WRITE_ATTRIBUTES |\ + FILE_WRITE_EA |\ + FILE_APPEND_DATA |\ + SYNCHRONIZE) + + +#define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ + FILE_READ_ATTRIBUTES |\ + FILE_EXECUTE |\ + SYNCHRONIZE) + +#define FILE_SHARE_DELETE (4) +#define FILE_SHARE_READ (1) +#define FILE_SHARE_WRITE (2) +#define CONSOLE_TEXTMODE_BUFFER (1) +#define CREATE_NEW (1) +#define CREATE_ALWAYS (2) +#define OPEN_EXISTING (3) +#define OPEN_ALWAYS (4) +#define TRUNCATE_EXISTING (5) +#define FILE_ATTRIBUTE_ARCHIVE (32) +#define FILE_ATTRIBUTE_COMPRESSED (2048) +#define FILE_ATTRIBUTE_NORMAL (128) +#define FILE_ATTRIBUTE_DIRECTORY (16) +#define FILE_ATTRIBUTE_HIDDEN (2) +#define FILE_ATTRIBUTE_READONLY (1) +#define FILE_ATTRIBUTE_SYSTEM (4) +#define FILE_ATTRIBUTE_TEMPORARY (256) +#define FILE_FLAG_WRITE_THROUGH (2147483648) +#define FILE_FLAG_OVERLAPPED (1073741824) +#define FILE_FLAG_NO_BUFFERING (536870912) +#define FILE_FLAG_RANDOM_ACCESS (268435456) +#define FILE_FLAG_SEQUENTIAL_SCAN (134217728) +#define FILE_FLAG_DELETE_ON_CLOSE (67108864) +#define FILE_FLAG_BACKUP_SEMANTICS (33554432) +#define FILE_FLAG_POSIX_SEMANTICS (16777216) +#define SECURITY_ANONYMOUS (0) +#define SECURITY_IDENTIFICATION (65536) +#define SECURITY_IMPERSONATION (131072) +#define SECURITY_DELEGATION (196608) +#define SECURITY_CONTEXT_TRACKING (262144) +#define SECURITY_EFFECTIVE_ONLY (524288) +#define SECURITY_SQOS_PRESENT (1048576) + +/* Standard rights */ +#define STANDARD_RIGHTS_REQUIRED (0xf0000L) +#define STANDARD_RIGHTS_WRITE (0x20000L) +#define STANDARD_RIGHTS_READ (0x20000L) +#define STANDARD_RIGHTS_EXECUTE (0x20000L) +#define STANDARD_RIGHTS_ALL (0x1f0000L) +#define SPECIFIC_RIGHTS_ALL (0xffffL) + +/* ACCESS_MASK */ +#define MAXIMUM_ALLOWED (0x2000000L) +#define GENERIC_ALL (0x10000000L) + + +#ifndef WIN32_LEAN_AND_MEAN + #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ @@ -45,7 +263,6 @@ extern "C" { #define SECURITY_DYNAMIC_TRACKING (1) #define MAX_DEFAULTCHAR (2) #define MAX_LEADBYTES (12) -#define EXCEPTION_MAXIMUM_PARAMETERS (15) #define CCHDEVICENAME (32) #define CCHFORMNAME (32) #define MENU_TEXT_LEN (40) @@ -54,7 +271,6 @@ extern "C" { #define NETBIOS_NAME_LEN (16) #define OFS_MAXPATHNAME (128) #define MAX_TAB_STOPS (32) -#define ANYSIZE_ARRAY (1) #define RAS_MaxCallbackNumber (128) #define RAS_MaxDeviceName (128) #define RAS_MaxDeviceType (16) @@ -382,119 +598,7 @@ extern "C" { #define DIB_PAL_COLORS (1) #define DIB_RGB_COLORS (0) -/* CreateFile, GetFileAttributes, SetFileAttributes */ -#define GENERIC_READ (0x80000000L) -#define GENERIC_WRITE (0x40000000L) -#define FILE_READ_DATA ( 0x0001 ) /* file & pipe */ -#define FILE_LIST_DIRECTORY ( 0x0001 ) /* directory */ - -#define FILE_WRITE_DATA ( 0x0002 ) /* file & pipe */ -#define FILE_ADD_FILE ( 0x0002 ) /* directory */ - -#define FILE_APPEND_DATA ( 0x0004 ) /* file */ -#define FILE_ADD_SUBDIRECTORY ( 0x0004 ) /* directory */ -#define FILE_CREATE_PIPE_INSTANCE ( 0x0004 ) /* named pipe */ - -#define FILE_READ_EA ( 0x0008 ) /* file & directory */ -#define FILE_READ_PROPERTIES FILE_READ_EA - -#define FILE_WRITE_EA ( 0x0010 ) /* file & directory */ -#define FILE_WRITE_PROPERTIES FILE_WRITE_EA - -#define FILE_EXECUTE ( 0x0020 ) /* file */ -#define FILE_TRAVERSE ( 0x0020 ) /* directory */ - -#define FILE_DELETE_CHILD ( 0x0040 ) /* directory */ - -#define FILE_READ_ATTRIBUTES ( 0x0080 ) /* all */ - -#define FILE_WRITE_ATTRIBUTES ( 0x0100 ) /* all */ - -#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF) - -#define FILE_GENERIC_READ (STANDARD_RIGHTS_READ |\ - FILE_READ_DATA |\ - FILE_READ_ATTRIBUTES |\ - FILE_READ_EA |\ - SYNCHRONIZE) - - -#define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ - FILE_WRITE_DATA |\ - FILE_WRITE_ATTRIBUTES |\ - FILE_WRITE_EA |\ - FILE_APPEND_DATA |\ - SYNCHRONIZE) - - -#define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ - FILE_READ_ATTRIBUTES |\ - FILE_EXECUTE |\ - SYNCHRONIZE) - -#define FILE_SHARE_DELETE (4) -#define FILE_SHARE_READ (1) -#define FILE_SHARE_WRITE (2) -#define CONSOLE_TEXTMODE_BUFFER (1) -#define CREATE_NEW (1) -#define CREATE_ALWAYS (2) -#define OPEN_EXISTING (3) -#define OPEN_ALWAYS (4) -#define TRUNCATE_EXISTING (5) -#define FILE_ATTRIBUTE_ARCHIVE (32) -#define FILE_ATTRIBUTE_COMPRESSED (2048) -#define FILE_ATTRIBUTE_NORMAL (128) -#define FILE_ATTRIBUTE_DIRECTORY (16) -#define FILE_ATTRIBUTE_HIDDEN (2) -#define FILE_ATTRIBUTE_READONLY (1) -#define FILE_ATTRIBUTE_SYSTEM (4) -#define FILE_ATTRIBUTE_TEMPORARY (256) -#define FILE_FLAG_WRITE_THROUGH (2147483648) -#define FILE_FLAG_OVERLAPPED (1073741824) -#define FILE_FLAG_NO_BUFFERING (536870912) -#define FILE_FLAG_RANDOM_ACCESS (268435456) -#define FILE_FLAG_SEQUENTIAL_SCAN (134217728) -#define FILE_FLAG_DELETE_ON_CLOSE (67108864) -#define FILE_FLAG_BACKUP_SEMANTICS (33554432) -#define FILE_FLAG_POSIX_SEMANTICS (16777216) -#define SECURITY_ANONYMOUS (0) -#define SECURITY_IDENTIFICATION (65536) -#define SECURITY_IMPERSONATION (131072) -#define SECURITY_DELEGATION (196608) -#define SECURITY_CONTEXT_TRACKING (262144) -#define SECURITY_EFFECTIVE_ONLY (524288) -#define SECURITY_SQOS_PRESENT (1048576) - /* CreateFileMapping, VirtualAlloc, VirtualFree, VirtualProtect */ -#define SEC_COMMIT (134217728) -#define SEC_IMAGE (16777216) -#define SEC_NOCACHE (268435456) -#define SEC_RESERVE (67108864) -#define PAGE_READONLY (2) -#define PAGE_READWRITE (4) -#define PAGE_WRITECOPY (8) -#define PAGE_EXECUTE (16) -#define PAGE_EXECUTE_READ (32) -#define PAGE_EXECUTE_READWRITE (64) -#define PAGE_EXECUTE_WRITECOPY (128) -#define PAGE_GUARD (256) -#define PAGE_NOACCESS (1) -#define PAGE_NOCACHE (512) -#define MEM_COMMIT (4096) -#define MEM_FREE (65536) -#define MEM_RESERVE (8192) -#define MEM_IMAGE (16777216) -#define MEM_MAPPED (262144) -#define MEM_PRIVATE (131072) -#define MEM_DECOMMIT (16384) -#define MEM_RELEASE (32768) -#define MEM_TOP_DOWN (1048576) -#define EXCEPTION_GUARD_PAGE (0x80000001L) -#define SECTION_EXTEND_SIZE (0x10) -#define SECTION_MAP_READ (0x4) -#define SECTION_MAP_WRITE (0x2) -#define SECTION_QUERY (0x1) -#define SECTION_ALL_ACCESS (0xf001fL) /* CreateFont */ #define FW_DONTCARE (0) @@ -1051,50 +1155,6 @@ extern "C" { #define DT_WORDBREAK (16) #define DT_INTERNAL (4096) -/* DuplicateHandle, MapViewOfFile */ -#define DUPLICATE_CLOSE_SOURCE (1) -#define DUPLICATE_SAME_ACCESS (2) -#define FILE_MAP_ALL_ACCESS (0xf001fL) -#define FILE_MAP_READ (4) -#define FILE_MAP_WRITE (2) -#define FILE_MAP_COPY (1) -#define MUTEX_ALL_ACCESS (0x1f0001L) -#define MUTEX_MODIFY_STATE (1) -#define SYNCHRONIZE (0x100000L) -#define SEMAPHORE_ALL_ACCESS (0x1f0003L) -#define SEMAPHORE_MODIFY_STATE (2) -#define EVENT_ALL_ACCESS (0x1f0003L) -#define EVENT_MODIFY_STATE (2) -#define KEY_ALL_ACCESS (0xf003fL) -#define KEY_CREATE_LINK (32) -#define KEY_CREATE_SUB_KEY (4) -#define KEY_ENUMERATE_SUB_KEYS (8) -#define KEY_EXECUTE (0x20019L) -#define KEY_NOTIFY (16) -#define KEY_QUERY_VALUE (1) -#define KEY_READ (0x20019L) -#define KEY_SET_VALUE (2) -#define KEY_WRITE (0x20006L) -#define PROCESS_ALL_ACCESS (0x1f0fffL) -#define PROCESS_CREATE_PROCESS (128) -#define PROCESS_CREATE_THREAD (2) -#define PROCESS_DUP_HANDLE (64) -#define PROCESS_QUERY_INFORMATION (1024) -#define PROCESS_SET_INFORMATION (512) -#define PROCESS_TERMINATE (1) -#define PROCESS_VM_OPERATION (8) -#define PROCESS_VM_READ (16) -#define PROCESS_VM_WRITE (32) -#define THREAD_ALL_ACCESS (0x1f03ffL) -#define THREAD_DIRECT_IMPERSONATION (512) -#define THREAD_GET_CONTEXT (8) -#define THREAD_IMPERSONATE (256) -#define THREAD_QUERY_INFORMATION (64) -#define THREAD_SET_CONTEXT (16) -#define THREAD_SET_INFORMATION (32) -#define THREAD_SET_THREAD_TOKEN (128) -#define THREAD_SUSPEND_RESUME (2) -#define THREAD_TERMINATE (1) /* EditWordBreakProc */ #define WB_ISDELIMITER (2) @@ -1902,14 +1962,6 @@ extern "C" { #define VTA_CENTER (6) /* GetThreadPriority */ -#define THREAD_PRIORITY_ABOVE_NORMAL (1) -#define THREAD_PRIORITY_BELOW_NORMAL (-1) -#define THREAD_PRIORITY_HIGHEST (2) -#define THREAD_PRIORITY_IDLE (-15) -#define THREAD_PRIORITY_LOWEST (-2) -#define THREAD_PRIORITY_NORMAL (0) -#define THREAD_PRIORITY_TIME_CRITICAL (15) -#define THREAD_PRIORITY_ERROR_RETURN (2147483647) #define TLS_MINIMUM_AVAILABLE (64) /* GetTimeFormat */ @@ -4110,17 +4162,6 @@ extern "C" { #define TAPE_DRIVE_WRITE_SETMARKS (-2130706432) #define TAPE_DRIVE_WRITE_SHORT_FMKS (-2080374784) -/* Standard rights */ -#define STANDARD_RIGHTS_REQUIRED (0xf0000L) -#define STANDARD_RIGHTS_WRITE (0x20000L) -#define STANDARD_RIGHTS_READ (0x20000L) -#define STANDARD_RIGHTS_EXECUTE (0x20000L) -#define STANDARD_RIGHTS_ALL (0x1f0000L) -#define SPECIFIC_RIGHTS_ALL (0xffffL) - -/* ACCESS_MASK */ -#define MAXIMUM_ALLOWED (0x2000000L) -#define GENERIC_ALL (0x10000000L) /* SID */ #define SECURITY_NULL_RID (0L) @@ -5052,33 +5093,6 @@ extern "C" { #define POLYFILL_LAST (2) -#define STATUS_WAIT_0 (0x00000000L) -#define STATUS_ABANDONED_WAIT_0 (0x00000080L) -#define STATUS_USER_APC (0x000000C0L) -#define STATUS_TIMEOUT (0x00000102L) -#define STATUS_PENDING (0x00000103L) -#define STATUS_GUARD_PAGE_VIOLATION (0x80000001L) -#define STATUS_DATATYPE_MISALIGNMENT (0x80000002L) -#define STATUS_BREAKPOINT (0x80000003L) -#define STATUS_SINGLE_STEP (0x80000004L) -#define STATUS_IN_PAGE_ERROR (0xC0000006L) -#define STATUS_INVALID_HANDLE (0xC0000008L) -#define STATUS_ILLEGAL_INSTRUCTION (0xC000001DL) -#define STATUS_NONCONTINUABLE_EXCEPTION (0xC0000025L) -#define STATUS_INVALID_DISPOSITION (0xC0000026L) -#define STATUS_ARRAY_BOUNDS_EXCEEDED (0xC000008CL) -#define STATUS_FLOAT_DENORMAL_OPERAND (0xC000008DL) -#define STATUS_FLOAT_DIVIDE_BY_ZERO (0xC000008EL) -#define STATUS_FLOAT_INEXACT_RESULT (0xC000008FL) -#define STATUS_FLOAT_INVALID_OPERATION (0xC0000090L) -#define STATUS_FLOAT_OVERFLOW (0xC0000091L) -#define STATUS_FLOAT_STACK_CHECK (0xC0000092L) -#define STATUS_FLOAT_UNDERFLOW (0xC0000093L) -#define STATUS_INTEGER_DIVIDE_BY_ZERO (0xC0000094L) -#define STATUS_INTEGER_OVERFLOW (0xC0000095L) -#define STATUS_PRIVILEGED_INSTRUCTION (0xC0000096L) -#define STATUS_STACK_OVERFLOW (0xC00000FDL) -#define STATUS_CONTROL_C_EXIT (0xC000013AL) #define EXCEPTION_CTRL_C @@ -5139,7 +5153,6 @@ DECLARE_HANDLE(HANDLE); #define ASCIICHAR AsciiChar #define FAR -#define PACKED __attribute__((packed)) #define FILTER_TEMP_DUPLICATE_ACCOUNT (0x0001) #define FILTER_NORMAL_ACCOUNT (0x0002) @@ -5164,4 +5177,6 @@ DECLARE_HANDLE(HANDLE); } #endif /* __cplusplus */ +#endif /* WIN32_LEAN_AND_MEAN */ + #endif /* _GNU_H_WINDOWS32_DEFINES */ diff --git a/reactos/include/funcs.h b/reactos/include/funcs.h index 9c52234300b..b4720840e54 100644 --- a/reactos/include/funcs.h +++ b/reactos/include/funcs.h @@ -31,6 +31,8 @@ #ifndef _GNU_H_WINDOWS32_FUNCTIONS #define _GNU_H_WINDOWS32_FUNCTIONS +#ifndef WIN32_LEAN_AND_MEAN + #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ @@ -7430,6 +7432,9 @@ DWORD STDCALL NetGroupEnum (LPWSTR, DWORD, LPBYTE*, DWORD, LPDWORD, DWORD STDCALL NetLocalGroupEnum (LPWSTR, DWORD, LPBYTE*, DWORD, LPDWORD, LPDWORD, LPDWORD); + +VOID CopyMemory(PVOID Destination, CONST VOID* Source, DWORD Length); + void WINAPI SHAddToRecentDocs (UINT, LPCVOID); @@ -7481,4 +7486,6 @@ SHLoadInProc (REFCLSID); } #endif /* __cplusplus */ +#endif /* WIN32_LEAN_AND_MEAN */ + #endif /* _GNU_H_WINDOWS32_FUNCTIONS */ diff --git a/reactos/include/internal/ctype.h b/reactos/include/internal/ctype.h index 49439552642..8b36906b313 100644 --- a/reactos/include/internal/ctype.h +++ b/reactos/include/internal/ctype.h @@ -38,6 +38,11 @@ extern char _ctmp; #define upalpha ('A' - 'a') +extern inline int isspace(char c) +{ + return(c==' '||c=='\t'); +} + extern inline char toupper(char c) { if ((c>='a') && (c<='z')) return (c+upalpha); diff --git a/reactos/include/internal/i386/hal.h b/reactos/include/internal/i386/hal.h index 21ea94a7546..113a4676643 100644 --- a/reactos/include/internal/i386/hal.h +++ b/reactos/include/internal/i386/hal.h @@ -51,6 +51,7 @@ typedef struct unsigned char io_bitmap[1]; } hal_thread_state; + /* * FUNCTION: Probes for a PCI bus * RETURNS: True if found diff --git a/reactos/include/internal/io.h b/reactos/include/internal/io.h index 09a373ae8ea..19d6a5f539d 100644 --- a/reactos/include/internal/io.h +++ b/reactos/include/internal/io.h @@ -14,6 +14,10 @@ #include #include +extern POBJECT_TYPE IoDeviceType; +extern POBJECT_TYPE IoFileType; +extern POBJECT_TYPE IoSymbolicLinkType; + /* * FUNCTION: Called to initalize a loaded driver * ARGUMENTS: @@ -36,5 +40,9 @@ PIRP IoBuildFilesystemControlRequest(ULONG MinorFunction, PKEVENT UserEvent, PIO_STATUS_BLOCK IoStatusBlock, PDEVICE_OBJECT DeviceToMount); - +NTSTATUS IoPageRead(PFILE_OBJECT FileObject, + PVOID Address, + PLARGE_INTEGER Offset, + PIO_STATUS_BLOCK StatusBlock); +VOID IoSecondStageCompletion(PIRP Irp, CCHAR PriorityBoost); #endif diff --git a/reactos/include/internal/ke.h b/reactos/include/internal/ke.h index 7061b11e29a..28fb8b01be7 100644 --- a/reactos/include/internal/ke.h +++ b/reactos/include/internal/ke.h @@ -15,6 +15,10 @@ /* INTERNAL KERNEL FUNCTIONS ************************************************/ +VOID KeAcquireDispatcherDatabaseLock(BOOLEAN Wait); +VOID KeReleaseDispatcherDatabaseLock(BOOLEAN Wait); +VOID KeDispatcherObjectWake(DISPATCHER_HEADER* hdr); + VOID KiInterruptDispatch(ULONG irq); VOID KiDispatchInterrupt(ULONG irq); VOID KiTimerInterrupt(VOID); diff --git a/reactos/include/internal/mm.h b/reactos/include/internal/mm.h index 2398fcac9cd..88b1218a33d 100644 --- a/reactos/include/internal/mm.h +++ b/reactos/include/internal/mm.h @@ -5,8 +5,6 @@ #ifndef __INCLUDE_INTERNAL_MM_H #define __INCLUDE_INTERNAL_MM_H -#define PAGE_SYSTEM (0x80000000) - #include #include #include @@ -16,25 +14,31 @@ enum { MEMORY_AREA_INVALID, - MEMORY_AREA_SECTION_VIEW, + MEMORY_AREA_SECTION_VIEW_COMMIT, MEMORY_AREA_CONTINUOUS_MEMORY, MEMORY_AREA_NO_CACHE, MEMORY_AREA_IO_MAPPING, MEMORY_AREA_SYSTEM, MEMORY_AREA_MDL_MAPPING, + MEMORY_AREA_COMMIT, + MEMORY_AREA_RESERVE, + MEMORY_AREA_SECTION_VIEW_RESERVE, }; typedef struct { CSHORT Type; CSHORT Size; - FILE_OBJECT* File; -} SECTION_OBJECT; + LARGE_INTEGER MaximumSize; + ULONG SectionPageProtection; + ULONG AllocateAttributes; + PFILE_OBJECT FileObject; +} SECTION_OBJECT, *PSECTION_OBJECT; typedef struct { ULONG Type; - ULONG BaseAddress; + PVOID BaseAddress; ULONG Length; ULONG Attributes; LIST_ENTRY Entry; @@ -47,22 +51,28 @@ typedef struct ULONG ViewOffset; } SectionData; } Data; -} MEMORY_AREA; +} MEMORY_AREA, *PMEMORY_AREA; NTSTATUS MmCreateMemoryArea(KPROCESSOR_MODE Mode, + PEPROCESS Process, ULONG Type, - PULONG BaseAddress, + PVOID* BaseAddress, ULONG Length, ULONG Attributes, MEMORY_AREA** Result); -MEMORY_AREA* MmOpenMemoryAreaByAddress(ULONG Address); +MEMORY_AREA* MmOpenMemoryAreaByAddress(PEPROCESS Process, PVOID Address); NTSTATUS MmInitMemoryAreas(VOID); VOID ExInitNonPagedPool(ULONG BaseAddress); -NTSTATUS MmFreeMemoryArea(PVOID BaseAddress, +NTSTATUS MmFreeMemoryArea(PEPROCESS Process, + PVOID BaseAddress, ULONG Length, BOOLEAN FreePages); -VOID MmDumpMemoryAreas(VOID); +VOID MmDumpMemoryAreas(PLIST_ENTRY ListHead); +NTSTATUS MmLockMemoryArea(MEMORY_AREA* MemoryArea); +NTSTATUS MmUnlockMemoryArea(MEMORY_AREA* MemoryArea); +NTSTATUS MmInitSectionImplementation(VOID); + /* * FUNCTION: Gets a page with a restricted max physical address (i.e. @@ -96,4 +106,13 @@ void mark_page_not_writable(unsigned int vaddr); void VirtualInit(boot_param* bp); +#define MM_LOWEST_USER_ADDRESS (4096) + +PMEMORY_AREA MmSplitMemoryArea(PEPROCESS Process, + PMEMORY_AREA OriginalMemoryArea, + PVOID BaseAddress, + ULONG Length, + ULONG NewType, + ULONG NewAttributes); + #endif diff --git a/reactos/include/internal/ob.h b/reactos/include/internal/ob.h index 4d71597cc4d..d73b40d82d3 100644 --- a/reactos/include/internal/ob.h +++ b/reactos/include/internal/ob.h @@ -44,6 +44,8 @@ enum OBJTYP_DEVICE, OBJTYP_THREAD, OBJTYP_FILE, + OBJTYP_PROCESS, + OBJTYP_SECTION, OBJTYP_MAX, }; @@ -51,27 +53,23 @@ BOOL ObAddObjectToNameSpace(PUNICODE_STRING path, POBJECT_HEADER Object); VOID ObRegisterType(CSHORT id, OBJECT_TYPE* type); -VOID ObInitializeObjectHeader(CSHORT id, PWSTR name, +VOID ObInitializeObjectHeader(POBJECT_TYPE Type, PWSTR name, POBJECT_HEADER obj); - -/* - * FUNCTION: Get the size of an object - * ARGUMENTS: - * Type = Object type - * RETURNS: The size in bytes - */ -ULONG ObSizeOf(CSHORT Type); -HANDLE ObAddHandle(PVOID obj); +HANDLE ObInsertHandle(PKPROCESS Process, PVOID ObjectBody, + ACCESS_MASK GrantedAccess, BOOLEAN Inherit); VOID ObDeleteHandle(HANDLE Handle); NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object, PWSTR* UnparsedSection); -PVOID ObGetObjectByHandle(HANDLE h); + PVOID ObGenericCreateObject(PHANDLE Handle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, - CSHORT Type); + POBJECT_TYPE Type); NTSTATUS ObOpenObjectByName(POBJECT_ATTRIBUTES ObjectAttributes, PVOID* Object, PWSTR* UnparsedSection); +VOID ObInitializeHandleTable(PKPROCESS Parent, BOOLEAN Inherit, + PKPROCESS Process); +VOID ObRemoveEntry(POBJECT_HEADER Header); /* * FUNCTION: Creates an entry within a directory @@ -92,6 +90,18 @@ extern inline PVOID HEADER_TO_BODY(POBJECT_HEADER obj) return(((void *)obj)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER)); } -#define OBJECT_ALLOC_SIZE(type) (ObSizeOf(type)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER)) +#define OBJECT_ALLOC_SIZE(type) (type->NonpagedPoolCharge+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER)) + +/* + * PURPOSE: Defines a handle + */ +typedef struct +{ + PVOID ObjectBody; + ACCESS_MASK GrantedAccess; + BOOLEAN Inherit; +} HANDLE_REP, *PHANDLE_REP; + +PHANDLE_REP ObTranslateHandle(PKPROCESS Process, HANDLE h); #endif /* __INCLUDE_INTERNAL_OBJMGR_H */ diff --git a/reactos/include/internal/pool.h b/reactos/include/internal/pool.h index 0b5fd1a142e..d517b8b6efd 100644 --- a/reactos/include/internal/pool.h +++ b/reactos/include/internal/pool.h @@ -5,7 +5,7 @@ #include -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 */ diff --git a/reactos/include/internal/ps.h b/reactos/include/internal/ps.h index 6856e30a3d4..623c2006516 100644 --- a/reactos/include/internal/ps.h +++ b/reactos/include/internal/ps.h @@ -3,12 +3,16 @@ #include -extern EPROCESS SystemProcess; +extern PEPROCESS SystemProcess; extern HANDLE SystemProcessHandle; +extern POBJECT_TYPE PsThreadType; +extern POBJECT_TYPE PsProcessType; + void PsInitThreadManagment(void); VOID PsInitProcessManagment(VOID); VOID PsInitIdleThread(VOID); +VOID PsDispatchThread(VOID); /* * PURPOSE: Thread states @@ -45,9 +49,9 @@ enum * Functions the HAL must provide */ -void HalInitFirstTask(PKTHREAD thread); -BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn, - PVOID StartContext); +void HalInitFirstTask(PETHREAD thread); +BOOLEAN HalInitTask(PETHREAD thread, PKSTART_ROUTINE fn, PVOID StartContext); void HalTaskSwitch(PKTHREAD thread); +NTSTATUS HalInitTaskWithContext(PETHREAD Thread, PCONTEXT Context); #endif diff --git a/reactos/include/internal/version.h b/reactos/include/internal/version.h index 56a3d84d253..bd9f7450ade 100644 --- a/reactos/include/internal/version.h +++ b/reactos/include/internal/version.h @@ -9,9 +9,9 @@ #ifndef __VERSION_H #define __VERSION_H -#define KERNEL_VERSION "0.0.11" +#define KERNEL_VERSION "0.0.12" #define KERNEL_MAJOR_VERSION 0 #define KERNEL_MINOR_VERSION 0 -#define KERNEL_PATCH_LEVEL 11 +#define KERNEL_PATCH_LEVEL 12 #endif diff --git a/reactos/include/kernel32/heap.h b/reactos/include/kernel32/heap.h index 35c83985f41..7cc17d31ea3 100644 --- a/reactos/include/kernel32/heap.h +++ b/reactos/include/kernel32/heap.h @@ -105,6 +105,4 @@ typedef struct __HEAP HEAP_BLOCK Start __attribute__((aligned (8))); } HEAP, *PHEAP; -//PHEAP __ProcessHeap; - #endif /* __INCLUDE_KERNEL32_HEAP_H */ diff --git a/reactos/include/structs.h b/reactos/include/structs.h index 10e04ab2a56..0985c0f0adb 100644 --- a/reactos/include/structs.h +++ b/reactos/include/structs.h @@ -32,10 +32,338 @@ #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; @@ -60,7 +388,6 @@ typedef struct _ACE_HEADER { WORD AceSize; } ACE_HEADER; -typedef DWORD ACCESS_MASK; typedef ACCESS_MASK REGSAM; typedef struct _ACCESS_ALLOWED_ACE { @@ -81,14 +408,6 @@ typedef struct tagACCESSTIMEOUT { DWORD iTimeOutMSec; } ACCESSTIMEOUT; -typedef struct _ACL { - BYTE AclRevision; - BYTE Sbz1; - WORD AclSize; - WORD AceCount; - WORD Sbz2; -} ACL, *PACL; - typedef struct _ACL_REVISION_INFORMATION { DWORD AclRevision; } ACL_REVISION_INFORMATION; @@ -629,11 +948,6 @@ typedef struct _CONSOLE_CURSOR_INFO { WINBOOL bVisible; } CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO; -typedef struct _COORD { - SHORT X; - SHORT Y; -} COORD; - typedef struct _SMALL_RECT { SHORT Left; SHORT Top; @@ -649,183 +963,6 @@ typedef struct _CONSOLE_SCREEN_BUFFER_INFO { COORD dwMaximumWindowSize; } CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO ; -#ifdef __i386__ - -typedef struct _FLOATING_SAVE_AREA { - DWORD ControlWord; - DWORD StatusWord; - DWORD TagWord; - DWORD ErrorOffset; - DWORD ErrorSelector; - DWORD DataOffset; - DWORD DataSelector; - BYTE RegisterArea[80]; - DWORD Cr0NpxState; -} FLOATING_SAVE_AREA; - -typedef struct _CONTEXT { - DWORD ContextFlags; - - DWORD Dr0; - DWORD Dr1; - DWORD Dr2; - DWORD Dr3; - DWORD Dr6; - DWORD Dr7; - - FLOATING_SAVE_AREA FloatSave; - - DWORD SegGs; - DWORD SegFs; - DWORD SegEs; - DWORD SegDs; - - DWORD Edi; - DWORD Esi; - DWORD Ebx; - DWORD Edx; - DWORD Ecx; - DWORD Eax; - - DWORD Ebp; - DWORD Eip; - DWORD SegCs; - DWORD EFlags; - DWORD Esp; - DWORD SegSs; -} CONTEXT, *PCONTEXT, *LPCONTEXT; - -#else /* __ppc__ */ - -typedef struct - { - /* Floating point registers returned when CONTEXT_FLOATING_POINT is set */ - double Fpr0; - double Fpr1; - double Fpr2; - double Fpr3; - double Fpr4; - double Fpr5; - double Fpr6; - double Fpr7; - double Fpr8; - double Fpr9; - double Fpr10; - double Fpr11; - double Fpr12; - double Fpr13; - double Fpr14; - double Fpr15; - double Fpr16; - double Fpr17; - double Fpr18; - double Fpr19; - double Fpr20; - double Fpr21; - double Fpr22; - double Fpr23; - double Fpr24; - double Fpr25; - double Fpr26; - double Fpr27; - double Fpr28; - double Fpr29; - double Fpr30; - double Fpr31; - double Fpscr; - - /* Integer registers returned when CONTEXT_INTEGER is set. */ - DWORD Gpr0; - DWORD Gpr1; - DWORD Gpr2; - DWORD Gpr3; - DWORD Gpr4; - DWORD Gpr5; - DWORD Gpr6; - DWORD Gpr7; - DWORD Gpr8; - DWORD Gpr9; - DWORD Gpr10; - DWORD Gpr11; - DWORD Gpr12; - DWORD Gpr13; - DWORD Gpr14; - DWORD Gpr15; - DWORD Gpr16; - DWORD Gpr17; - DWORD Gpr18; - DWORD Gpr19; - DWORD Gpr20; - DWORD Gpr21; - DWORD Gpr22; - DWORD Gpr23; - DWORD Gpr24; - DWORD Gpr25; - DWORD Gpr26; - DWORD Gpr27; - DWORD Gpr28; - DWORD Gpr29; - DWORD Gpr30; - DWORD Gpr31; - - DWORD Cr; /* Condition register */ - DWORD Xer; /* Fixed point exception register */ - - /* The following are set when CONTEXT_CONTROL is set. */ - DWORD Msr; /* Machine status register */ - DWORD Iar; /* Instruction address register */ - DWORD Lr; /* Link register */ - DWORD Ctr; /* Control register */ - - /* Control which context values are returned */ - DWORD ContextFlags; - DWORD Fill[3]; - - /* Registers returned if CONTEXT_DEBUG_REGISTERS is set. */ - DWORD Dr0; /* Breakpoint Register 1 */ - DWORD Dr1; /* Breakpoint Register 2 */ - DWORD Dr2; /* Breakpoint Register 3 */ - DWORD Dr3; /* Breakpoint Register 4 */ - DWORD Dr4; /* Breakpoint Register 5 */ - DWORD Dr5; /* Breakpoint Register 6 */ - DWORD Dr6; /* Debug Status Register */ - DWORD Dr7; /* Debug Control Register */ -} CONTEXT, *PCONTEXT, *LPCONTEXT; -#endif - -typedef struct _LIST_ENTRY { - struct _LIST_ENTRY *Flink; - struct _LIST_ENTRY *Blink; -} LIST_ENTRY, *PLIST_ENTRY; - -typedef struct _CRITICAL_SECTION_DEBUG { - WORD Type; - WORD CreatorBackTraceIndex; - struct _CRITICAL_SECTION *CriticalSection; - LIST_ENTRY ProcessLocksList; - DWORD EntryCount; - DWORD ContentionCount; - DWORD Depth; - PVOID OwnerBackTrace[ 5 ]; -} CRITICAL_SECTION_DEBUG, *PCRITICAL_SECTION_DEBUG; - -typedef struct _CRITICAL_SECTION { - PCRITICAL_SECTION_DEBUG DebugInfo; - LONG LockCount; - LONG RecursionCount; - HANDLE OwningThread; - HANDLE LockSemaphore; - DWORD Reserved; -} CRITICAL_SECTION, *PCRITICAL_SECTION, *LPCRITICAL_SECTION; - -typedef struct _SECURITY_QUALITY_OF_SERVICE { - DWORD Length; - SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; - /* SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode; */ - WINBOOL ContextTrackingMode; - BOOLEAN EffectiveOnly; -} SECURITY_QUALITY_OF_SERVICE; - typedef struct tagCONVCONTEXT { UINT cb; UINT wFlags; @@ -1009,15 +1146,6 @@ typedef struct { BYTE rgb[1]; } DDEUP; -typedef struct _EXCEPTION_RECORD { - DWORD ExceptionCode; - DWORD ExceptionFlags; - struct _EXCEPTION_RECORD *ExceptionRecord; - PVOID ExceptionAddress; - DWORD NumberParameters; - DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; -} EXCEPTION_RECORD, *PEXCEPTION_RECORD, *LPEXCEPTION_RECORD; - typedef struct _EXCEPTION_DEBUG_INFO { EXCEPTION_RECORD ExceptionRecord; DWORD dwFirstChance; @@ -1176,20 +1304,7 @@ typedef struct tagDIBSECTION { 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; @@ -1274,21 +1389,7 @@ typedef struct { UINT uiLengthDrawn; } DRAWTEXTPARAMS, *LPDRAWTEXTPARAMS; -typedef struct _PARTITION_INFORMATION { - BYTE PartitionType; - BOOLEAN BootIndicator; - BOOLEAN RecognizedPartition; - BOOLEAN RewritePartition; - LARGE_INTEGER StartingOffset; - LARGE_INTEGER PartitionLength; - LARGE_INTEGER HiddenSectors; -} PARTITION_INFORMATION ; -typedef struct _DRIVE_LAYOUT_INFORMATION { - DWORD PartitionCount; - DWORD Signature; - PARTITION_INFORMATION PartitionEntry[1]; -} DRIVE_LAYOUT_INFORMATION; typedef struct _DRIVER_INFO_1 { LPTSTR pName; @@ -2255,12 +2356,6 @@ typedef struct tagGCP_RESULTS { UINT nMaxFit; } GCP_RESULTS, *LPGCP_RESULTS; -typedef struct _GENERIC_MAPPING { - ACCESS_MASK GenericRead; - ACCESS_MASK GenericWrite; - ACCESS_MASK GenericExecute; - ACCESS_MASK GenericAll; -} GENERIC_MAPPING, *PGENERIC_MAPPING; typedef struct _GLYPHMETRICS { UINT gmBlackBoxX; @@ -2366,30 +2461,6 @@ typedef struct _IMAGEINFO { RECT rcImage; } IMAGEINFO; -typedef struct _KEY_EVENT_RECORD { - WINBOOL bKeyDown; - WORD wRepeatCount; - WORD wVirtualKeyCode; - WORD wVirtualScanCode; - - char AsciiChar; - char pad; -#if 0 - union { - WCHAR UnicodeChar; - CHAR AsciiChar; - } uChar; -#endif - DWORD dwControlKeyState; -} KEY_EVENT_RECORD PACKED; - -typedef struct _MOUSE_EVENT_RECORD { - COORD dwMousePosition; - DWORD dwButtonState; - DWORD dwControlKeyState; - DWORD dwEventFlags; -} MOUSE_EVENT_RECORD; - typedef struct _WINDOW_BUFFER_SIZE_RECORD { COORD dwSize; } WINDOW_BUFFER_SIZE_RECORD; @@ -2439,29 +2510,6 @@ typedef struct _JOB_INFO_1 { SYSTEMTIME Submitted; } JOB_INFO_1; -typedef struct _SID_IDENTIFIER_AUTHORITY { - BYTE Value[6]; -} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY, - *LPSID_IDENTIFIER_AUTHORITY; - -typedef struct _SID { - BYTE Revision; - BYTE SubAuthorityCount; - SID_IDENTIFIER_AUTHORITY IdentifierAuthority; - DWORD SubAuthority[ANYSIZE_ARRAY]; -} SID, *PSID; - -typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL; - -typedef struct _SECURITY_DESCRIPTOR { - BYTE Revision; - BYTE Sbz1; - SECURITY_DESCRIPTOR_CONTROL Control; - PSID Owner; - PSID Group; - PACL Sacl; - PACL Dacl; -} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR; typedef struct _JOB_INFO_2 { DWORD JobId; @@ -2541,12 +2589,7 @@ typedef struct _LOCALGROUP_MEMBERS_INFO_3 { typedef long FXPT16DOT16, * LPFXPT16DOT16; -typedef LARGE_INTEGER LUID, *PLUID; -typedef struct _LUID_AND_ATTRIBUTES { - LUID Luid; - DWORD Attributes; -} LUID_AND_ATTRIBUTES; typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY]; typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY; @@ -3472,11 +3515,6 @@ typedef struct _PRINTPROCESSOR_INFO_1 { LPTSTR pName; } PRINTPROCESSOR_INFO_1; -typedef struct _PRIVILEGE_SET { - DWORD PrivilegeCount; - DWORD Control; - LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY]; -} PRIVILEGE_SET, *PPRIVILEGE_SET, *LPPRIVILEGE_SET; typedef struct _PROCESS_HEAP_ENTRY { PVOID lpData; @@ -3839,9 +3877,6 @@ typedef struct _SID_AND_ATTRIBUTES { typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY]; typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY; -typedef struct _SINGLE_LIST_ENTRY { - struct _SINGLE_LIST_ENTRY *Next; -} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY; typedef struct tagSOUNDSENTRY { UINT cbSize; @@ -4083,11 +4118,6 @@ typedef struct tagTOGGLEKEYS { DWORD cbSize; DWORD dwFlags; } TOGGLEKEYS; - -typedef struct _TOKEN_SOURCE { - CHAR SourceName[8]; - LUID SourceIdentifier; -} TOKEN_SOURCE; typedef struct _TOKEN_CONTROL { LUID TokenId; @@ -4216,12 +4246,7 @@ typedef struct { 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; @@ -4232,13 +4257,6 @@ typedef struct tagUSEROBJECTFLAGS { DWORD dwFlags; } USEROBJECTFLAGS; -typedef struct value_ent { - LPTSTR ve_valuename; - DWORD ve_valuelen; - DWORD ve_valueptr; - DWORD ve_type; -} VALENT, *PVALENT; - typedef struct _VERIFY_INFORMATION { LARGE_INTEGER StartingOffset; DWORD Length; @@ -4555,5 +4573,7 @@ typedef struct } #endif /* __cplusplus */ +#endif /* WIN32_LEAN_AND_MEAN */ + #endif /* _GNU_H_WINDOWS32_STRUCTURES */ diff --git a/reactos/include/windows.h b/reactos/include/windows.h index fb1899e3cf3..20752a4d244 100644 --- a/reactos/include/windows.h +++ b/reactos/include/windows.h @@ -41,7 +41,7 @@ #include /* WIN32 messages */ -#ifndef _WIN32_LEAN_AND_MEAN +#ifndef WIN32_LEAN_AND_MEAN #include #endif @@ -54,20 +54,22 @@ #include /* WIN32 functions */ -#ifndef _WIN32_LEAN_AND_MEAN +#ifndef WIN32_LEAN_AND_MEAN #include #endif #endif /* ! defined (RC_INVOKED) */ /* WIN32 error codes */ +#ifndef WIN32_LEAN_AND_MEAN #include +#endif #ifndef RC_INVOKED /* Windows sockets specification version 1.1 */ #ifdef Win32_Winsock -#ifndef _WIN32_LEAN_AND_MEAN +#ifndef WIN32_LEAN_AND_MEAN #include #endif #endif diff --git a/reactos/include/wstring.h b/reactos/include/wstring.h index 7652dd3d0b1..016f6f88067 100644 --- a/reactos/include/wstring.h +++ b/reactos/include/wstring.h @@ -36,6 +36,11 @@ extern size_t wcsnlen(const wchar_t * s, size_t count); extern int wcsicmp(const wchar_t* cs,const wchar_t * ct); extern int wcsnicmp(const wchar_t* cs,const wchar_t * ct, size_t count); +WCHAR wtoupper(WCHAR c); +WCHAR wtolower(WCHAR c); + + + #ifdef __cplusplus } #endif diff --git a/reactos/lib/kernel32/file/file.c b/reactos/lib/kernel32/file/file.c index 9ba6d5b5c7e..9fcb32cf8ad 100644 --- a/reactos/lib/kernel32/file/file.c +++ b/reactos/lib/kernel32/file/file.c @@ -1,32 +1,16 @@ - /* * Win32 File Api functions * Author: Boudewijn Dekker - * to do: many more to add .. */ - +#undef WIN32_LEAN_AND_MEAN #include - -// AnsiOrOemtoUnicode -// pupose: internal procedure used in file api - -NTSTATUS AnsiOrOemtoUnicode(PUNICODE_STRING DestinationString,PANSI_STRING SourceString, BOOLEAN AllocateDestinationString); +#include BOOLEAN bIsFileApiAnsi; // set the file api to ansi or oem -NTSTATUS AnsiOrOemtoUnicode(PUNICODE_STRING DestinationString,PANSI_STRING SourceString, BOOLEAN AllocateDestinationString) -{ - if ( bIsFileApiAnsi ) { - return __AnsiStringToUnicodeString(DestinationString, SourceString, AllocateDestinationString); - else - return __OemStringToUnicodeString(DestinationString, SourceString, AllocateDestinationString); - -} - - WINBASEAPI VOID WINAPI @@ -36,7 +20,59 @@ SetFileApisToOEM(VOID) return; } - +HANDLE STDCALL CreateFileA(LPCSTR lpFileName, + DWORD dwDesiredAccess, + DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreationDisposition, + DWORD dwFlagsAndAttributes, + HANDLE hTemplateFile) +{ + HANDLE FileHandle; + NTSTATUS Status; + WCHAR FileNameW[255]; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + ULONG i = 0; + UNICODE_STRING FileNameString; + ULONG Flags = 0; + + if (!(dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED)) + { + Flags = Flags | FILE_SYNCHRONOUS_IO_ALERT; + } + + FileNameString.Length = 0; + + while ((*lpFileName)!=0) + { + FileNameW[i] = *lpFileName; + lpFileName++; + i++; + FileNameString.Length++; + } + FileNameW[i] = 0; + FileNameString.Length++; + + FileNameString.Buffer = &FileNameW; + FileNameString.MaximumLength = FileNameString.Length; + + ObjectAttributes.RootDirectory = NULL; + ObjectAttributes.ObjectName = &FileNameString; + + Status = NtCreateFile(&FileHandle, + dwDesiredAccess, + &ObjectAttributes, + &IoStatusBlock, + NULL, + dwFlagsAndAttributes, + dwShareMode, + dwCreationDisposition, + Flags, + NULL, + 0); + return(FileHandle); +} WINBASEAPI VOID @@ -49,10 +85,275 @@ SetFileApisToANSI(VOID) WINBASEAPI -BOOLEAN -WINAPI +WINBOOL +STDCALL AreFileApisANSI(VOID) { return bIsFileApiAnsi; } + + + + +BOOL STDCALL WriteFile(HANDLE hFile, + LPCVOID lpBuffer, + DWORD nNumberOfBytesToWrite, + LPDWORD lpNumberOfBytesWritten, + LPOVERLAPPED lpOverLapped) +{ + //FIXME: WriteFile should write to a console if appropriate + LARGE_INTEGER Offset; + HANDLE hEvent = NULL; + NTSTATUS errCode; + + if (lpOverLapped != NULL ) + { + Offset.LowPart = lpOverLapped->Offset; + Offset.HighPart = lpOverLapped->OffsetHigh; + lpOverLapped->Internal = STATUS_PENDING; + hEvent= lpOverLapped->hEvent; + } + errCode = NtWriteFile(hFile,hEvent,NULL,NULL, + (PIO_STATUS_BLOCK)lpOverLapped, + lpBuffer, + nNumberOfBytesToWrite, + &Offset, + NULL); + if (!NT_SUCCESS(errCode)) + { + SetLastError(RtlNtStatusToDosError(errCode)); + return FALSE; + } + + return(TRUE); +} + +WINBOOL STDCALL ReadFile(HANDLE hFile, + LPVOID lpBuffer, + DWORD nNumberOfBytesToRead, + LPDWORD lpNumberOfBytesRead, + LPOVERLAPPED lpOverLapped) +{ +//FIXME ReadFile should write to a console if appropriate + HANDLE hEvent = NULL; + LARGE_INTEGER Offset; + NTSTATUS errCode; + PIO_STATUS_BLOCK IoStatusBlock; + IO_STATUS_BLOCK IIosb; + OVERLAPPED IOverlapped; + + if ( lpOverLapped != NULL ) + { + Offset.LowPart = lpOverLapped->Offset; + Offset.HighPart = lpOverLapped->OffsetHigh; + lpOverLapped->Internal = STATUS_PENDING; + hEvent = lpOverLapped->hEvent; + IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped; + } + else + { + IoStatusBlock = &IIosb; + } + + errCode = NtReadFile(hFile, + hEvent, + NULL, + NULL, + IoStatusBlock, + lpBuffer, + nNumberOfBytesToRead, + &Offset, + NULL); + if ( errCode < 0 ) + { + SetLastError(RtlNtStatusToDosError(errCode)); + return FALSE; + } + return TRUE; +} + +WINBOOL +STDCALL +ReadFileEx( + HANDLE hFile, + LPVOID lpBuffer, + DWORD nNumberOfBytesToRead, + LPOVERLAPPED lpOverLapped, + LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine + ) +{ + HANDLE hEvent = NULL; + LARGE_INTEGER Offset; + NTSTATUS errCode; + + if ( lpOverLapped != NULL ) { + Offset.LowPart = lpOverLapped->Offset; + Offset.HighPart = lpOverLapped->OffsetHigh; + lpOverLapped->Internal = STATUS_PENDING; + hEvent = lpOverLapped->hEvent; + } + + + + errCode = NtReadFile(hFile, + hEvent, + (PIO_APC_ROUTINE)lpCompletionRoutine, + NULL, + (PIO_STATUS_BLOCK)lpOverLapped, + lpBuffer, + nNumberOfBytesToRead, + &Offset, + NULL); + if ( errCode < 0 ) { + SetLastError(RtlNtStatusToDosError(errCode)); + return FALSE; + } + return TRUE; +} + + +WINBOOL +STDCALL +LockFile( + HANDLE hFile, + DWORD dwFileOffsetLow, + DWORD dwFileOffsetHigh, + DWORD nNumberOfBytesToLockLow, + DWORD nNumberOfBytesToLockHigh + ) +{ + DWORD dwReserved; + OVERLAPPED Overlapped; + + Overlapped.Offset = dwFileOffsetLow; + Overlapped.OffsetHigh = dwFileOffsetHigh; + dwReserved = 0; + + return LockFileEx(hFile, LOCKFILE_FAIL_IMMEDIATELY|LOCKFILE_EXCLUSIVE_LOCK,dwReserved,nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, &Overlapped ) ; + +} + +WINBOOL +STDCALL +LockFileEx( + HANDLE hFile, + DWORD dwFlags, + DWORD dwReserved, + DWORD nNumberOfBytesToLockLow, + DWORD nNumberOfBytesToLockHigh, + LPOVERLAPPED lpOverlapped + ) +{ + LARGE_INTEGER BytesToLock; + BOOL LockImmediate; + BOOL LockExclusive; + NTSTATUS errCode; + LARGE_INTEGER Offset; + + if(dwReserved != 0) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + lpOverlapped->Internal = STATUS_PENDING; + + Offset.LowPart = lpOverlapped->Offset; + Offset.HighPart = lpOverlapped->OffsetHigh; + + if ( (dwFlags & LOCKFILE_FAIL_IMMEDIATELY) == LOCKFILE_FAIL_IMMEDIATELY ) + LockImmediate = TRUE; + else + LockImmediate = FALSE; + + if ( (dwFlags & LOCKFILE_EXCLUSIVE_LOCK) == LOCKFILE_EXCLUSIVE_LOCK ) + LockExclusive = TRUE; + else + LockExclusive = FALSE; + + BytesToLock.LowPart = nNumberOfBytesToLockLow; + BytesToLock.HighPart = nNumberOfBytesToLockHigh; + + errCode = NtLockFile(hFile, + NULL, + NULL, + NULL, + (PIO_STATUS_BLOCK)lpOverlapped, + &Offset, + &BytesToLock, + NULL, + LockImmediate, + LockExclusive); + if ( errCode < 0 ) + { + SetLastError(RtlNtStatusToDosError(errCode)); + return FALSE; + } + + return TRUE; + +} + +WINBOOL +STDCALL +UnlockFile( + HANDLE hFile, + DWORD dwFileOffsetLow, + DWORD dwFileOffsetHigh, + DWORD nNumberOfBytesToUnlockLow, + DWORD nNumberOfBytesToUnlockHigh + ) +{ + DWORD dwReserved; + OVERLAPPED Overlapped; + Overlapped.Offset = dwFileOffsetLow; + Overlapped.OffsetHigh = dwFileOffsetHigh; + dwReserved = 0; + return UnlockFileEx(hFile, dwReserved, nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh, &Overlapped); + +} + + + +WINBOOL STDCALL UnlockFileEx(HANDLE hFile, + DWORD dwReserved, + DWORD nNumberOfBytesToUnLockLow, + DWORD nNumberOfBytesToUnLockHigh, + LPOVERLAPPED lpOverlapped) +{ + LARGE_INTEGER BytesToUnLock; + LARGE_INTEGER StartAddress; + NTSTATUS errCode; + + if(dwReserved != 0) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + if ( lpOverlapped == NULL ) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + BytesToUnLock.LowPart = nNumberOfBytesToUnLockLow; + BytesToUnLock.HighPart = nNumberOfBytesToUnLockHigh; + + StartAddress.LowPart = lpOverlapped->Offset; + StartAddress.HighPart = lpOverlapped->OffsetHigh; + + errCode = NtUnlockFile(hFile, + (PIO_STATUS_BLOCK)lpOverlapped, + StartAddress, + BytesToUnLock, + NULL); + if ( errCode < 0 ) { + SetLastError(RtlNtStatusToDosError(errCode)); + return FALSE; + } + + return TRUE; +} + + diff --git a/reactos/lib/kernel32/file/lfile.c b/reactos/lib/kernel32/file/lfile.c index 9f611423207..4a98c4b06cb 100644 --- a/reactos/lib/kernel32/file/lfile.c +++ b/reactos/lib/kernel32/file/lfile.c @@ -5,10 +5,11 @@ * todo: check the _lopen for correctness */ +#undef WIN32_LEAN_AND_MEAN #include #include #include - +#include @@ -26,8 +27,7 @@ long _hread( } -long -_lread(HFILE fd,LPVOID buffer,long count) +UINT STDCALL _lread(HFILE fd,LPVOID buffer,UINT count) { return _hread(fd,buffer, count); } @@ -54,14 +54,15 @@ long _hwrite( } - -long _lwrite( - 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) @@ -123,7 +124,7 @@ int _lclose( if ( CloseHandle((HANDLE)hFile) ) return 0; else - rerturn -1; + return -1; } LONG _llseek( diff --git a/reactos/lib/kernel32/makefile b/reactos/lib/kernel32/makefile index 669f5d1c0db..349acf004c4 100644 --- a/reactos/lib/kernel32/makefile +++ b/reactos/lib/kernel32/makefile @@ -1,9 +1,30 @@ -all: dummy +all: kernel32.a -OBJECTS = file/file.o file/lfile.o mem/virtual.o mem/local.o mem/global.o +SYNCH_OBJECTS = synch/critical.o -kernel32_lib: $(OBJECTS) - $(LD) --oformat=coff-go32 -Ttext b0000000 $(LDFLAGS) $(OBJECTS) -o kernel32.dll +#MISC_OBJECTS = misc/atom.o +MISC_OBJECTS = misc/error.o + +#FILE_OBJECTS = file/file.o file/lfile.o +FILE_OBJECTS = file/file.o file/curdir.o + +MEM_OBJECTS = mem/virtual.o mem/heap.o mem/utils.o + +#THREAD_OBJECTS = thread/thread.o + +PROCESS_OBJECTS = process/proc.o + +STRING_OBJECTS = string/lstring.o + +INTERNAL_OBJECTS = internal/dprintf.o internal/vsprintf.o + +OBJECTS = $(MISC_OBJECTS) $(FILE_OBJECTS) $(THREAD_OBJECTS) \ + $(PROCESS_OBJECTS) $(STRING_OBJECTS) $(MEM_OBJECTS) \ + $(INTERNAL_OBJECTS) $(SYNCH_OBJECTS) + + +kernel32.a: $(OBJECTS) + $(AR) vrcs kernel32.a $(OBJECTS) dummy: diff --git a/reactos/lib/kernel32/mem/heap.c b/reactos/lib/kernel32/mem/heap.c index bb0b8537dc6..b310344135a 100644 --- a/reactos/lib/kernel32/mem/heap.c +++ b/reactos/lib/kernel32/mem/heap.c @@ -26,7 +26,9 @@ * Put the type definitions of the heap in a seperate header. Boudewijn Dekker */ +#include #include +#include static HEAP_BUCKET __HeapDefaultBuckets[]= { @@ -40,13 +42,14 @@ static HEAP_BUCKET __HeapDefaultBuckets[]= { NULL, 256, 15, 4088 }, }; +PHEAP __ProcessHeap; static BOOL __HeapCommit(PHEAP pheap, LPVOID start, LPVOID end); static BOOL __HeapDecommit(PHEAP pheap, LPVOID start, LPVOID end); static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag); static VOID __HeapFreeRest(PHEAP pheap, PHEAP_BLOCK pfree, ULONG allocsize, ULONG newsize); -static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, ULONG size); +static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size); static BOOL __HeapFree(PHEAP pheap, ULONG flags, LPVOID pmem); static PHEAP_SUBALLOC __HeapAllocSub(PHEAP pheap, PHEAP_BUCKET pbucket); static LPVOID __HeapAllocFragment(PHEAP pheap, ULONG flags, ULONG size); @@ -67,12 +70,14 @@ static BOOL __HeapCommit(PHEAP pheap, LPVOID start, LPVOID end) { dprintf("__HeapCommit( 0x%lX, 0x%lX, 0x%lX)\n", (ULONG) pheap, (ULONG) start, (ULONG) end); -#ifdef NOT - __VirtualDump(); -#endif + if(end >= pheap->LastBlock) pheap->LastBlock=end; - return __VirtualCommit(start, end-start, PAGE_READWRITE); + if (VirtualAlloc(start,end-start,MEM_COMMIT,PAGE_READWRITE)!=start) + { + return(FALSE); + } + return(TRUE); } /********************************************************************* @@ -89,7 +94,8 @@ static BOOL __HeapDecommit(PHEAP pheap, LPVOID start, LPVOID end) #endif if((end >= pheap->LastBlock)&&(start<= pheap->LastBlock)) pheap->LastBlock=start; - return __VirtualDecommit(start, end-start ); + + return(VirtualFree(start,end-start,MEM_RESERVE)); } /********************************************************************* @@ -106,7 +112,10 @@ static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag) 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); @@ -154,7 +163,7 @@ static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag) /* update our administration */ palloc->Size= size | tag; if((flags | pheap->Flags)& HEAP_ZERO_MEMORY) - memset((LPVOID)palloc+HEAP_ADMIN_SIZE, 0, allocsize); + FillMemory((LPVOID)palloc+HEAP_ADMIN_SIZE, allocsize, 0); return (LPVOID)palloc+HEAP_ADMIN_SIZE; } @@ -236,7 +245,7 @@ static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size) /* alloc a new fragment */ pmem=__HeapAllocFragment(pheap, flags, size); if(pmem) - memcpy(pmem, pold, size); + CopyMemory(pmem, pold, size); return pmem; } #endif @@ -300,7 +309,7 @@ static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size) oldsize=HEAP_SIZE(prealloc); pmem=__HeapAlloc(pheap, flags, size, HEAP_NORMAL_TAG); if(pmem) - memcpy(pmem, pold, oldsize); + CopyMemory(pmem, pold, oldsize); if((flags|pheap->Flags)&HEAP_ZERO_MEMORY) memset(pmem + oldsize, 0, size-oldsize); __HeapFree(pheap, flags, pold); @@ -502,7 +511,7 @@ static LPVOID __HeapReAllocFragment(PHEAP pheap, ULONG flags, pmem=__HeapAllocFragment(pheap, flags, size); if(pmem) - memcpy(pmem, pold, size); + CopyMemory(pmem, pold, size); if((flags|pheap->Flags)&HEAP_ZERO_MEMORY) memset(pmem+pfrag->Size, 0, size-pfrag->Size); @@ -580,12 +589,15 @@ static BOOL __HeapFreeFragment(PHEAP pheap, ULONG flags, LPVOID pfree ) PHEAP __HeapPrepare(LPVOID base, ULONG minsize, ULONG maxsize, ULONG flags) { PHEAP pheap=(PHEAP) base; - + + dprintf("__HeapPrepare(base %x, minsize %d, maxsize %d, flags %x)\n", + base,minsize,maxsize,flags); + pheap->Magic=MAGIC_HEAP; pheap->End= ((LPVOID)pheap)+minsize; pheap->Flags=flags; pheap->LastBlock=(LPVOID)pheap + PAGESIZE; - memcpy(pheap->Bucket,__HeapDefaultBuckets,sizeof(__HeapDefaultBuckets)); + CopyMemory(pheap->Bucket,__HeapDefaultBuckets,sizeof(__HeapDefaultBuckets)); if(__ProcessHeap) { pheap->NextHeap=__ProcessHeap->NextHeap; @@ -611,8 +623,8 @@ PHEAP __HeapPrepare(LPVOID base, ULONG minsize, ULONG maxsize, ULONG flags) VOID WINAPI __HeapInit(LPVOID base, ULONG minsize, ULONG maxsize) { - mmap(base, PAGESIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, - __DevZero, 0); + VirtualAlloc(base,maxsize,MEM_RESERVE,PAGE_READWRITE); + VirtualAlloc(base,PAGESIZE,MEM_COMMIT,PAGE_READWRITE); __HeapPrepare(base, minsize, maxsize, 0); } @@ -621,16 +633,14 @@ VOID WINAPI __HeapInit(LPVOID base, ULONG minsize, ULONG maxsize) /********************************************************************* * HeapCreate -- KERNEL32 * *********************************************************************/ - -HANDLE WINAPI HeapCreate(ULONG flags, ULONG minsize, ULONG maxsize) +HANDLE STDCALL HeapCreate(DWORD flags, DWORD minsize, DWORD maxsize) { PHEAP pheap; aprintf("HeapCreate( 0x%lX, 0x%lX, 0x%lX )\n", flags, minsize, maxsize); - pheap = __VirtualReserve(NULL, minsize, PAGE_READWRITE | MEM_TOP_DOWN); - __VirtualCommit(pheap, PAGESIZE, PAGE_READWRITE); - __VirtualDump(); + pheap = VirtualAlloc(NULL, minsize, MEM_TOP_DOWN, PAGE_READWRITE); + VirtualAlloc(pheap, PAGESIZE, MEM_COMMIT, PAGE_READWRITE); return (HANDLE) __HeapPrepare(pheap, minsize, maxsize, flags); } @@ -647,15 +657,15 @@ BOOL WINAPI HeapDestroy(HANDLE hheap) 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; @@ -684,7 +694,7 @@ LPVOID WINAPI HeapAlloc(HANDLE hheap, ULONG flags, ULONG size) /********************************************************************* * HeapReAlloc -- KERNEL32 * *********************************************************************/ -LPVOID WINAPI HeapReAlloc(HANDLE hheap, ULONG flags, LPVOID ptr, ULONG size) +LPVOID STDCALL HeapReAlloc(HANDLE hheap, DWORD flags, LPVOID ptr, DWORD size) { PHEAP pheap=hheap; PHEAP_BLOCK pfree=((PHEAP_BLOCK)ptr-1); @@ -714,7 +724,7 @@ LPVOID WINAPI HeapReAlloc(HANDLE hheap, ULONG flags, LPVOID ptr, ULONG size) /********************************************************************* * HeapFree -- KERNEL32 * *********************************************************************/ -BOOL WINAPI HeapFree(HANDLE hheap, ULONG flags, LPVOID ptr) +WINBOOL STDCALL HeapFree(HANDLE hheap, DWORD flags, LPVOID ptr) { PHEAP pheap=hheap; PHEAP_BLOCK pfree=(PHEAP_BLOCK)((LPVOID)ptr-HEAP_ADMIN_SIZE); diff --git a/reactos/lib/kernel32/mem/virtual.c b/reactos/lib/kernel32/mem/virtual.c index 96532bce7ca..606036c718e 100644 --- a/reactos/lib/kernel32/mem/virtual.c +++ b/reactos/lib/kernel32/mem/virtual.c @@ -9,11 +9,92 @@ /* INCLUDES ******************************************************************/ #include +#include /* 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); +} diff --git a/reactos/lib/kernel32/process/proc.c b/reactos/lib/kernel32/process/proc.c index 5bc2a68f497..633e088f1ad 100644 --- a/reactos/lib/kernel32/process/proc.c +++ b/reactos/lib/kernel32/process/proc.c @@ -1,3 +1,4 @@ +#include #include /* * Win32 Process Api functions @@ -14,14 +15,18 @@ #define NT_CURRENT_THREAD 0xFFFFFFFE -WINBASEAPI -HANDLE -WINAPI -GetCurrentProcess() +HANDLE STDCALL GetCurrentProcess(VOID) { return NT_CURRENT_PROCESS; } +HANDLE STDCALL GetCurrentThread() +{ + return NT_CURRENT_PROCESS; +} + +#if 0 + WINBASEAPI DWORD WINAPI @@ -31,14 +36,6 @@ GetCurrentProcessId() } -WINBASEAPI -HANDLE -WINAPI -GetCurrentThread() -{ - return NT_CURRENT_PROCESS; -} - WINBASEAPI DWORD WINAPI @@ -135,3 +132,5 @@ BOOL FlushInstructionCache( return FALSE; } } + +#endif diff --git a/reactos/lib/ntdll/makefile b/reactos/lib/ntdll/makefile index af3e0e0d593..2135d005a9b 100644 --- a/reactos/lib/ntdll/makefile +++ b/reactos/lib/ntdll/makefile @@ -1,7 +1,10 @@ -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 diff --git a/reactos/makefile.dos b/reactos/makefile.dos index 91b86dc6358..cf9fba3a4ae 100644 --- a/reactos/makefile.dos +++ b/reactos/makefile.dos @@ -5,60 +5,129 @@ # # 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 - -all: $(COMPONENTS) $(LOADERS) $(MODULES) +LOADERS = dos # -# Device driver rules +# 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 +# +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 -lib: dummy - make -C lib +kernel32: dummy + make -C lib/kernel32 + +ntdll: dummy + make -C lib/ntdll + +crtdll: dummy + make -C lib/crtdll + +mingw32: dummy + make -C lib/mingw32 dummy: diff --git a/reactos/ntoskrnl/dbg/brkpoint.c b/reactos/ntoskrnl/dbg/brkpoint.c index 643a658b8fb..0c577b1f221 100644 --- a/reactos/ntoskrnl/dbg/brkpoint.c +++ b/reactos/ntoskrnl/dbg/brkpoint.c @@ -16,6 +16,11 @@ /* FUNCTIONS *****************************************************************/ +NTSTATUS STDCALL NtSystemDebugControl(VOID) +{ + UNIMPLEMENTED; +} + VOID DbgBreakPoint(VOID) { __asm__("int $3\n\t"); diff --git a/reactos/ntoskrnl/ex/callback.c b/reactos/ntoskrnl/ex/callback.c index 3bd3d788bd8..45c85af064a 100644 --- a/reactos/ntoskrnl/ex/callback.c +++ b/reactos/ntoskrnl/ex/callback.c @@ -23,9 +23,12 @@ VOID ExCallUserCallBack(PVOID fn) { } -VOID NtReturnFromCallBack(VOID) -/* - * FUNCTION: Returns from a user callback - */ +NTSTATUS STDCALL NtCallbackReturn(VOID) { + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtW32Call(VOID) +{ + UNIMPLEMENTED; } diff --git a/reactos/ntoskrnl/ex/time.c b/reactos/ntoskrnl/ex/time.c index ac2969fbf7b..355d7a83871 100644 --- a/reactos/ntoskrnl/ex/time.c +++ b/reactos/ntoskrnl/ex/time.c @@ -16,6 +16,28 @@ /* FUNCTIONS *****************************************************************/ +NTSTATUS STDCALL NtSetSystemTime(IN PLARGE_INTEGER SystemTime, + IN PLARGE_INTEGER NewSystemTime OPTIONAL) +{ + return(ZwSetSystemTime(SystemTime,NewSystemTime)); +} + +NTSTATUS STDCALL ZwSetSystemTime(IN PLARGE_INTEGER SystemTime, + IN PLARGE_INTEGER NewSystemTime OPTIONAL) +{ + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtQuerySystemTime (OUT TIME *CurrentTime) +{ + return(ZwQuerySystemTime(CurrentTime)); +} + +NTSTATUS STDCALL ZwQuerySystemTime (OUT TIME *CurrentTime) +{ + UNIMPLEMENTED; +} + VOID ExLocalTimeToSystemTime(PLARGE_INTEGER LocalTime, PLARGE_INTEGER SystemTime) { diff --git a/reactos/ntoskrnl/ex/work.c b/reactos/ntoskrnl/ex/work.c index 405e39caf68..2b3662041ed 100644 --- a/reactos/ntoskrnl/ex/work.c +++ b/reactos/ntoskrnl/ex/work.c @@ -142,7 +142,7 @@ VOID ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem, ASSERT_IRQL(DISPATCH_LEVEL); /* - * Insert the item in the appropiate queue and wake on any thread + * Insert the item in the appropiate queue and wake up any thread * waiting for something to do */ switch(QueueType) @@ -152,5 +152,5 @@ VOID ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem, &normal_work_queue.Lock); KeSetEvent(&normal_work_queue.Busy,IO_NO_INCREMENT,FALSE); break; - }; + } } diff --git a/reactos/ntoskrnl/exports.lst b/reactos/ntoskrnl/exports.lst index 5208b4a06d4..61e28f77fff 100644 --- a/reactos/ntoskrnl/exports.lst +++ b/reactos/ntoskrnl/exports.lst @@ -377,3 +377,10 @@ ZwUnmapViewOfSection ZwWriteFile sprintf wcschr +wcsncat +wcsncpy +wtolower +wtoupper +CbInitDccb +CbAcquireForRead +CbReleaseFromRead diff --git a/reactos/ntoskrnl/hal/x86/bios32.c b/reactos/ntoskrnl/hal/x86/bios32.c index bbb7f78f391..834d2a50bdf 100644 --- a/reactos/ntoskrnl/hal/x86/bios32.c +++ b/reactos/ntoskrnl/hal/x86/bios32.c @@ -18,8 +18,8 @@ #include #include #include -#include -#include +#include +#include /* TYPES ******************************************************************/ diff --git a/reactos/ntoskrnl/hal/x86/exp.c b/reactos/ntoskrnl/hal/x86/exp.c index 68c3bc995c1..7f8326f3aa4 100644 --- a/reactos/ntoskrnl/hal/x86/exp.c +++ b/reactos/ntoskrnl/hal/x86/exp.c @@ -13,16 +13,16 @@ #include #include #include -#include -#include +#include +#include #define NDEBUG #include /* GLOBALS *****************************************************************/ -typedef unsigned int (exception_hook)(CONTEXT* c, unsigned int exp); -asmlinkage unsigned int ExHookException(exception_hook fn, UINT exp); +asmlinkage int page_fault_handler(unsigned int cs, + unsigned int eip); extern descriptor idt[256]; static exception_hook* exception_hooks[256]={NULL,}; @@ -30,43 +30,74 @@ static exception_hook* exception_hooks[256]={NULL,}; #define _STR(x) #x #define STR(x) _STR(x) +extern void interrupt_handler2e(void); + /* FUNCTIONS ****************************************************************/ #define EXCEPTION_HANDLER_WITH_ERROR(x,y) \ void exception_handler##y (void); \ __asm__("\n\t_exception_handler"##x":\n\t" \ + "pushl %gs\n\t" \ + "pushl %fs\n\t" \ + "pushl %es\n\t" \ "pushl %ds\n\t" \ "pushl $"##x"\n\t" \ "pusha\n\t" \ "movw $"STR(KERNEL_DS)",%ax\n\t" \ "movw %ax,%ds\n\t" \ + "movw %ax,%es\n\t" \ + "movw %ax,%fs\n\t" \ + "movw %ax,%gs\n\t" \ "call _exception_handler\n\t" \ "popa\n\t" \ - "addl $8,%esp\n\t" \ + "addl $4,%esp\n\t" \ + "popl %ds\n\t" \ + "popl %es\n\t" \ + "popl %fs\n\t" \ + "popl %gs\n\t" \ + "addl $4,%esp\n\t" \ "iret\n\t") #define EXCEPTION_HANDLER_WITHOUT_ERROR(x,y) \ asmlinkage void exception_handler##y (void); \ __asm__("\n\t_exception_handler"##x":\n\t" \ "pushl $0\n\t" \ + "pushl %gs\n\t" \ + "pushl %fs\n\t" \ + "pushl %es\n\t" \ "pushl %ds\n\t" \ "pushl $"##x"\n\t" \ "pusha\n\t" \ "movw $"STR(KERNEL_DS)",%ax\n\t" \ "movw %ax,%ds\n\t" \ + "movw %ax,%es\n\t" \ + "movw %ax,%fs\n\t" \ + "movw %ax,%gs\n\t" \ "call _exception_handler\n\t" \ "popa\n\t" \ - "addl $8,%esp\n\t" \ + "addl $4,%esp\n\t" \ + "popl %ds\n\t" \ + "popl %es\n\t" \ + "popl %fs\n\t" \ + "popl %gs\n\t" \ + "addl $4,%esp\n\t" \ "iret\n\t") asmlinkage void exception_handler_unknown(void); __asm__("\n\t_exception_handler_unknown:\n\t" "pushl $0\n\t" + "pushl %gs\n\t" + "pushl %fs\n\t" + "pushl %es\n\t" + "pushl %ds\n\t" "pushl %ds\n\t" "pushl $0xff\n\t" "pusha\n\t" "movw $"STR(KERNEL_DS)",%ax\n\t" "movw %ax,%ds\n\t" + "movw %ax,%es\n\t" + "movw %ax,%fs\n\t" + "movw %ax,%gs\n\t" "call _exception_handler\n\t" "popa\n\t" "addl $8,%esp\n\t" @@ -87,14 +118,7 @@ EXCEPTION_HANDLER_WITH_ERROR("10",10); EXCEPTION_HANDLER_WITH_ERROR("11",11); EXCEPTION_HANDLER_WITH_ERROR("12",12); EXCEPTION_HANDLER_WITH_ERROR("13",13); - -/* - * The page fault handler is defined by the memory managment because it is - * special - */ -//EXCEPTION_HANDLER_WITH_ERROR("14",14); -asmlinkage void exception_handler14(void); - +EXCEPTION_HANDLER_WITH_ERROR("14",14); EXCEPTION_HANDLER_WITH_ERROR("15",15); EXCEPTION_HANDLER_WITHOUT_ERROR("16",16); @@ -104,9 +128,12 @@ asmlinkage void exception_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 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, @@ -124,6 +151,19 @@ asmlinkage void exception_handler(unsigned int edi, __asm__("cli\n\t"); + if (type==14) + { + if (page_fault_handler(cs&0xffff,eip)) + { + return; + } + } + if (type==1) + { + DbgPrint("Trap at CS:EIP %x:%x\n",cs&0xffff,eip); + return; + } + /* * Activate any hook for the exception */ @@ -137,6 +177,8 @@ asmlinkage void exception_handler(unsigned int edi, */ printk("Exception: %d(%x)\n",type,error_code&0xffff); printk("CS:EIP %x:%x\n",cs&0xffff,eip); + printk("DS %x ES %x FS %x GS %x\n",ds&0xffff,es&0xffff,fs&0xffff, + gs&0xfff); // for(;;); printk("EAX: %.8x EBX: %.8x ECX: %.8x\n",eax,ebx,ecx); printk("EDX: %.8x EBP: %.8x ESI: %.8x\n",edx,ebp,esi); @@ -145,6 +187,10 @@ asmlinkage void exception_handler(unsigned int edi, { printk("ESP %.8x\n",esp); } + else + { + printk("ESP %.8x\n",esp); + } __asm__("movl %%cr2,%0\n\t" : "=d" (cr2)); @@ -181,6 +227,15 @@ asmlinkage void exception_handler(unsigned int edi, for(;;); } +static void set_system_call_gate(unsigned int sel, unsigned int func) +{ + DPRINT("sel %x %d\n",sel,sel); + idt[sel].a = (((int)func)&0xffff) + + (KERNEL_CS << 16); + idt[sel].b = 0xef00 + (((int)func)&0xffff0000); + DPRINT("idt[sel].b %x\n",idt[sel].b); +} + static void set_interrupt_gate(unsigned int sel, unsigned int func) { idt[sel].a = (((int)func)&0xffff) + @@ -232,4 +287,6 @@ asmlinkage void KeInitExceptions(void) { set_interrupt_gate(i,(int)exception_handler_unknown); } + + set_system_call_gate(0x2e,(int)interrupt_handler2e); } diff --git a/reactos/ntoskrnl/hal/x86/irq.c b/reactos/ntoskrnl/hal/x86/irq.c index 9b0feaee656..7e701a4664d 100644 --- a/reactos/ntoskrnl/hal/x86/irq.c +++ b/reactos/ntoskrnl/hal/x86/irq.c @@ -26,7 +26,7 @@ #include #include -#include +#include #include #define NDEBUG @@ -35,7 +35,7 @@ /* GLOBALS *****************************************************************/ #define NR_IRQS (16) -#define IRQ_BASE (0x20) +#define IRQ_BASE (0x40) asmlinkage void irq_handler_0(void); asmlinkage void irq_handler_1(void); diff --git a/reactos/ntoskrnl/hal/x86/isa.c b/reactos/ntoskrnl/hal/x86/isa.c index bbf5127a3a7..4a738a848d6 100644 --- a/reactos/ntoskrnl/hal/x86/isa.c +++ b/reactos/ntoskrnl/hal/x86/isa.c @@ -15,7 +15,7 @@ /* FUNCTIONS *****************************************************************/ -BOOL HalIsaProbe() +BOOL HalIsaProbe(VOID) /* * FUNCTION: Probes for an ISA bus * RETURNS: True if detected @@ -28,5 +28,5 @@ BOOL HalIsaProbe() /* * Probe for plug and play support */ - + return(TRUE); } diff --git a/reactos/ntoskrnl/hal/x86/page.c b/reactos/ntoskrnl/hal/x86/page.c index 8ff96d94510..c89cf2bd663 100644 --- a/reactos/ntoskrnl/hal/x86/page.c +++ b/reactos/ntoskrnl/hal/x86/page.c @@ -10,7 +10,7 @@ /* INCLUDES ***************************************************************/ -#include +#include #include #include #include @@ -29,6 +29,81 @@ /* FUNCTIONS ***************************************************************/ +static ULONG ProtectToPTE(ULONG flProtect) +{ + ULONG Attributes = 0; + + if (flProtect & PAGE_NOACCESS || flProtect & PAGE_GUARD) + { + Attributes = 0; + } + if (flProtect & PAGE_READWRITE || flProtect & PAGE_EXECUTE_READWRITE) + { + Attributes = PA_WRITE; + } + if (flProtect & PAGE_READONLY || flProtect & PAGE_EXECUTE || + flProtect & PAGE_EXECUTE_READ) + { + Attributes = PA_READ; + } + return(Attributes); +} + +PULONG MmGetPageEntry(PEPROCESS Process, ULONG Address) +{ + unsigned int page_table; + unsigned int* page_tlb; + unsigned int* page_dir = linear_to_physical( + Process->Pcb.PageTableDirectory); + + DPRINT("vaddr %x ",vaddr); + page_tlb = (unsigned int *)physical_to_linear( + PAGE_MASK(page_dir[VADDR_TO_PD_OFFSET(Address)])); + DPRINT("page_tlb %x\n",page_tlb); + + if (PAGE_MASK(page_dir[VADDR_TO_PD_OFFSET(Address)])==0) + { + DPRINT("Creating new page directory\n",0); + page_table = get_free_page(); // Returns a physical address + page_tlb=(unsigned int *)physical_to_linear(page_table); + memset(page_tlb,0,PAGESIZE); + page_dir[VADDR_TO_PD_OFFSET(Address)]=page_table+0x7; + + } + return(&page_tlb[VADDR_TO_PT_OFFSET(Address)/4]); +} + +BOOLEAN MmIsPagePresent(PEPROCESS Process, PVOID Address) +{ + return((*MmGetPageEntry(Process, Address)) & PA_PRESENT); +} + +VOID MmSetPage(PEPROCESS Process, + PVOID Address, + ULONG flProtect, + ULONG PhysicalAddress) +{ + + ULONG Attributes = 0; + + Attributes = ProtectToPTE(flProtect); + + (*MmGetPageEntry(Process, Address)) = PhysicalAddress | Attributes; +} + +VOID MmSetPageProtect(PEPROCESS Process, + PVOID Address, + ULONG flProtect) +{ + ULONG Attributes = 0; + PULONG PageEntry; + + Attributes = ProtectToPTE(flProtect); + + PageEntry = MmGetPageEntry(Process,Address); + (*PageEntry) = PAGE_MASK(*PageEntry) | Attributes; +} + /* * The mark_page_xxxx manipulate the attributes of a page. Use the * higher level functions for synchronization. These functions only work diff --git a/reactos/ntoskrnl/hal/x86/pci.c b/reactos/ntoskrnl/hal/x86/pci.c index d5db1a36e4b..90a384e12b4 100644 --- a/reactos/ntoskrnl/hal/x86/pci.c +++ b/reactos/ntoskrnl/hal/x86/pci.c @@ -1,7 +1,7 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel - * FILE: mkernel/hal/eisa.c + * FILE: ntoskrnl/hal/x86/pci.c * PURPOSE: Interfaces to the PCI bus * PROGRAMMER: David Welch (welch@mcmail.com) * UPDATE HISTORY: diff --git a/reactos/ntoskrnl/hal/x86/printk.c b/reactos/ntoskrnl/hal/x86/printk.c index e2feb90d982..76c2240e735 100644 --- a/reactos/ntoskrnl/hal/x86/printk.c +++ b/reactos/ntoskrnl/hal/x86/printk.c @@ -13,7 +13,7 @@ #include #include -#include +#include #include #include @@ -66,6 +66,7 @@ static unsigned char mode03[] = {0x67,0x00,0x03,0x00,0x03,0x00,0x02, /* FUNCTIONS ***************************************************************/ + void HalSwitchToBlueScreen(void) /* * FUNCTION: Switches the monitor to text mode and writes a blue background @@ -94,6 +95,14 @@ void HalSwitchToBlueScreen(void) } + +NTSTATUS STDCALL NtDisplayString(IN PUNICODE_STRING DisplayString) +{ +// DbgPrint("DisplayString %x\n",DisplayString); + DbgPrint("%s",DisplayString); + return(STATUS_SUCCESS); +} + void HalDisplayString(char* string) /* * FUNCTION: Switches the screen to HAL console mode (BSOD) if not there diff --git a/reactos/ntoskrnl/hal/x86/sources b/reactos/ntoskrnl/hal/x86/sources index a1a3bd0cafb..7aed08284e7 100644 --- a/reactos/ntoskrnl/hal/x86/sources +++ b/reactos/ntoskrnl/hal/x86/sources @@ -2,4 +2,4 @@ HAL_OBJECTS = hal/x86/head.o hal/x86/irq.o hal/x86/exp.o hal/x86/isa.o \ hal/x86/pci.o hal/x86/irqhand.o hal/x86/page.o hal/x86/halinit.o \ hal/x86/irql.o hal/x86/bios32.o hal/x86/thread.o hal/x86/spinlock.o \ hal/x86/printk.o hal/x86/mp.o hal/x86/dma.o hal/x86/bus.o hal/x86/mbr.o \ -hal/x86/sysinfo.o +hal/x86/sysinfo.o hal/x86/usercall.o diff --git a/reactos/ntoskrnl/hal/x86/thread.c b/reactos/ntoskrnl/hal/x86/thread.c index f918120021a..db630babcd1 100644 --- a/reactos/ntoskrnl/hal/x86/thread.c +++ b/reactos/ntoskrnl/hal/x86/thread.c @@ -16,8 +16,8 @@ #include #include #include -#include -#include +#include +#include #define NDEBUG #include @@ -29,7 +29,7 @@ static char null_ldt[8]={0,}; static unsigned int null_ldt_sel=0; -static PKTHREAD FirstThread=NULL; +static PETHREAD FirstThread=NULL; /* FUNCTIONS **************************************************************/ @@ -42,6 +42,7 @@ void HalTaskSwitch(PKTHREAD thread) * again */ { + DPRINT("Scheduling thread %x\n",thread); DPRINT("Scheduling thread %x\n",thread->Context.nr); DPRINT("previous task %x reserved1 %x esp0 %x ss0 %x\n", thread->Context.previous_task,thread->Context.reserved1, @@ -75,7 +76,6 @@ void HalTaskSwitch(PKTHREAD thread) : /* No outputs */ : "m" (*(((unsigned char *)(&(thread->Context.nr)))-4) ) : "ax","dx"); -// set_breakpoint(0,&(FirstThread->Context.gs),HBP_READWRITE,HBP_DWORD); } static unsigned int allocate_tss_descriptor(void) @@ -114,8 +114,129 @@ static void begin_thread(PKSTART_ROUTINE fn, PVOID start_context) for(;;); } -BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn, - PVOID StartContext) +#define FLAG_NT (1<<14) +#define FLAG_VM (1<<17) +#define FLAG_IF (1<<9) +#define FLAG_IOPL ((1<<12)+(1<<13)) + +NTSTATUS KeValidateUserContext(PCONTEXT Context) +/* + * FUNCTION: Validates a processor context + * ARGUMENTS: + * Context = Context to validate + * RETURNS: Status + * NOTE: This only validates the context as not violating system security, it + * doesn't guararantee the thread won't crash at some point + * NOTE2: This relies on there only being two selectors which can access + * system space + */ +{ + if (Context->Eip >= KERNEL_BASE) + { + return(STATUS_UNSUCCESSFUL); + } + if (Context->SegCs == KERNEL_CS) + { + return(STATUS_UNSUCCESSFUL); + } + if (Context->SegDs == KERNEL_DS) + { + return(STATUS_UNSUCCESSFUL); + } + if (Context->SegEs == KERNEL_DS) + { + return(STATUS_UNSUCCESSFUL); + } + if (Context->SegFs == KERNEL_DS) + { + return(STATUS_UNSUCCESSFUL); + } + if (Context->SegGs == KERNEL_DS) + { + return(STATUS_UNSUCCESSFUL); + } + if ((Context->EFlags & FLAG_IOPL) != 0 || + (Context->EFlags & FLAG_NT) || + (Context->EFlags & FLAG_VM) || + (!(Context->EFlags & FLAG_IF))) + { + return(STATUS_SUCCESS); + } + return(STATUS_SUCCESS); +} + +NTSTATUS HalInitTaskWithContext(PETHREAD Thread, PCONTEXT Context) +/* + * FUNCTION: Initialize a task with a user mode context + * ARGUMENTS: + * Thread = Thread to initialize + * Context = Processor context to initialize it with + * RETURNS: Status + */ +{ + unsigned int desc; + unsigned int length; + unsigned int base; + unsigned int* kernel_stack; + NTSTATUS Status; + + DPRINT("HalInitTaskWithContext(Thread %x, Context %x)\n", + Thread,Context); + + assert(sizeof(hal_thread_state)>=0x68); + + if ((Status=KeValidateUserContext(Context))!=STATUS_SUCCESS) + { + return(Status); + } + + desc = allocate_tss_descriptor(); + length = sizeof(hal_thread_state) - 1; + base = (unsigned int)(&(Thread->Tcb.Context)); + kernel_stack = ExAllocatePool(NonPagedPool,PAGESIZE); + + /* + * Setup a TSS descriptor + */ + gdt[desc].a = (length & 0xffff) | ((base & 0xffff) << 16); + gdt[desc].b = ((base & 0xff0000)>>16) | 0x8900 | (length & 0xf0000) + | (base & 0xff000000); + + /* + * Initialize the thread context + */ + memset(&Thread->Tcb.Context,0,sizeof(hal_thread_state)); + Thread->Tcb.Context.ldt = null_ldt_sel; + Thread->Tcb.Context.eflags = Context->EFlags; + Thread->Tcb.Context.iomap_base = FIELD_OFFSET(hal_thread_state,io_bitmap); + Thread->Tcb.Context.esp0 = (ULONG)&kernel_stack[1021]; + Thread->Tcb.Context.ss0 = KERNEL_DS; + Thread->Tcb.Context.esp = Context->Esp; + Thread->Tcb.Context.ss = Context->SegSs; + Thread->Tcb.Context.cs = Context->SegCs; + Thread->Tcb.Context.eip = Context->Eip; + Thread->Tcb.Context.io_bitmap[0] = 0xff; + Thread->Tcb.Context.cr3 = + linear_to_physical(Thread->ThreadsProcess->Pcb.PageTableDirectory); + Thread->Tcb.Context.ds = Context->SegDs; + Thread->Tcb.Context.es = Context->SegEs; + Thread->Tcb.Context.fs = Context->SegFs; + Thread->Tcb.Context.gs = Context->SegGs; + Thread->Tcb.Context.eax = Context->Eax; + Thread->Tcb.Context.ebx = Context->Ebx; + Thread->Tcb.Context.ecx = Context->Ecx; + Thread->Tcb.Context.edx = Context->Edx; + Thread->Tcb.Context.edi = Context->Edi; + Thread->Tcb.Context.esi = Context->Esi; + Thread->Tcb.Context.ebp = Context->Ebp; + + Thread->Tcb.Context.nr = desc * 8; + DPRINT("Allocated %x\n",desc*8); + + return(STATUS_SUCCESS); +} + +BOOLEAN HalInitTask(PETHREAD thread, PKSTART_ROUTINE fn, PVOID StartContext) /* * FUNCTION: Initializes the HAL portion of a thread object * ARGUMENTS: @@ -127,12 +248,13 @@ BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn, { unsigned int desc = allocate_tss_descriptor(); unsigned int length = sizeof(hal_thread_state) - 1; - unsigned int base = (unsigned int)(&(thread->Context)); + unsigned int base = (unsigned int)(&(thread->Tcb.Context)); unsigned int* kernel_stack = ExAllocatePool(NonPagedPool,4096); DPRINT("HalInitTask(Thread %x, fn %x, StartContext %x)\n", thread,fn,StartContext); - + DPRINT("thread->ThreadsProcess %x\n",thread->ThreadsProcess); + /* * Make sure */ @@ -156,30 +278,31 @@ BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn, /* * Initialize the thread context */ - memset(&thread->Context,0,sizeof(hal_thread_state)); - thread->Context.ldt = null_ldt_sel; - thread->Context.eflags = (1<<1)+(1<<9); - thread->Context.iomap_base = FIELD_OFFSET(hal_thread_state,io_bitmap); - thread->Context.esp0 = &kernel_stack[1021]; - thread->Context.ss0 = KERNEL_DS; - thread->Context.esp = &kernel_stack[1021]; - thread->Context.ss = KERNEL_DS; - thread->Context.cs = KERNEL_CS; - thread->Context.eip = (unsigned long)begin_thread; - thread->Context.io_bitmap[0] = 0xff; - thread->Context.cr3 = ((unsigned int)get_page_directory()) - IDMAP_BASE; - thread->Context.ds = KERNEL_DS; - thread->Context.es = KERNEL_DS; - thread->Context.fs = KERNEL_DS; - thread->Context.gs = KERNEL_DS; - thread->Context.nr = desc * 8; + memset(&thread->Tcb.Context,0,sizeof(hal_thread_state)); + thread->Tcb.Context.ldt = null_ldt_sel; + thread->Tcb.Context.eflags = (1<<1)+(1<<9); + thread->Tcb.Context.iomap_base = FIELD_OFFSET(hal_thread_state,io_bitmap); + thread->Tcb.Context.esp0 = &kernel_stack[1021]; + thread->Tcb.Context.ss0 = KERNEL_DS; + thread->Tcb.Context.esp = &kernel_stack[1021]; + thread->Tcb.Context.ss = KERNEL_DS; + thread->Tcb.Context.cs = KERNEL_CS; + thread->Tcb.Context.eip = (unsigned long)begin_thread; + thread->Tcb.Context.io_bitmap[0] = 0xff; + thread->Tcb.Context.cr3 = + linear_to_physical(thread->ThreadsProcess->Pcb.PageTableDirectory); + thread->Tcb.Context.ds = KERNEL_DS; + thread->Tcb.Context.es = KERNEL_DS; + thread->Tcb.Context.fs = KERNEL_DS; + thread->Tcb.Context.gs = KERNEL_DS; + thread->Tcb.Context.nr = desc * 8; DPRINT("Allocated %x\n",desc*8); return(TRUE); } -void HalInitFirstTask(PKTHREAD thread) +void HalInitFirstTask(PETHREAD thread) /* * FUNCTION: Called to setup the HAL portion of a thread object for the * initial thread @@ -208,6 +331,6 @@ void HalInitFirstTask(PKTHREAD thread) */ __asm__("ltr %%ax" : /* no output */ - : "a" (thread->Context.nr)); + : "a" (thread->Tcb.Context.nr)); FirstThread = thread; } diff --git a/reactos/ntoskrnl/hal/x86/usercall.asm b/reactos/ntoskrnl/hal/x86/usercall.asm index bab7e271370..0c0ba44c11e 100644 --- a/reactos/ntoskrnl/hal/x86/usercall.asm +++ b/reactos/ntoskrnl/hal/x86/usercall.asm @@ -1,46 +1,35 @@ ; ; -%include "internal/hal/segment.inc" +%include 'internal/hal/segment.inc' bits 32 section .text -extern _SystemServiceTable +extern __SystemServiceTable +global _interrupt_handler2e -_kernel_mode_call_handler: - - ; - ; Save some registers - ; - 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 diff --git a/reactos/ntoskrnl/io/cancel.c b/reactos/ntoskrnl/io/cancel.c index d68d9b67fb0..995a78afc41 100644 --- a/reactos/ntoskrnl/io/cancel.c +++ b/reactos/ntoskrnl/io/cancel.c @@ -21,6 +21,18 @@ static KSPIN_LOCK CancelSpinLock = {0,}; /* FUNCTIONS *****************************************************************/ +NTSTATUS STDCALL NtCancelIoFile(IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock) +{ + return(ZwCancelIoFile(FileHandle,IoStatusBlock)); +} + +NTSTATUS STDCALL ZwCancelIoFile(IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock) +{ + UNIMPLEMENTED; +} + BOOLEAN IoCancelIrp(PIRP Irp) { KIRQL oldlvl; diff --git a/reactos/ntoskrnl/io/create.c b/reactos/ntoskrnl/io/create.c index 9a2ec501c72..32021103fbd 100644 --- a/reactos/ntoskrnl/io/create.c +++ b/reactos/ntoskrnl/io/create.c @@ -22,6 +22,41 @@ /* FUNCTIONS *************************************************************/ +NTSTATUS STDCALL NtDeleteFile(IN POBJECT_ATTRIBUTES ObjectAttributes) +{ + return(ZwDeleteFile(ObjectAttributes)); +} + +NTSTATUS STDCALL ZwDeleteFile(IN POBJECT_ATTRIBUTES ObjectAttributes) +{ + UNIMPLEMENTED; +} + +NTSTATUS NtCreateFile(PHANDLE FileHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes, + PIO_STATUS_BLOCK IoStatusBlock, + PLARGE_INTEGER AllocateSize, + ULONG FileAttributes, + ULONG ShareAccess, + ULONG CreateDisposition, + ULONG CreateOptions, + PVOID EaBuffer, + ULONG EaLength) +{ + return(ZwCreateFile(FileHandle, + DesiredAccess, + ObjectAttributes, + IoStatusBlock, + AllocateSize, + FileAttributes, + ShareAccess, + CreateDisposition, + CreateOptions, + EaBuffer, + EaLength)); +} + NTSTATUS ZwCreateFile(PHANDLE FileHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, @@ -56,7 +91,144 @@ NTSTATUS ZwCreateFile(PHANDLE FileHandle, * RETURNS: Status */ { - UNIMPLEMENTED; + PVOID Object; + NTSTATUS Status; + PIRP Irp; + KEVENT Event; + PDEVICE_OBJECT DeviceObject; + PFILE_OBJECT FileObject; + PIO_STACK_LOCATION StackLoc; + PWSTR Remainder; + + DPRINT("ZwCreateFile(FileHandle %x, DesiredAccess %x, " + "ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %w)\n", + FileHandle,DesiredAccess,ObjectAttributes, + ObjectAttributes->ObjectName->Buffer); + + assert_irql(PASSIVE_LEVEL); + + *FileHandle=0; + + FileObject = ObGenericCreateObject(FileHandle,DesiredAccess,NULL,IoFileType); + memset(FileObject,0,sizeof(FILE_OBJECT)); + + Status = ObOpenObjectByName(ObjectAttributes,&Object,&Remainder); + + if (Status != STATUS_SUCCESS && Status != STATUS_FS_QUERY_REQUIRED) + { + DPRINT("%s() = Failed to find object\n",__FUNCTION__); + ZwClose(*FileHandle); + *FileHandle=0; + return(STATUS_UNSUCCESSFUL); + } + + + DeviceObject = (PDEVICE_OBJECT)Object; + DeviceObject = IoGetAttachedDevice(DeviceObject); + DPRINT("DeviceObject %x\n",DeviceObject); + + if (Status == STATUS_SUCCESS) + { + CHECKPOINT; + FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN; + FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool, + ObjectAttributes->ObjectName->Length); + FileObject->FileName.Length = ObjectAttributes->Length; + RtlCopyUnicodeString(&(FileObject->FileName), + ObjectAttributes->ObjectName); + } + else + { + CHECKPOINT; + if (DeviceObject->DeviceType != FILE_DEVICE_FILE_SYSTEM && + DeviceObject->DeviceType != FILE_DEVICE_DISK) + { + ZwClose(*FileHandle); + *FileHandle=0; + return(STATUS_UNSUCCESSFUL); + } + if (!(DeviceObject->Vpb->Flags & VPB_MOUNTED)) + { + Status = IoTryToMountStorageDevice(DeviceObject); + if (Status!=STATUS_SUCCESS) + { + ZwClose(*FileHandle); + *FileHandle=0; + return(Status); + } + DeviceObject = IoGetAttachedDevice(DeviceObject); + } + DPRINT("Remainder %w\n",Remainder); + FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool, + wstrlen(Remainder)); + RtlInitUnicodeString(&(FileObject->FileName),Remainder); + DPRINT("FileObject->FileName.Buffer %x %w\n", + FileObject->FileName.Buffer,FileObject->FileName.Buffer); + } + CHECKPOINT; + + if (CreateOptions & FILE_SYNCHRONOUS_IO_ALERT) + { + FileObject->Flags = FileObject->Flags | FO_ALERTABLE_IO; + FileObject->Flags = FileObject->Flags | FO_SYNCHRONOUS_IO; + } + if (CreateOptions & FILE_SYNCHRONOUS_IO_NONALERT) + { + FileObject->Flags = FileObject->Flags | FO_SYNCHRONOUS_IO; + } + + FileObject->DeviceObject=DeviceObject; + FileObject->Vpb=DeviceObject->Vpb; + + KeInitializeEvent(&Event,NotificationEvent,FALSE); + + Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE); + if (Irp==NULL) + { + ZwClose(*FileHandle); + *FileHandle=0; + return(STATUS_UNSUCCESSFUL); + } + + StackLoc = IoGetNextIrpStackLocation(Irp); + StackLoc->MajorFunction = IRP_MJ_CREATE; + StackLoc->MinorFunction = 0; + StackLoc->Flags = 0; + StackLoc->Control = 0; + StackLoc->DeviceObject = DeviceObject; + StackLoc->FileObject=FileObject; + Status = IoCallDriver(DeviceObject,Irp); + if (Status==STATUS_PENDING) + { + KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL); + Status = IoStatusBlock->Status; + } + + if (Status!=STATUS_SUCCESS) + { + ZwClose(*FileHandle); + *FileHandle=0; + } + + DPRINT("*FileHandle %x\n",*FileHandle); + + return(Status); + +} + +NTSTATUS NtOpenFile(PHANDLE FileHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes, + PIO_STATUS_BLOCK IoStatusBlock, + ULONG ShareAccess, + ULONG OpenOptions) +{ + return(ZwOpenFile(FileHandle, + DesiredAccess, + ObjectAttributes, + IoStatusBlock, + ShareAccess, + OpenOptions)); } NTSTATUS ZwOpenFile(PHANDLE FileHandle, @@ -79,119 +251,17 @@ NTSTATUS ZwOpenFile(PHANDLE FileHandle, * NOTE: Undocumented */ { - PVOID Object; - NTSTATUS Status; - PIRP Irp; - KEVENT Event; - PDEVICE_OBJECT DeviceObject; - PFILE_OBJECT FileObject; - PIO_STACK_LOCATION StackLoc; - PWSTR Remainder; - - DPRINT("ZwOpenFile(FileHandle %x, ObjectAttributes %x, " - "ObjectAttributes->ObjectName->Buffer %w)\n",FileHandle, - ObjectAttributes,ObjectAttributes->ObjectName->Buffer); - - assert_irql(PASSIVE_LEVEL); - - *FileHandle=0; - - FileObject = ObGenericCreateObject(FileHandle,0,NULL,OBJTYP_FILE); - memset(FileObject,0,sizeof(FILE_OBJECT)); - - Status = ObOpenObjectByName(ObjectAttributes,&Object,&Remainder); - - if (Status != STATUS_SUCCESS && Status != STATUS_FS_QUERY_REQUIRED) - { - DPRINT("%s() = Failed to find object\n",__FUNCTION__); - ObDeleteHandle(*FileHandle); - *FileHandle=0; - ExFreePool(FileObject); - return(STATUS_UNSUCCESSFUL); - } - - - DeviceObject = (PDEVICE_OBJECT)Object; - DeviceObject = IoGetAttachedDevice(DeviceObject); - DPRINT("DeviceObject %x\n",DeviceObject); - - if (Status == STATUS_SUCCESS) - { - CHECKPOINT; - FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN; - FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool, - ObjectAttributes->Length); - RtlCopyUnicodeString(&(FileObject->FileName), - ObjectAttributes->ObjectName); - } - else - { - CHECKPOINT; - if (DeviceObject->DeviceType != FILE_DEVICE_FILE_SYSTEM && - DeviceObject->DeviceType != FILE_DEVICE_DISK) - { - ObDeleteHandle(*FileHandle); - *FileHandle=0; - ExFreePool(FileObject); - return(STATUS_UNSUCCESSFUL); - } - if (!(DeviceObject->Vpb->Flags & VPB_MOUNTED)) - { - Status = IoTryToMountStorageDevice(DeviceObject); - if (Status!=STATUS_SUCCESS) - { - ObDeleteHandle(*FileHandle); - *FileHandle=0; - ExFreePool(FileObject); - return(Status); - } - DeviceObject = IoGetAttachedDevice(DeviceObject); - } - DPRINT("Remainder %w\n",Remainder); - FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool, - wstrlen(Remainder)); - RtlInitUnicodeString(&(FileObject->FileName),Remainder); - DPRINT("FileObject->FileName.Buffer %x %w\n", - FileObject->FileName.Buffer,FileObject->FileName.Buffer); - } - CHECKPOINT; - - FileObject->DeviceObject=DeviceObject; - FileObject->Vpb=DeviceObject->Vpb; - - KeInitializeEvent(&Event,NotificationEvent,FALSE); - - Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE); - if (Irp==NULL) - { - ObDeleteHandle(*FileHandle); - *FileHandle=0; - ExFreePool(FileObject); - return(STATUS_UNSUCCESSFUL); - } - - StackLoc = IoGetNextIrpStackLocation(Irp); - StackLoc->MajorFunction = IRP_MJ_CREATE; - StackLoc->MinorFunction = 0; - StackLoc->Flags = 0; - StackLoc->Control = 0; - StackLoc->DeviceObject = DeviceObject; - StackLoc->FileObject=FileObject; - Status = IoCallDriver(DeviceObject,Irp); - if (Status==STATUS_PENDING) - { - KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL); - Status = IoStatusBlock->Status; - } - - if (Status!=STATUS_SUCCESS) - { - ObDeleteHandle(*FileHandle); - *FileHandle=0; - ExFreePool(FileObject); - } - - return(Status); + return(ZwCreateFile(FileHandle, + DesiredAccess, + ObjectAttributes, + IoStatusBlock, + NULL, + 0, + ShareAccess, + FILE_OPEN, + OpenOptions, + NULL, + 0)); } diff --git a/reactos/ntoskrnl/io/device.c b/reactos/ntoskrnl/io/device.c index 822a85af7e9..6d9e478f790 100644 --- a/reactos/ntoskrnl/io/device.c +++ b/reactos/ntoskrnl/io/device.c @@ -21,6 +21,27 @@ /* FUNCTIONS ***************************************************************/ + +NTSTATUS +STDCALL +NtUnloadDriver( + IN PUNICODE_STRING DriverServiceName + ) +{ +} + +NTSTATUS +STDCALL +ZwUnloadDriver( + IN PUNICODE_STRING DriverServiceName + ) +{ +} + +NTSTATUS NtLoadDriver(PUNICODE_STRING DriverServiceName) +{ +} + NTSTATUS ZwLoadDriver(PUNICODE_STRING DriverServiceName) /* * FUNCTION: Loads a driver @@ -187,11 +208,11 @@ NTSTATUS IoCreateDevice(PDRIVER_OBJECT DriverObject, if (DeviceName!=NULL) { InitializeObjectAttributes(&dev_attr,DeviceName,0,NULL,NULL); - dev = ObGenericCreateObject(&devh,0,&dev_attr,OBJTYP_DEVICE); + dev = ObGenericCreateObject(&devh,0,&dev_attr,IoDeviceType); } else { - dev = ObGenericCreateObject(&devh,0,NULL,OBJTYP_DEVICE); + dev = ObGenericCreateObject(&devh,0,NULL,IoDeviceType); } *DeviceObject=NULL; diff --git a/reactos/ntoskrnl/io/drvlck.c b/reactos/ntoskrnl/io/drvlck.c index 92ee41795d8..9cbc7ee36ec 100644 --- a/reactos/ntoskrnl/io/drvlck.c +++ b/reactos/ntoskrnl/io/drvlck.c @@ -11,38 +11,48 @@ /* INCLUDES *****************************************************************/ #include +#include #include /* 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; } diff --git a/reactos/ntoskrnl/io/file.c b/reactos/ntoskrnl/io/file.c index 810047542b5..1e659dbf676 100644 --- a/reactos/ntoskrnl/io/file.c +++ b/reactos/ntoskrnl/io/file.c @@ -25,6 +25,15 @@ NTSTATUS ZwQueryInformationFile(HANDLE FileHandle, UNIMPLEMENTED; } +NTSTATUS NtQueryInformationFile(HANDLE FileHandle, + PIO_STATUS_BLOCK IoStatusBlock, + PVOID FileInformation, + ULONG Length, + FILE_INFORMATION_CLASS FileInformationClass) +{ + UNIMPLEMENTED; +} + NTSTATUS ZwSetInformationFile(HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FileInformation, @@ -34,7 +43,90 @@ NTSTATUS ZwSetInformationFile(HANDLE FileHandle, UNIMPLEMENTED; } +NTSTATUS NtSetInformationFile(HANDLE FileHandle, + PIO_STATUS_BLOCK IoStatusBlock, + PVOID FileInformation, + ULONG Length, + FILE_INFORMATION_CLASS FileInformationClass) +{ + UNIMPLEMENTED; +} + PGENERIC_MAPPING IoGetFileObjectGenericMapping() { UNIMPLEMENTED; } + +NTSTATUS +STDCALL +NtQueryAttributesFile( + IN HANDLE FileHandle, + IN PVOID Buffer + ) +{ +} + +NTSTATUS +STDCALL +ZwQueryAttributesFile( + IN HANDLE FileHandle, + IN PVOID Buffer + ) +{ +} + +NTSTATUS +STDCALL +NtQueryFullAttributesFile( + IN HANDLE FileHandle, + IN PVOID Attributes + ) +{ +} + +NTSTATUS +STDCALL +ZwQueryFullAttributesFile( + IN HANDLE FileHandle, + IN PVOID Attributes + ) +{ +} + +NTSTATUS +STDCALL +NtQueryEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID EaList OPTIONAL, + IN ULONG EaListLength, + IN PULONG EaIndex OPTIONAL, + IN BOOLEAN RestartScan + ) +{ +} + +NTSTATUS +STDCALL +NtSetEaFile( + IN HANDLE FileHandle, + IN PIO_STATUS_BLOCK IoStatusBlock, + PVOID EaBuffer, + ULONG EaBufferSize + ) +{ +} + +NTSTATUS +STDCALL +ZwSetEaFile( + IN HANDLE FileHandle, + IN PIO_STATUS_BLOCK IoStatusBlock, + PVOID EaBuffer, + ULONG EaBufferSize + ) +{ +} diff --git a/reactos/ntoskrnl/io/fs.c b/reactos/ntoskrnl/io/fs.c index 8563275909a..7c24a0ecc47 100644 --- a/reactos/ntoskrnl/io/fs.c +++ b/reactos/ntoskrnl/io/fs.c @@ -31,6 +31,51 @@ static LIST_ENTRY FileSystemListHead = {NULL,NULL}; /* FUNCTIONS *****************************************************************/ +NTSTATUS +STDCALL +NtFsControlFile( + IN HANDLE DeviceHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer, + IN ULONG InputBufferSize, + OUT PVOID OutputBuffer, + IN ULONG OutputBufferSize + ) +{ + return(ZwFsControlFile(DeviceHandle, + Event, + ApcRoutine, + ApcContext, + IoStatusBlock, + IoControlCode, + InputBuffer, + InputBufferSize, + OutputBuffer, + OutputBufferSize)); +} + +NTSTATUS +STDCALL +ZwFsControlFile( + IN HANDLE DeviceHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer, + IN ULONG InputBufferSize, + OUT PVOID OutputBuffer, + IN ULONG OutputBufferSize + ) +{ + UNIMPLEMENTED; +} + VOID IoInitFileSystemImplementation(VOID) { InitializeListHead(&FileSystemListHead); @@ -142,6 +187,7 @@ VOID IoUnregisterFileSystem(PDEVICE_OBJECT DeviceObject) if (current->DeviceObject == DeviceObject) { RemoveEntryList(current_entry); + ExFreePool(current); KeReleaseSpinLock(&FileSystemListLock,oldlvl); return; } diff --git a/reactos/ntoskrnl/io/ioctrl.c b/reactos/ntoskrnl/io/ioctrl.c index 308a3e11516..9d80eaf1d0f 100644 --- a/reactos/ntoskrnl/io/ioctrl.c +++ b/reactos/ntoskrnl/io/ioctrl.c @@ -20,3 +20,37 @@ ULONG IoGetFunctionCodeFromCtlCode(ULONG ControlCode) { UNIMPLEMENTED; } + +NTSTATUS +STDCALL +NtDeviceIoControlFile( + IN HANDLE DeviceHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL, + IN PVOID UserApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer, + IN ULONG InputBufferSize, + OUT PVOID OutputBuffer, + IN ULONG OutputBufferSize + ) +{ +} + +NTSTATUS +STDCALL +ZwDeviceIoControlFile( + IN HANDLE DeviceHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL, + IN PVOID UserApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer, + IN ULONG InputBufferSize, + OUT PVOID OutputBuffer, + IN ULONG OutputBufferSize + ) +{ +} diff --git a/reactos/ntoskrnl/io/iomgr.c b/reactos/ntoskrnl/io/iomgr.c index dbd86228df3..bf0047f9cce 100644 --- a/reactos/ntoskrnl/io/iomgr.c +++ b/reactos/ntoskrnl/io/iomgr.c @@ -13,45 +13,15 @@ #include #include #include +#include #define NDEBUG #include /* GLOBALS *******************************************************************/ -OBJECT_TYPE DeviceObjectType = {{0,0,NULL}, - 0, - 0, - ULONG_MAX, - ULONG_MAX, - sizeof(DEVICE_OBJECT), - 0, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - }; - -OBJECT_TYPE FileObjectType = {{0,0,NULL}, - 0, - 0, - ULONG_MAX, - ULONG_MAX, - sizeof(FILE_OBJECT), - 0, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - }; +POBJECT_TYPE IoDeviceType = NULL; +POBJECT_TYPE IoFileType = NULL; /* FUNCTIONS ****************************************************************/ @@ -60,31 +30,63 @@ VOID IoInit(VOID) { OBJECT_ATTRIBUTES attr; HANDLE handle; - UNICODE_STRING string; - ANSI_STRING astring; + UNICODE_STRING UnicodeString; + ANSI_STRING AnsiString; /* * Register iomgr types */ - RtlInitAnsiString(&astring,"Device"); - RtlAnsiStringToUnicodeString(&DeviceObjectType.TypeName,&astring,TRUE); - ObRegisterType(OBJTYP_DEVICE,&DeviceObjectType); - - 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(); diff --git a/reactos/ntoskrnl/io/mdl.c b/reactos/ntoskrnl/io/mdl.c index f3a7c2f93c0..72d29181b99 100644 --- a/reactos/ntoskrnl/io/mdl.c +++ b/reactos/ntoskrnl/io/mdl.c @@ -10,7 +10,7 @@ /* INCLUDES *****************************************************************/ -#include +#include #include #include diff --git a/reactos/ntoskrnl/io/resource.c b/reactos/ntoskrnl/io/resource.c index 76d24dc37f5..eeb40d7a62d 100644 --- a/reactos/ntoskrnl/io/resource.c +++ b/reactos/ntoskrnl/io/resource.c @@ -14,11 +14,15 @@ #include +/* GLOBALS *******************************************************************/ + +static CONFIGURATION_INFORMATION SystemConfigurationInformation = {0,}; + /* FUNCTIONS *****************************************************************/ -PCONFIGURATION_INFORMATION IoGetConfigurationInformation() +PCONFIGURATION_INFORMATION IoGetConfigurationInformation(VOID) { - UNIMPLEMENTED; + return(&SystemConfigurationInformation); } NTSTATUS IoReportResourceUsage(PUNICODE_STRING DriverClassName, diff --git a/reactos/ntoskrnl/io/symlink.c b/reactos/ntoskrnl/io/symlink.c index 077d37322d0..d7b4d90fc6d 100644 --- a/reactos/ntoskrnl/io/symlink.c +++ b/reactos/ntoskrnl/io/symlink.c @@ -26,25 +26,46 @@ typedef struct OBJECT_ATTRIBUTES Target; } SYMLNK_OBJECT, *PSYMLNK_OBJECT; -OBJECT_TYPE SymlinkObjectType = {{NULL,0,0}, - 0, - 0, - ULONG_MAX, - ULONG_MAX, - sizeof(SYMLNK_OBJECT), - 0, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - }; +POBJECT_TYPE IoSymbolicLinkType = NULL; /* FUNCTIONS *****************************************************************/ +VOID IoInitSymbolicLinkImplementation(VOID) +{ + ANSI_STRING AnsiString; + + IoSymbolicLinkType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE)); + + IoSymbolicLinkType->TotalObjects = 0; + IoSymbolicLinkType->TotalHandles = 0; + IoSymbolicLinkType->MaxObjects = ULONG_MAX; + IoSymbolicLinkType->MaxHandles = ULONG_MAX; + IoSymbolicLinkType->PagedPoolCharge = 0; + IoSymbolicLinkType->NonpagedPoolCharge = sizeof(SYMLNK_OBJECT); + IoSymbolicLinkType->Dump = NULL; + IoSymbolicLinkType->Open = NULL; + IoSymbolicLinkType->Close = NULL; + IoSymbolicLinkType->Delete = NULL; + IoSymbolicLinkType->Parse = NULL; + IoSymbolicLinkType->Security = NULL; + IoSymbolicLinkType->QueryName = NULL; + IoSymbolicLinkType->OkayToClose = NULL; + + RtlInitAnsiString(&AnsiString,"Symbolic Link"); + RtlAnsiStringToUnicodeString(&IoSymbolicLinkType->TypeName, + &AnsiString,TRUE); +} + + +NTSTATUS NtOpenSymbolicLinkObject(OUT PHANDLE LinkHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes) +{ + return(ZwOpenSymbolicLinkObject(LinkHandle, + DesiredAccess, + ObjectAttributes)); +} + NTSTATUS ZwOpenSymbolicLinkObject(OUT PHANDLE LinkHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes) @@ -58,20 +79,34 @@ NTSTATUS ZwOpenSymbolicLinkObject(OUT PHANDLE LinkHandle, { return(Status); } - *LinkHandle = ObAddHandle(Object); + *LinkHandle = ObInsertHandle(KeGetCurrentProcess(),Object, + DesiredAccess,FALSE); return(STATUS_SUCCESS); } +NTSTATUS NtQuerySymbolicLinkObject(IN HANDLE LinkHandle, + IN OUT PUNICODE_STRING LinkTarget, + OUT PULONG ReturnedLength OPTIONAL) +{ + return(ZwQuerySymbolicLinkObject(LinkHandle,LinkTarget,ReturnedLength)); +} + NTSTATUS ZwQuerySymbolicLinkObject(IN HANDLE LinkHandle, IN OUT PUNICODE_STRING LinkTarget, OUT PULONG ReturnedLength OPTIONAL) { - COMMON_BODY_HEADER* hdr = ObGetObjectByHandle(LinkHandle); - PSYMLNK_OBJECT SymlinkObject = (PSYMLNK_OBJECT)hdr; - - if (hdr==NULL) + 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); @@ -97,15 +132,6 @@ POBJECT IoOpenSymlink(POBJECT _Symlink) return(Result); } -VOID IoInitSymbolicLinkImplementation(VOID) -{ - ANSI_STRING astring; - - RtlInitAnsiString(&astring,"Symbolic Link"); - RtlAnsiStringToUnicodeString(&SymlinkObjectType.TypeName,&astring,TRUE); - ObRegisterType(OBJTYP_SYMLNK,&SymlinkObjectType); -} - NTSTATUS IoCreateUnprotectedSymbolicLink(PUNICODE_STRING SymbolicLinkName, PUNICODE_STRING DeviceName) { @@ -124,12 +150,15 @@ NTSTATUS IoCreateSymbolicLink(PUNICODE_STRING SymbolicLinkName, SymbolicLinkName->Buffer,DeviceName->Buffer); InitializeObjectAttributes(&ObjectAttributes,SymbolicLinkName,0,NULL,NULL); - SymbolicLink = ObGenericCreateObject(&SymbolicLinkHandle,0, - &ObjectAttributes,OBJTYP_SYMLNK); + SymbolicLink = ObGenericCreateObject(&SymbolicLinkHandle, + SYMBOLIC_LINK_ALL_ACCESS, + &ObjectAttributes, + IoSymbolicLinkType); if (SymbolicLink == NULL) { return(STATUS_UNSUCCESSFUL); } + SymbolicLink->TargetName.Buffer = ExAllocatePool(NonPagedPool, ((wstrlen(DeviceName->Buffer)+1)*2)); SymbolicLink->TargetName.MaximumLength = wstrlen(DeviceName->Buffer); @@ -146,3 +175,25 @@ NTSTATUS IoDeleteSymbolicLink(PUNICODE_STRING DeviceName) { UNIMPLEMENTED; } + +NTSTATUS STDCALL NtCreateSymbolicLinkObject( + OUT PHANDLE SymbolicLinkHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PUNICODE_STRING Name) +{ + return(NtCreateSymbolicLinkObject(SymbolicLinkHandle, + DesiredAccess, + ObjectAttributes, + Name)); +} + +NTSTATUS STDCALL ZwCreateSymbolicLinkObject( + OUT PHANDLE SymbolicLinkHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PUNICODE_STRING Name) +{ + UNIMPLEMENTED; +} + diff --git a/reactos/ntoskrnl/io/timer.c b/reactos/ntoskrnl/io/timer.c index d9ada2fc7f7..c07874e2a16 100644 --- a/reactos/ntoskrnl/io/timer.c +++ b/reactos/ntoskrnl/io/timer.c @@ -33,6 +33,8 @@ NTSTATUS IoInitializeTimer(PDEVICE_OBJECT DeviceObject, DeviceObject->Timer = ExAllocatePool(NonPagedPool,sizeof(IO_TIMER)); KeInitializeTimer(&(DeviceObject->Timer->timer)); KeInitializeDpc(&(DeviceObject->Timer->dpc),TimerRoutine,Context); + + return(STATUS_SUCCESS); } VOID IoStartTimer(PDEVICE_OBJECT DeviceObject) diff --git a/reactos/ntoskrnl/ke/apc.c b/reactos/ntoskrnl/ke/apc.c index cc730674075..f6c63004180 100644 --- a/reactos/ntoskrnl/ke/apc.c +++ b/reactos/ntoskrnl/ke/apc.c @@ -12,25 +12,95 @@ #include #include +#include +#include +#define NDEBUG #include +extern VOID KeApcProlog(VOID); + /* FUNCTIONS *****************************************************************/ -VOID KeDrainApcQueue(VOID) +VOID KeApcProlog2(PKAPC Apc) { - PLIST_ENTRY current_entry; - PKAPC current; - PKTHREAD CurrentThread=KeGetCurrentThread(); + 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; - while ((current_entry=RemoveHeadList(CurrentThread->ApcList))!=NULL) - { - current = CONTAINING_RECORD(current_entry,KAPC,ApcListEntry); - current->NormalRoutine(current->NormalContext, - current->SystemArgument1, - current->SystemArgument2); - current_entry = current_entry->Flink; + TargetThread = Apc->Thread; + + if (TargetThread == KeGetCurrentThread()) + { + Apc->KernelRoutine(Apc, + &Apc->NormalRoutine, + &Apc->NormalContext, + &Apc->SystemArgument2, + &Apc->SystemArgument2); + return; } + + if (TargetThread->Context.cs == KERNEL_CS) + { + TargetThread->Context.esp = TargetThread->Context.esp - 16; + Stack = (PULONG)TargetThread->Context.esp; + Stack[0] = TargetThread->Context.eax; + Stack[1] = TargetThread->Context.eip; + Stack[2] = TargetThread->Context.cs; + Stack[3] = TargetThread->Context.eflags; + TargetThread->Context.eip = KeApcProlog; + TargetThread->Context.eax = (ULONG)Apc; + } + else + { + TargetThread->Context.esp = TargetThread->Context.esp - 40; + Stack = (PULONG)TargetThread->Context.esp; + Stack[9] = TargetThread->Context.ss; + Stack[8] = TargetThread->Context.esp; + Stack[7] = TargetThread->Context.gs; + Stack[6] = TargetThread->Context.fs; + Stack[5] = TargetThread->Context.ds; + Stack[4] = TargetThread->Context.es; + Stack[3] = TargetThread->Context.eflags; + Stack[2] = TargetThread->Context.cs; + Stack[1] = TargetThread->Context.eip; + Stack[0] = TargetThread->Context.eax; + TargetThread->Context.eip = KeApcProlog; + TargetThread->Context.eax = (ULONG)Apc; + } + + PsResumeThread(CONTAINING_RECORD(TargetThread,ETHREAD,Tcb)); +} + +void KeInsertQueueApc(struct _KAPC *Apc, PVOID SystemArgument1, + PVOID SystemArgument2, UCHAR Mode) +{ + KIRQL oldlvl; + + DPRINT("KeInsertQueueApc(Apc %x, SystemArgument1 %x, " + "SystemArgument2 %x, Mode %d)\n",Apc,SystemArgument1, + SystemArgument2,Mode); + + KeRaiseIrql(DISPATCH_LEVEL,&oldlvl); + + if (Apc->KernelRoutine != NULL) + { + KeDeliverKernelApc(Apc); + } + KeLowerIrql(oldlvl); } VOID KeInitializeApc(PKAPC Apc, @@ -55,18 +125,35 @@ VOID KeInitializeApc(PKAPC Apc, Apc->ApcMode=Mode; } -void KeInsertQueueApc(PKAPC Apc, PVOID SystemArgument1, - PVOID SystemArgument2, UCHAR Mode) + +NTSTATUS STDCALL NtQueueApcThread(HANDLE ThreadHandle, + PKNORMAL_ROUTINE ApcRoutine, + PVOID NormalContext, + PVOID SystemArgument1, + PVOID SystemArgument2) { - Apc->SystemArgument1=SystemArgument1; - Apc->SystemArgument2=SystemArgument2; - Apc->ApcMode=Mode; - if (Apc->Inserted) - { - return; - } - Apc->Inserted=TRUE; - InsertTailList(Apc->Thread->ApcList,&Apc->ApcListEntry); - return; + return(NtQueueApcThread(ThreadHandle, + ApcRoutine, + NormalContext, + SystemArgument1, + SystemArgument2)); } +NTSTATUS STDCALL ZwQueueApcThread(HANDLE ThreadHandle, + PKNORMAL_ROUTINE ApcRoutine, + PVOID NormalContext, + PVOID SystemArgument1, + PVOID SystemArgument2) +{ + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtTestAlert(VOID) +{ + return(ZwTestAlert()); +} + +NTSTATUS STDCALL ZwTestAlert(VOID) +{ + UNIMPLEMENTED; +} diff --git a/reactos/ntoskrnl/ke/bug.c b/reactos/ntoskrnl/ke/bug.c index 1549e6ebd1d..ba9c7cd4e6d 100644 --- a/reactos/ntoskrnl/ke/bug.c +++ b/reactos/ntoskrnl/ke/bug.c @@ -32,6 +32,7 @@ VOID KeInitializeBugCheck(VOID) VOID KeInitializeCallbackRecord(PKBUGCHECK_CALLBACK_RECORD CallbackRecord) { + UNIMPLEMENTED; } BOOLEAN KeRegisterBugCheckCallback(PKBUGCHECK_CALLBACK_RECORD CallbackRecord, @@ -64,6 +65,7 @@ VOID KeBugCheckEx(ULONG BugCheckCode, DbgPrint("Bug detected (code %x param %x %x %x %x)\n",BugCheckCode, BugCheckParameter1,BugCheckParameter2,BugCheckParameter3, BugCheckParameter4); + *((unsigned int *)0)=0; for(;;); } diff --git a/reactos/ntoskrnl/ke/catch.c b/reactos/ntoskrnl/ke/catch.c index 3b6bc5ce67e..98b3c5a8df7 100644 --- a/reactos/ntoskrnl/ke/catch.c +++ b/reactos/ntoskrnl/ke/catch.c @@ -18,3 +18,24 @@ VOID ExRaiseStatus(NTSTATUS Status) DbgPrint("ExRaiseStatus(%d)\n",Status); for(;;); } + + +NTSTATUS +STDCALL +NtRaiseException( + IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context, + IN BOOL IsDebugger OPTIONAL + ) +{ +} + +NTSTATUS +STDCALL +ZwRaiseException( + IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context, + IN BOOL IsDebugger OPTIONAL + ) +{ +} diff --git a/reactos/ntoskrnl/ke/dispatch.c b/reactos/ntoskrnl/ke/dispatch.c index ff90e538336..eb42af01881 100644 --- a/reactos/ntoskrnl/ke/dispatch.c +++ b/reactos/ntoskrnl/ke/dispatch.c @@ -11,6 +11,7 @@ #include #include #include +#include /* FUNCTIONS ****************************************************************/ diff --git a/reactos/ntoskrnl/ke/error.c b/reactos/ntoskrnl/ke/error.c index d9a8344114d..3f2970f4230 100644 --- a/reactos/ntoskrnl/ke/error.c +++ b/reactos/ntoskrnl/ke/error.c @@ -11,6 +11,7 @@ /* INCLUDE *****************************************************************/ #include +#include /* GLOBALS *****************************************************************/ @@ -44,3 +45,11 @@ VOID STDCALL SetLastError(DWORD dwErrCode) error_code=dwErrCode; } + +NTSTATUS STDCALL NtRaiseHardError(VOID) +{ +} + +NTSTATUS STDCALL NtSetDefaultHardErrorPort(VOID) +{ +} diff --git a/reactos/ntoskrnl/ke/event.c b/reactos/ntoskrnl/ke/event.c index 9cb787fe940..ec923539a8b 100644 --- a/reactos/ntoskrnl/ke/event.c +++ b/reactos/ntoskrnl/ke/event.c @@ -11,6 +11,7 @@ /* INCLUDES *****************************************************************/ #include +#include #define NDEBUG #include diff --git a/reactos/ntoskrnl/ke/exports.c b/reactos/ntoskrnl/ke/exports.c index 995affd5fb5..097e1bcda81 100644 --- a/reactos/ntoskrnl/ke/exports.c +++ b/reactos/ntoskrnl/ke/exports.c @@ -5,379 +5,15 @@ * */ #include +#include +#include +#include +#include +#include +#include #ifdef __cplusplus extern "C" { #endif -void free_page(void); -void get_dma_page(void); -void DbgPrint(void); -void printk(void); -void ExAcquireFastMutex(void); -void ExAcquireFastMutexUnsafe(void); -void ExAcquireResourceExclusive(void); -void ExAcquireResourceExclusiveLite(void); -void ExAcquireResourceSharedLite(void); -void ExAcquireSharedStarveExclusive(void); -void ExAcquireSharedWaitForExclusive(void); -void ExAllocateFromNPagedLookasideList(void); -void ExAllocateFromPagedLookasideList(void); -void ExAllocateFromZone(void); -void ExAllocatePool(void); -void ExAllocatePoolWithQuota(void); -void ExAllocatePoolWithQuotaTag(void); -void ExAllocatePoolWithTag(void); -void ExConvertExclusiveToSharedLite(void); -void ExDeleteNPagedLookasideList(void); -void ExDeletePagedLookasideList(void); -void ExDeleteResource(void); -void ExDeleteResourceLite(void); -void ExExtendZone(void); -void ExFreePool(void); -void ExFreeToNPagedLookasideList(void); -void ExFreeToPagedLookasideList(void); -void ExFreeToZone(void); -void ExGetCurrentResourceThread(void); -void ExGetExclusiveWaiterCount(void); -void ExGetSharedWaiterCount(void); -void ExHookException(void); -void ExInitializeFastMutex(void); -void ExInitializeNPagedLookasideList(void); -void ExInitializePagedLookasideList(void); -void ExInitializeResource(void); -void ExInitializeResourceLite(void); -void ExInitializeSListHead(void); -void ExInitializeWorkItem(void); -void ExInitializeZone(void); -void ExInterlockedAddLargeInteger(void); -void ExInterlockedAddUlong(void); -void ExInterlockedAllocateFromZone(void); -void ExInterlockedDecrementLong(void); -void ExInterlockedExchangeUlong(void); -void ExInterlockedExtendZone(void); -void ExInterlockedFreeToZone(void); -void ExInterlockedIncrementLong(void); -void ExInterlockedInsertHeadList(void); -void ExInterlockedInsertTailList(void); -void ExInterlockedPopEntryList(void); -void ExInterlockedPopEntrySList(void); -void ExInterlockedPushEntryList(void); -void ExInterlockedPushEntrySList(void); -void ExInterlockedRemoveHeadList(void); -void ExIsFullZone(void); -void ExIsObjectInFirstZoneSegment(void); -void ExIsResourceAcquiredExclusiveLite(void); -void ExIsResourceAcquiredSharedLite(void); -void ExLocalTimeToSystemTime(void); -void ExQueryDepthSListHead(void); -void ExQueueWorkItem(void); -void ExRaiseStatus(void); -void ExReinitializeResourceLite(void); -void ExReleaseFastMutex(void); -void ExReleaseFastMutexUnsafe(void); -void ExReleaseResource(void); -void ExReleaseResourceForThread(void); -void ExReleaseResourceForThreadLite(void); -void ExSystemTimeToLocalTime(void); -void ExTryToAcquireFastMutex(void); -void ExTryToAcquireResourceExclusiveLite(void); -void InterlockedCompareExchange(void); -void InterlockedExchange(void); -void InterlockedExchangeAdd(void); -void InterlockedIncrement(void); -void HalAllocateCommonBuffer(void); -void HalAssignSlotResources(void); -void HalExamineMBR(void); -void HalFreeCommonBuffer(void); -void HalGetAdapter(void); -void HalGetBusData(void); -void HalGetBusDataByOffset(void); -void HalGetDmaAlignmentRequirement(void); -void HalGetInterruptVector(void); -void HalQuerySystemInformation(void); -void HalReadDmaCounter(void); -void HalSetBusData(void); -void HalSetBusDataByOffset(void); -void HalTranslateBusAddress(void); -void IoAcquireCancelSpinLock(void); -void IoAllocateAdapterChannel(void); -void IoAllocateController(void); -void IoAllocateErrorLogEntry(void); -void IoAllocateIrp(void); -void IoAllocateMdl(void); -void IoAssignArcName(void); -void IoAssignResources(void); -void IoAttachDevice(void); -void IoAttachDeviceByPointer(void); -void IoAttachDeviceToDeviceStack(void); -void IoBuildAsynchronousFsdRequest(void); -void IoBuildDeviceIoControlRequest(void); -void IoBuildPartialMdl(void); -void IoBuildSynchronousFsdRequest(void); -void IoCallDriver(void); -void IoCancelIrp(void); -void IoCheckShareAccess(void); -void IoCompleteRequest(void); -void IoConnectInterrupt(void); -void IoCreateController(void); -void IoCreateDevice(void); -void IoCreateNotificationEvent(void); -void IoCreateSymbolicLink(void); -void IoCreateSynchronizationEvent(void); -void IoCreateUnprotectedSymbolicLink(void); -void IoDeassignArcName(void); -void IoDeleteController(void); -void IoDeleteDevice(void); -void IoDeleteSymbolicLink(void); -void IoDetachDevice(void); -void IoDisconnectInterrupt(void); -void IoFlushAdapterBuffers(void); -void IoFreeAdapterChannel(void); -void IoFreeController(void); -void IoFreeIrp(void); -void IoFreeMapRegisters(void); -void IoFreeMdl(void); -void IoGetConfigurationInformation(void); -void IoGetCurrentIrpStackLocation(void); -void IoGetCurrentProcess(void); -void IoGetDeviceObjectPointer(void); -void IoGetDeviceToVerify(void); -void IoGetFileObjectGenericMapping(void); -void IoGetFunctionCodeFromCtlCode(void); -void IoGetInitialStack(void); -void IoGetNextIrpStackLocation(void); -void IoGetRelatedDeviceObject(void); -void IoInitializeDpcRequest(void); -void IoInitializeIrp(void); -void IoInitializeTimer(void); -void IoIsErrorUserInduced(void); -void IoIsTotalDeviceFailure(void); -void IoMakeAssociatedIrp(void); -void IoMapTransfer(void); -void IoMarkIrpPending(void); -void IoQueryDeviceDescription(void); -void IoRaiseHardError(void); -void IoRaiseInformationalHardError(void); -void IoReadPartitionTable(void); -void IoRegisterDriverReinitialization(void); -void IoRegisterFileSystem(void); -void IoRegisterShutdownNotification(void); -void IoReleaseCancelSpinLock(void); -void IoRemoveShareAccess(void); -void IoReportResourceUsage(void); -void IoRequestDpc(void); -void IoSetCancelRoutine(void); -void IoSetCompletionRoutine(void); -void IoSetHardErrorOrVerifyDevice(void); -void IoSetNextIrpStackLocation(void); -void IoSetPartitionInformation(void); -void IoSetShareAccess(void); -void IoSizeOfIrp(void); -void IoStartNextPacket(void); -void IoStartNextPacketByKey(void); -void IoStartPacket(void); -void IoStartTimer(void); -void IoStopTimer(void); -void IoUnregisterShutdownNotification(void); -void IoUpdateShareAccess(void); -void IoWriteErrorLogEntry(void); -void IoWritePartitionTable(void); -void KeAcquireSpinLock(void); -void KeAcquireSpinLockAtDpcLevel(void); -void KeBugCheck(void); -void KeBugCheckEx(void); -void KeCancelTimer(void); -void KeClearEvent(void); -void KeDelayExecutionThread(void); -void KeDeregisterBugCheckCallback(void); -void KeEnterCriticalRegion(void); -void KeFlushIoBuffers(void); -void KeGetCurrentIrql(void); -void KeGetCurrentProcessorNumber(void); -void KeGetDcacheFillSize(void); -void KeInitializeCallbackRecord(void); -void KeInitializeDeviceQueue(void); -void KeInitializeDpc(void); -void KeInitializeEvent(void); -void KeInitializeMutex(void); -void KeInitializeSemaphore(void); -void KeInitializeSpinLock(void); -void KeInitializeTimer(void); -void KeInitializeTimerEx(void); -void KeInsertByKeyDeviceQueue(void); -void KeInsertDeviceQueue(void); -void KeInsertQueueDpc(void); -void KeLeaveCriticalRegion(void); -void KeLowerIrql(void); -void KeQueryPerformanceCounter(void); -void KeQuerySystemTime(void); -void KeQueryTickCount(void); -void KeQueryTimeIncrement(void); -void KeRaiseIrql(void); -void KeReadStateEvent(void); -void KeReadStateMutex(void); -void KeReadStateSemaphore(void); -void KeReadStateTimer(void); -void KeRegisterBugCheckCallback(void); -void KeReleaseMutex(void); -void KeReleaseSemaphore(void); -void KeReleaseSpinLock(void); -void KeReleaseSpinLockFromDpcLevel(void); -void KeRemoveByKeyDeviceQueue(void); -void KeRemoveDeviceQueue(void); -void KeRemoveQueueDpc(void); -void KeResetEvent(void); -void KeSetBasePriorityThread(void); -void KeSetEvent(void); -void KeSetPriorityThread(void); -void KeSetTimer(void); -void KeSetTimerEx(void); -void KeStallExecutionProcessor(void); -void KeSynchronizeExecution(void); -void KeWaitForMultipleObjects(void); -void KeWaitForMutexObject(void); -void KeWaitForSingleObject(void); -void MmAllocateContiguousMemory(void); -void MmAllocateNonCachedMemory(void); -void MmBuildMdlForNonPagedPool(void); -void MmCreateMdl(void); -void MmFreeContiguousMemory(void); -void MmFreeNonCachedMemory(void); -void MmGetMdlByteCount(void); -void MmGetMdlByteOffset(void); -void MmGetMdlVirtualAddress(void); -void MmGetPhysicalAddress(void); -void MmGetSystemAddressForMdl(void); -void MmInitializeMdl(void); -void MmIsAddressValid(void); -void MmIsNonPagedSystemAddressValid(void); -void MmIsThisAnNtAsSystem(void); -void MmLockPagableCodeSection(void); -void MmLockPagableDataSection(void); -void MmLockPagableSectionByHandle(void); -void MmMapIoSpace(void); -void MmMapLockedPages(void); -void MmPageEntireDriver(void); -void MmResetDriverPaging(void); -void MmPrepareMdlForReuse(void); -void MmProbeAndLockPages(void); -void MmQuerySystemSize(void); -void MmSizeOfMdl(void); -void MmUnlockPages(void); -void MmUnlockPagableImageSection(void); -void MmUnmapIoSpace(void); -void MmUnmapLockedPages(void); -void ObDereferenceObject(void); -void ObReferenceObjectByHandle(void); -void ObReferenceObjectByPointer(void); -void PsCreateSystemThread(void); -void PsGetCurrentProcess(void); -void PsGetCurrentThread(void); -void PsTerminateSystemThread(void); -void InitializeListHead(void); -void InitializeObjectAttributes(void); -void InsertHeadList(void); -void InsertTailList(void); -void PopEntryList(void); -void PushEntryList(void); -void RemoveEntryList(void); -void RemoveHeadList(void); -void RemoveTailList(void); -void RtlAnsiStringToUnicodeSize(void); -void RtlAnsiStringToUnicodeString(void); -void RtlAppendUnicodeStringToString(void); -void RtlAppendUnicodeToString(void); -void RtlCharToInteger(void); -void RtlCheckRegistryKey(void); -void RtlCompareMemory(void); -void RtlCompareString(void); -void RtlCompareUnicodeString(void); -void RtlConvertLongToLargeInteger(void); -void RtlConvertUlongToLargeInteger(void); -void RtlCopyBytes(void); -void RtlCopyMemory(void); -void RtlCopyString(void); -void RtlCopyUnicodeString(void); -void RtlCreateRegistryKey(void); -void RtlCreateSecurityDescriptor(void); -void RtlDeleteRegistryValue(void); -void RtlEnlargedIntegerMultiply(void); -void RtlEnlargedUnsignedDivide(void); -void RtlEnlargedUnsignedMultiply(void); -void RtlEqualString(void); -void RtlEqualUnicodeString(void); -void RtlExtendedIntegerMultiply(void); -void RtlExtendedLargeIntegerDivide(void); -void RtlExtendedMagicDivide(void); -void RtlFillMemory(void); -void RtlFreeAnsiString(void); -void RtlFreeUnicodeString(void); -void RtlInitAnsiString(void); -void RtlInitString(void); -void RtlInitUnicodeString(void); -void RtlIntegerToUnicodeString(void); -void RtlLargeIntegerAdd(void); -void RtlLargeIntegerAnd(void); -void RtlLargeIntegerArithmeticShift(void); -void RtlLargeIntegerDivide(void); -void RtlLargeIntegerEqualTo(void); -void RtlLargeIntegerEqualToZero(void); -void RtlLargeIntegerGreaterThan(void); -void RtlLargeIntegerGreaterThanOrEqualTo(void); -void RtlLargeIntegerGreaterThanOrEqualToZero(void); -void RtlLargeIntegerGreaterThanZero(void); -void RtlLargeIntegerLessThan(void); -void RtlLargeIntegerLessThanOrEqualTo(void); -void RtlLargeIntegerLessThanZero(void); -void RtlLargeIntegerNegate(void); -void RtlLargeIntegerNotEqualTo(void); -void RtlLargeIntegerShiftLeft(void); -void RtlLargeIntegerShiftRight(void); -void RtlLargeIntegerSubtract(void); -void RtlLengthSecurityDescriptor(void); -void RtlMoveMemory(void); -void RtlQueryRegistryValues(void); -void RtlRetrieveUlong(void); -void RtlRetrieveUshort(void); -void RtlSetDaclSecurityDescriptor(void); -void RtlStoreUlong(void); -void RtlStoreUshort(void); -void RtlTimeFieldsToTime(void); -void RtlTimeToTimeFields(void); -void RtlUnicodeStringToAnsiString(void); -void RtlUnicodeStringToInteger(void); -void RtlUpcaseUnicodeString(void); -void RtlUpperString(void); -void RtlValidSecurityDescriptor(void); -void RtlWriteRegistryValue(void); -void RtlZeroMemory(void); -void SeAccessCheck(void); -void SeAssignSecurity(void); -void SeDeassignSecurity(void); -void SeSinglePrivilegeCheck(void); -void ZwClose(void); -void ZwCreateDirectoryObject(void); -void ZwCreateFile(void); -void ZwCreateKey(void); -void ZwDeleteKey(void); -void ZwEnumerateKey(void); -void ZwEnumerateValueKey(void); -void ZwFlushKey(void); -void ZwMakeTemporaryObject(void); -void ZwMapViewOfSection(void); -void ZwOpenFile(void); -void ZwOpenKey(void); -void ZwOpenSection(void); -void ZwQueryInformationFile(void); -void ZwQueryKey(void); -void ZwQueryValueKey(void); -void ZwReadFile(void); -void ZwSetInformationFile(void); -void ZwSetInformationThread(void); -void ZwSetValueKey(void); -void ZwUnmapViewOfSection(void); -void ZwWriteFile(void); -void sprintf(void); -void wcschr(void); #ifdef __cplusplus } #endif @@ -752,5 +388,12 @@ export symbol_table[]={ {"_ZwWriteFile",(unsigned int)ZwWriteFile}, {"_sprintf",(unsigned int)sprintf}, {"_wcschr",(unsigned int)wcschr}, +{"_wcsncat",(unsigned int)wcsncat}, +{"_wcsncpy",(unsigned int)wcsncpy}, +{"_wtolower",(unsigned int)wtolower}, +{"_wtoupper",(unsigned int)wtoupper}, +{"_CbInitDccb",(unsigned int)CbInitDccb}, +{"_CbAcquireForRead",(unsigned int)CbAcquireForRead}, +{"_CbReleaseFromRead",(unsigned int)CbReleaseFromRead}, {NULL,NULL}, }; diff --git a/reactos/ntoskrnl/ke/kernel.c b/reactos/ntoskrnl/ke/kernel.c index ab891966b65..360b2a17507 100644 --- a/reactos/ntoskrnl/ke/kernel.c +++ b/reactos/ntoskrnl/ke/kernel.c @@ -17,7 +17,7 @@ /* FUNCTIONS *****************************************************************/ -VOID KeInit() +VOID KeInit(VOID) { KeInitDpc(); KeInitializeBugCheck(); diff --git a/reactos/ntoskrnl/ke/sem.c b/reactos/ntoskrnl/ke/sem.c index 902a58a90e9..1ab00f6c9d7 100644 --- a/reactos/ntoskrnl/ke/sem.c +++ b/reactos/ntoskrnl/ke/sem.c @@ -37,5 +37,6 @@ LONG KeReleaseSemaphore(PKSEMAPHORE Semaphore, LONG Adjustment, BOOLEAN Wait) { + UNIMPLEMENTED; } diff --git a/reactos/ntoskrnl/ke/timer.c b/reactos/ntoskrnl/ke/timer.c index 56464a35282..930f527e927 100644 --- a/reactos/ntoskrnl/ke/timer.c +++ b/reactos/ntoskrnl/ke/timer.c @@ -53,12 +53,12 @@ static LIST_ENTRY timer_list_head = {NULL,NULL}; static KSPIN_LOCK timer_list_lock = {0,}; -#define MICROSECONDS_TO_CALIBRATE (1000000) -#define MICROSECONDS_PER_TICK (54945) -#define MICROSECONDS_IN_A_SECOND (10000000) -#define TICKS_PER_SECOND_APPROX (18) -static unsigned int loops_per_microsecond = 17; +#define MICROSECONDS_PER_TICK (54945) +#define TICKS_TO_CALIBRATE (1) +#define CALIBRATE_PERIOD (MICROSECONDS_PER_TICK * TICKS_TO_CALIBRATE) + +static unsigned int loops_per_microsecond = 100; /* FUNCTIONS **************************************************************/ @@ -68,44 +68,100 @@ void KeCalibrateTimerLoop() unsigned int end_tick; unsigned int nr_ticks; unsigned int i; + unsigned int microseconds; - return; - - for (i=0;i<5;i++) + for (i=0;i<20;i++) { start_tick = ticks; - 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) @@ -211,6 +267,15 @@ VOID KeQuerySystemTime(PLARGE_INTEGER CurrentTime) ULLToLargeInteger(system_time,CurrentTime); } +NTSTATUS STDCALL NtGetTickCount(PULONG UpTime) +{ + return(ZwGetTickCount(UpTime)); +} + +NTSTATUS STDCALL ZwGetTickCount(PULONG UpTime) +{ + UNIMPLEMENTED; +} BOOLEAN KeSetTimer(PKTIMER Timer, LARGE_INTEGER DueTime, PKDPC Dpc) /* diff --git a/reactos/ntoskrnl/ke/wait.c b/reactos/ntoskrnl/ke/wait.c index dcc57af989b..5353cf778c8 100644 --- a/reactos/ntoskrnl/ke/wait.c +++ b/reactos/ntoskrnl/ke/wait.c @@ -80,7 +80,7 @@ VOID KeDispatcherObjectWakeAll(DISPATCHER_HEADER* hdr) current = CONTAINING_RECORD(current_entry,KWAIT_BLOCK, WaitListEntry); DPRINT("Waking %x\n",current->Thread); - PsWakeThread((PETHREAD)current->Thread); + PsResumeThread(CONTAINING_RECORD(current->Thread,ETHREAD,Tcb)); }; } @@ -101,7 +101,7 @@ BOOLEAN KeDispatcherObjectWakeOne(DISPATCHER_HEADER* hdr) WaitListEntry); DPRINT("current_entry %x current %x\n",current_entry,current); DPRINT("Waking %x\n",current->Thread); - PsWakeThread((PETHREAD)current->Thread); + PsResumeThread(CONTAINING_RECORD(current->Thread,ETHREAD,Tcb)); return(TRUE); } @@ -146,7 +146,6 @@ NTSTATUS KeWaitForSingleObject(PVOID Object, { DISPATCHER_HEADER* hdr = (DISPATCHER_HEADER *)Object; KWAIT_BLOCK blk; - KIRQL oldlvl; DPRINT("Entering KeWaitForSingleObject(Object %x)\n",Object); @@ -154,9 +153,12 @@ NTSTATUS KeWaitForSingleObject(PVOID 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) @@ -173,7 +175,7 @@ NTSTATUS KeWaitForSingleObject(PVOID Object, // DPRINT("hdr->WaitListHead.Flink %x hdr->WaitListHead.Blink %x\n", // hdr->WaitListHead.Flink,hdr->WaitListHead.Blink); KeReleaseDispatcherDatabaseLock(FALSE); - PsSuspendThread(); + PsSuspendThread(PsGetCurrentThread()); return(STATUS_SUCCESS); } @@ -193,3 +195,63 @@ VOID KeInitializeDispatcher(VOID) { KeInitializeSpinLock(&DispatcherDatabaseLock); } + +NTSTATUS STDCALL NtWaitForMultipleObjects (IN ULONG Count, + IN PHANDLE Object[], + IN CINT WaitType, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Time) +{ + return(ZwWaitForMultipleObjects(Count, + Object, + WaitType, + Alertable, + Time)); +} + +NTSTATUS STDCALL ZwWaitForMultipleObjects (IN ULONG Count, + IN PHANDLE Object[], + IN CINT WaitType, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Time) +{ + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtWaitForSingleObject (IN PHANDLE Object, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Time) +{ + return(ZwWaitForSingleObject(Object, + Alertable, + Time)); +} + +NTSTATUS STDCALL ZwWaitForSingleObject (IN PHANDLE Object, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Time) +{ + UNIMPLEMENTED; +} + + +NTSTATUS STDCALL NtSignalAndWaitForSingleObject( + IN HANDLE EventHandle, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Time, + PULONG NumberOfWaitingThreads OPTIONAL) +{ + return(ZwSignalAndWaitForSingleObject(EventHandle, + Alertable, + Time, + NumberOfWaitingThreads)); +} + +NTSTATUS STDCALL ZwSignalAndWaitForSingleObject( + IN HANDLE EventHandle, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Time, + PULONG NumberOfWaitingThreads OPTIONAL) +{ + UNIMPLEMENTED; +} diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index f5249015f0e..db5a7bc3880 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -20,7 +20,7 @@ /* INCLUDES ****************************************************************/ #include -#include +#include #include #include #include @@ -166,7 +166,7 @@ unsigned int get_free_page(void) unsigned int eflags; __asm__("pushf\n\tpop %0\n\tcli\n\t" : "=d" (eflags)); - CHECKPOINT; + /* * If we are totally out of memory then panic */ @@ -175,9 +175,9 @@ unsigned int get_free_page(void) printk("CRITICAL: Unable to allocate page\n"); KeBugCheck(KBUG_OUT_OF_MEMORY); } - CHECKPOINT; + addr = 0; - CHECKPOINT; + if (free_page_list_head->nr_pages>1) { free_page_list_head->nr_pages--; @@ -189,14 +189,14 @@ unsigned int get_free_page(void) addr = (unsigned int)free_page_list_head; free_page_list_head = free_page_list_head -> next; } - CHECKPOINT; + __asm__("push %0\n\tpopf\n\t" : : "d" (eflags)); addr = addr - (IDMAP_BASE); DPRINT("allocated %x\n",addr); - CHECKPOINT; + return(addr); } diff --git a/reactos/ntoskrnl/mm/mm.c b/reactos/ntoskrnl/mm/mm.c index 76ef94b9d13..51985524987 100644 --- a/reactos/ntoskrnl/mm/mm.c +++ b/reactos/ntoskrnl/mm/mm.c @@ -17,7 +17,7 @@ #include #include -#include +#include #define NDEBUG #include @@ -115,6 +115,7 @@ void MmInitalize(boot_param* bp) { set_page(i,0,0); } + set_page(0,0,0); FLUSH_TLB; CHECKPOINT; /* @@ -122,51 +123,3 @@ void MmInitalize(boot_param* bp) */ VirtualInit(bp); } - - - -#if 0 -void* MmMapIoSpace(unsigned int physical_address, unsigned int size, - unsigned int cachable) -/* - * FUNCTION: Make a portion of io space accessible to a device driver - */ -{ - /* - * Determine here if the mapping is legel - */ - - /* - * Find an address to place the mapping - */ - memory_area_desc* current = memory_area_list_head; - memory_area_desc* new_area=ExAllocateMemory(sizeof(memory_area_desc)); - size = PAGE_ROUND_UP(size); - - while (current!=NULL) - { - if ( current->next==NULL || - (current->next->base - (current->base+current->length)) - >= size) - { - new_area->base=current->base+current->length; - new_area->length=size; - new_area->next=current->next; - current->next=new_area; - } - current=current->next; - } - - /* - * Map the desired physical memory - */ - for (int i=0;ibase+i, - PA_READ | PA_WRITE | PA_EXECUTE | PA_SYSTEM, - physical_address+i); - } - - return((void *)new_area->base); -} -#endif diff --git a/reactos/ntoskrnl/mm/pageflt.asm b/reactos/ntoskrnl/mm/pageflt.asm index d4192d8d1e8..258ff1fc0c9 100644 --- a/reactos/ntoskrnl/mm/pageflt.asm +++ b/reactos/ntoskrnl/mm/pageflt.asm @@ -1,24 +1,37 @@ %include 'internal/hal/segment.inc' + +%define PREFIX(a) _(a) + BITS 32 -GLOBAL _exception_handler14 -EXTERN _exception_handler -EXTERN _page_fault_handler +extern PREFIX(page_fault_handler) +extern PREFIX exception_handler segment .text -_exception_handler14: +DECLARE_GLOBAL_SYMBOL exception_handler14 cli + push gs + push fs + push es push ds push dword 14 pushad mov ax,KERNEL_DS mov ds,ax + mov es,ax + mov fs,ax + mov gs,ax call _page_fault_handler cmp eax,0 jne _ret_from_exp call _exception_handler _ret_from_exp: popad - add esp,12 + add esp,4 + pop ds + pop es + pop fs + pop gs + add esp,4 iretd diff --git a/reactos/ntoskrnl/mm/pool.c b/reactos/ntoskrnl/mm/pool.c index a9ac669e848..bbfc0624c60 100644 --- a/reactos/ntoskrnl/mm/pool.c +++ b/reactos/ntoskrnl/mm/pool.c @@ -4,539 +4,57 @@ * FILE: ntoskrnl/mm/pool.c * PURPOSE: Implements the kernel memory pool * PROGRAMMER: David Welch (welch@mcmail.com) - * UPDATE HISTORY: - * 27/05/98: Created - * 10/06/98: Bug fixes by Iwan Fatahi (i_fatahi@hotmail.com) - * in take_block (if current bigger than required) - * in remove_from_used_list - * in ExFreePool - * 23/08/98: Fixes from Robert Bergkvist (fragdance@hotmail.com) */ /* INCLUDES ****************************************************************/ -#include -#include -#include -#include -#include -#include #include - -#define NDEBUG -#include - #include +#include -/* 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 /* GLOBALS *****************************************************************/ -/* - * Memory managment initalized symbol for the base of the pool - */ -unsigned int kernel_pool_base = 0; - -/* - * Pointer to the first block in the free list - */ -static block_hdr* free_list_head = NULL; -static block_hdr* used_list_head = NULL; -static unsigned int nr_free_blocks = 0; -static unsigned int nr_used_blocks = 0; - -#define ALLOC_MAP_SIZE (NONPAGED_POOL_SIZE / PAGESIZE) - -/* - * One bit for each page in the kmalloc region - * If set then the page is used by a kmalloc block - */ -static unsigned int alloc_map[ALLOC_MAP_SIZE/32]={0,}; +#define TAG_NONE (ULONG)(('N'<<0) + ('o'<<8) + ('n'<<16) + ('e'<<24)) /* FUNCTIONS ***************************************************************/ -VOID ExInitNonPagedPool(ULONG BaseAddress) -{ - kernel_pool_base=BaseAddress; -} - -static void validate_free_list(void) +PVOID ExAllocatePool(POOL_TYPE PoolType, ULONG NumberOfBytes) /* - * FUNCTION: Validate the integrity of the list of free blocks - */ -{ - block_hdr* current=free_list_head; - unsigned int blocks_seen=0; - - while (current!=NULL) - { - unsigned int base_addr = (int)current; - if (base_addr < (kernel_pool_base) || - (base_addr+current->size) > - (kernel_pool_base)+NONPAGED_POOL_SIZE) - { - printk("Block %x found outside pool area\n",current); - printk("Size %d\n",current->size); - printk("Limits are %x %x\n",kernel_pool_base, - kernel_pool_base+NONPAGED_POOL_SIZE); - KeBugCheck(KBUG_POOL_FREE_LIST_CORRUPT); - } - blocks_seen++; - if (blocks_seen > nr_free_blocks) - { - printk("Too many blocks on list\n"); - KeBugCheck(KBUG_POOL_FREE_LIST_CORRUPT); - } -// verify_for_write(base_addr,current->size); - if (current->next!=NULL&¤t->next->previous!=current) - { - printk("%s:%d:Break in list (current %x next %x " - "current->next->previous %x)\n", - __FILE__,__LINE__,current,current->next, - current->next->previous); - KeBugCheck(KBUG_POOL_FREE_LIST_CORRUPT); - } - current=current->next; - } -} - -static void validate_used_list(void) -/* - * FUNCTION: Validate the integrity of the list of used blocks - */ -{ - block_hdr* current=used_list_head; - unsigned int blocks_seen=0; - - while (current!=NULL) - { - unsigned int base_addr = (int)current; - if (base_addr < (kernel_pool_base) || - (base_addr+current->size) > - (kernel_pool_base)+NONPAGED_POOL_SIZE) - { - printk("Block %x found outside pool area\n",current); - for(;;); - } - blocks_seen++; - if (blocks_seen > nr_used_blocks) - { - printk("Too many blocks on list\n"); - for(;;); - } -// verify_for_write(base_addr,current->size); - if (current->next!=NULL&¤t->next->previous!=current) - { - printk("Break in list (current %x next %x)\n", - current,current->next); - for(;;); - } - current=current->next; - } - -} - -static void check_duplicates(block_hdr* blk) -/* - * FUNCTION: Check a block has no duplicates + * FUNCTION: Allocates pool memory of a specified type and returns a pointer + * to the allocated block. This routine is used for general purpose allocation + * of memory * ARGUMENTS: - * blk = block to check - * NOTE: Bug checks if duplicates are found + * PoolType + * Specifies the type of memory to allocate which can be one + * of the following: + * + * NonPagedPool + * NonPagedPoolMustSucceed + * NonPagedPoolCacheAligned + * NonPagedPoolCacheAlignedMustS + * PagedPool + * PagedPoolCacheAligned + * + * NumberOfBytes + * Specifies the number of bytes to allocate + * RETURNS: The allocated block on success + * NULL on failure */ { - unsigned int base = (int)blk; - unsigned int last = ((int)blk) + +sizeof(block_hdr) + blk->size; - - block_hdr* current=free_list_head; - while (current!=NULL) - { - if ( (int)current > base && (int)current < last ) - { - printk("intersecting blocks on list\n"); - for(;;); - } - if ( (int)current < base && - ((int)current + current->size + sizeof(block_hdr)) - > base ) - { - printk("intersecting blocks on list\n"); - for(;;); - } - current=current->next; - } - current=used_list_head; - while (current!=NULL) - { - if ( (int)current > base && (int)current < last ) - { - printk("intersecting blocks on list\n"); - for(;;); - } - if ( (int)current < base && - ((int)current + current->size + sizeof(block_hdr)) - > base ) - { - printk("intersecting blocks on list\n"); - for(;;); - } - current=current->next; - } - + return(ExAllocatePoolWithTag(PoolType,NumberOfBytes,TAG_NONE)); } -static void validate_kernel_pool(void) -/* - * FUNCTION: Checks the integrity of the kernel memory heap - */ -{ - block_hdr* current=NULL; - - validate_free_list(); - validate_used_list(); - - current=free_list_head; - while (current!=NULL) - { - check_duplicates(current); - current=current->next; - } - current=used_list_head; - while (current!=NULL) - { - check_duplicates(current); - current=current->next; - } -} - -static void add_to_free_list(block_hdr* blk) -/* - * FUNCTION: add the block to the free list (internal) - */ -{ - blk->next=free_list_head; - blk->previous=NULL; - if (free_list_head!=NULL) - { - free_list_head->previous=blk; - } - free_list_head=blk; - nr_free_blocks++; -} - -static void add_to_used_list(block_hdr* blk) -/* - * FUNCTION: add the block to the used list (internal) - */ -{ - blk->next=used_list_head; - blk->previous=NULL; - if (used_list_head!=NULL) - { - used_list_head->previous=blk; - } - used_list_head=blk; - nr_used_blocks++; -} - - -static void remove_from_free_list(block_hdr* current) -{ - if (current->next==NULL&¤t->previous==NULL) - { - free_list_head=NULL; - } - else - { - if (current->next==NULL) - { - current->previous->next=NULL; - } - else if (current->previous==NULL) - { - current->next->previous=NULL; - free_list_head=current->next; - } - else - { - current->next->previous=current->previous; - current->previous->next=current->next; - } - } - nr_free_blocks--; -} - -#ifdef BROKEN_VERSION_OF_REMOVE_FROM_FREE_LIST -static void remove_from_free_list(block_hdr* current) -{ - if (current->next==NULL&¤t->previous==NULL) - { - free_list_head=NULL; - } - else - { - if (current->next==NULL) - { - current->previous->next=NULL; - } - else - { - current->previous->next=current->next; - } - if (current->previous==NULL) - { - current->next->previous=NULL; - } - else - { - current->next->previous=current->previous; - } - } - nr_free_blocks--; -} -#endif - -static void remove_from_used_list(block_hdr* current) -{ - if (current->next==NULL&¤t->previous==NULL) - { - used_list_head=NULL; - } - else - { - if (current->previous==NULL) - { - current->next->previous=NULL; - used_list_head=current->next; - } - else - { - current->previous->next=current->next; - } - if (current->next!=NULL) - { - current->next->previous=current->previous; - } - else - { - current->previous->next=NULL; - } - } - nr_used_blocks--; -} - - -inline static void* block_to_address(block_hdr* blk) -/* - * FUNCTION: Translate a block header address to the corresponding block - * address (internal) - */ -{ - return ( (void *) ((int)blk + sizeof(block_hdr)) ); -} - -inline static block_hdr* address_to_block(void* addr) -{ - return (block_hdr *) - ( ((int)addr) - sizeof(block_hdr) ); -} - -static unsigned int alloc_pool_region(unsigned int nr_pages) -/* - * FUNCTION: Allocates a region of pages within the nonpaged pool area - */ -{ - unsigned int start = 0; - unsigned int length = 0; - unsigned int i,j; - - DPRINT("alloc_pool_region(nr_pages = %d)\n",nr_pages); - - for (i=1; i(2*sizeof(block_hdr))) - { - used_blk = (struct _block_hdr *)start; - DPRINT("Creating block at %x\n",start); - used_blk->size = size; - add_to_used_list(used_blk); - - free_blk = (block_hdr *)(start + sizeof(block_hdr) + size); - DPRINT("Creating block at %x\n",free_blk); - free_blk->size = (nr_pages * PAGESIZE) -((sizeof(block_hdr)*2) + size); - add_to_free_list(free_blk); - } - else - { - used_blk = (struct _block_hdr *)start; - used_blk->size = nr_pages * PAGESIZE; - add_to_used_list(used_blk); - } - - validate_kernel_pool(); - return(used_blk); -} - -static void* take_block(block_hdr* current, unsigned int size) -/* - * FUNCTION: Allocate a used block of least 'size' from the specified - * free block - * RETURNS: The address of the created memory block - */ -{ - /* - * If the block is much bigger than required then split it and - * return a pointer to the allocated section. If the difference - * between the sizes is marginal it makes no sense to have the - * extra overhead - */ - if (current->size > (1 + size + sizeof(block_hdr))) - { - /* - * Replace the bigger block with a smaller block in the - * same position in the list - */ - block_hdr* free_blk = (block_hdr *)(((int)current) - + sizeof(block_hdr) + size); - free_blk->next = current->next; - free_blk->previous = current->previous; - if (current->next) - { - current->next->previous = free_blk; - } - if (current->previous) - { - current->previous->next = free_blk; - } - free_blk->size = current->size - (sizeof(block_hdr) + size); - if (current==free_list_head) - { - free_list_head=free_blk; - } - - current->size=size; - add_to_used_list(current); - - validate_kernel_pool(); - return(block_to_address(current)); - } - - /* - * Otherwise allocate the whole block - */ - remove_from_free_list(current); - add_to_used_list(current); - - validate_kernel_pool(); - return(block_to_address(current)); -} - -asmlinkage VOID ExFreePool(PVOID block) -/* - * FUNCTION: Releases previously allocated memory - * ARGUMENTS: - * block = block to free - */ -{ - block_hdr* blk=address_to_block(block); - DPRINT("(%s:%d) freeing block %x\n",__FILE__,__LINE__,blk); - - validate_kernel_pool(); - /* - * Please don't change the order - */ - remove_from_used_list(blk); - add_to_free_list(blk); - - validate_kernel_pool(); -} - -#define CACHE_ALIGNMENT (16) - -PVOID ExAllocatePool(ULONG type, ULONG size) -/* - * FUNCTION: Allocates memory from the pool - * ARGUMENTS: - * size = minimum size of the block to be allocated - * type = the type of memory to use for the block - * RETURNS: - * the address of the block if it succeeds - */ +PVOID ExAllocatePoolWithTag(ULONG type, ULONG size, ULONG Tag) { PVOID Block; if (type == NonPagedPoolCacheAligned || type == NonPagedPoolCacheAlignedMustS) { - size = size + CACHE_ALIGNMENT; + UNIMPLEMENTED; } switch(type) @@ -545,12 +63,12 @@ PVOID ExAllocatePool(ULONG type, ULONG size) case NonPagedPoolMustSucceed: case NonPagedPoolCacheAligned: case NonPagedPoolCacheAlignedMustS: - Block = ExAllocateNonPagedPool(type,size); + Block = ExAllocateNonPagedPoolWithTag(type,size,Tag); break; case PagedPool: case PagedPoolCacheAligned: - Block = ExAllocatePagedPool(type,size); + Block = ExAllocatePagedPoolWithTag(type,size,Tag); break; default: @@ -562,68 +80,16 @@ PVOID ExAllocatePool(ULONG type, ULONG size) { KeBugCheck(MUST_SUCCEED_POOL_EMPTY); } - if (type == NonPagedPoolCacheAligned || - type == NonPagedPoolCacheAlignedMustS) - { - Block = Block + CACHE_ALIGNMENT - (((int)Block)%CACHE_ALIGNMENT); - } return(Block); } -static PVOID ExAllocatePagedPool(ULONG type, ULONG size) -{ - UNIMPLEMENTED; -} - -static PVOID ExAllocateNonPagedPool(ULONG type, ULONG size) -{ - block_hdr* current=NULL; - void* block; - - DPRINT("kmalloc(size %d)\n",size); - validate_kernel_pool(); - - /* - * accomodate this useful idiom - */ - if (size==0) - { - return(NULL); - } - - /* - * Look for an already created block of sufficent size - */ - current=free_list_head; - - while (current!=NULL) - { - DPRINT("current %x size %x next %x\n",current,current->size, - current->next); - if (current->size>=size) - { - DPRINT("found block %x of size %d\n",current,size); - block=take_block(current,size); - memset(block,0,size); - return(block); - } - current=current->next; - } - - /* - * Otherwise create a new block - */ - block=block_to_address(grow_kernel_pool(size)); - memset(block,0,size); - return(block); -} - -PVOID ExAllocatePoolWithQuota(POOL_TYPE PoolType, ULONG NumberOfBytes) +PVOID ExAllocatePoolWithQuotaTag(POOL_TYPE PoolType, ULONG NumberOfBytes, + ULONG Tag) { PVOID Block; PKTHREAD current = KeGetCurrentThread(); - Block = ExAllocatePool(PoolType,NumberOfBytes); + Block = ExAllocatePoolWithTag(PoolType,NumberOfBytes,Tag); switch(PoolType) { case NonPagedPool: @@ -641,29 +107,8 @@ PVOID ExAllocatePoolWithQuota(POOL_TYPE PoolType, ULONG NumberOfBytes) return(Block); } -PVOID ExAllocatePoolWithQuotaTag(POOL_TYPE PoolType, ULONG NumberOfBytes, - ULONG Tag) +PVOID ExAllocatePoolWithQuota(POOL_TYPE PoolType, ULONG NumberOfBytes) { - PVOID Block; - Block=ExAllocatePoolWithQuota(PoolType,NumberOfBytes+sizeof(ULONG)); - ((ULONG *)Block)[0]=Tag; - return(Block+4); + return(ExAllocatePoolWithQuotaTag(PoolType,NumberOfBytes,TAG_NONE)); } -PVOID ExAllocatePoolWithTag(POOL_TYPE PoolType, ULONG NumberOfBytes, - ULONG Tag) -/* - * FUNCTION: Allocates pool memory and inserts a caller supplied tag before - * the block allocated - * ARGUMENTS: - * PoolType = Type of memory to allocate - * NumberOfBytes = Number of bytes to allocate - * Tag = Tag - * RETURNS: The address of the block allocated - */ -{ - PVOID Block; - Block=ExAllocatePool(PoolType,NumberOfBytes+sizeof(ULONG)); - ((ULONG *)Block)[0]=Tag; - return(Block+4); -} diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index e4914c0dc6e..05d47c4b914 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -12,13 +12,65 @@ #include #include +#include +#include +#include +#define NDEBUG #include +/* 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, @@ -49,13 +101,98 @@ NTSTATUS STDCALL ZwCreateSection(OUT PHANDLE SectionHandle, * RETURNS: Status */ { + PSECTION_OBJECT Section; + NTSTATUS Status; + + DPRINT("ZwCreateSection()\n"); + + Section = ObGenericCreateObject(SectionHandle, + DesiredAccess, + ObjectAttributes, + MmSectionType); + + if (MaximumSize != NULL) + { + Section->MaximumSize = *MaximumSize; + } + else + { + Section->MaximumSize.HighPart = 0; + Section->MaximumSize.LowPart = 0xffffffff; + } + Section->SectionPageProtection = SectionPageProtection; + Status = ObReferenceObjectByHandle(FileHandle, + FILE_READ_DATA, + IoFileType, + UserMode, + (PVOID*)&Section->FileObject, + NULL); + if (Status != STATUS_SUCCESS) + { + return(Status); + } + + Section->AllocateAttributes = AllocationAttributes; + + return(STATUS_SUCCESS); +} + +NTSTATUS NtOpenSection(PHANDLE SectionHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes) +{ + return(ZwOpenSection(SectionHandle, + DesiredAccess, + ObjectAttributes)); } NTSTATUS ZwOpenSection(PHANDLE SectionHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes) { - UNIMPLEMENTED; + PVOID Object; + NTSTATUS Status; + PWSTR Ignored; + + *SectionHandle = 0; + + Status = ObOpenObjectByName(ObjectAttributes,&Object,&Ignored); + if (!NT_SUCCESS(Status)) + { + return(Status); + } + + if (BODY_TO_HEADER(Object)->ObjectType!=MmSectionType) + { + return(STATUS_UNSUCCESSFUL); + } + + *SectionHandle = ObInsertHandle(KeGetCurrentProcess(),Object, + DesiredAccess,FALSE); + return(STATUS_SUCCESS); +} + +NTSTATUS NtMapViewOfSection(HANDLE SectionHandle, + HANDLE ProcessHandle, + PVOID* BaseAddress, + ULONG ZeroBits, + ULONG CommitSize, + PLARGE_INTEGER SectionOffset, + PULONG ViewSize, + SECTION_INHERIT InheritDisposition, + ULONG AllocationType, + ULONG Protect) +{ + return(ZwMapViewOfSection(SectionHandle, + ProcessHandle, + BaseAddress, + ZeroBits, + CommitSize, + SectionOffset, + ViewSize, + InheritDisposition, + AllocationType, + Protect)); } NTSTATUS ZwMapViewOfSection(HANDLE SectionHandle, @@ -68,11 +205,146 @@ NTSTATUS ZwMapViewOfSection(HANDLE SectionHandle, SECTION_INHERIT InheritDisposition, ULONG AllocationType, ULONG Protect) +/* + * FUNCTION: Maps a view of a section into the virtual address space of a + * process + * ARGUMENTS: + * SectionHandle = Handle of the section + * ProcessHandle = Handle of the process + * BaseAddress = Desired base address (or NULL) on entry + * Actual base address of the view on exit + * ZeroBits = Number of high order address bits that must be zero + * CommitSize = Size in bytes of the initially committed section of + * the view + * SectionOffset = Offset in bytes from the beginning of the section + * to the beginning of the view + * ViewSize = Desired length of map (or zero to map all) on entry + * Actual length mapped on exit + * InheritDisposition = Specified how the view is to be shared with + * child processes + * AllocateType = Type of allocation for the pages + * Protect = Protection for the committed region of the view + * RETURNS: Status + */ { - UNIMPLEMENTED; + PSECTION_OBJECT Section; + PEPROCESS Process; + MEMORY_AREA* Result; + NTSTATUS Status; + + DPRINT("ZwMapViewOfSection(SectionHandle %x, ProcessHandle %x)\n", + SectionHandle,ProcessHandle); + + Status = ObReferenceObjectByHandle(SectionHandle, + SECTION_MAP_READ, + MmSectionType, + UserMode, + (PVOID*)&Section, + NULL); + if (Status != STATUS_SUCCESS) + { + DPRINT("%s() = %x\n",Status); + return(Status); + } + + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_OPERATION, + PsProcessType, + UserMode, + (PVOID*)&Process, + NULL); + if (Status != STATUS_SUCCESS) + { + return(Status); + } + + if ((*ViewSize) > Section->MaximumSize.LowPart) + { + (*ViewSize) = Section->MaximumSize.LowPart; + } + + MmCreateMemoryArea(UserMode, + Process, + MEMORY_AREA_SECTION_VIEW_COMMIT, + BaseAddress, + *ViewSize, + Protect, + &Result); + Result->Data.SectionData.Section = Section; + Result->Data.SectionData.ViewOffset = SectionOffset->LowPart; + + DPRINT("*BaseAddress %x\n",*BaseAddress); + DPRINT("Result->Data.SectionData.Section->FileObject %x\n", + Result->Data.SectionData.Section->FileObject); + + return(STATUS_SUCCESS); +} + +NTSTATUS NtUnmapViewOfSection(HANDLE ProcessHandle, PVOID BaseAddress) +{ + return(ZwUnmapViewOfSection(ProcessHandle,BaseAddress)); } NTSTATUS ZwUnmapViewOfSection(HANDLE ProcessHandle, PVOID BaseAddress) +{ + PEPROCESS Process; + NTSTATUS Status; + + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_OPERATION, + PsProcessType, + UserMode, + (PVOID*)&Process, + NULL); + if (Status != STATUS_SUCCESS) + { + return(Status); + } + return(MmFreeMemoryArea(Process,BaseAddress,0,TRUE)); +} + +NTSTATUS STDCALL NtQuerySection(IN HANDLE SectionHandle, + IN CINT SectionInformationClass, + OUT PVOID SectionInformation, + IN ULONG Length, + OUT PULONG ResultLength) +{ + return(ZwQuerySection(SectionHandle, + SectionInformationClass, + SectionInformation, + Length, + ResultLength)); +} + +NTSTATUS STDCALL ZwQuerySection(IN HANDLE SectionHandle, + IN CINT SectionInformationClass, + OUT PVOID SectionInformation, + IN ULONG Length, + OUT PULONG ResultLength) +/* + * FUNCTION: Queries the information of a section object. + * ARGUMENTS: + * SectionHandle = Handle to the section link object + * SectionInformationClass = Index to a certain information structure + * SectionInformation (OUT)= Caller supplies storage for resulting + * information + * Length = Size of the supplied storage + * ResultLength = Data written + * RETURNS: Status + * + */ +{ + return(STATUS_UNSUCCESSFUL); +} + +NTSTATUS STDCALL NtExtendSection(IN HANDLE SectionHandle, + IN ULONG NewMaximumSize) +{ + return(ZwExtendSection(SectionHandle,NewMaximumSize)); +} + +NTSTATUS STDCALL ZwExtendSection(IN HANDLE SectionHandle, + IN ULONG NewMaximumSize) { UNIMPLEMENTED; } diff --git a/reactos/ntoskrnl/mm/special.c b/reactos/ntoskrnl/mm/special.c index 82e2bfd86ac..a068ebebd77 100644 --- a/reactos/ntoskrnl/mm/special.c +++ b/reactos/ntoskrnl/mm/special.c @@ -30,6 +30,7 @@ PVOID MmAllocateSection(ULONG Length) Result = 0; Status = MmCreateMemoryArea(KernelMode, + PsGetCurrentProcess(), MEMORY_AREA_SYSTEM, &Result, Length, @@ -71,6 +72,7 @@ PVOID MmMapIoSpace(PHYSICAL_ADDRESS PhysicalAddress, Result=0; Status = MmCreateMemoryArea(KernelMode, + PsGetCurrentProcess(), MEMORY_AREA_IO_MAPPING, &Result, NumberOfBytes, @@ -94,7 +96,8 @@ PVOID MmMapIoSpace(PHYSICAL_ADDRESS PhysicalAddress, VOID MmUnmapIoSpace(PVOID BaseAddress, ULONG NumberOfBytes) { - (void)MmFreeMemoryArea(BaseAddress,NumberOfBytes,FALSE); + (void)MmFreeMemoryArea(PsGetCurrentProcess(),BaseAddress,NumberOfBytes, + FALSE); } PVOID MmAllocateNonCachedMemory(ULONG NumberOfBytes) @@ -106,6 +109,7 @@ PVOID MmAllocateNonCachedMemory(ULONG NumberOfBytes) Result=0; Status = MmCreateMemoryArea(KernelMode, + PsGetCurrentProcess(), MEMORY_AREA_NO_CACHE, &Result, NumberOfBytes, @@ -126,5 +130,5 @@ PVOID MmAllocateNonCachedMemory(ULONG NumberOfBytes) VOID MmFreeNonCachedMemory(PVOID BaseAddress, ULONG NumberOfBytes) { - MmFreeMemoryArea(BaseAddress,NumberOfBytes,TRUE); + MmFreeMemoryArea(PsGetCurrentProcess(),BaseAddress,NumberOfBytes,TRUE); } diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index a1d4fa95833..f666c211037 100644 --- a/reactos/ntoskrnl/mm/virtual.c +++ b/reactos/ntoskrnl/mm/virtual.c @@ -7,15 +7,19 @@ * UPDATE HISTORY: * 09/4/98: Created * 10/6/98: Corrections from Fatahi (i_fatahi@hotmail.com) + * 30/9/98: Implemented ZwxxxVirtualMemory functions */ /* INCLUDE *****************************************************************/ #include -#include +#include #include -#include +#include +#include +#include +#include #define NDEBUG #include @@ -25,10 +29,6 @@ extern unsigned int etext; extern unsigned int end; -/* - * These two are statically declared because mm is initalized before the - * memory pool - */ static MEMORY_AREA* kernel_text_desc = NULL; static MEMORY_AREA* kernel_data_desc = NULL; static MEMORY_AREA* kernel_param_desc = NULL; @@ -45,7 +45,7 @@ void VirtualInit(boot_param* bp) */ { unsigned int kernel_len = bp->end_mem - bp->start_mem; - ULONG BaseAddress; + PVOID BaseAddress; ULONG Length; ULONG ParamLength = kernel_len; @@ -58,17 +58,18 @@ void VirtualInit(boot_param* bp) /* * Setup the system area descriptor list */ - BaseAddress = KERNEL_BASE; + BaseAddress = (PVOID)KERNEL_BASE; Length = PAGE_ROUND_UP(((ULONG)&etext)) - KERNEL_BASE; ParamLength = ParamLength - Length; - MmCreateMemoryArea(KernelMode,MEMORY_AREA_SYSTEM,&BaseAddress, + MmCreateMemoryArea(KernelMode,NULL,MEMORY_AREA_SYSTEM,&BaseAddress, Length,0,&kernel_text_desc); Length = PAGE_ROUND_UP(((ULONG)&end)) - PAGE_ROUND_UP(((ULONG)&etext)); ParamLength = ParamLength - Length; DPRINT("Length %x\n",Length); - BaseAddress = PAGE_ROUND_UP(((ULONG)&etext)); + BaseAddress = (PVOID)PAGE_ROUND_UP(((ULONG)&etext)); MmCreateMemoryArea(KernelMode, + NULL, MEMORY_AREA_SYSTEM, &BaseAddress, Length, @@ -76,37 +77,61 @@ void VirtualInit(boot_param* bp) &kernel_data_desc); - BaseAddress = PAGE_ROUND_UP(((ULONG)&end)); + BaseAddress = (PVOID)PAGE_ROUND_UP(((ULONG)&end)); Length = ParamLength; - MmCreateMemoryArea(KernelMode,MEMORY_AREA_SYSTEM,&BaseAddress, + MmCreateMemoryArea(KernelMode,NULL,MEMORY_AREA_SYSTEM,&BaseAddress, Length,0,&kernel_param_desc); - BaseAddress = KERNEL_BASE+ PAGE_ROUND_UP(kernel_len) + PAGESIZE; + BaseAddress = (PVOID)(KERNEL_BASE + PAGE_ROUND_UP(kernel_len) + PAGESIZE); Length = NONPAGED_POOL_SIZE; - MmCreateMemoryArea(KernelMode,MEMORY_AREA_SYSTEM,&BaseAddress, + MmCreateMemoryArea(KernelMode,NULL,MEMORY_AREA_SYSTEM,&BaseAddress, Length,0,&kernel_pool_desc); - MmDumpMemoryAreas(); +// MmDumpMemoryAreas(); CHECKPOINT; + + MmInitSectionImplementation(); } -NTSTATUS MmSectionHandleFault(MEMORY_AREA* MemoryArea, ULONG Address) +ULONG MmCommitedSectionHandleFault(MEMORY_AREA* MemoryArea, ULONG Address) { set_page(Address,0x7,get_free_page()); + return(TRUE); +} + +NTSTATUS MmSectionHandleFault(MEMORY_AREA* MemoryArea, PVOID Address) +{ + LARGE_INTEGER Offset; + IO_STATUS_BLOCK IoStatus; + + DPRINT("MmSectionHandleFault(MemoryArea %x, Address %x)\n", + MemoryArea,Address); + + set_page(Address,0x7,get_free_page()); + + Offset.LowPart = (Address - MemoryArea->BaseAddress) + + MemoryArea->Data.SectionData.ViewOffset; + + DPRINT("MemoryArea->Data.SectionData.Section->FileObject %x\n", + MemoryArea->Data.SectionData.Section->FileObject); + + if (MemoryArea->Data.SectionData.Section->FileObject == NULL) + { + return(STATUS_UNSUCCESSFUL); + } + + IoPageRead(MemoryArea->Data.SectionData.Section->FileObject, + (PVOID)Address, + &Offset, + &IoStatus); + + DPRINT("Returning from MmSectionHandleFault()\n"); + return(STATUS_SUCCESS); } -asmlinkage int page_fault_handler(unsigned int edi, - unsigned int esi, unsigned int ebp, - unsigned int esp, unsigned int ebx, - unsigned int edx, unsigned int ecx, - unsigned int eax, - unsigned int type, - unsigned int ds, - unsigned short int error_code, - unsigned int eip, - unsigned int cs, unsigned int eflags, - unsigned int esp0, unsigned int ss0) +asmlinkage int page_fault_handler(unsigned int cs, + unsigned int eip) /* * FUNCTION: Handle a page fault */ @@ -121,15 +146,15 @@ asmlinkage int page_fault_handler(unsigned int edi, */ unsigned int cr2; __asm__("movl %%cr2,%0\n\t" : "=d" (cr2)); - DbgPrint("Page fault at address %x with eip %x\n",cr2,eip); + DPRINT("Page fault at address %x with eip %x\n",cr2,eip); cr2 = PAGE_ROUND_DOWN(cr2); if (KeGetCurrentIrql()!=PASSIVE_LEVEL) { DbgPrint("Recursive page fault detected\n"); - KeBugCheck(0); - for(;;); + return(0); +// KeBugCheck(0); } KeRaiseIrql(DISPATCH_LEVEL,&oldlvl); @@ -154,7 +179,7 @@ asmlinkage int page_fault_handler(unsigned int edi, FaultMode = KernelMode; } - MemoryArea = MmOpenMemoryAreaByAddress(cr2); + MemoryArea = MmOpenMemoryAreaByAddress(PsGetCurrentProcess(),(PVOID)cr2); if (MemoryArea==NULL) { printk("%s:%d\n",__FILE__,__LINE__); @@ -167,8 +192,20 @@ asmlinkage int page_fault_handler(unsigned int edi, stat = 0; break; - case MEMORY_AREA_SECTION_VIEW: - stat = MmSectionHandleFault(MemoryArea,cr2); + case MEMORY_AREA_SECTION_VIEW_COMMIT: + if (MmSectionHandleFault(MemoryArea,cr2)==STATUS_SUCCESS) + { + stat=1; + } + else + { + stat = 0; + } + break; + + case MEMORY_AREA_COMMIT: + stat = MmCommitedSectionHandleFault(MemoryArea,cr2); + break; default: stat = 0; @@ -181,7 +218,6 @@ asmlinkage int page_fault_handler(unsigned int edi, return(stat); } - BOOLEAN MmIsNonPagedSystemAddressValid(PVOID VirtualAddress) { UNIMPLEMENTED; @@ -198,7 +234,503 @@ BOOLEAN MmIsAddressValid(PVOID VirtualAddress) * succeed. Is this realistic for RISC processors which don't * allow byte granular access? */ +{ + MEMORY_AREA* MemoryArea; + + MemoryArea = MmOpenMemoryAreaByAddress(PsGetCurrentProcess(), + VirtualAddress); + + if (MemoryArea == NULL) + { + return(FALSE); + } + return(TRUE); +} + +NTSTATUS STDCALL NtAllocateVirtualMemory(IN HANDLE ProcessHandle, + OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN ULONG RegionSize, + IN ULONG AllocationType, + IN ULONG Protect) +{ + return(ZwAllocateVirtualMemory(ProcessHandle, + BaseAddress, + ZeroBits, + RegionSize, + AllocationType, + Protect)); +} + +NTSTATUS STDCALL ZwAllocateVirtualMemory(IN HANDLE ProcessHandle, + OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN ULONG RegionSize, + IN ULONG AllocationType, + IN ULONG Protect) +/* + * FUNCTION: Allocates a block of virtual memory in the process address space + * ARGUMENTS: + * ProcessHandle = The handle of the process which owns the virtual memory + * BaseAddress = A pointer to the virtual memory allocated. If you + * supply a non zero value the system will try to + * allocate the memory at the address supplied. It round + * it down to a multiple of the page size. + * ZeroBits = (OPTIONAL) You can specify the number of high order bits + * that must be zero, ensuring that the memory will be + * allocated at a address below a certain value. + * RegionSize = The number of bytes to allocate + * AllocationType = Indicates the type of virtual memory you like to + * allocated, can be one of the values : MEM_COMMIT, + * MEM_RESERVE, MEM_RESET, MEM_TOP_DOWN + * Protect = Indicates the protection type of the pages allocated, can be + * a combination of PAGE_READONLY, PAGE_READWRITE, + * PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_GUARD, + * PAGE_NOACCESS + * REMARKS: + * This function maps to the win32 VirtualAllocEx. Virtual memory is + * process based so the protocol starts with a ProcessHandle. I + * splitted the functionality of obtaining the actual address and + * specifying the start address in two parameters ( BaseAddress and + * StartAddress ) The NumberOfBytesAllocated specify the range and the + * AllocationType and ProctectionType map to the other two parameters. + * RETURNS: Status + */ +{ + PEPROCESS Process; + MEMORY_AREA* MemoryArea; + ULONG Type; + ULONG i; + NTSTATUS Status; + + DbgPrint("ZwAllocateVirtualMemory(ProcessHandle %x, *BaseAddress %x, " + "ZeroBits %d, RegionSize %d, AllocationType %x, Protect %x)\n", + ProcessHandle,*BaseAddress,ZeroBits,RegionSize,AllocationType, + Protect); + + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_OPERATION, + NULL, + UserMode, + (PVOID*)(&Process), + NULL); + if (Status != STATUS_SUCCESS) + { + DbgPrint("ZwAllocateVirtualMemory() = %x\n",Status); + return(Status); + } + + if (AllocationType & MEM_RESERVE) + { + Type = MEMORY_AREA_RESERVE; + } + else + { + Type = MEMORY_AREA_COMMIT; + } + + if ((*BaseAddress) != 0) + { + MemoryArea = MmOpenMemoryAreaByAddress(Process, *BaseAddress); + + if (MemoryArea != NULL) + { + if (MemoryArea->BaseAddress == (*BaseAddress) && + MemoryArea->Length == RegionSize) + { + MemoryArea->Type = Type; + MemoryArea->Attributes =Protect; + DbgPrint("*BaseAddress %x\n",*BaseAddress); + return(STATUS_SUCCESS); + } + + MemoryArea = MmSplitMemoryArea(Process, + MemoryArea, + *BaseAddress, + RegionSize, + Type, + Protect); + DbgPrint("*BaseAddress %x\n",*BaseAddress); + return(STATUS_SUCCESS); + } + } + + Status = MmCreateMemoryArea(UserMode, + Process, + Type, + (PULONG)BaseAddress, + RegionSize, + Protect, + &MemoryArea); + + if (Status != STATUS_SUCCESS) + { + DbgPrint("ZwAllocateVirtualMemory() = %x\n",Status); + return(Status); + } + + DbgPrint("*BaseAddress %x\n",*BaseAddress); + + return(STATUS_SUCCESS); +} + +NTSTATUS STDCALL NtFlushVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN ULONG NumberOfBytesToFlush, + OUT PULONG NumberOfBytesFlushed OPTIONAL) +{ + return(ZwFlushVirtualMemory(ProcessHandle, + BaseAddress, + NumberOfBytesToFlush, + NumberOfBytesFlushed)); +} + +NTSTATUS STDCALL ZwFlushVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN ULONG NumberOfBytesToFlush, + OUT PULONG NumberOfBytesFlushed OPTIONAL) + +/* + * FUNCTION: Flushes virtual memory to file + * ARGUMENTS: + * ProcessHandle = Points to the process that allocated the virtual + * memory + * BaseAddress = Points to the memory address + * NumberOfBytesToFlush = Limits the range to flush, + * NumberOfBytesFlushed = Actual number of bytes flushed + * RETURNS: Status + */ { UNIMPLEMENTED; } +NTSTATUS STDCALL NtFreeVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID *BaseAddress, + IN ULONG RegionSize, + IN ULONG FreeType) +{ + return(ZwFreeVirtualMemory(ProcessHandle, + BaseAddress, + RegionSize, + FreeType)); +} + +NTSTATUS STDCALL ZwFreeVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID *BaseAddress, + IN ULONG RegionSize, + IN ULONG FreeType) + +/* + * FUNCTION: Frees a range of virtual memory + * ARGUMENTS: + * ProcessHandle = Points to the process that allocated the virtual + * memory + * BaseAddress = Points to the memory address, rounded down to a + * multiple of the pagesize + * RegionSize = Limits the range to free, rounded up to a multiple of + * the paging size + * FreeType = Can be one of the values: MEM_DECOMMIT, or MEM_RELEASE + * RETURNS: Status + */ +{ + MEMORY_AREA* MemoryArea; + NTSTATUS Status; + PEPROCESS Process; + + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_OPERATION, + PsProcessType, + UserMode, + (PVOID*)(&Process), + NULL); + if (Status != STATUS_SUCCESS) + { + DbgPrint("ZwFreeVirtualMemory() = %x\n",Status); + return(Status); + } + + MemoryArea = MmOpenMemoryAreaByAddress(Process,*BaseAddress); + if (MemoryArea == NULL) + { + return(STATUS_UNSUCCESSFUL); + } + + if (FreeType == MEM_RELEASE) + { + if (MemoryArea->BaseAddress != (*BaseAddress)) + { + return(STATUS_UNSUCCESSFUL); + } + MmFreeMemoryArea(PsGetCurrentProcess(), + BaseAddress, + 0, + TRUE); + return(STATUS_SUCCESS); + } + + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtLockVirtualMemory(HANDLE ProcessHandle, + PVOID BaseAddress, + ULONG NumberOfBytesToLock, + PULONG NumberOfBytesLocked) +{ + return(ZwLockVirtualMemory(ProcessHandle, + BaseAddress, + NumberOfBytesToLock, + NumberOfBytesLocked)); +} + +NTSTATUS STDCALL ZwLockVirtualMemory(HANDLE ProcessHandle, + PVOID BaseAddress, + ULONG NumberOfBytesToLock, + PULONG NumberOfBytesLocked) +{ + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtProtectVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN ULONG NumberOfBytesToProtect, + IN ULONG NewAccessProtection, + OUT PULONG OldAccessProtection) +{ + return(ZwProtectVirtualMemory(ProcessHandle, + BaseAddress, + NumberOfBytesToProtect, + NewAccessProtection, + OldAccessProtection)); +} + +VOID MmChangeAreaProtection(PEPROCESS Process, + PVOID BaseAddress, + ULONG Length, + ULONG Protect) +{ + ULONG i; + + for (i=0; i<(Length/PAGESIZE); i++) + { + if (MmIsPagePresent(Process, BaseAddress + (i*PAGESIZE))) + { + MmSetPageProtect(Process, BaseAddress + (i*PAGESIZE), Protect); + } + } +} + +NTSTATUS STDCALL ZwProtectVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN ULONG NumberOfBytesToProtect, + IN ULONG NewAccessProtection, + OUT PULONG OldAccessProtection) +{ + PMEMORY_AREA MemoryArea; + PEPROCESS Process; + NTSTATUS Status; + + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_OPERATION, + PsProcessType, + UserMode, + (PVOID*)(&Process), + NULL); + if (Status != STATUS_SUCCESS) + { + DbgPrint("ZwProtectVirtualMemory() = %x\n",Status); + return(Status); + } + + MemoryArea = MmOpenMemoryAreaByAddress(Process,BaseAddress); + if (MemoryArea == NULL) + { + DbgPrint("ZwProtectVirtualMemory() = %x\n",STATUS_UNSUCCESSFUL); + return(STATUS_UNSUCCESSFUL); + } + + *OldAccessProtection = MemoryArea->Attributes; + + if (MemoryArea->BaseAddress == BaseAddress && + MemoryArea->Length == NumberOfBytesToProtect) + { + MemoryArea->Attributes = NewAccessProtection; + } + else + { + MemoryArea = MmSplitMemoryArea(Process, + MemoryArea, + BaseAddress, + NumberOfBytesToProtect, + MemoryArea->Type, + NewAccessProtection); + } + MmChangeAreaProtection(Process,BaseAddress,NumberOfBytesToProtect, + NewAccessProtection); + return(STATUS_SUCCESS); +} + + +NTSTATUS STDCALL NtQueryVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID Address, + IN IN CINT VirtualMemoryInformationClass, + OUT PVOID VirtualMemoryInformation, + IN ULONG Length, + OUT PULONG ResultLength) +{ + return(ZwQueryVirtualMemory(ProcessHandle, + Address, + VirtualMemoryInformationClass, + VirtualMemoryInformation, + Length, + ResultLength)); +} + +NTSTATUS STDCALL ZwQueryVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID Address, + IN CINT VirtualMemoryInformationClass, + OUT PVOID VirtualMemoryInformation, + IN ULONG Length, + OUT PULONG ResultLength) +{ + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtReadVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + OUT PVOID Buffer, + IN ULONG NumberOfBytesToRead, + OUT PULONG NumberOfBytesRead) +{ + return(ZwReadVirtualMemory(ProcessHandle, + BaseAddress, + Buffer, + NumberOfBytesToRead, + NumberOfBytesRead)); +} + +NTSTATUS STDCALL ZwReadVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + OUT PVOID Buffer, + IN ULONG NumberOfBytesToRead, + OUT PULONG NumberOfBytesRead) +{ + PEPROCESS Process; + MEMORY_AREA* MemoryArea; + ULONG i; + NTSTATUS Status; + PULONG CurrentEntry; + + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_READ, + NULL, + UserMode, + (PVOID*)(&Process), + NULL); + if (Status != STATUS_SUCCESS) + { + return(Status); + } + + MemoryArea = MmOpenMemoryAreaByAddress(Process,BaseAddress); + + if (MemoryArea == NULL) + { + return(STATUS_UNSUCCESSFUL); + } + if (MemoryArea->Length > NumberOfBytesToRead) + { + NumberOfBytesToRead = MemoryArea->Length; + } + + *NumberOfBytesRead = NumberOfBytesToRead; + + for (i=0; i<(NumberOfBytesToRead/PAGESIZE); i++) + { + CurrentEntry = MmGetPageEntry(Process, BaseAddress + (i*PAGESIZE)); + RtlCopyMemory(Buffer + (i*PAGESIZE), + (PVOID)physical_to_linear(PAGE_MASK(*CurrentEntry)), + PAGESIZE); + + } + return(STATUS_SUCCESS); +} + +NTSTATUS STDCALL NtUnlockVirtualMemory(HANDLE ProcessHandle, + PVOID BaseAddress, + ULONG NumberOfBytesToUnlock, + PULONG NumberOfBytesUnlocked OPTIONAL) +{ + return(ZwUnlockVirtualMemory(ProcessHandle, + BaseAddress, + NumberOfBytesToUnlock, + NumberOfBytesUnlocked)); +} + +NTSTATUS STDCALL ZwUnlockVirtualMemory(HANDLE ProcessHandle, + PVOID BaseAddress, + ULONG NumberOfBytesToUnlock, + PULONG NumberOfBytesUnlocked OPTIONAL) +{ + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtWriteVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN PVOID Buffer, + IN ULONG NumberOfBytesToWrite, + OUT PULONG NumberOfBytesWritten) +{ + return(ZwWriteVirtualMemory(ProcessHandle, + BaseAddress, + Buffer, + NumberOfBytesToWrite, + NumberOfBytesWritten)); +} + +NTSTATUS STDCALL ZwWriteVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN PVOID Buffer, + IN ULONG NumberOfBytesToWrite, + OUT PULONG NumberOfBytesWritten) +{ + PEPROCESS Process; + MEMORY_AREA* MemoryArea; + ULONG i; + NTSTATUS Status; + PULONG CurrentEntry; + + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_WRITE, + NULL, + UserMode, + (PVOID*)(&Process), + NULL); + if (Status != STATUS_SUCCESS) + { + return(Status); + } + + MemoryArea = MmOpenMemoryAreaByAddress(Process,BaseAddress); + + if (MemoryArea == NULL) + { + return(STATUS_UNSUCCESSFUL); + } + if (MemoryArea->Length > NumberOfBytesToWrite) + { + NumberOfBytesToWrite = MemoryArea->Length; + } + + *NumberOfBytesWritten = NumberOfBytesToWrite; + + for (i=0; i<(NumberOfBytesToWrite/PAGESIZE); i++) + { + CurrentEntry = MmGetPageEntry(Process, BaseAddress + (i*PAGESIZE)); + RtlCopyMemory((PVOID)physical_to_linear(PAGE_MASK(*CurrentEntry)), + Buffer + (i*PAGESIZE), + PAGESIZE); + + } + return(STATUS_SUCCESS); +} + diff --git a/reactos/ntoskrnl/ob/handle.c b/reactos/ntoskrnl/ob/handle.c index 53c222a7466..6c31438f45a 100644 --- a/reactos/ntoskrnl/ob/handle.c +++ b/reactos/ntoskrnl/ob/handle.c @@ -20,14 +20,6 @@ /* TYPES *******************************************************************/ -/* - * PURPOSE: Defines a handle - */ -typedef struct -{ - PVOID obj; -} HANDLE_REP, *PHANDLE_REP; - #define HANDLE_BLOCK_ENTRIES ((PAGESIZE-sizeof(LIST_ENTRY))/sizeof(HANDLE_REP)) /* @@ -39,37 +31,116 @@ typedef struct HANDLE_REP handles[HANDLE_BLOCK_ENTRIES]; } HANDLE_BLOCK; -/* GLOBALS *****************************************************************/ - -/* - * PURPOSE: Head of the list of handle blocks - */ -LIST_ENTRY handle_list_head = {NULL,NULL}; -KSPIN_LOCK handle_list_lock = {0}; - /* FUNCTIONS ***************************************************************/ -VOID ObjDestroyHandleTable(VOID) + +NTSTATUS STDCALL NtDuplicateObject(IN HANDLE SourceProcessHandle, + IN PHANDLE SourceHandle, + IN HANDLE TargetProcessHandle, + OUT PHANDLE TargetHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN InheritHandle, + ULONG Options) +{ + return(ZwDuplicateObject(SourceProcessHandle, + SourceHandle, + TargetProcessHandle, + TargetHandle, + DesiredAccess, + InheritHandle, + Options)); +} + +NTSTATUS STDCALL ZwDuplicateObject(IN HANDLE SourceProcessHandle, + IN PHANDLE SourceHandle, + IN HANDLE TargetProcessHandle, + OUT PHANDLE TargetHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN InheritHandle, + ULONG Options) +/* + * FUNCTION: Copies a handle from one process space to another + * ARGUMENTS: + * SourceProcessHandle = The source process owning the handle. The + * source process should have opened + * the SourceHandle with PROCESS_DUP_HANDLE + * access. + * SourceHandle = The handle to the object. + * TargetProcessHandle = The destination process owning the handle + * TargetHandle (OUT) = Caller should supply storage for the + * duplicated handle. + * DesiredAccess = The desired access to the handle. + * InheritHandle = Indicates wheter the new handle will be inheritable + * or not. + * Options = Specifies special actions upon duplicating the handle. + * Can be one of the values DUPLICATE_CLOSE_SOURCE | + * DUPLICATE_SAME_ACCESS. DUPLICATE_CLOSE_SOURCE specifies + * that the source handle should be closed after duplicating. + * DUPLICATE_SAME_ACCESS specifies to ignore the + * DesiredAccess paramter and just grant the same access to + * the new handle. + * RETURNS: Status + * REMARKS: This function maps to the win32 DuplicateHandle. + */ +{ + PEPROCESS SourceProcess; + PEPROCESS TargetProcess; + PHANDLE_REP SourceHandleRep; + + ObReferenceObjectByHandle(SourceProcessHandle, + PROCESS_DUP_HANDLE, + NULL, + UserMode, + (PVOID*)&SourceProcess, + NULL); + ObReferenceObjectByHandle(TargetProcessHandle, + PROCESS_DUP_HANDLE, + NULL, + UserMode, + (PVOID*)&TargetProcess, + NULL); + + SourceHandleRep = ObTranslateHandle(&SourceProcess->Pcb,*SourceHandle); + + if (Options & DUPLICATE_SAME_ACCESS) + { + DesiredAccess = SourceHandleRep->GrantedAccess; + } + + *TargetHandle = ObInsertHandle(&TargetProcess,SourceHandleRep->ObjectBody, + DesiredAccess,InheritHandle); + + if (Options & DUPLICATE_CLOSE_SOURCE) + { + ZwClose(*SourceHandle); + } + + return(STATUS_SUCCESS); +} + +VOID ObDestroyHandleTable(PKPROCESS Process) /* * FUNCTION: Destroys the current process's handle table * NOTE: No references to handles in the table should be made during this * operation */ { - PLIST_ENTRY current=ExInterlockedRemoveHeadList(&handle_list_head, - &handle_list_lock); + PLIST_ENTRY current=NULL; unsigned int i; + current = ExInterlockedRemoveHeadList(&(Process->HandleTable.ListHead), + &(Process->HandleTable.ListLock)); + while (current!=NULL) { - HANDLE_BLOCK* blk = (HANDLE_BLOCK *)current; + HANDLE_BLOCK* blk = CONTAINING_RECORD(current,HANDLE_BLOCK,entry); /* * Deference every handle in block */ for (i=0;ihandles[i].obj); + ObDereferenceObject(blk->handles[i].ObjectBody); } /* @@ -77,70 +148,75 @@ VOID ObjDestroyHandleTable(VOID) */ ExFreePool(blk); - current = ExInterlockedRemoveHeadList(&handle_list_head, - &handle_list_lock); + current = ExInterlockedRemoveHeadList(&(Process->HandleTable.ListHead), + &(Process->HandleTable.ListLock)); } } -VOID ObjInitializeHandleTable(HANDLE parent) +VOID ObInitializeHandleTable(PKPROCESS Parent, BOOLEAN Inherit, + PKPROCESS Process) /* - * FUNCTION: Initializes a handle table for the current process + * FUNCTION: Initializes a handle table * ARGUMENTS: * parent = Parent process (or NULL if this is the first process) + * Inherit = True if the process should inherit its parents objects + * Process = Process whose handle table is to be initialized */ { - DPRINT("ObjInitializeHandleTable(parent %x)\n",parent); + DPRINT("ObInitializeHandleTable(parent %x, Inherit %d, Process %x)\n", + Parent,Inherit,Process); - InitializeListHead(&handle_list_head); - KeInitializeSpinLock(&handle_list_lock); + InitializeListHead(&(Process->HandleTable.ListHead)); + KeInitializeSpinLock(&(Process->HandleTable.ListLock)); } -static PHANDLE_REP ObTranslateHandle(HANDLE* h) +PHANDLE_REP ObTranslateHandle(PKPROCESS Process, HANDLE h) +/* + * FUNCTION: Get the data structure for a handle + * ARGUMENTS: + * Process = Process to get the handle for + * h = Handle + * ARGUMENTS: A pointer to the information about the handle on success, + * NULL on failure + */ { - PLIST_ENTRY current = handle_list_head.Flink; + PLIST_ENTRY current; unsigned int handle = ((unsigned int)h) - 1; unsigned int count=handle/HANDLE_BLOCK_ENTRIES; HANDLE_BLOCK* blk = NULL; unsigned int i; + DPRINT("ObTranslateHandle(Process %x, h %x)\n",Process,h); + + current = Process->HandleTable.ListHead.Flink; + DPRINT("current %x\n",current); + for (i=0;iFlink; - if (current==(&handle_list_head)) + if (current==(&(Process->HandleTable.ListHead))) { return(NULL); } } - blk = (HANDLE_BLOCK *)current; + blk = CONTAINING_RECORD(current,HANDLE_BLOCK,entry); return(&(blk->handles[handle%HANDLE_BLOCK_ENTRIES])); } -PVOID ObGetObjectByHandle(HANDLE h) -/* - * FUNCTION: Translate a handle to the corresponding object - * ARGUMENTS: - * h = Handle to translate - * RETURNS: The object - */ -{ - DPRINT("ObGetObjectByHandle(h %x)\n",h); - - if (h==NULL) - { - return(NULL); - } - - return(ObTranslateHandle(h)->obj); -} - VOID ObDeleteHandle(HANDLE Handle) { - PHANDLE_REP Rep = ObTranslateHandle(Handle); - Rep->obj=NULL; + PHANDLE_REP Rep; + + DPRINT("ObDeleteHandle(Handle %x)\n",Handle); + + Rep = ObTranslateHandle(KeGetCurrentProcess(),Handle); + Rep->ObjectBody=NULL; + DPRINT("Finished ObDeleteHandle()\n"); } -HANDLE ObAddHandle(PVOID obj) +HANDLE ObInsertHandle(PKPROCESS Process, PVOID ObjectBody, + ACCESS_MASK GrantedAccess, BOOLEAN Inherit) /* * FUNCTION: Add a handle referencing an object * ARGUMENTS: @@ -149,29 +225,33 @@ HANDLE ObAddHandle(PVOID obj) * NOTE: THe handle is valid only in the context of the current process */ { - LIST_ENTRY* current = handle_list_head.Flink; + LIST_ENTRY* current; unsigned int handle=1; unsigned int i; HANDLE_BLOCK* new_blk = NULL; - DPRINT("ObAddHandle(obj %x)\n",obj); + DPRINT("ObAddHandle(Process %x, obj %x)\n",Process,ObjectBody); + + current = Process->HandleTable.ListHead.Flink; /* * Scan through the currently allocated handle blocks looking for a free * slot */ - while (current!=(&handle_list_head)) + while (current!=(&(Process->HandleTable.ListHead))) { - HANDLE_BLOCK* blk = (HANDLE_BLOCK *)current; + HANDLE_BLOCK* blk = CONTAINING_RECORD(current,HANDLE_BLOCK,entry); DPRINT("Current %x\n",current); for (i=0;ihandles[i]); - if (blk->handles[i].obj==NULL) + if (blk->handles[i].ObjectBody==NULL) { - blk->handles[i].obj=obj; + blk->handles[i].ObjectBody = ObjectBody; + blk->handles[i].GrantedAccess = GrantedAccess; + blk->handles[i].Inherit = Inherit; return((HANDLE)(handle+i)); } } @@ -185,9 +265,12 @@ HANDLE ObAddHandle(PVOID obj) */ new_blk = (HANDLE_BLOCK *)ExAllocatePool(NonPagedPool,sizeof(HANDLE_BLOCK)); memset(new_blk,0,sizeof(HANDLE_BLOCK)); - ExInterlockedInsertTailList(&handle_list_head,&new_blk->entry, - &handle_list_lock); - new_blk->handles[0].obj=obj; + ExInterlockedInsertTailList(&(Process->HandleTable.ListHead), + &new_blk->entry, + &(Process->HandleTable.ListLock)); + new_blk->handles[0].ObjectBody = ObjectBody; + new_blk->handles[0].GrantedAccess = GrantedAccess; + new_blk->handles[0].Inherit = Inherit; return((HANDLE)handle); } diff --git a/reactos/ntoskrnl/ob/namespc.c b/reactos/ntoskrnl/ob/namespc.c index bd876a9e722..4b78890ebe9 100644 --- a/reactos/ntoskrnl/ob/namespc.c +++ b/reactos/ntoskrnl/ob/namespc.c @@ -22,23 +22,7 @@ /* GLOBALS ****************************************************************/ -OBJECT_TYPE DirectoryObjectType = {{0,0,NULL}, - 0, - 0, - ULONG_MAX, - ULONG_MAX, - sizeof(DIRECTORY_OBJECT), - 0, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - }; - +POBJECT_TYPE ObDirectoryType = NULL; static struct { @@ -50,6 +34,15 @@ static struct /* FUNCTIONS **************************************************************/ +NTSTATUS NtOpenDirectoryObject(PHANDLE DirectoryHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes) +{ + return(ZwOpenDirectoryObject(DirectoryHandle, + DesiredAccess, + ObjectAttributes)); +} + NTSTATUS ZwOpenDirectoryObject(PHANDLE DirectoryHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes) @@ -80,11 +73,29 @@ NTSTATUS ZwOpenDirectoryObject(PHANDLE DirectoryHandle, return(STATUS_UNSUCCESSFUL); } - *DirectoryHandle = ObAddHandle(Object); + *DirectoryHandle = ObInsertHandle(KeGetCurrentProcess(),Object, + DesiredAccess,FALSE); CHECKPOINT; return(STATUS_SUCCESS); } +NTSTATUS NtQueryDirectoryObject(IN HANDLE DirObjHandle, + OUT POBJDIR_INFORMATION DirObjInformation, + IN ULONG BufferLength, + IN BOOLEAN GetNextIndex, + IN BOOLEAN IgnoreInputIndex, + IN OUT PULONG ObjectIndex, + OUT PULONG DataWritten OPTIONAL) +{ + return(ZwQueryDirectoryObject(DirObjHandle, + DirObjInformation, + BufferLength, + GetNextIndex, + IgnoreInputIndex, + ObjectIndex, + DataWritten)); +} + NTSTATUS ZwQueryDirectoryObject(IN HANDLE DirObjHandle, OUT POBJDIR_INFORMATION DirObjInformation, IN ULONG BufferLength, @@ -111,19 +122,30 @@ NTSTATUS ZwQueryDirectoryObject(IN HANDLE DirObjHandle, * RETURNS: Status */ { - COMMON_BODY_HEADER* hdr = ObGetObjectByHandle(DirObjHandle); - PDIRECTORY_OBJECT dir = (PDIRECTORY_OBJECT)hdr; + PDIRECTORY_OBJECT dir = NULL; ULONG EntriesToRead; PLIST_ENTRY current_entry; POBJECT_HEADER current; ULONG i=0; ULONG EntriesToSkip; + NTSTATUS Status; DPRINT("ZwQueryDirectoryObject(DirObjHandle %x)\n",DirObjHandle); DPRINT("dir %x namespc_root %x\n",dir,HEADER_TO_BODY(&(namespc_root.hdr))); - assert_irql(PASSIVE_LEVEL); - +// assert_irql(PASSIVE_LEVEL); + + Status = ObReferenceObjectByHandle(DirObjHandle, + DIRECTORY_QUERY, + ObDirectoryType, + UserMode, + (PVOID*)&dir, + NULL); + if (Status != STATUS_SUCCESS) + { + return(Status); + } + EntriesToRead = BufferLength / sizeof(OBJDIR_INFORMATION); *DataWritten = 0; @@ -152,16 +174,16 @@ NTSTATUS ZwQueryDirectoryObject(IN HANDLE DirObjHandle, */ while ( ihead))) { - current = CONTAINING_RECORD(current_entry,OBJECT_HEADER,entry); - DPRINT("Scanning %w\n",current->name.Buffer); + current = CONTAINING_RECORD(current_entry,OBJECT_HEADER,Entry); + DPRINT("Scanning %w\n",current->Name.Buffer); DirObjInformation[i].ObjectName.Buffer = - ExAllocatePool(NonPagedPool,current->name.Length); - DirObjInformation[i].ObjectName.Length = current->name.Length; - DirObjInformation[i].ObjectName.MaximumLength = current->name.Length; + ExAllocatePool(NonPagedPool,(current->Name.Length+1)*2); + DirObjInformation[i].ObjectName.Length = current->Name.Length; + DirObjInformation[i].ObjectName.MaximumLength = current->Name.Length; DPRINT("DirObjInformation[i].ObjectName.Buffer %x\n", DirObjInformation[i].ObjectName.Buffer); RtlCopyUnicodeString(&DirObjInformation[i].ObjectName, - &(current->name)); + &(current->Name)); i++; current_entry = current_entry->Flink; (*DataWritten) = (*DataWritten) + sizeof(OBJDIR_INFORMATION); @@ -194,7 +216,7 @@ NTSTATUS ObReferenceObjectByName(PUNICODE_STRING ObjectPath, PACCESS_STATE PassedAccessState, ACCESS_MASK DesiredAccess, POBJECT_TYPE ObjectType, - KPROCESSOR_MODE Accessmode, + KPROCESSOR_MODE AccessMode, PVOID ParseContext, PVOID* ObjectPtr) { @@ -210,6 +232,8 @@ NTSTATUS ObOpenObjectByName(POBJECT_ATTRIBUTES ObjectAttributes, ObjectAttributes,Object); DPRINT("ObjectAttributes = {ObjectName %x ObjectName->Buffer %w}\n", ObjectAttributes->ObjectName,ObjectAttributes->ObjectName->Buffer); + DPRINT("ObjectAttributes->ObjectName->Length %d\n", + ObjectAttributes->ObjectName->Length); *Object = NULL; Status = ObLookupObject(ObjectAttributes->RootDirectory, @@ -217,6 +241,8 @@ NTSTATUS ObOpenObjectByName(POBJECT_ATTRIBUTES ObjectAttributes, Object, UnparsedSection); DPRINT("*Object %x\n",*Object); + DPRINT("ObjectAttributes->ObjectName->Length %d\n", + ObjectAttributes->ObjectName->Length); return(Status); } @@ -225,15 +251,40 @@ void ObInit(void) * FUNCTION: Initialize the object manager namespace */ { - ANSI_STRING ansi_str; + ANSI_STRING AnsiString; - ObInitializeObjectHeader(OBJTYP_DIRECTORY,NULL,&namespc_root.hdr); + ObDirectoryType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE)); + + ObDirectoryType->TotalObjects = 0; + ObDirectoryType->TotalHandles = 0; + ObDirectoryType->MaxObjects = ULONG_MAX; + ObDirectoryType->MaxHandles = ULONG_MAX; + ObDirectoryType->PagedPoolCharge = 0; + ObDirectoryType->NonpagedPoolCharge = sizeof(DIRECTORY_OBJECT); + ObDirectoryType->Dump = NULL; + ObDirectoryType->Open = NULL; + ObDirectoryType->Close = NULL; + ObDirectoryType->Delete = NULL; + ObDirectoryType->Parse = NULL; + ObDirectoryType->Security = NULL; + ObDirectoryType->QueryName = NULL; + ObDirectoryType->OkayToClose = NULL; + + RtlInitAnsiString(&AnsiString,"Directory"); + RtlAnsiStringToUnicodeString(&ObDirectoryType->TypeName, + &AnsiString,TRUE); + + ObInitializeObjectHeader(ObDirectoryType,NULL,&namespc_root.hdr); InitializeListHead(&namespc_root.head); - - RtlInitAnsiString(&ansi_str,"Directory"); - RtlAnsiStringToUnicodeString(&DirectoryObjectType.TypeName,&ansi_str, - TRUE); - ObRegisterType(OBJTYP_DIRECTORY,&DirectoryObjectType); +} + +NTSTATUS NtCreateDirectoryObject(PHANDLE DirectoryHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes) +{ + return(ZwCreateDirectoryObject(DirectoryHandle, + DesiredAccess, + ObjectAttributes)); } NTSTATUS ZwCreateDirectoryObject(PHANDLE DirectoryHandle, @@ -254,7 +305,7 @@ NTSTATUS ZwCreateDirectoryObject(PHANDLE DirectoryHandle, PDIRECTORY_OBJECT dir; dir = ObGenericCreateObject(DirectoryHandle,DesiredAccess,ObjectAttributes, - OBJTYP_DIRECTORY); + ObDirectoryType); /* * Initialize the object body @@ -326,9 +377,9 @@ static PVOID ObDirLookup(PDIRECTORY_OBJECT dir, PWSTR name) } while (current!=(&(dir->head))) { - current_obj = CONTAINING_RECORD(current,OBJECT_HEADER,entry); - DPRINT("Scanning %w\n",current_obj->name.Buffer); - if ( wcscmp(current_obj->name.Buffer, name)==0) + current_obj = CONTAINING_RECORD(current,OBJECT_HEADER,Entry); + DPRINT("Scanning %w\n",current_obj->Name.Buffer); + if ( wcscmp(current_obj->Name.Buffer, name)==0) { return(HEADER_TO_BODY(current_obj)); } @@ -338,6 +389,16 @@ static PVOID ObDirLookup(PDIRECTORY_OBJECT dir, PWSTR name) return(NULL); } +VOID ObRemoveEntry(POBJECT_HEADER Header) +{ + KIRQL oldlvl; + + DPRINT("ObRemoveEntry(Header %x)\n",Header); + + KeAcquireSpinLock(&(Header->Parent->Lock),&oldlvl); + RemoveEntryList(&(Header->Entry)); + KeReleaseSpinLock(&(Header->Parent->Lock),oldlvl); +} VOID ObCreateEntry(PDIRECTORY_OBJECT parent,POBJECT_HEADER Object) /* @@ -348,14 +409,13 @@ VOID ObCreateEntry(PDIRECTORY_OBJECT parent,POBJECT_HEADER Object) * Object = Header of the object to add the entry for */ { - DPRINT("ObjCreateEntry(%x,%x,%x,%w)\n",parent,Object,Object->name.Buffer, - Object->name.Buffer); - assert(parent->Type == OBJTYP_DIRECTORY); + DPRINT("ObjCreateEntry(%x,%x,%x,%w)\n",parent,Object,Object->Name.Buffer, + Object->Name.Buffer); /* * Insert ourselves in our parents list */ - InsertTailList(&parent->head,&Object->entry); + InsertTailList(&parent->head,&Object->Entry); } NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object, @@ -411,7 +471,8 @@ NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object, next = &string[0]; current = next+1; - while (next!=NULL && current_dir->Type==OBJTYP_DIRECTORY) + while (next!=NULL && + BODY_TO_HEADER(current_dir)->ObjectType==ObDirectoryType) { *next = '\\'; current = next+1; @@ -433,15 +494,10 @@ NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object, { DbgPrint("(%s:%d) Path component not found\n",__FILE__, __LINE__); - ExFreePool(string); return(STATUS_UNSUCCESSFUL); } - DPRINT("current_dir %x\n",current_dir); - DPRINT("current_dir->Type %d OBJTYP_SYMLNK %d OBJTYP_DIRECTORY %d\n", - current_dir->Type,OBJTYP_SYMLNK,OBJTYP_DIRECTORY); - DPRINT("&(current_dir->Type) %x\n",&(current_dir->Type)); - if (current_dir->Type==OBJTYP_SYMLNK) + if (BODY_TO_HEADER(current_dir)->ObjectType==IoSymbolicLinkType) { current_dir = IoOpenSymlink(current_dir); } @@ -465,18 +521,14 @@ NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object, CHECKPOINT; *next = '\\'; *UnparsedSection = next; - switch(current_dir->Type) + if (BODY_TO_HEADER(current_dir)->ObjectType == IoDeviceType) { - case OBJTYP_DEVICE: - CHECKPOINT; Status = STATUS_FS_QUERY_REQUIRED; - break; - - default: - current_dir = NULL; - Status = STATUS_UNSUCCESSFUL; - break; } + else + { + Status = STATUS_UNSUCCESSFUL; + } } CHECKPOINT; *Object = current_dir; diff --git a/reactos/ntoskrnl/ob/object.c b/reactos/ntoskrnl/ob/object.c index 757b09b07df..02ca854be6b 100644 --- a/reactos/ntoskrnl/ob/object.c +++ b/reactos/ntoskrnl/ob/object.c @@ -17,35 +17,93 @@ #define NDEBUG #include -/* GLOBALS ****************************************************************/ - -/* - * List of pointers to object types - */ -static POBJECT_TYPE ObjectTypes[OBJTYP_MAX]={NULL,}; - /* FUNCTIONS ************************************************************/ +NTSTATUS STDCALL NtSetInformationObject(IN HANDLE ObjectHandle, + IN CINT ObjectInformationClass, + IN PVOID ObjectInformation, + IN ULONG Length) +{ + return(ZwSetInformationObject(ObjectHandle, + ObjectInformationClass, + ObjectInformation, + Length)); +} + +NTSTATUS STDCALL ZwSetInformationObject(IN HANDLE ObjectHandle, + IN CINT ObjectInformationClass, + IN PVOID ObjectInformation, + IN ULONG Length) +{ + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtQueryObject(IN HANDLE ObjectHandle, + IN CINT ObjectInformationClass, + OUT PVOID ObjectInformation, + IN ULONG Length, + OUT PULONG ResultLength) +{ + return(ZwQueryObject(ObjectHandle, + ObjectInformationClass, + ObjectInformation, + Length, + ResultLength)); +} + +NTSTATUS STDCALL ZwQueryObject(IN HANDLE ObjectHandle, + IN CINT ObjectInformationClass, + OUT PVOID ObjectInformation, + IN ULONG Length, + OUT PULONG ResultLength) +{ + UNIMPLEMENTED +} + +NTSTATUS NtMakeTemporaryObject(HANDLE Handle) +{ + return(ZwMakeTemporaryObject(Handle)); +} + NTSTATUS ZwMakeTemporaryObject(HANDLE Handle) { - UNIMPLEMENTED; + PVOID Object; + NTSTATUS Status; + POBJECT_HEADER ObjectHeader; + + Status = ObReferenceObjectByHandle(Handle, + 0, + NULL, + KernelMode, + &Object, + NULL); + if (Status != STATUS_SUCCESS) + { + return(Status); + } + + ObjectHeader = BODY_TO_HEADER(Object); + ObjectHeader->Permanent = FALSE; + + ObDereferenceObject(Object); + + return(STATUS_SUCCESS); } PVOID ObGenericCreateObject(PHANDLE Handle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, - CSHORT Type) + POBJECT_TYPE Type) { POBJECT_HEADER hdr = NULL; UNICODE_STRING ObjectName; PWSTR path; PWSTR name; - PDIRECTORY_OBJECT parent; PWSTR Ignored; DPRINT("ObGenericCreateObject(Handle %x, DesiredAccess %x," - "ObjectAttributes %x, Type %d)\n",Handle,DesiredAccess,ObjectAttributes, - Type); + "ObjectAttributes %x, Type %x)\n",Handle,DesiredAccess, + ObjectAttributes,Type); /* * Allocate the object body and header @@ -62,7 +120,13 @@ PVOID ObGenericCreateObject(PHANDLE Handle, if (ObjectAttributes==NULL) { ObInitializeObjectHeader(Type,NULL,hdr); - *Handle = ObAddHandle(HEADER_TO_BODY(hdr)); + if (Handle != NULL) + { + *Handle = ObInsertHandle(KeGetCurrentProcess(), + HEADER_TO_BODY(hdr), + DesiredAccess, + FALSE); + } return(HEADER_TO_BODY(hdr)); } @@ -107,31 +171,19 @@ PVOID ObGenericCreateObject(PHANDLE Handle, ObCreateEntry(hdr->Parent,hdr); DPRINT("Handle %x\n",Handle); - *Handle = ObAddHandle(HEADER_TO_BODY(hdr)); + if (Handle != NULL) + { + *Handle = ObInsertHandle(KeGetCurrentProcess(), + HEADER_TO_BODY(hdr), + DesiredAccess, + FALSE); + } return(HEADER_TO_BODY(hdr)); } -ULONG ObSizeOf(CSHORT Type) -{ - DPRINT("ObSizeOf(Type %d)\n",Type); - DPRINT("ObSizeOf() Returning %d\n",ObjectTypes[Type]->PagedPoolCharge); - return(ObjectTypes[Type]->PagedPoolCharge); -} - -VOID ObRegisterType(CSHORT id, POBJECT_TYPE type) -/* - * FUNCTION: Registers a new type of object - * ARGUMENTS: - * typ = Pointer to the type definition to register - */ -{ - DPRINT("ObRegisterType(id %d, type %x)\n",id,type); - ObjectTypes[id]=type; -} - -VOID ObInitializeObjectHeader(CSHORT id, PWSTR name, - POBJECT_HEADER obj) +VOID ObInitializeObjectHeader(POBJECT_TYPE Type, PWSTR name, + POBJECT_HEADER ObjectHeader) /* * FUNCTION: Creates a new object * ARGUMENT: @@ -141,38 +193,25 @@ VOID ObInitializeObjectHeader(CSHORT id, PWSTR name, { PWSTR temp_name; - if (name!=NULL) - { - DPRINT("ObInitializeObjectHeader(id %d name %w obj %x)\n",id, - name,obj); - } - else - { - DPRINT("ObInitializeObjectHeader(id %d name %x obj %x)\n",id, - name,obj); - } + DPRINT("ObInitializeObjectHeader(id %x name %w obj %x)\n",Type, + name,ObjectHeader); - obj->HandleCount = 0; - obj->RefCount = 0; - obj->Type = id; + ObjectHeader->HandleCount = 0; + ObjectHeader->RefCount = 0; + ObjectHeader->ObjectType = Type; + ObjectHeader->Permanent = FALSE; if (name==NULL) { - obj->name.Length=0; - obj->name.Buffer=NULL; + ObjectHeader->Name.Length=0; + ObjectHeader->Name.Buffer=NULL; } else { - DPRINT("name %w\n",name); - obj->name.MaximumLength = wstrlen(name); - obj->name.Buffer = ExAllocatePool(NonPagedPool, - (obj->name.MaximumLength+1)*2); - DPRINT("name %w\n",name); - RtlInitUnicodeString(&obj->name,name); - DPRINT("name %w\n",obj->name.Buffer); + ObjectHeader->Name.MaximumLength = wstrlen(name); + ObjectHeader->Name.Buffer = ExAllocatePool(NonPagedPool, + (ObjectHeader->Name.MaximumLength+1)*2); + RtlInitUnicodeString(&ObjectHeader->Name,name); } - DPRINT("obj->Type %d\n",obj->Type); - DPRINT("obj %x\n",obj); - DPRINT("&(obj->Type) %x\n",&(obj->Type)); } @@ -199,6 +238,17 @@ NTSTATUS ObReferenceObjectByPointer(PVOID ObjectBody, return(STATUS_SUCCESS); } +NTSTATUS ObPerformRetentionChecks(POBJECT_HEADER Header) +{ + if (Header->RefCount == 0 && Header->HandleCount == 0 && + !Header->Permanent) + { + ObRemoveEntry(Header); + ExFreePool(Header); + } + return(STATUS_SUCCESS); +} + VOID ObDereferenceObject(PVOID ObjectBody) /* * FUNCTION: Decrements a given object's reference count and performs @@ -207,8 +257,15 @@ VOID ObDereferenceObject(PVOID ObjectBody) * ObjectBody = Body of the object */ { - POBJECT_HEADER Object = BODY_TO_HEADER(ObjectBody); - Object->RefCount--; + POBJECT_HEADER Header = BODY_TO_HEADER(ObjectBody); + Header->RefCount--; + ObPerformRetentionChecks(Header); +} + + +NTSTATUS NtClose(HANDLE Handle) +{ + return(ZwClose(Handle)); } NTSTATUS ZwClose(HANDLE Handle) @@ -220,15 +277,25 @@ NTSTATUS ZwClose(HANDLE Handle) */ { PVOID ObjectBody; + POBJECT_HEADER Header; + PHANDLE_REP HandleRep; assert_irql(PASSIVE_LEVEL); - ObjectBody = ObGetObjectByHandle(Handle); - if (ObjectBody == NULL) + HandleRep = ObTranslateHandle(KeGetCurrentProcess(),Handle); + if (HandleRep == NULL) { return(STATUS_INVALID_HANDLE); - } - ObDereferenceObject(ObjectBody); + } + ObjectBody = HandleRep->ObjectBody; + + HandleRep->ObjectBody = NULL; + + Header = BODY_TO_HEADER(ObjectBody); + + Header->HandleCount--; + ObPerformRetentionChecks(Header); + return(STATUS_SUCCESS); } @@ -254,18 +321,47 @@ NTSTATUS ObReferenceObjectByHandle(HANDLE Handle, * RETURNS: Status */ { - PVOID ObjectBody; + PHANDLE_REP HandleRep; + POBJECT_HEADER ObjectHeader; ASSERT_IRQL(PASSIVE_LEVEL); - assert(HandleInformationPtr==NULL); - assert(Object!=NULL); - assert(Handle!=NULL); - - ObjectBody = ObGetObjectByHandle(Handle); - if (ObjectBody == NULL) + + DPRINT("ObReferenceObjectByHandle(Handle %x, DesiredAccess %x, " + "ObjectType %x, AccessMode %d, Object %x)\n",Handle,DesiredAccess, + ObjectType,AccessMode,Object); + + if (Handle == NtCurrentProcess()) + { + *Object = PsGetCurrentProcess(); + return(STATUS_SUCCESS); + } + if (Handle == NtCurrentThread()) + { + *Object = PsGetCurrentThread(); + return(STATUS_SUCCESS); + } + + HandleRep = ObTranslateHandle(KeGetCurrentProcess(),Handle); + if (HandleRep == NULL || HandleRep->ObjectBody == NULL) { return(STATUS_INVALID_HANDLE); + } + + 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); } diff --git a/reactos/ntoskrnl/ps/idle.c b/reactos/ntoskrnl/ps/idle.c index bf15d475850..88f15c9503c 100644 --- a/reactos/ntoskrnl/ps/idle.c +++ b/reactos/ntoskrnl/ps/idle.c @@ -22,16 +22,28 @@ HANDLE IdleThreadHandle = NULL; static VOID PsIdleThreadMain(PVOID Context) { - for(;;); + for(;;) + { +// DbgPrint("Idling.... "); + ZwYieldExecution(); + } } VOID PsInitIdleThread(VOID) { + KPRIORITY Priority; + PsCreateSystemThread(&IdleThreadHandle, - 0, + THREAD_ALL_ACCESS, NULL, NULL, NULL, PsIdleThreadMain, NULL); + + Priority = THREAD_PRIORITY_IDLE; + ZwSetInformationThread(IdleThreadHandle, + ThreadPriority, + &Priority, + sizeof(Priority)); } diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index eb363ad457d..a1b76fef290 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -11,23 +11,70 @@ /* INCLUDES ******************************************************************/ #include +#include +#include +#include -#define NDEBUG +//#define NDEBUG #include /* GLOBALS ******************************************************************/ -EPROCESS SystemProcess = {{0},}; +PEPROCESS SystemProcess = NULL; HANDLE SystemProcessHandle = NULL; +POBJECT_TYPE PsProcessType = NULL; + /* FUNCTIONS *****************************************************************/ VOID PsInitProcessManagment(VOID) { - InitializeListHead(&(SystemProcess.Pcb.MemoryAreaList)); + ANSI_STRING AnsiString; + PKPROCESS KProcess; + + /* + * Register the process object type + */ + + PsProcessType = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE)); + + PsProcessType->TotalObjects = 0; + PsProcessType->TotalHandles = 0; + PsProcessType->MaxObjects = ULONG_MAX; + PsProcessType->MaxHandles = ULONG_MAX; + PsProcessType->PagedPoolCharge = 0; + PsProcessType->NonpagedPoolCharge = sizeof(EPROCESS); + PsProcessType->Dump = NULL; + PsProcessType->Open = NULL; + PsProcessType->Close = NULL; + PsProcessType->Delete = NULL; + PsProcessType->Parse = NULL; + PsProcessType->Security = NULL; + PsProcessType->QueryName = NULL; + PsProcessType->OkayToClose = NULL; + + RtlInitAnsiString(&AnsiString,"Process"); + RtlAnsiStringToUnicodeString(&PsProcessType->TypeName,&AnsiString,TRUE); + + /* + * Initialize the system process + */ + SystemProcess = ObGenericCreateObject(NULL,PROCESS_ALL_ACCESS,NULL, + PsProcessType); + KProcess = &SystemProcess->Pcb; + + InitializeListHead(&(KProcess->MemoryAreaList)); + ObInitializeHandleTable(NULL,FALSE,KProcess); + KProcess->PageTableDirectory = get_page_directory(); + + SystemProcessHandle = ObInsertHandle(KProcess,SystemProcess, + PROCESS_ALL_ACCESS,FALSE); } PKPROCESS KeGetCurrentProcess(VOID) +/* + * FUNCTION: Returns a pointer to the current process + */ { return(&(PsGetCurrentProcess()->Pcb)); } @@ -37,7 +84,233 @@ struct _EPROCESS* PsGetCurrentProcess(VOID) * FUNCTION: Returns a pointer to the current process */ { - DPRINT("PsGetCurrentProcess() = %x\n",PsGetCurrentThread()->ThreadsProcess); - 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; +} diff --git a/reactos/ntoskrnl/ps/psmgr.c b/reactos/ntoskrnl/ps/psmgr.c index 90cbf7b6427..8d322e853b7 100644 --- a/reactos/ntoskrnl/ps/psmgr.c +++ b/reactos/ntoskrnl/ps/psmgr.c @@ -16,7 +16,6 @@ VOID PsInit(VOID) { - ObjInitializeHandleTable(NULL); PsInitProcessManagment(); PsInitThreadManagment(); PsInitIdleThread(); diff --git a/reactos/ntoskrnl/ps/thread.c b/reactos/ntoskrnl/ps/thread.c index 63fabd7a13f..31737ffa779 100644 --- a/reactos/ntoskrnl/ps/thread.c +++ b/reactos/ntoskrnl/ps/thread.c @@ -33,32 +33,13 @@ /* GLOBALS ******************************************************************/ -OBJECT_TYPE ThreadObjectType = {{NULL,0,0}, - 0, - 0, - ULONG_MAX, - ULONG_MAX, - sizeof(ETHREAD), - 0, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - }; +POBJECT_TYPE PsThreadType = NULL; -#define NR_THREAD_PRIORITY_LEVELS (32) +#define NR_THREAD_PRIORITY_LEVELS (31) +#define THREAD_PRIORITY_MAX (15) static KSPIN_LOCK ThreadListLock = {0,}; -/* - * PURPOSE: List of all threads currently active - */ -static LIST_ENTRY ThreadListHead = {NULL,NULL}; - /* * PURPOSE: List of threads associated with each priority level */ @@ -71,17 +52,9 @@ static ULONG NextThreadUniqueId = 0; /* FUNCTIONS ***************************************************************/ -NTSTATUS ZwSetInformationThread(HANDLE ThreadHandle, - THREADINFOCLASS ThreadInformationClass, - PVOID ThreadInformation, - ULONG ThreadInformationLength) -{ - UNIMPLEMENTED; -} - PKTHREAD KeGetCurrentThread(VOID) { - return((PKTHREAD)CurrentThread); + return(&(CurrentThread->Tcb)); } PETHREAD PsGetCurrentThread(VOID) @@ -89,30 +62,53 @@ PETHREAD PsGetCurrentThread(VOID) return((PETHREAD)KeGetCurrentThread()); } -#if CAN_WE_DARE_TO_TRY_THIS -void PsDispatchThread(void) +static VOID PsInsertIntoThreadList(KPRIORITY Priority, PETHREAD Thread) { - int i; + KIRQL oldlvl; - for (i=0; iTcb.Entry); + KeReleaseSpinLock(&ThreadListLock,oldlvl); } -#endif -void PsDispatchThread(void) -/* - * FUNCTION: Chooses a thread, possibly the current one if it is runnable - * and dispatches it - */ +static PETHREAD PsScanThreadList(KPRIORITY Priority) { - KIRQL irql; PLIST_ENTRY current_entry; - PKTHREAD current; + PETHREAD current; + PETHREAD oldest = NULL; + ULONG oldest_time = 0; + + DPRINT("PsScanThreadList(Priority %d)\n",Priority); + + current_entry = PriorityListHead[THREAD_PRIORITY_MAX+Priority].Flink; + while (current_entry != &PriorityListHead[THREAD_PRIORITY_MAX+Priority]) + { + current = CONTAINING_RECORD(current_entry,ETHREAD,Tcb.Entry); + if (current->Tcb.ThreadState == THREAD_STATE_RUNNABLE) + { + if (oldest == NULL || oldest_time > current->Tcb.LastTick) + { + oldest = current; + oldest_time = current->Tcb.LastTick; + } + } + current_entry = current_entry->Flink; + } + DPRINT("PsScanThreadList() = %x\n",oldest); + return(oldest); +} + +VOID PsDispatchThread(VOID) +{ + KPRIORITY CurrentPriority; + PETHREAD Candidate; + KIRQL irql; + LARGE_INTEGER TickCount; + + KeAcquireSpinLock(&ThreadListLock,&irql); if (!DoneInitYet) { @@ -120,61 +116,124 @@ void PsDispatchThread(void) } DPRINT("PsDispatchThread() Current %x\n",CurrentThread); - - /* - * Bump overselves up to a higher IRQ level during this - */ - KeAcquireSpinLock(&ThreadListLock,&irql); - - /* - * If this was an involuntary reschedule then the current thread will still - * be eligible to run later - */ + if (CurrentThread->Tcb.ThreadState==THREAD_STATE_RUNNING) { CurrentThread->Tcb.ThreadState=THREAD_STATE_RUNNABLE; } - /* - * Simple round robin algorithm, iterate through and dispatch the first - * runnable thread - */ - current = CONTAINING_RECORD(ThreadListHead.Flink,KTHREAD,Entry); - current_entry = ThreadListHead.Flink; - - while (current_entry!=(&ThreadListHead)) + for (CurrentPriority=THREAD_PRIORITY_TIME_CRITICAL; + CurrentPriority>=THREAD_PRIORITY_IDLE; + CurrentPriority--) { - DPRINT("Scanning %x ",current); - DPRINT("State %x Runnable %x\n",current->ThreadState, - THREAD_STATE_RUNNABLE); - if (current->ThreadState == THREAD_STATE_RUNNABLE && - current != (PKTHREAD)CurrentThread) - { - 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) @@ -182,67 +241,50 @@ void PsInitThreadManagment(void) * FUNCTION: Initialize thread managment */ { - PETHREAD first_thread; + PETHREAD FirstThread; + ULONG i; + ANSI_STRING AnsiString; + HANDLE FirstThreadHandle; - InitializeListHead(&ThreadListHead); KeInitializeSpinLock(&ThreadListLock); + for (i=0; iTcb.ThreadState = THREAD_STATE_RUNNING; - HalInitFirstTask((PKTHREAD)first_thread); - ExInterlockedInsertHeadList(&ThreadListHead,&first_thread->Tcb.Entry, - &ThreadListLock); - CurrentThread = first_thread; + RtlInitAnsiString(&AnsiString,"Thread"); + RtlAnsiStringToUnicodeString(&PsThreadType->TypeName,&AnsiString,TRUE); + + PsThreadType->TotalObjects = 0; + PsThreadType->TotalHandles = 0; + PsThreadType->MaxObjects = 0; + PsThreadType->MaxHandles = 0; + PsThreadType->PagedPoolCharge = 0; + PsThreadType->NonpagedPoolCharge = sizeof(ETHREAD); + PsThreadType->Dump = NULL; + PsThreadType->Open = NULL; + PsThreadType->Close = NULL; + PsThreadType->Delete = NULL; + PsThreadType->Parse = NULL; + PsThreadType->Security = NULL; + PsThreadType->QueryName = NULL; + PsThreadType->OkayToClose = NULL; + + PsInitializeThread(NULL,&FirstThread,&FirstThreadHandle, + THREAD_ALL_ACCESS,NULL); + HalInitFirstTask(FirstThread); + FirstThread->Tcb.ThreadState = THREAD_STATE_RUNNING; + FirstThread->Tcb.SuspendCount = 0; + + DPRINT("FirstThread %x\n",FirstThread); + + CurrentThread = FirstThread; DoneInitYet = TRUE; } -NTSTATUS PsWakeThread(PETHREAD Thread) -{ - Thread->Tcb.ThreadState = THREAD_STATE_RUNNABLE; - return(STATUS_SUCCESS); -} - -NTSTATUS PsSuspendThread(VOID) -/* - * FUNCTION: Suspend the current thread - */ -{ - KIRQL oldlvl; - - DPRINT("suspending %x\n",CurrentThread); - - /* - * NOTE: When we return from PsDispatchThread the spinlock will be - * released - */ - CurrentThread->Tcb.ThreadState = THREAD_STATE_SUSPENDED; - PsDispatchThread(); - return(STATUS_SUCCESS); -} - - - -NTSTATUS PsTerminateSystemThread(NTSTATUS ExitStatus) -/* - * FUNCTION: Terminates the current thread - * ARGUMENTS: - * ExitStatus = Status to pass to the creater - * RETURNS: Doesn't - */ -{ - KIRQL oldlvl; - - DPRINT("terminating %x\n",CurrentThread); - KeRaiseIrql(DISPATCH_LEVEL,&oldlvl); - CurrentThread->Tcb.ThreadState = THREAD_STATE_TERMINATED; - RemoveEntryList(&CurrentThread->Tcb.Entry); - PsDispatchThread(); - for(;;); -} - NTSTATUS NtCreateThread(PHANDLE ThreadHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, @@ -252,6 +294,50 @@ NTSTATUS NtCreateThread(PHANDLE ThreadHandle, PINITIAL_TEB InitialTeb, BOOLEAN CreateSuspended) { + return(ZwCreateThread(ThreadHandle, + DesiredAccess, + ObjectAttributes, + ProcessHandle, + Client, + ThreadContext, + InitialTeb, + CreateSuspended)); +} + +NTSTATUS ZwCreateThread(PHANDLE ThreadHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes, + HANDLE ProcessHandle, + PCLIENT_ID Client, + PCONTEXT ThreadContext, + PINITIAL_TEB InitialTeb, + BOOLEAN CreateSuspended) +{ + PETHREAD Thread; + NTSTATUS Status; + + Status = PsInitializeThread(ProcessHandle,&Thread,ThreadHandle, + DesiredAccess,ObjectAttributes); + if (Status != STATUS_SUCCESS) + { + return(Status); + } + + HalInitTaskWithContext(Thread,ThreadContext); + Thread->StartAddress=NULL; + + if (Client!=NULL) + { + *Client=Thread->Cid; + } + + if (!CreateSuspended) + { + DPRINT("Not creating suspended\n"); + PsResumeThread(Thread); + } + DPRINT("Finished PsCreateThread()\n"); + return(STATUS_SUCCESS); } NTSTATUS PsCreateSystemThread(PHANDLE ThreadHandle, @@ -278,40 +364,29 @@ NTSTATUS PsCreateSystemThread(PHANDLE ThreadHandle, * RETURNS: Success or failure status */ { - PETHREAD thread; - ULONG ThreadId; - ULONG ProcessId; + PETHREAD Thread; + NTSTATUS Status; - thread = ObGenericCreateObject(ThreadHandle,0,NULL,OBJTYP_THREAD); - DPRINT("Allocating thread %x\n",thread); + DPRINT("PsCreateSystemThread(ThreadHandle %x, ProcessHandle %x)\n", + ThreadHandle,ProcessHandle); - 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); + 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); - if (ProcessHandle!=NULL) - { - thread->ThreadsProcess=ObGetObjectByHandle(ProcessHandle); - } - else - { - thread->ThreadsProcess=&SystemProcess; - } - thread->StartAddress=StartRoutine; - - - ExInterlockedInsertHeadList(&ThreadListHead,&thread->Tcb.Entry, - &ThreadListLock); return(STATUS_SUCCESS); } @@ -321,6 +396,191 @@ LONG KeSetBasePriorityThread(PKTHREAD Thread, LONG Increment) } KPRIORITY KeSetPriorityThread(PKTHREAD Thread, KPRIORITY Priority) +{ + KPRIORITY OldPriority; + OldPriority = Thread->CurrentPriority; + Thread->CurrentPriority = Priority; + + RemoveEntryList(&Thread->Entry); + PsInsertIntoThreadList(Thread->CurrentPriority, + CONTAINING_RECORD(Thread,ETHREAD,Tcb)); + + return(OldPriority); +} + +NTSTATUS STDCALL NtAlertResumeThread(IN HANDLE ThreadHandle, + OUT PULONG SuspendCount) +{ + return(ZwAlertResumeThread(ThreadHandle,SuspendCount)); +} + +NTSTATUS STDCALL ZwAlertResumeThread(IN HANDLE ThreadHandle, + OUT PULONG SuspendCount) { UNIMPLEMENTED; } + +NTSTATUS STDCALL NtAlertThread(IN HANDLE ThreadHandle) +{ + return(ZwAlertThread(ThreadHandle)); +} + +NTSTATUS STDCALL ZwAlertThread(IN HANDLE ThreadHandle) +{ + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtGetContextThread(IN HANDLE ThreadHandle, + OUT PCONTEXT Context) +{ + return(ZwGetContextThread(ThreadHandle,Context)); +} + +NTSTATUS STDCALL ZwGetContextThread(IN HANDLE ThreadHandle, + OUT PCONTEXT Context) +{ + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtOpenThread(OUT PHANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PCLIENT_ID ClientId) +{ + return(ZwOpenThread(ThreadHandle, + DesiredAccess, + ObjectAttributes, + ClientId)); +} + +NTSTATUS STDCALL ZwOpenThread(OUT PHANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PCLIENT_ID ClientId) +{ + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtResumeThread(IN HANDLE ThreadHandle, + IN PULONG SuspendCount) +{ + return(ZwResumeThread(ThreadHandle,SuspendCount)); +} + +NTSTATUS STDCALL ZwResumeThread(IN HANDLE ThreadHandle, + IN PULONG SuspendCount) +/* + * FUNCTION: Decrements a thread's resume count + * ARGUMENTS: + * ThreadHandle = Handle to the thread that should be resumed + * ResumeCount = The resulting resume count. + * REMARK: + * A thread is resumed if its suspend count is 0. This procedure maps to + * the win32 ResumeThread function. ( documentation about the the suspend count can be found here aswell ) + * RETURNS: Status + */ +{ + PETHREAD Thread; + NTSTATUS Status; + + Status = ObReferenceObjectByHandle(ThreadHandle, + THREAD_SUSPEND_RESUME, + PsThreadType, + UserMode, + (PVOID*)&Thread, + NULL); + if (Status != STATUS_SUCCESS) + { + return(Status); + } + + (*SuspendCount) = InterlockedDecrement(&Thread->Tcb.SuspendCount); + if (Thread->Tcb.SuspendCount <= 0) + { + Thread->Tcb.ThreadState = THREAD_STATE_RUNNABLE; + } + + return(STATUS_SUCCESS); +} + +NTSTATUS STDCALL NtSetContextThread(IN HANDLE ThreadHandle, + IN PCONTEXT Context) +{ + return(ZwSetContextThread(ThreadHandle,Context)); +} + +NTSTATUS STDCALL ZwSetContextThread(IN HANDLE ThreadHandle, + IN PCONTEXT Context) +{ + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtSuspendThread(IN HANDLE ThreadHandle, + IN PULONG PreviousSuspendCount) +{ + return(ZwSuspendThread(ThreadHandle,PreviousSuspendCount)); +} + +NTSTATUS STDCALL ZwSuspendThread(IN HANDLE ThreadHandle, + IN PULONG PreviousSuspendCount) +/* + * FUNCTION: Increments a thread's suspend count + * ARGUMENTS: + * ThreadHandle = Handle to the thread that should be resumed + * PreviousSuspendCount = The resulting/previous suspend count. + * REMARK: + * A thread will be suspended if its suspend count is greater than 0. + * This procedure maps to the win32 SuspendThread function. ( + * documentation about the the suspend count can be found here aswell ) + * The suspend count is not increased if it is greater than + * MAXIMUM_SUSPEND_COUNT. + * RETURNS: Status + */ +{ + PETHREAD Thread; + NTSTATUS Status; + + Status = ObReferenceObjectByHandle(ThreadHandle, + THREAD_SUSPEND_RESUME, + PsThreadType, + UserMode, + (PVOID*)&Thread, + NULL); + if (Status != STATUS_SUCCESS) + { + return(Status); + } + + (*PreviousSuspendCount) = InterlockedIncrement(&Thread->Tcb.SuspendCount); + if (Thread->Tcb.SuspendCount > 0) + { + Thread->Tcb.ThreadState = THREAD_STATE_SUSPENDED; + if (Thread == PsGetCurrentThread()) + { + PsDispatchThread(); + } + } + + return(STATUS_SUCCESS); +} + +NTSTATUS STDCALL NtContinue(IN PCONTEXT Context, IN CINT IrqLevel) +{ + return(ZwContinue(Context,IrqLevel)); +} + +NTSTATUS STDCALL ZwContinue(IN PCONTEXT Context, IN CINT IrqLevel) +{ + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtYieldExecution(VOID) +{ + return(ZwYieldExecution()); +} + +NTSTATUS STDCALL ZwYieldExecution(VOID) +{ + PsDispatchThread(); + return(STATUS_SUCCESS); +} diff --git a/reactos/ntoskrnl/rtl/interlck.asm b/reactos/ntoskrnl/rtl/interlck.asm index ba977e77b26..9fca25868ca 100644 --- a/reactos/ntoskrnl/rtl/interlck.asm +++ b/reactos/ntoskrnl/rtl/interlck.asm @@ -1,23 +1,21 @@ bits 32 section .text -global _InterlockedIncrement -_InterlockedIncrement +DECLARE_GLOBAL_SYMBOL InterlockedIncrement mov eax,1 mov ebx,[esp+4] xadd [ebx],eax ret - -global _InterlockedDecrement -_InterlockedDecrement: + + +DECLARE_GLOBAL_SYMBOL InterlockedDecrement mov eax,0xffffffff mov ebx,[esp+4] xadd [ebx],eax dec eax ret -global _InterlockedExchange -_InterlockedExchange: +DECLARE_GLOBAL_SYMBOL InterlockedExchange push ebp mov ebp,esp @@ -34,16 +32,14 @@ _InterlockedExchange: 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] diff --git a/reactos/ntoskrnl/rtl/unicode.c b/reactos/ntoskrnl/rtl/unicode.c index b30b3395d31..a97d8458f42 100644 --- a/reactos/ntoskrnl/rtl/unicode.c +++ b/reactos/ntoskrnl/rtl/unicode.c @@ -20,7 +20,7 @@ #define NDEBUG #include -#define Aa_Difference 'A'-'a'; +#define Aa_Difference ('A'-'a') PUNICODE_STRING RtlDuplicateUnicodeString(PUNICODE_STRING Dest, PUNICODE_STRING Src) @@ -40,12 +40,19 @@ WCHAR wtoupper(WCHAR c) { if((c>='a') && (c<='z')) return c+Aa_Difference; return c; -}; +} + +WCHAR wtolower(WCHAR c) +{ +// DPRINT("c %c (c-Aa_Difference) %c\n",(char)c,(char)(c-Aa_Difference)); + if((c>='A') && (c<='Z')) return c-Aa_Difference; + return c; +} ULONG RtlAnsiStringToUnicodeSize(IN PANSI_STRING AnsiString) { return AnsiString->Length*2; -}; +} NTSTATUS RtlAnsiStringToUnicodeString(IN OUT PUNICODE_STRING DestinationString, IN PANSI_STRING SourceString, IN BOOLEAN AllocateDestinationString) diff --git a/reactos/ntoskrnl/rtl/wstring.c b/reactos/ntoskrnl/rtl/wstring.c index 5065abf8570..baba2dde261 100644 --- a/reactos/ntoskrnl/rtl/wstring.c +++ b/reactos/ntoskrnl/rtl/wstring.c @@ -17,6 +17,39 @@ /* FUNCTIONS *****************************************************************/ +wchar_t * wcsncat(wchar_t * dest,const wchar_t * src,size_t count) +{ + int i,j; + + for (j=0;dest[j]!=0;j++); + for (i=0;i #include #include +#include -#define NDEBUG +//#define NDEBUG #include int ShellChangeDir(char* args); @@ -27,6 +28,7 @@ VOID TstReadLine(ULONG Length, PCHAR Buffer); static HANDLE CurrentDirHandle = NULL; static UNICODE_STRING CurrentDirName = {NULL,0,0}; +static char current_dir_name[255] = {0,}; typedef struct { @@ -43,8 +45,38 @@ command commands[]= /* FUNCTIONS ****************************************************************/ +char* eat_white_space(char* s) +{ + while (isspace(*s)) + { + s++; + } + return(s); +} + int ShellChangeDir(char* args) { + char* end; + ANSI_STRING astr; + OBJECT_ATTRIBUTES attr; + + DPRINT("ShellChangeDir(args %s)\n",args); + + args = eat_white_space(args); + end = strchr(args,' '); + if (end!=NULL) + { + *end=0; + } + strcat(current_dir_name,args); + + DPRINT("current_dir_name %s\n",current_dir_name); + + RtlInitAnsiString(&astr,current_dir_name); + RtlAnsiStringToUnicodeString(&CurrentDirName,&astr,TRUE); + InitializeObjectAttributes(&attr,&CurrentDirName,0,NULL,NULL); + ZwClose(CurrentDirHandle); + ZwOpenDirectoryObject(&CurrentDirHandle,0,&attr); } int ShellListDir(char* args) @@ -54,6 +86,8 @@ int ShellListDir(char* args) ULONG Length; ULONG i; + DbgPrint("ShellListDir(args %s)\n",args); + ZwQueryDirectoryObject(CurrentDirHandle, &(DirObj[0]), sizeof(DirObj), @@ -76,13 +110,18 @@ VOID ShellDisplayPrompt() VOID ShellProcessCommand(char* cmd) { unsigned int i=0; + DbgPrint("Processing cmd '%s'\n",cmd); while (commands[i].name!=NULL) { + DbgPrint("Scanning %s i %d\n",commands[i].name,i); if (strncmp(cmd,commands[i].name,strlen(commands[i].name))==0) { commands[i].fn(cmd+strlen(commands[i].name)); + return; } + i++; } + DbgPrint("Unknown command\n"); } NTSTATUS TstShell(VOID) @@ -96,6 +135,7 @@ NTSTATUS TstShell(VOID) RtlInitAnsiString(&astr,"\\"); RtlAnsiStringToUnicodeString(&CurrentDirName,&astr,TRUE); + strcpy(current_dir_name,"\\"); RtlInitAnsiString(&afilename,"\\"); RtlAnsiStringToUnicodeString(&ufilename,&afilename,TRUE); diff --git a/reactos/ntoskrnl/utils/export/export b/reactos/ntoskrnl/utils/export/export index d1f0f2e09c8..ec862755a22 100644 Binary files a/reactos/ntoskrnl/utils/export/export and b/reactos/ntoskrnl/utils/export/export differ diff --git a/reactos/ntoskrnl/utils/export/export.c b/reactos/ntoskrnl/utils/export/export.c index cc3f5bebb69..4458945b62c 100644 --- a/reactos/ntoskrnl/utils/export/export.c +++ b/reactos/ntoskrnl/utils/export/export.c @@ -43,7 +43,13 @@ int main(int argc, char* argv[]) fprintf(stdout,"*/\n"); fprintf(stdout,"#include \n"); - + fprintf(stdout,"#include \n"); + fprintf(stdout,"#include \n"); + fprintf(stdout,"#include \n"); + fprintf(stdout,"#include \n"); + fprintf(stdout,"#include \n"); + fprintf(stdout,"#include \n"); + while (!feof(stdin)) { read_line(buffer); @@ -60,7 +66,7 @@ int main(int argc, char* argv[]) fprintf(stdout,"#endif\n"); for (j=0;j