NtCreateSemaphore
NTSTATUS __stdcall NtCreateSemaphore(
VOID **SemaphoreHandle,
_ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
INT64 InitialCount,
INT64 MaximumCount){
INT32 v5;
VOID **v7;
unsigned __int8 v8;
int Object;
VOID *Flags;
UINT64 Flagsa;
UINT64 ObjectBodySize;
UINT64 PagedPoolCharge;
UINT64 NonPagedPoolCharge;
PRKSEMAPHORE Semaphore;
PVOID Handle;
v5 = InitialCount;
v7 = SemaphoreHandle;
Handle = 0i64;
Semaphore = 0i64;
v8 = KeGetCurrentThread()->$87BC921A506A176A34DE473FC146A343::gap0[10];
if( v8 )
{
if( (unsigned __int64)SemaphoreHandle >= 0x7FFFFFFF0000i64 )
SemaphoreHandle = (VOID **)0x7FFFFFFF0000i64;
*SemaphoreHandle = *SemaphoreHandle;
}
if( (int)MaximumCount <= 0 || (int)InitialCount < 0 || (int)InitialCount > (int)MaximumCount )
return -1073741811;
LODWORD(NonPagedPoolCharge) = 0;
LODWORD(PagedPoolCharge) = 0;
LODWORD(ObjectBodySize) = 32;
Object = ObCreateObjectEx(
v8,
(_OBJECT_TYPE *)ExSemaphoreObjectType,
ObjectAttributes,
v8,
Flags,
ObjectBodySize,
PagedPoolCharge,
NonPagedPoolCharge,
(VOID **)&Semaphore,
0i64);
if( Object >= 0 )
{
KeInitializeSemaphore(Semaphore, v5, MaximumCount);
LODWORD(Flagsa) = 0;
Object = ObInsertObjectEx(Semaphore, 0i64, (unsigned int)DesiredAccess, 0i64, Flagsa, 0i64, &Handle);
LODWORD(Semaphore) = Object;
if( Object >= 0 )
*v7 = Handle;
}
return Object;
}Referenced by:
No references.