Пожалуйста, обратите внимание, что пользователь заблокирован
C:
int copy_file( LPCWSTR oldfile, LPCWSTR newfile )
{
NTSTATUS status;
HANDLE hOldFile, hNewFile;
UNICODE_STRING OldFileName;
UNICODE_STRING NewFileName;
IO_STATUS_BLOCK ioStatusBlockOld;
IO_STATUS_BLOCK ioStatusBlockNew;
OBJECT_ATTRIBUTES objAttribsOld;
OBJECT_ATTRIBUTES objAttribsNew;
FILE_STANDARD_INFORMATION FileInfo;
ULONG FileLength;
BYTE* FileBuffer;
LARGE_INTEGER FileOffset;
NTLIB32.RtlInitUnicodeString(&OldFileName, oldfile);
InitializeObjectAttributes(&objAttribsOld, &OldFileName, OBJ_CASE_INSENSITIVE, NULL, NULL);
NTLIB32.NtOpenFile(&hOldFile,
GENERIC_READ | SYNCHRONIZE,
&objAttribsOld,
&ioStatusBlockOld,
FILE_SHARE_READ,
FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE);
NTLIB32.NtQueryInformationFile(hOldFile,
&ioStatusBlockOld,
&FileInfo,
sizeof(FILE_STANDARD_INFORMATION),
FileStandardInformation);
FileLength = FileInfo.EndOfFile.u.LowPart;
FileBuffer = (BYTE*)malloc(FileLength + 1);
FileOffset.QuadPart = 0ULL;
status = NTLIB32.NtReadFile(hOldFile,
NULL,
NULL,
NULL,
&ioStatusBlockOld,
FileBuffer,
FileLength,
&FileOffset,
NULL);
FileBuffer[FileLength] = 0;
NTLIB32.NtClose(hOldFile);
NTLIB32.RtlInitUnicodeString(&NewFileName, newfile);
InitializeObjectAttributes(&objAttribsNew, &NewFileName, OBJ_CASE_INSENSITIVE, NULL, NULL);
status = NTLIB32.NtCreateFile(&hNewFile,
GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
&objAttribsNew,
&ioStatusBlockNew,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_CREATE,
FILE_WRITE_THROUGH | FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
status = NTLIB32.NtWriteFile(
hNewFile,
NULL,
NULL,
NULL,
&ioStatusBlockNew,
FileBuffer,
FileLength+1,
NULL,
NULL);
NTLIB32.NtClose(hNewFile);
return 0;
}