I call this from my work item, still sharing violation :
IO_STATUS_BLOCK ioStatusBlock;
HANDLE FileHandle = nullptr;
NTSTATUS status;
ULONG BytesRead = 0;
LARGE_INTEGER ByteOffset;
ByteOffset.QuadPart = 0;
InitializeObjectAttributes(&objAttr, &FileName, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL);
status = FltCreateFile(Filter, Instance, &FileHandle, FILE_ALL_ACCESS, &objAttr, &ioStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL,0, FILE_OPEN, FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0, IO_IGNORE_SHARE_ACCESS_CHECK);
if (!NT_SUCCESS(status) || FileHandle == nullptr)
{
DbgPrint("[*] failed create file 0x%x\n", status);
return INVALID_ENTROPY;
}
PVOID Object = nullptr;
status = ObReferenceObjectByHandle(FileHandle, GENERIC_ALL, *IoFileObjectType, KernelMode, (PVOID*)&Object, NULL);
if (!NT_SUCCESS(status))
{
DbgPrint("[*] failed to reference file object by handle 0x%x\n", status);
ZwClose(FileHandle);
return INVALID_ENTROPY;
}
PFILE_OBJECT FileObject = (PFILE_OBJECT)Object;
FILE_STANDARD_INFORMATION FileInfo;
status = FltQueryInformationFile(Instance, FileObject, &FileInfo, sizeof(FileInfo), FileStandardInformation, NULL);
if (!NT_SUCCESS(status))
{
DbgPrint("[*] failed to query information file 0x % x\n",status);
ObfDereferenceObject(Object);
ZwClose(FileHandle);
return INVALID_ENTROPY;
}
ULONG Size = (ULONG)FileInfo.EndOfFile.QuadPart;
if (Size == 0)
{
ObfDereferenceObject(Object);
ZwClose(FileHandle);
return INVALID_ENTROPY;
}
PVOID Buffer = ExAllocatePoolWithTag(NonPagedPool,Size,TAG);
if (!Buffer)
{
DbgPrint("[*] failed allocating read buffer\n");
ObfDereferenceObject(Object);
ZwClose(FileHandle);
return INVALID_ENTROPY;
}
status = FltReadFile(Instance, FileObject, &ByteOffset, FileInfo.EndOfFile.QuadPart, Buffer, FLTFL_IO_OPERATION_DO_NOT_UPDATE_BYTE_OFFSET | FLTFL_IO_OPERATION_NON_CACHED | FLTFL_IO_OPERATION_PAGING | FLTFL_IO_OPERATION_SYNCHRONOUS_PAGING, &BytesRead, NULL, NULL);
if (!NT_SUCCESS(status))
{
DbgPrint("[*] failed read file 0x%x\n", status);
ObDereferenceObject(Object);
ExFreePoolWithTag(Buffer, TAG);
ZwClose(FileHandle);
return INVALID_ENTROPY;
}