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.