////////////////////////////////////////////////////////////////////
// Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
// All rights reserved
// This file was released under the GPLv2 on June 2015.
////////////////////////////////////////////////////////////////////

#ifndef __ENV_SPEC_NT_NATIVE__H__
#define __ENV_SPEC_NT_NATIVE__H__

#ifdef NT_NATIVE_MODE

#include "zw_2_nt.h"

#ifdef __cplusplus
extern "C" {
#endif //__cplusplus

#ifndef MAX_PATH
#define MAX_PATH   260
#endif //MAX_PATH

BOOLEAN
GetOsVersion(
    PULONG MajorVersion OPTIONAL,
    PULONG MinorVersion OPTIONAL,
    PULONG BuildNumber OPTIONAL,
    PUNICODE_STRING CSDVersion OPTIONAL
    );

#define PsGetVersion(a,b,c,d)  GetOsVersion(a,b,c,d)

#define InterlockedIncrement(addr) \
    ((*addr)++)
#define InterlockedDecrement(addr) \
    ((*addr)--)
int
__inline
InterlockedExchangeAdd(PLONG addr, LONG i) {
    LONG Old = (*addr);
    (*addr) += i;
    return Old;
}

#define DeviceIoControl(h, ctlc, ib, is, ob, os, r, ov)  MyDeviceIoControl(h, ctlc, ib, is, ob, os, r, ov)  

BOOLEAN
MyDeviceIoControl(
    HANDLE hDevice,
    DWORD  dwIoControlCode,
    PVOID  lpInBuffer,
    DWORD  nInBufferSize,
    PVOID  lpOutBuffer,
    DWORD  nOutBufferSize,
    DWORD* lpBytesReturned,
    PVOID  lpOverlapped
    );

#define OemToCharW(ansi_s, uni_s)    (swprintf(uni_s, L"%S", ansi_s))
#define MultiByteToWideChar(cp, f, ansi_s, a_sz, uni_s, u_sz)  (swprintf(uni_s, L"%S", ansi_s))

VOID
Sleep(
    ULONG t
    );

#define GlobalAlloc(foo, size)  MyGlobalAlloc( size );
#define GlobalFree(ptr)         MyGlobalFree( ptr );

extern "C"
PVOID MyGlobalAlloc(ULONG Size);

extern "C"
VOID  MyGlobalFree(PVOID Addr);

#define ExitProcess(Status)    NtTerminateProcess( NtCurrentProcess(), Status );

extern "C"
VOID
PrintNtConsole(
    PCHAR DebugMessage,
    ...
    );

extern "C"
NTSTATUS
EnvFileOpenW(
    PWCHAR Name,
    HANDLE* ph
    );

extern "C"
NTSTATUS
EnvFileOpenA(
    PCHAR Name,
    HANDLE* ph
    );

extern "C"
NTSTATUS
EnvFileClose(
    HANDLE hFile
    );

extern "C"
NTSTATUS
EnvFileGetSizeByHandle(
    HANDLE hFile,
    PLONGLONG lpFileSize
    );

extern "C"
NTSTATUS
EnvFileGetSizeA(
    PCHAR Name,
    PLONGLONG lpFileSize
    );

extern "C"
NTSTATUS
EnvFileGetSizeW(
    PWCHAR Name,
    PLONGLONG lpFileSize
    );

extern "C"
BOOLEAN
EnvFileExistsA(PCHAR Name);

extern "C"
BOOLEAN
EnvFileExistsW(PWCHAR Name);

extern "C"
NTSTATUS
EnvFileWrite(
    HANDLE h,
    PVOID ioBuffer,
    ULONG Length,
    PULONG bytesWritten
    );

extern "C"
NTSTATUS
EnvFileRead(
    HANDLE h,
    PVOID ioBuffer,
    ULONG Length,
    PULONG bytesRead
    );

#define ENV_FILE_CURRENT  1
#define ENV_FILE_END      2
#define ENV_FILE_BEGIN    3

extern "C"
NTSTATUS
EnvFileSetPointer(
    HANDLE hFile,
    LONGLONG lDistanceToMove,
    LONGLONG* lResultPointer,
    DWORD dwMoveMethod
    );

extern "C"
NTSTATUS 
EnvFileDeleteW(
    PWCHAR fName
    );

#define PrintDbgConsole    PrintNtConsole

#ifdef __cplusplus
};
#endif //__cplusplus

#endif //NT_NATIVE_MODE

#endif //__ENV_SPEC_NT_NATIVE__H__