static __inline NTSTATUS _FlushDrive( IN HANDLE Handle ) { IO_STATUS_BLOCK IoStatusBlock; return NtFlushBuffersFile(Handle, &IoStatusBlock); }
// 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); }
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; }
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; }
/* * 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; }