This commit was generated by cvs2svn to compensate for changes in r52,

which included commits to RCS files with non-trunk default branches.

svn path=/trunk/; revision=53
This commit is contained in:
Rex Jolliff 1998-10-05 04:01:30 +00:00
parent 645218d5c8
commit ee81c811cd
102 changed files with 7111 additions and 4100 deletions

View file

@ -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

View file

@ -20,8 +20,5 @@ IoInitializeDpc
IoInitializeTimer
IoStartTimer
IoStopTimer
Partially implemented
IoCreateDevice
IoCallDriver

View file

@ -15,7 +15,7 @@
#define NDEBUG
#include <internal/debug.h>
#include "minix_fs.h"
#include "minix.h"
/* FUNCTIONS ***************************************************************/
@ -34,6 +34,7 @@ BOOLEAN MinixReadSector(IN PDEVICE_OBJECT pDeviceObject,
DPRINT("MinixReadSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n",
pDeviceObject,DiskSector,Buffer);
sectorNumber.HighPart = 0;
sectorNumber.LowPart = DiskSector * BLOCKSIZE;
KeInitializeEvent(&event, NotificationEvent, FALSE);
@ -82,3 +83,51 @@ BOOLEAN MinixReadSector(IN PDEVICE_OBJECT pDeviceObject,
ExFreePool(mbr);
return TRUE;
}
BOOLEAN MinixWriteSector(IN PDEVICE_OBJECT pDeviceObject,
IN ULONG DiskSector,
IN UCHAR* Buffer)
{
LARGE_INTEGER sectorNumber;
PIRP irp;
IO_STATUS_BLOCK ioStatus;
KEVENT event;
NTSTATUS status;
ULONG sectorSize;
DPRINT("MinixWriteSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n",
pDeviceObject,DiskSector,Buffer);
sectorNumber.LowPart = DiskSector * BLOCKSIZE;
KeInitializeEvent(&event, NotificationEvent, FALSE);
sectorSize = BLOCKSIZE;
irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE,
pDeviceObject,
Buffer,
sectorSize,
&sectorNumber,
&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;
}

View file

@ -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

View file

@ -43,9 +43,127 @@ extern "C" {
#endif
#endif /* !NULL */
/*
* Definitions needed for the ddk includes (we miss out win32 only stuff to
* cut down on the compile time)
*/
typedef unsigned char UCHAR;
typedef unsigned int UINT;
typedef unsigned long ULONG;
typedef unsigned short USHORT;
typedef unsigned short WCHAR;
typedef unsigned short WORD;
typedef int WINBOOL;
typedef unsigned char BOOLEAN;
typedef unsigned int DWORD; /* was unsigned long */
typedef unsigned short *LPWSTR;
typedef unsigned short *PWSTR;
typedef unsigned char *PUCHAR;
typedef unsigned int *PUINT;
typedef unsigned long *PULONG;
typedef unsigned short *PUSHORT;
typedef void *PVOID;
typedef unsigned char BYTE;
typedef void *LPVOID;
/* Check VOID before defining CHAR, SHORT, and LONG */
#ifndef VOID
#define VOID void
typedef char CHAR;
typedef short SHORT;
typedef long LONG;
#endif
typedef CHAR *PCHAR;
typedef CHAR *PCH;
typedef void *HANDLE;
typedef char CCHAR;
typedef enum _SECURITY_IMPERSONATION_LEVEL {
SecurityAnonymous,
SecurityIdentification,
SecurityImpersonation,
SecurityDelegation
} SECURITY_IMPERSONATION_LEVEL;
typedef enum tagTOKEN_TYPE {
TokenPrimary = 1,
TokenImpersonation
} TOKEN_TYPE;
#define FALSE 0
#define TRUE 1
typedef const unsigned short *PCWSTR;
typedef char* PCSZ;
#define CONST const
#ifdef i386
#define STDCALL __attribute__ ((stdcall))
#define CDECL __attribute((cdecl))
#define CALLBACK WINAPI
#define PASCAL WINAPI
#else
#define STDCALL
#define CDECL
#define CALLBACK
#define PASCAL
#endif
#define WINAPI STDCALL
#define APIENTRY STDCALL
#define WINGDIAPI
typedef BYTE *PBOOLEAN;
typedef HANDLE *PHANDLE;
typedef DWORD CALLBACK (*PTHREAD_START_ROUTINE) (LPVOID);
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
typedef unsigned short ATOM;
#ifdef UNICODE
typedef unsigned short *LPTCH;
typedef unsigned short *LPTSTR;
#else
typedef char *LPTCH;
typedef char *LPTSTR;
#endif /* UNICODE */
typedef long *PLONG;
typedef unsigned short *PWCHAR;
typedef char *LPSTR;
typedef double LONGLONG, *PLONGLONG;
typedef enum _MEDIA_TYPE {
Unknown,
F5_1Pt2_512,
F3_1Pt44_512,
F3_2Pt88_512,
F3_20Pt8_512,
F3_720_512,
F5_360_512,
F5_320_512,
F5_320_1024,
F5_180_512,
F5_160_512,
RemovableMedia,
FixedMedia
} MEDIA_TYPE;
#ifndef max
#define max(a, b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a, b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef WIN32_LEAN_AND_MEAN
#ifndef RC_INVOKED
/* typedef ACMDRIVERENUMCB;
@ -58,30 +176,15 @@ typedef ACMFORMATENUMCB;
typedef ACMFORMATTAGENUMCB;
typedef APPLET_PROC;
*/
typedef unsigned short ATOM;
/* Changed from BOOL to WINBOOL to avoid Objective-C conflict */
typedef int WINBOOL;
typedef unsigned char BOOLEAN;
typedef unsigned char BYTE;
typedef unsigned long CALTYPE;
typedef unsigned long CALID;
typedef char CCHAR;
typedef unsigned long COLORREF;
#define CONST const
/* Check VOID before defining CHAR, SHORT, and LONG */
#ifndef VOID
#define VOID void
typedef char CHAR;
typedef short SHORT;
typedef long LONG;
#endif
/*
typedef CTRYID;
typedef DLGPROC;
*/
typedef unsigned int DWORD; /* was unsigned long */
typedef double DWORDLONG, *PDWORDLONG;
/*
typedef EDITWORDBREAKPROC;
@ -92,7 +195,6 @@ typedef ENUMRESTYPEPROC;
*/
typedef float FLOAT;
/* typedef GLOBALHANDLE; */
typedef void *HANDLE;
typedef HANDLE HACCEL;
typedef HANDLE HBITMAP;
typedef HANDLE HBRUSH;
@ -138,7 +240,6 @@ typedef unsigned short LANGID;
typedef DWORD LCID;
typedef DWORD LCTYPE;
/* typedef LOCALHANDLE */
typedef double LONGLONG, *PLONGLONG;
typedef unsigned short *LP;
typedef long LPARAM;
typedef WINBOOL *LPBOOL;
@ -147,7 +248,6 @@ typedef CONST CHAR *LPCCH;
typedef CHAR *LPCH;
typedef COLORREF *LPCOLORREF;
typedef const char *LPCSTR;
typedef char* PCSZ;
#ifdef UNICODE
typedef const unsigned short *LPCTSTR;
@ -163,41 +263,23 @@ typedef HANDLE *LPHANDLE;
/* typedef LPHANDLER_FUNCTION; */
typedef int *LPINT;
typedef long *LPLONG;
typedef char *LPSTR;
#ifdef UNICODE
typedef unsigned short *LPTCH;
typedef unsigned short *LPTSTR;
#else
typedef char *LPTCH;
typedef char *LPTSTR;
#endif /* UNICODE */
typedef long LRESULT;
typedef void *LPVOID;
typedef const void *LPCVOID;
typedef unsigned short *LPWCH;
typedef unsigned short *LPWORD;
typedef unsigned short *LPWSTR;
typedef unsigned short *PWSTR;
/* typedef NPSTR; */
typedef unsigned short *NWPSTR;
typedef WINBOOL *PWINBOOL;
typedef BYTE *PBOOLEAN;
typedef BYTE *PBYTE;
typedef const CHAR *PCCH;
typedef CHAR *PCH;
typedef CHAR *PCHAR;
typedef const char *PCSTR;
typedef const unsigned short *PCWCH;
typedef const unsigned short *PCWSTR;
typedef DWORD *PDWORD;
typedef float *PFLOAT;
typedef HANDLE *PHANDLE;
/* typedef PHKEY; */
typedef int *PINT;
/* typedef LCID *PLCID; */
typedef long *PLONG;
typedef short *PSHORT;
/* typedef PSID; */
typedef char *PSTR;
@ -215,13 +297,7 @@ typedef char *PTCHAR;
typedef char *PTSTR;
#endif /* UNICODE */
typedef unsigned char *PUCHAR;
typedef unsigned int *PUINT;
typedef unsigned long *PULONG;
typedef unsigned short *PUSHORT;
typedef void *PVOID;
typedef unsigned short *PWCH;
typedef unsigned short *PWCHAR;
typedef unsigned short *PWORD;
/*
typedef PWSTR;
@ -246,30 +322,10 @@ typedef char TCHAR;
typedef BYTE BCHAR;
#endif /* UNICODE */
typedef unsigned char UCHAR;
typedef unsigned int UINT;
typedef unsigned long ULONG;
typedef unsigned short USHORT;
typedef unsigned short WCHAR;
typedef unsigned short WORD;
typedef unsigned int WPARAM;
/* typedef YIELDPROC; */
/* Only use __stdcall under WIN32 compiler */
#ifdef i386
#define STDCALL __attribute__ ((stdcall))
#define CDECL __attribute((cdecl))
#define CALLBACK WINAPI
#define PASCAL WINAPI
#else
#define STDCALL
#define CDECL
#define CALLBACK
#define PASCAL
#endif
#define WINAPI STDCALL
#define APIENTRY STDCALL
#define WINGDIAPI
#define _export
@ -281,21 +337,6 @@ typedef enum _ACL_INFORMATION_CLASS {
AclSizeInformation
} ACL_INFORMATION_CLASS;
typedef enum _MEDIA_TYPE {
Unknown,
F5_1Pt2_512,
F3_1Pt44_512,
F3_2Pt88_512,
F3_20Pt8_512,
F3_720_512,
F5_360_512,
F5_320_512,
F5_320_1024,
F5_180_512,
F5_160_512,
RemovableMedia,
FixedMedia
} MEDIA_TYPE;
#define RASCS_DONE 0x2000
#define RASCS_PAUSED 0x1000
@ -340,13 +381,6 @@ typedef enum _RASPROJECTION {
RASP_PppIp = 0x8021
} RASPROJECTION ;
typedef enum _SECURITY_IMPERSONATION_LEVEL {
SecurityAnonymous,
SecurityIdentification,
SecurityImpersonation,
SecurityDelegation
} SECURITY_IMPERSONATION_LEVEL;
typedef enum _SID_NAME_USE {
SidTypeUser = 1,
SidTypeGroup,
@ -371,11 +405,6 @@ typedef enum _TOKEN_INFORMATION_CLASS {
TokenStatistics
} TOKEN_INFORMATION_CLASS;
typedef enum tagTOKEN_TYPE {
TokenPrimary = 1,
TokenImpersonation
} TOKEN_TYPE;
#endif /* ! defined (RC_INVOKED) */
/*
@ -421,13 +450,6 @@ typedef enum tagTOKEN_TYPE {
#define MAKEROP4(fore,back) (DWORD)((((back) << 8) & 0xFF000000) | (fore))
#define MAKEWPARAM(l, h) ((WPARAM) MAKELONG(l, h))
#ifndef max
#define max(a, b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a, b) (((a) < (b)) ? (a) : (b))
#endif
#define PALETTEINDEX(i) ((COLORREF) (0x01000000 | (DWORD) (WORD) (i)))
#define PALETTERGB(r, g, b) (0x02000000 | RGB(r, g, b))
@ -451,8 +473,6 @@ typedef enum tagTOKEN_TYPE {
typedef int CALLBACK (*BFFCALLBACK) (HWND, UINT, LPARAM, LPARAM);
typedef UINT CALLBACK (*LPCCHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
typedef UINT CALLBACK (*LPCFHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
typedef DWORD CALLBACK (*PTHREAD_START_ROUTINE) (LPVOID);
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
typedef DWORD CALLBACK (*EDITSTREAMCALLBACK) (DWORD, LPBYTE, LONG, LONG);
typedef UINT CALLBACK (*LPFRHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
typedef UINT CALLBACK (*LPOFNHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
@ -565,6 +585,8 @@ typedef DWORD CCSTYLEFLAGA, *PCCSTYLEFLAGA, *LPCCSTYLEFLAGA;
#endif /* ! defined (RC_INVOKED) */
#endif /* WIN32_LEAN_AND_MEAN */
#ifdef __cplusplus
}
#endif /* __cplusplus */

View file

@ -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);

View file

@ -51,76 +51,20 @@ enum
*/
enum
{
/*
* Read any data from the actual backing media
*/
IRP_NOCACHE,
/*
* The I/O operation is performing paging
*/
IRP_PAGING_IO,
/*
* The IRP is for a mount operation
*/
IRP_MOUNT_COMPLETION,
/*
* The API expects synchronous behaviour
*/
IRP_SYNCHRONOUS_API,
/*
* The IRP is associated with a larger operation
*/
IRP_ASSOCIATED_IRP,
/*
* The AssociatedIrp.SystemBuffer field is valid
*/
IRP_BUFFERED_IO,
/*
* The system buffer was allocated from pool and should be deallocated
* by the I/O manager
*/
IRP_DEALLOCATE_BUFFER,
/*
* The IRP is for an input operation
*/
IRP_INPUT_OPERATION,
/*
* The paging operation should complete synchronously
*/
IRP_SYNCHRONOUS_PAGING_IO,
/*
* The IRP represents a filesystem create operation
*/
IRP_CREATE_OPERATION,
/*
* The IRP represents a filesystem read operation
*/
IRP_READ_OPERATION,
/*
* The IRP represents a filesystem write operation
*/
IRP_WRITE_OPERATION,
/*
* The IRP represents a filesystem close operation
*/
IRP_CLOSE_OPERATION,
/*
* Asynchronous behavior is advised but not required
*/
IRP_DEFER_IO_COMPLETION,
IRP_NOCACHE = 0x1,
IRP_PAGING_IO = 0x2,
IRP_MOUNT_COMPLETION = 0x4,
IRP_SYNCHRONOUS_API = 0x8,
IRP_ASSOCIATED_IRP = 0x10,
IRP_BUFFERED_IO = 0x20,
IRP_DEALLOCATE_BUFFER = 0x40,
IRP_INPUT_OPERATION = 0x80,
IRP_SYNCHRONOUS_PAGING_IO = 0x100,
IRP_CREATE_OPERATION = 0x200,
IRP_READ_OPERATION = 0x400,
IRP_WRITE_OPERATION = 0x800,
IRP_CLOSE_OPERATION = 0x1000,
IRP_DEFER_IO_COMPLETION = 0x2000,
};
/*
@ -128,52 +72,27 @@ enum
*/
enum
{
/*
* Force an access check even if opened in kernel mode
*/
SL_FORCE_ACCESS_CHECK,
/*
* The file being opened is a paging file
*/
SL_OPEN_PAGING_FILE,
SL_OPEN_TARGET_DIRECTORY,
SL_CASE_SENSITIVE,
SL_KEY_SPECIFIED,
SL_OVERRIDE_VERIFY_VOLUME,
SL_WRITE_THROUGH,
SL_FT_SEQUENTIAL_WRITE,
SL_FAIL_IMMEDIATELY,
SL_EXCLUSIVE_LOCK,
SL_RESTART_SCAN,
SL_RETURN_SINGLE_ENTRY,
SL_INDEX_SPECIFIED,
SL_WATCH_TREE,
SL_ALLOW_RAW_MOUNT,
SL_PENDING_RETURNED,
SL_FORCE_ACCESS_CHECK = 0x1,
SL_OPEN_PAGING_FILE = 0x2,
SL_OPEN_TARGET_DIRECTORY = 0x4,
SL_CASE_SENSITIVE = 0x8,
SL_KEY_SPECIFIED = 0x10,
SL_OVERRIDE_VERIFY_VOLUME = 0x20,
SL_WRITE_THROUGH = 0x40,
SL_FT_SEQUENTIAL_WRITE = 0x80,
SL_FAIL_IMMEDIATELY = 0x100,
SL_EXCLUSIVE_LOCK = 0x200,
SL_RESTART_SCAN = 0x400,
SL_RETURN_SINGLE_ENTRY = 0x800,
SL_INDEX_SPECIFIED = 0x1000,
SL_WATCH_TREE = 0x2000,
SL_ALLOW_RAW_MOUNT = 0x4000,
};
enum
{
SL_INVOKE_ON_SUCCESS = 1,
SL_INVOKE_ON_ERROR = 2,
SL_INVOKE_ON_CANCEL = 4,
};
#define SL_PENDING_RETURNED 0x01
#define SL_INVOKE_ON_CANCEL 0x20
#define SL_INVOKE_ON_SUCCESS 0x40
#define SL_INVOKE_ON_ERROR 0x80
/*
* Possible flags for the device object flags
@ -187,56 +106,60 @@ enum
/*
* Possible device types
*/
enum
{
/*
* Standard define types
*/
FILE_DEVICE_BEEP,
FILE_DEVICE_CDROM,
FILE_DEVICE_CONTROLLER,
FILE_DEVICE_DISK,
FILE_DEVICE_INPORT_PORT,
FILE_DEVICE_KEYBOARD,
FILE_DEVICE_MIDI_IN,
FILE_DEVICE_MIDI_OUT,
FILE_DEVICE_MOUSE,
FILE_DEVICE_NULL,
FILE_DEVICE_PARALLEL_PORT,
FILE_DEVICE_PRINTER,
FILE_DEVICE_SCANNER,
FILE_DEVICE_SERIAL_MOUSE_PORT,
FILE_DEVICE_SERIAL_PORT,
FILE_DEVICE_SCREEN,
FILE_DEVICE_TAPE,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_VIDEO,
FILE_DEVICE_VIRTUAL_DISK,
FILE_DEVICE_WAVE_IN,
FILE_DEVICE_WAVE_OUT,
FILE_DEVICE_8042_PORT,
FILE_DEVICE_FILE_SYSTEM,
#define FILE_DEVICE_BEEP 0x00000001
#define FILE_DEVICE_CD_ROM 0x00000002
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
#define FILE_DEVICE_CONTROLLER 0x00000004
#define FILE_DEVICE_DATALINK 0x00000005
#define FILE_DEVICE_DFS 0x00000006
#define FILE_DEVICE_DISK 0x00000007
#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
#define FILE_DEVICE_FILE_SYSTEM 0x00000009
#define FILE_DEVICE_INPORT_PORT 0x0000000a
#define FILE_DEVICE_KEYBOARD 0x0000000b
#define FILE_DEVICE_MAILSLOT 0x0000000c
#define FILE_DEVICE_MIDI_IN 0x0000000d
#define FILE_DEVICE_MIDI_OUT 0x0000000e
#define FILE_DEVICE_MOUSE 0x0000000f
#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
#define FILE_DEVICE_NAMED_PIPE 0x00000011
#define FILE_DEVICE_NETWORK 0x00000012
#define FILE_DEVICE_NETWORK_BROWSER 0x00000013
#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
#define FILE_DEVICE_NULL 0x00000015
#define FILE_DEVICE_PARALLEL_PORT 0x00000016
#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
#define FILE_DEVICE_PRINTER 0x00000018
#define FILE_DEVICE_SCANNER 0x00000019
#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
#define FILE_DEVICE_SERIAL_PORT 0x0000001b
#define FILE_DEVICE_SCREEN 0x0000001c
#define FILE_DEVICE_SOUND 0x0000001d
#define FILE_DEVICE_STREAMS 0x0000001e
#define FILE_DEVICE_TAPE 0x0000001f
#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
#define FILE_DEVICE_TRANSPORT 0x00000021
#define FILE_DEVICE_UNKNOWN 0x00000022
#define FILE_DEVICE_VIDEO 0x00000023
#define FILE_DEVICE_VIRTUAL_DISK 0x00000024
#define FILE_DEVICE_WAVE_IN 0x00000025
#define FILE_DEVICE_WAVE_OUT 0x00000026
#define FILE_DEVICE_8042_PORT 0x00000027
#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
#define FILE_DEVICE_BATTERY 0x00000029
#define FILE_DEVICE_BUS_EXTENDER 0x0000002a
#define FILE_DEVICE_MODEM 0x0000002b
#define FILE_DEVICE_VDM 0x0000002c
/*
* Values beyond this are reserved for ISVs
*/
FILE_DEVICE_FIRST_FREE = 32768
};
#define FILE_REMOVABLE_MEDIA 0x00000001
#define FILE_READ_ONLY_DEVICE 0x00000002
#define FILE_FLOPPY_DISKETTE 0x00000004
#define FILE_WRITE_ONCE_MEDIA 0x00000008
#define FILE_REMOTE_DEVICE 0x00000010
#define FILE_DEVICE_IS_MOUNTED 0x00000020
#define FILE_VIRTUAL_VOLUME 0x00000040
/*
* Possible device characteristics
*/
enum
{
FILE_REMOVABLE_MEDIA = 0x1,
FILE_READ_ONLY_DEVICE = 0x2,
FILE_FLOPPY_DISKETTE = 0x4,
FILE_WRITE_ONCE_MEDIA = 0x8,
FILE_REMOTE_DEVICE = 0x10,
};
/*
* PURPOSE: Bus types
*/
@ -286,22 +209,123 @@ enum
IRP_MJ_MAXIMUM_FUNCTION,
};
enum
/*
* PURPOSE: Details about the result of a file open or create
* Minor function numbers for IRP_MJ_FILE_SYSTEM_CONTROL
*/
{
FILE_CREATED,
// FILE_OPENED,
FILE_OVERWRITTEN,
FILE_SUPERSEDED,
FILE_EXISTS,
FILE_DOES_NOT_EXIST,
};
#define IRP_MN_USER_FS_REQUEST 0x00
#define IRP_MN_MOUNT_VOLUME 0x01
#define IRP_MN_VERIFY_VOLUME 0x02
#define IRP_MN_LOAD_FILE_SYSTEM 0x03
#define IO_DISK_INCREMENT 4
#define FILE_WORD_ALIGNMENT 0x0001
/*
* File disposition values
*/
#define FILE_CREATED 0x0000
#define FILE_OPENED 0x0001
#define FILE_OVERWRITTEN 0x0002
#define FILE_SUPERSEDED 0x0003
#define FILE_DOES_NOT_EXIST 0x0004
/*
* file creation flags
*/
#define FILE_DIRECTORY_FILE 0x00000001
#define FILE_WRITE_THROUGH 0x00000002
#define FILE_SEQUENTIAL_ONLY 0x00000004
#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
#define FILE_NON_DIRECTORY_FILE 0x00000040
#define FILE_CREATE_TREE_CONNECTION 0x00000080
#define FILE_COMPLETE_IF_OPLOCKED 0x00000100
#define FILE_NO_EA_KNOWLEDGE 0x00000200
#define FILE_RANDOM_ACCESS 0x00000800
#define FILE_DELETE_ON_CLOSE 0x00001000
#define FILE_OPEN_BY_FILE_ID 0x00002000
#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
#define FILE_NO_COMPRESSION 0x00008000
#define FILE_RESERVE_OPFILTER 0x00100000
#define FILE_TRANSACTED_MODE 0x00200000
#define FILE_OPEN_OFFLINE_FILE 0x00400000
#define FILE_VALID_OPTION_FLAGS 0x007fffff
#define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
#define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
#define FILE_VALID_SET_FLAGS 0x00001036
/*
* file information
*/
#define FileDirectoryInformation 1
#define FileFullDirectoryInformation 2
#define FileBothDirectoryInformation 3
#define FileBasicInformation 4
#define FileStandardInformation 5
#define FileInternalInformation 6
#define FileEaInformation 7
#define FileAccessInformation 8
#define FileNameInformation 9
#define FileRenameInformation 10
#define FileLinkInformation 11
#define FileNamesInformation 12
#define FileDispositionInformation 13
#define FilePositionInformation 14
#define FileFullEaInformation 15
#define FileModeInformation 16
#define FileAlignmentInformation 17
#define FileAllInformation 18
#define FileAllocationInformation 19
#define FileEndOfFileInformation 20
#define FileAlternateNameInformation 21
#define FileStreamInformation 22
#define FilePipeInformation 23
#define FilePipeLocalInformation 24
#define FilePipeRemoteInformation 25
#define FileMailslotQueryInformation 26
#define FileMailslotSetInformation 27
#define FileCompressionInformation 28
#define FileCopyOnWriteInformation 29
#define FileCompletionInformation 30
#define FileMoveClusterInformation 31
#define FileOleClassIdInformation 32
#define FileOleStateBitsInformation 33
#define FileNetworkOpenInformation 34
#define FileObjectIdInformation 35
#define FileOleAllInformation 36
#define FileOleDirectoryInformation 37
#define FileContentIndexInformation 38
#define FileInheritContentIndexInformation 39
#define FileOleInformation 40
#define FileMaximumInformation 41
typedef ULONG FS_INFORMATION_CLASS;
/*
* file system information class values
*/
#define FileFsVolumeInformation 1
#define FileFsLabelInformation 2
#define FileFsSizeInformation 3
#define FileFsDeviceInformation 4
#define FileFsAttributeInformation 5
#define FileFsControlInformation 6
#define FileFsQuotaQueryInformation 7
#define FileFsQuotaSetInformation 8
#define FileFsMaximumInformation 9
#define IRP_MN_QUERY_DIRECTORY 0x01
#define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
#endif

View file

@ -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,

View file

@ -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 */

View file

@ -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
{

View file

@ -1,6 +1,13 @@
/* MEMORY MANAGMENT ******************************************************/
#include <internal/hal/page.h>
#include <internal/mmhal.h>
BOOLEAN MmIsNonPagedSystemAddressValid(PVOID VirtualAddress);
BOOLEAN MmIsThisAnNtAsSystem(VOID);
#define PAGE_ROUND_UP(x) ( (((ULONG)x)%PAGESIZE) ? ((((ULONG)x)&(~0xfff))+0x1000) : ((ULONG)x) )
#define PAGE_ROUND_DOWN(x) (((ULONG)x)&(~0xfff))
/*
* FUNCTION: Determines if the given virtual address is page aligned

View file

@ -22,13 +22,6 @@ extern "C"
#define QUAD_PART(LI) (*(LONGLONG *)(&LI))
#define IO_DISK_INCREMENT 4
#define FILE_WORD_ALIGNMENT 0x0001
#define FILE_OPENED 0x0001
#include <ddk/status.h>
#include <ddk/ntdef.h>
#include <ddk/defines.h>
@ -41,6 +34,7 @@ extern "C"
#include <ddk/iotypes.h>
#include <ddk/extypes.h>
#include <ddk/pstypes.h>
#include <ddk/zwtypes.h>
#include <ddk/ioctrl.h>
#include <internal/hal/ddk.h>
@ -53,6 +47,7 @@ extern "C"
#include <ddk/psfuncs.h>
#include <ddk/obfuncs.h>
#include <ddk/dbgfuncs.h>
#include <ddk/sefuncs.h>
#ifdef __cplusplus
};

View file

@ -6,5 +6,8 @@ struct _ETHREAD;
struct _EPROCESS;
#define NTKERNELAPI
#define NTSYSAPI
#define NTAPI
#endif

View file

@ -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

View file

@ -96,27 +96,13 @@ typedef struct _OBJECT
* PURPOSE: Header for every object managed by the object manager
*/
{
/*
* PURPOSE: Name of this entry
*/
UNICODE_STRING name;
/*
* PURPOSE: Our entry in our parents list of subdirectory
*/
LIST_ENTRY entry;
/*
* PURPOSE: Number of non-handle references to this object
*/
UNICODE_STRING Name;
LIST_ENTRY Entry;
ULONG RefCount;
/*
* PURPOSE: Number of handles opened to this object
*/
ULONG HandleCount;
BOOLEAN Permanent;
struct _DIRECTORY_OBJECT* Parent;
POBJECT_TYPE ObjectType;
/*
* PURPOSE: Object type
@ -141,3 +127,9 @@ typedef struct _OBJECT_ATTRIBUTES {
SECURITY_DESCRIPTOR *SecurityDescriptor;
SECURITY_QUALITY_OF_SERVICE *SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
typedef struct _HANDLE_TABLE
{
LIST_ENTRY ListHead;
KSPIN_LOCK ListLock;
} HANDLE_TABLE, *PHANDLE_TABLE;

View file

@ -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);

View file

@ -131,7 +131,7 @@ typedef struct _KTHREAD
ULONG Quantum;
UCHAR ThreadState; //Thread state is a typeless enum, otherwise it should be const integer
ULONG FreezeCount;
ULONG SuspendCount;
LONG SuspendCount;
PTRAP_FRAME TrapFrame;
PVOID *Tls;
KWAIT_BLOCK WaitBlock[4];
@ -149,6 +149,7 @@ typedef struct _KTHREAD
*/
hal_thread_state Context;
LIST_ENTRY Entry;
ULONG LastTick;
} KTHREAD, *PKTHREAD;
@ -255,7 +256,8 @@ typedef struct _ETHREAD {
} ETHREAD, *PETHREAD;
typedef struct _KPROCESS {
typedef struct _KPROCESS
{
DISPATCHER_HEADER DispatcherHeader;
PVOID PageTableDirectory; // FIXME: I shoud point to a PTD
TIME ElapsedTime;
@ -275,6 +277,7 @@ typedef struct _KPROCESS {
* Added by David Welch (welch@mcmail.com)
*/
LIST_ENTRY MemoryAreaList;
HANDLE_TABLE HandleTable;
} KPROCESS, *PKPROCESS;
typedef struct _EPROCESS

View file

@ -14,10 +14,6 @@
typedef ULONG ACCESS_MODE, *PACCESS_MODE;
typedef SECURITY_QUALITY_OF_SERVICE* PSECURITY_QUALITY_OF_SERVICE;
typedef struct _SECURITY_SUBJECT_CONTEXT
{
} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
typedef struct _SECURITY_DESCRIPTOR_CONTEXT
{
} SECURITY_DESCRIPTOR_CONTEXT, *PSECURITY_DESCRIPTOR_CONTEXT;
@ -44,4 +40,13 @@ typedef struct _ACCESS_TOKEN {
UCHAR VariablePart[0];
} ACCESS_TOKEN, *PACCESS_TOKEN;
typedef struct _SECURITY_SUBJECT_CONTEXT
{
PACCESS_TOKEN ClientToken;
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
PACCESS_TOKEN PrimaryToken;
PVOID ProcessAuditId;
} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
#endif

File diff suppressed because it is too large Load diff

View file

@ -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 */

View file

@ -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 */

View file

@ -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);

View file

@ -51,6 +51,7 @@ typedef struct
unsigned char io_bitmap[1];
} hal_thread_state;
/*
* FUNCTION: Probes for a PCI bus
* RETURNS: True if found

View file

@ -14,6 +14,10 @@
#include <ddk/ntddk.h>
#include <internal/ob.h>
extern POBJECT_TYPE IoDeviceType;
extern POBJECT_TYPE IoFileType;
extern POBJECT_TYPE IoSymbolicLinkType;
/*
* FUNCTION: Called to initalize a loaded driver
* ARGUMENTS:
@ -36,5 +40,9 @@ PIRP IoBuildFilesystemControlRequest(ULONG MinorFunction,
PKEVENT UserEvent,
PIO_STATUS_BLOCK IoStatusBlock,
PDEVICE_OBJECT DeviceToMount);
NTSTATUS IoPageRead(PFILE_OBJECT FileObject,
PVOID Address,
PLARGE_INTEGER Offset,
PIO_STATUS_BLOCK StatusBlock);
VOID IoSecondStageCompletion(PIRP Irp, CCHAR PriorityBoost);
#endif

View file

@ -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);

View file

@ -5,8 +5,6 @@
#ifndef __INCLUDE_INTERNAL_MM_H
#define __INCLUDE_INTERNAL_MM_H
#define PAGE_SYSTEM (0x80000000)
#include <internal/linkage.h>
#include <internal/ntoskrnl.h>
#include <windows.h>
@ -16,25 +14,31 @@
enum
{
MEMORY_AREA_INVALID,
MEMORY_AREA_SECTION_VIEW,
MEMORY_AREA_SECTION_VIEW_COMMIT,
MEMORY_AREA_CONTINUOUS_MEMORY,
MEMORY_AREA_NO_CACHE,
MEMORY_AREA_IO_MAPPING,
MEMORY_AREA_SYSTEM,
MEMORY_AREA_MDL_MAPPING,
MEMORY_AREA_COMMIT,
MEMORY_AREA_RESERVE,
MEMORY_AREA_SECTION_VIEW_RESERVE,
};
typedef struct
{
CSHORT Type;
CSHORT Size;
FILE_OBJECT* File;
} SECTION_OBJECT;
LARGE_INTEGER MaximumSize;
ULONG SectionPageProtection;
ULONG AllocateAttributes;
PFILE_OBJECT FileObject;
} SECTION_OBJECT, *PSECTION_OBJECT;
typedef struct
{
ULONG Type;
ULONG BaseAddress;
PVOID BaseAddress;
ULONG Length;
ULONG Attributes;
LIST_ENTRY Entry;
@ -47,22 +51,28 @@ typedef struct
ULONG ViewOffset;
} SectionData;
} Data;
} MEMORY_AREA;
} MEMORY_AREA, *PMEMORY_AREA;
NTSTATUS MmCreateMemoryArea(KPROCESSOR_MODE Mode,
PEPROCESS Process,
ULONG Type,
PULONG BaseAddress,
PVOID* BaseAddress,
ULONG Length,
ULONG Attributes,
MEMORY_AREA** Result);
MEMORY_AREA* MmOpenMemoryAreaByAddress(ULONG Address);
MEMORY_AREA* MmOpenMemoryAreaByAddress(PEPROCESS Process, PVOID Address);
NTSTATUS MmInitMemoryAreas(VOID);
VOID ExInitNonPagedPool(ULONG BaseAddress);
NTSTATUS MmFreeMemoryArea(PVOID BaseAddress,
NTSTATUS MmFreeMemoryArea(PEPROCESS Process,
PVOID BaseAddress,
ULONG Length,
BOOLEAN FreePages);
VOID MmDumpMemoryAreas(VOID);
VOID MmDumpMemoryAreas(PLIST_ENTRY ListHead);
NTSTATUS MmLockMemoryArea(MEMORY_AREA* MemoryArea);
NTSTATUS MmUnlockMemoryArea(MEMORY_AREA* MemoryArea);
NTSTATUS MmInitSectionImplementation(VOID);
/*
* FUNCTION: Gets a page with a restricted max physical address (i.e.
@ -96,4 +106,13 @@ void mark_page_not_writable(unsigned int vaddr);
void VirtualInit(boot_param* bp);
#define MM_LOWEST_USER_ADDRESS (4096)
PMEMORY_AREA MmSplitMemoryArea(PEPROCESS Process,
PMEMORY_AREA OriginalMemoryArea,
PVOID BaseAddress,
ULONG Length,
ULONG NewType,
ULONG NewAttributes);
#endif

View file

@ -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 */

View file

@ -5,7 +5,7 @@
#include <internal/linkage.h>
static PVOID ExAllocatePagedPool(POOL_TYPE Type, ULONG size);
static PVOID ExAllocateNonPagedPool(POOL_TYPE Type, ULONG size);
PVOID ExAllocatePagedPoolWithTag(POOL_TYPE Type, ULONG size, ULONG Tag);
PVOID ExAllocateNonPagedPoolWithTag(POOL_TYPE Type, ULONG size, ULONG Tag);
#endif /* __INTERNAL_POOL_H */

View file

@ -3,12 +3,16 @@
#include <internal/hal.h>
extern EPROCESS SystemProcess;
extern PEPROCESS SystemProcess;
extern HANDLE SystemProcessHandle;
extern POBJECT_TYPE PsThreadType;
extern POBJECT_TYPE PsProcessType;
void PsInitThreadManagment(void);
VOID PsInitProcessManagment(VOID);
VOID PsInitIdleThread(VOID);
VOID PsDispatchThread(VOID);
/*
* PURPOSE: Thread states
@ -45,9 +49,9 @@ enum
* Functions the HAL must provide
*/
void HalInitFirstTask(PKTHREAD thread);
BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn,
PVOID StartContext);
void HalInitFirstTask(PETHREAD thread);
BOOLEAN HalInitTask(PETHREAD thread, PKSTART_ROUTINE fn, PVOID StartContext);
void HalTaskSwitch(PKTHREAD thread);
NTSTATUS HalInitTaskWithContext(PETHREAD Thread, PCONTEXT Context);
#endif

