HANDLE CreateTempFile(PFLT_INSTANCE pInstance,
PUNICODE_STRING filename)
{
OBJECT_ATTRIBUTES objectAttributes;
HANDLE hFile;
IO_STATUS_BLOCK ioStatus;
NTSTATUS status;
ACCESS_MASK access=GENERIC_ALL;
WCHAR chold;
filename->Length -=sizeof(WCHAR);
filename->MaximumLength -=sizeof(WCHAR);
chold=filename->Buffer[filename->Length/2-1];
filename->Buffer[filename->Length/2-1]=L’Z’;//txt->txz
InitializeObjectAttributes( &objectAttributes,
filename,
OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,
NULL,
NULL );
status = FltCreateFile(g_FilterHandle,
pInstance,
&hFile,
access,
&objectAttributes,
&ioStatus,
(PLARGE_INTEGER) NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_CREATE,
FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_ALERT,
NULL,
0L,
0 );
filename->Buffer[filename->Length/2-1]=chold;
filename->Length +=sizeof(WCHAR);
filename->MaximumLength +=sizeof(WCHAR);
if (!(ioStatus.Status==STATUS_SUCCESS && ioStatus.Information==FILE_CREATED))
{
return INVALID_HANDLE_VALUE;
}
return hFile;
}
in postcreate,I just do a test:
{
…
HANDLE hTempFile;
PFILE_OBJECT tempfo;
NTSTATUS tempstatus = STATUS_SUCCESS;
hTempFile=CreateTempFile(FltObjects->Instance,filename);
ObReferenceObjectByHandle(hTempFile, 0,NULL,KernelMode,(PVOID*)&tempfo,NULL);
int tempsize=sizeof(FILE_RENAME_INFORMATION)+sizeof(L"1.zzz");
PFILE_RENAME_INFORMATION tempinfo=(FILE_RENAME_INFORMATION *)ExAllocatePool(PagedPool, tempsize );
memset(tempinfo,0,tempsize);
tempinfo->ReplaceIfExists =TRUE;
tempinfo->RootDirectory=NULL;
tempinfo->FileNameLength=sizeof(L"1.zzz")-sizeof(WCHAR);
wcscpy(tempinfo->FileName,L"1.zzz");
//the temp file is created,now rename it
tempstatus=FltSetInformationFile(FltObjects->Instance,tempfo, &tempinfo,tempsize,FileRenameInformation);
DbgPrint(“\r\n—rename status:%x”,tempstatus);
ObDereferenceObject(tempfo);
FltClose(hTempFile);
ExFreePool(tempinfo);
…
}
For test,I do a simple process.
When my postcreate is for e:\test\1.txt,I will create a temp file e:\test\1.txz.
and I will rename the e:\test\1.txz to e:\test\1.zzz
but failed,and return STATUS_OBJECT_NAME_INVALID.