Blame winpr/libwinpr/nt/nt.c

Packit Service fa4841
/**
Packit Service fa4841
 * WinPR: Windows Portable Runtime
Packit Service fa4841
 * Windows Native System Services
Packit Service fa4841
 *
Packit Service fa4841
 * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit Service fa4841
 * Copyright 2013 Thincast Technologies GmbH
Packit Service fa4841
 * Copyright 2013 Norbert Federa <norbert.federa@thincast.com>
Packit Service fa4841
 *
Packit Service fa4841
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit Service fa4841
 * you may not use this file except in compliance with the License.
Packit Service fa4841
 * You may obtain a copy of the License at
Packit Service fa4841
 *
Packit Service fa4841
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit Service fa4841
 *
Packit Service fa4841
 * Unless required by applicable law or agreed to in writing, software
Packit Service fa4841
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit Service fa4841
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service fa4841
 * See the License for the specific language governing permissions and
Packit Service fa4841
 * limitations under the License.
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
#ifdef HAVE_CONFIG_H
Packit Service fa4841
#include "config.h"
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#include <winpr/crt.h>
Packit Service fa4841
#include <winpr/library.h>
Packit Service fa4841
#include <winpr/wlog.h>
Packit Service fa4841
#include <winpr/nt.h>
Packit Service fa4841
#include <winpr/endian.h>
Packit Service fa4841
Packit Service fa4841
#include "../log.h"
Packit Service fa4841
#define TAG WINPR_TAG("nt")
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * NtXxx Routines:
Packit Service fa4841
 * http://msdn.microsoft.com/en-us/library/windows/hardware/ff557720/
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * InitializeObjectAttributes macro
Packit Service fa4841
 * http://msdn.microsoft.com/en-us/library/windows/hardware/ff547804/
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
VOID _InitializeObjectAttributes(POBJECT_ATTRIBUTES InitializedAttributes,
Packit Service b1ea74
                                 PUNICODE_STRING ObjectName, ULONG Attributes, HANDLE RootDirectory,
Packit Service b1ea74
                                 PSECURITY_DESCRIPTOR SecurityDescriptor)
Packit Service fa4841
{
Packit Service fa4841
#if defined(_WIN32) && !defined(_UWP)
Packit Service b1ea74
	InitializeObjectAttributes(InitializedAttributes, ObjectName, Attributes, RootDirectory,
Packit Service b1ea74
	                           SecurityDescriptor);
Packit Service fa4841
#else
Packit Service fa4841
	InitializedAttributes->Length = sizeof(OBJECT_ATTRIBUTES);
Packit Service fa4841
	InitializedAttributes->ObjectName = ObjectName;
Packit Service fa4841
	InitializedAttributes->Attributes = Attributes;
Packit Service fa4841
	InitializedAttributes->RootDirectory = RootDirectory;
Packit Service fa4841
	InitializedAttributes->SecurityDescriptor = SecurityDescriptor;
Packit Service fa4841
	InitializedAttributes->SecurityQualityOfService = NULL;
Packit Service fa4841
#endif
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
#ifndef _WIN32
Packit Service fa4841
Packit Service fa4841
#include <pthread.h>
Packit Service fa4841
#include <winpr/crt.h>
Packit Service fa4841
Packit Service fa4841
#include "../handle/handle.h"
Packit Service fa4841
Packit Service fa4841
struct winpr_nt_file
Packit Service fa4841
{
Packit Service fa4841
	WINPR_HANDLE_DEF();
Packit Service fa4841
Packit Service fa4841
	ACCESS_MASK DesiredAccess;
Packit Service fa4841
	OBJECT_ATTRIBUTES ObjectAttributes;
Packit Service fa4841
	ULONG FileAttributes;
Packit Service fa4841
	ULONG ShareAccess;
Packit Service fa4841
	ULONG CreateDisposition;
Packit Service fa4841
	ULONG CreateOptions;
Packit Service fa4841
};
Packit Service fa4841
typedef struct winpr_nt_file WINPR_NT_FILE;
Packit Service fa4841
Packit Service fa4841
static pthread_once_t _TebOnceControl = PTHREAD_ONCE_INIT;
Packit Service b1ea74
static pthread_key_t _TebKey;
Packit Service fa4841
Packit Service b1ea74
static void _TebDestruct(void* teb)
Packit Service fa4841
{
Packit Service fa4841
	free(teb);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
static void _TebInitOnce(void)
Packit Service fa4841
{
Packit Service fa4841
	pthread_key_create(&_TebKey, _TebDestruct);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
PTEB NtCurrentTeb(void)
Packit Service fa4841
{
Packit Service fa4841
	PTEB teb = NULL;
Packit Service fa4841
Packit Service fa4841
	if (pthread_once(&_TebOnceControl, _TebInitOnce) == 0)
Packit Service fa4841
	{
Packit Service fa4841
		if ((teb = pthread_getspecific(_TebKey)) == NULL)
Packit Service fa4841
		{
Packit Service fa4841
			teb = calloc(1, sizeof(TEB));
Packit Service fa4841
			if (teb)
Packit Service fa4841
				pthread_setspecific(_TebKey, teb);
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
	return teb;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * RtlInitAnsiString routine:
Packit Service fa4841
 * http://msdn.microsoft.com/en-us/library/windows/hardware/ff561918/
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
VOID _RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceString)
Packit Service fa4841
{
Packit Service b1ea74
	DestinationString->Buffer = (PCHAR)SourceString;
Packit Service fa4841
Packit Service fa4841
	if (!SourceString)
Packit Service fa4841
	{
Packit Service fa4841
		DestinationString->Length = 0;
Packit Service fa4841
		DestinationString->MaximumLength = 0;
Packit Service fa4841
	}
Packit Service fa4841
	else
Packit Service fa4841
	{
Packit Service b1ea74
		USHORT length = (USHORT)strlen(SourceString);
Packit Service fa4841
		DestinationString->Length = length;
Packit Service fa4841
		DestinationString->MaximumLength = length + 1;
Packit Service fa4841
	}
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * RtlInitUnicodeString routine:
Packit Service fa4841
 * http://msdn.microsoft.com/en-us/library/windows/hardware/ff561934/
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
VOID _RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
Packit Service fa4841
{
Packit Service b1ea74
	DestinationString->Buffer = (PWSTR)SourceString;
Packit Service fa4841
Packit Service fa4841
	if (!SourceString)
Packit Service fa4841
	{
Packit Service fa4841
		DestinationString->Length = 0;
Packit Service fa4841
		DestinationString->MaximumLength = 0;
Packit Service fa4841
	}
Packit Service fa4841
	else
Packit Service fa4841
	{
Packit Service b1ea74
		USHORT length = (USHORT)_wcslen(SourceString);
Packit Service fa4841
		DestinationString->Length = length * 2;
Packit Service fa4841
		DestinationString->MaximumLength = (length + 1) * 2;
Packit Service fa4841
	}
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * RtlAnsiStringToUnicodeString function:
Packit Service fa4841
 * http://msdn.microsoft.com/en-us/library/ms648413/
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
NTSTATUS _RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString,
Packit Service b1ea74
                                       PCANSI_STRING SourceString,
Packit Service b1ea74
                                       BOOLEAN AllocateDestinationString)
Packit Service fa4841
{
Packit Service fa4841
	int index;
Packit Service fa4841
Packit Service fa4841
	if (!SourceString)
Packit Service fa4841
		return STATUS_INVALID_PARAMETER;
Packit Service fa4841
Packit Service fa4841
	if (AllocateDestinationString)
Packit Service fa4841
	{
Packit Service fa4841
		PWSTR wbuf = NULL;
Packit Service fa4841
Packit Service fa4841
		if (SourceString->MaximumLength)
Packit Service fa4841
		{
Packit Service b1ea74
			if (!(wbuf = (PWSTR)calloc(SourceString->MaximumLength, 2)))
Packit Service fa4841
				return STATUS_NO_MEMORY;
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		DestinationString->MaximumLength = SourceString->MaximumLength * 2;
Packit Service fa4841
		DestinationString->Buffer = wbuf;
Packit Service fa4841
	}
Packit Service fa4841
	else
Packit Service fa4841
	{
Packit Service fa4841
		if (DestinationString->MaximumLength < SourceString->MaximumLength * 2)
Packit Service fa4841
			return STATUS_BUFFER_OVERFLOW;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	for (index = 0; index < SourceString->MaximumLength; index++)
Packit Service fa4841
	{
Packit Service fa4841
		Data_Write_UINT16(&DestinationString->Buffer[index], SourceString->Buffer[index]);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	DestinationString->Length = SourceString->Length * 2;
Packit Service fa4841
Packit Service fa4841
	return STATUS_SUCCESS;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * RtlFreeUnicodeString function:
Packit Service fa4841
 * http://msdn.microsoft.com/en-us/library/ms648418/
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
VOID _RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
Packit Service fa4841
{
Packit Service fa4841
	if (UnicodeString)
Packit Service fa4841
	{
Packit Service fa4841
		free(UnicodeString->Buffer);
Packit Service fa4841
Packit Service fa4841
		UnicodeString->Length = 0;
Packit Service fa4841
		UnicodeString->MaximumLength = 0;
Packit Service fa4841
	}
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * RtlNtStatusToDosError function:
Packit Service fa4841
 * http://msdn.microsoft.com/en-us/library/windows/desktop/ms680600/
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
ULONG _RtlNtStatusToDosError(NTSTATUS status)
Packit Service fa4841
{
Packit Service fa4841
	return status;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * NtCreateFile function:
Packit Service fa4841
 * http://msdn.microsoft.com/en-us/library/bb432380/
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
NTSTATUS _NtCreateFile(PHANDLE FileHandle, ACCESS_MASK DesiredAccess,
Packit Service b1ea74
                       POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock,
Packit Service b1ea74
                       PLARGE_INTEGER AllocationSize, ULONG FileAttributes, ULONG ShareAccess,
Packit Service b1ea74
                       ULONG CreateDisposition, ULONG CreateOptions, PVOID EaBuffer, ULONG EaLength)
Packit Service fa4841
{
Packit Service fa4841
#if 1
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	return STATUS_NOT_SUPPORTED;
Packit Service fa4841
#else
Packit Service fa4841
	WINPR_NT_FILE* pFileHandle;
Packit Service fa4841
Packit Service b1ea74
	pFileHandle = (WINPR_NT_FILE*)calloc(1, sizeof(WINPR_NT_FILE));
Packit Service fa4841
	if (!pFileHandle)
Packit Service fa4841
		return STATUS_NO_MEMORY;
Packit Service fa4841
Packit Service fa4841
	pFileHandle->DesiredAccess = DesiredAccess;
Packit Service fa4841
	pFileHandle->FileAttributes = FileAttributes;
Packit Service fa4841
	pFileHandle->ShareAccess = ShareAccess;
Packit Service fa4841
	pFileHandle->CreateDisposition = CreateDisposition;
Packit Service fa4841
	pFileHandle->CreateOptions = CreateOptions;
Packit Service fa4841
Packit Service b1ea74
	*((PULONG_PTR)FileHandle) = (ULONG_PTR)pFileHandle;
Packit Service fa4841
Packit Service b1ea74
	// STATUS_ACCESS_DENIED
Packit Service b1ea74
	// STATUS_OBJECT_NAME_INVALID
Packit Service b1ea74
	// STATUS_OBJECT_PATH_NOT_FOUND
Packit Service b1ea74
	// STATUS_OBJECT_NAME_NOT_FOUND
Packit Service fa4841
Packit Service fa4841
	return STATUS_SUCCESS;
Packit Service fa4841
#endif
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * NtOpenFile function:
Packit Service fa4841
 * http://msdn.microsoft.com/en-us/library/bb432381/
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
NTSTATUS _NtOpenFile(PHANDLE FileHandle, ACCESS_MASK DesiredAccess,
Packit Service b1ea74
                     POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock,
Packit Service b1ea74
                     ULONG ShareAccess, ULONG OpenOptions)
Packit Service fa4841
{
Packit Service fa4841
#if 1
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	return STATUS_NOT_SUPPORTED;
Packit Service fa4841
#else
Packit Service fa4841
	WINPR_NT_FILE* pFileHandle;
Packit Service fa4841
Packit Service b1ea74
	pFileHandle = (WINPR_NT_FILE*)calloc(1, sizeof(WINPR_NT_FILE));
Packit Service fa4841
Packit Service fa4841
	if (!pFileHandle)
Packit Service fa4841
		return STATUS_NO_MEMORY;
Packit Service fa4841
Packit Service fa4841
	pFileHandle->DesiredAccess = DesiredAccess;
Packit Service fa4841
	pFileHandle->ShareAccess = ShareAccess;
Packit Service fa4841
Packit Service b1ea74
	*((PULONG_PTR)FileHandle) = (ULONG_PTR)pFileHandle;
Packit Service fa4841
Packit Service fa4841
	return STATUS_SUCCESS;
Packit Service fa4841
#endif
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * NtReadFile function:
Packit Service fa4841
 * http://msdn.microsoft.com/en-us/library/windows/hardware/ff567072/
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
NTSTATUS _NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
Packit Service b1ea74
                     PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length,
Packit Service b1ea74
                     PLARGE_INTEGER ByteOffset, PULONG Key)
Packit Service fa4841
{
Packit Service fa4841
#if 1
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	return STATUS_NOT_SUPPORTED;
Packit Service fa4841
#else
Packit Service fa4841
	return STATUS_SUCCESS;
Packit Service fa4841
#endif
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * NtWriteFile function:
Packit Service fa4841
 * http://msdn.microsoft.com/en-us/library/windows/hardware/ff567121/
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
NTSTATUS _NtWriteFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
Packit Service b1ea74
                      PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length,
Packit Service b1ea74
                      PLARGE_INTEGER ByteOffset, PULONG Key)
Packit Service fa4841
{
Packit Service fa4841
#if 1
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	return STATUS_NOT_SUPPORTED;
Packit Service fa4841
#else
Packit Service fa4841
	return STATUS_SUCCESS;
Packit Service fa4841
#endif
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * NtDeviceIoControlFile function:
Packit Service fa4841
 * http://msdn.microsoft.com/en-us/library/ms648411/
Packit Service fa4841
 */
