mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
Remove /nt directory, part two.
svn path=/trunk/; revision=12862
This commit is contained in:
parent
3ce0266401
commit
d6f646a37f
13 changed files with 0 additions and 2916 deletions
|
@ -1,244 +0,0 @@
|
||||||
/* Machine generated, don't edit */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#define EXTERN_C extern "C"
|
|
||||||
#else
|
|
||||||
#define EXTERN_C
|
|
||||||
#endif
|
|
||||||
|
|
||||||
EXTERN_C static __inline__ __attribute__((regparm(2)))void*ZwRosSystemServiceThunk(long n,void*a){void*ret;__asm__("int $0x2E":"=a"(ret):"a"(n),"d"(a));return ret;}
|
|
||||||
EXTERN_C void*__stdcall ZwAcceptConnectPort(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(0,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwAccessCheck(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;return ZwRosSystemServiceThunk(1,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwAccessCheckAndAuditAlarm(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8,void*a9,void*a10){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;(void)a9;(void)a10;return ZwRosSystemServiceThunk(2,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwAddAtom(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(3,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwAddBootEntry(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(4,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwAdjustGroupsToken(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(5,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwAdjustPrivilegesToken(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(6,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwAlertResumeThread(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(7,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwAlertThread(void*a0){return ZwRosSystemServiceThunk(8,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwAllocateLocallyUniqueId(void*a0){return ZwRosSystemServiceThunk(9,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwAllocateUuids(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(10,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwAllocateVirtualMemory(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(11,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwAssignProcessToJobObject(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(12,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCallbackReturn(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(13,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCancelIoFile(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(14,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCancelTimer(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(15,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwClearEvent(void*a0){return ZwRosSystemServiceThunk(16,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwClose(void*a0){return ZwRosSystemServiceThunk(17,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCloseObjectAuditAlarm(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(18,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCompleteConnectPort(void*a0){return ZwRosSystemServiceThunk(19,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwConnectPort(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;return ZwRosSystemServiceThunk(20,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwContinue(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(21,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateDirectoryObject(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(22,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateEvent(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(23,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateEventPair(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(24,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateFile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8,void*a9,void*a10){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;(void)a9;(void)a10;return ZwRosSystemServiceThunk(25,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateIoCompletion(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(26,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateJobObject(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(27,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateKey(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;return ZwRosSystemServiceThunk(28,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateMailslotFile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;return ZwRosSystemServiceThunk(29,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateMutant(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(30,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateNamedPipeFile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8,void*a9,void*a10,void*a11,void*a12,void*a13){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;(void)a9;(void)a10;(void)a11;(void)a12;(void)a13;return ZwRosSystemServiceThunk(31,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreatePagingFile(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(32,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreatePort(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(33,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateProcess(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;return ZwRosSystemServiceThunk(34,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateProfile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;return ZwRosSystemServiceThunk(35,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateSection(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;return ZwRosSystemServiceThunk(36,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateSemaphore(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(37,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateSymbolicLinkObject(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(38,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateThread(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;return ZwRosSystemServiceThunk(39,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateTimer(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(40,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateToken(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8,void*a9,void*a10,void*a11,void*a12){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;(void)a9;(void)a10;(void)a11;(void)a12;return ZwRosSystemServiceThunk(41,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwCreateWaitablePort(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(42,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwDelayExecution(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(43,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwDeleteAtom(void*a0){return ZwRosSystemServiceThunk(44,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwDeleteBootEntry(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(45,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwDeleteFile(void*a0){return ZwRosSystemServiceThunk(46,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwDeleteKey(void*a0){return ZwRosSystemServiceThunk(47,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwDeleteObjectAuditAlarm(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(48,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwDeleteValueKey(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(49,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwDeviceIoControlFile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8,void*a9){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;(void)a9;return ZwRosSystemServiceThunk(50,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwDisplayString(void*a0){return ZwRosSystemServiceThunk(51,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwDuplicateObject(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;return ZwRosSystemServiceThunk(52,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwDuplicateToken(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(53,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwEnumerateBootEntries(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(54,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwEnumerateKey(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(55,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwEnumerateValueKey(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(56,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwExtendSection(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(57,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwFindAtom(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(58,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwFlushBuffersFile(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(59,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwFlushInstructionCache(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(60,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwFlushKey(void*a0){return ZwRosSystemServiceThunk(61,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwFlushVirtualMemory(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(62,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwFlushWriteBuffer(void){return ZwRosSystemServiceThunk(63,0);}
|
|
||||||
EXTERN_C void*__stdcall ZwFreeVirtualMemory(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(64,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwFsControlFile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8,void*a9){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;(void)a9;return ZwRosSystemServiceThunk(65,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwGetContextThread(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(66,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwGetPlugPlayEvent(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(67,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwGetTickCount(void){return ZwRosSystemServiceThunk(68,0);}
|
|
||||||
EXTERN_C void*__stdcall ZwImpersonateClientOfPort(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(69,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwImpersonateThread(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(70,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwInitializeRegistry(void*a0){return ZwRosSystemServiceThunk(71,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwInitiatePowerAction(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(72,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwIsProcessInJob(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(73,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwListenPort(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(74,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwLoadDriver(void*a0){return ZwRosSystemServiceThunk(75,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwLoadKey(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(76,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwLoadKey2(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(77,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwLockFile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8,void*a9){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;(void)a9;return ZwRosSystemServiceThunk(78,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwLockVirtualMemory(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(79,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwMakePermanentObject(void*a0){return ZwRosSystemServiceThunk(80,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwMakeTemporaryObject(void*a0){return ZwRosSystemServiceThunk(81,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwMapViewOfSection(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8,void*a9){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;(void)a9;return ZwRosSystemServiceThunk(82,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwNotifyChangeDirectoryFile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;return ZwRosSystemServiceThunk(83,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwNotifyChangeKey(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8,void*a9){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;(void)a9;return ZwRosSystemServiceThunk(84,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenDirectoryObject(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(85,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenEvent(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(86,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenEventPair(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(87,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenFile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(88,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenIoCompletion(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(89,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenJobObject(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(90,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenKey(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(91,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenMutant(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(92,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenObjectAuditAlarm(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8,void*a9,void*a10,void*a11){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;(void)a9;(void)a10;(void)a11;return ZwRosSystemServiceThunk(93,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenProcess(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(94,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenProcessToken(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(95,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenProcessTokenEx(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(96,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenSection(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(97,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenSemaphore(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(98,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenSymbolicLinkObject(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(99,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenThread(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(100,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenThreadToken(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(101,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenThreadTokenEx(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(102,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwOpenTimer(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(103,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwPlugPlayControl(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(104,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwPowerInformation(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(105,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwPrivilegeCheck(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(106,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwPrivilegedServiceAuditAlarm(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(107,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwPrivilegeObjectAuditAlarm(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(108,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwProtectVirtualMemory(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(109,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwPulseEvent(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(110,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryInformationAtom(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(111,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryAttributesFile(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(112,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryBootEntryOrder(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(113,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryBootOptions(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(114,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryDefaultLocale(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(115,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryDefaultUILanguage(void*a0){return ZwRosSystemServiceThunk(116,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryDirectoryFile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8,void*a9,void*a10){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;(void)a9;(void)a10;return ZwRosSystemServiceThunk(117,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryDirectoryObject(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;return ZwRosSystemServiceThunk(118,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryEaFile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;return ZwRosSystemServiceThunk(119,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryEvent(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(120,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryFullAttributesFile(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(121,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryInformationFile(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(122,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryInformationJobObject(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(123,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryInformationPort(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(124,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryInformationProcess(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(125,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryInformationThread(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(126,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryInformationToken(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(127,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryInstallUILanguage(void*a0){return ZwRosSystemServiceThunk(128,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryIntervalProfile(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(129,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryIoCompletion(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(130,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryKey(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(131,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryMultipleValueKey(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(132,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryMutant(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(133,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryObject(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(134,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryOleDirectoryFile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8,void*a9,void*a10){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;(void)a9;(void)a10;return ZwRosSystemServiceThunk(135,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryPerformanceCounter(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(136,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryQuotaInformationFile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;return ZwRosSystemServiceThunk(137,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQuerySection(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(138,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQuerySecurityObject(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(139,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQuerySemaphore(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(140,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQuerySymbolicLinkObject(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(141,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQuerySystemEnvironmentValue(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(142,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQuerySystemInformation(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(143,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQuerySystemTime(void*a0){return ZwRosSystemServiceThunk(144,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryTimer(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(145,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryTimerResolution(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(146,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryValueKey(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(147,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryVirtualMemory(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(148,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueryVolumeInformationFile(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(149,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwQueueApcThread(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(150,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwRaiseException(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(151,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwRaiseHardError(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(152,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwReadFile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;return ZwRosSystemServiceThunk(153,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwReadFileScatter(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;return ZwRosSystemServiceThunk(154,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwReadRequestData(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(155,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwReadVirtualMemory(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(156,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwRegisterThreadTerminatePort(void*a0){return ZwRosSystemServiceThunk(157,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwReleaseMutant(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(158,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwReleaseSemaphore(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(159,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwRemoveIoCompletion(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(160,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwReplaceKey(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(161,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwReplyPort(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(162,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwReplyWaitReceivePort(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(163,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwReplyWaitReplyPort(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(164,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwRequestPort(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(165,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwRequestWaitReplyPort(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(166,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwResetEvent(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(167,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwRestoreKey(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(168,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwResumeThread(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(169,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSaveKey(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(170,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSaveKeyEx(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(171,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetBootEntryOrder(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(172,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetBootOptions(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(173,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetIoCompletion(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(174,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetContextThread(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(175,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetDefaultHardErrorPort(void*a0){return ZwRosSystemServiceThunk(176,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetDefaultLocale(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(177,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetDefaultUILanguage(void*a0){return ZwRosSystemServiceThunk(178,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetEaFile(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(179,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetEvent(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(180,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetHighEventPair(void*a0){return ZwRosSystemServiceThunk(181,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetHighWaitLowEventPair(void*a0){return ZwRosSystemServiceThunk(182,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetHighWaitLowThread(void){return ZwRosSystemServiceThunk(183,0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetInformationFile(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(184,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetInformationKey(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(185,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetInformationJobObject(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(186,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetInformationObject(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(187,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetInformationProcess(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(188,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetInformationThread(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(189,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetInformationToken(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(190,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetIntervalProfile(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(191,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetLdtEntries(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(192,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetLowEventPair(void*a0){return ZwRosSystemServiceThunk(193,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetLowWaitHighEventPair(void*a0){return ZwRosSystemServiceThunk(194,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetLowWaitHighThread(void){return ZwRosSystemServiceThunk(195,0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetQuotaInformationFile(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(196,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetSecurityObject(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(197,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetSystemEnvironmentValue(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(198,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetSystemInformation(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(199,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetSystemPowerState(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(200,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetSystemTime(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(201,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetTimer(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;return ZwRosSystemServiceThunk(202,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetTimerResolution(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(203,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetUuidSeed(void*a0){return ZwRosSystemServiceThunk(204,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetValueKey(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(205,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSetVolumeInformationFile(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(206,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwShutdownSystem(void*a0){return ZwRosSystemServiceThunk(207,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSignalAndWaitForSingleObject(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(208,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwStartProfile(void*a0){return ZwRosSystemServiceThunk(209,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwStopProfile(void*a0){return ZwRosSystemServiceThunk(210,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSuspendThread(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(211,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwSystemDebugControl(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(212,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwTerminateJobObject(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(213,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwTerminateProcess(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(214,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwTerminateThread(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(215,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwTestAlert(void){return ZwRosSystemServiceThunk(216,0);}
|
|
||||||
EXTERN_C void*__stdcall ZwTraceEvent(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(217,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwTranslateFilePath(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(218,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwUnloadDriver(void*a0){return ZwRosSystemServiceThunk(219,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwUnloadKey(void*a0){return ZwRosSystemServiceThunk(220,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwUnlockFile(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(221,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwUnlockVirtualMemory(void*a0,void*a1,void*a2,void*a3){(void)a1;(void)a2;(void)a3;return ZwRosSystemServiceThunk(222,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwUnmapViewOfSection(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(223,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwVdmControl(void*a0,void*a1){(void)a1;return ZwRosSystemServiceThunk(224,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwWaitForMultipleObjects(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(225,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwWaitForSingleObject(void*a0,void*a1,void*a2){(void)a1;(void)a2;return ZwRosSystemServiceThunk(226,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwWaitHighEventPair(void*a0){return ZwRosSystemServiceThunk(227,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwWaitLowEventPair(void*a0){return ZwRosSystemServiceThunk(228,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwWriteFile(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;return ZwRosSystemServiceThunk(229,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwWriteFileGather(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5,void*a6,void*a7,void*a8){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;(void)a6;(void)a7;(void)a8;return ZwRosSystemServiceThunk(230,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwWriteRequestData(void*a0,void*a1,void*a2,void*a3,void*a4,void*a5){(void)a1;(void)a2;(void)a3;(void)a4;(void)a5;return ZwRosSystemServiceThunk(231,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwWriteVirtualMemory(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(232,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwW32Call(void*a0,void*a1,void*a2,void*a3,void*a4){(void)a1;(void)a2;(void)a3;(void)a4;return ZwRosSystemServiceThunk(233,&a0);}
|
|
||||||
EXTERN_C void*__stdcall ZwYieldExecution(void){return ZwRosSystemServiceThunk(234,0);}
|
|
|
@ -1,72 +0,0 @@
|
||||||
/*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: ntoskrnl/nt/channel.c
|
|
||||||
* PURPOSE: Channels (??)
|
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
* Created 22/05/98
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NOTES:
|
|
||||||
*
|
|
||||||
* An article on System Internals (http://www.sysinternals.com) reports
|
|
||||||
* that these functions are unimplemented on nt version 3-5.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#include <internal/debug.h>
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtCreateChannel(VOID)
|
|
||||||
{
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtListenChannel(VOID)
|
|
||||||
{
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtOpenChannel(VOID)
|
|
||||||
{
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtReplyWaitSendChannel(VOID)
|
|
||||||
{
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtSendWaitReplyChannel(VOID)
|
|
||||||
{
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtSetContextChannel(VOID)
|
|
||||||
{
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,128 +0,0 @@
|
||||||
/*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: ntoskrnl/nt/efi.c
|
|
||||||
* PURPOSE: EFI Unimplemented Function Calls
|
|
||||||
* PROGRAMMER: Alex Ionescu (alex@relsoft.net)
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
* Created 16/07/04
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#include <internal/debug.h>
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtAddBootEntry(
|
|
||||||
IN PUNICODE_STRING EntryName,
|
|
||||||
IN PUNICODE_STRING EntryValue
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtDeleteBootEntry(
|
|
||||||
IN PUNICODE_STRING EntryName,
|
|
||||||
IN PUNICODE_STRING EntryValue
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtEnumerateBootEntries(
|
|
||||||
IN ULONG Unknown1,
|
|
||||||
IN ULONG Unknown2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtQueryBootEntryOrder(
|
|
||||||
IN ULONG Unknown1,
|
|
||||||
IN ULONG Unknown2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtQueryBootOptions(
|
|
||||||
IN ULONG Unknown1,
|
|
||||||
IN ULONG Unknown2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtSetBootEntryOrder(
|
|
||||||
IN ULONG Unknown1,
|
|
||||||
IN ULONG Unknown2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtSetBootOptions(
|
|
||||||
ULONG Unknown1,
|
|
||||||
ULONG Unknown2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtTranslateFilePath(
|
|
||||||
ULONG Unknown1,
|
|
||||||
ULONG Unknown2,
|
|
||||||
ULONG Unknown3
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,496 +0,0 @@
|
||||||
/* $Id$
|
|
||||||
*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: ntoskrnl/nt/evtpair.c
|
|
||||||
* PURPOSE: Support for event pairs
|
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
* Created 22/05/98
|
|
||||||
* Updated 09/08/2003 by Skywing (skywing@valhallalegends.com)
|
|
||||||
* to correctly maintain ownership of the dispatcher lock
|
|
||||||
* between KeSetEvent and KeWaitForSingleObject calls.
|
|
||||||
* Additionally, implemented the thread-eventpair routines.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#define NDEBUG
|
|
||||||
#include <internal/debug.h>
|
|
||||||
|
|
||||||
#ifndef NTSYSAPI
|
|
||||||
#define NTSYSAPI
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NTAPI
|
|
||||||
#define NTAPI STDCALL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* GLOBALS *******************************************************************/
|
|
||||||
|
|
||||||
POBJECT_TYPE EXPORTED ExEventPairObjectType = NULL;
|
|
||||||
|
|
||||||
static GENERIC_MAPPING ExEventPairMapping = {
|
|
||||||
STANDARD_RIGHTS_READ,
|
|
||||||
STANDARD_RIGHTS_WRITE,
|
|
||||||
STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE,
|
|
||||||
EVENT_PAIR_ALL_ACCESS};
|
|
||||||
|
|
||||||
static KSPIN_LOCK ExThreadEventPairSpinLock;
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtpCreateEventPair(PVOID ObjectBody,
|
|
||||||
PVOID Parent,
|
|
||||||
PWSTR RemainingPath,
|
|
||||||
POBJECT_ATTRIBUTES ObjectAttributes)
|
|
||||||
{
|
|
||||||
DPRINT("NtpCreateEventPair(ObjectBody %x, Parent %x, RemainingPath %S)\n",
|
|
||||||
ObjectBody, Parent, RemainingPath);
|
|
||||||
|
|
||||||
if (RemainingPath != NULL && wcschr(RemainingPath+1, '\\') != NULL)
|
|
||||||
{
|
|
||||||
return(STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID INIT_FUNCTION
|
|
||||||
NtInitializeEventPairImplementation(VOID)
|
|
||||||
{
|
|
||||||
ExEventPairObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
|
||||||
|
|
||||||
RtlCreateUnicodeString(&ExEventPairObjectType->TypeName, L"EventPair");
|
|
||||||
ExEventPairObjectType->Tag = TAG('E', 'v', 'P', 'a');
|
|
||||||
ExEventPairObjectType->PeakObjects = 0;
|
|
||||||
ExEventPairObjectType->PeakHandles = 0;
|
|
||||||
ExEventPairObjectType->TotalObjects = 0;
|
|
||||||
ExEventPairObjectType->TotalHandles = 0;
|
|
||||||
ExEventPairObjectType->PagedPoolCharge = 0;
|
|
||||||
ExEventPairObjectType->NonpagedPoolCharge = sizeof(KEVENT_PAIR);
|
|
||||||
ExEventPairObjectType->Mapping = &ExEventPairMapping;
|
|
||||||
ExEventPairObjectType->Dump = NULL;
|
|
||||||
ExEventPairObjectType->Open = NULL;
|
|
||||||
ExEventPairObjectType->Close = NULL;
|
|
||||||
ExEventPairObjectType->Delete = NULL;
|
|
||||||
ExEventPairObjectType->Parse = NULL;
|
|
||||||
ExEventPairObjectType->Security = NULL;
|
|
||||||
ExEventPairObjectType->QueryName = NULL;
|
|
||||||
ExEventPairObjectType->OkayToClose = NULL;
|
|
||||||
ExEventPairObjectType->Create = NtpCreateEventPair;
|
|
||||||
ExEventPairObjectType->DuplicationNotify = NULL;
|
|
||||||
|
|
||||||
KeInitializeSpinLock(&ExThreadEventPairSpinLock);
|
|
||||||
ObpCreateTypeObject(ExEventPairObjectType);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtCreateEventPair(OUT PHANDLE EventPairHandle,
|
|
||||||
IN ACCESS_MASK DesiredAccess,
|
|
||||||
IN POBJECT_ATTRIBUTES ObjectAttributes)
|
|
||||||
{
|
|
||||||
PKEVENT_PAIR EventPair;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
DPRINT("NtCreateEventPair()\n");
|
|
||||||
Status = ObCreateObject(ExGetPreviousMode(),
|
|
||||||
ExEventPairObjectType,
|
|
||||||
ObjectAttributes,
|
|
||||||
ExGetPreviousMode(),
|
|
||||||
NULL,
|
|
||||||
sizeof(KEVENT_PAIR),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
(PVOID*)&EventPair);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
KeInitializeEvent(&EventPair->LowEvent,
|
|
||||||
SynchronizationEvent,
|
|
||||||
FALSE);
|
|
||||||
KeInitializeEvent(&EventPair->HighEvent,
|
|
||||||
SynchronizationEvent,
|
|
||||||
FALSE);
|
|
||||||
|
|
||||||
Status = ObInsertObject ((PVOID)EventPair,
|
|
||||||
NULL,
|
|
||||||
DesiredAccess,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
EventPairHandle);
|
|
||||||
|
|
||||||
ObDereferenceObject(EventPair);
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtOpenEventPair(OUT PHANDLE EventPairHandle,
|
|
||||||
IN ACCESS_MASK DesiredAccess,
|
|
||||||
IN POBJECT_ATTRIBUTES ObjectAttributes)
|
|
||||||
{
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
DPRINT("NtOpenEventPair()\n");
|
|
||||||
|
|
||||||
Status = ObOpenObjectByName(ObjectAttributes,
|
|
||||||
ExEventPairObjectType,
|
|
||||||
NULL,
|
|
||||||
UserMode,
|
|
||||||
DesiredAccess,
|
|
||||||
NULL,
|
|
||||||
EventPairHandle);
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtSetHighEventPair(IN HANDLE EventPairHandle)
|
|
||||||
{
|
|
||||||
PKEVENT_PAIR EventPair;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
DPRINT("NtSetHighEventPair(EventPairHandle %x)\n",
|
|
||||||
EventPairHandle);
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(EventPairHandle,
|
|
||||||
EVENT_PAIR_ALL_ACCESS,
|
|
||||||
ExEventPairObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&EventPair,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
return(Status);
|
|
||||||
|
|
||||||
KeSetEvent(&EventPair->HighEvent,
|
|
||||||
EVENT_INCREMENT,
|
|
||||||
FALSE);
|
|
||||||
|
|
||||||
ObDereferenceObject(EventPair);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle)
|
|
||||||
{
|
|
||||||
PKEVENT_PAIR EventPair;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
DPRINT("NtSetHighWaitLowEventPair(EventPairHandle %x)\n",
|
|
||||||
EventPairHandle);
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(EventPairHandle,
|
|
||||||
EVENT_PAIR_ALL_ACCESS,
|
|
||||||
ExEventPairObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&EventPair,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
return(Status);
|
|
||||||
|
|
||||||
KeSetEvent(&EventPair->HighEvent,
|
|
||||||
EVENT_INCREMENT,
|
|
||||||
TRUE);
|
|
||||||
|
|
||||||
KeWaitForSingleObject(&EventPair->LowEvent,
|
|
||||||
WrEventPair,
|
|
||||||
UserMode,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
ObDereferenceObject(EventPair);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtSetLowEventPair(IN HANDLE EventPairHandle)
|
|
||||||
{
|
|
||||||
PKEVENT_PAIR EventPair;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
DPRINT("NtSetLowEventPair(EventPairHandle %x)\n",
|
|
||||||
EventPairHandle);
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(EventPairHandle,
|
|
||||||
EVENT_PAIR_ALL_ACCESS,
|
|
||||||
ExEventPairObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&EventPair,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
return(Status);
|
|
||||||
|
|
||||||
KeSetEvent(&EventPair->LowEvent,
|
|
||||||
EVENT_INCREMENT,
|
|
||||||
FALSE);
|
|
||||||
|
|
||||||
ObDereferenceObject(EventPair);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle)
|
|
||||||
{
|
|
||||||
PKEVENT_PAIR EventPair;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
DPRINT("NtSetLowWaitHighEventPair(EventPairHandle %x)\n",
|
|
||||||
EventPairHandle);
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(EventPairHandle,
|
|
||||||
EVENT_PAIR_ALL_ACCESS,
|
|
||||||
ExEventPairObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&EventPair,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
return(Status);
|
|
||||||
|
|
||||||
KeSetEvent(&EventPair->LowEvent,
|
|
||||||
EVENT_INCREMENT,
|
|
||||||
TRUE);
|
|
||||||
|
|
||||||
KeWaitForSingleObject(&EventPair->HighEvent,
|
|
||||||
WrEventPair,
|
|
||||||
UserMode,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
ObDereferenceObject(EventPair);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtWaitLowEventPair(IN HANDLE EventPairHandle)
|
|
||||||
{
|
|
||||||
PKEVENT_PAIR EventPair;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
DPRINT("NtWaitLowEventPair(EventPairHandle %x)\n",
|
|
||||||
EventPairHandle);
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(EventPairHandle,
|
|
||||||
EVENT_PAIR_ALL_ACCESS,
|
|
||||||
ExEventPairObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&EventPair,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
return(Status);
|
|
||||||
|
|
||||||
KeWaitForSingleObject(&EventPair->LowEvent,
|
|
||||||
WrEventPair,
|
|
||||||
UserMode,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
ObDereferenceObject(EventPair);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtWaitHighEventPair(IN HANDLE EventPairHandle)
|
|
||||||
{
|
|
||||||
PKEVENT_PAIR EventPair;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
DPRINT("NtWaitHighEventPair(EventPairHandle %x)\n",
|
|
||||||
EventPairHandle);
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(EventPairHandle,
|
|
||||||
EVENT_PAIR_ALL_ACCESS,
|
|
||||||
ExEventPairObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&EventPair,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
return(Status);
|
|
||||||
|
|
||||||
KeWaitForSingleObject(&EventPair->HighEvent,
|
|
||||||
WrEventPair,
|
|
||||||
UserMode,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
ObDereferenceObject(EventPair);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _ENABLE_THRDEVTPAIR
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Author: Skywing (skywing@valhallalegends.com), 09/08/2003
|
|
||||||
* Note that the eventpair spinlock must be acquired when setting the thread
|
|
||||||
* eventpair via NtSetInformationThread.
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
NTSYSAPI
|
|
||||||
NTAPI
|
|
||||||
NtSetLowWaitHighThread(
|
|
||||||
VOID
|
|
||||||
)
|
|
||||||
{
|
|
||||||
PETHREAD Thread;
|
|
||||||
PKEVENT_PAIR EventPair;
|
|
||||||
NTSTATUS Status;
|
|
||||||
KIRQL Irql;
|
|
||||||
|
|
||||||
Thread = PsGetCurrentThread();
|
|
||||||
|
|
||||||
if(!Thread->EventPair)
|
|
||||||
return STATUS_NO_EVENT_PAIR;
|
|
||||||
|
|
||||||
KeAcquireSpinLock(&ExThreadEventPairSpinLock, &Irql);
|
|
||||||
|
|
||||||
EventPair = Thread->EventPair;
|
|
||||||
|
|
||||||
if(EventPair)
|
|
||||||
ObReferenceObjectByPointer(EventPair,
|
|
||||||
EVENT_PAIR_ALL_ACCESS,
|
|
||||||
ExEventPairObjectType,
|
|
||||||
UserMode);
|
|
||||||
|
|
||||||
KeReleaseSpinLock(&ExThreadEventPairSpinLock, Irql);
|
|
||||||
|
|
||||||
if(EventPair == NULL)
|
|
||||||
return STATUS_NO_EVENT_PAIR;
|
|
||||||
|
|
||||||
KeSetEvent(&EventPair->LowEvent,
|
|
||||||
EVENT_INCREMENT,
|
|
||||||
TRUE);
|
|
||||||
|
|
||||||
Status = KeWaitForSingleObject(&EventPair->HighEvent,
|
|
||||||
WrEventPair,
|
|
||||||
UserMode,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
ObDereferenceObject(EventPair);
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Author: Skywing (skywing@valhallalegends.com), 09/08/2003
|
|
||||||
* Note that the eventpair spinlock must be acquired when setting the thread
|
|
||||||
* eventpair via NtSetInformationThread.
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
NTSYSAPI
|
|
||||||
NTAPI
|
|
||||||
NtSetHighWaitLowThread(
|
|
||||||
VOID
|
|
||||||
)
|
|
||||||
{
|
|
||||||
PETHREAD Thread;
|
|
||||||
PKEVENT_PAIR EventPair;
|
|
||||||
NTSTATUS Status;
|
|
||||||
KIRQL Irql;
|
|
||||||
|
|
||||||
Thread = PsGetCurrentThread();
|
|
||||||
|
|
||||||
if(!Thread->EventPair)
|
|
||||||
return STATUS_NO_EVENT_PAIR;
|
|
||||||
|
|
||||||
KeAcquireSpinLock(&ExThreadEventPairSpinLock, &Irql);
|
|
||||||
|
|
||||||
EventPair = PsGetCurrentThread()->EventPair;
|
|
||||||
|
|
||||||
if(EventPair)
|
|
||||||
ObReferenceObjectByPointer(EventPair,
|
|
||||||
EVENT_PAIR_ALL_ACCESS,
|
|
||||||
ExEventPairObjectType,
|
|
||||||
UserMode);
|
|
||||||
|
|
||||||
KeReleaseSpinLock(&ExThreadEventPairSpinLock, Irql);
|
|
||||||
|
|
||||||
if(EventPair == NULL)
|
|
||||||
return STATUS_NO_EVENT_PAIR;
|
|
||||||
|
|
||||||
KeSetEvent(&EventPair->HighEvent,
|
|
||||||
EVENT_INCREMENT,
|
|
||||||
TRUE);
|
|
||||||
|
|
||||||
Status = KeWaitForSingleObject(&EventPair->LowEvent,
|
|
||||||
WrEventPair,
|
|
||||||
UserMode,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
ObDereferenceObject(EventPair);
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Author: Skywing (skywing@valhallalegends.com), 09/08/2003
|
|
||||||
* Note that the eventpair spinlock must be acquired when waiting on the
|
|
||||||
* eventpair via NtSetLow/HighWaitHigh/LowThread. Additionally, when
|
|
||||||
* deleting a thread object, NtpSwapThreadEventPair(Thread, NULL) should
|
|
||||||
* be called to release any preexisting eventpair object associated with
|
|
||||||
* the thread. The Microsoft name for this function is not known.
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
ExpSwapThreadEventPair(
|
|
||||||
IN PETHREAD Thread,
|
|
||||||
IN PKEVENT_PAIR EventPair
|
|
||||||
)
|
|
||||||
{
|
|
||||||
PKEVENT_PAIR OriginalEventPair;
|
|
||||||
KIRQL Irql;
|
|
||||||
|
|
||||||
KeAcquireSpinLock(&ExThreadEventPairSpinLock, &Irql);
|
|
||||||
|
|
||||||
OriginalEventPair = Thread->EventPair;
|
|
||||||
Thread->EventPair = EventPair;
|
|
||||||
|
|
||||||
if(OriginalEventPair)
|
|
||||||
ObDereferenceObject(OriginalEventPair);
|
|
||||||
|
|
||||||
KeReleaseSpinLock(&ExThreadEventPairSpinLock, Irql);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* !_ENABLE_THRDEVTPAIR */
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTSYSAPI
|
|
||||||
NTAPI
|
|
||||||
NtSetLowWaitHighThread(
|
|
||||||
VOID
|
|
||||||
)
|
|
||||||
{
|
|
||||||
DPRINT1("NtSetLowWaitHighThread() not supported anymore (NT4 only)!\n");
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTSYSAPI
|
|
||||||
NTAPI
|
|
||||||
NtSetHighWaitLowThread(
|
|
||||||
VOID
|
|
||||||
)
|
|
||||||
{
|
|
||||||
DPRINT1("NtSetHighWaitLowThread() not supported anymore (NT4 only)!\n");
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _ENABLE_THRDEVTPAIR */
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,33 +0,0 @@
|
||||||
/*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: ntoskrnl/nt/misc.c
|
|
||||||
* PURPOSE: Misc undocumented system calls
|
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
* Created 22/05/98
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#include <internal/debug.h>
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtDisplayString(IN PUNICODE_STRING DisplayString)
|
|
||||||
{
|
|
||||||
ANSI_STRING AnsiString;
|
|
||||||
|
|
||||||
RtlUnicodeStringToAnsiString (&AnsiString, DisplayString, TRUE);
|
|
||||||
|
|
||||||
HalDisplayString (AnsiString.Buffer);
|
|
||||||
|
|
||||||
RtlFreeAnsiString (&AnsiString);
|
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,249 +0,0 @@
|
||||||
/*
|
|
||||||
* ReactOS kernel
|
|
||||||
* Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: ntoskrnl/nt/mutant.c
|
|
||||||
* PURPOSE: Synchronization primitives
|
|
||||||
* PROGRAMMER: David Welch (welch@cwcom.net)
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
* Created 22/05/98
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#define NDEBUG
|
|
||||||
#include <internal/debug.h>
|
|
||||||
|
|
||||||
POBJECT_TYPE ExMutantObjectType = NULL;
|
|
||||||
|
|
||||||
static GENERIC_MAPPING ExpMutantMapping = {
|
|
||||||
STANDARD_RIGHTS_READ | SYNCHRONIZE | MUTANT_QUERY_STATE,
|
|
||||||
STANDARD_RIGHTS_WRITE | SYNCHRONIZE,
|
|
||||||
STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE | MUTANT_QUERY_STATE,
|
|
||||||
MUTANT_ALL_ACCESS};
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtpCreateMutant(PVOID ObjectBody,
|
|
||||||
PVOID Parent,
|
|
||||||
PWSTR RemainingPath,
|
|
||||||
POBJECT_ATTRIBUTES ObjectAttributes)
|
|
||||||
{
|
|
||||||
DPRINT("NtpCreateMutant(ObjectBody %x, Parent %x, RemainingPath %S)\n",
|
|
||||||
ObjectBody, Parent, RemainingPath);
|
|
||||||
|
|
||||||
if (RemainingPath != NULL && wcschr(RemainingPath+1, '\\') != NULL)
|
|
||||||
{
|
|
||||||
return(STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VOID STDCALL
|
|
||||||
NtpDeleteMutant(PVOID ObjectBody)
|
|
||||||
{
|
|
||||||
DPRINT("NtpDeleteMutant(ObjectBody %x)\n", ObjectBody);
|
|
||||||
|
|
||||||
KeReleaseMutant((PKMUTANT)ObjectBody,
|
|
||||||
MUTANT_INCREMENT,
|
|
||||||
TRUE,
|
|
||||||
FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VOID INIT_FUNCTION
|
|
||||||
NtInitializeMutantImplementation(VOID)
|
|
||||||
{
|
|
||||||
ExMutantObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
|
||||||
|
|
||||||
RtlCreateUnicodeString(&ExMutantObjectType->TypeName, L"Mutant");
|
|
||||||
|
|
||||||
ExMutantObjectType->Tag = TAG('M', 'T', 'N', 'T');
|
|
||||||
ExMutantObjectType->PeakObjects = 0;
|
|
||||||
ExMutantObjectType->PeakHandles = 0;
|
|
||||||
ExMutantObjectType->TotalObjects = 0;
|
|
||||||
ExMutantObjectType->TotalHandles = 0;
|
|
||||||
ExMutantObjectType->PagedPoolCharge = 0;
|
|
||||||
ExMutantObjectType->NonpagedPoolCharge = sizeof(KMUTANT);
|
|
||||||
ExMutantObjectType->Mapping = &ExpMutantMapping;
|
|
||||||
ExMutantObjectType->Dump = NULL;
|
|
||||||
ExMutantObjectType->Open = NULL;
|
|
||||||
ExMutantObjectType->Close = NULL;
|
|
||||||
ExMutantObjectType->Delete = NtpDeleteMutant;
|
|
||||||
ExMutantObjectType->Parse = NULL;
|
|
||||||
ExMutantObjectType->Security = NULL;
|
|
||||||
ExMutantObjectType->QueryName = NULL;
|
|
||||||
ExMutantObjectType->OkayToClose = NULL;
|
|
||||||
ExMutantObjectType->Create = NtpCreateMutant;
|
|
||||||
ExMutantObjectType->DuplicationNotify = NULL;
|
|
||||||
|
|
||||||
ObpCreateTypeObject(ExMutantObjectType);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtCreateMutant(OUT PHANDLE MutantHandle,
|
|
||||||
IN ACCESS_MASK DesiredAccess,
|
|
||||||
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
|
||||||
IN BOOLEAN InitialOwner)
|
|
||||||
{
|
|
||||||
PKMUTEX Mutant;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
Status = ObCreateObject(ExGetPreviousMode(),
|
|
||||||
ExMutantObjectType,
|
|
||||||
ObjectAttributes,
|
|
||||||
ExGetPreviousMode(),
|
|
||||||
NULL,
|
|
||||||
sizeof(KMUTANT),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
(PVOID*)&Mutant);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
KeInitializeMutant(Mutant,
|
|
||||||
InitialOwner);
|
|
||||||
|
|
||||||
Status = ObInsertObject ((PVOID)Mutant,
|
|
||||||
NULL,
|
|
||||||
DesiredAccess,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
MutantHandle);
|
|
||||||
|
|
||||||
ObDereferenceObject(Mutant);
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtOpenMutant(OUT PHANDLE MutantHandle,
|
|
||||||
IN ACCESS_MASK DesiredAccess,
|
|
||||||
IN POBJECT_ATTRIBUTES ObjectAttributes)
|
|
||||||
{
|
|
||||||
return(ObOpenObjectByName(ObjectAttributes,
|
|
||||||
ExMutantObjectType,
|
|
||||||
NULL,
|
|
||||||
ExGetPreviousMode(),
|
|
||||||
DesiredAccess,
|
|
||||||
NULL,
|
|
||||||
MutantHandle));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtQueryMutant(IN HANDLE MutantHandle,
|
|
||||||
IN MUTANT_INFORMATION_CLASS MutantInformationClass,
|
|
||||||
OUT PVOID MutantInformation,
|
|
||||||
IN ULONG MutantInformationLength,
|
|
||||||
OUT PULONG ResultLength OPTIONAL)
|
|
||||||
{
|
|
||||||
MUTANT_BASIC_INFORMATION SafeMutantInformation;
|
|
||||||
PKMUTANT Mutant;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
if (MutantInformationClass > MutantBasicInformation)
|
|
||||||
return(STATUS_INVALID_INFO_CLASS);
|
|
||||||
|
|
||||||
if (MutantInformationLength < sizeof(MUTANT_BASIC_INFORMATION))
|
|
||||||
return(STATUS_INFO_LENGTH_MISMATCH);
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(MutantHandle,
|
|
||||||
MUTANT_QUERY_STATE,
|
|
||||||
ExMutantObjectType,
|
|
||||||
ExGetPreviousMode(),
|
|
||||||
(PVOID*)&Mutant,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
SafeMutantInformation.Count = KeReadStateMutant(Mutant);
|
|
||||||
SafeMutantInformation.Owned = (Mutant->OwnerThread != NULL);
|
|
||||||
SafeMutantInformation.Abandoned = Mutant->Abandoned;
|
|
||||||
|
|
||||||
ObDereferenceObject(Mutant);
|
|
||||||
|
|
||||||
Status = MmCopyToCaller(MutantInformation, &SafeMutantInformation, sizeof(MUTANT_BASIC_INFORMATION));
|
|
||||||
if(NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
if(ResultLength != NULL)
|
|
||||||
{
|
|
||||||
ULONG RetLen = sizeof(MUTANT_BASIC_INFORMATION);
|
|
||||||
Status = MmCopyToCaller(ResultLength, &RetLen, sizeof(ULONG));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Status = STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtReleaseMutant(IN HANDLE MutantHandle,
|
|
||||||
IN PLONG PreviousCount OPTIONAL)
|
|
||||||
{
|
|
||||||
PKMUTANT Mutant;
|
|
||||||
NTSTATUS Status;
|
|
||||||
LONG Count;
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(MutantHandle,
|
|
||||||
MUTANT_ALL_ACCESS,
|
|
||||||
ExMutantObjectType,
|
|
||||||
ExGetPreviousMode(),
|
|
||||||
(PVOID*)&Mutant,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
Count = KeReleaseMutant(Mutant,
|
|
||||||
MUTANT_INCREMENT,
|
|
||||||
0,
|
|
||||||
FALSE);
|
|
||||||
ObDereferenceObject(Mutant);
|
|
||||||
|
|
||||||
if (PreviousCount != NULL)
|
|
||||||
{
|
|
||||||
Status = MmCopyToCaller(PreviousCount, &Count, sizeof(LONG));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Status = STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,31 +0,0 @@
|
||||||
/* $Id$
|
|
||||||
*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: ntoskrnl/nt/nt.c
|
|
||||||
* PURPOSE: Initialization of system call interfaces
|
|
||||||
* PROGRAMMER: David Welch (welch@cwcom.net)
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
* Created 22/05/98
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#include <internal/debug.h>
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
|
||||||
|
|
||||||
VOID INIT_FUNCTION
|
|
||||||
NtInit(VOID)
|
|
||||||
{
|
|
||||||
NtInitializeEventImplementation();
|
|
||||||
NtInitializeEventPairImplementation();
|
|
||||||
NtInitializeMutantImplementation();
|
|
||||||
NtInitializeSemaphoreImplementation();
|
|
||||||
NtInitializeTimerImplementation();
|
|
||||||
NiInitPort();
|
|
||||||
NtInitializeProfileImplementation();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,370 +0,0 @@
|
||||||
/*
|
|
||||||
* ReactOS kernel
|
|
||||||
* Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: ntoskrnl/nt/event.c
|
|
||||||
* PURPOSE: Named event support
|
|
||||||
* PROGRAMMER: Philip Susi and David Welch
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
* Created 22/05/98
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#define NDEBUG
|
|
||||||
#include <internal/debug.h>
|
|
||||||
|
|
||||||
/* GLOBALS *******************************************************************/
|
|
||||||
|
|
||||||
POBJECT_TYPE EXPORTED ExEventObjectType = NULL;
|
|
||||||
|
|
||||||
static GENERIC_MAPPING ExpEventMapping = {
|
|
||||||
STANDARD_RIGHTS_READ | SYNCHRONIZE | EVENT_QUERY_STATE,
|
|
||||||
STANDARD_RIGHTS_WRITE | SYNCHRONIZE | EVENT_MODIFY_STATE,
|
|
||||||
STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE | EVENT_QUERY_STATE,
|
|
||||||
EVENT_ALL_ACCESS};
|
|
||||||
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtpCreateEvent(PVOID ObjectBody,
|
|
||||||
PVOID Parent,
|
|
||||||
PWSTR RemainingPath,
|
|
||||||
POBJECT_ATTRIBUTES ObjectAttributes)
|
|
||||||
{
|
|
||||||
DPRINT("NtpCreateEvent(ObjectBody %x, Parent %x, RemainingPath %S)\n",
|
|
||||||
ObjectBody, Parent, RemainingPath);
|
|
||||||
|
|
||||||
if (RemainingPath != NULL && wcschr(RemainingPath+1, '\\') != NULL)
|
|
||||||
{
|
|
||||||
return(STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VOID INIT_FUNCTION
|
|
||||||
NtInitializeEventImplementation(VOID)
|
|
||||||
{
|
|
||||||
ExEventObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
|
||||||
|
|
||||||
RtlCreateUnicodeString(&ExEventObjectType->TypeName, L"Event");
|
|
||||||
|
|
||||||
ExEventObjectType->Tag = TAG('E', 'V', 'T', 'T');
|
|
||||||
ExEventObjectType->PeakObjects = 0;
|
|
||||||
ExEventObjectType->PeakHandles = 0;
|
|
||||||
ExEventObjectType->TotalObjects = 0;
|
|
||||||
ExEventObjectType->TotalHandles = 0;
|
|
||||||
ExEventObjectType->PagedPoolCharge = 0;
|
|
||||||
ExEventObjectType->NonpagedPoolCharge = sizeof(KEVENT);
|
|
||||||
ExEventObjectType->Mapping = &ExpEventMapping;
|
|
||||||
ExEventObjectType->Dump = NULL;
|
|
||||||
ExEventObjectType->Open = NULL;
|
|
||||||
ExEventObjectType->Close = NULL;
|
|
||||||
ExEventObjectType->Delete = NULL;
|
|
||||||
ExEventObjectType->Parse = NULL;
|
|
||||||
ExEventObjectType->Security = NULL;
|
|
||||||
ExEventObjectType->QueryName = NULL;
|
|
||||||
ExEventObjectType->OkayToClose = NULL;
|
|
||||||
ExEventObjectType->Create = NtpCreateEvent;
|
|
||||||
ExEventObjectType->DuplicationNotify = NULL;
|
|
||||||
|
|
||||||
ObpCreateTypeObject(ExEventObjectType);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtClearEvent(IN HANDLE EventHandle)
|
|
||||||
{
|
|
||||||
PKEVENT Event;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(EventHandle,
|
|
||||||
EVENT_MODIFY_STATE,
|
|
||||||
ExEventObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&Event,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
KeClearEvent(Event);
|
|
||||||
ObDereferenceObject(Event);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtCreateEvent(OUT PHANDLE EventHandle,
|
|
||||||
IN ACCESS_MASK DesiredAccess,
|
|
||||||
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
|
||||||
IN EVENT_TYPE EventType,
|
|
||||||
IN BOOLEAN InitialState)
|
|
||||||
{
|
|
||||||
PKEVENT Event;
|
|
||||||
HANDLE hEvent;
|
|
||||||
NTSTATUS Status;
|
|
||||||
OBJECT_ATTRIBUTES SafeObjectAttributes;
|
|
||||||
|
|
||||||
if (ObjectAttributes != NULL)
|
|
||||||
{
|
|
||||||
Status = MmCopyFromCaller(&SafeObjectAttributes, ObjectAttributes,
|
|
||||||
sizeof(OBJECT_ATTRIBUTES));
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
ObjectAttributes = &SafeObjectAttributes;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = ObCreateObject(ExGetPreviousMode(),
|
|
||||||
ExEventObjectType,
|
|
||||||
ObjectAttributes,
|
|
||||||
ExGetPreviousMode(),
|
|
||||||
NULL,
|
|
||||||
sizeof(KEVENT),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
(PVOID*)&Event);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
KeInitializeEvent(Event,
|
|
||||||
EventType,
|
|
||||||
InitialState);
|
|
||||||
|
|
||||||
Status = ObInsertObject ((PVOID)Event,
|
|
||||||
NULL,
|
|
||||||
DesiredAccess,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
&hEvent);
|
|
||||||
ObDereferenceObject(Event);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = MmCopyToCaller(EventHandle, &hEvent, sizeof(HANDLE));
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
ZwClose(hEvent);
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtOpenEvent(OUT PHANDLE EventHandle,
|
|
||||||
IN ACCESS_MASK DesiredAccess,
|
|
||||||
IN POBJECT_ATTRIBUTES ObjectAttributes)
|
|
||||||
{
|
|
||||||
NTSTATUS Status;
|
|
||||||
HANDLE hEvent;
|
|
||||||
|
|
||||||
DPRINT("ObjectName '%wZ'\n", ObjectAttributes->ObjectName);
|
|
||||||
|
|
||||||
Status = ObOpenObjectByName(ObjectAttributes,
|
|
||||||
ExEventObjectType,
|
|
||||||
NULL,
|
|
||||||
UserMode,
|
|
||||||
DesiredAccess,
|
|
||||||
NULL,
|
|
||||||
&hEvent);
|
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = MmCopyToCaller(EventHandle, &hEvent, sizeof(HANDLE));
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
ZwClose(EventHandle);
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtPulseEvent(IN HANDLE EventHandle,
|
|
||||||
OUT PLONG PreviousState OPTIONAL)
|
|
||||||
{
|
|
||||||
PKEVENT Event;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
DPRINT("NtPulseEvent(EventHandle %x PreviousState %x)\n",
|
|
||||||
EventHandle, PreviousState);
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(EventHandle,
|
|
||||||
EVENT_MODIFY_STATE,
|
|
||||||
ExEventObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&Event,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
KePulseEvent(Event, EVENT_INCREMENT, FALSE);
|
|
||||||
|
|
||||||
ObDereferenceObject(Event);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtQueryEvent(IN HANDLE EventHandle,
|
|
||||||
IN EVENT_INFORMATION_CLASS EventInformationClass,
|
|
||||||
OUT PVOID EventInformation,
|
|
||||||
IN ULONG EventInformationLength,
|
|
||||||
OUT PULONG ReturnLength OPTIONAL)
|
|
||||||
{
|
|
||||||
EVENT_BASIC_INFORMATION Info;
|
|
||||||
PKEVENT Event;
|
|
||||||
NTSTATUS Status;
|
|
||||||
ULONG RetLen;
|
|
||||||
|
|
||||||
if (EventInformationClass > EventBasicInformation)
|
|
||||||
return STATUS_INVALID_INFO_CLASS;
|
|
||||||
|
|
||||||
if (EventInformationLength < sizeof(EVENT_BASIC_INFORMATION))
|
|
||||||
return STATUS_INFO_LENGTH_MISMATCH;
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(EventHandle,
|
|
||||||
EVENT_QUERY_STATE,
|
|
||||||
ExEventObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&Event,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
return Status;
|
|
||||||
|
|
||||||
if (Event->Header.Type == InternalNotificationEvent)
|
|
||||||
Info.EventType = NotificationEvent;
|
|
||||||
else
|
|
||||||
Info.EventType = SynchronizationEvent;
|
|
||||||
Info.EventState = KeReadStateEvent(Event);
|
|
||||||
|
|
||||||
Status = MmCopyToCaller(EventInformation, &Event,
|
|
||||||
sizeof(EVENT_BASIC_INFORMATION));
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
ObDereferenceObject(Event);
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ReturnLength != NULL)
|
|
||||||
{
|
|
||||||
RetLen = sizeof(EVENT_BASIC_INFORMATION);
|
|
||||||
Status = MmCopyToCaller(ReturnLength, &RetLen, sizeof(ULONG));
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
ObDereferenceObject(Event);
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ObDereferenceObject(Event);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtResetEvent(IN HANDLE EventHandle,
|
|
||||||
OUT PLONG PreviousState OPTIONAL)
|
|
||||||
{
|
|
||||||
PKEVENT Event;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
DPRINT("NtResetEvent(EventHandle %x)\n", EventHandle);
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(EventHandle,
|
|
||||||
EVENT_MODIFY_STATE,
|
|
||||||
ExEventObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&Event,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
KeResetEvent(Event);
|
|
||||||
ObDereferenceObject(Event);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtSetEvent(IN HANDLE EventHandle,
|
|
||||||
OUT PLONG PreviousState OPTIONAL)
|
|
||||||
{
|
|
||||||
PKEVENT Event;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
DPRINT("NtSetEvent(EventHandle %x)\n", EventHandle);
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(EventHandle,
|
|
||||||
EVENT_MODIFY_STATE,
|
|
||||||
ExEventObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&Event,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
KeSetEvent(Event,EVENT_INCREMENT,FALSE);
|
|
||||||
ObDereferenceObject(Event);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtTraceEvent(
|
|
||||||
IN ULONG TraceHandle,
|
|
||||||
IN ULONG Flags,
|
|
||||||
IN ULONG TraceHeaderLength,
|
|
||||||
IN struct _EVENT_TRACE_HEADER* TraceHeader
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,201 +0,0 @@
|
||||||
/* $Id$
|
|
||||||
*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: ntoskrnl/nt/ntsem.c
|
|
||||||
* PURPOSE: Synchronization primitives
|
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
* Created 22/05/98
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#define NDEBUG
|
|
||||||
#include <internal/debug.h>
|
|
||||||
|
|
||||||
/* GLOBALS ******************************************************************/
|
|
||||||
|
|
||||||
POBJECT_TYPE ExSemaphoreObjectType;
|
|
||||||
|
|
||||||
static GENERIC_MAPPING ExSemaphoreMapping = {
|
|
||||||
STANDARD_RIGHTS_READ | SEMAPHORE_QUERY_STATE,
|
|
||||||
STANDARD_RIGHTS_WRITE | SEMAPHORE_MODIFY_STATE,
|
|
||||||
STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE | SEMAPHORE_QUERY_STATE,
|
|
||||||
SEMAPHORE_ALL_ACCESS};
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtpCreateSemaphore(PVOID ObjectBody,
|
|
||||||
PVOID Parent,
|
|
||||||
PWSTR RemainingPath,
|
|
||||||
POBJECT_ATTRIBUTES ObjectAttributes)
|
|
||||||
{
|
|
||||||
DPRINT("NtpCreateSemaphore(ObjectBody %x, Parent %x, RemainingPath %S)\n",
|
|
||||||
ObjectBody, Parent, RemainingPath);
|
|
||||||
|
|
||||||
if (RemainingPath != NULL && wcschr(RemainingPath+1, '\\') != NULL)
|
|
||||||
{
|
|
||||||
return(STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID INIT_FUNCTION
|
|
||||||
NtInitializeSemaphoreImplementation(VOID)
|
|
||||||
{
|
|
||||||
ExSemaphoreObjectType = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE));
|
|
||||||
|
|
||||||
RtlCreateUnicodeString(&ExSemaphoreObjectType->TypeName, L"Semaphore");
|
|
||||||
|
|
||||||
ExSemaphoreObjectType->Tag = TAG('S', 'E', 'M', 'T');
|
|
||||||
ExSemaphoreObjectType->PeakObjects = 0;
|
|
||||||
ExSemaphoreObjectType->PeakHandles = 0;
|
|
||||||
ExSemaphoreObjectType->TotalObjects = 0;
|
|
||||||
ExSemaphoreObjectType->TotalHandles = 0;
|
|
||||||
ExSemaphoreObjectType->PagedPoolCharge = 0;
|
|
||||||
ExSemaphoreObjectType->NonpagedPoolCharge = sizeof(KSEMAPHORE);
|
|
||||||
ExSemaphoreObjectType->Mapping = &ExSemaphoreMapping;
|
|
||||||
ExSemaphoreObjectType->Dump = NULL;
|
|
||||||
ExSemaphoreObjectType->Open = NULL;
|
|
||||||
ExSemaphoreObjectType->Close = NULL;
|
|
||||||
ExSemaphoreObjectType->Delete = NULL;
|
|
||||||
ExSemaphoreObjectType->Parse = NULL;
|
|
||||||
ExSemaphoreObjectType->Security = NULL;
|
|
||||||
ExSemaphoreObjectType->QueryName = NULL;
|
|
||||||
ExSemaphoreObjectType->OkayToClose = NULL;
|
|
||||||
ExSemaphoreObjectType->Create = NtpCreateSemaphore;
|
|
||||||
ExSemaphoreObjectType->DuplicationNotify = NULL;
|
|
||||||
|
|
||||||
ObpCreateTypeObject(ExSemaphoreObjectType);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtCreateSemaphore(OUT PHANDLE SemaphoreHandle,
|
|
||||||
IN ACCESS_MASK DesiredAccess,
|
|
||||||
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
|
||||||
IN LONG InitialCount,
|
|
||||||
IN LONG MaximumCount)
|
|
||||||
{
|
|
||||||
PKSEMAPHORE Semaphore;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
Status = ObCreateObject(ExGetPreviousMode(),
|
|
||||||
ExSemaphoreObjectType,
|
|
||||||
ObjectAttributes,
|
|
||||||
ExGetPreviousMode(),
|
|
||||||
NULL,
|
|
||||||
sizeof(KSEMAPHORE),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
(PVOID*)&Semaphore);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
KeInitializeSemaphore(Semaphore,
|
|
||||||
InitialCount,
|
|
||||||
MaximumCount);
|
|
||||||
|
|
||||||
Status = ObInsertObject ((PVOID)Semaphore,
|
|
||||||
NULL,
|
|
||||||
DesiredAccess,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
SemaphoreHandle);
|
|
||||||
|
|
||||||
ObDereferenceObject(Semaphore);
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtOpenSemaphore(IN HANDLE SemaphoreHandle,
|
|
||||||
IN ACCESS_MASK DesiredAccess,
|
|
||||||
IN POBJECT_ATTRIBUTES ObjectAttributes)
|
|
||||||
{
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
Status = ObOpenObjectByName(ObjectAttributes,
|
|
||||||
ExSemaphoreObjectType,
|
|
||||||
NULL,
|
|
||||||
UserMode,
|
|
||||||
DesiredAccess,
|
|
||||||
NULL,
|
|
||||||
SemaphoreHandle);
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtQuerySemaphore(IN HANDLE SemaphoreHandle,
|
|
||||||
IN SEMAPHORE_INFORMATION_CLASS SemaphoreInformationClass,
|
|
||||||
OUT PVOID SemaphoreInformation,
|
|
||||||
IN ULONG SemaphoreInformationLength,
|
|
||||||
OUT PULONG ReturnLength OPTIONAL)
|
|
||||||
{
|
|
||||||
PSEMAPHORE_BASIC_INFORMATION Info;
|
|
||||||
PKSEMAPHORE Semaphore;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
Info = (PSEMAPHORE_BASIC_INFORMATION)SemaphoreInformation;
|
|
||||||
|
|
||||||
if (SemaphoreInformationClass > SemaphoreBasicInformation)
|
|
||||||
return STATUS_INVALID_INFO_CLASS;
|
|
||||||
|
|
||||||
if (SemaphoreInformationLength < sizeof(SEMAPHORE_BASIC_INFORMATION))
|
|
||||||
return STATUS_INFO_LENGTH_MISMATCH;
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(SemaphoreHandle,
|
|
||||||
SEMAPHORE_QUERY_STATE,
|
|
||||||
ExSemaphoreObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&Semaphore,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
return Status;
|
|
||||||
|
|
||||||
Info->CurrentCount = KeReadStateSemaphore(Semaphore);
|
|
||||||
Info->MaximumCount = Semaphore->Limit;
|
|
||||||
|
|
||||||
if (ReturnLength != NULL)
|
|
||||||
*ReturnLength = sizeof(SEMAPHORE_BASIC_INFORMATION);
|
|
||||||
|
|
||||||
ObDereferenceObject(Semaphore);
|
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtReleaseSemaphore(IN HANDLE SemaphoreHandle,
|
|
||||||
IN LONG ReleaseCount,
|
|
||||||
OUT PLONG PreviousCount OPTIONAL)
|
|
||||||
{
|
|
||||||
PKSEMAPHORE Semaphore;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(SemaphoreHandle,
|
|
||||||
SEMAPHORE_MODIFY_STATE,
|
|
||||||
ExSemaphoreObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&Semaphore,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
KeReleaseSemaphore(Semaphore,
|
|
||||||
IO_NO_INCREMENT,
|
|
||||||
ReleaseCount,
|
|
||||||
FALSE);
|
|
||||||
ObDereferenceObject(Semaphore);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,381 +0,0 @@
|
||||||
/* $Id$
|
|
||||||
*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: ntoskrnl/nt/nttimer.c
|
|
||||||
* PURPOSE: User-mode timers
|
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
* Created 22/05/98
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#include <internal/debug.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* TYPES ********************************************************************/
|
|
||||||
|
|
||||||
typedef struct _NTTIMER
|
|
||||||
{
|
|
||||||
KTIMER Timer;
|
|
||||||
KDPC Dpc;
|
|
||||||
KAPC Apc;
|
|
||||||
BOOLEAN Running;
|
|
||||||
} NTTIMER, *PNTTIMER;
|
|
||||||
|
|
||||||
|
|
||||||
/* GLOBALS ******************************************************************/
|
|
||||||
|
|
||||||
POBJECT_TYPE ExTimerType = NULL;
|
|
||||||
|
|
||||||
static GENERIC_MAPPING ExpTimerMapping = {
|
|
||||||
STANDARD_RIGHTS_READ | TIMER_QUERY_STATE,
|
|
||||||
STANDARD_RIGHTS_WRITE | TIMER_MODIFY_STATE,
|
|
||||||
STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE,
|
|
||||||
TIMER_ALL_ACCESS};
|
|
||||||
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtpCreateTimer(PVOID ObjectBody,
|
|
||||||
PVOID Parent,
|
|
||||||
PWSTR RemainingPath,
|
|
||||||
POBJECT_ATTRIBUTES ObjectAttributes)
|
|
||||||
{
|
|
||||||
DPRINT("NtpCreateTimer(ObjectBody %x, Parent %x, RemainingPath %S)\n",
|
|
||||||
ObjectBody, Parent, RemainingPath);
|
|
||||||
|
|
||||||
if (RemainingPath != NULL && wcschr(RemainingPath+1, '\\') != NULL)
|
|
||||||
{
|
|
||||||
return(STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VOID STDCALL
|
|
||||||
NtpDeleteTimer(PVOID ObjectBody)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
PNTTIMER Timer = ObjectBody;
|
|
||||||
|
|
||||||
DPRINT("NtpDeleteTimer()\n");
|
|
||||||
|
|
||||||
OldIrql = KeRaiseIrqlToDpcLevel();
|
|
||||||
|
|
||||||
KeCancelTimer(&Timer->Timer);
|
|
||||||
KeRemoveQueueDpc(&Timer->Dpc);
|
|
||||||
KeRemoveQueueApc(&Timer->Apc);
|
|
||||||
Timer->Running = FALSE;
|
|
||||||
|
|
||||||
KeLowerIrql(OldIrql);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VOID STDCALL
|
|
||||||
NtpTimerDpcRoutine(PKDPC Dpc,
|
|
||||||
PVOID DeferredContext,
|
|
||||||
PVOID SystemArgument1,
|
|
||||||
PVOID SystemArgument2)
|
|
||||||
{
|
|
||||||
PNTTIMER Timer;
|
|
||||||
|
|
||||||
DPRINT("NtpTimerDpcRoutine()\n");
|
|
||||||
|
|
||||||
Timer = (PNTTIMER)DeferredContext;
|
|
||||||
|
|
||||||
if ( Timer->Running )
|
|
||||||
{
|
|
||||||
KeInsertQueueApc(&Timer->Apc,
|
|
||||||
SystemArgument1,
|
|
||||||
SystemArgument2,
|
|
||||||
IO_NO_INCREMENT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VOID STDCALL
|
|
||||||
NtpTimerApcKernelRoutine(PKAPC Apc,
|
|
||||||
PKNORMAL_ROUTINE* NormalRoutine,
|
|
||||||
PVOID* NormalContext,
|
|
||||||
PVOID* SystemArgument1,
|
|
||||||
PVOID* SystemArguemnt2)
|
|
||||||
{
|
|
||||||
DPRINT("NtpTimerApcKernelRoutine()\n");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VOID INIT_FUNCTION
|
|
||||||
NtInitializeTimerImplementation(VOID)
|
|
||||||
{
|
|
||||||
ASSERT(!ExTimerType)
|
|
||||||
ExTimerType = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE));
|
|
||||||
|
|
||||||
RtlCreateUnicodeString(&ExTimerType->TypeName, L"Timer");
|
|
||||||
|
|
||||||
ExTimerType->Tag = TAG('T', 'I', 'M', 'T');
|
|
||||||
ExTimerType->PeakObjects = 0;
|
|
||||||
ExTimerType->PeakHandles = 0;
|
|
||||||
ExTimerType->TotalObjects = 0;
|
|
||||||
ExTimerType->TotalHandles = 0;
|
|
||||||
ExTimerType->PagedPoolCharge = 0;
|
|
||||||
ExTimerType->NonpagedPoolCharge = sizeof(NTTIMER);
|
|
||||||
ExTimerType->Mapping = &ExpTimerMapping;
|
|
||||||
ExTimerType->Dump = NULL;
|
|
||||||
ExTimerType->Open = NULL;
|
|
||||||
ExTimerType->Close = NULL;
|
|
||||||
ExTimerType->Delete = NtpDeleteTimer;
|
|
||||||
ExTimerType->Parse = NULL;
|
|
||||||
ExTimerType->Security = NULL;
|
|
||||||
ExTimerType->QueryName = NULL;
|
|
||||||
ExTimerType->OkayToClose = NULL;
|
|
||||||
ExTimerType->Create = NtpCreateTimer;
|
|
||||||
ExTimerType->DuplicationNotify = NULL;
|
|
||||||
|
|
||||||
ObpCreateTypeObject(ExTimerType);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtCancelTimer(IN HANDLE TimerHandle,
|
|
||||||
OUT PBOOLEAN CurrentState OPTIONAL)
|
|
||||||
{
|
|
||||||
PNTTIMER Timer;
|
|
||||||
NTSTATUS Status;
|
|
||||||
BOOLEAN State;
|
|
||||||
KIRQL OldIrql;
|
|
||||||
|
|
||||||
DPRINT("NtCancelTimer()\n");
|
|
||||||
Status = ObReferenceObjectByHandle(TimerHandle,
|
|
||||||
TIMER_ALL_ACCESS,
|
|
||||||
ExTimerType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&Timer,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
return Status;
|
|
||||||
|
|
||||||
OldIrql = KeRaiseIrqlToDpcLevel();
|
|
||||||
|
|
||||||
State = KeCancelTimer(&Timer->Timer);
|
|
||||||
KeRemoveQueueDpc(&Timer->Dpc);
|
|
||||||
KeRemoveQueueApc(&Timer->Apc);
|
|
||||||
Timer->Running = FALSE;
|
|
||||||
|
|
||||||
KeLowerIrql(OldIrql);
|
|
||||||
ObDereferenceObject(Timer);
|
|
||||||
|
|
||||||
if (CurrentState != NULL)
|
|
||||||
{
|
|
||||||
*CurrentState = State;
|
|
||||||
}
|
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtCreateTimer(OUT PHANDLE TimerHandle,
|
|
||||||
IN ACCESS_MASK DesiredAccess,
|
|
||||||
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
|
||||||
IN TIMER_TYPE TimerType)
|
|
||||||
{
|
|
||||||
PNTTIMER Timer;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
DPRINT("NtCreateTimer()\n");
|
|
||||||
Status = ObCreateObject(ExGetPreviousMode(),
|
|
||||||
ExTimerType,
|
|
||||||
ObjectAttributes,
|
|
||||||
ExGetPreviousMode(),
|
|
||||||
NULL,
|
|
||||||
sizeof(NTTIMER),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
(PVOID*)&Timer);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
return Status;
|
|
||||||
|
|
||||||
KeInitializeTimerEx(&Timer->Timer,
|
|
||||||
TimerType);
|
|
||||||
|
|
||||||
KeInitializeDpc(&Timer->Dpc,
|
|
||||||
&NtpTimerDpcRoutine,
|
|
||||||
Timer);
|
|
||||||
|
|
||||||
Timer->Running = FALSE;
|
|
||||||
|
|
||||||
Status = ObInsertObject ((PVOID)Timer,
|
|
||||||
NULL,
|
|
||||||
DesiredAccess,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
TimerHandle);
|
|
||||||
|
|
||||||
ObDereferenceObject(Timer);
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtOpenTimer(OUT PHANDLE TimerHandle,
|
|
||||||
IN ACCESS_MASK DesiredAccess,
|
|
||||||
IN POBJECT_ATTRIBUTES ObjectAttributes)
|
|
||||||
{
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
Status = ObOpenObjectByName(ObjectAttributes,
|
|
||||||
ExTimerType,
|
|
||||||
NULL,
|
|
||||||
UserMode,
|
|
||||||
DesiredAccess,
|
|
||||||
NULL,
|
|
||||||
TimerHandle);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtQueryTimer(IN HANDLE TimerHandle,
|
|
||||||
IN TIMER_INFORMATION_CLASS TimerInformationClass,
|
|
||||||
OUT PVOID TimerInformation,
|
|
||||||
IN ULONG TimerInformationLength,
|
|
||||||
OUT PULONG ReturnLength OPTIONAL)
|
|
||||||
{
|
|
||||||
PNTTIMER Timer;
|
|
||||||
TIMER_BASIC_INFORMATION SafeTimerInformation;
|
|
||||||
ULONG ResultLength;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(TimerHandle,
|
|
||||||
TIMER_QUERY_STATE,
|
|
||||||
ExTimerType,
|
|
||||||
(KPROCESSOR_MODE)KeGetPreviousMode(),
|
|
||||||
(PVOID*)&Timer,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TimerInformationClass != TimerBasicInformation)
|
|
||||||
{
|
|
||||||
ObDereferenceObject(Timer);
|
|
||||||
return(STATUS_INVALID_INFO_CLASS);
|
|
||||||
}
|
|
||||||
if (TimerInformationLength < sizeof(TIMER_BASIC_INFORMATION))
|
|
||||||
{
|
|
||||||
ObDereferenceObject(Timer);
|
|
||||||
return(STATUS_INFO_LENGTH_MISMATCH);
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(&SafeTimerInformation.TimeRemaining, &Timer->Timer.DueTime,
|
|
||||||
sizeof(LARGE_INTEGER));
|
|
||||||
SafeTimerInformation.SignalState = (BOOLEAN)Timer->Timer.Header.SignalState;
|
|
||||||
ResultLength = sizeof(TIMER_BASIC_INFORMATION);
|
|
||||||
|
|
||||||
Status = MmCopyToCaller(TimerInformation, &SafeTimerInformation,
|
|
||||||
sizeof(TIMER_BASIC_INFORMATION));
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
ObDereferenceObject(Timer);
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ReturnLength != NULL)
|
|
||||||
{
|
|
||||||
Status = MmCopyToCaller(ReturnLength, &ResultLength,
|
|
||||||
sizeof(ULONG));
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
ObDereferenceObject(Timer);
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ObDereferenceObject(Timer);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtSetTimer(IN HANDLE TimerHandle,
|
|
||||||
IN PLARGE_INTEGER DueTime,
|
|
||||||
IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
|
|
||||||
IN PVOID TimerContext OPTIONAL,
|
|
||||||
IN BOOLEAN ResumeTimer,
|
|
||||||
IN LONG Period OPTIONAL,
|
|
||||||
OUT PBOOLEAN PreviousState OPTIONAL)
|
|
||||||
{
|
|
||||||
PNTTIMER Timer;
|
|
||||||
NTSTATUS Status;
|
|
||||||
BOOLEAN Result;
|
|
||||||
BOOLEAN State;
|
|
||||||
|
|
||||||
DPRINT("NtSetTimer()\n");
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(TimerHandle,
|
|
||||||
TIMER_ALL_ACCESS,
|
|
||||||
ExTimerType,
|
|
||||||
(KPROCESSOR_MODE)KeGetPreviousMode(),
|
|
||||||
(PVOID*)&Timer,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
State = KeReadStateTimer(&Timer->Timer);
|
|
||||||
|
|
||||||
if (Timer->Running == TRUE)
|
|
||||||
{
|
|
||||||
/* cancel running timer */
|
|
||||||
const KIRQL OldIrql = KeRaiseIrqlToDpcLevel();
|
|
||||||
KeCancelTimer(&Timer->Timer);
|
|
||||||
KeRemoveQueueDpc(&Timer->Dpc);
|
|
||||||
KeRemoveQueueApc(&Timer->Apc);
|
|
||||||
Timer->Running = FALSE;
|
|
||||||
KeLowerIrql(OldIrql);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TimerApcRoutine)
|
|
||||||
{
|
|
||||||
KeInitializeApc(&Timer->Apc,
|
|
||||||
KeGetCurrentThread(),
|
|
||||||
OriginalApcEnvironment,
|
|
||||||
&NtpTimerApcKernelRoutine,
|
|
||||||
(PKRUNDOWN_ROUTINE)NULL,
|
|
||||||
(PKNORMAL_ROUTINE)TimerApcRoutine,
|
|
||||||
(KPROCESSOR_MODE)KeGetPreviousMode(),
|
|
||||||
TimerContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
Result = KeSetTimerEx(&Timer->Timer,
|
|
||||||
*DueTime,
|
|
||||||
Period,
|
|
||||||
TimerApcRoutine ? &Timer->Dpc : 0 );
|
|
||||||
if (Result == TRUE)
|
|
||||||
{
|
|
||||||
ObDereferenceObject(Timer);
|
|
||||||
DPRINT1( "KeSetTimer says the timer was already running, this shouldn't be\n" );
|
|
||||||
return STATUS_UNSUCCESSFUL;
|
|
||||||
}
|
|
||||||
|
|
||||||
Timer->Running = TRUE;
|
|
||||||
|
|
||||||
ObDereferenceObject(Timer);
|
|
||||||
|
|
||||||
if (PreviousState != NULL)
|
|
||||||
{
|
|
||||||
*PreviousState = State;
|
|
||||||
}
|
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
|
|
@ -1,37 +0,0 @@
|
||||||
/*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: ntoskrnl/nt/plugplay.c
|
|
||||||
* PURPOSE: Mysterious nt4 support for plug-and-play
|
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
* Created 22/05/98
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#include <internal/debug.h>
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtPlugPlayControl (DWORD Unknown1,
|
|
||||||
DWORD Unknown2,
|
|
||||||
DWORD Unknown3)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return(STATUS_NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
NtGetPlugPlayEvent (ULONG Reserved1,
|
|
||||||
ULONG Reserved2,
|
|
||||||
PVOID Buffer,
|
|
||||||
ULONG BufferLength)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return(STATUS_NOT_IMPLEMENTED);
|
|
||||||
}
|
|
|
@ -1,592 +0,0 @@
|
||||||
/*
|
|
||||||
* ReactOS kernel
|
|
||||||
* Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: ntoskrnl/nt/profile.c
|
|
||||||
* PURPOSE: Support for profiling
|
|
||||||
* PROGRAMMER: Nobody
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#include <internal/debug.h>
|
|
||||||
|
|
||||||
/* TYPES ********************************************************************/
|
|
||||||
|
|
||||||
typedef struct _KPROCESS_PROFILE
|
|
||||||
/*
|
|
||||||
* List of the profile data structures associated with a process.
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
LIST_ENTRY ProfileListHead;
|
|
||||||
LIST_ENTRY ListEntry;
|
|
||||||
HANDLE Pid;
|
|
||||||
} KPROCESS_PROFILE, *PKPROCESS_PROFILE;
|
|
||||||
|
|
||||||
typedef struct _KPROFILE
|
|
||||||
/*
|
|
||||||
* Describes a contiguous region of process memory that is being profiled.
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
CSHORT Type;
|
|
||||||
CSHORT Name;
|
|
||||||
|
|
||||||
/* Entry in the list of profile data structures for this process. */
|
|
||||||
LIST_ENTRY ListEntry;
|
|
||||||
|
|
||||||
/* Base of the region being profiled. */
|
|
||||||
PVOID Base;
|
|
||||||
|
|
||||||
/* Size of the region being profiled. */
|
|
||||||
ULONG Size;
|
|
||||||
|
|
||||||
/* Shift of offsets from the region to buckets in the profiling buffer. */
|
|
||||||
ULONG BucketShift;
|
|
||||||
|
|
||||||
/* MDL which described the buffer that receives profiling data. */
|
|
||||||
PMDL BufferMdl;
|
|
||||||
|
|
||||||
/* System alias for the profiling buffer. */
|
|
||||||
PULONG Buffer;
|
|
||||||
|
|
||||||
/* Size of the buffer for profiling data. */
|
|
||||||
ULONG BufferSize;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Mask of processors for which profiling data should be collected.
|
|
||||||
* Currently unused.
|
|
||||||
*/
|
|
||||||
ULONG ProcessorMask;
|
|
||||||
|
|
||||||
/* TRUE if profiling has been started for this region. */
|
|
||||||
BOOLEAN Started;
|
|
||||||
|
|
||||||
/* Pointer (and reference) to the process which is being profiled. */
|
|
||||||
PEPROCESS Process;
|
|
||||||
} KPROFILE, *PKPROFILE;
|
|
||||||
|
|
||||||
/* GLOBALS *******************************************************************/
|
|
||||||
|
|
||||||
POBJECT_TYPE EXPORTED ExProfileObjectType = NULL;
|
|
||||||
|
|
||||||
static GENERIC_MAPPING ExpProfileMapping = {
|
|
||||||
STANDARD_RIGHTS_READ,
|
|
||||||
STANDARD_RIGHTS_WRITE,
|
|
||||||
STANDARD_RIGHTS_EXECUTE,
|
|
||||||
STANDARD_RIGHTS_ALL};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Size of the profile hash table.
|
|
||||||
*/
|
|
||||||
#define PROFILE_HASH_TABLE_SIZE (32)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Table of lists of per-process profiling data structures hashed by PID.
|
|
||||||
*/
|
|
||||||
static LIST_ENTRY ProcessProfileListHashTable[PROFILE_HASH_TABLE_SIZE];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Head of the list of profile data structures for the kernel.
|
|
||||||
*/
|
|
||||||
static LIST_ENTRY SystemProfileList;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Lock that protects the profiling data structures.
|
|
||||||
*/
|
|
||||||
static KSPIN_LOCK ProfileListLock;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Timer interrupts happen before we have initialized the profiling
|
|
||||||
* data structures so just ignore them before that.
|
|
||||||
*/
|
|
||||||
static BOOLEAN ProfileInitDone = FALSE;
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
|
||||||
|
|
||||||
VOID STATIC
|
|
||||||
KiAddProfileEventToProcess(PLIST_ENTRY ListHead, PVOID Eip)
|
|
||||||
/*
|
|
||||||
* Add a profile event to the profile objects for a particular process
|
|
||||||
* or the system
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
PKPROFILE current;
|
|
||||||
PLIST_ENTRY current_entry;
|
|
||||||
|
|
||||||
current_entry = ListHead->Flink;
|
|
||||||
while (current_entry != ListHead)
|
|
||||||
{
|
|
||||||
current = CONTAINING_RECORD(current_entry, KPROFILE, ListEntry);
|
|
||||||
|
|
||||||
if (current->Base > Eip)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (current->Base <= Eip && ((char*)current->Base + current->Size) > (char*)Eip &&
|
|
||||||
current->Started)
|
|
||||||
{
|
|
||||||
ULONG Bucket;
|
|
||||||
|
|
||||||
Bucket = ((ULONG)((char*)Eip - (char*)current->Base)) >> current->BucketShift;
|
|
||||||
|
|
||||||
if ((Bucket*4) < current->BufferSize)
|
|
||||||
{
|
|
||||||
current->Buffer[Bucket]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
current_entry = current_entry->Flink;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
KiAddProfileEvent(KPROFILE_SOURCE Source, ULONG Eip)
|
|
||||||
/*
|
|
||||||
* Add a profile event
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
HANDLE Pid;
|
|
||||||
PKPROCESS_PROFILE current;
|
|
||||||
PLIST_ENTRY current_entry;
|
|
||||||
PLIST_ENTRY ListHead;
|
|
||||||
|
|
||||||
if (!ProfileInitDone)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Pid = PsGetCurrentProcessId();
|
|
||||||
ListHead =
|
|
||||||
ProcessProfileListHashTable[(ULONG)Pid % PROFILE_HASH_TABLE_SIZE].Flink;
|
|
||||||
|
|
||||||
KeAcquireSpinLockAtDpcLevel(&ProfileListLock);
|
|
||||||
|
|
||||||
current_entry = ListHead;
|
|
||||||
while (current_entry != ListHead)
|
|
||||||
{
|
|
||||||
current = CONTAINING_RECORD(current_entry, KPROCESS_PROFILE, ListEntry);
|
|
||||||
|
|
||||||
if (current->Pid == Pid)
|
|
||||||
{
|
|
||||||
KiAddProfileEventToProcess(¤t->ProfileListHead, (PVOID)Eip);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_entry = current_entry->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
KiAddProfileEventToProcess(&SystemProfileList, (PVOID)Eip);
|
|
||||||
|
|
||||||
KeReleaseSpinLockFromDpcLevel(&ProfileListLock);
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
KiInsertProfileIntoProcess(PLIST_ENTRY ListHead, PKPROFILE Profile)
|
|
||||||
/*
|
|
||||||
* Insert a profile object into the list for a process or the system
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
PKPROFILE current;
|
|
||||||
PLIST_ENTRY current_entry;
|
|
||||||
|
|
||||||
current_entry = ListHead;
|
|
||||||
while (current_entry != ListHead)
|
|
||||||
{
|
|
||||||
current = CONTAINING_RECORD(current_entry, KPROFILE, ListEntry);
|
|
||||||
|
|
||||||
if (current->Base > Profile->Base)
|
|
||||||
{
|
|
||||||
Profile->ListEntry.Flink = current_entry;
|
|
||||||
Profile->ListEntry.Blink = current_entry->Blink;
|
|
||||||
current_entry->Blink->Flink = &Profile->ListEntry;
|
|
||||||
current_entry->Blink = &Profile->ListEntry;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_entry = current_entry->Flink;
|
|
||||||
}
|
|
||||||
InsertTailList(ListHead, &Profile->ListEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
KiInsertProfile(PKPROFILE Profile)
|
|
||||||
/*
|
|
||||||
* Insert a profile into the relevant data structures
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
KIRQL oldIrql;
|
|
||||||
|
|
||||||
KeAcquireSpinLock(&ProfileListLock, &oldIrql);
|
|
||||||
|
|
||||||
if (Profile->Process == NULL)
|
|
||||||
{
|
|
||||||
KiInsertProfileIntoProcess(&SystemProfileList, Profile);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ULONG Pid;
|
|
||||||
PKPROCESS_PROFILE current;
|
|
||||||
PLIST_ENTRY current_entry;
|
|
||||||
PLIST_ENTRY ListHead;
|
|
||||||
|
|
||||||
Pid = Profile->Process->UniqueProcessId;
|
|
||||||
ListHead = &ProcessProfileListHashTable[Pid % PROFILE_HASH_TABLE_SIZE];
|
|
||||||
|
|
||||||
current_entry = ListHead;
|
|
||||||
while(current_entry != ListHead)
|
|
||||||
{
|
|
||||||
current = CONTAINING_RECORD(current_entry, KPROCESS_PROFILE,
|
|
||||||
ListEntry);
|
|
||||||
|
|
||||||
if (current->Pid == (HANDLE)Pid)
|
|
||||||
{
|
|
||||||
KiInsertProfileIntoProcess(¤t->ProfileListHead, Profile);
|
|
||||||
KeReleaseSpinLock(&ProfileListLock, oldIrql);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_entry = current_entry->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
current = ExAllocatePool(NonPagedPool, sizeof(KPROCESS_PROFILE));
|
|
||||||
|
|
||||||
current->Pid = (HANDLE)Pid;
|
|
||||||
InitializeListHead(¤t->ProfileListHead);
|
|
||||||
InsertTailList(ListHead, ¤t->ListEntry);
|
|
||||||
|
|
||||||
KiInsertProfileIntoProcess(¤t->ProfileListHead, Profile);
|
|
||||||
}
|
|
||||||
|
|
||||||
KeReleaseSpinLock(&ProfileListLock, oldIrql);
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID KiRemoveProfile(PKPROFILE Profile)
|
|
||||||
{
|
|
||||||
KIRQL oldIrql;
|
|
||||||
|
|
||||||
KeAcquireSpinLock(&ProfileListLock, &oldIrql);
|
|
||||||
|
|
||||||
if (Profile->Process == NULL)
|
|
||||||
{
|
|
||||||
RemoveEntryList(&Profile->ListEntry);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ULONG Pid;
|
|
||||||
PLIST_ENTRY ListHead;
|
|
||||||
PKPROCESS_PROFILE current;
|
|
||||||
PLIST_ENTRY current_entry;
|
|
||||||
|
|
||||||
RemoveEntryList(&Profile->ListEntry);
|
|
||||||
|
|
||||||
Pid = Profile->Process->UniqueProcessId;
|
|
||||||
ListHead = &ProcessProfileListHashTable[Pid % PROFILE_HASH_TABLE_SIZE];
|
|
||||||
|
|
||||||
current_entry = ListHead;
|
|
||||||
while(current_entry != ListHead)
|
|
||||||
{
|
|
||||||
current = CONTAINING_RECORD(current_entry, KPROCESS_PROFILE,
|
|
||||||
ListEntry);
|
|
||||||
|
|
||||||
if (current->Pid == (HANDLE)Pid)
|
|
||||||
{
|
|
||||||
if (IsListEmpty(¤t->ProfileListHead))
|
|
||||||
{
|
|
||||||
RemoveEntryList(¤t->ListEntry);
|
|
||||||
ExFreePool(current);
|
|
||||||
}
|
|
||||||
KeReleaseSpinLock(&ProfileListLock, oldIrql);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_entry = current_entry->Flink;
|
|
||||||
}
|
|
||||||
KEBUGCHECK(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
KeReleaseSpinLock(&ProfileListLock, oldIrql);
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID STDCALL
|
|
||||||
KiDeleteProfile(PVOID ObjectBody)
|
|
||||||
{
|
|
||||||
PKPROFILE Profile;
|
|
||||||
|
|
||||||
Profile = (PKPROFILE)ObjectBody;
|
|
||||||
|
|
||||||
KiRemoveProfile(Profile);
|
|
||||||
if (Profile->Process != NULL)
|
|
||||||
{
|
|
||||||
ObDereferenceObject(Profile->Process);
|
|
||||||
Profile->Process = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Profile->BufferMdl->MappedSystemVa != NULL)
|
|
||||||
{
|
|
||||||
MmUnmapLockedPages(Profile->BufferMdl->MappedSystemVa,
|
|
||||||
Profile->BufferMdl);
|
|
||||||
}
|
|
||||||
MmUnlockPages(Profile->BufferMdl);
|
|
||||||
ExFreePool(Profile->BufferMdl);
|
|
||||||
Profile->BufferMdl = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID INIT_FUNCTION
|
|
||||||
NtInitializeProfileImplementation(VOID)
|
|
||||||
{
|
|
||||||
ULONG i;
|
|
||||||
|
|
||||||
InitializeListHead(&SystemProfileList);
|
|
||||||
|
|
||||||
for (i = 0; i < PROFILE_HASH_TABLE_SIZE; i++)
|
|
||||||
{
|
|
||||||
InitializeListHead(&ProcessProfileListHashTable[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
KeInitializeSpinLock(&ProfileListLock);
|
|
||||||
ProfileInitDone = TRUE;
|
|
||||||
|
|
||||||
ExProfileObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
|
||||||
|
|
||||||
RtlCreateUnicodeString(&ExProfileObjectType->TypeName, L"Profile");
|
|
||||||
|
|
||||||
ExProfileObjectType->Tag = TAG('P', 'R', 'O', 'F');
|
|
||||||
ExProfileObjectType->PeakObjects = 0;
|
|
||||||
ExProfileObjectType->PeakHandles = 0;
|
|
||||||
ExProfileObjectType->TotalObjects = 0;
|
|
||||||
ExProfileObjectType->TotalHandles = 0;
|
|
||||||
ExProfileObjectType->PagedPoolCharge = 0;
|
|
||||||
ExProfileObjectType->NonpagedPoolCharge = sizeof(KPROFILE);
|
|
||||||
ExProfileObjectType->Mapping = &ExpProfileMapping;
|
|
||||||
ExProfileObjectType->Dump = NULL;
|
|
||||||
ExProfileObjectType->Open = NULL;
|
|
||||||
ExProfileObjectType->Close = NULL;
|
|
||||||
ExProfileObjectType->Delete = KiDeleteProfile;
|
|
||||||
ExProfileObjectType->Parse = NULL;
|
|
||||||
ExProfileObjectType->Security = NULL;
|
|
||||||
ExProfileObjectType->QueryName = NULL;
|
|
||||||
ExProfileObjectType->OkayToClose = NULL;
|
|
||||||
ExProfileObjectType->Create = NULL;
|
|
||||||
|
|
||||||
ObpCreateTypeObject(ExProfileObjectType);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtCreateProfile(OUT PHANDLE ProfileHandle,
|
|
||||||
IN HANDLE Process OPTIONAL,
|
|
||||||
IN PVOID ImageBase,
|
|
||||||
IN ULONG ImageSize,
|
|
||||||
IN ULONG BucketSize,
|
|
||||||
IN PVOID Buffer,
|
|
||||||
IN ULONG BufferSize,
|
|
||||||
IN KPROFILE_SOURCE ProfileSource,
|
|
||||||
IN KAFFINITY Affinity)
|
|
||||||
{
|
|
||||||
HANDLE SafeProfileHandle;
|
|
||||||
NTSTATUS Status;
|
|
||||||
PKPROFILE Profile;
|
|
||||||
PEPROCESS pProcess;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Reference the associated process
|
|
||||||
*/
|
|
||||||
if (Process != NULL)
|
|
||||||
{
|
|
||||||
Status = ObReferenceObjectByHandle(Process,
|
|
||||||
PROCESS_QUERY_INFORMATION,
|
|
||||||
PsProcessType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&pProcess,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pProcess = NULL;
|
|
||||||
/* FIXME: Check privilege. */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check the parameters
|
|
||||||
*/
|
|
||||||
if ((pProcess == NULL && ImageBase < (PVOID)KERNEL_BASE) ||
|
|
||||||
(pProcess != NULL && ImageBase >= (PVOID)KERNEL_BASE))
|
|
||||||
{
|
|
||||||
return(STATUS_INVALID_PARAMETER_3);
|
|
||||||
}
|
|
||||||
if (((ImageSize >> BucketSize) * 4) >= BufferSize)
|
|
||||||
{
|
|
||||||
return(STATUS_BUFFER_TOO_SMALL);
|
|
||||||
}
|
|
||||||
if (ProfileSource != ProfileTime)
|
|
||||||
{
|
|
||||||
return(STATUS_INVALID_PARAMETER_9);
|
|
||||||
}
|
|
||||||
if (Affinity != 0)
|
|
||||||
{
|
|
||||||
return(STATUS_INVALID_PARAMETER_10);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create the object
|
|
||||||
*/
|
|
||||||
Status = ObCreateObject(ExGetPreviousMode(),
|
|
||||||
ExProfileObjectType,
|
|
||||||
NULL,
|
|
||||||
ExGetPreviousMode(),
|
|
||||||
NULL,
|
|
||||||
sizeof(KPROFILE),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
(PVOID*)&Profile);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize it
|
|
||||||
*/
|
|
||||||
Profile->Base = ImageBase;
|
|
||||||
Profile->Size = ImageSize;
|
|
||||||
Profile->BucketShift = BucketSize;
|
|
||||||
Profile->BufferMdl = MmCreateMdl(NULL, Buffer, BufferSize);
|
|
||||||
if(Profile->BufferMdl == NULL) {
|
|
||||||
DPRINT("MmCreateMdl: Out of memory!");
|
|
||||||
return(STATUS_NO_MEMORY);
|
|
||||||
}
|
|
||||||
MmProbeAndLockPages(Profile->BufferMdl, UserMode, IoWriteAccess);
|
|
||||||
Profile->Buffer = MmGetSystemAddressForMdl(Profile->BufferMdl);
|
|
||||||
Profile->BufferSize = BufferSize;
|
|
||||||
Profile->ProcessorMask = Affinity;
|
|
||||||
Profile->Started = FALSE;
|
|
||||||
Profile->Process = pProcess;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Insert the profile into the profile list data structures
|
|
||||||
*/
|
|
||||||
KiInsertProfile(Profile);
|
|
||||||
|
|
||||||
Status = ObInsertObject ((PVOID)Profile,
|
|
||||||
NULL,
|
|
||||||
STANDARD_RIGHTS_ALL,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
&SafeProfileHandle);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
ObDereferenceObject (Profile);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copy the created handle back to the caller
|
|
||||||
*/
|
|
||||||
Status = MmCopyToCaller(ProfileHandle, &SafeProfileHandle, sizeof(HANDLE));
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
ObDereferenceObject(Profile);
|
|
||||||
ZwClose(ProfileHandle);
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
ObDereferenceObject(Profile);
|
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtQueryIntervalProfile(IN KPROFILE_SOURCE ProfileSource,
|
|
||||||
OUT PULONG Interval)
|
|
||||||
{
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
if (ProfileSource == ProfileTime)
|
|
||||||
{
|
|
||||||
ULONG SafeInterval;
|
|
||||||
|
|
||||||
/* FIXME: What units does this use, for now nanoseconds */
|
|
||||||
SafeInterval = 100;
|
|
||||||
Status = MmCopyToCaller(Interval, &SafeInterval, sizeof(ULONG));
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
return(STATUS_INVALID_PARAMETER_2);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtSetIntervalProfile(IN ULONG Interval,
|
|
||||||
IN KPROFILE_SOURCE Source)
|
|
||||||
{
|
|
||||||
return(STATUS_NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtStartProfile(IN HANDLE ProfileHandle)
|
|
||||||
{
|
|
||||||
NTSTATUS Status;
|
|
||||||
PKPROFILE Profile;
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(ProfileHandle,
|
|
||||||
STANDARD_RIGHTS_ALL,
|
|
||||||
ExProfileObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&Profile,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
Profile->Started = TRUE;
|
|
||||||
ObDereferenceObject(Profile);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
NtStopProfile(IN HANDLE ProfileHandle)
|
|
||||||
{
|
|
||||||
NTSTATUS Status;
|
|
||||||
PKPROFILE Profile;
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(ProfileHandle,
|
|
||||||
STANDARD_RIGHTS_ALL,
|
|
||||||
ExProfileObjectType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&Profile,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
Profile->Started = FALSE;
|
|
||||||
ObDereferenceObject(Profile);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
/*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: ntoskrnl/nt/vdm.c
|
|
||||||
* PURPOSE: Virtual DOS machine support
|
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
* Created 22/05/98
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#include <internal/debug.h>
|
|
||||||
|
|
||||||
/* GLOBALS *******************************************************************/
|
|
||||||
|
|
||||||
static UCHAR OrigIVT[1024];
|
|
||||||
static UCHAR OrigBDA[256];
|
|
||||||
/* static UCHAR OrigEBDA[]; */
|
|
||||||
|
|
||||||
extern VOID Ki386RetToV86Mode(PKV86M_REGISTERS InRegs,
|
|
||||||
PKV86M_REGISTERS OutRegs);
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
|
||||||
|
|
||||||
VOID INIT_FUNCTION
|
|
||||||
NtEarlyInitVdm(VOID)
|
|
||||||
{
|
|
||||||
/* GCC 3.4 warns if NULL is passed in parameter 2 to the standard function memcpy */
|
|
||||||
PVOID start = (PVOID)0x0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Save various BIOS data tables. At this point the lower 4MB memory
|
|
||||||
* map is still active so we can just copy the data from low memory.
|
|
||||||
*/
|
|
||||||
memcpy(OrigIVT, start, 1024);
|
|
||||||
memcpy(OrigBDA, (PVOID)0x400, 256);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
NTSTATUS STDCALL NtVdmControl(ULONG ControlCode,
|
|
||||||
PVOID ControlData)
|
|
||||||
{
|
|
||||||
switch (ControlCode)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
memcpy(ControlData, OrigIVT, 1024);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
memcpy(ControlData, OrigBDA, 256);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
{
|
|
||||||
KV86M_REGISTERS V86Registers;
|
|
||||||
ULONG ret;
|
|
||||||
|
|
||||||
ret = MmCopyFromCaller(&V86Registers,
|
|
||||||
ControlData,
|
|
||||||
sizeof(KV86M_REGISTERS));
|
|
||||||
if(!NT_SUCCESS(ret)) return ret;
|
|
||||||
|
|
||||||
KeGetCurrentProcess()->NtVdmFlag = 1;
|
|
||||||
Ki386RetToV86Mode(&V86Registers, &V86Registers);
|
|
||||||
KeGetCurrentProcess()->NtVdmFlag = 0;
|
|
||||||
|
|
||||||
ret = MmCopyToCaller(ControlData,
|
|
||||||
&V86Registers,
|
|
||||||
sizeof(KV86M_REGISTERS));
|
|
||||||
if(!NT_SUCCESS(ret)) return ret;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
|
Loading…
Reference in a new issue