View file

@ -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

View file

@ -105,6 +105,4 @@ typedef struct __HEAP
HEAP_BLOCK Start __attribute__((aligned (8)));
} HEAP, *PHEAP;
//PHEAP __ProcessHeap;
#endif /* __INCLUDE_KERNEL32_HEAP_H */

View file

@ -32,6 +32,334 @@
#ifndef _GNU_H_WINDOWS32_STRUCTURES
#define _GNU_H_WINDOWS32_STRUCTURES
typedef struct _LARGE_INTEGER {
DWORD LowPart;
LONG HighPart;
} LARGE_INTEGER, *PLARGE_INTEGER;
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY;
typedef DWORD ACCESS_MASK;
typedef struct _SID_IDENTIFIER_AUTHORITY {
BYTE Value[6];
} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY,
*LPSID_IDENTIFIER_AUTHORITY;
typedef struct _ACL {
BYTE AclRevision;
BYTE Sbz1;
WORD AclSize;
WORD AceCount;
WORD Sbz2;
} ACL, *PACL;
typedef struct _SID {
BYTE Revision;
BYTE SubAuthorityCount;
SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
DWORD SubAuthority[ANYSIZE_ARRAY];
} SID, *PSID;
typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
typedef struct _SECURITY_DESCRIPTOR {
BYTE Revision;
BYTE Sbz1;
SECURITY_DESCRIPTOR_CONTROL Control;
PSID Owner;
PSID Group;
PACL Sacl;
PACL Dacl;
} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
typedef struct _SECURITY_QUALITY_OF_SERVICE {
DWORD Length;
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
/* SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode; */
WINBOOL ContextTrackingMode;
BOOLEAN EffectiveOnly;
} SECURITY_QUALITY_OF_SERVICE;
typedef LARGE_INTEGER LUID, *PLUID;
typedef struct _TOKEN_SOURCE {
CHAR SourceName[8];
LUID SourceIdentifier;
} TOKEN_SOURCE;
typedef struct _PARTITION_INFORMATION {
BYTE PartitionType;
BOOLEAN BootIndicator;
BOOLEAN RecognizedPartition;
BOOLEAN RewritePartition;
LARGE_INTEGER StartingOffset;
LARGE_INTEGER PartitionLength;
LARGE_INTEGER HiddenSectors;
} PARTITION_INFORMATION ;
typedef struct _SINGLE_LIST_ENTRY {
struct _SINGLE_LIST_ENTRY *Next;
} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
typedef struct _CRITICAL_SECTION_DEBUG {
WORD Type;
WORD CreatorBackTraceIndex;
struct _CRITICAL_SECTION *CriticalSection;
LIST_ENTRY ProcessLocksList;
DWORD EntryCount;
DWORD ContentionCount;
DWORD Depth;
PVOID OwnerBackTrace[ 5 ];
} CRITICAL_SECTION_DEBUG, *PCRITICAL_SECTION_DEBUG;
typedef struct _CRITICAL_SECTION {
PCRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
DWORD Reserved;
} CRITICAL_SECTION, *PCRITICAL_SECTION, *LPCRITICAL_SECTION;
typedef struct _ULARGE_INTEGER {
DWORD LowPart;
DWORD HighPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;
typedef struct _GENERIC_MAPPING {
ACCESS_MASK GenericRead;
ACCESS_MASK GenericWrite;
ACCESS_MASK GenericExecute;
ACCESS_MASK GenericAll;
} GENERIC_MAPPING, *PGENERIC_MAPPING;
typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid;
DWORD Attributes;
} LUID_AND_ATTRIBUTES;
typedef struct _PRIVILEGE_SET {
DWORD PrivilegeCount;
DWORD Control;
LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
} PRIVILEGE_SET, *PPRIVILEGE_SET, *LPPRIVILEGE_SET;
#ifdef __i386__
typedef struct _FLOATING_SAVE_AREA {
DWORD ControlWord;
DWORD StatusWord;
DWORD TagWord;
DWORD ErrorOffset;
DWORD ErrorSelector;
DWORD DataOffset;
DWORD DataSelector;
BYTE RegisterArea[80];
DWORD Cr0NpxState;
} FLOATING_SAVE_AREA;
typedef struct _CONTEXT {
DWORD ContextFlags;
DWORD Dr0;
DWORD Dr1;
DWORD Dr2;
DWORD Dr3;
DWORD Dr6;
DWORD Dr7;
FLOATING_SAVE_AREA FloatSave;
DWORD SegGs;
DWORD SegFs;
DWORD SegEs;
DWORD SegDs;
DWORD Edi;
DWORD Esi;
DWORD Ebx;
DWORD Edx;
DWORD Ecx;
DWORD Eax;
DWORD Ebp;
DWORD Eip;
DWORD SegCs;
DWORD EFlags;
DWORD Esp;
DWORD SegSs;
} CONTEXT, *PCONTEXT, *LPCONTEXT;
#else /* __ppc__ */
typedef struct
{
/* Floating point registers returned when CONTEXT_FLOATING_POINT is set */
double Fpr0;
double Fpr1;
double Fpr2;
double Fpr3;
double Fpr4;
double Fpr5;
double Fpr6;
double Fpr7;
double Fpr8;
double Fpr9;
double Fpr10;
double Fpr11;
double Fpr12;
double Fpr13;
double Fpr14;
double Fpr15;
double Fpr16;
double Fpr17;
double Fpr18;
double Fpr19;
double Fpr20;
double Fpr21;
double Fpr22;
double Fpr23;
double Fpr24;
double Fpr25;
double Fpr26;
double Fpr27;
double Fpr28;
double Fpr29;
double Fpr30;
double Fpr31;
double Fpscr;
/* Integer registers returned when CONTEXT_INTEGER is set. */
DWORD Gpr0;
DWORD Gpr1;
DWORD Gpr2;
DWORD Gpr3;
DWORD Gpr4;
DWORD Gpr5;
DWORD Gpr6;
DWORD Gpr7;
DWORD Gpr8;
DWORD Gpr9;
DWORD Gpr10;
DWORD Gpr11;
DWORD Gpr12;
DWORD Gpr13;
DWORD Gpr14;
DWORD Gpr15;
DWORD Gpr16;
DWORD Gpr17;
DWORD Gpr18;
DWORD Gpr19;
DWORD Gpr20;
DWORD Gpr21;
DWORD Gpr22;
DWORD Gpr23;
DWORD Gpr24;
DWORD Gpr25;
DWORD Gpr26;
DWORD Gpr27;
DWORD Gpr28;
DWORD Gpr29;
DWORD Gpr30;
DWORD Gpr31;
DWORD Cr; /* Condition register */
DWORD Xer; /* Fixed point exception register */
/* The following are set when CONTEXT_CONTROL is set. */
DWORD Msr; /* Machine status register */
DWORD Iar; /* Instruction address register */
DWORD Lr; /* Link register */
DWORD Ctr; /* Control register */
/* Control which context values are returned */
DWORD ContextFlags;
DWORD Fill[3];
/* Registers returned if CONTEXT_DEBUG_REGISTERS is set. */
DWORD Dr0; /* Breakpoint Register 1 */
DWORD Dr1; /* Breakpoint Register 2 */
DWORD Dr2; /* Breakpoint Register 3 */
DWORD Dr3; /* Breakpoint Register 4 */
DWORD Dr4; /* Breakpoint Register 5 */
DWORD Dr5; /* Breakpoint Register 6 */
DWORD Dr6; /* Debug Status Register */
DWORD Dr7; /* Debug Control Register */
} CONTEXT, *PCONTEXT, *LPCONTEXT;
#endif
typedef struct value_ent {
LPTSTR ve_valuename;
DWORD ve_valuelen;
DWORD ve_valueptr;
DWORD ve_type;
} VALENT, *PVALENT;
typedef struct _EXCEPTION_RECORD {
DWORD ExceptionCode;
DWORD ExceptionFlags;
struct _EXCEPTION_RECORD *ExceptionRecord;
PVOID ExceptionAddress;
DWORD NumberParameters;
DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD, *PEXCEPTION_RECORD, *LPEXCEPTION_RECORD;
typedef struct _DRIVE_LAYOUT_INFORMATION {
DWORD PartitionCount;
DWORD Signature;
PARTITION_INFORMATION PartitionEntry[1];
} DRIVE_LAYOUT_INFORMATION;
typedef struct _KEY_EVENT_RECORD {
WINBOOL bKeyDown;
WORD wRepeatCount;
WORD wVirtualKeyCode;
WORD wVirtualScanCode;
char AsciiChar;
char pad;
#if 0
union {
WCHAR UnicodeChar;
CHAR AsciiChar;
} uChar;
#endif
DWORD dwControlKeyState;
} KEY_EVENT_RECORD PACKED;
typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD;
typedef struct _MOUSE_EVENT_RECORD {
COORD dwMousePosition;
DWORD dwButtonState;
DWORD dwControlKeyState;
DWORD dwEventFlags;
} MOUSE_EVENT_RECORD;
typedef struct _DISK_GEOMETRY {
LARGE_INTEGER Cylinders;
MEDIA_TYPE MediaType;
DWORD TracksPerCylinder;
DWORD SectorsPerTrack;
DWORD BytesPerSector;
} DISK_GEOMETRY ;
#ifndef WIN32_LEAN_AND_MEAN
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
@ -60,7 +388,6 @@ typedef struct _ACE_HEADER {
WORD AceSize;
} ACE_HEADER;
typedef DWORD ACCESS_MASK;
typedef ACCESS_MASK REGSAM;
typedef struct _ACCESS_ALLOWED_ACE {
@ -81,14 +408,6 @@ typedef struct tagACCESSTIMEOUT {
DWORD iTimeOutMSec;
} ACCESSTIMEOUT;
typedef struct _ACL {
BYTE AclRevision;
BYTE Sbz1;
WORD AclSize;
WORD AceCount;
WORD Sbz2;
} ACL, *PACL;
typedef struct _ACL_REVISION_INFORMATION {
DWORD AclRevision;
} ACL_REVISION_INFORMATION;
@ -629,11 +948,6 @@ typedef struct _CONSOLE_CURSOR_INFO {
WINBOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD;
typedef struct _SMALL_RECT {
SHORT Left;
SHORT Top;
@ -649,183 +963,6 @@ typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
COORD dwMaximumWindowSize;
} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO ;
#ifdef __i386__
typedef struct _FLOATING_SAVE_AREA {
DWORD ControlWord;
DWORD StatusWord;
DWORD TagWord;
DWORD ErrorOffset;
DWORD ErrorSelector;
DWORD DataOffset;
DWORD DataSelector;
BYTE RegisterArea[80];
DWORD Cr0NpxState;
} FLOATING_SAVE_AREA;
typedef struct _CONTEXT {
DWORD ContextFlags;
DWORD Dr0;
DWORD Dr1;
DWORD Dr2;
DWORD Dr3;
DWORD Dr6;
DWORD Dr7;
FLOATING_SAVE_AREA FloatSave;
DWORD SegGs;
DWORD SegFs;
DWORD SegEs;
DWORD SegDs;
DWORD Edi;
DWORD Esi;
DWORD Ebx;
DWORD Edx;
DWORD Ecx;
DWORD Eax;
DWORD Ebp;
DWORD Eip;
DWORD SegCs;
DWORD EFlags;
DWORD Esp;
DWORD SegSs;
} CONTEXT, *PCONTEXT, *LPCONTEXT;
#else /* __ppc__ */
typedef struct
{
/* Floating point registers returned when CONTEXT_FLOATING_POINT is set */
double Fpr0;
double Fpr1;
double Fpr2;
double Fpr3;
double Fpr4;
double Fpr5;
double Fpr6;
double Fpr7;
double Fpr8;
double Fpr9;
double Fpr10;
double Fpr11;
double Fpr12;
double Fpr13;
double Fpr14;
double Fpr15;
double Fpr16;
double Fpr17;
double Fpr18;
double Fpr19;
double Fpr20;
double Fpr21;
double Fpr22;
double Fpr23;
double Fpr24;
double Fpr25;
double Fpr26;
double Fpr27;
double Fpr28;
double Fpr29;
double Fpr30;
double Fpr31;
double Fpscr;
/* Integer registers returned when CONTEXT_INTEGER is set. */
DWORD Gpr0;
DWORD Gpr1;
DWORD Gpr2;
DWORD Gpr3;
DWORD Gpr4;
DWORD Gpr5;
DWORD Gpr6;
DWORD Gpr7;
DWORD Gpr8;
DWORD Gpr9;
DWORD Gpr10;
DWORD Gpr11;
DWORD Gpr12;
DWORD Gpr13;
DWORD Gpr14;
DWORD Gpr15;
DWORD Gpr16;
DWORD Gpr17;
DWORD Gpr18;
DWORD Gpr19;
DWORD Gpr20;
DWORD Gpr21;
DWORD Gpr22;
DWORD Gpr23;
DWORD Gpr24;
DWORD Gpr25;
DWORD Gpr26;
DWORD Gpr27;
DWORD Gpr28;
DWORD Gpr29;
DWORD Gpr30;
DWORD Gpr31;
DWORD Cr; /* Condition register */
DWORD Xer; /* Fixed point exception register */
/* The following are set when CONTEXT_CONTROL is set. */
DWORD Msr; /* Machine status register */
DWORD Iar; /* Instruction address register */
DWORD Lr; /* Link register */
DWORD Ctr; /* Control register */
/* Control which context values are returned */
DWORD ContextFlags;
DWORD Fill[3];
/* Registers returned if CONTEXT_DEBUG_REGISTERS is set. */
DWORD Dr0; /* Breakpoint Register 1 */
DWORD Dr1; /* Breakpoint Register 2 */
DWORD Dr2; /* Breakpoint Register 3 */
DWORD Dr3; /* Breakpoint Register 4 */
DWORD Dr4; /* Breakpoint Register 5 */
DWORD Dr5; /* Breakpoint Register 6 */
DWORD Dr6; /* Debug Status Register */
DWORD Dr7; /* Debug Control Register */
} CONTEXT, *PCONTEXT, *LPCONTEXT;
#endif
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY;
typedef struct _CRITICAL_SECTION_DEBUG {
WORD Type;
WORD CreatorBackTraceIndex;
struct _CRITICAL_SECTION *CriticalSection;
LIST_ENTRY ProcessLocksList;
DWORD EntryCount;
DWORD ContentionCount;
DWORD Depth;
PVOID OwnerBackTrace[ 5 ];
} CRITICAL_SECTION_DEBUG, *PCRITICAL_SECTION_DEBUG;
typedef struct _CRITICAL_SECTION {
PCRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
DWORD Reserved;
} CRITICAL_SECTION, *PCRITICAL_SECTION, *LPCRITICAL_SECTION;
typedef struct _SECURITY_QUALITY_OF_SERVICE {
DWORD Length;
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
/* SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode; */
WINBOOL ContextTrackingMode;
BOOLEAN EffectiveOnly;
} SECURITY_QUALITY_OF_SERVICE;
typedef struct tagCONVCONTEXT {
UINT cb;
UINT wFlags;
@ -1009,15 +1146,6 @@ typedef struct {
BYTE rgb[1];
} DDEUP;
typedef struct _EXCEPTION_RECORD {
DWORD ExceptionCode;
DWORD ExceptionFlags;
struct _EXCEPTION_RECORD *ExceptionRecord;
PVOID ExceptionAddress;
DWORD NumberParameters;
DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD, *PEXCEPTION_RECORD, *LPEXCEPTION_RECORD;
typedef struct _EXCEPTION_DEBUG_INFO {
EXCEPTION_RECORD ExceptionRecord;
DWORD dwFirstChance;
@ -1177,19 +1305,6 @@ typedef struct tagDIBSECTION {
DWORD dsOffset;
} DIBSECTION;
typedef struct _LARGE_INTEGER {
DWORD LowPart;
LONG HighPart;
} LARGE_INTEGER, *PLARGE_INTEGER;
typedef struct _DISK_GEOMETRY {
LARGE_INTEGER Cylinders;
MEDIA_TYPE MediaType;
DWORD TracksPerCylinder;
DWORD SectorsPerTrack;
DWORD BytesPerSector;
} DISK_GEOMETRY ;
typedef struct _DISK_PERFORMANCE {
LARGE_INTEGER BytesRead;
LARGE_INTEGER BytesWritten;
@ -1274,21 +1389,7 @@ typedef struct {
UINT uiLengthDrawn;
} DRAWTEXTPARAMS, *LPDRAWTEXTPARAMS;
typedef struct _PARTITION_INFORMATION {
BYTE PartitionType;
BOOLEAN BootIndicator;
BOOLEAN RecognizedPartition;
BOOLEAN RewritePartition;
LARGE_INTEGER StartingOffset;
LARGE_INTEGER PartitionLength;
LARGE_INTEGER HiddenSectors;
} PARTITION_INFORMATION ;
typedef struct _DRIVE_LAYOUT_INFORMATION {
DWORD PartitionCount;
DWORD Signature;
PARTITION_INFORMATION PartitionEntry[1];
} DRIVE_LAYOUT_INFORMATION;
typedef struct _DRIVER_INFO_1 {
LPTSTR pName;
@ -2255,12 +2356,6 @@ typedef struct tagGCP_RESULTS {
UINT nMaxFit;
} GCP_RESULTS, *LPGCP_RESULTS;
typedef struct _GENERIC_MAPPING {
ACCESS_MASK GenericRead;
ACCESS_MASK GenericWrite;
ACCESS_MASK GenericExecute;
ACCESS_MASK GenericAll;
} GENERIC_MAPPING, *PGENERIC_MAPPING;
typedef struct _GLYPHMETRICS {
UINT gmBlackBoxX;
@ -2366,30 +2461,6 @@ typedef struct _IMAGEINFO {
RECT rcImage;
} IMAGEINFO;
typedef struct _KEY_EVENT_RECORD {
WINBOOL bKeyDown;
WORD wRepeatCount;
WORD wVirtualKeyCode;
WORD wVirtualScanCode;
char AsciiChar;
char pad;
#if 0
union {
WCHAR UnicodeChar;
CHAR AsciiChar;
} uChar;
#endif
DWORD dwControlKeyState;
} KEY_EVENT_RECORD PACKED;
typedef struct _MOUSE_EVENT_RECORD {
COORD dwMousePosition;
DWORD dwButtonState;
DWORD dwControlKeyState;
DWORD dwEventFlags;
} MOUSE_EVENT_RECORD;
typedef struct _WINDOW_BUFFER_SIZE_RECORD {
COORD dwSize;
} WINDOW_BUFFER_SIZE_RECORD;
@ -2439,29 +2510,6 @@ typedef struct _JOB_INFO_1 {
SYSTEMTIME Submitted;
} JOB_INFO_1;
typedef struct _SID_IDENTIFIER_AUTHORITY {
BYTE Value[6];
} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY,
*LPSID_IDENTIFIER_AUTHORITY;
typedef struct _SID {
BYTE Revision;
BYTE SubAuthorityCount;
SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
DWORD SubAuthority[ANYSIZE_ARRAY];
} SID, *PSID;
typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
typedef struct _SECURITY_DESCRIPTOR {
BYTE Revision;
BYTE Sbz1;
SECURITY_DESCRIPTOR_CONTROL Control;
PSID Owner;
PSID Group;
PACL Sacl;
PACL Dacl;
} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
typedef struct _JOB_INFO_2 {
DWORD JobId;
@ -2541,12 +2589,7 @@ typedef struct _LOCALGROUP_MEMBERS_INFO_3 {
typedef long FXPT16DOT16, * LPFXPT16DOT16;
typedef LARGE_INTEGER LUID, *PLUID;
typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid;
DWORD Attributes;
} LUID_AND_ATTRIBUTES;
typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
@ -3472,11 +3515,6 @@ typedef struct _PRINTPROCESSOR_INFO_1 {
LPTSTR pName;
} PRINTPROCESSOR_INFO_1;
typedef struct _PRIVILEGE_SET {
DWORD PrivilegeCount;
DWORD Control;
LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
} PRIVILEGE_SET, *PPRIVILEGE_SET, *LPPRIVILEGE_SET;
typedef struct _PROCESS_HEAP_ENTRY {
PVOID lpData;
@ -3839,9 +3877,6 @@ typedef struct _SID_AND_ATTRIBUTES {
typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
typedef struct _SINGLE_LIST_ENTRY {
struct _SINGLE_LIST_ENTRY *Next;
} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
typedef struct tagSOUNDSENTRY {
UINT cbSize;
@ -4084,11 +4119,6 @@ typedef struct tagTOGGLEKEYS {
DWORD dwFlags;
} TOGGLEKEYS;
typedef struct _TOKEN_SOURCE {
CHAR SourceName[8];
LUID SourceIdentifier;
} TOKEN_SOURCE;
typedef struct _TOKEN_CONTROL {
LUID TokenId;
LUID AuthenticationId;
@ -4217,11 +4247,6 @@ typedef struct {
UINT nInc;
} UDACCEL;
typedef struct _ULARGE_INTEGER {
DWORD LowPart;
DWORD HighPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;
typedef struct _UNIVERSAL_NAME_INFO {
LPTSTR lpUniversalName;
} UNIVERSAL_NAME_INFO;
@ -4232,13 +4257,6 @@ typedef struct tagUSEROBJECTFLAGS {
DWORD dwFlags;
} USEROBJECTFLAGS;
typedef struct value_ent {
LPTSTR ve_valuename;
DWORD ve_valuelen;
DWORD ve_valueptr;
DWORD ve_type;
} VALENT, *PVALENT;
typedef struct _VERIFY_INFORMATION {
LARGE_INTEGER StartingOffset;
DWORD Length;
@ -4555,5 +4573,7 @@ typedef struct
}
#endif /* __cplusplus */
#endif /* WIN32_LEAN_AND_MEAN */
#endif /* _GNU_H_WINDOWS32_STRUCTURES */

View file

@ -41,7 +41,7 @@
#include <base.h>
/* WIN32 messages */
#ifndef _WIN32_LEAN_AND_MEAN
#ifndef WIN32_LEAN_AND_MEAN
#include <messages.h>
#endif
@ -54,20 +54,22 @@
#include <structs.h>
/* WIN32 functions */
#ifndef _WIN32_LEAN_AND_MEAN
#ifndef WIN32_LEAN_AND_MEAN
#include <funcs.h>
#endif
#endif /* ! defined (RC_INVOKED) */
/* WIN32 error codes */
#ifndef WIN32_LEAN_AND_MEAN
#include <errors.h>
#endif
#ifndef RC_INVOKED
/* Windows sockets specification version 1.1 */
#ifdef Win32_Winsock
#ifndef _WIN32_LEAN_AND_MEAN
#ifndef WIN32_LEAN_AND_MEAN
#include <sockets.h>
#endif
#endif

View file

@ -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

View file

@ -1,32 +1,16 @@
/*
* Win32 File Api functions
* Author: Boudewijn Dekker
* to do: many more to add ..
*/
#undef WIN32_LEAN_AND_MEAN
#include <windows.h>
// AnsiOrOemtoUnicode
// pupose: internal procedure used in file api
NTSTATUS AnsiOrOemtoUnicode(PUNICODE_STRING DestinationString,PANSI_STRING SourceString, BOOLEAN AllocateDestinationString);
#include <ddk/ntddk.h>
BOOLEAN bIsFileApiAnsi; // set the file api to ansi or oem
NTSTATUS AnsiOrOemtoUnicode(PUNICODE_STRING DestinationString,PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
{
if ( bIsFileApiAnsi ) {
return __AnsiStringToUnicodeString(DestinationString, SourceString, AllocateDestinationString);
else
return __OemStringToUnicodeString(DestinationString, SourceString, AllocateDestinationString);
}
WINBASEAPI
VOID
WINAPI
@ -36,7 +20,59 @@ SetFileApisToOEM(VOID)
return;
}
HANDLE STDCALL CreateFileA(LPCSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile)
{
HANDLE FileHandle;
NTSTATUS Status;
WCHAR FileNameW[255];
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock;
ULONG i = 0;
UNICODE_STRING FileNameString;
ULONG Flags = 0;
if (!(dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED))
{
Flags = Flags | FILE_SYNCHRONOUS_IO_ALERT;
}
FileNameString.Length = 0;
while ((*lpFileName)!=0)
{
FileNameW[i] = *lpFileName;
lpFileName++;
i++;
FileNameString.Length++;
}
FileNameW[i] = 0;
FileNameString.Length++;
FileNameString.Buffer = &FileNameW;
FileNameString.MaximumLength = FileNameString.Length;
ObjectAttributes.RootDirectory = NULL;
ObjectAttributes.ObjectName = &FileNameString;
Status = NtCreateFile(&FileHandle,
dwDesiredAccess,
&ObjectAttributes,
&IoStatusBlock,
NULL,
dwFlagsAndAttributes,
dwShareMode,
dwCreationDisposition,
Flags,
NULL,
0);
return(FileHandle);
}
WINBASEAPI
VOID
@ -49,10 +85,275 @@ SetFileApisToANSI(VOID)
WINBASEAPI
BOOLEAN
WINAPI
WINBOOL
STDCALL
AreFileApisANSI(VOID)
{
return bIsFileApiAnsi;
}
BOOL STDCALL WriteFile(HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverLapped)
{
//FIXME: WriteFile should write to a console if appropriate
LARGE_INTEGER Offset;
HANDLE hEvent = NULL;
NTSTATUS errCode;
if (lpOverLapped != NULL )
{
Offset.LowPart = lpOverLapped->Offset;
Offset.HighPart = lpOverLapped->OffsetHigh;
lpOverLapped->Internal = STATUS_PENDING;
hEvent= lpOverLapped->hEvent;
}
errCode = NtWriteFile(hFile,hEvent,NULL,NULL,
(PIO_STATUS_BLOCK)lpOverLapped,
lpBuffer,
nNumberOfBytesToWrite,
&Offset,
NULL);
if (!NT_SUCCESS(errCode))
{
SetLastError(RtlNtStatusToDosError(errCode));
return FALSE;
}
return(TRUE);
}
WINBOOL STDCALL ReadFile(HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverLapped)
{
//FIXME ReadFile should write to a console if appropriate
HANDLE hEvent = NULL;
LARGE_INTEGER Offset;
NTSTATUS errCode;
PIO_STATUS_BLOCK IoStatusBlock;
IO_STATUS_BLOCK IIosb;
OVERLAPPED IOverlapped;
if ( lpOverLapped != NULL )
{
Offset.LowPart = lpOverLapped->Offset;
Offset.HighPart = lpOverLapped->OffsetHigh;
lpOverLapped->Internal = STATUS_PENDING;
hEvent = lpOverLapped->hEvent;
IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped;
}
else
{
IoStatusBlock = &IIosb;
}
errCode = NtReadFile(hFile,
hEvent,
NULL,
NULL,
IoStatusBlock,
lpBuffer,
nNumberOfBytesToRead,
&Offset,
NULL);
if ( errCode < 0 )
{
SetLastError(RtlNtStatusToDosError(errCode));
return FALSE;
}
return TRUE;
}
WINBOOL
STDCALL
ReadFileEx(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPOVERLAPPED lpOverLapped,
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
)
{
HANDLE hEvent = NULL;
LARGE_INTEGER Offset;
NTSTATUS errCode;
if ( lpOverLapped != NULL ) {
Offset.LowPart = lpOverLapped->Offset;
Offset.HighPart = lpOverLapped->OffsetHigh;
lpOverLapped->Internal = STATUS_PENDING;
hEvent = lpOverLapped->hEvent;
}
errCode = NtReadFile(hFile,
hEvent,
(PIO_APC_ROUTINE)lpCompletionRoutine,
NULL,
(PIO_STATUS_BLOCK)lpOverLapped,
lpBuffer,
nNumberOfBytesToRead,
&Offset,
NULL);
if ( errCode < 0 ) {
SetLastError(RtlNtStatusToDosError(errCode));
return FALSE;
}
return TRUE;
}
WINBOOL
STDCALL
LockFile(
HANDLE hFile,
DWORD dwFileOffsetLow,
DWORD dwFileOffsetHigh,
DWORD nNumberOfBytesToLockLow,
DWORD nNumberOfBytesToLockHigh
)
{
DWORD dwReserved;
OVERLAPPED Overlapped;
Overlapped.Offset = dwFileOffsetLow;
Overlapped.OffsetHigh = dwFileOffsetHigh;
dwReserved = 0;
return LockFileEx(hFile, LOCKFILE_FAIL_IMMEDIATELY|LOCKFILE_EXCLUSIVE_LOCK,dwReserved,nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, &Overlapped ) ;
}
WINBOOL
STDCALL
LockFileEx(
HANDLE hFile,
DWORD dwFlags,
DWORD dwReserved,
DWORD nNumberOfBytesToLockLow,
DWORD nNumberOfBytesToLockHigh,
LPOVERLAPPED lpOverlapped
)
{
LARGE_INTEGER BytesToLock;
BOOL LockImmediate;
BOOL LockExclusive;
NTSTATUS errCode;
LARGE_INTEGER Offset;
if(dwReserved != 0)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
lpOverlapped->Internal = STATUS_PENDING;
Offset.LowPart = lpOverlapped->Offset;
Offset.HighPart = lpOverlapped->OffsetHigh;
if ( (dwFlags & LOCKFILE_FAIL_IMMEDIATELY) == LOCKFILE_FAIL_IMMEDIATELY )
LockImmediate = TRUE;
else
LockImmediate = FALSE;
if ( (dwFlags & LOCKFILE_EXCLUSIVE_LOCK) == LOCKFILE_EXCLUSIVE_LOCK )
LockExclusive = TRUE;
else
LockExclusive = FALSE;
BytesToLock.LowPart = nNumberOfBytesToLockLow;
BytesToLock.HighPart = nNumberOfBytesToLockHigh;
errCode = NtLockFile(hFile,
NULL,
NULL,
NULL,
(PIO_STATUS_BLOCK)lpOverlapped,
&Offset,
&BytesToLock,
NULL,
LockImmediate,
LockExclusive);
if ( errCode < 0 )
{
SetLastError(RtlNtStatusToDosError(errCode));
return FALSE;
}
return TRUE;
}
WINBOOL
STDCALL
UnlockFile(
HANDLE hFile,
DWORD dwFileOffsetLow,
DWORD dwFileOffsetHigh,
DWORD nNumberOfBytesToUnlockLow,
DWORD nNumberOfBytesToUnlockHigh
)
{
DWORD dwReserved;
OVERLAPPED Overlapped;
Overlapped.Offset = dwFileOffsetLow;
Overlapped.OffsetHigh = dwFileOffsetHigh;
dwReserved = 0;
return UnlockFileEx(hFile, dwReserved, nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh, &Overlapped);
}
WINBOOL STDCALL UnlockFileEx(HANDLE hFile,
DWORD dwReserved,
DWORD nNumberOfBytesToUnLockLow,
DWORD nNumberOfBytesToUnLockHigh,
LPOVERLAPPED lpOverlapped)
{
LARGE_INTEGER BytesToUnLock;
LARGE_INTEGER StartAddress;
NTSTATUS errCode;
if(dwReserved != 0)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if ( lpOverlapped == NULL )
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
BytesToUnLock.LowPart = nNumberOfBytesToUnLockLow;
BytesToUnLock.HighPart = nNumberOfBytesToUnLockHigh;
StartAddress.LowPart = lpOverlapped->Offset;
StartAddress.HighPart = lpOverlapped->OffsetHigh;
errCode = NtUnlockFile(hFile,
(PIO_STATUS_BLOCK)lpOverlapped,
StartAddress,
BytesToUnLock,
NULL);
if ( errCode < 0 ) {
SetLastError(RtlNtStatusToDosError(errCode));
return FALSE;
}
return TRUE;
}

View file

@ -5,10 +5,11 @@
* todo: check the _lopen for correctness
*/
#undef WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <string.h>
#include <wstring.h>
#include <fcntl.h>
@ -26,8 +27,7 @@ long _hread(
}
long
_lread(HFILE fd,LPVOID buffer,long count)
UINT STDCALL _lread(HFILE fd,LPVOID buffer,UINT count)
{
return _hread(fd,buffer, count);
}
@ -54,14 +54,15 @@ long _hwrite(
}
long _lwrite(
UINT
STDCALL
_lwrite(
HFILE hFile,
LPCSTR lpBuffer,
long lBytes
UINT uBytes
)
{
return _hwrite(hFile,lpBuffer,lBytes);
return _hwrite(hFile,lpBuffer,uBytes);
}
#define OF_OPENMASK (OF_READ|OF_READWRITE|OF_WRITE|OF_CREATE)
@ -123,7 +124,7 @@ int _lclose(
if ( CloseHandle((HANDLE)hFile) )
return 0;
else
rerturn -1;
return -1;
}
LONG _llseek(

View file

@ -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:

View file

@ -26,7 +26,9 @@
* Put the type definitions of the heap in a seperate header. Boudewijn Dekker
*/
#include <kernel32/kernel32.h>
#include <kernel32/heap.h>
#include <internal/string.h>
static HEAP_BUCKET __HeapDefaultBuckets[]=
{
@ -40,13 +42,14 @@ static HEAP_BUCKET __HeapDefaultBuckets[]=
{ NULL, 256, 15, 4088 },
};
PHEAP __ProcessHeap;
static BOOL __HeapCommit(PHEAP pheap, LPVOID start, LPVOID end);
static BOOL __HeapDecommit(PHEAP pheap, LPVOID start, LPVOID end);
static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag);
static VOID __HeapFreeRest(PHEAP pheap, PHEAP_BLOCK pfree, ULONG allocsize,
ULONG newsize);
static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, ULONG size);
static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size);
static BOOL __HeapFree(PHEAP pheap, ULONG flags, LPVOID pmem);
static PHEAP_SUBALLOC __HeapAllocSub(PHEAP pheap, PHEAP_BUCKET pbucket);
static LPVOID __HeapAllocFragment(PHEAP pheap, ULONG flags, ULONG size);
@ -67,12 +70,14 @@ static BOOL __HeapCommit(PHEAP pheap, LPVOID start, LPVOID end)
{
dprintf("__HeapCommit( 0x%lX, 0x%lX, 0x%lX)\n",
(ULONG) pheap, (ULONG) start, (ULONG) end);
#ifdef NOT
__VirtualDump();
#endif
if(end >= pheap->LastBlock)
pheap->LastBlock=end;
return __VirtualCommit(start, end-start, PAGE_READWRITE);
if (VirtualAlloc(start,end-start,MEM_COMMIT,PAGE_READWRITE)!=start)
{
return(FALSE);
}
return(TRUE);
}
/*********************************************************************
@ -89,7 +94,8 @@ static BOOL __HeapDecommit(PHEAP pheap, LPVOID start, LPVOID end)
#endif
if((end >= pheap->LastBlock)&&(start<= pheap->LastBlock))
pheap->LastBlock=start;
return __VirtualDecommit(start, end-start );
return(VirtualFree(start,end-start,MEM_RESERVE));
}
/*********************************************************************
@ -107,6 +113,9 @@ static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag)
ULONG freesize;
ULONG allocsize;
dprintf("__HeapAlloc(pheap %x, flags %x, size %d, tag %x)\n",
pheap,flags,size,tag);
pfree=&(pheap->Start);
allocsize=SIZE_ROUND(size);
freesize=HEAP_SIZE(pfree);
@ -154,7 +163,7 @@ static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag)
/* update our administration */
palloc->Size= size | tag;
if((flags | pheap->Flags)& HEAP_ZERO_MEMORY)
memset((LPVOID)palloc+HEAP_ADMIN_SIZE, 0, allocsize);
FillMemory((LPVOID)palloc+HEAP_ADMIN_SIZE, allocsize, 0);
return (LPVOID)palloc+HEAP_ADMIN_SIZE;
}
@ -236,7 +245,7 @@ static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size)
/* alloc a new fragment */
pmem=__HeapAllocFragment(pheap, flags, size);
if(pmem)
memcpy(pmem, pold, size);
CopyMemory(pmem, pold, size);
return pmem;
}
#endif
@ -300,7 +309,7 @@ static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size)
oldsize=HEAP_SIZE(prealloc);
pmem=__HeapAlloc(pheap, flags, size, HEAP_NORMAL_TAG);
if(pmem)
memcpy(pmem, pold, oldsize);
CopyMemory(pmem, pold, oldsize);
if((flags|pheap->Flags)&HEAP_ZERO_MEMORY)
memset(pmem + oldsize, 0, size-oldsize);
__HeapFree(pheap, flags, pold);
@ -502,7 +511,7 @@ static LPVOID __HeapReAllocFragment(PHEAP pheap, ULONG flags,
pmem=__HeapAllocFragment(pheap, flags, size);
if(pmem)
memcpy(pmem, pold, size);
CopyMemory(pmem, pold, size);
if((flags|pheap->Flags)&HEAP_ZERO_MEMORY)
memset(pmem+pfrag->Size, 0, size-pfrag->Size);
@ -581,11 +590,14 @@ PHEAP __HeapPrepare(LPVOID base, ULONG minsize, ULONG maxsize, ULONG flags)
{
PHEAP pheap=(PHEAP) base;
dprintf("__HeapPrepare(base %x, minsize %d, maxsize %d, flags %x)\n",
base,minsize,maxsize,flags);
pheap->Magic=MAGIC_HEAP;
pheap->End= ((LPVOID)pheap)+minsize;
pheap->Flags=flags;
pheap->LastBlock=(LPVOID)pheap + PAGESIZE;
memcpy(pheap->Bucket,__HeapDefaultBuckets,sizeof(__HeapDefaultBuckets));
CopyMemory(pheap->Bucket,__HeapDefaultBuckets,sizeof(__HeapDefaultBuckets));
if(__ProcessHeap)
{
pheap->NextHeap=__ProcessHeap->NextHeap;
@ -611,8 +623,8 @@ PHEAP __HeapPrepare(LPVOID base, ULONG minsize, ULONG maxsize, ULONG flags)
VOID WINAPI __HeapInit(LPVOID base, ULONG minsize, ULONG maxsize)
{
mmap(base, PAGESIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE,
__DevZero, 0);
VirtualAlloc(base,maxsize,MEM_RESERVE,PAGE_READWRITE);
VirtualAlloc(base,PAGESIZE,MEM_COMMIT,PAGE_READWRITE);
__HeapPrepare(base, minsize, maxsize, 0);
}
@ -621,16 +633,14 @@ VOID WINAPI __HeapInit(LPVOID base, ULONG minsize, ULONG maxsize)
/*********************************************************************
* HeapCreate -- KERNEL32 *
*********************************************************************/
HANDLE WINAPI HeapCreate(ULONG flags, ULONG minsize, ULONG maxsize)
HANDLE STDCALL HeapCreate(DWORD flags, DWORD minsize, DWORD maxsize)
{
PHEAP pheap;
aprintf("HeapCreate( 0x%lX, 0x%lX, 0x%lX )\n", flags, minsize, maxsize);
pheap = __VirtualReserve(NULL, minsize, PAGE_READWRITE | MEM_TOP_DOWN);
__VirtualCommit(pheap, PAGESIZE, PAGE_READWRITE);
__VirtualDump();
pheap = VirtualAlloc(NULL, minsize, MEM_TOP_DOWN, PAGE_READWRITE);
VirtualAlloc(pheap, PAGESIZE, MEM_COMMIT, PAGE_READWRITE);
return (HANDLE) __HeapPrepare(pheap, minsize, maxsize, flags);
}
@ -647,7 +657,7 @@ BOOL WINAPI HeapDestroy(HANDLE hheap)
return __ErrorReturnFalse(ERROR_INVALID_PARAMETER);
DeleteCriticalSection(&(pheap->Synchronize));
__VirtualRelease(pheap);
VirtualFree(pheap,0,MEM_RELEASE);
return TRUE;
}
@ -655,7 +665,7 @@ BOOL WINAPI HeapDestroy(HANDLE hheap)
/*********************************************************************
* HeapAlloc -- KERNEL32 *
*********************************************************************/
LPVOID WINAPI HeapAlloc(HANDLE hheap, ULONG flags, ULONG size)
LPVOID STDCALL HeapAlloc(HANDLE hheap, DWORD flags, DWORD size)
{
PHEAP pheap=hheap;
LPVOID retval;
@ -684,7 +694,7 @@ LPVOID WINAPI HeapAlloc(HANDLE hheap, ULONG flags, ULONG size)
/*********************************************************************
* HeapReAlloc -- KERNEL32 *
*********************************************************************/
LPVOID WINAPI HeapReAlloc(HANDLE hheap, ULONG flags, LPVOID ptr, ULONG size)
LPVOID STDCALL HeapReAlloc(HANDLE hheap, DWORD flags, LPVOID ptr, DWORD size)
{
PHEAP pheap=hheap;
PHEAP_BLOCK pfree=((PHEAP_BLOCK)ptr-1);
@ -714,7 +724,7 @@ LPVOID WINAPI HeapReAlloc(HANDLE hheap, ULONG flags, LPVOID ptr, ULONG size)
/*********************************************************************
* HeapFree -- KERNEL32 *
*********************************************************************/
BOOL WINAPI HeapFree(HANDLE hheap, ULONG flags, LPVOID ptr)
WINBOOL STDCALL HeapFree(HANDLE hheap, DWORD flags, LPVOID ptr)
{
PHEAP pheap=hheap;
PHEAP_BLOCK pfree=(PHEAP_BLOCK)((LPVOID)ptr-HEAP_ADMIN_SIZE);

View file

@ -9,11 +9,92 @@
/* INCLUDES ******************************************************************/
#include <windows.h>
#include <ddk/ntddk.h>
/* FUNCTIONS *****************************************************************/
LPVOID STDCALL VirtualAllocEx(HANDLE hProcess,
LPVOID lpAddress,
DWORD dwSize,
DWORD flAllocationType,
DWORD flProtect)
{
NTSTATUS Status;
Status = ZwAllocateVirtualMemory(hProcess,
&lpAddress,
0,
dwSize,
flAllocationType,
flProtect);
if (Status != STATUS_SUCCESS)
{
return(NULL);
}
return(lpAddress);
}
LPVOID STDCALL VirtualAlloc(LPVOID lpAddress,
DWORD dwSize,
DWORD flAllocationType,
DWORD flProtect)
{
return(VirtualAllocEx(GetCurrentProcess(),lpAddress,dwSize,flAllocationType,
flProtect));
}
WINBOOL STDCALL VirtualFreeEx(HANDLE hProcess,
LPVOID lpAddress,
DWORD dwSize,
DWORD dwFreeType)
{
NTSTATUS Status;
Status = ZwFreeVirtualMemory(hProcess,
&lpAddress,
dwSize,
dwFreeType);
if (Status != STATUS_SUCCESS)
{
return(FALSE);
}
return(TRUE);
}
WINBOOL STDCALL VirtualFree(LPVOID lpAddress, DWORD dwSize, DWORD dwFreeType)
{
return(VirtualFreeEx(GetCurrentProcess(),lpAddress,dwSize,dwFreeType));
}
WINBOOL STDCALL VirtualProtect(LPVOID lpAddress,
DWORD dwSize,
DWORD flNewProtect,
PDWORD lpflOldProtect)
{
return(VirtualProtectEx(GetCurrentProcess(),
lpAddress,
dwSize,
flNewProtect,
lpflOldProtect));
}
WINBOOL STDCALL VirtualProtectEx(HANDLE hProcess,
LPVOID lpAddress,
DWORD dwSize,
DWORD flNewProtect,
PDWORD lpflOldProtect)
{
NTSTATUS Status;
Status = ZwProtectVirtualMemory(hProcess,
lpAddress,
dwSize,
flNewProtect,
lpflOldProtect);
if (Status != STATUS_SUCCESS)
{
return(FALSE);
}
return(TRUE);
}

View file

@ -1,3 +1,4 @@
#include <windows.h>
#include <process.h>
/*
* Win32 Process Api functions
@ -14,14 +15,18 @@
#define NT_CURRENT_THREAD 0xFFFFFFFE
WINBASEAPI
HANDLE
WINAPI
GetCurrentProcess()
HANDLE STDCALL GetCurrentProcess(VOID)
{
return NT_CURRENT_PROCESS;
}
HANDLE STDCALL GetCurrentThread()
{
return NT_CURRENT_PROCESS;
}
#if 0
WINBASEAPI
DWORD
WINAPI
@ -31,14 +36,6 @@ GetCurrentProcessId()
}
WINBASEAPI
HANDLE
WINAPI
GetCurrentThread()
{
return NT_CURRENT_PROCESS;
}
WINBASEAPI
DWORD
WINAPI
@ -135,3 +132,5 @@ BOOL FlushInstructionCache(
return FALSE;
}
}
#endif

View file

@ -1,7 +1,10 @@
all: genntdll$(EXE_POSTFIX)
all: ntdll.a
OBJECTS = napi.o
ntdll.a: $(OBJECTS)
$(AR) vcsr ntdll.a $(OBJECTS)
genntdll$(EXE_POSTFIX): genntdll.c
$(NATIVE_CC) -g genntdll.c -o genntdll$(EXE_POSTFIX)
dummy:
include ../../rules.mak

View file

@ -15,7 +15,12 @@ include rules.mak
#
# Required to run the system
#
COMPONENTS = kernel lib
COMPONENTS = iface_native ntoskrnl kernel32 ntdll crtdll mingw32
#
# Select the server(s) you want to build
#
SERVERS = win32 posix linux os2
#
# Select the loader(s) you want to build
@ -23,26 +28,81 @@ COMPONENTS = kernel lib
LOADERS = dos
#
# Select the modules you want
# Select the device drivers and filesystems you want
#
MODULES = parallel keyboard
KERNEL_SERVICES = parallel keyboard null mouse serial sound ide test sdisk \
minix vfat
all: $(COMPONENTS) $(LOADERS) $(MODULES)
APPS = hello shell
all: $(COMPONENTS) $(LOADERS) $(KERNEL_SERVICES) $(APPS)
clean: dummy
make -C iface/native clean
#
# Applications
#
hello: dummy
make -C apps/hello
cmd: dummy
make -C apps/cmd
shell: dummy
make -C apps/shell
#
# Interfaces
#
iface_native: dummy
make -C iface/native
#
# Device driver rules
#
vfat: dummy
make -C services/fs/vfat
sdisk: dummy
make -C services/dd/sdisk
minix: dummy
make -C services/fs/minix
template: dummy
make -C services/fs/template
ide-test: dummy
make -C services/dd/ide-test
ide: dummy
make -C services/ide
make -C services/dd/ide
test: dummy
make -C services/dd/test
test1: dummy
make -C services/dd/test1
null: dummy
make -C services/dd/null
parallel: dummy
make -C services/parallel
make -C services/dd/parallel
keyboard: dummy
make -C services/keyboard
make -C services/dd/keyboard
mouse: dummy
make -C services/mouse
make -C services/dd/mouse
serial: dummy
make -C services/dd/serial
sound: dummy
make -C services/dd/sound
#
# Kernel loaders
@ -55,10 +115,19 @@ dos: dummy
# Required system components
#
kernel: dummy
ntoskrnl: dummy
make -C ntoskrnl
lib: dummy
make -C lib
kernel32: dummy
make -C lib/kernel32
ntdll: dummy
make -C lib/ntdll
crtdll: dummy
make -C lib/crtdll
mingw32: dummy
make -C lib/mingw32
dummy:

View file

@ -16,6 +16,11 @@
/* FUNCTIONS *****************************************************************/
NTSTATUS STDCALL NtSystemDebugControl(VOID)
{
UNIMPLEMENTED;
}
VOID DbgBreakPoint(VOID)
{
__asm__("int $3\n\t");

View file

@ -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;
}

View file

@ -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)
{

View file

@ -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;
};
}
}

View file

@ -377,3 +377,10 @@ ZwUnmapViewOfSection
ZwWriteFile
sprintf
wcschr
wcsncat
wcsncpy
wtolower
wtoupper
CbInitDccb
CbAcquireForRead
CbReleaseFromRead

View file

@ -18,8 +18,8 @@
#include <ddk/ntddk.h>
#include <internal/mm.h>
#include <internal/string.h>
#include <internal/hal/page.h>
#include <internal/hal/segment.h>
#include <internal/mmhal.h>
#include <internal/i386/segment.h>
/* TYPES ******************************************************************/

View file

@ -13,16 +13,16 @@
#include <windows.h>
#include <internal/ntoskrnl.h>
#include <internal/ke.h>
#include <internal/hal/segment.h>
#include <internal/hal/page.h>
#include <internal/i386/segment.h>
#include <internal/mmhal.h>
#define NDEBUG
#include <internal/debug.h>
/* GLOBALS *****************************************************************/
typedef unsigned int (exception_hook)(CONTEXT* c, unsigned int exp);
asmlinkage unsigned int ExHookException(exception_hook fn, UINT exp);
asmlinkage int page_fault_handler(unsigned int cs,
unsigned int eip);
extern descriptor idt[256];
static exception_hook* exception_hooks[256]={NULL,};
@ -30,43 +30,74 @@ static exception_hook* exception_hooks[256]={NULL,};
#define _STR(x) #x
#define STR(x) _STR(x)
extern void interrupt_handler2e(void);
/* FUNCTIONS ****************************************************************/
#define EXCEPTION_HANDLER_WITH_ERROR(x,y) \
void exception_handler##y (void); \
__asm__("\n\t_exception_handler"##x":\n\t" \
"pushl %gs\n\t" \
"pushl %fs\n\t" \
"pushl %es\n\t" \
"pushl %ds\n\t" \
"pushl $"##x"\n\t" \
"pusha\n\t" \
"movw $"STR(KERNEL_DS)",%ax\n\t" \
"movw %ax,%ds\n\t" \
"movw %ax,%es\n\t" \
"movw %ax,%fs\n\t" \
"movw %ax,%gs\n\t" \
"call _exception_handler\n\t" \
"popa\n\t" \
"addl $8,%esp\n\t" \
"addl $4,%esp\n\t" \
"popl %ds\n\t" \
"popl %es\n\t" \
"popl %fs\n\t" \
"popl %gs\n\t" \
"addl $4,%esp\n\t" \
"iret\n\t")
#define EXCEPTION_HANDLER_WITHOUT_ERROR(x,y) \
asmlinkage void exception_handler##y (void); \
__asm__("\n\t_exception_handler"##x":\n\t" \
"pushl $0\n\t" \
"pushl %gs\n\t" \
"pushl %fs\n\t" \
"pushl %es\n\t" \
"pushl %ds\n\t" \
"pushl $"##x"\n\t" \
"pusha\n\t" \
"movw $"STR(KERNEL_DS)",%ax\n\t" \
"movw %ax,%ds\n\t" \
"movw %ax,%es\n\t" \
"movw %ax,%fs\n\t" \
"movw %ax,%gs\n\t" \
"call _exception_handler\n\t" \
"popa\n\t" \
"addl $8,%esp\n\t" \
"addl $4,%esp\n\t" \
"popl %ds\n\t" \
"popl %es\n\t" \
"popl %fs\n\t" \
"popl %gs\n\t" \
"addl $4,%esp\n\t" \
"iret\n\t")
asmlinkage void exception_handler_unknown(void);
__asm__("\n\t_exception_handler_unknown:\n\t"
"pushl $0\n\t"
"pushl %gs\n\t"
"pushl %fs\n\t"
"pushl %es\n\t"
"pushl %ds\n\t"
"pushl %ds\n\t"
"pushl $0xff\n\t"
"pusha\n\t"
"movw $"STR(KERNEL_DS)",%ax\n\t"
"movw %ax,%ds\n\t"
"movw %ax,%es\n\t"
"movw %ax,%fs\n\t"
"movw %ax,%gs\n\t"
"call _exception_handler\n\t"
"popa\n\t"
"addl $8,%esp\n\t"
@ -87,14 +118,7 @@ EXCEPTION_HANDLER_WITH_ERROR("10",10);
EXCEPTION_HANDLER_WITH_ERROR("11",11);
EXCEPTION_HANDLER_WITH_ERROR("12",12);
EXCEPTION_HANDLER_WITH_ERROR("13",13);
/*
* The page fault handler is defined by the memory managment because it is
* special
*/
//EXCEPTION_HANDLER_WITH_ERROR("14",14);
asmlinkage void exception_handler14(void);
EXCEPTION_HANDLER_WITH_ERROR("14",14);
EXCEPTION_HANDLER_WITH_ERROR("15",15);
EXCEPTION_HANDLER_WITHOUT_ERROR("16",16);
@ -107,6 +131,9 @@ asmlinkage void exception_handler(unsigned int edi,
unsigned int eax,
unsigned int type,
unsigned int ds,
unsigned int es,
unsigned int fs,
unsigned int gs,
unsigned int error_code,
unsigned int eip,
unsigned int cs, unsigned int eflags,
@ -124,6 +151,19 @@ asmlinkage void exception_handler(unsigned int edi,
__asm__("cli\n\t");
if (type==14)
{
if (page_fault_handler(cs&0xffff,eip))
{
return;
}
}
if (type==1)
{
DbgPrint("Trap at CS:EIP %x:%x\n",cs&0xffff,eip);
return;
}
/*
* Activate any hook for the exception
*/
@ -137,6 +177,8 @@ asmlinkage void exception_handler(unsigned int edi,
*/
printk("Exception: %d(%x)\n",type,error_code&0xffff);
printk("CS:EIP %x:%x\n",cs&0xffff,eip);
printk("DS %x ES %x FS %x GS %x\n",ds&0xffff,es&0xffff,fs&0xffff,
gs&0xfff);
// for(;;);
printk("EAX: %.8x EBX: %.8x ECX: %.8x\n",eax,ebx,ecx);
printk("EDX: %.8x EBP: %.8x ESI: %.8x\n",edx,ebp,esi);
@ -145,6 +187,10 @@ asmlinkage void exception_handler(unsigned int edi,
{
printk("ESP %.8x\n",esp);
}
else
{
printk("ESP %.8x\n",esp);
}
__asm__("movl %%cr2,%0\n\t"
: "=d" (cr2));
@ -181,6 +227,15 @@ asmlinkage void exception_handler(unsigned int edi,
for(;;);
}
static void set_system_call_gate(unsigned int sel, unsigned int func)
{
DPRINT("sel %x %d\n",sel,sel);
idt[sel].a = (((int)func)&0xffff) +
(KERNEL_CS << 16);
idt[sel].b = 0xef00 + (((int)func)&0xffff0000);
DPRINT("idt[sel].b %x\n",idt[sel].b);
}
static void set_interrupt_gate(unsigned int sel, unsigned int func)
{
idt[sel].a = (((int)func)&0xffff) +
@ -232,4 +287,6 @@ asmlinkage void KeInitExceptions(void)
{
set_interrupt_gate(i,(int)exception_handler_unknown);
}
set_system_call_gate(0x2e,(int)interrupt_handler2e);
}

View file

@ -26,7 +26,7 @@
#include <internal/linkage.h>
#include <internal/string.h>
#include <internal/hal/segment.h>
#include <internal/i386/segment.h>
#include <internal/hal/io.h>
#define NDEBUG
@ -35,7 +35,7 @@
/* GLOBALS *****************************************************************/
#define NR_IRQS (16)
#define IRQ_BASE (0x20)
#define IRQ_BASE (0x40)
asmlinkage void irq_handler_0(void);
asmlinkage void irq_handler_1(void);

View file

@ -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);
}

View file

@ -10,7 +10,7 @@
/* INCLUDES ***************************************************************/
#include <internal/hal/page.h>
#include <internal/mmhal.h>
#include <internal/mm.h>
#include <internal/string.h>
#include <internal/bitops.h>
@ -29,6 +29,81 @@
/* FUNCTIONS ***************************************************************/
static ULONG ProtectToPTE(ULONG flProtect)
{
ULONG Attributes = 0;
if (flProtect & PAGE_NOACCESS || flProtect & PAGE_GUARD)
{
Attributes = 0;
}
if (flProtect & PAGE_READWRITE || flProtect & PAGE_EXECUTE_READWRITE)
{
Attributes = PA_WRITE;
}
if (flProtect & PAGE_READONLY || flProtect & PAGE_EXECUTE ||
flProtect & PAGE_EXECUTE_READ)
{
Attributes = PA_READ;
}
return(Attributes);
}
PULONG MmGetPageEntry(PEPROCESS Process, ULONG Address)
{
unsigned int page_table;
unsigned int* page_tlb;
unsigned int* page_dir = linear_to_physical(
Process->Pcb.PageTableDirectory);
DPRINT("vaddr %x ",vaddr);
page_tlb = (unsigned int *)physical_to_linear(
PAGE_MASK(page_dir[VADDR_TO_PD_OFFSET(Address)]));
DPRINT("page_tlb %x\n",page_tlb);
if (PAGE_MASK(page_dir[VADDR_TO_PD_OFFSET(Address)])==0)
{
DPRINT("Creating new page directory\n",0);
page_table = get_free_page(); // Returns a physical address
page_tlb=(unsigned int *)physical_to_linear(page_table);
memset(page_tlb,0,PAGESIZE);
page_dir[VADDR_TO_PD_OFFSET(Address)]=page_table+0x7;
}
return(&page_tlb[VADDR_TO_PT_OFFSET(Address)/4]);
}
BOOLEAN MmIsPagePresent(PEPROCESS Process, PVOID Address)
{
return((*MmGetPageEntry(Process, Address)) & PA_PRESENT);
}
VOID MmSetPage(PEPROCESS Process,
PVOID Address,
ULONG flProtect,
ULONG PhysicalAddress)
{
ULONG Attributes = 0;
Attributes = ProtectToPTE(flProtect);
(*MmGetPageEntry(Process, Address)) = PhysicalAddress | Attributes;
}
VOID MmSetPageProtect(PEPROCESS Process,
PVOID Address,
ULONG flProtect)
{
ULONG Attributes = 0;
PULONG PageEntry;
Attributes = ProtectToPTE(flProtect);
PageEntry = MmGetPageEntry(Process,Address);
(*PageEntry) = PAGE_MASK(*PageEntry) | Attributes;
}
/*
* The mark_page_xxxx manipulate the attributes of a page. Use the
* higher level functions for synchronization. These functions only work

View file

@ -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:

View file

@ -13,7 +13,7 @@
#include <internal/ntoskrnl.h>
#include <internal/string.h>
#include <internal/hal/page.h>
#include <internal/mmhal.h>
#include <internal/hal/io.h>
#include <internal/debug.h>
@ -66,6 +66,7 @@ static unsigned char mode03[] = {0x67,0x00,0x03,0x00,0x03,0x00,0x02,
/* FUNCTIONS ***************************************************************/
void HalSwitchToBlueScreen(void)
/*
* FUNCTION: Switches the monitor to text mode and writes a blue background
@ -94,6 +95,14 @@ void HalSwitchToBlueScreen(void)
}
NTSTATUS STDCALL NtDisplayString(IN PUNICODE_STRING DisplayString)
{
// DbgPrint("DisplayString %x\n",DisplayString);
DbgPrint("%s",DisplayString);
return(STATUS_SUCCESS);
}
void HalDisplayString(char* string)
/*
* FUNCTION: Switches the screen to HAL console mode (BSOD) if not there

View file

@ -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

View file

@ -16,8 +16,8 @@
#include <internal/ps.h>
#include <internal/string.h>
#include <internal/hal.h>
#include <internal/hal/segment.h>
#include <internal/hal/page.h>
#include <internal/i386/segment.h>
#include <internal/mmhal.h>
#define NDEBUG
#include <internal/debug.h>
@ -29,7 +29,7 @@
static char null_ldt[8]={0,};
static unsigned int null_ldt_sel=0;
static PKTHREAD FirstThread=NULL;
static PETHREAD FirstThread=NULL;
/* FUNCTIONS **************************************************************/
@ -42,6 +42,7 @@ void HalTaskSwitch(PKTHREAD thread)
* again
*/
{
DPRINT("Scheduling thread %x\n",thread);
DPRINT("Scheduling thread %x\n",thread->Context.nr);
DPRINT("previous task %x reserved1 %x esp0 %x ss0 %x\n",
thread->Context.previous_task,thread->Context.reserved1,
@ -75,7 +76,6 @@ void HalTaskSwitch(PKTHREAD thread)
: /* No outputs */
: "m" (*(((unsigned char *)(&(thread->Context.nr)))-4) )
: "ax","dx");
// set_breakpoint(0,&(FirstThread->Context.gs),HBP_READWRITE,HBP_DWORD);
}
static unsigned int allocate_tss_descriptor(void)
@ -114,8 +114,129 @@ static void begin_thread(PKSTART_ROUTINE fn, PVOID start_context)
for(;;);
}
BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn,
PVOID StartContext)
#define FLAG_NT (1<<14)
#define FLAG_VM (1<<17)
#define FLAG_IF (1<<9)
#define FLAG_IOPL ((1<<12)+(1<<13))
NTSTATUS KeValidateUserContext(PCONTEXT Context)
/*
* FUNCTION: Validates a processor context
* ARGUMENTS:
* Context = Context to validate
* RETURNS: Status
* NOTE: This only validates the context as not violating system security, it
* doesn't guararantee the thread won't crash at some point
* NOTE2: This relies on there only being two selectors which can access
* system space
*/
{
if (Context->Eip >= KERNEL_BASE)
{
return(STATUS_UNSUCCESSFUL);
}
if (Context->SegCs == KERNEL_CS)
{
return(STATUS_UNSUCCESSFUL);
}
if (Context->SegDs == KERNEL_DS)
{
return(STATUS_UNSUCCESSFUL);
}
if (Context->SegEs == KERNEL_DS)
{
return(STATUS_UNSUCCESSFUL);
}
if (Context->SegFs == KERNEL_DS)
{
return(STATUS_UNSUCCESSFUL);
}
if (Context->SegGs == KERNEL_DS)
{
return(STATUS_UNSUCCESSFUL);
}
if ((Context->EFlags & FLAG_IOPL) != 0 ||
(Context->EFlags & FLAG_NT) ||
(Context->EFlags & FLAG_VM) ||
(!(Context->EFlags & FLAG_IF)))
{
return(STATUS_SUCCESS);
}
return(STATUS_SUCCESS);
}
NTSTATUS HalInitTaskWithContext(PETHREAD Thread, PCONTEXT Context)
/*
* FUNCTION: Initialize a task with a user mode context
* ARGUMENTS:
* Thread = Thread to initialize
* Context = Processor context to initialize it with
* RETURNS: Status
*/
{
unsigned int desc;
unsigned int length;
unsigned int base;
unsigned int* kernel_stack;
NTSTATUS Status;
DPRINT("HalInitTaskWithContext(Thread %x, Context %x)\n",
Thread,Context);
assert(sizeof(hal_thread_state)>=0x68);
if ((Status=KeValidateUserContext(Context))!=STATUS_SUCCESS)
{
return(Status);
}
desc = allocate_tss_descriptor();
length = sizeof(hal_thread_state) - 1;
base = (unsigned int)(&(Thread->Tcb.Context));
kernel_stack = ExAllocatePool(NonPagedPool,PAGESIZE);
/*
* Setup a TSS descriptor
*/
gdt[desc].a = (length & 0xffff) | ((base & 0xffff) << 16);
gdt[desc].b = ((base & 0xff0000)>>16) | 0x8900 | (length & 0xf0000)
| (base & 0xff000000);
/*
* Initialize the thread context
*/
memset(&Thread->Tcb.Context,0,sizeof(hal_thread_state));
Thread->Tcb.Context.ldt = null_ldt_sel;
Thread->Tcb.Context.eflags = Context->EFlags;
Thread->Tcb.Context.iomap_base = FIELD_OFFSET(hal_thread_state,io_bitmap);
Thread->Tcb.Context.esp0 = (ULONG)&kernel_stack[1021];
Thread->Tcb.Context.ss0 = KERNEL_DS;
Thread->Tcb.Context.esp = Context->Esp;
Thread->Tcb.Context.ss = Context->SegSs;
Thread->Tcb.Context.cs = Context->SegCs;
Thread->Tcb.Context.eip = Context->Eip;
Thread->Tcb.Context.io_bitmap[0] = 0xff;
Thread->Tcb.Context.cr3 =
linear_to_physical(Thread->ThreadsProcess->Pcb.PageTableDirectory);
Thread->Tcb.Context.ds = Context->SegDs;
Thread->Tcb.Context.es = Context->SegEs;
Thread->Tcb.Context.fs = Context->SegFs;
Thread->Tcb.Context.gs = Context->SegGs;
Thread->Tcb.Context.eax = Context->Eax;
Thread->Tcb.Context.ebx = Context->Ebx;
Thread->Tcb.Context.ecx = Context->Ecx;
Thread->Tcb.Context.edx = Context->Edx;
Thread->Tcb.Context.edi = Context->Edi;
Thread->Tcb.Context.esi = Context->Esi;
Thread->Tcb.Context.ebp = Context->Ebp;
Thread->Tcb.Context.nr = desc * 8;
DPRINT("Allocated %x\n",desc*8);
return(STATUS_SUCCESS);
}
BOOLEAN HalInitTask(PETHREAD thread, PKSTART_ROUTINE fn, PVOID StartContext)
/*
* FUNCTION: Initializes the HAL portion of a thread object
* ARGUMENTS:
@ -127,11 +248,12 @@ BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn,
{
unsigned int desc = allocate_tss_descriptor();
unsigned int length = sizeof(hal_thread_state) - 1;
unsigned int base = (unsigned int)(&(thread->Context));
unsigned int base = (unsigned int)(&(thread->Tcb.Context));
unsigned int* kernel_stack = ExAllocatePool(NonPagedPool,4096);
DPRINT("HalInitTask(Thread %x, fn %x, StartContext %x)\n",
thread,fn,StartContext);
DPRINT("thread->ThreadsProcess %x\n",thread->ThreadsProcess);
/*
* Make sure
@ -156,30 +278,31 @@ BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn,
/*
* Initialize the thread context
*/
memset(&thread->Context,0,sizeof(hal_thread_state));
thread->Context.ldt = null_ldt_sel;
thread->Context.eflags = (1<<1)+(1<<9);
thread->Context.iomap_base = FIELD_OFFSET(hal_thread_state,io_bitmap);
thread->Context.esp0 = &kernel_stack[1021];
thread->Context.ss0 = KERNEL_DS;
thread->Context.esp = &kernel_stack[1021];
thread->Context.ss = KERNEL_DS;
thread->Context.cs = KERNEL_CS;
thread->Context.eip = (unsigned long)begin_thread;
thread->Context.io_bitmap[0] = 0xff;
thread->Context.cr3 = ((unsigned int)get_page_directory()) - IDMAP_BASE;
thread->Context.ds = KERNEL_DS;
thread->Context.es = KERNEL_DS;
thread->Context.fs = KERNEL_DS;
thread->Context.gs = KERNEL_DS;
thread->Context.nr = desc * 8;
memset(&thread->Tcb.Context,0,sizeof(hal_thread_state));
thread->Tcb.Context.ldt = null_ldt_sel;
thread->Tcb.Context.eflags = (1<<1)+(1<<9);
thread->Tcb.Context.iomap_base = FIELD_OFFSET(hal_thread_state,io_bitmap);
thread->Tcb.Context.esp0 = &kernel_stack[1021];
thread->Tcb.Context.ss0 = KERNEL_DS;
thread->Tcb.Context.esp = &kernel_stack[1021];
thread->Tcb.Context.ss = KERNEL_DS;
thread->Tcb.Context.cs = KERNEL_CS;
thread->Tcb.Context.eip = (unsigned long)begin_thread;
thread->Tcb.Context.io_bitmap[0] = 0xff;
thread->Tcb.Context.cr3 =
linear_to_physical(thread->ThreadsProcess->Pcb.PageTableDirectory);
thread->Tcb.Context.ds = KERNEL_DS;
thread->Tcb.Context.es = KERNEL_DS;
thread->Tcb.Context.fs = KERNEL_DS;
thread->Tcb.Context.gs = KERNEL_DS;
thread->Tcb.Context.nr = desc * 8;
DPRINT("Allocated %x\n",desc*8);
return(TRUE);
}
void HalInitFirstTask(PKTHREAD thread)
void HalInitFirstTask(PETHREAD thread)
/*
* FUNCTION: Called to setup the HAL portion of a thread object for the
* initial thread
@ -208,6 +331,6 @@ void HalInitFirstTask(PKTHREAD thread)
*/
__asm__("ltr %%ax"
: /* no output */
: "a" (thread->Context.nr));
: "a" (thread->Tcb.Context.nr));
FirstThread = thread;
}

View file

@ -1,46 +1,35 @@
;
;
%include "internal/hal/segment.inc"
%include 'internal/hal/segment.inc'
bits 32
section .text
extern _SystemServiceTable
extern __SystemServiceTable
global _interrupt_handler2e
_kernel_mode_call_handler:
;
; Save some registers
;
_interrupt_handler2e:
push ds
push es
push esi
push edi
;
; Transfer the parameters from user mode
;
push USER_DS
pop es
mov bx,KERNEL_DS
mov es,bx
mov edx,esi
mov esp,edi
mov ecx,_SystemServiceTable[eax*4]
mov esi,edx
mov ecx,[es:__SystemServiceTable+eax*8]
sub esp,ecx
cld
mov edi,esp
rep movsb
;
; Call the actual service routine
;
mov eax,_SystemServiceTable[eax*4+4]
jmp eax
mov ds,bx
mov eax,[__SystemServiceTable+4+eax*8]
call eax
;
; Restore registers and return
;
pop edi
pop esi
pop es
pop ds
ret
iret

View file

@ -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;

View file

@ -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));
}

View file

@ -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;

View file

@ -11,38 +11,48 @@
/* INCLUDES *****************************************************************/
#include <ddk/ntddk.h>
#include <internal/mm.h>
#include <internal/debug.h>
/* FUNCTIONS *****************************************************************/
VOID MmUnlockPagableImageSection(PVOID ImageSectionHandle)
/*
* FUNCTION: Releases a section of driver code or driver data, previously
* locked into system space with MmLockPagableCodeSection,
* MmLockPagableDataSection or MmLockPagableSectionByHandle
* ARGUMENTS:
* ImageSectionHandle = Handle returned by MmLockPagableCodeSection or
* MmLockPagableDataSection
*/
{
UNIMPLEMENTED;
MmUnlockMemoryArea((MEMORY_AREA *)ImageSectionHandle);
}
VOID MmLockPagableSectionByHandle(PVOID ImageSectionHandle)
{
UNIMPLEMENTED;
MmLockMemoryArea((MEMORY_AREA *)ImageSectionHandle);
}
PVOID MmLockPagableCodeSection(PVOID AddressWithinSection)
{
UNIMPLEMENTED;
PVOID Handle;
Handle = MmOpenMemoryAreaByAddress(NULL,AddressWithinSection);
MmLockPagableSectionByHandle(Handle);
return(Handle);
}
PVOID MmLockPagableDataSection(PVOID AddressWithinSection)
{
UNIMPLEMENTED;
return(MmLockPagableCodeSection(AddressWithinSection));
}
VOID MmPageEntireDriver(PVOID AddressWithinSection)
{
UNIMPLEMENTED;
}
VOID MmResetDriverPaging(PVOID AddressWithinSection)
{
UNIMPLEMENTED;
}

View file

@ -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
)
{
}

View file

@ -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;
}

View file

@ -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
)
{
}

View file

@ -13,45 +13,15 @@
#include <windows.h>
#include <ddk/ntddk.h>
#include <internal/ob.h>
#include <internal/io.h>
#define NDEBUG
#include <internal/debug.h>
/* GLOBALS *******************************************************************/
OBJECT_TYPE DeviceObjectType = {{0,0,NULL},
0,
0,
ULONG_MAX,
ULONG_MAX,
sizeof(DEVICE_OBJECT),
0,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
};
OBJECT_TYPE FileObjectType = {{0,0,NULL},
0,
0,
ULONG_MAX,
ULONG_MAX,
sizeof(FILE_OBJECT),
0,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
};
POBJECT_TYPE IoDeviceType = NULL;
POBJECT_TYPE IoFileType = NULL;
/* FUNCTIONS ****************************************************************/
@ -60,31 +30,63 @@ VOID IoInit(VOID)
{
OBJECT_ATTRIBUTES attr;
HANDLE handle;
UNICODE_STRING string;
ANSI_STRING astring;
UNICODE_STRING UnicodeString;
ANSI_STRING AnsiString;
/*
* Register iomgr types
*/
RtlInitAnsiString(&astring,"Device");
RtlAnsiStringToUnicodeString(&DeviceObjectType.TypeName,&astring,TRUE);
ObRegisterType(OBJTYP_DEVICE,&DeviceObjectType);
IoDeviceType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
RtlInitAnsiString(&astring,"File");
RtlAnsiStringToUnicodeString(&FileObjectType.TypeName,&astring,TRUE);
ObRegisterType(OBJTYP_FILE,&FileObjectType);
IoDeviceType->TotalObjects = 0;
IoDeviceType->TotalHandles = 0;
IoDeviceType->MaxObjects = ULONG_MAX;
IoDeviceType->MaxHandles = ULONG_MAX;
IoDeviceType->PagedPoolCharge = 0;
IoDeviceType->NonpagedPoolCharge = sizeof(DEVICE_OBJECT);
IoDeviceType->Dump = NULL;
IoDeviceType->Open = NULL;
IoDeviceType->Close = NULL;
IoDeviceType->Delete = NULL;
IoDeviceType->Parse = NULL;
IoDeviceType->Security = NULL;
IoDeviceType->QueryName = NULL;
IoDeviceType->OkayToClose = NULL;
RtlInitAnsiString(&AnsiString,"Device");
RtlAnsiStringToUnicodeString(&IoDeviceType->TypeName,&AnsiString,TRUE);
IoFileType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
IoFileType->TotalObjects = 0;
IoFileType->TotalHandles = 0;
IoFileType->MaxObjects = ULONG_MAX;
IoFileType->MaxHandles = ULONG_MAX;
IoFileType->PagedPoolCharge = 0;
IoFileType->NonpagedPoolCharge = sizeof(FILE_OBJECT);
IoFileType->Dump = NULL;
IoFileType->Open = NULL;
IoFileType->Close = NULL;
IoFileType->Delete = NULL;
IoFileType->Parse = NULL;
IoFileType->Security = NULL;
IoFileType->QueryName = NULL;
IoFileType->OkayToClose = NULL;
RtlInitAnsiString(&AnsiString,"File");
RtlAnsiStringToUnicodeString(&IoFileType->TypeName,&AnsiString,TRUE);
/*
* Create the device directory
*/
RtlInitAnsiString(&astring,"\\Device");
RtlAnsiStringToUnicodeString(&string,&astring,TRUE);
InitializeObjectAttributes(&attr,&string,0,NULL,NULL);
RtlInitAnsiString(&AnsiString,"\\Device");
RtlAnsiStringToUnicodeString(&UnicodeString,&AnsiString,TRUE);
InitializeObjectAttributes(&attr,&UnicodeString,0,NULL,NULL);
ZwCreateDirectoryObject(&handle,0,&attr);
RtlInitAnsiString(&astring,"\\??");
RtlAnsiStringToUnicodeString(&string,&astring,TRUE);
InitializeObjectAttributes(&attr,&string,0,NULL,NULL);
RtlInitAnsiString(&AnsiString,"\\??");
RtlAnsiStringToUnicodeString(&UnicodeString,&AnsiString,TRUE);
InitializeObjectAttributes(&attr,&UnicodeString,0,NULL,NULL);
ZwCreateDirectoryObject(&handle,0,&attr);
IoInitCancelHandling();

View file

@ -10,7 +10,7 @@
/* INCLUDES *****************************************************************/
#include <internal/hal/page.h>
#include <internal/mmhal.h>
#include <ddk/ntddk.h>
#include <internal/debug.h>

View file

@ -14,11 +14,15 @@
#include <internal/debug.h>
/* GLOBALS *******************************************************************/
static CONFIGURATION_INFORMATION SystemConfigurationInformation = {0,};
/* FUNCTIONS *****************************************************************/
PCONFIGURATION_INFORMATION IoGetConfigurationInformation()
PCONFIGURATION_INFORMATION IoGetConfigurationInformation(VOID)
{
UNIMPLEMENTED;
return(&SystemConfigurationInformation);
}
NTSTATUS IoReportResourceUsage(PUNICODE_STRING DriverClassName,

View file

@ -26,25 +26,46 @@ typedef struct
OBJECT_ATTRIBUTES Target;
} SYMLNK_OBJECT, *PSYMLNK_OBJECT;
OBJECT_TYPE SymlinkObjectType = {{NULL,0,0},
0,
0,
ULONG_MAX,
ULONG_MAX,
sizeof(SYMLNK_OBJECT),
0,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
};
POBJECT_TYPE IoSymbolicLinkType = NULL;
/* FUNCTIONS *****************************************************************/
VOID IoInitSymbolicLinkImplementation(VOID)
{
ANSI_STRING AnsiString;
IoSymbolicLinkType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
IoSymbolicLinkType->TotalObjects = 0;
IoSymbolicLinkType->TotalHandles = 0;
IoSymbolicLinkType->MaxObjects = ULONG_MAX;
IoSymbolicLinkType->MaxHandles = ULONG_MAX;
IoSymbolicLinkType->PagedPoolCharge = 0;
IoSymbolicLinkType->NonpagedPoolCharge = sizeof(SYMLNK_OBJECT);
IoSymbolicLinkType->Dump = NULL;
IoSymbolicLinkType->Open = NULL;
IoSymbolicLinkType->Close = NULL;
IoSymbolicLinkType->Delete = NULL;
IoSymbolicLinkType->Parse = NULL;
IoSymbolicLinkType->Security = NULL;
IoSymbolicLinkType->QueryName = NULL;
IoSymbolicLinkType->OkayToClose = NULL;
RtlInitAnsiString(&AnsiString,"Symbolic Link");
RtlAnsiStringToUnicodeString(&IoSymbolicLinkType->TypeName,
&AnsiString,TRUE);
}
NTSTATUS NtOpenSymbolicLinkObject(OUT PHANDLE LinkHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes)
{
return(ZwOpenSymbolicLinkObject(LinkHandle,
DesiredAccess,
ObjectAttributes));
}
NTSTATUS ZwOpenSymbolicLinkObject(OUT PHANDLE LinkHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes)
@ -58,20 +79,34 @@ NTSTATUS ZwOpenSymbolicLinkObject(OUT PHANDLE LinkHandle,
{
return(Status);
}
*LinkHandle = ObAddHandle(Object);
*LinkHandle = ObInsertHandle(KeGetCurrentProcess(),Object,
DesiredAccess,FALSE);
return(STATUS_SUCCESS);
}
NTSTATUS NtQuerySymbolicLinkObject(IN HANDLE LinkHandle,
IN OUT PUNICODE_STRING LinkTarget,
OUT PULONG ReturnedLength OPTIONAL)
{
return(ZwQuerySymbolicLinkObject(LinkHandle,LinkTarget,ReturnedLength));
}
NTSTATUS ZwQuerySymbolicLinkObject(IN HANDLE LinkHandle,
IN OUT PUNICODE_STRING LinkTarget,
OUT PULONG ReturnedLength OPTIONAL)
{
COMMON_BODY_HEADER* hdr = ObGetObjectByHandle(LinkHandle);
PSYMLNK_OBJECT SymlinkObject = (PSYMLNK_OBJECT)hdr;
PSYMLNK_OBJECT SymlinkObject;
NTSTATUS Status;
if (hdr==NULL)
Status = ObReferenceObjectByHandle(LinkHandle,
SYMBOLIC_LINK_QUERY,
IoSymbolicLinkType,
UserMode,
(PVOID*)&SymlinkObject,
NULL);
if (Status != STATUS_SUCCESS)
{
return(STATUS_INVALID_HANDLE);
return(Status);
}
RtlCopyUnicodeString(LinkTarget,SymlinkObject->Target.ObjectName);
@ -97,15 +132,6 @@ POBJECT IoOpenSymlink(POBJECT _Symlink)
return(Result);
}
VOID IoInitSymbolicLinkImplementation(VOID)
{
ANSI_STRING astring;
RtlInitAnsiString(&astring,"Symbolic Link");
RtlAnsiStringToUnicodeString(&SymlinkObjectType.TypeName,&astring,TRUE);
ObRegisterType(OBJTYP_SYMLNK,&SymlinkObjectType);
}
NTSTATUS IoCreateUnprotectedSymbolicLink(PUNICODE_STRING SymbolicLinkName,
PUNICODE_STRING DeviceName)
{
@ -124,12 +150,15 @@ NTSTATUS IoCreateSymbolicLink(PUNICODE_STRING SymbolicLinkName,
SymbolicLinkName->Buffer,DeviceName->Buffer);
InitializeObjectAttributes(&ObjectAttributes,SymbolicLinkName,0,NULL,NULL);
SymbolicLink = ObGenericCreateObject(&SymbolicLinkHandle,0,
&ObjectAttributes,OBJTYP_SYMLNK);
SymbolicLink = ObGenericCreateObject(&SymbolicLinkHandle,
SYMBOLIC_LINK_ALL_ACCESS,
&ObjectAttributes,
IoSymbolicLinkType);
if (SymbolicLink == NULL)
{
return(STATUS_UNSUCCESSFUL);
}
SymbolicLink->TargetName.Buffer = ExAllocatePool(NonPagedPool,
((wstrlen(DeviceName->Buffer)+1)*2));
SymbolicLink->TargetName.MaximumLength = wstrlen(DeviceName->Buffer);
@ -146,3 +175,25 @@ NTSTATUS IoDeleteSymbolicLink(PUNICODE_STRING DeviceName)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtCreateSymbolicLinkObject(
OUT PHANDLE SymbolicLinkHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PUNICODE_STRING Name)
{
return(NtCreateSymbolicLinkObject(SymbolicLinkHandle,
DesiredAccess,
ObjectAttributes,
Name));
}
NTSTATUS STDCALL ZwCreateSymbolicLinkObject(
OUT PHANDLE SymbolicLinkHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PUNICODE_STRING Name)
{
UNIMPLEMENTED;
}

View file

@ -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)

View file

@ -12,25 +12,95 @@
#include <ddk/ntddk.h>
#include <internal/string.h>
#include <internal/i386/segment.h>
#include <internal/ps.h>
#define NDEBUG
#include <internal/debug.h>
extern VOID KeApcProlog(VOID);
/* FUNCTIONS *****************************************************************/
VOID KeDrainApcQueue(VOID)
VOID KeApcProlog2(PKAPC Apc)
{
PLIST_ENTRY current_entry;
PKAPC current;
PKTHREAD CurrentThread=KeGetCurrentThread();
while ((current_entry=RemoveHeadList(CurrentThread->ApcList))!=NULL)
{
current = CONTAINING_RECORD(current_entry,KAPC,ApcListEntry);
current->NormalRoutine(current->NormalContext,
current->SystemArgument1,
current->SystemArgument2);
current_entry = current_entry->Flink;
Apc->KernelRoutine(Apc,
&Apc->NormalRoutine,
&Apc->NormalContext,
&Apc->SystemArgument2,
&Apc->SystemArgument2);
PsSuspendThread(CONTAINING_RECORD(Apc->Thread,ETHREAD,Tcb));
}
VOID KeDeliverKernelApc(PKAPC Apc)
/*
* FUNCTION: Simulates an interrupt on the target thread which will transfer
* control to a kernel mode routine
*/
{
PKTHREAD TargetThread;
PULONG Stack;
TargetThread = Apc->Thread;
if (TargetThread == KeGetCurrentThread())
{
Apc->KernelRoutine(Apc,
&Apc->NormalRoutine,
&Apc->NormalContext,
&Apc->SystemArgument2,
&Apc->SystemArgument2);
return;
}
if (TargetThread->Context.cs == KERNEL_CS)
{
TargetThread->Context.esp = TargetThread->Context.esp - 16;
Stack = (PULONG)TargetThread->Context.esp;
Stack[0] = TargetThread->Context.eax;
Stack[1] = TargetThread->Context.eip;
Stack[2] = TargetThread->Context.cs;
Stack[3] = TargetThread->Context.eflags;
TargetThread->Context.eip = KeApcProlog;
TargetThread->Context.eax = (ULONG)Apc;
}
else
{
TargetThread->Context.esp = TargetThread->Context.esp - 40;
Stack = (PULONG)TargetThread->Context.esp;
Stack[9] = TargetThread->Context.ss;
Stack[8] = TargetThread->Context.esp;
Stack[7] = TargetThread->Context.gs;
Stack[6] = TargetThread->Context.fs;
Stack[5] = TargetThread->Context.ds;
Stack[4] = TargetThread->Context.es;
Stack[3] = TargetThread->Context.eflags;
Stack[2] = TargetThread->Context.cs;
Stack[1] = TargetThread->Context.eip;
Stack[0] = TargetThread->Context.eax;
TargetThread->Context.eip = KeApcProlog;
TargetThread->Context.eax = (ULONG)Apc;
}
PsResumeThread(CONTAINING_RECORD(TargetThread,ETHREAD,Tcb));
}
void KeInsertQueueApc(struct _KAPC *Apc, PVOID SystemArgument1,
PVOID SystemArgument2, UCHAR Mode)
{
KIRQL oldlvl;
DPRINT("KeInsertQueueApc(Apc %x, SystemArgument1 %x, "
"SystemArgument2 %x, Mode %d)\n",Apc,SystemArgument1,
SystemArgument2,Mode);
KeRaiseIrql(DISPATCH_LEVEL,&oldlvl);
if (Apc->KernelRoutine != NULL)
{
KeDeliverKernelApc(Apc);
}
KeLowerIrql(oldlvl);
}
VOID KeInitializeApc(PKAPC Apc,
@ -55,18 +125,35 @@ VOID KeInitializeApc(PKAPC Apc,
Apc->ApcMode=Mode;
}
void KeInsertQueueApc(PKAPC Apc, PVOID SystemArgument1,
PVOID SystemArgument2, UCHAR Mode)
NTSTATUS STDCALL NtQueueApcThread(HANDLE ThreadHandle,
PKNORMAL_ROUTINE ApcRoutine,
PVOID NormalContext,
PVOID SystemArgument1,
PVOID SystemArgument2)
{
Apc->SystemArgument1=SystemArgument1;
Apc->SystemArgument2=SystemArgument2;
Apc->ApcMode=Mode;
if (Apc->Inserted)
{
return;
}
Apc->Inserted=TRUE;
InsertTailList(Apc->Thread->ApcList,&Apc->ApcListEntry);
return;
return(NtQueueApcThread(ThreadHandle,
ApcRoutine,
NormalContext,
SystemArgument1,
SystemArgument2));
}
NTSTATUS STDCALL ZwQueueApcThread(HANDLE ThreadHandle,
PKNORMAL_ROUTINE ApcRoutine,
PVOID NormalContext,
PVOID SystemArgument1,
PVOID SystemArgument2)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtTestAlert(VOID)
{
return(ZwTestAlert());
}
NTSTATUS STDCALL ZwTestAlert(VOID)
{
UNIMPLEMENTED;
}

View file

@ -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(;;);
}

View file

@ -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
)
{
}

View file

@ -11,6 +11,7 @@
#include <windows.h>
#include <ddk/ntddk.h>
#include <internal/ke.h>
#include <internal/ps.h>
/* FUNCTIONS ****************************************************************/

View file

@ -11,6 +11,7 @@
/* INCLUDE *****************************************************************/
#include <windows.h>
#include <ddk/ntddk.h>
/* GLOBALS *****************************************************************/
@ -44,3 +45,11 @@ VOID STDCALL SetLastError(DWORD dwErrCode)
error_code=dwErrCode;
}
NTSTATUS STDCALL NtRaiseHardError(VOID)
{
}
NTSTATUS STDCALL NtSetDefaultHardErrorPort(VOID)
{
}

View file

@ -11,6 +11,7 @@
/* INCLUDES *****************************************************************/
#include <ddk/ntddk.h>
#include <internal/ke.h>
#define NDEBUG
#include <internal/debug.h>

View file

@ -5,379 +5,15 @@
*
*/
#include <internal/symbol.h>
#include <ddk/ntddk.h>
#include <ddk/ntifs.h>
#include <internal/ke.h>
#include <internal/ntoskrnl.h>
#include <internal/mm.h>
#include <wstring.h>
#ifdef __cplusplus
extern "C" {
#endif
void free_page(void);
void get_dma_page(void);
void DbgPrint(void);
void printk(void);
void ExAcquireFastMutex(void);
void ExAcquireFastMutexUnsafe(void);
void ExAcquireResourceExclusive(void);
void ExAcquireResourceExclusiveLite(void);
void ExAcquireResourceSharedLite(void);
void ExAcquireSharedStarveExclusive(void);
void ExAcquireSharedWaitForExclusive(void);
void ExAllocateFromNPagedLookasideList(void);
void ExAllocateFromPagedLookasideList(void);
void ExAllocateFromZone(void);
void ExAllocatePool(void);
void ExAllocatePoolWithQuota(void);
void ExAllocatePoolWithQuotaTag(void);
void ExAllocatePoolWithTag(void);
void ExConvertExclusiveToSharedLite(void);
void ExDeleteNPagedLookasideList(void);
void ExDeletePagedLookasideList(void);
void ExDeleteResource(void);
void ExDeleteResourceLite(void);
void ExExtendZone(void);
void ExFreePool(void);
void ExFreeToNPagedLookasideList(void);
void ExFreeToPagedLookasideList(void);
void ExFreeToZone(void);
void ExGetCurrentResourceThread(void);
void ExGetExclusiveWaiterCount(void);
void ExGetSharedWaiterCount(void);
void ExHookException(void);
void ExInitializeFastMutex(void);
void ExInitializeNPagedLookasideList(void);
void ExInitializePagedLookasideList(void);
void ExInitializeResource(void);
void ExInitializeResourceLite(void);
void ExInitializeSListHead(void);
void ExInitializeWorkItem(void);
void ExInitializeZone(void);
void ExInterlockedAddLargeInteger(void);
void ExInterlockedAddUlong(void);
void ExInterlockedAllocateFromZone(void);
void ExInterlockedDecrementLong(void);
void ExInterlockedExchangeUlong(void);
void ExInterlockedExtendZone(void);
void ExInterlockedFreeToZone(void);
void ExInterlockedIncrementLong(void);
void ExInterlockedInsertHeadList(void);
void ExInterlockedInsertTailList(void);
void ExInterlockedPopEntryList(void);
void ExInterlockedPopEntrySList(void);
void ExInterlockedPushEntryList(void);
void ExInterlockedPushEntrySList(void);
void ExInterlockedRemoveHeadList(void);
void ExIsFullZone(void);
void ExIsObjectInFirstZoneSegment(void);
void ExIsResourceAcquiredExclusiveLite(void);
void ExIsResourceAcquiredSharedLite(void);
void ExLocalTimeToSystemTime(void);
void ExQueryDepthSListHead(void);
void ExQueueWorkItem(void);
void ExRaiseStatus(void);
void ExReinitializeResourceLite(void);
void ExReleaseFastMutex(void);
void ExReleaseFastMutexUnsafe(void);
void ExReleaseResource(void);
void ExReleaseResourceForThread(void);
void ExReleaseResourceForThreadLite(void);
void ExSystemTimeToLocalTime(void);
void ExTryToAcquireFastMutex(void);
void ExTryToAcquireResourceExclusiveLite(void);
void InterlockedCompareExchange(void);
void InterlockedExchange(void);
void InterlockedExchangeAdd(void);
void InterlockedIncrement(void);
void HalAllocateCommonBuffer(void);
void HalAssignSlotResources(void);
void HalExamineMBR(void);
void HalFreeCommonBuffer(void);
void HalGetAdapter(void);
void HalGetBusData(void);
void HalGetBusDataByOffset(void);
void HalGetDmaAlignmentRequirement(void);
void HalGetInterruptVector(void);
void HalQuerySystemInformation(void);
void HalReadDmaCounter(void);
void HalSetBusData(void);
void HalSetBusDataByOffset(void);
void HalTranslateBusAddress(void);
void IoAcquireCancelSpinLock(void);
void IoAllocateAdapterChannel(void);
void IoAllocateController(void);
void IoAllocateErrorLogEntry(void);
void IoAllocateIrp(void);
void IoAllocateMdl(void);
void IoAssignArcName(void);
void IoAssignResources(void);
void IoAttachDevice(void);
void IoAttachDeviceByPointer(void);
void IoAttachDeviceToDeviceStack(void);
void IoBuildAsynchronousFsdRequest(void);
void IoBuildDeviceIoControlRequest(void);
void IoBuildPartialMdl(void);
void IoBuildSynchronousFsdRequest(void);
void IoCallDriver(void);
void IoCancelIrp(void);
void IoCheckShareAccess(void);
void IoCompleteRequest(void);
void IoConnectInterrupt(void);
void IoCreateController(void);
void IoCreateDevice(void);
void IoCreateNotificationEvent(void);
void IoCreateSymbolicLink(void);
void IoCreateSynchronizationEvent(void);
void IoCreateUnprotectedSymbolicLink(void);
void IoDeassignArcName(void);
void IoDeleteController(void);
void IoDeleteDevice(void);
void IoDeleteSymbolicLink(void);
void IoDetachDevice(void);
void IoDisconnectInterrupt(void);
void IoFlushAdapterBuffers(void);
void IoFreeAdapterChannel(void);
void IoFreeController(void);
void IoFreeIrp(void);
void IoFreeMapRegisters(void);
void IoFreeMdl(void);
void IoGetConfigurationInformation(void);
void IoGetCurrentIrpStackLocation(void);
void IoGetCurrentProcess(void);
void IoGetDeviceObjectPointer(void);
void IoGetDeviceToVerify(void);
void IoGetFileObjectGenericMapping(void);
void IoGetFunctionCodeFromCtlCode(void);
void IoGetInitialStack(void);
void IoGetNextIrpStackLocation(void);
void IoGetRelatedDeviceObject(void);
void IoInitializeDpcRequest(void);
void IoInitializeIrp(void);
void IoInitializeTimer(void);
void IoIsErrorUserInduced(void);
void IoIsTotalDeviceFailure(void);
void IoMakeAssociatedIrp(void);
void IoMapTransfer(void);
void IoMarkIrpPending(void);
void IoQueryDeviceDescription(void);
void IoRaiseHardError(void);
void IoRaiseInformationalHardError(void);
void IoReadPartitionTable(void);
void IoRegisterDriverReinitialization(void);
void IoRegisterFileSystem(void);
void IoRegisterShutdownNotification(void);
void IoReleaseCancelSpinLock(void);
void IoRemoveShareAccess(void);
void IoReportResourceUsage(void);
void IoRequestDpc(void);
void IoSetCancelRoutine(void);
void IoSetCompletionRoutine(void);
void IoSetHardErrorOrVerifyDevice(void);
void IoSetNextIrpStackLocation(void);
void IoSetPartitionInformation(void);
void IoSetShareAccess(void);
void IoSizeOfIrp(void);
void IoStartNextPacket(void);
void IoStartNextPacketByKey(void);
void IoStartPacket(void);
void IoStartTimer(void);
void IoStopTimer(void);
void IoUnregisterShutdownNotification(void);
void IoUpdateShareAccess(void);
void IoWriteErrorLogEntry(void);
void IoWritePartitionTable(void);
void KeAcquireSpinLock(void);
void KeAcquireSpinLockAtDpcLevel(void);
void KeBugCheck(void);
void KeBugCheckEx(void);
void KeCancelTimer(void);
void KeClearEvent(void);
void KeDelayExecutionThread(void);
void KeDeregisterBugCheckCallback(void);
void KeEnterCriticalRegion(void);
void KeFlushIoBuffers(void);
void KeGetCurrentIrql(void);
void KeGetCurrentProcessorNumber(void);
void KeGetDcacheFillSize(void);
void KeInitializeCallbackRecord(void);
void KeInitializeDeviceQueue(void);
void KeInitializeDpc(void);
void KeInitializeEvent(void);
void KeInitializeMutex(void);
void KeInitializeSemaphore(void);
void KeInitializeSpinLock(void);
void KeInitializeTimer(void);
void KeInitializeTimerEx(void);
void KeInsertByKeyDeviceQueue(void);
void KeInsertDeviceQueue(void);
void KeInsertQueueDpc(void);
void KeLeaveCriticalRegion(void);
void KeLowerIrql(void);
void KeQueryPerformanceCounter(void);
void KeQuerySystemTime(void);
void KeQueryTickCount(void);
void KeQueryTimeIncrement(void);
void KeRaiseIrql(void);
void KeReadStateEvent(void);
void KeReadStateMutex(void);
void KeReadStateSemaphore(void);
void KeReadStateTimer(void);
void KeRegisterBugCheckCallback(void);
void KeReleaseMutex(void);
void KeReleaseSemaphore(void);
void KeReleaseSpinLock(void);
void KeReleaseSpinLockFromDpcLevel(void);
void KeRemoveByKeyDeviceQueue(void);
void KeRemoveDeviceQueue(void);
void KeRemoveQueueDpc(void);
void KeResetEvent(void);
void KeSetBasePriorityThread(void);
void KeSetEvent(void);
void KeSetPriorityThread(void);
void KeSetTimer(void);
void KeSetTimerEx(void);
void KeStallExecutionProcessor(void);
void KeSynchronizeExecution(void);
void KeWaitForMultipleObjects(void);
void KeWaitForMutexObject(void);
void KeWaitForSingleObject(void);
void MmAllocateContiguousMemory(void);
void MmAllocateNonCachedMemory(void);
void MmBuildMdlForNonPagedPool(void);
void MmCreateMdl(void);
void MmFreeContiguousMemory(void);
void MmFreeNonCachedMemory(void);
void MmGetMdlByteCount(void);
void MmGetMdlByteOffset(void);
void MmGetMdlVirtualAddress(void);
void MmGetPhysicalAddress(void);
void MmGetSystemAddressForMdl(void);
void MmInitializeMdl(void);
void MmIsAddressValid(void);
void MmIsNonPagedSystemAddressValid(void);
void MmIsThisAnNtAsSystem(void);
void MmLockPagableCodeSection(void);
void MmLockPagableDataSection(void);
void MmLockPagableSectionByHandle(void);
void MmMapIoSpace(void);
void MmMapLockedPages(void);
void MmPageEntireDriver(void);
void MmResetDriverPaging(void);
void MmPrepareMdlForReuse(void);
void MmProbeAndLockPages(void);
void MmQuerySystemSize(void);
void MmSizeOfMdl(void);
void MmUnlockPages(void);
void MmUnlockPagableImageSection(void);
void MmUnmapIoSpace(void);
void MmUnmapLockedPages(void);
void ObDereferenceObject(void);
void ObReferenceObjectByHandle(void);
void ObReferenceObjectByPointer(void);
void PsCreateSystemThread(void);
void PsGetCurrentProcess(void);
void PsGetCurrentThread(void);
void PsTerminateSystemThread(void);
void InitializeListHead(void);
void InitializeObjectAttributes(void);
void InsertHeadList(void);
void InsertTailList(void);
void PopEntryList(void);
void PushEntryList(void);
void RemoveEntryList(void);
void RemoveHeadList(void);
void RemoveTailList(void);
void RtlAnsiStringToUnicodeSize(void);
void RtlAnsiStringToUnicodeString(void);
void RtlAppendUnicodeStringToString(void);
void RtlAppendUnicodeToString(void);
void RtlCharToInteger(void);
void RtlCheckRegistryKey(void);
void RtlCompareMemory(void);
void RtlCompareString(void);
void RtlCompareUnicodeString(void);
void RtlConvertLongToLargeInteger(void);
void RtlConvertUlongToLargeInteger(void);
void RtlCopyBytes(void);
void RtlCopyMemory(void);
void RtlCopyString(void);
void RtlCopyUnicodeString(void);
void RtlCreateRegistryKey(void);
void RtlCreateSecurityDescriptor(void);
void RtlDeleteRegistryValue(void);
void RtlEnlargedIntegerMultiply(void);
void RtlEnlargedUnsignedDivide(void);
void RtlEnlargedUnsignedMultiply(void);
void RtlEqualString(void);
void RtlEqualUnicodeString(void);
void RtlExtendedIntegerMultiply(void);
void RtlExtendedLargeIntegerDivide(void);
void RtlExtendedMagicDivide(void);
void RtlFillMemory(void);
void RtlFreeAnsiString(void);
void RtlFreeUnicodeString(void);
void RtlInitAnsiString(void);
void RtlInitString(void);
void RtlInitUnicodeString(void);
void RtlIntegerToUnicodeString(void);
void RtlLargeIntegerAdd(void);
void RtlLargeIntegerAnd(void);
void RtlLargeIntegerArithmeticShift(void);
void RtlLargeIntegerDivide(void);
void RtlLargeIntegerEqualTo(void);
void RtlLargeIntegerEqualToZero(void);
void RtlLargeIntegerGreaterThan(void);
void RtlLargeIntegerGreaterThanOrEqualTo(void);
void RtlLargeIntegerGreaterThanOrEqualToZero(void);
void RtlLargeIntegerGreaterThanZero(void);
void RtlLargeIntegerLessThan(void);
void RtlLargeIntegerLessThanOrEqualTo(void);
void RtlLargeIntegerLessThanZero(void);
void RtlLargeIntegerNegate(void);
void RtlLargeIntegerNotEqualTo(void);
void RtlLargeIntegerShiftLeft(void);
void RtlLargeIntegerShiftRight(void);
void RtlLargeIntegerSubtract(void);
void RtlLengthSecurityDescriptor(void);
void RtlMoveMemory(void);
void RtlQueryRegistryValues(void);
void RtlRetrieveUlong(void);
void RtlRetrieveUshort(void);
void RtlSetDaclSecurityDescriptor(void);
void RtlStoreUlong(void);
void RtlStoreUshort(void);
void RtlTimeFieldsToTime(void);
void RtlTimeToTimeFields(void);
void RtlUnicodeStringToAnsiString(void);
void RtlUnicodeStringToInteger(void);
void RtlUpcaseUnicodeString(void);
void RtlUpperString(void);
void RtlValidSecurityDescriptor(void);
void RtlWriteRegistryValue(void);
void RtlZeroMemory(void);
void SeAccessCheck(void);
void SeAssignSecurity(void);
void SeDeassignSecurity(void);
void SeSinglePrivilegeCheck(void);
void ZwClose(void);
void ZwCreateDirectoryObject(void);
void ZwCreateFile(void);
void ZwCreateKey(void);
void ZwDeleteKey(void);
void ZwEnumerateKey(void);
void ZwEnumerateValueKey(void);
void ZwFlushKey(void);
void ZwMakeTemporaryObject(void);
void ZwMapViewOfSection(void);
void ZwOpenFile(void);
void ZwOpenKey(void);
void ZwOpenSection(void);
void ZwQueryInformationFile(void);
void ZwQueryKey(void);
void ZwQueryValueKey(void);
void ZwReadFile(void);
void ZwSetInformationFile(void);
void ZwSetInformationThread(void);
void ZwSetValueKey(void);
void ZwUnmapViewOfSection(void);
void ZwWriteFile(void);
void sprintf(void);
void wcschr(void);
#ifdef __cplusplus
}
#endif
@ -752,5 +388,12 @@ export symbol_table[]={
{"_ZwWriteFile",(unsigned int)ZwWriteFile},
{"_sprintf",(unsigned int)sprintf},
{"_wcschr",(unsigned int)wcschr},
{"_wcsncat",(unsigned int)wcsncat},
{"_wcsncpy",(unsigned int)wcsncpy},
{"_wtolower",(unsigned int)wtolower},
{"_wtoupper",(unsigned int)wtoupper},
{"_CbInitDccb",(unsigned int)CbInitDccb},
{"_CbAcquireForRead",(unsigned int)CbAcquireForRead},
{"_CbReleaseFromRead",(unsigned int)CbReleaseFromRead},
{NULL,NULL},
};

View file

@ -17,7 +17,7 @@
/* FUNCTIONS *****************************************************************/
VOID KeInit()
VOID KeInit(VOID)
{
KeInitDpc();
KeInitializeBugCheck();

View file

@ -37,5 +37,6 @@ LONG KeReleaseSemaphore(PKSEMAPHORE Semaphore,
LONG Adjustment,
BOOLEAN Wait)
{
UNIMPLEMENTED;
}

View file

@ -53,12 +53,12 @@ static LIST_ENTRY timer_list_head = {NULL,NULL};
static KSPIN_LOCK timer_list_lock = {0,};
#define MICROSECONDS_TO_CALIBRATE (1000000)
#define MICROSECONDS_PER_TICK (54945)
#define MICROSECONDS_IN_A_SECOND (10000000)
#define TICKS_PER_SECOND_APPROX (18)
static unsigned int loops_per_microsecond = 17;
#define MICROSECONDS_PER_TICK (54945)
#define TICKS_TO_CALIBRATE (1)
#define CALIBRATE_PERIOD (MICROSECONDS_PER_TICK * TICKS_TO_CALIBRATE)
static unsigned int loops_per_microsecond = 100;
/* FUNCTIONS **************************************************************/
@ -68,37 +68,80 @@ void KeCalibrateTimerLoop()
unsigned int end_tick;
unsigned int nr_ticks;
unsigned int i;
unsigned int microseconds;
return;
for (i=0;i<5;i++)
for (i=0;i<20;i++)
{
start_tick = ticks;
microseconds = 0;
while (start_tick == ticks);
KeStallExecutionProcessor(MICROSECONDS_TO_CALIBRATE);
end_tick = ticks;
while (end_tick==ticks);
nr_ticks = end_tick - start_tick;
loops_per_microsecond = (loops_per_microsecond * MICROSECONDS_TO_CALIBRATE)
/ (nr_ticks*MICROSECONDS_PER_TICK);
DbgPrint("nr_ticks %d\n",nr_ticks);
DbgPrint("loops_per_microsecond %d\n",loops_per_microsecond);
DbgPrint("Processor speed (approx) %d\n",
(6*loops_per_microsecond)/1000);
if (nr_ticks == (TICKS_PER_SECOND_APPROX * MICROSECONDS_TO_CALIBRATE)
/ MICROSECONDS_IN_A_SECOND)
while (ticks == (start_tick+TICKS_TO_CALIBRATE))
{
DbgPrint("Testing loop\n");
KeStallExecutionProcessor(10000);
DbgPrint("Finished loop\n");
return;
KeStallExecutionProcessor(1);
microseconds++;
};
// DbgPrint("microseconds %d\n",microseconds);
if (microseconds > (CALIBRATE_PERIOD+1000))
{
loops_per_microsecond = loops_per_microsecond + 1;
}
if (microseconds < (CALIBRATE_PERIOD-1000))
{
loops_per_microsecond = loops_per_microsecond - 1;
}
// DbgPrint("loops_per_microsecond %d\n",loops_per_microsecond);
}
// for(;;);
}
NTSTATUS STDCALL NtQueryTimerResolution (OUT PULONG MinimumResolution,
OUT PULONG MaximumResolution,
OUT PULONG ActualResolution)
{
return(ZwQueryTimerResolution(MinimumResolution,MaximumResolution,
ActualResolution));
}
NTSTATUS STDCALL ZwQueryTimerResolution (OUT PULONG MinimumResolution,
OUT PULONG MaximumResolution,
OUT PULONG ActualResolution)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtSetTimerResolution(IN ULONG RequestedResolution,
IN BOOL SetOrUnset,
OUT PULONG ActualResolution)
{
return(ZwSetTimerResolution(RequestedResolution,
SetOrUnset,
ActualResolution));
}
NTSTATUS STDCALL ZwSetTimerResolution(IN ULONG RequestedResolution,
IN BOOL SetOrUnset,
OUT PULONG ActualResolution)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtQueryPerformanceCounter(IN PLARGE_INTEGER Counter,
IN PLARGE_INTEGER Frequency)
{
return(ZwQueryPerformanceCounter(Counter,
Frequency));
}
NTSTATUS STDCALL ZwQueryPerformanceCounter(IN PLARGE_INTEGER Counter,
IN PLARGE_INTEGER Frequency)
{
UNIMPLEMENTED;
}
NTSTATUS KeAddThreadTimeout(PKTHREAD Thread, PLARGE_INTEGER Interval)
{
@ -106,6 +149,19 @@ NTSTATUS KeAddThreadTimeout(PKTHREAD Thread, PLARGE_INTEGER Interval)
KeSetTimer(&(Thread->TimerBlock),*Interval,NULL);
}
NTSTATUS STDCALL NtDelayExecution(IN BOOLEAN Alertable,
IN TIME *Interval)
{
return(ZwDelayExecution(Alertable,Interval));
}
NTSTATUS STDCALL ZwDelayExecution(IN BOOLEAN Alertable,
IN TIME *Interval)
{
UNIMPLEMENTED;
}
NTSTATUS KeDelayExecutionThread(KPROCESSOR_MODE WaitMode,
BOOLEAN Alertable,
PLARGE_INTEGER Interval)
@ -211,6 +267,15 @@ VOID KeQuerySystemTime(PLARGE_INTEGER CurrentTime)
ULLToLargeInteger(system_time,CurrentTime);
}
NTSTATUS STDCALL NtGetTickCount(PULONG UpTime)
{
return(ZwGetTickCount(UpTime));
}
NTSTATUS STDCALL ZwGetTickCount(PULONG UpTime)
{
UNIMPLEMENTED;
}
BOOLEAN KeSetTimer(PKTIMER Timer, LARGE_INTEGER DueTime, PKDPC Dpc)
/*

View file

@ -80,7 +80,7 @@ VOID KeDispatcherObjectWakeAll(DISPATCHER_HEADER* hdr)
current = CONTAINING_RECORD(current_entry,KWAIT_BLOCK,
WaitListEntry);
DPRINT("Waking %x\n",current->Thread);
PsWakeThread((PETHREAD)current->Thread);
PsResumeThread(CONTAINING_RECORD(current->Thread,ETHREAD,Tcb));
};
}
@ -101,7 +101,7 @@ BOOLEAN KeDispatcherObjectWakeOne(DISPATCHER_HEADER* hdr)
WaitListEntry);
DPRINT("current_entry %x current %x\n",current_entry,current);
DPRINT("Waking %x\n",current->Thread);
PsWakeThread((PETHREAD)current->Thread);
PsResumeThread(CONTAINING_RECORD(current->Thread,ETHREAD,Tcb));
return(TRUE);
}
@ -146,15 +146,17 @@ NTSTATUS KeWaitForSingleObject(PVOID Object,
{
DISPATCHER_HEADER* hdr = (DISPATCHER_HEADER *)Object;
KWAIT_BLOCK blk;
KIRQL oldlvl;
DPRINT("Entering KeWaitForSingleObject(Object %x)\n",Object);
KeAcquireDispatcherDatabaseLock(FALSE);
if (hdr->SignalState)
{
if (hdr->Type == SynchronizationEvent)
{
hdr->SignalState=FALSE;
}
KeReleaseDispatcherDatabaseLock(FALSE);
return(STATUS_SUCCESS);
}
@ -173,7 +175,7 @@ NTSTATUS KeWaitForSingleObject(PVOID Object,
// DPRINT("hdr->WaitListHead.Flink %x hdr->WaitListHead.Blink %x\n",
// hdr->WaitListHead.Flink,hdr->WaitListHead.Blink);
KeReleaseDispatcherDatabaseLock(FALSE);
PsSuspendThread();
PsSuspendThread(PsGetCurrentThread());
return(STATUS_SUCCESS);
}
@ -193,3 +195,63 @@ VOID KeInitializeDispatcher(VOID)
{
KeInitializeSpinLock(&DispatcherDatabaseLock);
}
NTSTATUS STDCALL NtWaitForMultipleObjects (IN ULONG Count,
IN PHANDLE Object[],
IN CINT WaitType,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Time)
{
return(ZwWaitForMultipleObjects(Count,
Object,
WaitType,
Alertable,
Time));
}
NTSTATUS STDCALL ZwWaitForMultipleObjects (IN ULONG Count,
IN PHANDLE Object[],
IN CINT WaitType,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Time)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtWaitForSingleObject (IN PHANDLE Object,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Time)
{
return(ZwWaitForSingleObject(Object,
Alertable,
Time));
}
NTSTATUS STDCALL ZwWaitForSingleObject (IN PHANDLE Object,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Time)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtSignalAndWaitForSingleObject(
IN HANDLE EventHandle,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Time,
PULONG NumberOfWaitingThreads OPTIONAL)
{
return(ZwSignalAndWaitForSingleObject(EventHandle,
Alertable,
Time,
NumberOfWaitingThreads));
}
NTSTATUS STDCALL ZwSignalAndWaitForSingleObject(
IN HANDLE EventHandle,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Time,
PULONG NumberOfWaitingThreads OPTIONAL)
{
UNIMPLEMENTED;
}

View file

@ -20,7 +20,7 @@
/* INCLUDES ****************************************************************/
#include <internal/stddef.h>
#include <internal/hal/page.h>
#include <internal/mmhal.h>
#include <internal/mm.h>
#include <internal/ntoskrnl.h>
#include <internal/bitops.h>
@ -166,7 +166,7 @@ unsigned int get_free_page(void)
unsigned int eflags;
__asm__("pushf\n\tpop %0\n\tcli\n\t"
: "=d" (eflags));
CHECKPOINT;
/*
* If we are totally out of memory then panic
*/
@ -175,9 +175,9 @@ unsigned int get_free_page(void)
printk("CRITICAL: Unable to allocate page\n");
KeBugCheck(KBUG_OUT_OF_MEMORY);
}
CHECKPOINT;
addr = 0;
CHECKPOINT;
if (free_page_list_head->nr_pages>1)
{
free_page_list_head->nr_pages--;
@ -189,14 +189,14 @@ unsigned int get_free_page(void)
addr = (unsigned int)free_page_list_head;
free_page_list_head = free_page_list_head -> next;
}
CHECKPOINT;
__asm__("push %0\n\tpopf\n\t"
:
: "d" (eflags));
addr = addr - (IDMAP_BASE);
DPRINT("allocated %x\n",addr);
CHECKPOINT;
return(addr);
}

View file

@ -17,7 +17,7 @@
#include <internal/bitops.h>
#include <internal/string.h>
#include <internal/hal/page.h>
#include <internal/mmhal.h>
#define NDEBUG
#include <internal/debug.h>
@ -115,6 +115,7 @@ void MmInitalize(boot_param* bp)
{
set_page(i,0,0);
}
set_page(0,0,0);
FLUSH_TLB;
CHECKPOINT;
/*
@ -122,51 +123,3 @@ void MmInitalize(boot_param* bp)
*/
VirtualInit(bp);
}
#if 0
void* MmMapIoSpace(unsigned int physical_address, unsigned int size,
unsigned int cachable)
/*
* FUNCTION: Make a portion of io space accessible to a device driver
*/
{
/*
* Determine here if the mapping is legel
*/
/*
* Find an address to place the mapping
*/
memory_area_desc* current = memory_area_list_head;
memory_area_desc* new_area=ExAllocateMemory(sizeof(memory_area_desc));
size = PAGE_ROUND_UP(size);
while (current!=NULL)
{
if ( current->next==NULL ||
(current->next->base - (current->base+current->length))
>= size)
{
new_area->base=current->base+current->length;
new_area->length=size;
new_area->next=current->next;
current->next=new_area;
}
current=current->next;
}
/*
* Map the desired physical memory
*/
for (int i=0;i<size;i++)
{
set_page(new_area->base+i,
PA_READ | PA_WRITE | PA_EXECUTE | PA_SYSTEM,
physical_address+i);
}
return((void *)new_area->base);
}
#endif

View file

@ -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

View file

@ -4,539 +4,57 @@
* FILE: ntoskrnl/mm/pool.c
* PURPOSE: Implements the kernel memory pool
* PROGRAMMER: David Welch (welch@mcmail.com)
* UPDATE HISTORY:
* 27/05/98: Created
* 10/06/98: Bug fixes by Iwan Fatahi (i_fatahi@hotmail.com)
* in take_block (if current bigger than required)
* in remove_from_used_list
* in ExFreePool
* 23/08/98: Fixes from Robert Bergkvist (fragdance@hotmail.com)
*/
/* INCLUDES ****************************************************************/
#include <internal/string.h>
#include <internal/stddef.h>
#include <internal/mm.h>
#include <internal/hal/page.h>
#include <internal/pool.h>
#include <internal/bitops.h>
#include <internal/ntoskrnl.h>
#define NDEBUG
#include <internal/debug.h>
#include <ddk/ntddk.h>
#include <internal/pool.h>
/* TYPES *******************************************************************/
/*
* fields present at the start of a block (this is for internal use only)
*/
typedef struct _block_hdr
{
unsigned int size;
struct _block_hdr* previous;
struct _block_hdr* next;
} block_hdr;
//#define NDEBUG
#include <internal/debug.h>
/* GLOBALS *****************************************************************/
/*
* Memory managment initalized symbol for the base of the pool
*/
unsigned int kernel_pool_base = 0;
/*
* Pointer to the first block in the free list
*/
static block_hdr* free_list_head = NULL;
static block_hdr* used_list_head = NULL;
static unsigned int nr_free_blocks = 0;
static unsigned int nr_used_blocks = 0;
#define ALLOC_MAP_SIZE (NONPAGED_POOL_SIZE / PAGESIZE)
/*
* One bit for each page in the kmalloc region
* If set then the page is used by a kmalloc block
*/
static unsigned int alloc_map[ALLOC_MAP_SIZE/32]={0,};
#define TAG_NONE (ULONG)(('N'<<0) + ('o'<<8) + ('n'<<16) + ('e'<<24))
/* FUNCTIONS ***************************************************************/
VOID ExInitNonPagedPool(ULONG BaseAddress)
{
kernel_pool_base=BaseAddress;
}
static void validate_free_list(void)
PVOID ExAllocatePool(POOL_TYPE PoolType, ULONG NumberOfBytes)
/*
* FUNCTION: Validate the integrity of the list of free blocks
*/
{
block_hdr* current=free_list_head;
unsigned int blocks_seen=0;
while (current!=NULL)
{
unsigned int base_addr = (int)current;
if (base_addr < (kernel_pool_base) ||
(base_addr+current->size) >
(kernel_pool_base)+NONPAGED_POOL_SIZE)
{
printk("Block %x found outside pool area\n",current);
printk("Size %d\n",current->size);
printk("Limits are %x %x\n",kernel_pool_base,
kernel_pool_base+NONPAGED_POOL_SIZE);
KeBugCheck(KBUG_POOL_FREE_LIST_CORRUPT);
}
blocks_seen++;
if (blocks_seen > nr_free_blocks)
{
printk("Too many blocks on list\n");
KeBugCheck(KBUG_POOL_FREE_LIST_CORRUPT);
}
// verify_for_write(base_addr,current->size);
if (current->next!=NULL&&current->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&&current->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&&current->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&&current->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&&current->previous==NULL)
{
used_list_head=NULL;
}
else
{
if (current->previous==NULL)
{
current->next->previous=NULL;
used_list_head=current->next;
}
else
{
current->previous->next=current->next;
}
if (current->next!=NULL)
{
current->next->previous=current->previous;
}
else
{
current->previous->next=NULL;
}
}
nr_used_blocks--;
}
inline static void* block_to_address(block_hdr* blk)
/*
* FUNCTION: Translate a block header address to the corresponding block
* address (internal)
*/
{
return ( (void *) ((int)blk + sizeof(block_hdr)) );
}
inline static block_hdr* address_to_block(void* addr)
{
return (block_hdr *)
( ((int)addr) - sizeof(block_hdr) );
}
static unsigned int alloc_pool_region(unsigned int nr_pages)
/*
* FUNCTION: Allocates a region of pages within the nonpaged pool area
*/
{
unsigned int start = 0;
unsigned int length = 0;
unsigned int i,j;
DPRINT("alloc_pool_region(nr_pages = %d)\n",nr_pages);
for (i=1; i<ALLOC_MAP_SIZE;i++)
{
if (!test_bit(i%32,&alloc_map[i/32]))
{
if (length == 0)
{
start=i;
length = 1;
}
else
{
length++;
}
if (length==nr_pages)
{
DPRINT("found region at %d for %d\n",start,
length);
for (j=start;j<(start+length);j++)
{
DPRINT("Writing %x\n",&alloc_map[j/32]);
set_bit(j%32,&alloc_map[j/32]);
}
DPRINT("returning %x\n",(start*PAGESIZE)
+kernel_pool_base);
return((start*PAGESIZE)+kernel_pool_base);
}
}
else
{
start=0;
length=0;
}
}
printk("CRITICAL: Out of kmalloc space\n");
for(;;);
return(0);
}
static block_hdr* grow_kernel_pool(unsigned int size)
/*
* FUNCTION: Grow the executive heap to accomodate a block of at least 'size'
* bytes
*/
{
unsigned int total_size = size + sizeof(block_hdr);
unsigned int nr_pages = PAGE_ROUND_UP(total_size) / PAGESIZE;
unsigned int start = alloc_pool_region(nr_pages);
block_hdr* used_blk=NULL;
block_hdr* free_blk=NULL;
int i;
DPRINT("growing heap for block size %d, ",size);
DPRINT("start %x\n",start);
for (i=0;i<nr_pages;i++)
{
set_page(start+(i*PAGESIZE),PA_SYSTEM | PA_WRITE | PA_READ,
get_free_page());
}
if ((PAGESIZE-(total_size%PAGESIZE))>(2*sizeof(block_hdr)))
{
used_blk = (struct _block_hdr *)start;
DPRINT("Creating block at %x\n",start);
used_blk->size = size;
add_to_used_list(used_blk);
free_blk = (block_hdr *)(start + sizeof(block_hdr) + size);
DPRINT("Creating block at %x\n",free_blk);
free_blk->size = (nr_pages * PAGESIZE) -((sizeof(block_hdr)*2) + size);
add_to_free_list(free_blk);
}
else
{
used_blk = (struct _block_hdr *)start;
used_blk->size = nr_pages * PAGESIZE;
add_to_used_list(used_blk);
}
validate_kernel_pool();
return(used_blk);
}
static void* take_block(block_hdr* current, unsigned int size)
/*
* FUNCTION: Allocate a used block of least 'size' from the specified
* free block
* RETURNS: The address of the created memory block
*/
{
/*
* If the block is much bigger than required then split it and
* return a pointer to the allocated section. If the difference
* between the sizes is marginal it makes no sense to have the
* extra overhead
*/
if (current->size > (1 + size + sizeof(block_hdr)))
{
/*
* Replace the bigger block with a smaller block in the
* same position in the list
*/
block_hdr* free_blk = (block_hdr *)(((int)current)
+ sizeof(block_hdr) + size);
free_blk->next = current->next;
free_blk->previous = current->previous;
if (current->next)
{
current->next->previous = free_blk;
}
if (current->previous)
{
current->previous->next = free_blk;
}
free_blk->size = current->size - (sizeof(block_hdr) + size);
if (current==free_list_head)
{
free_list_head=free_blk;
}
current->size=size;
add_to_used_list(current);
validate_kernel_pool();
return(block_to_address(current));
}
/*
* Otherwise allocate the whole block
*/
remove_from_free_list(current);
add_to_used_list(current);
validate_kernel_pool();
return(block_to_address(current));
}
asmlinkage VOID ExFreePool(PVOID block)
/*
* FUNCTION: Releases previously allocated memory
* ARGUMENTS:
* block = block to free
*/
{
block_hdr* blk=address_to_block(block);
DPRINT("(%s:%d) freeing block %x\n",__FILE__,__LINE__,blk);
validate_kernel_pool();
/*
* Please don't change the order
*/
remove_from_used_list(blk);
add_to_free_list(blk);
validate_kernel_pool();
}
#define CACHE_ALIGNMENT (16)
PVOID ExAllocatePool(ULONG type, ULONG size)
/*
* FUNCTION: Allocates memory from the pool
* ARGUMENTS:
* size = minimum size of the block to be allocated
* type = the type of memory to use for the block
* RETURNS:
* the address of the block if it succeeds
*/
PVOID ExAllocatePoolWithTag(ULONG type, ULONG size, ULONG Tag)
{
PVOID Block;
if (type == NonPagedPoolCacheAligned ||
type == NonPagedPoolCacheAlignedMustS)
{
size = size + CACHE_ALIGNMENT;
UNIMPLEMENTED;
}
switch(type)
@ -545,12 +63,12 @@ PVOID ExAllocatePool(ULONG type, ULONG size)
case NonPagedPoolMustSucceed:
case NonPagedPoolCacheAligned:
case NonPagedPoolCacheAlignedMustS:
Block = ExAllocateNonPagedPool(type,size);
Block = ExAllocateNonPagedPoolWithTag(type,size,Tag);
break;
case PagedPool:
case PagedPoolCacheAligned:
Block = ExAllocatePagedPool(type,size);
Block = ExAllocatePagedPoolWithTag(type,size,Tag);
break;
default:
@ -562,68 +80,16 @@ PVOID ExAllocatePool(ULONG type, ULONG size)
{
KeBugCheck(MUST_SUCCEED_POOL_EMPTY);
}
if (type == NonPagedPoolCacheAligned ||
type == NonPagedPoolCacheAlignedMustS)
{
Block = Block + CACHE_ALIGNMENT - (((int)Block)%CACHE_ALIGNMENT);
}
return(Block);
}
static PVOID ExAllocatePagedPool(ULONG type, ULONG size)
{
UNIMPLEMENTED;
}
static PVOID ExAllocateNonPagedPool(ULONG type, ULONG size)
{
block_hdr* current=NULL;
void* block;
DPRINT("kmalloc(size %d)\n",size);
validate_kernel_pool();
/*
* accomodate this useful idiom
*/
if (size==0)
{
return(NULL);
}
/*
* Look for an already created block of sufficent size
*/
current=free_list_head;
while (current!=NULL)
{
DPRINT("current %x size %x next %x\n",current,current->size,
current->next);
if (current->size>=size)
{
DPRINT("found block %x of size %d\n",current,size);
block=take_block(current,size);
memset(block,0,size);
return(block);
}
current=current->next;
}
/*
* Otherwise create a new block
*/
block=block_to_address(grow_kernel_pool(size));
memset(block,0,size);
return(block);
}
PVOID ExAllocatePoolWithQuota(POOL_TYPE PoolType, ULONG NumberOfBytes)
PVOID ExAllocatePoolWithQuotaTag(POOL_TYPE PoolType, ULONG NumberOfBytes,
ULONG Tag)
{
PVOID Block;
PKTHREAD current = KeGetCurrentThread();
Block = ExAllocatePool(PoolType,NumberOfBytes);
Block = ExAllocatePoolWithTag(PoolType,NumberOfBytes,Tag);
switch(PoolType)
{
case NonPagedPool:
@ -641,29 +107,8 @@ PVOID ExAllocatePoolWithQuota(POOL_TYPE PoolType, ULONG NumberOfBytes)
return(Block);
}
PVOID ExAllocatePoolWithQuotaTag(POOL_TYPE PoolType, ULONG NumberOfBytes,
ULONG Tag)
PVOID ExAllocatePoolWithQuota(POOL_TYPE PoolType, ULONG NumberOfBytes)
{
PVOID Block;
Block=ExAllocatePoolWithQuota(PoolType,NumberOfBytes+sizeof(ULONG));
((ULONG *)Block)[0]=Tag;
return(Block+4);
return(ExAllocatePoolWithQuotaTag(PoolType,NumberOfBytes,TAG_NONE));
}
PVOID ExAllocatePoolWithTag(POOL_TYPE PoolType, ULONG NumberOfBytes,
ULONG Tag)
/*
* FUNCTION: Allocates pool memory and inserts a caller supplied tag before
* the block allocated
* ARGUMENTS:
* PoolType = Type of memory to allocate
* NumberOfBytes = Number of bytes to allocate
* Tag = Tag
* RETURNS: The address of the block allocated
*/
{
PVOID Block;
Block=ExAllocatePool(PoolType,NumberOfBytes+sizeof(ULONG));
((ULONG *)Block)[0]=Tag;
return(Block+4);
}

View file

@ -12,11 +12,63 @@
#include <ddk/ntddk.h>
#include <internal/mm.h>
#include <internal/ob.h>
#include <internal/io.h>
#include <internal/ps.h>
#define NDEBUG
#include <internal/debug.h>
/* GLOBALS *******************************************************************/
POBJECT_TYPE MmSectionType = NULL;
/* FUNCTIONS *****************************************************************/
NTSTATUS MmInitSectionImplementation(VOID)
{
ANSI_STRING AnsiString;
MmSectionType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
MmSectionType->TotalObjects = 0;
MmSectionType->TotalHandles = 0;
MmSectionType->MaxObjects = ULONG_MAX;
MmSectionType->MaxHandles = ULONG_MAX;
MmSectionType->PagedPoolCharge = 0;
MmSectionType->NonpagedPoolCharge = sizeof(SECTION_OBJECT);
MmSectionType->Dump = NULL;
MmSectionType->Open = NULL;
MmSectionType->Close = NULL;
MmSectionType->Delete = NULL;
MmSectionType->Parse = NULL;
MmSectionType->Security = NULL;
MmSectionType->QueryName = NULL;
MmSectionType->OkayToClose = NULL;
RtlInitAnsiString(&AnsiString,"Section");
RtlAnsiStringToUnicodeString(&MmSectionType->TypeName,
&AnsiString,TRUE);
return(STATUS_SUCCESS);
}
NTSTATUS STDCALL NtCreateSection(OUT PHANDLE SectionHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN PLARGE_INTEGER MaximumSize OPTIONAL,
IN ULONG SectionPageProtection OPTIONAL,
IN ULONG AllocationAttributes,
IN HANDLE FileHandle OPTIONAL)
{
return(ZwCreateSection(SectionHandle,
DesiredAccess,
ObjectAttributes,
MaximumSize,
SectionPageProtection,
AllocationAttributes,
FileHandle));
}
NTSTATUS STDCALL ZwCreateSection(OUT PHANDLE SectionHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
@ -49,13 +101,98 @@ NTSTATUS STDCALL ZwCreateSection(OUT PHANDLE SectionHandle,
* RETURNS: Status
*/
{
PSECTION_OBJECT Section;
NTSTATUS Status;
DPRINT("ZwCreateSection()\n");
Section = ObGenericCreateObject(SectionHandle,
DesiredAccess,
ObjectAttributes,
MmSectionType);
if (MaximumSize != NULL)
{
Section->MaximumSize = *MaximumSize;
}
else
{
Section->MaximumSize.HighPart = 0;
Section->MaximumSize.LowPart = 0xffffffff;
}
Section->SectionPageProtection = SectionPageProtection;
Status = ObReferenceObjectByHandle(FileHandle,
FILE_READ_DATA,
IoFileType,
UserMode,
(PVOID*)&Section->FileObject,
NULL);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
Section->AllocateAttributes = AllocationAttributes;
return(STATUS_SUCCESS);
}
NTSTATUS NtOpenSection(PHANDLE SectionHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes)
{
return(ZwOpenSection(SectionHandle,
DesiredAccess,
ObjectAttributes));
}
NTSTATUS ZwOpenSection(PHANDLE SectionHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes)
{
UNIMPLEMENTED;
PVOID Object;
NTSTATUS Status;
PWSTR Ignored;
*SectionHandle = 0;
Status = ObOpenObjectByName(ObjectAttributes,&Object,&Ignored);
if (!NT_SUCCESS(Status))
{
return(Status);
}
if (BODY_TO_HEADER(Object)->ObjectType!=MmSectionType)
{
return(STATUS_UNSUCCESSFUL);
}
*SectionHandle = ObInsertHandle(KeGetCurrentProcess(),Object,
DesiredAccess,FALSE);
return(STATUS_SUCCESS);
}
NTSTATUS NtMapViewOfSection(HANDLE SectionHandle,
HANDLE ProcessHandle,
PVOID* BaseAddress,
ULONG ZeroBits,
ULONG CommitSize,
PLARGE_INTEGER SectionOffset,
PULONG ViewSize,
SECTION_INHERIT InheritDisposition,
ULONG AllocationType,
ULONG Protect)
{
return(ZwMapViewOfSection(SectionHandle,
ProcessHandle,
BaseAddress,
ZeroBits,
CommitSize,
SectionOffset,
ViewSize,
InheritDisposition,
AllocationType,
Protect));
}
NTSTATUS ZwMapViewOfSection(HANDLE SectionHandle,
@ -68,11 +205,146 @@ NTSTATUS ZwMapViewOfSection(HANDLE SectionHandle,
SECTION_INHERIT InheritDisposition,
ULONG AllocationType,
ULONG Protect)
/*
* FUNCTION: Maps a view of a section into the virtual address space of a
* process
* ARGUMENTS:
* SectionHandle = Handle of the section
* ProcessHandle = Handle of the process
* BaseAddress = Desired base address (or NULL) on entry
* Actual base address of the view on exit
* ZeroBits = Number of high order address bits that must be zero
* CommitSize = Size in bytes of the initially committed section of
* the view
* SectionOffset = Offset in bytes from the beginning of the section
* to the beginning of the view
* ViewSize = Desired length of map (or zero to map all) on entry
* Actual length mapped on exit
* InheritDisposition = Specified how the view is to be shared with
* child processes
* AllocateType = Type of allocation for the pages
* Protect = Protection for the committed region of the view
* RETURNS: Status
*/
{
UNIMPLEMENTED;
PSECTION_OBJECT Section;
PEPROCESS Process;
MEMORY_AREA* Result;
NTSTATUS Status;
DPRINT("ZwMapViewOfSection(SectionHandle %x, ProcessHandle %x)\n",
SectionHandle,ProcessHandle);
Status = ObReferenceObjectByHandle(SectionHandle,
SECTION_MAP_READ,
MmSectionType,
UserMode,
(PVOID*)&Section,
NULL);
if (Status != STATUS_SUCCESS)
{
DPRINT("%s() = %x\n",Status);
return(Status);
}
Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_VM_OPERATION,
PsProcessType,
UserMode,
(PVOID*)&Process,
NULL);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
if ((*ViewSize) > Section->MaximumSize.LowPart)
{
(*ViewSize) = Section->MaximumSize.LowPart;
}
MmCreateMemoryArea(UserMode,
Process,
MEMORY_AREA_SECTION_VIEW_COMMIT,
BaseAddress,
*ViewSize,
Protect,
&Result);
Result->Data.SectionData.Section = Section;
Result->Data.SectionData.ViewOffset = SectionOffset->LowPart;
DPRINT("*BaseAddress %x\n",*BaseAddress);
DPRINT("Result->Data.SectionData.Section->FileObject %x\n",
Result->Data.SectionData.Section->FileObject);
return(STATUS_SUCCESS);
}
NTSTATUS NtUnmapViewOfSection(HANDLE ProcessHandle, PVOID BaseAddress)
{
return(ZwUnmapViewOfSection(ProcessHandle,BaseAddress));
}
NTSTATUS ZwUnmapViewOfSection(HANDLE ProcessHandle, PVOID BaseAddress)
{
PEPROCESS Process;
NTSTATUS Status;
Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_VM_OPERATION,
PsProcessType,
UserMode,
(PVOID*)&Process,
NULL);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
return(MmFreeMemoryArea(Process,BaseAddress,0,TRUE));
}
NTSTATUS STDCALL NtQuerySection(IN HANDLE SectionHandle,
IN CINT SectionInformationClass,
OUT PVOID SectionInformation,
IN ULONG Length,
OUT PULONG ResultLength)
{
return(ZwQuerySection(SectionHandle,
SectionInformationClass,
SectionInformation,
Length,
ResultLength));
}
NTSTATUS STDCALL ZwQuerySection(IN HANDLE SectionHandle,
IN CINT SectionInformationClass,
OUT PVOID SectionInformation,
IN ULONG Length,
OUT PULONG ResultLength)
/*
* FUNCTION: Queries the information of a section object.
* ARGUMENTS:
* SectionHandle = Handle to the section link object
* SectionInformationClass = Index to a certain information structure
* SectionInformation (OUT)= Caller supplies storage for resulting
* information
* Length = Size of the supplied storage
* ResultLength = Data written
* RETURNS: Status
*
*/
{
return(STATUS_UNSUCCESSFUL);
}
NTSTATUS STDCALL NtExtendSection(IN HANDLE SectionHandle,
IN ULONG NewMaximumSize)
{
return(ZwExtendSection(SectionHandle,NewMaximumSize));
}
NTSTATUS STDCALL ZwExtendSection(IN HANDLE SectionHandle,
IN ULONG NewMaximumSize)
{
UNIMPLEMENTED;
}

View file

@ -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);
}

View file

@ -7,15 +7,19 @@
* UPDATE HISTORY:
* 09/4/98: Created
* 10/6/98: Corrections from Fatahi (i_fatahi@hotmail.com)
* 30/9/98: Implemented ZwxxxVirtualMemory functions
*/
/* INCLUDE *****************************************************************/
#include <windows.h>
#include <internal/hal/segment.h>
#include <internal/i386/segment.h>
#include <internal/mm.h>
#include <internal/hal/page.h>
#include <internal/mmhal.h>
#include <internal/ob.h>
#include <internal/io.h>
#include <internal/ps.h>
#define NDEBUG
#include <internal/debug.h>
@ -25,10 +29,6 @@
extern unsigned int etext;
extern unsigned int end;
/*
* These two are statically declared because mm is initalized before the
* memory pool
*/
static MEMORY_AREA* kernel_text_desc = NULL;
static MEMORY_AREA* kernel_data_desc = NULL;
static MEMORY_AREA* kernel_param_desc = NULL;
@ -45,7 +45,7 @@ void VirtualInit(boot_param* bp)
*/
{
unsigned int kernel_len = bp->end_mem - bp->start_mem;
ULONG BaseAddress;
PVOID BaseAddress;
ULONG Length;
ULONG ParamLength = kernel_len;
@ -58,17 +58,18 @@ void VirtualInit(boot_param* bp)
/*
* Setup the system area descriptor list
*/
BaseAddress = KERNEL_BASE;
BaseAddress = (PVOID)KERNEL_BASE;
Length = PAGE_ROUND_UP(((ULONG)&etext)) - KERNEL_BASE;
ParamLength = ParamLength - Length;
MmCreateMemoryArea(KernelMode,MEMORY_AREA_SYSTEM,&BaseAddress,
MmCreateMemoryArea(KernelMode,NULL,MEMORY_AREA_SYSTEM,&BaseAddress,
Length,0,&kernel_text_desc);
Length = PAGE_ROUND_UP(((ULONG)&end)) - PAGE_ROUND_UP(((ULONG)&etext));
ParamLength = ParamLength - Length;
DPRINT("Length %x\n",Length);
BaseAddress = PAGE_ROUND_UP(((ULONG)&etext));
BaseAddress = (PVOID)PAGE_ROUND_UP(((ULONG)&etext));
MmCreateMemoryArea(KernelMode,
NULL,
MEMORY_AREA_SYSTEM,
&BaseAddress,
Length,
@ -76,37 +77,61 @@ void VirtualInit(boot_param* bp)
&kernel_data_desc);
BaseAddress = PAGE_ROUND_UP(((ULONG)&end));
BaseAddress = (PVOID)PAGE_ROUND_UP(((ULONG)&end));
Length = ParamLength;
MmCreateMemoryArea(KernelMode,MEMORY_AREA_SYSTEM,&BaseAddress,
MmCreateMemoryArea(KernelMode,NULL,MEMORY_AREA_SYSTEM,&BaseAddress,
Length,0,&kernel_param_desc);
BaseAddress = KERNEL_BASE+ PAGE_ROUND_UP(kernel_len) + PAGESIZE;
BaseAddress = (PVOID)(KERNEL_BASE + PAGE_ROUND_UP(kernel_len) + PAGESIZE);
Length = NONPAGED_POOL_SIZE;
MmCreateMemoryArea(KernelMode,MEMORY_AREA_SYSTEM,&BaseAddress,
MmCreateMemoryArea(KernelMode,NULL,MEMORY_AREA_SYSTEM,&BaseAddress,
Length,0,&kernel_pool_desc);
MmDumpMemoryAreas();
// MmDumpMemoryAreas();
CHECKPOINT;
MmInitSectionImplementation();
}
NTSTATUS MmSectionHandleFault(MEMORY_AREA* MemoryArea, ULONG Address)
ULONG MmCommitedSectionHandleFault(MEMORY_AREA* MemoryArea, ULONG Address)
{
set_page(Address,0x7,get_free_page());
return(TRUE);
}
NTSTATUS MmSectionHandleFault(MEMORY_AREA* MemoryArea, PVOID Address)
{
LARGE_INTEGER Offset;
IO_STATUS_BLOCK IoStatus;
DPRINT("MmSectionHandleFault(MemoryArea %x, Address %x)\n",
MemoryArea,Address);
set_page(Address,0x7,get_free_page());
Offset.LowPart = (Address - MemoryArea->BaseAddress) +
MemoryArea->Data.SectionData.ViewOffset;
DPRINT("MemoryArea->Data.SectionData.Section->FileObject %x\n",
MemoryArea->Data.SectionData.Section->FileObject);
if (MemoryArea->Data.SectionData.Section->FileObject == NULL)
{
return(STATUS_UNSUCCESSFUL);
}
IoPageRead(MemoryArea->Data.SectionData.Section->FileObject,
(PVOID)Address,
&Offset,
&IoStatus);
DPRINT("Returning from MmSectionHandleFault()\n");
return(STATUS_SUCCESS);
}
asmlinkage int page_fault_handler(unsigned int edi,
unsigned int esi, unsigned int ebp,
unsigned int esp, unsigned int ebx,
unsigned int edx, unsigned int ecx,
unsigned int eax,
unsigned int type,
unsigned int ds,
unsigned short int error_code,
unsigned int eip,
unsigned int cs, unsigned int eflags,
unsigned int esp0, unsigned int ss0)
asmlinkage int page_fault_handler(unsigned int cs,
unsigned int eip)
/*
* FUNCTION: Handle a page fault
*/
@ -121,15 +146,15 @@ asmlinkage int page_fault_handler(unsigned int edi,
*/
unsigned int cr2;
__asm__("movl %%cr2,%0\n\t" : "=d" (cr2));
DbgPrint("Page fault at address %x with eip %x\n",cr2,eip);
DPRINT("Page fault at address %x with eip %x\n",cr2,eip);
cr2 = PAGE_ROUND_DOWN(cr2);
if (KeGetCurrentIrql()!=PASSIVE_LEVEL)
{
DbgPrint("Recursive page fault detected\n");
KeBugCheck(0);
for(;;);
return(0);
// KeBugCheck(0);
}
KeRaiseIrql(DISPATCH_LEVEL,&oldlvl);
@ -154,7 +179,7 @@ asmlinkage int page_fault_handler(unsigned int edi,
FaultMode = KernelMode;
}
MemoryArea = MmOpenMemoryAreaByAddress(cr2);
MemoryArea = MmOpenMemoryAreaByAddress(PsGetCurrentProcess(),(PVOID)cr2);
if (MemoryArea==NULL)
{
printk("%s:%d\n",__FILE__,__LINE__);
@ -167,8 +192,20 @@ asmlinkage int page_fault_handler(unsigned int edi,
stat = 0;
break;
case MEMORY_AREA_SECTION_VIEW:
stat = MmSectionHandleFault(MemoryArea,cr2);
case MEMORY_AREA_SECTION_VIEW_COMMIT:
if (MmSectionHandleFault(MemoryArea,cr2)==STATUS_SUCCESS)
{
stat=1;
}
else
{
stat = 0;
}
break;
case MEMORY_AREA_COMMIT:
stat = MmCommitedSectionHandleFault(MemoryArea,cr2);
break;
default:
stat = 0;
@ -181,7 +218,6 @@ asmlinkage int page_fault_handler(unsigned int edi,
return(stat);
}
BOOLEAN MmIsNonPagedSystemAddressValid(PVOID VirtualAddress)
{
UNIMPLEMENTED;
@ -198,7 +234,503 @@ BOOLEAN MmIsAddressValid(PVOID VirtualAddress)
* succeed. Is this realistic for RISC processors which don't
* allow byte granular access?
*/
{
MEMORY_AREA* MemoryArea;
MemoryArea = MmOpenMemoryAreaByAddress(PsGetCurrentProcess(),
VirtualAddress);
if (MemoryArea == NULL)
{
return(FALSE);
}
return(TRUE);
}
NTSTATUS STDCALL NtAllocateVirtualMemory(IN HANDLE ProcessHandle,
OUT PVOID *BaseAddress,
IN ULONG ZeroBits,
IN ULONG RegionSize,
IN ULONG AllocationType,
IN ULONG Protect)
{
return(ZwAllocateVirtualMemory(ProcessHandle,
BaseAddress,
ZeroBits,
RegionSize,
AllocationType,
Protect));
}
NTSTATUS STDCALL ZwAllocateVirtualMemory(IN HANDLE ProcessHandle,
OUT PVOID *BaseAddress,
IN ULONG ZeroBits,
IN ULONG RegionSize,
IN ULONG AllocationType,
IN ULONG Protect)
/*
* FUNCTION: Allocates a block of virtual memory in the process address space
* ARGUMENTS:
* ProcessHandle = The handle of the process which owns the virtual memory
* BaseAddress = A pointer to the virtual memory allocated. If you
* supply a non zero value the system will try to
* allocate the memory at the address supplied. It round
* it down to a multiple of the page size.
* ZeroBits = (OPTIONAL) You can specify the number of high order bits
* that must be zero, ensuring that the memory will be
* allocated at a address below a certain value.
* RegionSize = The number of bytes to allocate
* AllocationType = Indicates the type of virtual memory you like to
* allocated, can be one of the values : MEM_COMMIT,
* MEM_RESERVE, MEM_RESET, MEM_TOP_DOWN
* Protect = Indicates the protection type of the pages allocated, can be
* a combination of PAGE_READONLY, PAGE_READWRITE,
* PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_GUARD,
* PAGE_NOACCESS
* REMARKS:
* This function maps to the win32 VirtualAllocEx. Virtual memory is
* process based so the protocol starts with a ProcessHandle. I
* splitted the functionality of obtaining the actual address and
* specifying the start address in two parameters ( BaseAddress and
* StartAddress ) The NumberOfBytesAllocated specify the range and the
* AllocationType and ProctectionType map to the other two parameters.
* RETURNS: Status
*/
{
PEPROCESS Process;
MEMORY_AREA* MemoryArea;
ULONG Type;
ULONG i;
NTSTATUS Status;
DbgPrint("ZwAllocateVirtualMemory(ProcessHandle %x, *BaseAddress %x, "
"ZeroBits %d, RegionSize %d, AllocationType %x, Protect %x)\n",
ProcessHandle,*BaseAddress,ZeroBits,RegionSize,AllocationType,
Protect);
Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_VM_OPERATION,
NULL,
UserMode,
(PVOID*)(&Process),
NULL);
if (Status != STATUS_SUCCESS)
{
DbgPrint("ZwAllocateVirtualMemory() = %x\n",Status);
return(Status);
}
if (AllocationType & MEM_RESERVE)
{
Type = MEMORY_AREA_RESERVE;
}
else
{
Type = MEMORY_AREA_COMMIT;
}
if ((*BaseAddress) != 0)
{
MemoryArea = MmOpenMemoryAreaByAddress(Process, *BaseAddress);
if (MemoryArea != NULL)
{
if (MemoryArea->BaseAddress == (*BaseAddress) &&
MemoryArea->Length == RegionSize)
{
MemoryArea->Type = Type;
MemoryArea->Attributes =Protect;
DbgPrint("*BaseAddress %x\n",*BaseAddress);
return(STATUS_SUCCESS);
}
MemoryArea = MmSplitMemoryArea(Process,
MemoryArea,
*BaseAddress,
RegionSize,
Type,
Protect);
DbgPrint("*BaseAddress %x\n",*BaseAddress);
return(STATUS_SUCCESS);
}
}
Status = MmCreateMemoryArea(UserMode,
Process,
Type,
(PULONG)BaseAddress,
RegionSize,
Protect,
&MemoryArea);
if (Status != STATUS_SUCCESS)
{
DbgPrint("ZwAllocateVirtualMemory() = %x\n",Status);
return(Status);
}
DbgPrint("*BaseAddress %x\n",*BaseAddress);
return(STATUS_SUCCESS);
}
NTSTATUS STDCALL NtFlushVirtualMemory(IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN ULONG NumberOfBytesToFlush,
OUT PULONG NumberOfBytesFlushed OPTIONAL)
{
return(ZwFlushVirtualMemory(ProcessHandle,
BaseAddress,
NumberOfBytesToFlush,
NumberOfBytesFlushed));
}
NTSTATUS STDCALL ZwFlushVirtualMemory(IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN ULONG NumberOfBytesToFlush,
OUT PULONG NumberOfBytesFlushed OPTIONAL)
/*
* FUNCTION: Flushes virtual memory to file
* ARGUMENTS:
* ProcessHandle = Points to the process that allocated the virtual
* memory
* BaseAddress = Points to the memory address
* NumberOfBytesToFlush = Limits the range to flush,
* NumberOfBytesFlushed = Actual number of bytes flushed
* RETURNS: Status
*/
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtFreeVirtualMemory(IN HANDLE ProcessHandle,
IN PVOID *BaseAddress,
IN ULONG RegionSize,
IN ULONG FreeType)
{
return(ZwFreeVirtualMemory(ProcessHandle,
BaseAddress,
RegionSize,
FreeType));
}
NTSTATUS STDCALL ZwFreeVirtualMemory(IN HANDLE ProcessHandle,
IN PVOID *BaseAddress,
IN ULONG RegionSize,
IN ULONG FreeType)
/*
* FUNCTION: Frees a range of virtual memory
* ARGUMENTS:
* ProcessHandle = Points to the process that allocated the virtual
* memory
* BaseAddress = Points to the memory address, rounded down to a
* multiple of the pagesize
* RegionSize = Limits the range to free, rounded up to a multiple of
* the paging size
* FreeType = Can be one of the values: MEM_DECOMMIT, or MEM_RELEASE
* RETURNS: Status
*/
{
MEMORY_AREA* MemoryArea;
NTSTATUS Status;
PEPROCESS Process;
Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_VM_OPERATION,
PsProcessType,
UserMode,
(PVOID*)(&Process),
NULL);
if (Status != STATUS_SUCCESS)
{
DbgPrint("ZwFreeVirtualMemory() = %x\n",Status);
return(Status);
}
MemoryArea = MmOpenMemoryAreaByAddress(Process,*BaseAddress);
if (MemoryArea == NULL)
{
return(STATUS_UNSUCCESSFUL);
}
if (FreeType == MEM_RELEASE)
{
if (MemoryArea->BaseAddress != (*BaseAddress))
{
return(STATUS_UNSUCCESSFUL);
}
MmFreeMemoryArea(PsGetCurrentProcess(),
BaseAddress,
0,
TRUE);
return(STATUS_SUCCESS);
}
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtLockVirtualMemory(HANDLE ProcessHandle,
PVOID BaseAddress,
ULONG NumberOfBytesToLock,
PULONG NumberOfBytesLocked)
{
return(ZwLockVirtualMemory(ProcessHandle,
BaseAddress,
NumberOfBytesToLock,
NumberOfBytesLocked));
}
NTSTATUS STDCALL ZwLockVirtualMemory(HANDLE ProcessHandle,
PVOID BaseAddress,
ULONG NumberOfBytesToLock,
PULONG NumberOfBytesLocked)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtProtectVirtualMemory(IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN ULONG NumberOfBytesToProtect,
IN ULONG NewAccessProtection,
OUT PULONG OldAccessProtection)
{
return(ZwProtectVirtualMemory(ProcessHandle,
BaseAddress,
NumberOfBytesToProtect,
NewAccessProtection,
OldAccessProtection));
}
VOID MmChangeAreaProtection(PEPROCESS Process,
PVOID BaseAddress,
ULONG Length,
ULONG Protect)
{
ULONG i;
for (i=0; i<(Length/PAGESIZE); i++)
{
if (MmIsPagePresent(Process, BaseAddress + (i*PAGESIZE)))
{
MmSetPageProtect(Process, BaseAddress + (i*PAGESIZE), Protect);
}
}
}
NTSTATUS STDCALL ZwProtectVirtualMemory(IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN ULONG NumberOfBytesToProtect,
IN ULONG NewAccessProtection,
OUT PULONG OldAccessProtection)
{
PMEMORY_AREA MemoryArea;
PEPROCESS Process;
NTSTATUS Status;
Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_VM_OPERATION,
PsProcessType,
UserMode,
(PVOID*)(&Process),
NULL);
if (Status != STATUS_SUCCESS)
{
DbgPrint("ZwProtectVirtualMemory() = %x\n",Status);
return(Status);
}
MemoryArea = MmOpenMemoryAreaByAddress(Process,BaseAddress);
if (MemoryArea == NULL)
{
DbgPrint("ZwProtectVirtualMemory() = %x\n",STATUS_UNSUCCESSFUL);
return(STATUS_UNSUCCESSFUL);
}
*OldAccessProtection = MemoryArea->Attributes;
if (MemoryArea->BaseAddress == BaseAddress &&
MemoryArea->Length == NumberOfBytesToProtect)
{
MemoryArea->Attributes = NewAccessProtection;
}
else
{
MemoryArea = MmSplitMemoryArea(Process,
MemoryArea,
BaseAddress,
NumberOfBytesToProtect,
MemoryArea->Type,
NewAccessProtection);
}
MmChangeAreaProtection(Process,BaseAddress,NumberOfBytesToProtect,
NewAccessProtection);
return(STATUS_SUCCESS);
}
NTSTATUS STDCALL NtQueryVirtualMemory(IN HANDLE ProcessHandle,
IN PVOID Address,
IN IN CINT VirtualMemoryInformationClass,
OUT PVOID VirtualMemoryInformation,
IN ULONG Length,
OUT PULONG ResultLength)
{
return(ZwQueryVirtualMemory(ProcessHandle,
Address,
VirtualMemoryInformationClass,
VirtualMemoryInformation,
Length,
ResultLength));
}
NTSTATUS STDCALL ZwQueryVirtualMemory(IN HANDLE ProcessHandle,
IN PVOID Address,
IN CINT VirtualMemoryInformationClass,
OUT PVOID VirtualMemoryInformation,
IN ULONG Length,
OUT PULONG ResultLength)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtReadVirtualMemory(IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
OUT PVOID Buffer,
IN ULONG NumberOfBytesToRead,
OUT PULONG NumberOfBytesRead)
{
return(ZwReadVirtualMemory(ProcessHandle,
BaseAddress,
Buffer,
NumberOfBytesToRead,
NumberOfBytesRead));
}
NTSTATUS STDCALL ZwReadVirtualMemory(IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
OUT PVOID Buffer,
IN ULONG NumberOfBytesToRead,
OUT PULONG NumberOfBytesRead)
{
PEPROCESS Process;
MEMORY_AREA* MemoryArea;
ULONG i;
NTSTATUS Status;
PULONG CurrentEntry;
Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_VM_READ,
NULL,
UserMode,
(PVOID*)(&Process),
NULL);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
MemoryArea = MmOpenMemoryAreaByAddress(Process,BaseAddress);
if (MemoryArea == NULL)
{
return(STATUS_UNSUCCESSFUL);
}
if (MemoryArea->Length > NumberOfBytesToRead)
{
NumberOfBytesToRead = MemoryArea->Length;
}
*NumberOfBytesRead = NumberOfBytesToRead;
for (i=0; i<(NumberOfBytesToRead/PAGESIZE); i++)
{
CurrentEntry = MmGetPageEntry(Process, BaseAddress + (i*PAGESIZE));
RtlCopyMemory(Buffer + (i*PAGESIZE),
(PVOID)physical_to_linear(PAGE_MASK(*CurrentEntry)),
PAGESIZE);
}
return(STATUS_SUCCESS);
}
NTSTATUS STDCALL NtUnlockVirtualMemory(HANDLE ProcessHandle,
PVOID BaseAddress,
ULONG NumberOfBytesToUnlock,
PULONG NumberOfBytesUnlocked OPTIONAL)
{
return(ZwUnlockVirtualMemory(ProcessHandle,
BaseAddress,
NumberOfBytesToUnlock,
NumberOfBytesUnlocked));
}
NTSTATUS STDCALL ZwUnlockVirtualMemory(HANDLE ProcessHandle,
PVOID BaseAddress,
ULONG NumberOfBytesToUnlock,
PULONG NumberOfBytesUnlocked OPTIONAL)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtWriteVirtualMemory(IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN PVOID Buffer,
IN ULONG NumberOfBytesToWrite,
OUT PULONG NumberOfBytesWritten)
{
return(ZwWriteVirtualMemory(ProcessHandle,
BaseAddress,
Buffer,
NumberOfBytesToWrite,
NumberOfBytesWritten));
}
NTSTATUS STDCALL ZwWriteVirtualMemory(IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN PVOID Buffer,
IN ULONG NumberOfBytesToWrite,
OUT PULONG NumberOfBytesWritten)
{
PEPROCESS Process;
MEMORY_AREA* MemoryArea;
ULONG i;
NTSTATUS Status;
PULONG CurrentEntry;
Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_VM_WRITE,
NULL,
UserMode,
(PVOID*)(&Process),
NULL);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
MemoryArea = MmOpenMemoryAreaByAddress(Process,BaseAddress);
if (MemoryArea == NULL)
{
return(STATUS_UNSUCCESSFUL);
}
if (MemoryArea->Length > NumberOfBytesToWrite)
{
NumberOfBytesToWrite = MemoryArea->Length;
}
*NumberOfBytesWritten = NumberOfBytesToWrite;
for (i=0; i<(NumberOfBytesToWrite/PAGESIZE); i++)
{
CurrentEntry = MmGetPageEntry(Process, BaseAddress + (i*PAGESIZE));
RtlCopyMemory((PVOID)physical_to_linear(PAGE_MASK(*CurrentEntry)),
Buffer + (i*PAGESIZE),
PAGESIZE);
}
return(STATUS_SUCCESS);
}

View file

@ -20,14 +20,6 @@
/* TYPES *******************************************************************/
/*
* PURPOSE: Defines a handle
*/
typedef struct
{
PVOID obj;
} HANDLE_REP, *PHANDLE_REP;
#define HANDLE_BLOCK_ENTRIES ((PAGESIZE-sizeof(LIST_ENTRY))/sizeof(HANDLE_REP))
/*
@ -39,37 +31,116 @@ typedef struct
HANDLE_REP handles[HANDLE_BLOCK_ENTRIES];
} HANDLE_BLOCK;
/* GLOBALS *****************************************************************/
/*
* PURPOSE: Head of the list of handle blocks
*/
LIST_ENTRY handle_list_head = {NULL,NULL};
KSPIN_LOCK handle_list_lock = {0};
/* FUNCTIONS ***************************************************************/
VOID ObjDestroyHandleTable(VOID)
NTSTATUS STDCALL NtDuplicateObject(IN HANDLE SourceProcessHandle,
IN PHANDLE SourceHandle,
IN HANDLE TargetProcessHandle,
OUT PHANDLE TargetHandle,
IN ACCESS_MASK DesiredAccess,
IN BOOLEAN InheritHandle,
ULONG Options)
{
return(ZwDuplicateObject(SourceProcessHandle,
SourceHandle,
TargetProcessHandle,
TargetHandle,
DesiredAccess,
InheritHandle,
Options));
}
NTSTATUS STDCALL ZwDuplicateObject(IN HANDLE SourceProcessHandle,
IN PHANDLE SourceHandle,
IN HANDLE TargetProcessHandle,
OUT PHANDLE TargetHandle,
IN ACCESS_MASK DesiredAccess,
IN BOOLEAN InheritHandle,
ULONG Options)
/*
* FUNCTION: Copies a handle from one process space to another
* ARGUMENTS:
* SourceProcessHandle = The source process owning the handle. The
* source process should have opened
* the SourceHandle with PROCESS_DUP_HANDLE
* access.
* SourceHandle = The handle to the object.
* TargetProcessHandle = The destination process owning the handle
* TargetHandle (OUT) = Caller should supply storage for the
* duplicated handle.
* DesiredAccess = The desired access to the handle.
* InheritHandle = Indicates wheter the new handle will be inheritable
* or not.
* Options = Specifies special actions upon duplicating the handle.
* Can be one of the values DUPLICATE_CLOSE_SOURCE |
* DUPLICATE_SAME_ACCESS. DUPLICATE_CLOSE_SOURCE specifies
* that the source handle should be closed after duplicating.
* DUPLICATE_SAME_ACCESS specifies to ignore the
* DesiredAccess paramter and just grant the same access to
* the new handle.
* RETURNS: Status
* REMARKS: This function maps to the win32 DuplicateHandle.
*/
{
PEPROCESS SourceProcess;
PEPROCESS TargetProcess;
PHANDLE_REP SourceHandleRep;
ObReferenceObjectByHandle(SourceProcessHandle,
PROCESS_DUP_HANDLE,
NULL,
UserMode,
(PVOID*)&SourceProcess,
NULL);
ObReferenceObjectByHandle(TargetProcessHandle,
PROCESS_DUP_HANDLE,
NULL,
UserMode,
(PVOID*)&TargetProcess,
NULL);
SourceHandleRep = ObTranslateHandle(&SourceProcess->Pcb,*SourceHandle);
if (Options & DUPLICATE_SAME_ACCESS)
{
DesiredAccess = SourceHandleRep->GrantedAccess;
}
*TargetHandle = ObInsertHandle(&TargetProcess,SourceHandleRep->ObjectBody,
DesiredAccess,InheritHandle);
if (Options & DUPLICATE_CLOSE_SOURCE)
{
ZwClose(*SourceHandle);
}
return(STATUS_SUCCESS);
}
VOID ObDestroyHandleTable(PKPROCESS Process)
/*
* FUNCTION: Destroys the current process's handle table
* NOTE: No references to handles in the table should be made during this
* operation
*/
{
PLIST_ENTRY current=ExInterlockedRemoveHeadList(&handle_list_head,
&handle_list_lock);
PLIST_ENTRY current=NULL;
unsigned int i;
current = ExInterlockedRemoveHeadList(&(Process->HandleTable.ListHead),
&(Process->HandleTable.ListLock));
while (current!=NULL)
{
HANDLE_BLOCK* blk = (HANDLE_BLOCK *)current;
HANDLE_BLOCK* blk = CONTAINING_RECORD(current,HANDLE_BLOCK,entry);
/*
* Deference every handle in block
*/
for (i=0;i<HANDLE_BLOCK_ENTRIES;i++)
{
ObDereferenceObject(blk->handles[i].obj);
ObDereferenceObject(blk->handles[i].ObjectBody);
}
/*
@ -77,70 +148,75 @@ VOID ObjDestroyHandleTable(VOID)
*/
ExFreePool(blk);
current = ExInterlockedRemoveHeadList(&handle_list_head,
&handle_list_lock);
current = ExInterlockedRemoveHeadList(&(Process->HandleTable.ListHead),
&(Process->HandleTable.ListLock));
}
}
VOID ObjInitializeHandleTable(HANDLE parent)
VOID ObInitializeHandleTable(PKPROCESS Parent, BOOLEAN Inherit,
PKPROCESS Process)
/*
* FUNCTION: Initializes a handle table for the current process
* FUNCTION: Initializes a handle table
* ARGUMENTS:
* parent = Parent process (or NULL if this is the first process)
* Inherit = True if the process should inherit its parents objects
* Process = Process whose handle table is to be initialized
*/
{
DPRINT("ObjInitializeHandleTable(parent %x)\n",parent);
DPRINT("ObInitializeHandleTable(parent %x, Inherit %d, Process %x)\n",
Parent,Inherit,Process);
InitializeListHead(&handle_list_head);
KeInitializeSpinLock(&handle_list_lock);
InitializeListHead(&(Process->HandleTable.ListHead));
KeInitializeSpinLock(&(Process->HandleTable.ListLock));
}
static PHANDLE_REP ObTranslateHandle(HANDLE* h)
PHANDLE_REP ObTranslateHandle(PKPROCESS Process, HANDLE h)
/*
* FUNCTION: Get the data structure for a handle
* ARGUMENTS:
* Process = Process to get the handle for
* h = Handle
* ARGUMENTS: A pointer to the information about the handle on success,
* NULL on failure
*/
{
PLIST_ENTRY current = handle_list_head.Flink;
PLIST_ENTRY current;
unsigned int handle = ((unsigned int)h) - 1;
unsigned int count=handle/HANDLE_BLOCK_ENTRIES;
HANDLE_BLOCK* blk = NULL;
unsigned int i;
DPRINT("ObTranslateHandle(Process %x, h %x)\n",Process,h);
current = Process->HandleTable.ListHead.Flink;
DPRINT("current %x\n",current);
for (i=0;i<count;i++)
{
current = current->Flink;
if (current==(&handle_list_head))
if (current==(&(Process->HandleTable.ListHead)))
{
return(NULL);
}
}
blk = (HANDLE_BLOCK *)current;
blk = CONTAINING_RECORD(current,HANDLE_BLOCK,entry);
return(&(blk->handles[handle%HANDLE_BLOCK_ENTRIES]));
}
PVOID ObGetObjectByHandle(HANDLE h)
/*
* FUNCTION: Translate a handle to the corresponding object
* ARGUMENTS:
* h = Handle to translate
* RETURNS: The object
*/
{
DPRINT("ObGetObjectByHandle(h %x)\n",h);
if (h==NULL)
{
return(NULL);
}
return(ObTranslateHandle(h)->obj);
}
VOID ObDeleteHandle(HANDLE Handle)
{
PHANDLE_REP Rep = ObTranslateHandle(Handle);
Rep->obj=NULL;
PHANDLE_REP Rep;
DPRINT("ObDeleteHandle(Handle %x)\n",Handle);
Rep = ObTranslateHandle(KeGetCurrentProcess(),Handle);
Rep->ObjectBody=NULL;
DPRINT("Finished ObDeleteHandle()\n");
}
HANDLE ObAddHandle(PVOID obj)
HANDLE ObInsertHandle(PKPROCESS Process, PVOID ObjectBody,
ACCESS_MASK GrantedAccess, BOOLEAN Inherit)
/*
* FUNCTION: Add a handle referencing an object
* ARGUMENTS:
@ -149,29 +225,33 @@ HANDLE ObAddHandle(PVOID obj)
* NOTE: THe handle is valid only in the context of the current process
*/
{
LIST_ENTRY* current = handle_list_head.Flink;
LIST_ENTRY* current;
unsigned int handle=1;
unsigned int i;
HANDLE_BLOCK* new_blk = NULL;
DPRINT("ObAddHandle(obj %x)\n",obj);
DPRINT("ObAddHandle(Process %x, obj %x)\n",Process,ObjectBody);
current = Process->HandleTable.ListHead.Flink;
/*
* Scan through the currently allocated handle blocks looking for a free
* slot
*/
while (current!=(&handle_list_head))
while (current!=(&(Process->HandleTable.ListHead)))
{
HANDLE_BLOCK* blk = (HANDLE_BLOCK *)current;
HANDLE_BLOCK* blk = CONTAINING_RECORD(current,HANDLE_BLOCK,entry);
DPRINT("Current %x\n",current);
for (i=0;i<HANDLE_BLOCK_ENTRIES;i++)
{
DPRINT("Considering slot %d containing %x\n",i,blk->handles[i]);
if (blk->handles[i].obj==NULL)
if (blk->handles[i].ObjectBody==NULL)
{
blk->handles[i].obj=obj;
blk->handles[i].ObjectBody = ObjectBody;
blk->handles[i].GrantedAccess = GrantedAccess;
blk->handles[i].Inherit = Inherit;
return((HANDLE)(handle+i));
}
}
@ -185,9 +265,12 @@ HANDLE ObAddHandle(PVOID obj)
*/
new_blk = (HANDLE_BLOCK *)ExAllocatePool(NonPagedPool,sizeof(HANDLE_BLOCK));
memset(new_blk,0,sizeof(HANDLE_BLOCK));
ExInterlockedInsertTailList(&handle_list_head,&new_blk->entry,
&handle_list_lock);
new_blk->handles[0].obj=obj;
ExInterlockedInsertTailList(&(Process->HandleTable.ListHead),
&new_blk->entry,
&(Process->HandleTable.ListLock));
new_blk->handles[0].ObjectBody = ObjectBody;
new_blk->handles[0].GrantedAccess = GrantedAccess;
new_blk->handles[0].Inherit = Inherit;
return((HANDLE)handle);
}

View file

@ -22,23 +22,7 @@
/* GLOBALS ****************************************************************/
OBJECT_TYPE DirectoryObjectType = {{0,0,NULL},
0,
0,
ULONG_MAX,
ULONG_MAX,
sizeof(DIRECTORY_OBJECT),
0,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
};
POBJECT_TYPE ObDirectoryType = NULL;
static struct
{
@ -50,6 +34,15 @@ static struct
/* FUNCTIONS **************************************************************/
NTSTATUS NtOpenDirectoryObject(PHANDLE DirectoryHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes)
{
return(ZwOpenDirectoryObject(DirectoryHandle,
DesiredAccess,
ObjectAttributes));
}
NTSTATUS ZwOpenDirectoryObject(PHANDLE DirectoryHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes)
@ -80,11 +73,29 @@ NTSTATUS ZwOpenDirectoryObject(PHANDLE DirectoryHandle,
return(STATUS_UNSUCCESSFUL);
}
*DirectoryHandle = ObAddHandle(Object);
*DirectoryHandle = ObInsertHandle(KeGetCurrentProcess(),Object,
DesiredAccess,FALSE);
CHECKPOINT;
return(STATUS_SUCCESS);
}
NTSTATUS NtQueryDirectoryObject(IN HANDLE DirObjHandle,
OUT POBJDIR_INFORMATION DirObjInformation,
IN ULONG BufferLength,
IN BOOLEAN GetNextIndex,
IN BOOLEAN IgnoreInputIndex,
IN OUT PULONG ObjectIndex,
OUT PULONG DataWritten OPTIONAL)
{
return(ZwQueryDirectoryObject(DirObjHandle,
DirObjInformation,
BufferLength,
GetNextIndex,
IgnoreInputIndex,
ObjectIndex,
DataWritten));
}
NTSTATUS ZwQueryDirectoryObject(IN HANDLE DirObjHandle,
OUT POBJDIR_INFORMATION DirObjInformation,
IN ULONG BufferLength,
@ -111,18 +122,29 @@ NTSTATUS ZwQueryDirectoryObject(IN HANDLE DirObjHandle,
* RETURNS: Status
*/
{
COMMON_BODY_HEADER* hdr = ObGetObjectByHandle(DirObjHandle);
PDIRECTORY_OBJECT dir = (PDIRECTORY_OBJECT)hdr;
PDIRECTORY_OBJECT dir = NULL;
ULONG EntriesToRead;
PLIST_ENTRY current_entry;
POBJECT_HEADER current;
ULONG i=0;
ULONG EntriesToSkip;
NTSTATUS Status;
DPRINT("ZwQueryDirectoryObject(DirObjHandle %x)\n",DirObjHandle);
DPRINT("dir %x namespc_root %x\n",dir,HEADER_TO_BODY(&(namespc_root.hdr)));
assert_irql(PASSIVE_LEVEL);
// assert_irql(PASSIVE_LEVEL);
Status = ObReferenceObjectByHandle(DirObjHandle,
DIRECTORY_QUERY,
ObDirectoryType,
UserMode,
(PVOID*)&dir,
NULL);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
EntriesToRead = BufferLength / sizeof(OBJDIR_INFORMATION);
*DataWritten = 0;
@ -152,16 +174,16 @@ NTSTATUS ZwQueryDirectoryObject(IN HANDLE DirObjHandle,
*/
while ( i<EntriesToRead && current_entry!=(&(dir->head)))
{
current = CONTAINING_RECORD(current_entry,OBJECT_HEADER,entry);
DPRINT("Scanning %w\n",current->name.Buffer);
current = CONTAINING_RECORD(current_entry,OBJECT_HEADER,Entry);
DPRINT("Scanning %w\n",current->Name.Buffer);
DirObjInformation[i].ObjectName.Buffer =
ExAllocatePool(NonPagedPool,current->name.Length);
DirObjInformation[i].ObjectName.Length = current->name.Length;
DirObjInformation[i].ObjectName.MaximumLength = current->name.Length;
ExAllocatePool(NonPagedPool,(current->Name.Length+1)*2);
DirObjInformation[i].ObjectName.Length = current->Name.Length;
DirObjInformation[i].ObjectName.MaximumLength = current->Name.Length;
DPRINT("DirObjInformation[i].ObjectName.Buffer %x\n",
DirObjInformation[i].ObjectName.Buffer);
RtlCopyUnicodeString(&DirObjInformation[i].ObjectName,
&(current->name));
&(current->Name));
i++;
current_entry = current_entry->Flink;
(*DataWritten) = (*DataWritten) + sizeof(OBJDIR_INFORMATION);
@ -194,7 +216,7 @@ NTSTATUS ObReferenceObjectByName(PUNICODE_STRING ObjectPath,
PACCESS_STATE PassedAccessState,
ACCESS_MASK DesiredAccess,
POBJECT_TYPE ObjectType,
KPROCESSOR_MODE Accessmode,
KPROCESSOR_MODE AccessMode,
PVOID ParseContext,
PVOID* ObjectPtr)
{
@ -210,6 +232,8 @@ NTSTATUS ObOpenObjectByName(POBJECT_ATTRIBUTES ObjectAttributes,
ObjectAttributes,Object);
DPRINT("ObjectAttributes = {ObjectName %x ObjectName->Buffer %w}\n",
ObjectAttributes->ObjectName,ObjectAttributes->ObjectName->Buffer);
DPRINT("ObjectAttributes->ObjectName->Length %d\n",
ObjectAttributes->ObjectName->Length);
*Object = NULL;
Status = ObLookupObject(ObjectAttributes->RootDirectory,
@ -217,6 +241,8 @@ NTSTATUS ObOpenObjectByName(POBJECT_ATTRIBUTES ObjectAttributes,
Object,
UnparsedSection);
DPRINT("*Object %x\n",*Object);
DPRINT("ObjectAttributes->ObjectName->Length %d\n",
ObjectAttributes->ObjectName->Length);
return(Status);
}
@ -225,15 +251,40 @@ void ObInit(void)
* FUNCTION: Initialize the object manager namespace
*/
{
ANSI_STRING ansi_str;
ANSI_STRING AnsiString;
ObInitializeObjectHeader(OBJTYP_DIRECTORY,NULL,&namespc_root.hdr);
ObDirectoryType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
ObDirectoryType->TotalObjects = 0;
ObDirectoryType->TotalHandles = 0;
ObDirectoryType->MaxObjects = ULONG_MAX;
ObDirectoryType->MaxHandles = ULONG_MAX;
ObDirectoryType->PagedPoolCharge = 0;
ObDirectoryType->NonpagedPoolCharge = sizeof(DIRECTORY_OBJECT);
ObDirectoryType->Dump = NULL;
ObDirectoryType->Open = NULL;
ObDirectoryType->Close = NULL;
ObDirectoryType->Delete = NULL;
ObDirectoryType->Parse = NULL;
ObDirectoryType->Security = NULL;
ObDirectoryType->QueryName = NULL;
ObDirectoryType->OkayToClose = NULL;
RtlInitAnsiString(&AnsiString,"Directory");
RtlAnsiStringToUnicodeString(&ObDirectoryType->TypeName,
&AnsiString,TRUE);
ObInitializeObjectHeader(ObDirectoryType,NULL,&namespc_root.hdr);
InitializeListHead(&namespc_root.head);
}
RtlInitAnsiString(&ansi_str,"Directory");
RtlAnsiStringToUnicodeString(&DirectoryObjectType.TypeName,&ansi_str,
TRUE);
ObRegisterType(OBJTYP_DIRECTORY,&DirectoryObjectType);
NTSTATUS NtCreateDirectoryObject(PHANDLE DirectoryHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes)
{
return(ZwCreateDirectoryObject(DirectoryHandle,
DesiredAccess,
ObjectAttributes));
}
NTSTATUS ZwCreateDirectoryObject(PHANDLE DirectoryHandle,
@ -254,7 +305,7 @@ NTSTATUS ZwCreateDirectoryObject(PHANDLE DirectoryHandle,
PDIRECTORY_OBJECT dir;
dir = ObGenericCreateObject(DirectoryHandle,DesiredAccess,ObjectAttributes,
OBJTYP_DIRECTORY);
ObDirectoryType);
/*
* Initialize the object body
@ -326,9 +377,9 @@ static PVOID ObDirLookup(PDIRECTORY_OBJECT dir, PWSTR name)
}
while (current!=(&(dir->head)))
{
current_obj = CONTAINING_RECORD(current,OBJECT_HEADER,entry);
DPRINT("Scanning %w\n",current_obj->name.Buffer);
if ( wcscmp(current_obj->name.Buffer, name)==0)
current_obj = CONTAINING_RECORD(current,OBJECT_HEADER,Entry);
DPRINT("Scanning %w\n",current_obj->Name.Buffer);
if ( wcscmp(current_obj->Name.Buffer, name)==0)
{
return(HEADER_TO_BODY(current_obj));
}
@ -338,6 +389,16 @@ static PVOID ObDirLookup(PDIRECTORY_OBJECT dir, PWSTR name)
return(NULL);
}
VOID ObRemoveEntry(POBJECT_HEADER Header)
{
KIRQL oldlvl;
DPRINT("ObRemoveEntry(Header %x)\n",Header);
KeAcquireSpinLock(&(Header->Parent->Lock),&oldlvl);
RemoveEntryList(&(Header->Entry));
KeReleaseSpinLock(&(Header->Parent->Lock),oldlvl);
}
VOID ObCreateEntry(PDIRECTORY_OBJECT parent,POBJECT_HEADER Object)
/*
@ -348,14 +409,13 @@ VOID ObCreateEntry(PDIRECTORY_OBJECT parent,POBJECT_HEADER Object)
* Object = Header of the object to add the entry for
*/
{
DPRINT("ObjCreateEntry(%x,%x,%x,%w)\n",parent,Object,Object->name.Buffer,
Object->name.Buffer);
assert(parent->Type == OBJTYP_DIRECTORY);
DPRINT("ObjCreateEntry(%x,%x,%x,%w)\n",parent,Object,Object->Name.Buffer,
Object->Name.Buffer);
/*
* Insert ourselves in our parents list
*/
InsertTailList(&parent->head,&Object->entry);
InsertTailList(&parent->head,&Object->Entry);
}
NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object,
@ -411,7 +471,8 @@ NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object,
next = &string[0];
current = next+1;
while (next!=NULL && current_dir->Type==OBJTYP_DIRECTORY)
while (next!=NULL &&
BODY_TO_HEADER(current_dir)->ObjectType==ObDirectoryType)
{
*next = '\\';
current = next+1;
@ -433,15 +494,10 @@ NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object,
{
DbgPrint("(%s:%d) Path component not found\n",__FILE__,
__LINE__);
ExFreePool(string);
return(STATUS_UNSUCCESSFUL);
}
DPRINT("current_dir %x\n",current_dir);
DPRINT("current_dir->Type %d OBJTYP_SYMLNK %d OBJTYP_DIRECTORY %d\n",
current_dir->Type,OBJTYP_SYMLNK,OBJTYP_DIRECTORY);
DPRINT("&(current_dir->Type) %x\n",&(current_dir->Type));
if (current_dir->Type==OBJTYP_SYMLNK)
if (BODY_TO_HEADER(current_dir)->ObjectType==IoSymbolicLinkType)
{
current_dir = IoOpenSymlink(current_dir);
}
@ -465,17 +521,13 @@ NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object,
CHECKPOINT;
*next = '\\';
*UnparsedSection = next;
switch(current_dir->Type)
if (BODY_TO_HEADER(current_dir)->ObjectType == IoDeviceType)
{
case OBJTYP_DEVICE:
CHECKPOINT;
Status = STATUS_FS_QUERY_REQUIRED;
break;
default:
current_dir = NULL;
}
else
{
Status = STATUS_UNSUCCESSFUL;
break;
}
}
CHECKPOINT;

View file

@ -17,35 +17,93 @@
#define NDEBUG
#include <internal/debug.h>
/* GLOBALS ****************************************************************/
/*
* List of pointers to object types
*/
static POBJECT_TYPE ObjectTypes[OBJTYP_MAX]={NULL,};
/* FUNCTIONS ************************************************************/
NTSTATUS STDCALL NtSetInformationObject(IN HANDLE ObjectHandle,
IN CINT ObjectInformationClass,
IN PVOID ObjectInformation,
IN ULONG Length)
{
return(ZwSetInformationObject(ObjectHandle,
ObjectInformationClass,
ObjectInformation,
Length));
}
NTSTATUS STDCALL ZwSetInformationObject(IN HANDLE ObjectHandle,
IN CINT ObjectInformationClass,
IN PVOID ObjectInformation,
IN ULONG Length)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtQueryObject(IN HANDLE ObjectHandle,
IN CINT ObjectInformationClass,
OUT PVOID ObjectInformation,
IN ULONG Length,
OUT PULONG ResultLength)
{
return(ZwQueryObject(ObjectHandle,
ObjectInformationClass,
ObjectInformation,
Length,
ResultLength));
}
NTSTATUS STDCALL ZwQueryObject(IN HANDLE ObjectHandle,
IN CINT ObjectInformationClass,
OUT PVOID ObjectInformation,
IN ULONG Length,
OUT PULONG ResultLength)
{
UNIMPLEMENTED
}
NTSTATUS NtMakeTemporaryObject(HANDLE Handle)
{
return(ZwMakeTemporaryObject(Handle));
}
NTSTATUS ZwMakeTemporaryObject(HANDLE Handle)
{
UNIMPLEMENTED;
PVOID Object;
NTSTATUS Status;
POBJECT_HEADER ObjectHeader;
Status = ObReferenceObjectByHandle(Handle,
0,
NULL,
KernelMode,
&Object,
NULL);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
ObjectHeader = BODY_TO_HEADER(Object);
ObjectHeader->Permanent = FALSE;
ObDereferenceObject(Object);
return(STATUS_SUCCESS);
}
PVOID ObGenericCreateObject(PHANDLE Handle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
CSHORT Type)
POBJECT_TYPE Type)
{
POBJECT_HEADER hdr = NULL;
UNICODE_STRING ObjectName;
PWSTR path;
PWSTR name;
PDIRECTORY_OBJECT parent;
PWSTR Ignored;
DPRINT("ObGenericCreateObject(Handle %x, DesiredAccess %x,"
"ObjectAttributes %x, Type %d)\n",Handle,DesiredAccess,ObjectAttributes,
Type);
"ObjectAttributes %x, Type %x)\n",Handle,DesiredAccess,
ObjectAttributes,Type);
/*
* Allocate the object body and header
@ -62,7 +120,13 @@ PVOID ObGenericCreateObject(PHANDLE Handle,
if (ObjectAttributes==NULL)
{
ObInitializeObjectHeader(Type,NULL,hdr);
*Handle = ObAddHandle(HEADER_TO_BODY(hdr));
if (Handle != NULL)
{
*Handle = ObInsertHandle(KeGetCurrentProcess(),
HEADER_TO_BODY(hdr),
DesiredAccess,
FALSE);
}
return(HEADER_TO_BODY(hdr));
}
@ -107,31 +171,19 @@ PVOID ObGenericCreateObject(PHANDLE Handle,
ObCreateEntry(hdr->Parent,hdr);
DPRINT("Handle %x\n",Handle);
*Handle = ObAddHandle(HEADER_TO_BODY(hdr));
if (Handle != NULL)
{
*Handle = ObInsertHandle(KeGetCurrentProcess(),
HEADER_TO_BODY(hdr),
DesiredAccess,
FALSE);
}
return(HEADER_TO_BODY(hdr));
}
ULONG ObSizeOf(CSHORT Type)
{
DPRINT("ObSizeOf(Type %d)\n",Type);
DPRINT("ObSizeOf() Returning %d\n",ObjectTypes[Type]->PagedPoolCharge);
return(ObjectTypes[Type]->PagedPoolCharge);
}
VOID ObRegisterType(CSHORT id, POBJECT_TYPE type)
/*
* FUNCTION: Registers a new type of object
* ARGUMENTS:
* typ = Pointer to the type definition to register
*/
{
DPRINT("ObRegisterType(id %d, type %x)\n",id,type);
ObjectTypes[id]=type;
}
VOID ObInitializeObjectHeader(CSHORT id, PWSTR name,
POBJECT_HEADER obj)
VOID ObInitializeObjectHeader(POBJECT_TYPE Type, PWSTR name,
POBJECT_HEADER ObjectHeader)
/*
* FUNCTION: Creates a new object
* ARGUMENT:
@ -141,38 +193,25 @@ VOID ObInitializeObjectHeader(CSHORT id, PWSTR name,
{
PWSTR temp_name;
if (name!=NULL)
{
DPRINT("ObInitializeObjectHeader(id %d name %w obj %x)\n",id,
name,obj);
}
else
{
DPRINT("ObInitializeObjectHeader(id %d name %x obj %x)\n",id,
name,obj);
}
DPRINT("ObInitializeObjectHeader(id %x name %w obj %x)\n",Type,
name,ObjectHeader);
obj->HandleCount = 0;
obj->RefCount = 0;
obj->Type = id;
ObjectHeader->HandleCount = 0;
ObjectHeader->RefCount = 0;
ObjectHeader->ObjectType = Type;
ObjectHeader->Permanent = FALSE;
if (name==NULL)
{
obj->name.Length=0;
obj->name.Buffer=NULL;
ObjectHeader->Name.Length=0;
ObjectHeader->Name.Buffer=NULL;
}
else
{
DPRINT("name %w\n",name);
obj->name.MaximumLength = wstrlen(name);
obj->name.Buffer = ExAllocatePool(NonPagedPool,
(obj->name.MaximumLength+1)*2);
DPRINT("name %w\n",name);
RtlInitUnicodeString(&obj->name,name);
DPRINT("name %w\n",obj->name.Buffer);
ObjectHeader->Name.MaximumLength = wstrlen(name);
ObjectHeader->Name.Buffer = ExAllocatePool(NonPagedPool,
(ObjectHeader->Name.MaximumLength+1)*2);
RtlInitUnicodeString(&ObjectHeader->Name,name);
}
DPRINT("obj->Type %d\n",obj->Type);
DPRINT("obj %x\n",obj);
DPRINT("&(obj->Type) %x\n",&(obj->Type));
}
@ -199,6 +238,17 @@ NTSTATUS ObReferenceObjectByPointer(PVOID ObjectBody,
return(STATUS_SUCCESS);
}
NTSTATUS ObPerformRetentionChecks(POBJECT_HEADER Header)
{
if (Header->RefCount == 0 && Header->HandleCount == 0 &&
!Header->Permanent)
{
ObRemoveEntry(Header);
ExFreePool(Header);
}
return(STATUS_SUCCESS);
}
VOID ObDereferenceObject(PVOID ObjectBody)
/*
* FUNCTION: Decrements a given object's reference count and performs
@ -207,8 +257,15 @@ VOID ObDereferenceObject(PVOID ObjectBody)
* ObjectBody = Body of the object
*/
{
POBJECT_HEADER Object = BODY_TO_HEADER(ObjectBody);
Object->RefCount--;
POBJECT_HEADER Header = BODY_TO_HEADER(ObjectBody);
Header->RefCount--;
ObPerformRetentionChecks(Header);
}
NTSTATUS NtClose(HANDLE Handle)
{
return(ZwClose(Handle));
}
NTSTATUS ZwClose(HANDLE Handle)
@ -220,15 +277,25 @@ NTSTATUS ZwClose(HANDLE Handle)
*/
{
PVOID ObjectBody;
POBJECT_HEADER Header;
PHANDLE_REP HandleRep;
assert_irql(PASSIVE_LEVEL);
ObjectBody = ObGetObjectByHandle(Handle);
if (ObjectBody == NULL)
HandleRep = ObTranslateHandle(KeGetCurrentProcess(),Handle);
if (HandleRep == NULL)
{
return(STATUS_INVALID_HANDLE);
}
ObDereferenceObject(ObjectBody);
ObjectBody = HandleRep->ObjectBody;
HandleRep->ObjectBody = NULL;
Header = BODY_TO_HEADER(ObjectBody);
Header->HandleCount--;
ObPerformRetentionChecks(Header);
return(STATUS_SUCCESS);
}
@ -254,18 +321,47 @@ NTSTATUS ObReferenceObjectByHandle(HANDLE Handle,
* RETURNS: Status
*/
{
PVOID ObjectBody;
PHANDLE_REP HandleRep;
POBJECT_HEADER ObjectHeader;
ASSERT_IRQL(PASSIVE_LEVEL);
assert(HandleInformationPtr==NULL);
assert(Object!=NULL);
assert(Handle!=NULL);
ObjectBody = ObGetObjectByHandle(Handle);
if (ObjectBody == NULL)
DPRINT("ObReferenceObjectByHandle(Handle %x, DesiredAccess %x, "
"ObjectType %x, AccessMode %d, Object %x)\n",Handle,DesiredAccess,
ObjectType,AccessMode,Object);
if (Handle == NtCurrentProcess())
{
*Object = PsGetCurrentProcess();
return(STATUS_SUCCESS);
}
if (Handle == NtCurrentThread())
{
*Object = PsGetCurrentThread();
return(STATUS_SUCCESS);
}
HandleRep = ObTranslateHandle(KeGetCurrentProcess(),Handle);
if (HandleRep == NULL || HandleRep->ObjectBody == NULL)
{
return(STATUS_INVALID_HANDLE);
}
return(ObReferenceObjectByPointer(ObjectBody,DesiredAccess,
ObjectType,AccessMode));
ObjectHeader = BODY_TO_HEADER(HandleRep->ObjectBody);
if (ObjectType != NULL && ObjectType != ObjectHeader->ObjectType)
{
return(STATUS_UNSUCCESSFUL);
}
if (!(HandleRep->GrantedAccess & DesiredAccess))
{
return(STATUS_ACCESS_DENIED);
}
ObjectHeader->RefCount++;
*Object = HandleRep->ObjectBody;
return(STATUS_SUCCESS);
}

View file

@ -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));
}

View file

@ -11,23 +11,70 @@
/* INCLUDES ******************************************************************/
#include <ddk/ntddk.h>
#include <internal/ob.h>
#include <internal/mm.h>
#include <internal/string.h>
#define NDEBUG
//#define NDEBUG
#include <internal/debug.h>
/* GLOBALS ******************************************************************/
EPROCESS SystemProcess = {{0},};
PEPROCESS SystemProcess = NULL;
HANDLE SystemProcessHandle = NULL;
POBJECT_TYPE PsProcessType = NULL;
/* FUNCTIONS *****************************************************************/
VOID PsInitProcessManagment(VOID)
{
InitializeListHead(&(SystemProcess.Pcb.MemoryAreaList));
ANSI_STRING AnsiString;
PKPROCESS KProcess;
/*
* Register the process object type
*/
PsProcessType = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE));
PsProcessType->TotalObjects = 0;
PsProcessType->TotalHandles = 0;
PsProcessType->MaxObjects = ULONG_MAX;
PsProcessType->MaxHandles = ULONG_MAX;
PsProcessType->PagedPoolCharge = 0;
PsProcessType->NonpagedPoolCharge = sizeof(EPROCESS);
PsProcessType->Dump = NULL;
PsProcessType->Open = NULL;
PsProcessType->Close = NULL;
PsProcessType->Delete = NULL;
PsProcessType->Parse = NULL;
PsProcessType->Security = NULL;
PsProcessType->QueryName = NULL;
PsProcessType->OkayToClose = NULL;
RtlInitAnsiString(&AnsiString,"Process");
RtlAnsiStringToUnicodeString(&PsProcessType->TypeName,&AnsiString,TRUE);
/*
* Initialize the system process
*/
SystemProcess = ObGenericCreateObject(NULL,PROCESS_ALL_ACCESS,NULL,
PsProcessType);
KProcess = &SystemProcess->Pcb;
InitializeListHead(&(KProcess->MemoryAreaList));
ObInitializeHandleTable(NULL,FALSE,KProcess);
KProcess->PageTableDirectory = get_page_directory();
SystemProcessHandle = ObInsertHandle(KProcess,SystemProcess,
PROCESS_ALL_ACCESS,FALSE);
}
PKPROCESS KeGetCurrentProcess(VOID)
/*
* FUNCTION: Returns a pointer to the current process
*/
{
return(&(PsGetCurrentProcess()->Pcb));
}
@ -37,7 +84,233 @@ struct _EPROCESS* PsGetCurrentProcess(VOID)
* FUNCTION: Returns a pointer to the current process
*/
{
DPRINT("PsGetCurrentProcess() = %x\n",PsGetCurrentThread()->ThreadsProcess);
if (PsGetCurrentThread()==NULL
|| PsGetCurrentThread()->ThreadsProcess==NULL)
{
return(SystemProcess);
}
else
{
return(PsGetCurrentThread()->ThreadsProcess);
}
}
NTSTATUS STDCALL NtCreateProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN HANDLE ParentProcessHandle,
IN BOOLEAN InheritObjectTable,
IN HANDLE SectionHandle OPTIONAL,
IN HANDLE DebugPort OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL)
{
return(ZwCreateProcess(ProcessHandle,
DesiredAccess,
ObjectAttributes,
ParentProcessHandle,
InheritObjectTable,
SectionHandle,
DebugPort,
ExceptionPort));
}
NTSTATUS STDCALL ZwCreateProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN HANDLE ParentProcessHandle,
IN BOOLEAN InheritObjectTable,
IN HANDLE SectionHandle OPTIONAL,
IN HANDLE DebugPort OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL)
/*
* FUNCTION: Creates a process.
* ARGUMENTS:
* ProcessHandle (OUT) = Caller supplied storage for the resulting
* handle
* DesiredAccess = Specifies the allowed or desired access to the
* process can be a combination of
* STANDARD_RIGHTS_REQUIRED| ..
* ObjectAttribute = Initialized attributes for the object, contains
* the rootdirectory and the filename
* ParentProcess = Handle to the parent process.
* InheritObjectTable = Specifies to inherit the objects of the parent
* process if true.
* SectionHandle = Handle to a section object to back the image file
* DebugPort = Handle to a DebugPort if NULL the system default debug
* port will be used.
* ExceptionPort = Handle to a exception port.
* REMARKS:
* This function maps to the win32 CreateProcess.
* RETURNS: Status
*/
{
PEPROCESS Process;
PEPROCESS ParentProcess;
PULONG PageDirectory;
PULONG CurrentPageDirectory;
ULONG i;
PKPROCESS KProcess;
ULONG Base;
ULONG Length;
LARGE_INTEGER Offset;
NTSTATUS Status;
Status = ObReferenceObjectByHandle(ParentProcessHandle,
PROCESS_CREATE_PROCESS,
PsProcessType,
UserMode,
&ParentProcessHandle,
NULL);
if (Status != STATUS_SUCCESS)
{
DPRINT("ZwCreateProcess() = %x\n",Status);
return(Status);
}
Process = ObGenericCreateObject(ProcessHandle,DesiredAccess,
ObjectAttributes,PsProcessType);
KProcess = &(Process->Pcb);
InitializeListHead(&(KProcess->MemoryAreaList));
ObInitializeHandleTable(KProcess,InheritObjectTable,KProcess);
PageDirectory = physical_to_linear((ULONG)get_free_page());
KProcess->PageTableDirectory = PageDirectory;
CurrentPageDirectory = get_page_directory();
memset(PageDirectory,0,PAGESIZE);
for (i=768;i<1024;i++)
{
PageDirectory[i]=CurrentPageDirectory[i];
}
return(STATUS_SUCCESS);
}
NTSTATUS STDCALL NtTerminateProcess(IN HANDLE ProcessHandle,
IN NTSTATUS ExitStatus)
{
return(ZwTerminateProcess(ProcessHandle,ExitStatus));
}
NTSTATUS STDCALL ZwTerminateProcess(IN HANDLE ProcessHandle,
IN NTSTATUS ExitStatus)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtOpenProcess (OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId)
{
return(ZwOpenProcess(ProcessHandle,
DesiredAccess,
ObjectAttributes,
ClientId));
}
NTSTATUS STDCALL ZwOpenProcess (OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtQueryInformationProcess(
IN HANDLE ProcessHandle,
IN CINT ProcessInformationClass,
OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength)
{
return(ZwQueryInformationProcess(ProcessHandle,
ProcessInformationClass,
ProcessInformation,
ProcessInformationLength,
ReturnLength));
}
NTSTATUS STDCALL ZwQueryInformationProcess(
IN HANDLE ProcessHandle,
IN CINT ProcessInformationClass,
OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength)
{
PEPROCESS Process;
NTSTATUS Status;
Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_QUERY_INFORMATION,
PsProcessType,
UserMode,
&ProcessHandle,
NULL);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
switch (ProcessInformationClass)
{
case ProcessBasicInformation:
case ProcessQuotaLimits:
case ProcessIoCounters:
case ProcessVmCounters:
case ProcessTimes:
case ProcessBasePriority:
case ProcessRaisePriority:
case ProcessDebugPort:
case ProcessExceptionPort:
case ProcessAccessToken:
case ProcessLdtInformation:
case ProcessLdtSize:
case ProcessDefaultHardErrorMode:
case ProcessIoPortHandlers:
case ProcessWorkingSetWatch:
case ProcessUserModeIOPL:
case ProcessEnableAlignmentFaultFixup:
case ProcessPriorityClass:
case ProcessWx86Information:
case ProcessHandleCount:
case ProcessAffinityMask:
default:
Status = STATUS_NOT_IMPLEMENTED;
}
return(Status);
}
NTSTATUS
STDCALL
NtSetInformationProcess(
IN HANDLE ProcessHandle,
IN CINT ProcessInformationClass,
IN PVOID ProcessInformation,
IN ULONG ProcessInformationLength
)
{
return(ZwSetInformationProcess(ProcessHandle,
ProcessInformationClass,
ProcessInformation,
ProcessInformationLength));
}
NTSTATUS
STDCALL
ZwSetInformationProcess(
IN HANDLE ProcessHandle,
IN CINT ProcessInformationClass,
IN PVOID ProcessInformation,
IN ULONG ProcessInformationLength
)
{
UNIMPLEMENTED;
}

View file

@ -16,7 +16,6 @@
VOID PsInit(VOID)
{
ObjInitializeHandleTable(NULL);
PsInitProcessManagment();
PsInitThreadManagment();
PsInitIdleThread();

View file

@ -33,32 +33,13 @@
/* GLOBALS ******************************************************************/
OBJECT_TYPE ThreadObjectType = {{NULL,0,0},
0,
0,
ULONG_MAX,
ULONG_MAX,
sizeof(ETHREAD),
0,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
};
POBJECT_TYPE PsThreadType = NULL;
#define NR_THREAD_PRIORITY_LEVELS (32)
#define NR_THREAD_PRIORITY_LEVELS (31)
#define THREAD_PRIORITY_MAX (15)
static KSPIN_LOCK ThreadListLock = {0,};
/*
* PURPOSE: List of all threads currently active
*/
static LIST_ENTRY ThreadListHead = {NULL,NULL};
/*
* PURPOSE: List of threads associated with each priority level
*/
@ -71,17 +52,9 @@ static ULONG NextThreadUniqueId = 0;
/* FUNCTIONS ***************************************************************/
NTSTATUS ZwSetInformationThread(HANDLE ThreadHandle,
THREADINFOCLASS ThreadInformationClass,
PVOID ThreadInformation,
ULONG ThreadInformationLength)
{
UNIMPLEMENTED;
}
PKTHREAD KeGetCurrentThread(VOID)
{
return((PKTHREAD)CurrentThread);
return(&(CurrentThread->Tcb));
}
PETHREAD PsGetCurrentThread(VOID)
@ -89,30 +62,53 @@ PETHREAD PsGetCurrentThread(VOID)
return((PETHREAD)KeGetCurrentThread());
}
#if CAN_WE_DARE_TO_TRY_THIS
void PsDispatchThread(void)
static VOID PsInsertIntoThreadList(KPRIORITY Priority, PETHREAD Thread)
{
int i;
KIRQL oldlvl;
for (i=0; i<NR_THREAD_PRIORITY_LEVELS; i++)
{
if (PsDispatchSpecificPriorityThread(i))
{
return;
}
}
}
#endif
DPRINT("PsInsertIntoThreadList(Priority %d, Thread %x)\n",Priority,Thread);
void PsDispatchThread(void)
/*
* FUNCTION: Chooses a thread, possibly the current one if it is runnable
* and dispatches it
*/
KeAcquireSpinLock(&ThreadListLock,&oldlvl);
InsertTailList(&PriorityListHead[THREAD_PRIORITY_MAX+Priority],
&Thread->Tcb.Entry);
KeReleaseSpinLock(&ThreadListLock,oldlvl);
}
static PETHREAD PsScanThreadList(KPRIORITY Priority)
{
KIRQL irql;
PLIST_ENTRY current_entry;
PKTHREAD current;
PETHREAD current;
PETHREAD oldest = NULL;
ULONG oldest_time = 0;
DPRINT("PsScanThreadList(Priority %d)\n",Priority);
current_entry = PriorityListHead[THREAD_PRIORITY_MAX+Priority].Flink;
while (current_entry != &PriorityListHead[THREAD_PRIORITY_MAX+Priority])
{
current = CONTAINING_RECORD(current_entry,ETHREAD,Tcb.Entry);
if (current->Tcb.ThreadState == THREAD_STATE_RUNNABLE)
{
if (oldest == NULL || oldest_time > current->Tcb.LastTick)
{
oldest = current;
oldest_time = current->Tcb.LastTick;
}
}
current_entry = current_entry->Flink;
}
DPRINT("PsScanThreadList() = %x\n",oldest);
return(oldest);
}
VOID PsDispatchThread(VOID)
{
KPRIORITY CurrentPriority;
PETHREAD Candidate;
KIRQL irql;
LARGE_INTEGER TickCount;
KeAcquireSpinLock(&ThreadListLock,&irql);
if (!DoneInitYet)
{
@ -121,60 +117,123 @@ void PsDispatchThread(void)
DPRINT("PsDispatchThread() Current %x\n",CurrentThread);
/*
* Bump overselves up to a higher IRQ level during this
*/
KeAcquireSpinLock(&ThreadListLock,&irql);
/*
* If this was an involuntary reschedule then the current thread will still
* be eligible to run later
*/
if (CurrentThread->Tcb.ThreadState==THREAD_STATE_RUNNING)
{
CurrentThread->Tcb.ThreadState=THREAD_STATE_RUNNABLE;
}
/*
* Simple round robin algorithm, iterate through and dispatch the first
* runnable thread
*/
current = CONTAINING_RECORD(ThreadListHead.Flink,KTHREAD,Entry);
current_entry = ThreadListHead.Flink;
while (current_entry!=(&ThreadListHead))
for (CurrentPriority=THREAD_PRIORITY_TIME_CRITICAL;
CurrentPriority>=THREAD_PRIORITY_IDLE;
CurrentPriority--)
{
DPRINT("Scanning %x ",current);
DPRINT("State %x Runnable %x\n",current->ThreadState,
THREAD_STATE_RUNNABLE);
if (current->ThreadState == THREAD_STATE_RUNNABLE &&
current != (PKTHREAD)CurrentThread)
Candidate = PsScanThreadList(CurrentPriority);
if (Candidate == CurrentThread)
{
DPRINT("Scheduling this one %x\n",current);
CurrentThread = current;
DPRINT("Scheduling current thread\n");
KeQueryTickCount(&TickCount);
CurrentThread->Tcb.LastTick = TickCount.LowPart;
CurrentThread->Tcb.ThreadState = THREAD_STATE_RUNNING;
KeReleaseSpinLock(&ThreadListLock,irql);
HalTaskSwitch(current);
return;
}
current_entry = current->Entry.Flink;
current = CONTAINING_RECORD(current_entry,KTHREAD,Entry);
}
/*
* If there are no other threads then continue with the current one if
* possible
*/
if (CurrentThread->Tcb.ThreadState == THREAD_STATE_RUNNABLE)
if (Candidate != NULL)
{
DPRINT("Scheduling %x\n",Candidate);
Candidate->Tcb.ThreadState = THREAD_STATE_RUNNING;
KeQueryTickCount(&TickCount);
CurrentThread->Tcb.LastTick = TickCount.LowPart;
CurrentThread = Candidate;
KeReleaseSpinLock(&ThreadListLock,irql);
KeLowerIrql(PASSIVE_LEVEL);
HalTaskSwitch(&CurrentThread->Tcb);
return;
}
}
}
/*
* Disaster
*/
printk("Out of threads at %s:%d\n",__FILE__,__LINE__);
for(;;);
NTSTATUS PsInitializeThread(HANDLE ProcessHandle,
PETHREAD* ThreadPtr,
PHANDLE ThreadHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ThreadAttributes)
{
ULONG ThreadId;
ULONG ProcessId;
PETHREAD Thread;
NTSTATUS Status;
Thread = ObGenericCreateObject(ThreadHandle,
DesiredAccess,
ThreadAttributes,
PsThreadType);
DPRINT("Thread = %x\n",Thread);
Thread->Tcb.LastTick = 0;
Thread->Tcb.ThreadState=THREAD_STATE_SUSPENDED;
Thread->Tcb.BasePriority=THREAD_PRIORITY_NORMAL;
Thread->Tcb.CurrentPriority=THREAD_PRIORITY_NORMAL;
Thread->Tcb.ApcList=ExAllocatePool(NonPagedPool,sizeof(LIST_ENTRY));
Thread->Tcb.SuspendCount = 1;
if (ProcessHandle!=NULL)
{
Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_CREATE_THREAD,
PsProcessType,
UserMode,
(PVOID*)&Thread->ThreadsProcess,
NULL);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
}
else
{
Thread->ThreadsProcess=SystemProcess;
}
InitializeListHead(Thread->Tcb.ApcList);
InitializeListHead(&(Thread->IrpList));
Thread->Cid.UniqueThread=NextThreadUniqueId++;
// thread->Cid.ThreadId=InterlockedIncrement(&NextThreadUniqueId);
PsInsertIntoThreadList(Thread->Tcb.CurrentPriority,Thread);
*ThreadPtr = Thread;
return(STATUS_SUCCESS);
}
VOID PsResumeThread(PETHREAD Thread)
{
DPRINT("PsResumeThread(Thread %x)\n",Thread);
Thread->Tcb.SuspendCount--;
DPRINT("Thread->Tcb.SuspendCount %d\n",Thread->Tcb.SuspendCount);
DPRINT("Thread->Tcb.ThreadState %d THREAD_STATE_RUNNING %d\n",
Thread->Tcb.ThreadState,THREAD_STATE_RUNNING);
if (Thread->Tcb.SuspendCount <= 0 &&
Thread->Tcb.ThreadState != THREAD_STATE_RUNNING)
{
DPRINT("Setting thread to runnable\n");
Thread->Tcb.ThreadState = THREAD_STATE_RUNNABLE;
}
DPRINT("Finished PsResumeThread()\n");
}
VOID PsSuspendThread(PETHREAD Thread)
{
DPRINT("PsSuspendThread(Thread %x)\n",Thread);
Thread->Tcb.SuspendCount++;
if (Thread->Tcb.SuspendCount > 0)
{
Thread->Tcb.ThreadState = THREAD_STATE_SUSPENDED;
if (Thread == CurrentThread)
{
PsDispatchThread();
}
}
}
void PsInitThreadManagment(void)
@ -182,67 +241,50 @@ void PsInitThreadManagment(void)
* FUNCTION: Initialize thread managment
*/
{
PETHREAD first_thread;
PETHREAD FirstThread;
ULONG i;
ANSI_STRING AnsiString;
HANDLE FirstThreadHandle;
InitializeListHead(&ThreadListHead);
KeInitializeSpinLock(&ThreadListLock);
for (i=0; i<NR_THREAD_PRIORITY_LEVELS; i++)
{
InitializeListHead(&PriorityListHead[i]);
}
ObRegisterType(OBJTYP_THREAD,&ThreadObjectType);
PsThreadType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
first_thread = ExAllocatePool(NonPagedPool,sizeof(ETHREAD));
first_thread->Tcb.ThreadState = THREAD_STATE_RUNNING;
HalInitFirstTask((PKTHREAD)first_thread);
ExInterlockedInsertHeadList(&ThreadListHead,&first_thread->Tcb.Entry,
&ThreadListLock);
CurrentThread = first_thread;
RtlInitAnsiString(&AnsiString,"Thread");
RtlAnsiStringToUnicodeString(&PsThreadType->TypeName,&AnsiString,TRUE);
PsThreadType->TotalObjects = 0;
PsThreadType->TotalHandles = 0;
PsThreadType->MaxObjects = 0;
PsThreadType->MaxHandles = 0;
PsThreadType->PagedPoolCharge = 0;
PsThreadType->NonpagedPoolCharge = sizeof(ETHREAD);
PsThreadType->Dump = NULL;
PsThreadType->Open = NULL;
PsThreadType->Close = NULL;
PsThreadType->Delete = NULL;
PsThreadType->Parse = NULL;
PsThreadType->Security = NULL;
PsThreadType->QueryName = NULL;
PsThreadType->OkayToClose = NULL;
PsInitializeThread(NULL,&FirstThread,&FirstThreadHandle,
THREAD_ALL_ACCESS,NULL);
HalInitFirstTask(FirstThread);
FirstThread->Tcb.ThreadState = THREAD_STATE_RUNNING;
FirstThread->Tcb.SuspendCount = 0;
DPRINT("FirstThread %x\n",FirstThread);
CurrentThread = FirstThread;
DoneInitYet = TRUE;
}
NTSTATUS PsWakeThread(PETHREAD Thread)
{
Thread->Tcb.ThreadState = THREAD_STATE_RUNNABLE;
return(STATUS_SUCCESS);
}
NTSTATUS PsSuspendThread(VOID)
/*
* FUNCTION: Suspend the current thread
*/
{
KIRQL oldlvl;
DPRINT("suspending %x\n",CurrentThread);
/*
* NOTE: When we return from PsDispatchThread the spinlock will be
* released
*/
CurrentThread->Tcb.ThreadState = THREAD_STATE_SUSPENDED;
PsDispatchThread();
return(STATUS_SUCCESS);
}
NTSTATUS PsTerminateSystemThread(NTSTATUS ExitStatus)
/*
* FUNCTION: Terminates the current thread
* ARGUMENTS:
* ExitStatus = Status to pass to the creater
* RETURNS: Doesn't
*/
{
KIRQL oldlvl;
DPRINT("terminating %x\n",CurrentThread);
KeRaiseIrql(DISPATCH_LEVEL,&oldlvl);
CurrentThread->Tcb.ThreadState = THREAD_STATE_TERMINATED;
RemoveEntryList(&CurrentThread->Tcb.Entry);
PsDispatchThread();
for(;;);
}
NTSTATUS NtCreateThread(PHANDLE ThreadHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
@ -252,6 +294,50 @@ NTSTATUS NtCreateThread(PHANDLE ThreadHandle,
PINITIAL_TEB InitialTeb,
BOOLEAN CreateSuspended)
{
return(ZwCreateThread(ThreadHandle,
DesiredAccess,
ObjectAttributes,
ProcessHandle,
Client,
ThreadContext,
InitialTeb,
CreateSuspended));
}
NTSTATUS ZwCreateThread(PHANDLE ThreadHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
HANDLE ProcessHandle,
PCLIENT_ID Client,
PCONTEXT ThreadContext,
PINITIAL_TEB InitialTeb,
BOOLEAN CreateSuspended)
{
PETHREAD Thread;
NTSTATUS Status;
Status = PsInitializeThread(ProcessHandle,&Thread,ThreadHandle,
DesiredAccess,ObjectAttributes);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
HalInitTaskWithContext(Thread,ThreadContext);
Thread->StartAddress=NULL;
if (Client!=NULL)
{
*Client=Thread->Cid;
}
if (!CreateSuspended)
{
DPRINT("Not creating suspended\n");
PsResumeThread(Thread);
}
DPRINT("Finished PsCreateThread()\n");
return(STATUS_SUCCESS);
}
NTSTATUS PsCreateSystemThread(PHANDLE ThreadHandle,
@ -278,40 +364,29 @@ NTSTATUS PsCreateSystemThread(PHANDLE ThreadHandle,
* RETURNS: Success or failure status
*/
{
PETHREAD thread;
ULONG ThreadId;
ULONG ProcessId;
PETHREAD Thread;
NTSTATUS Status;
thread = ObGenericCreateObject(ThreadHandle,0,NULL,OBJTYP_THREAD);
DPRINT("Allocating thread %x\n",thread);
DPRINT("PsCreateSystemThread(ThreadHandle %x, ProcessHandle %x)\n",
ThreadHandle,ProcessHandle);
Status = PsInitializeThread(ProcessHandle,&Thread,ThreadHandle,
DesiredAccess,ObjectAttributes);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
Thread->StartAddress=StartRoutine;
HalInitTask(Thread,StartRoutine,StartContext);
thread->Tcb.ThreadState=THREAD_STATE_RUNNABLE;
thread->Tcb.BasePriority=0;
thread->Tcb.CurrentPriority=0;
thread->Tcb.ApcList=ExAllocatePool(NonPagedPool,sizeof(LIST_ENTRY));
InitializeListHead(thread->Tcb.ApcList);
HalInitTask(&(thread->Tcb),StartRoutine,StartContext);
InitializeListHead(&(thread->IrpList));
thread->Cid.UniqueThread=NextThreadUniqueId++;
// thread->Cid.ThreadId=InterlockedIncrement(&NextThreadUniqueId);
if (ClientId!=NULL)
{
*ClientId=thread->Cid;
*ClientId=Thread->Cid;
}
if (ProcessHandle!=NULL)
{
thread->ThreadsProcess=ObGetObjectByHandle(ProcessHandle);
}
else
{
thread->ThreadsProcess=&SystemProcess;
}
thread->StartAddress=StartRoutine;
PsResumeThread(Thread);
ExInterlockedInsertHeadList(&ThreadListHead,&thread->Tcb.Entry,
&ThreadListLock);
return(STATUS_SUCCESS);
}
@ -321,6 +396,191 @@ LONG KeSetBasePriorityThread(PKTHREAD Thread, LONG Increment)
}
KPRIORITY KeSetPriorityThread(PKTHREAD Thread, KPRIORITY Priority)
{
KPRIORITY OldPriority;
OldPriority = Thread->CurrentPriority;
Thread->CurrentPriority = Priority;
RemoveEntryList(&Thread->Entry);
PsInsertIntoThreadList(Thread->CurrentPriority,
CONTAINING_RECORD(Thread,ETHREAD,Tcb));
return(OldPriority);
}
NTSTATUS STDCALL NtAlertResumeThread(IN HANDLE ThreadHandle,
OUT PULONG SuspendCount)
{
return(ZwAlertResumeThread(ThreadHandle,SuspendCount));
}
NTSTATUS STDCALL ZwAlertResumeThread(IN HANDLE ThreadHandle,
OUT PULONG SuspendCount)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtAlertThread(IN HANDLE ThreadHandle)
{
return(ZwAlertThread(ThreadHandle));
}
NTSTATUS STDCALL ZwAlertThread(IN HANDLE ThreadHandle)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtGetContextThread(IN HANDLE ThreadHandle,
OUT PCONTEXT Context)
{
return(ZwGetContextThread(ThreadHandle,Context));
}
NTSTATUS STDCALL ZwGetContextThread(IN HANDLE ThreadHandle,
OUT PCONTEXT Context)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtOpenThread(OUT PHANDLE ThreadHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId)
{
return(ZwOpenThread(ThreadHandle,
DesiredAccess,
ObjectAttributes,
ClientId));
}
NTSTATUS STDCALL ZwOpenThread(OUT PHANDLE ThreadHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtResumeThread(IN HANDLE ThreadHandle,
IN PULONG SuspendCount)
{
return(ZwResumeThread(ThreadHandle,SuspendCount));
}
NTSTATUS STDCALL ZwResumeThread(IN HANDLE ThreadHandle,
IN PULONG SuspendCount)
/*
* FUNCTION: Decrements a thread's resume count
* ARGUMENTS:
* ThreadHandle = Handle to the thread that should be resumed
* ResumeCount = The resulting resume count.
* REMARK:
* A thread is resumed if its suspend count is 0. This procedure maps to
* the win32 ResumeThread function. ( documentation about the the suspend count can be found here aswell )
* RETURNS: Status
*/
{
PETHREAD Thread;
NTSTATUS Status;
Status = ObReferenceObjectByHandle(ThreadHandle,
THREAD_SUSPEND_RESUME,
PsThreadType,
UserMode,
(PVOID*)&Thread,
NULL);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
(*SuspendCount) = InterlockedDecrement(&Thread->Tcb.SuspendCount);
if (Thread->Tcb.SuspendCount <= 0)
{
Thread->Tcb.ThreadState = THREAD_STATE_RUNNABLE;
}
return(STATUS_SUCCESS);
}
NTSTATUS STDCALL NtSetContextThread(IN HANDLE ThreadHandle,
IN PCONTEXT Context)
{
return(ZwSetContextThread(ThreadHandle,Context));
}
NTSTATUS STDCALL ZwSetContextThread(IN HANDLE ThreadHandle,
IN PCONTEXT Context)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtSuspendThread(IN HANDLE ThreadHandle,
IN PULONG PreviousSuspendCount)
{
return(ZwSuspendThread(ThreadHandle,PreviousSuspendCount));
}
NTSTATUS STDCALL ZwSuspendThread(IN HANDLE ThreadHandle,
IN PULONG PreviousSuspendCount)
/*
* FUNCTION: Increments a thread's suspend count
* ARGUMENTS:
* ThreadHandle = Handle to the thread that should be resumed
* PreviousSuspendCount = The resulting/previous suspend count.
* REMARK:
* A thread will be suspended if its suspend count is greater than 0.
* This procedure maps to the win32 SuspendThread function. (
* documentation about the the suspend count can be found here aswell )
* The suspend count is not increased if it is greater than
* MAXIMUM_SUSPEND_COUNT.
* RETURNS: Status
*/
{
PETHREAD Thread;
NTSTATUS Status;
Status = ObReferenceObjectByHandle(ThreadHandle,
THREAD_SUSPEND_RESUME,
PsThreadType,
UserMode,
(PVOID*)&Thread,
NULL);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
(*PreviousSuspendCount) = InterlockedIncrement(&Thread->Tcb.SuspendCount);
if (Thread->Tcb.SuspendCount > 0)
{
Thread->Tcb.ThreadState = THREAD_STATE_SUSPENDED;
if (Thread == PsGetCurrentThread())
{
PsDispatchThread();
}
}
return(STATUS_SUCCESS);
}
NTSTATUS STDCALL NtContinue(IN PCONTEXT Context, IN CINT IrqLevel)
{
return(ZwContinue(Context,IrqLevel));
}
NTSTATUS STDCALL ZwContinue(IN PCONTEXT Context, IN CINT IrqLevel)
{
UNIMPLEMENTED;
}
NTSTATUS STDCALL NtYieldExecution(VOID)
{
return(ZwYieldExecution());
}
NTSTATUS STDCALL ZwYieldExecution(VOID)
{
PsDispatchThread();
return(STATUS_SUCCESS);
}

View file

@ -1,23 +1,21 @@
bits 32
section .text
global _InterlockedIncrement
_InterlockedIncrement
DECLARE_GLOBAL_SYMBOL InterlockedIncrement
mov eax,1
mov ebx,[esp+4]
xadd [ebx],eax
ret
global _InterlockedDecrement
_InterlockedDecrement:
DECLARE_GLOBAL_SYMBOL InterlockedDecrement
mov eax,0xffffffff
mov ebx,[esp+4]
xadd [ebx],eax
dec eax
ret
global _InterlockedExchange
_InterlockedExchange:
DECLARE_GLOBAL_SYMBOL InterlockedExchange
push ebp
mov ebp,esp
@ -35,15 +33,13 @@ _InterlockedExchange:
pop ebp
ret
global _InterlockedExchangeAdd
_InterlockedExchangeAdd:
DECLARE_GLOBAL_SYMBOL InterlockedExchangeAdd
mov eax,[esp+8]
mov ebx,[esp+4]
xadd [ebx],eax
ret
global _InterlockedCompareExchange
_InterlockedCompareExchange:
DECLARE_GLOBAL_SYMBOL InterlockedCompareExchange
mov eax,[esp+12]
mov edx,[esp+8]
mov ebx,[esp+4]

View file

@ -20,7 +20,7 @@
#define NDEBUG
#include <internal/debug.h>
#define Aa_Difference 'A'-'a';
#define Aa_Difference ('A'-'a')
PUNICODE_STRING RtlDuplicateUnicodeString(PUNICODE_STRING Dest,
PUNICODE_STRING Src)
@ -40,12 +40,19 @@ WCHAR wtoupper(WCHAR c)
{
if((c>='a') && (c<='z')) return c+Aa_Difference;
return c;
};
}
WCHAR wtolower(WCHAR c)
{
// DPRINT("c %c (c-Aa_Difference) %c\n",(char)c,(char)(c-Aa_Difference));
if((c>='A') && (c<='Z')) return c-Aa_Difference;
return c;
}
ULONG RtlAnsiStringToUnicodeSize(IN PANSI_STRING AnsiString)
{
return AnsiString->Length*2;
};
}
NTSTATUS RtlAnsiStringToUnicodeString(IN OUT PUNICODE_STRING DestinationString,
IN PANSI_STRING SourceString, IN BOOLEAN AllocateDestinationString)

View file

@ -17,6 +17,39 @@
/* FUNCTIONS *****************************************************************/
wchar_t * wcsncat(wchar_t * dest,const wchar_t * src,size_t count)
{
int i,j;
for (j=0;dest[j]!=0;j++);
for (i=0;i<count;i++)
{
dest[j+i] = src[i];
if (src[i] == 0)
{
return(dest);
}
}
dest[j+i]=0;
return(dest);
}
wchar_t * wcsncpy(wchar_t * dest,const wchar_t *src,size_t count)
{
int i;
for (i=0;i<count;i++)
{
dest[i] = src[i];
if (src[i] == 0)
{
return(dest);
}
}
dest[i]=0;
return(dest);
}
wchar_t* wcsrchr(const wchar_t* str, wchar_t ch)
{
unsigned int len = 0;

View file

@ -16,6 +16,133 @@
/* FUNCTIONS ***************************************************************/
NTSTATUS STDCALL NtQueryInformationToken(VOID)
{
}
NTSTATUS STDCALL NtQuerySecurityObject(VOID)
{
}
NTSTATUS STDCALL NtSetSecurityObject(VOID)
{
}
NTSTATUS STDCALL NtSetInformationToken(VOID)
{
}
NTSTATUS STDCALL NtPrivilegeCheck(VOID)
{
}
NTSTATUS STDCALL NtPrivilegedServiceAuditAlarm(VOID)
{
}
NTSTATUS STDCALL NtPrivilegeObjectAuditAlarm(VOID)
{
}
NTSTATUS STDCALL NtOpenObjectAuditAlarm(VOID)
{
}
NTSTATUS STDCALL NtOpenProcessToken(VOID)
{
}
NTSTATUS STDCALL NtOpenThreadToken(VOID)
{
}
NTSTATUS STDCALL NtDuplicateToken(VOID)
{
}
NTSTATUS STDCALL NtImpersonateClientOfPort(VOID)
{
}
NTSTATUS STDCALL NtImpersonateThread(VOID)
{
}
NTSTATUS STDCALL NtCreateToken(VOID)
{
}
NTSTATUS STDCALL NtDeleteObjectAuditAlarm(VOID)
{
}
NTSTATUS
STDCALL
NtAllocateLocallyUniqueId(
OUT PVOID LocallyUniqueId
)
{
}
NTSTATUS
STDCALL
ZwAllocateLocallyUniqueId(
OUT PVOID LocallyUniqueId
)
{
}
NTSTATUS STDCALL NtAccessCheckAndAuditAlarm(VOID)
{
}
NTSTATUS STDCALL NtAdjustGroupsToken(VOID)
{
}
NTSTATUS STDCALL NtAdjustPrivilegesToken(VOID)
{
}
NTSTATUS STDCALL NtAllocateUuids(VOID)
{
}
NTSTATUS STDCALL NtCloseObjectAuditAlarm(VOID)
{
}
NTSTATUS
STDCALL
NtAccessCheck(
IN PSECURITY_DESCRIPTOR SecurityDescriptor,
IN HANDLE ClientToken,
IN ULONG DesiredAcces,
IN PGENERIC_MAPPING GenericMapping,
OUT PRIVILEGE_SET PrivilegeSet,
OUT PULONG ReturnLength,
OUT PULONG GrantedAccess,
OUT PULONG AccessStatus
)
{
}
NTSTATUS
STDCALL
ZwAccessCheck(
IN PSECURITY_DESCRIPTOR SecurityDescriptor,
IN HANDLE ClientToken,
IN ULONG DesiredAcces,
IN PGENERIC_MAPPING GenericMapping,
OUT PRIVILEGE_SET PrivilegeSet,
OUT PULONG ReturnLength,
OUT PULONG GrantedAccess,
OUT PULONG AccessStatus
)
{
}
NTSTATUS RtlCreateSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
ULONG Revision)
{

View file

@ -26,12 +26,13 @@ static HANDLE KeyboardHandle = NULL;
static unsigned char TstReadLineReadChar(VOID)
{
KEY_EVENT_RECORD key[2];
IO_STATUS_BLOCK IoStatusBlock;
ZwReadFile(KeyboardHandle,
NULL,
NULL,
NULL,
NULL,
&IoStatusBlock,
&key[0],
sizeof(KEY_EVENT_RECORD)*2,
0,
@ -49,7 +50,6 @@ VOID TstReadLine(ULONG Length, PCHAR Buffer)
for (i=0;i<Length;i++)
{
tmp = TstReadLineReadChar();
DbgPrint("%c",tmp);
// DbgPrint("%x %x ",tmp,'\n');
switch (tmp)
{
@ -59,6 +59,7 @@ VOID TstReadLine(ULONG Length, PCHAR Buffer)
return;
default:
DbgPrint("%c",tmp);
*current = tmp;
current++;
}
@ -79,7 +80,12 @@ VOID TstReadLineInit(VOID)
RtlInitAnsiString(&afilename,"\\Device\\Keyboard");
RtlAnsiStringToUnicodeString(&ufilename,&afilename,TRUE);
InitializeObjectAttributes(&attr,&ufilename,0,NULL,NULL);
ZwOpenFile(&KeyboardHandle,0,&attr,NULL,0,0);
ZwOpenFile(&KeyboardHandle,
FILE_GENERIC_READ,
&attr,
NULL,
0,
FILE_SYNCHRONOUS_IO_NONALERT);
if (KeyboardHandle==NULL)
{
DbgPrint("Failed to open keyboard\n");

View file

@ -14,8 +14,9 @@
#include <ddk/ntddk.h>
#include <internal/kernel.h>
#include <internal/string.h>
#include <internal/ctype.h>
#define NDEBUG
//#define NDEBUG
#include <internal/debug.h>
int ShellChangeDir(char* args);
@ -27,6 +28,7 @@ VOID TstReadLine(ULONG Length, PCHAR Buffer);
static HANDLE CurrentDirHandle = NULL;
static UNICODE_STRING CurrentDirName = {NULL,0,0};
static char current_dir_name[255] = {0,};
typedef struct
{
@ -43,8 +45,38 @@ command commands[]=
/* FUNCTIONS ****************************************************************/
char* eat_white_space(char* s)
{
while (isspace(*s))
{
s++;
}
return(s);
}
int ShellChangeDir(char* args)
{
char* end;
ANSI_STRING astr;
OBJECT_ATTRIBUTES attr;
DPRINT("ShellChangeDir(args %s)\n",args);
args = eat_white_space(args);
end = strchr(args,' ');
if (end!=NULL)
{
*end=0;
}
strcat(current_dir_name,args);
DPRINT("current_dir_name %s\n",current_dir_name);
RtlInitAnsiString(&astr,current_dir_name);
RtlAnsiStringToUnicodeString(&CurrentDirName,&astr,TRUE);
InitializeObjectAttributes(&attr,&CurrentDirName,0,NULL,NULL);
ZwClose(CurrentDirHandle);
ZwOpenDirectoryObject(&CurrentDirHandle,0,&attr);
}
int ShellListDir(char* args)
@ -54,6 +86,8 @@ int ShellListDir(char* args)
ULONG Length;
ULONG i;
DbgPrint("ShellListDir(args %s)\n",args);
ZwQueryDirectoryObject(CurrentDirHandle,
&(DirObj[0]),
sizeof(DirObj),
@ -76,13 +110,18 @@ VOID ShellDisplayPrompt()
VOID ShellProcessCommand(char* cmd)
{
unsigned int i=0;
DbgPrint("Processing cmd '%s'\n",cmd);
while (commands[i].name!=NULL)
{
DbgPrint("Scanning %s i %d\n",commands[i].name,i);
if (strncmp(cmd,commands[i].name,strlen(commands[i].name))==0)
{
commands[i].fn(cmd+strlen(commands[i].name));
return;
}
i++;
}
DbgPrint("Unknown command\n");
}
NTSTATUS TstShell(VOID)
@ -96,6 +135,7 @@ NTSTATUS TstShell(VOID)
RtlInitAnsiString(&astr,"\\");
RtlAnsiStringToUnicodeString(&CurrentDirName,&astr,TRUE);
strcpy(current_dir_name,"\\");
RtlInitAnsiString(&afilename,"\\");
RtlAnsiStringToUnicodeString(&ufilename,&afilename,TRUE);

Some files were not shown because too many files have changed in this diff Show more