Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597////////////////////////////////////////////////////////////////////// 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.////////////////////////////////////////////////////////////////////
#ifdef NT_NATIVE_MODE
#include "regtools.h"#include <stdarg.h>
/*typedef BOOLEAN (*PPsGetVersion) ( PULONG MajorVersion OPTIONAL, PULONG MinorVersion OPTIONAL, PULONG BuildNumber OPTIONAL, PUNICODE_STRING CSDVersion OPTIONAL );
//PPsGetVersion _PsGetVersion = PsGetVersion;
/*NTSTATUSKernelGetProcAddress( PWCHAR DllName, PUCHAR ProcName, PVOID* ProcAddr ){ NTSTATUS RC; HANDLE h; UNICODE_STRING uname; ANSI_STRING aname;
RtlInitUnicodeString(&uname, DllName); *ProcAddr = NULL;
// RC = LdrGetDllHandle(NULL, NULL, &uname, &h); if(!NT_SUCCESS(RC)) return RC;
RtlInitAnsiString(&aname, ProcName);
// RC = LdrGetProcedureAddress(h, &aname, 0, ProcAddr); return RC;} */
BOOLEANGetOsVersion( PULONG MajorVersion OPTIONAL, PULONG MinorVersion OPTIONAL, PULONG BuildNumber OPTIONAL, PUNICODE_STRING CSDVersion OPTIONAL ){ WCHAR Str[32]; ULONG mn=0, mj=0, bld=0;
// if(_PsGetVersion)// return _PsGetVersion(MajorVersion, MinorVersion, BuildNumber, CSDVersion);
RtlZeroMemory(Str, sizeof(Str)); if(RegTGetStringValue(NULL, L"\\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", L"CurrentVersion", &Str[0], sizeof(Str)-sizeof(WCHAR))) { ULONG i=0; WCHAR a; while(a = Str[i]) { if(a == '.') break; if(a < '0' || a > '9') break; mj = mj*16 + (a-'0'); i++; } i++; while(a = Str[i]) { if(a == '.') break; if(a < '0' || a > '9') break; mn = mn*16 + (a-'0'); i++; } }
if(RegTGetStringValue(NULL, L"\\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", L"CurrentBuildNumber", &Str[0], sizeof(Str)-sizeof(WCHAR))) { ULONG i=0; WCHAR a; while(a = Str[i]) { if(a < '0' || a > '9') break; bld = bld*10 + (a-'0'); i++; } } if(MajorVersion) *MajorVersion = mj; if(MinorVersion) *MinorVersion = mn; if(BuildNumber) *BuildNumber = bld; return TRUE;}
BOOLEANMyDeviceIoControl( HANDLE h, DWORD dwIoControlCode, PVOID lpInBuffer, DWORD nInBufferSize, PVOID lpOutBuffer, DWORD nOutBufferSize, DWORD* lpBytesReturned, PVOID lpOverlapped ){
NTSTATUS RC; BOOLEAN DevIoCtl = TRUE; IO_STATUS_BLOCK Iosb;
if ( dwIoControlCode >> 16 == FILE_DEVICE_FILE_SYSTEM ) { DevIoCtl = FALSE; } else { DevIoCtl = TRUE; }
if ( DevIoCtl ) { RC = NtDeviceIoControlFile( h, NULL, NULL, // APC routine NULL, // APC Context &Iosb, dwIoControlCode, // IoControlCode lpInBuffer, // Buffer for data to the FS nInBufferSize, lpOutBuffer, // OutputBuffer for data from the FS nOutBufferSize // OutputBuffer Length ); } else { RC = NtFsControlFile( h, NULL, NULL, // APC routine NULL, // APC Context &Iosb, dwIoControlCode, // IoControlCode lpInBuffer, // Buffer for data to the FS nInBufferSize, lpOutBuffer, // OutputBuffer for data from the FS nOutBufferSize // OutputBuffer Length ); }
if ( RC == STATUS_PENDING) { // Operation must complete before return & Iosb destroyed RC = NtWaitForSingleObject( h, FALSE, NULL ); if ( NT_SUCCESS(RC)) { RC = Iosb.Status; } }
if ( NT_SUCCESS(RC) ) { *lpBytesReturned = Iosb.Information; return TRUE; } else { // handle warning value STATUS_BUFFER_OVERFLOW somewhat correctly if ( !NT_ERROR(RC) ) { *lpBytesReturned = Iosb.Information; } return FALSE; }}
VOIDSleep( ULONG t ){ LARGE_INTEGER delay = {0,0}; delay.QuadPart = -10I64*1000*t; NtDelayExecution(FALSE, &delay);}
HANDLE hGlobalHeap = NULL;
extern "C"PVOIDMyGlobalAlloc( ULONG Size ){ if(!hGlobalHeap) { // Initialize some heap hGlobalHeap = RtlCreateHeap( HEAP_GROWABLE, // Flags NULL, // HeapBase 0, // ReserveSize 0, // CommitSize NULL, // Lock NULL ); // Parameters if(!hGlobalHeap || hGlobalHeap == (HANDLE)(-1)) { hGlobalHeap = NULL; return NULL; } } return RtlAllocateHeap( hGlobalHeap, 0, Size );}
extern "C"VOIDMyGlobalFree( PVOID Addr ){ if(!hGlobalHeap) {// BrutePoint(); return; } RtlFreeHeap( hGlobalHeap, 0, Addr ); return;}
CHAR dbg_print_tmp_buff[2048];WCHAR dbg_stringBuffer[2048];
BOOLEAN was_enter = TRUE;
extern "C"VOIDPrintNtConsole( PCHAR DebugMessage, ... ){ int len; UNICODE_STRING msgBuff; va_list ap; va_start(ap, DebugMessage);
if(was_enter) { strcpy(&dbg_print_tmp_buff[0], NT_DBG_PREFIX); len = _vsnprintf(&dbg_print_tmp_buff[sizeof(NT_DBG_PREFIX)-1], 2047-sizeof(NT_DBG_PREFIX), DebugMessage, ap); } else { len = _vsnprintf(&dbg_print_tmp_buff[0], 2047, DebugMessage, ap); } dbg_print_tmp_buff[2047] = 0; if(len > 0 && (dbg_print_tmp_buff[len-1] == '\n' || dbg_print_tmp_buff[len-1] == '\r') ) { was_enter = TRUE; } else { was_enter = FALSE; }
len = swprintf( dbg_stringBuffer, L"%S", dbg_print_tmp_buff ); msgBuff.Buffer = dbg_stringBuffer; msgBuff.Length = len * sizeof(WCHAR); msgBuff.MaximumLength = msgBuff.Length + sizeof(WCHAR); NtDisplayString( &msgBuff );
va_end(ap);
} // end PrintNtConsole()
extern "C"NTSTATUSEnvFileOpenW( PWCHAR Name, HANDLE* ph ){ OBJECT_ATTRIBUTES ObjectAttributes; IO_STATUS_BLOCK IoStatus; NTSTATUS Status; UNICODE_STRING fName;
RtlInitUnicodeString(&fName, Name);
InitializeObjectAttributes(&ObjectAttributes, &fName, OBJ_CASE_INSENSITIVE, NULL, NULL);
Status = NtCreateFile(ph, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT | FILE_COMPLETE_IF_OPLOCKED /*| FILE_WRITE_THROUGH*/, NULL, 0);
return Status;} // end EnvFileOpenW()
extern "C"NTSTATUSEnvFileOpenA( PCHAR Name, HANDLE* ph ){ ULONG len; PWCHAR NameW; NTSTATUS Status;
len = strlen(Name);
NameW = (PWCHAR)MyAllocatePool__(NonPagedPool, (len+1)*sizeof(WCHAR)); if(!NameW) return STATUS_INSUFFICIENT_RESOURCES;
swprintf(NameW, L"%S", Name);
Status = EnvFileOpenW(NameW, ph);
MyFreePool__(NameW);
return Status;} // end EnvFileOpenA()
extern "C"NTSTATUSEnvFileClose( HANDLE hFile ){ return NtClose(hFile);} // end EnvFileClose()
extern "C"NTSTATUSEnvFileGetSizeByHandle( HANDLE hFile, PLONGLONG lpFileSize ){ NTSTATUS Status; IO_STATUS_BLOCK IoStatusBlock; FILE_STANDARD_INFORMATION StandardInfo;
Status = NtQueryInformationFile( hFile, &IoStatusBlock, &StandardInfo, sizeof(StandardInfo), FileStandardInformation ); if (NT_SUCCESS(Status)) { *lpFileSize = StandardInfo.EndOfFile.QuadPart; } return Status;} // end EnvFileGetSizeByHandle()
extern "C"NTSTATUSEnvFileGetSizeA( PCHAR Name, PLONGLONG lpFileSize ){ NTSTATUS Status; HANDLE hFile;
(*lpFileSize) = -1I64;
Status = EnvFileOpenA(Name, &hFile);
if(!NT_SUCCESS(Status)) return Status;
Status = EnvFileGetSizeByHandle(hFile, lpFileSize);
NtClose(hFile);
return Status;} // end EnvFileGetSizeA()
extern "C"NTSTATUSEnvFileGetSizeW( PWCHAR Name, PLONGLONG lpFileSize ){ NTSTATUS Status; HANDLE hFile;
(*lpFileSize) = -1I64;
Status = EnvFileOpenW(Name, &hFile);
if(!NT_SUCCESS(Status)) return Status;
Status = EnvFileGetSizeByHandle(hFile, lpFileSize);
NtClose(hFile);
return Status;} // end EnvFileGetSizeW()
extern "C"BOOLEANEnvFileExistsA(PCHAR Name) { LONGLONG Size; EnvFileGetSizeA(Name, &Size); return Size != -1;}
extern "C"BOOLEANEnvFileExistsW(PWCHAR Name) { LONGLONG Size; EnvFileGetSizeW(Name, &Size); return Size != -1;}
extern "C"NTSTATUSEnvFileWrite( HANDLE h, PVOID ioBuffer, ULONG Length, PULONG bytesWritten ){ IO_STATUS_BLOCK IoStatus; NTSTATUS Status;
Status = NtWriteFile( h, NULL, // Event NULL, // ApcRoutine NULL, // ApcContext &IoStatus, ioBuffer, Length, NULL, // ByteOffset NULL // Key ); (*bytesWritten) = IoStatus.Information;
return Status;} // end EnvFileWrite()
extern "C"NTSTATUSEnvFileRead( HANDLE h, PVOID ioBuffer, ULONG Length, PULONG bytesRead ){ IO_STATUS_BLOCK IoStatus; NTSTATUS Status;
Status = NtReadFile( h, NULL, // Event NULL, // ApcRoutine NULL, // ApcContext &IoStatus, ioBuffer, Length, NULL, // ByteOffset NULL // Key ); (*bytesRead) = IoStatus.Information;
return Status;} // end EnvFileRead()
extern "C"NTSTATUSEnvFileSetPointer( HANDLE hFile, LONGLONG lDistanceToMove, LONGLONG* lResultPointer, DWORD dwMoveMethod ){ NTSTATUS Status; IO_STATUS_BLOCK IoStatus; FILE_POSITION_INFORMATION CurrentPosition; FILE_STANDARD_INFORMATION FileInfo;
switch (dwMoveMethod) { case ENV_FILE_BEGIN : CurrentPosition.CurrentByteOffset.QuadPart = lDistanceToMove; break;
case ENV_FILE_CURRENT :
// Get the current position of the file pointer Status = NtQueryInformationFile( hFile, &IoStatus, &CurrentPosition, sizeof(CurrentPosition), FilePositionInformation ); if(!NT_SUCCESS(Status)) { return Status; } CurrentPosition.CurrentByteOffset.QuadPart += lDistanceToMove; break;
case ENV_FILE_END : Status = NtQueryInformationFile( hFile, &IoStatus, &FileInfo, sizeof(FileInfo), FileStandardInformation ); if (!NT_SUCCESS(Status)) { return Status; } CurrentPosition.CurrentByteOffset.QuadPart = FileInfo.EndOfFile.QuadPart + lDistanceToMove; break;
default: return STATUS_INVALID_PARAMETER; }
if ( CurrentPosition.CurrentByteOffset.QuadPart < 0 ) { return Status; }
Status = NtSetInformationFile( hFile, &IoStatus, &CurrentPosition, sizeof(CurrentPosition), FilePositionInformation );
if(!NT_SUCCESS(Status)) { return Status; } if(lResultPointer) { *lResultPointer = CurrentPosition.CurrentByteOffset.QuadPart; } return STATUS_SUCCESS;} // end EnvFileSetPointer()
NTSTATUS EnvFileDeleteW(PWCHAR Name) {
OBJECT_ATTRIBUTES ObjectAttributes; IO_STATUS_BLOCK IoStatus; NTSTATUS Status; UNICODE_STRING fName; HANDLE Handle; FILE_DISPOSITION_INFORMATION Disposition;
RtlInitUnicodeString(&fName, Name);
InitializeObjectAttributes(&ObjectAttributes, &fName, OBJ_CASE_INSENSITIVE, NULL, NULL);
Status = NtOpenFile( &Handle, (ACCESS_MASK)DELETE, &ObjectAttributes, &IoStatus, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_NON_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT );
if ( !NT_SUCCESS(Status) ) { return Status; }
Disposition.DeleteFile = TRUE;
Status = NtSetInformationFile( Handle, &IoStatus, &Disposition, sizeof(Disposition), FileDispositionInformation );
NtClose(Handle);
return Status;}#endif //NT_NATIVE_MODE