NtCreateIoCompletion

NTSTATUS __stdcall NtCreateIoCompletion(
        VOID **IoCompletionHandle,
        _ACCESS_MASK DesiredAccess,
        POBJECT_ATTRIBUTES ObjectAttributes,
        UINT64 Count,
        VOID *a5){
  unsigned int v5; 
  VOID **v7; 
  char PreviousMode; 
  int Object; 
  UINT64 v10; 
  _KQUEUE *v11; 
  VOID *v13; 
  VOID *v14; 
  UINT64 ObjectBodySize; 
  PVOID *Handle; 
  UINT64 v17; 
  PVOID v18; 
  _KQUEUE *Queue; 

  v5 = Count;
  v7 = IoCompletionHandle;
  v18 = 0i64;
  Queue = 0i64;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( PreviousMode )
  {
    IoCompletionHandle = (VOID **)0x7FFFFFFF0000i64;
    if( (unsigned __int64)v7 < 0x7FFFFFFF0000i64 )
      IoCompletionHandle = v7;
    *IoCompletionHandle = *IoCompletionHandle;
  }
  LODWORD(v17) = 0;
  LODWORD(Handle) = 0;
  LODWORD(ObjectBodySize) = 80;
  LOBYTE(Count) = PreviousMode;
  LOBYTE(IoCompletionHandle) = PreviousMode;
  Object = ObCreateObjectEx(
             (UINT64)IoCompletionHandle,
             IoCompletionObjectType,
             ObjectAttributes,
             Count,
             v13,
             ObjectBodySize,
             (UINT64)Handle,
             v17,
             (VOID **)&Queue,
             0i64);
  if( Object >= 0 )
  {
    v10 = v5;
    v11 = Queue;
    KeInitializeQueue(Queue, v10);
    *((_QWORD *)v11 + 8) = 0i64;
    *((_BYTE *)v11 + 72) = 0;
    LODWORD(v14) = 0;
    Object = ObInsertObjectEx(v11, 0i64, (unsigned int)DesiredAccess, 0i64, (UINT64)v14, 0i64, &v18);
    if( Object >= 0 )
      *v7 = v18;
  }
  return Object;
}

Referenced by:

No references.