require "c/ntdef"
require "c/winnt"
require "c/ntstatus"

@[Link("ntdll")]
lib LibNTDLL
  alias NTSTATUS = LibC::NTSTATUS
  alias ACCESS_MASK = LibC::DWORD

  GENERIC_ALL = 0x10000000_u32

  alias NtCreateWaitCompletionPacketProc = Proc(LibC::HANDLE*, ACCESS_MASK, LibC::OBJECT_ATTRIBUTES*, NTSTATUS)
  alias NtAssociateWaitCompletionPacketProc = Proc(LibC::HANDLE, LibC::HANDLE, LibC::HANDLE, Void*, Void*, NTSTATUS, LibC::ULONG*, LibC::BOOLEAN*, NTSTATUS)
  alias NtCancelWaitCompletionPacketProc = Proc(LibC::HANDLE, LibC::BOOLEAN, NTSTATUS)

  fun NtCreateWaitCompletionPacket(
    waitCompletionPacketHandle : LibC::HANDLE*,
    desiredAccess : ACCESS_MASK,
    objectAttributes : LibC::OBJECT_ATTRIBUTES*,
  ) : NTSTATUS

  fun NtAssociateWaitCompletionPacket(
    waitCompletionPacketHandle : LibC::HANDLE,
    ioCompletionHandle : LibC::HANDLE,
    targetObjectHandle : LibC::HANDLE,
    keyContext : Void*,
    apcContext : Void*,
    ioStatus : NTSTATUS,
    ioStatusInformation : LibC::ULONG*,
    alreadySignaled : LibC::BOOLEAN*,
  ) : NTSTATUS

  fun NtCancelWaitCompletionPacket(
    waitCompletionPacketHandle : LibC::HANDLE,
    removeSignaledPacket : LibC::BOOLEAN,
  ) : NTSTATUS
end
