Ejemplo n.º 1
0
static
__inline
NTSTATUS
_FlushDrive(
		IN HANDLE Handle
		)
{
	IO_STATUS_BLOCK IoStatusBlock;
	return NtFlushBuffersFile(Handle, &IoStatusBlock);
}
Ejemplo n.º 2
0
// PELF_FILE_FLUSH_ROUTINE
static
NTSTATUS NTAPI
LogfpFlushFile(IN PEVTLOGFILE LogFile,
               IN PLARGE_INTEGER FileOffset,
               IN ULONG Length)
{
    PLOGFILE pLogFile = (PLOGFILE)LogFile;
    IO_STATUS_BLOCK IoStatusBlock;

    UNREFERENCED_PARAMETER(FileOffset);
    UNREFERENCED_PARAMETER(Length);

    return NtFlushBuffersFile(pLogFile->FileHandle, &IoStatusBlock);
}
Ejemplo n.º 3
0
BOOLEAN DiskDriveFlushCache(
    _In_ HANDLE DosDeviceHandle
    )
{
    IO_STATUS_BLOCK isb;

    //  NtFlushBuffersFile
    //
    //  If a volume handle is specified:
    //      - Write all modified data for all files on the volume from the Windows
    //        in-memory cache.
    //      - Commit all pending metadata changes for all files on the volume from
    //        the Windows in-memory cache.
    //      - Send a SYNC command to the underlying storage device to commit all
    //        written data in the devices cache to persistent storage.
    //

    if (NT_SUCCESS(NtFlushBuffersFile(DosDeviceHandle, &isb)))
        return TRUE;

    return FALSE;
}
Ejemplo n.º 4
0
static NTSTATUS
LogfInitializeNew(PLOGFILE LogFile,
                  ULONG ulMaxSize,
                  ULONG ulRetention)
{
    IO_STATUS_BLOCK IoStatusBlock;
    EVENTLOGEOF EofRec;
    NTSTATUS Status;

    ZeroMemory(&LogFile->Header, sizeof(EVENTLOGHEADER));
    SetFilePointer(LogFile->hFile, 0, NULL, FILE_BEGIN);
    SetEndOfFile(LogFile->hFile);

    LogFile->Header.HeaderSize = sizeof(EVENTLOGHEADER);
    LogFile->Header.Signature = LOGFILE_SIGNATURE;
    LogFile->Header.MajorVersion = MAJORVER;
    LogFile->Header.MinorVersion = MINORVER;
    LogFile->Header.StartOffset = sizeof(EVENTLOGHEADER);
    LogFile->Header.EndOffset = sizeof(EVENTLOGHEADER);
    LogFile->Header.CurrentRecordNumber = 1;
    LogFile->Header.OldestRecordNumber = 1;
    LogFile->Header.MaxSize = ulMaxSize;
    LogFile->Header.Flags = 0;
    LogFile->Header.Retention = ulRetention;
    LogFile->Header.EndHeaderSize = sizeof(EVENTLOGHEADER);

    Status = NtWriteFile(LogFile->hFile,
                         NULL,
                         NULL,
                         NULL,
                         &IoStatusBlock,
                         &LogFile->Header,
                         sizeof(EVENTLOGHEADER),
                         NULL,
                         NULL);
    if (!NT_SUCCESS(Status))
    {
        DPRINT1("NtWriteFile failed (Status 0x%08lx)\n", Status);
        return Status;
    }

    EofRec.RecordSizeBeginning = sizeof(EVENTLOGEOF);
    EofRec.Ones = 0x11111111;
    EofRec.Twos = 0x22222222;
    EofRec.Threes = 0x33333333;
    EofRec.Fours = 0x44444444;
    EofRec.BeginRecord = LogFile->Header.StartOffset;
    EofRec.EndRecord = LogFile->Header.EndOffset;
    EofRec.CurrentRecordNumber = LogFile->Header.CurrentRecordNumber;
    EofRec.OldestRecordNumber = LogFile->Header.OldestRecordNumber;
    EofRec.RecordSizeEnd = sizeof(EVENTLOGEOF);

    Status = NtWriteFile(LogFile->hFile,
                         NULL,
                         NULL,
                         NULL,
                         &IoStatusBlock,
                         &EofRec,
                         sizeof(EVENTLOGEOF),
                         NULL,
                         NULL);
    if (!NT_SUCCESS(Status))
    {
        DPRINT1("NtWriteFile failed (Status 0x%08lx)\n", Status);
        return Status;
    }

    Status = NtFlushBuffersFile(LogFile->hFile,
                                &IoStatusBlock);
    if (!NT_SUCCESS(Status))
    {
        DPRINT1("NtFlushBuffersFile failed (Status 0x%08lx)\n", Status);
        return Status;
    }

    return STATUS_SUCCESS;
}
Ejemplo n.º 5
0
/*
* SfuWriteBufferToFile
*
* Purpose:
*
* Create new file (or open existing) and write (append) buffer to it.
*
*/
ULONG_PTR SfuWriteBufferToFile(
	_In_ PWSTR lpFileName,
	_In_ PVOID Buffer,
	_In_ SIZE_T Size,
	_In_ BOOL Flush,
	_In_ BOOL Append
	)
{
	NTSTATUS          Status;
	DWORD             dwFlag;
	HANDLE             hFile = NULL;
	OBJECT_ATTRIBUTES  attr;
	UNICODE_STRING     NtFileName;
	IO_STATUS_BLOCK    IoStatus;
	LARGE_INTEGER      Position;
	ACCESS_MASK        DesiredAccess;
	PLARGE_INTEGER     pPosition = NULL;
	ULONG_PTR          nBlocks, BlockIndex, BytesWritten = 0;
	ULONG              BlockSize, RemainingSize;
	PBYTE              ptr = (PBYTE)Buffer;

	if (RtlDosPathNameToNtPathName_U(lpFileName, &NtFileName, NULL, NULL) == FALSE)
		return 0;

	DesiredAccess = FILE_WRITE_ACCESS | SYNCHRONIZE;
	dwFlag = FILE_OVERWRITE_IF;

	if (Append == TRUE) {
		DesiredAccess |= FILE_READ_ACCESS;
		dwFlag = FILE_OPEN_IF;
	}

	InitializeObjectAttributes(&attr, &NtFileName, OBJ_CASE_INSENSITIVE, 0, NULL);

	__try {
		Status = NtCreateFile(&hFile, DesiredAccess, &attr,
			&IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, 0, dwFlag,
			FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE, NULL, 0);

		if (!NT_SUCCESS(Status))
			__leave;

		pPosition = NULL;

		if (Append == TRUE) {
			Position.LowPart = 0xFFFFFFFF;
			Position.HighPart = -1;
			pPosition = &Position;
		}

		BlockSize = 0x7FFFFFFF;
		nBlocks = (Size / BlockSize);
		for (BlockIndex = 0; BlockIndex < nBlocks; BlockIndex++) {

			Status = NtWriteFile(hFile, 0, NULL, NULL, &IoStatus, ptr, BlockSize, pPosition, NULL);
			if (!NT_SUCCESS(Status))
				__leave;

			ptr += BlockSize;
			BytesWritten += IoStatus.Information;
		}
		RemainingSize = Size % BlockSize;
		if (RemainingSize != 0) {
			Status = NtWriteFile(hFile, 0, NULL, NULL, &IoStatus, ptr, RemainingSize, pPosition, NULL);
			if (!NT_SUCCESS(Status))
				__leave;
			BytesWritten += IoStatus.Information;
		}

	}
	__finally {
		if (hFile != NULL) {
			if (Flush == TRUE) NtFlushBuffersFile(hFile, &IoStatus);
			NtClose(hFile);
		}
		RtlFreeUnicodeString(&NtFileName);
	}
	return BytesWritten;
}