Packit Service fa4841
Packit Service b1ea74
NTSTATUS _NtDeviceIoControlFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine,
Packit Service b1ea74
                                PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock,
Packit Service b1ea74
                                ULONG IoControlCode, PVOID InputBuffer, ULONG InputBufferLength,
Packit Service b1ea74
                                PVOID OutputBuffer, ULONG OutputBufferLength)
Packit Service fa4841
{
Packit Service fa4841
#if 1
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	return STATUS_NOT_SUPPORTED;
Packit Service fa4841
#else
Packit Service fa4841
	return STATUS_SUCCESS;
Packit Service fa4841
#endif
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * NtClose function:
Packit Service fa4841
 * http://msdn.microsoft.com/en-us/library/ms648410/
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
NTSTATUS _NtClose(HANDLE Handle)
Packit Service fa4841
{
Packit Service fa4841
#if 1
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	return STATUS_NOT_SUPPORTED;
Packit Service fa4841
#else
Packit Service fa4841
	WINPR_NT_FILE* pFileHandle;
Packit Service fa4841
Packit Service fa4841
	if (!Handle)
Packit Service fa4841
		return STATUS_SUCCESS;
Packit Service fa4841
Packit Service b1ea74
	pFileHandle = (WINPR_NT_FILE*)Handle;
Packit Service fa4841
Packit Service fa4841
	free(pFileHandle);
Packit Service fa4841
Packit Service fa4841
	return STATUS_SUCCESS;
Packit Service fa4841
#endif
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * NtWaitForSingleObject function:
Packit Service fa4841
 * http://msdn.microsoft.com/en-us/library/ms648412/
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
NTSTATUS _NtWaitForSingleObject(HANDLE Handle, BOOLEAN Alertable, PLARGE_INTEGER Timeout)
Packit Service fa4841
{
Packit Service fa4841
#if 1
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	return STATUS_NOT_SUPPORTED;
Packit Service fa4841
#else
Packit Service fa4841
	return STATUS_SUCCESS;
Packit Service fa4841
#endif
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
#else
Packit Service fa4841
Packit Service fa4841
#include <winpr/synch.h>
Packit Service fa4841
Packit Service b1ea74
typedef VOID(WINAPI* RTL_INIT_ANSI_STRING_FN)(PANSI_STRING DestinationString, PCSZ SourceString);
Packit Service fa4841
Packit Service b1ea74
typedef VOID(WINAPI* RTL_INIT_UNICODE_STRING_FN)(PUNICODE_STRING DestinationString,
Packit Service b1ea74
                                                 PCWSTR SourceString);
Packit Service fa4841
Packit Service b1ea74
typedef NTSTATUS(WINAPI* RTL_ANSI_STRING_TO_UNICODE_STRING_FN)(PUNICODE_STRING DestinationString,
Packit Service b1ea74
                                                               PCANSI_STRING SourceString,
Packit Service b1ea74
                                                               BOOLEAN AllocateDestinationString);
Packit Service fa4841
Packit Service b1ea74
typedef VOID(WINAPI* RTL_FREE_UNICODE_STRING_FN)(PUNICODE_STRING UnicodeString);
Packit Service fa4841
Packit Service b1ea74
typedef ULONG(WINAPI* RTL_NT_STATUS_TO_DOS_ERROR_FN)(NTSTATUS status);
Packit Service fa4841
Packit Service b1ea74
typedef NTSTATUS(WINAPI* NT_CREATE_FILE_FN)(PHANDLE FileHandle, ACCESS_MASK DesiredAccess,
Packit Service b1ea74
                                            POBJECT_ATTRIBUTES ObjectAttributes,
Packit Service b1ea74
                                            PIO_STATUS_BLOCK IoStatusBlock,
Packit Service b1ea74
                                            PLARGE_INTEGER AllocationSize, ULONG FileAttributes,
Packit Service b1ea74
                                            ULONG ShareAccess, ULONG CreateDisposition,
Packit Service b1ea74
                                            ULONG CreateOptions, PVOID EaBuffer, ULONG EaLength);
Packit Service fa4841
Packit Service b1ea74
typedef NTSTATUS(WINAPI* NT_OPEN_FILE_FN)(PHANDLE FileHandle, ACCESS_MASK DesiredAccess,
Packit Service b1ea74
                                          POBJECT_ATTRIBUTES ObjectAttributes,
Packit Service b1ea74
                                          PIO_STATUS_BLOCK IoStatusBlock, ULONG ShareAccess,
Packit Service b1ea74
                                          ULONG OpenOptions);
Packit Service fa4841
Packit Service b1ea74
typedef NTSTATUS(WINAPI* NT_READ_FILE_FN)(HANDLE FileHandle, HANDLE Event,
Packit Service b1ea74
                                          PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
Packit Service b1ea74
                                          PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer,
Packit Service b1ea74
                                          ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key);
Packit Service fa4841
Packit Service b1ea74
typedef NTSTATUS(WINAPI* NT_WRITE_FILE_FN)(HANDLE FileHandle, HANDLE Event,
Packit Service b1ea74
                                           PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
Packit Service b1ea74
                                           PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer,
Packit Service b1ea74
                                           ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key);
Packit Service fa4841
Packit Service b1ea74
typedef NTSTATUS(WINAPI* NT_DEVICE_IO_CONTROL_FILE_FN)(HANDLE FileHandle, HANDLE Event,
Packit Service b1ea74
                                                       PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
Packit Service b1ea74
                                                       PIO_STATUS_BLOCK IoStatusBlock,
Packit Service b1ea74
                                                       ULONG IoControlCode, PVOID InputBuffer,
Packit Service b1ea74
                                                       ULONG InputBufferLength, PVOID OutputBuffer,
Packit Service b1ea74
                                                       ULONG OutputBufferLength);
Packit Service fa4841
Packit Service b1ea74
typedef NTSTATUS(WINAPI* NT_CLOSE_FN)(HANDLE Handle);
Packit Service fa4841
Packit Service b1ea74
typedef NTSTATUS(WINAPI* NT_WAIT_FOR_SINGLE_OBJECT_FN)(HANDLE Handle, BOOLEAN Alertable,
Packit Service b1ea74
                                                       PLARGE_INTEGER Timeout);
Packit Service fa4841
Packit Service fa4841
static RTL_INIT_ANSI_STRING_FN pRtlInitAnsiString = NULL;
Packit Service fa4841
static RTL_INIT_UNICODE_STRING_FN pRtlInitUnicodeString = NULL;
Packit Service fa4841
static RTL_ANSI_STRING_TO_UNICODE_STRING_FN pRtlAnsiStringToUnicodeString = NULL;
Packit Service fa4841
static RTL_FREE_UNICODE_STRING_FN pRtlFreeUnicodeString = NULL;
Packit Service fa4841
static RTL_NT_STATUS_TO_DOS_ERROR_FN pRtlNtStatusToDosError = NULL;
Packit Service fa4841
static NT_CREATE_FILE_FN pNtCreateFile = NULL;
Packit Service fa4841
static NT_OPEN_FILE_FN pNtOpenFile = NULL;
Packit Service fa4841
static NT_READ_FILE_FN pNtReadFile = NULL;
Packit Service fa4841
static NT_WRITE_FILE_FN pNtWriteFile = NULL;
Packit Service fa4841
static NT_DEVICE_IO_CONTROL_FILE_FN pNtDeviceIoControlFile = NULL;
Packit Service fa4841
static NT_CLOSE_FN pNtClose = NULL;
Packit Service fa4841
static NT_WAIT_FOR_SINGLE_OBJECT_FN pNtWaitForSingleObject = NULL;
Packit Service fa4841
Packit Service fa4841
static INIT_ONCE ntdllInitOnce = INIT_ONCE_STATIC_INIT;
Packit Service fa4841
Packit Service b1ea74
static BOOL CALLBACK NtdllModuleInit(PINIT_ONCE once, PVOID param, PVOID* context)
Packit Service fa4841
{
Packit Service fa4841
	HMODULE NtdllModule = LoadLibraryA("ntdll.dll");
Packit Service fa4841
Packit Service fa4841
	if (NtdllModule)
Packit Service fa4841
	{
Packit Service b1ea74
		pRtlInitAnsiString =
Packit Service b1ea74
		    (RTL_INIT_ANSI_STRING_FN)GetProcAddress(NtdllModule, "RtlInitAnsiString");
Packit Service b1ea74
		pRtlInitUnicodeString =
Packit Service b1ea74
		    (RTL_INIT_UNICODE_STRING_FN)GetProcAddress(NtdllModule, "RtlInitUnicodeString");
Packit Service b1ea74
		pRtlAnsiStringToUnicodeString = (RTL_ANSI_STRING_TO_UNICODE_STRING_FN)GetProcAddress(
Packit Service b1ea74
		    NtdllModule, "RtlAnsiStringToUnicodeString");
Packit Service b1ea74
		pRtlFreeUnicodeString =
Packit Service b1ea74
		    (RTL_FREE_UNICODE_STRING_FN)GetProcAddress(NtdllModule, "RtlFreeUnicodeString");
Packit Service b1ea74
		pRtlNtStatusToDosError =
Packit Service b1ea74
		    (RTL_NT_STATUS_TO_DOS_ERROR_FN)GetProcAddress(NtdllModule, "RtlNtStatusToDosError");
Packit Service fa4841
		pNtCreateFile = (NT_CREATE_FILE_FN)GetProcAddress(NtdllModule, "NtCreateFile");
Packit Service fa4841
		pNtOpenFile = (NT_OPEN_FILE_FN)GetProcAddress(NtdllModule, "NtOpenFile");
Packit Service fa4841
		pNtReadFile = (NT_READ_FILE_FN)GetProcAddress(NtdllModule, "NtReadFile");
Packit Service fa4841
		pNtWriteFile = (NT_WRITE_FILE_FN)GetProcAddress(NtdllModule, "NtWriteFile");
Packit Service b1ea74
		pNtDeviceIoControlFile =
Packit Service b1ea74
		    (NT_DEVICE_IO_CONTROL_FILE_FN)GetProcAddress(NtdllModule, "NtDeviceIoControlFile");
Packit Service fa4841
		pNtClose = (NT_CLOSE_FN)GetProcAddress(NtdllModule, "NtClose");
Packit Service b1ea74
		pNtWaitForSingleObject =
Packit Service b1ea74
		    (NT_WAIT_FOR_SINGLE_OBJECT_FN)GetProcAddress(NtdllModule, "NtWaitForSingleObject");
Packit Service fa4841
	}
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
VOID _RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceString)
Packit Service fa4841
{
Packit Service fa4841
	InitOnceExecuteOnce(&ntdllInitOnce, NtdllModuleInit, NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!pRtlInitAnsiString)
Packit Service fa4841
		return;
Packit Service fa4841
Packit Service fa4841
	pRtlInitAnsiString(DestinationString, SourceString);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
VOID _RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
Packit Service fa4841
{
Packit Service fa4841
	InitOnceExecuteOnce(&ntdllInitOnce, NtdllModuleInit, NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!pRtlInitUnicodeString)
Packit Service fa4841
		return;
Packit Service fa4841
Packit Service fa4841
	pRtlInitUnicodeString(DestinationString, SourceString);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
NTSTATUS _RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString,
Packit Service b1ea74
                                       PCANSI_STRING SourceString,
Packit Service b1ea74
                                       BOOLEAN AllocateDestinationString)
Packit Service fa4841
{
Packit Service fa4841
	InitOnceExecuteOnce(&ntdllInitOnce, NtdllModuleInit, NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!pRtlAnsiStringToUnicodeString)
Packit Service fa4841
		return STATUS_INTERNAL_ERROR;
Packit Service fa4841
Packit Service b1ea74
	return pRtlAnsiStringToUnicodeString(DestinationString, SourceString,
Packit Service b1ea74
	                                     AllocateDestinationString);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
VOID _RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
Packit Service fa4841
{
Packit Service fa4841
	InitOnceExecuteOnce(&ntdllInitOnce, NtdllModuleInit, NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!pRtlFreeUnicodeString)
Packit Service fa4841
		return;
Packit Service fa4841
Packit Service fa4841
	pRtlFreeUnicodeString(UnicodeString);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
ULONG _RtlNtStatusToDosError(NTSTATUS status)
Packit Service fa4841
{
Packit Service fa4841
	InitOnceExecuteOnce(&ntdllInitOnce, NtdllModuleInit, NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!pRtlNtStatusToDosError)
Packit Service fa4841
		return status;
Packit Service fa4841
Packit Service fa4841
	return pRtlNtStatusToDosError(status);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
NTSTATUS _NtCreateFile(PHANDLE FileHandle, ACCESS_MASK DesiredAccess,
Packit Service b1ea74
                       POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock,
Packit Service b1ea74
                       PLARGE_INTEGER AllocationSize, ULONG FileAttributes, ULONG ShareAccess,
Packit Service b1ea74
                       ULONG CreateDisposition, ULONG CreateOptions, PVOID EaBuffer, ULONG EaLength)
Packit Service fa4841
{
Packit Service fa4841
	InitOnceExecuteOnce(&ntdllInitOnce, NtdllModuleInit, NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!pNtCreateFile)
Packit Service fa4841
		return STATUS_INTERNAL_ERROR;
Packit Service fa4841
Packit Service b1ea74
	return pNtCreateFile(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize,
Packit Service b1ea74
	                     FileAttributes, ShareAccess, CreateDisposition, CreateOptions, EaBuffer,
Packit Service b1ea74
	                     EaLength);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
NTSTATUS _NtOpenFile(PHANDLE FileHandle, ACCESS_MASK DesiredAccess,
Packit Service b1ea74
                     POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock,
Packit Service b1ea74
                     ULONG ShareAccess, ULONG OpenOptions)
Packit Service fa4841
{
Packit Service fa4841
	InitOnceExecuteOnce(&ntdllInitOnce, NtdllModuleInit, NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!pNtOpenFile)
Packit Service fa4841
		return STATUS_INTERNAL_ERROR;
Packit Service fa4841
Packit Service b1ea74
	return pNtOpenFile(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess,
Packit Service b1ea74
	                   OpenOptions);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
NTSTATUS _NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
Packit Service b1ea74
                     PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length,
Packit Service b1ea74
                     PLARGE_INTEGER ByteOffset, PULONG Key)
Packit Service fa4841
{
Packit Service fa4841
	InitOnceExecuteOnce(&ntdllInitOnce, NtdllModuleInit, NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!pNtReadFile)
Packit Service fa4841
		return STATUS_INTERNAL_ERROR;
Packit Service fa4841
Packit Service b1ea74
	return pNtReadFile(FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, Buffer, Length,
Packit Service b1ea74
	                   ByteOffset, Key);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
NTSTATUS _NtWriteFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
Packit Service b1ea74
                      PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length,
Packit Service b1ea74
                      PLARGE_INTEGER ByteOffset, PULONG Key)
Packit Service fa4841
{
Packit Service fa4841
	InitOnceExecuteOnce(&ntdllInitOnce, NtdllModuleInit, NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!pNtWriteFile)
Packit Service fa4841
		return STATUS_INTERNAL_ERROR;
Packit Service fa4841
Packit Service b1ea74
	return pNtWriteFile(FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, Buffer, Length,
Packit Service b1ea74
	                    ByteOffset, Key);
Packit Service fa4841
}
Packit Service fa4841
Packit Service b1ea74
NTSTATUS _NtDeviceIoControlFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine,
Packit Service b1ea74
                                PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock,
Packit Service b1ea74
                                ULONG IoControlCode, PVOID InputBuffer, ULONG InputBufferLength,
Packit Service b1ea74
                                PVOID OutputBuffer, ULONG OutputBufferLength)
Packit Service fa4841
{
Packit Service fa4841
	InitOnceExecuteOnce(&ntdllInitOnce, NtdllModuleInit, NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!pNtDeviceIoControlFile)
Packit Service fa4841
		return STATUS_INTERNAL_ERROR;
Packit Service fa4841
Packit Service b1ea74
	return pNtDeviceIoControlFile(FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock,
Packit Service b1ea74
	                              IoControlCode, InputBuffer, InputBufferLength, OutputBuffer,
Packit Service b1ea74
	                              OutputBufferLength);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
NTSTATUS _NtClose(HANDLE Handle)
Packit Service fa4841
{
Packit Service fa4841
	InitOnceExecuteOnce(&ntdllInitOnce, NtdllModuleInit, NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!pNtClose)
Packit Service fa4841
		return STATUS_INTERNAL_ERROR;
Packit Service fa4841
Packit Service fa4841
	return pNtClose(Handle);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
NTSTATUS _NtWaitForSingleObject(HANDLE Handle, BOOLEAN Alertable, PLARGE_INTEGER Timeout)
Packit Service fa4841
{
Packit Service fa4841
	InitOnceExecuteOnce(&ntdllInitOnce, NtdllModuleInit, NULL, NULL);
Packit Service fa4841
Packit Service fa4841
	if (!pNtWaitForSingleObject)
Packit Service fa4841
		return STATUS_INTERNAL_ERROR;
Packit Service fa4841
Packit Service fa4841
	return pNtWaitForSingleObject(Handle, Alertable, Timeout);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
#endif