Hello!
Thank you for the information.
I am implementing the name provider callbacks but stuck at coding the callback of NormalizeNameComponent. I think that in my case I don’t need to do any manipulation but just forward the request to the driver component below and send it back to the upper driver. However, I don’t know how/where to apply “FLT_NORMALIZE_NAME_FLAGS Flags” in the code.
The following is my code. Please advise. Thank you.
(P.S. It would be really nice if MS can provide a simple name provider example in its DDK.)
==============================================================
NTSTATUS MyNormalizeNameComponentCallback(
__in PFLT_INSTANCE Instance,
__in PCUNICODE_STRING ParentDirectory,
__in USHORT VolumeNameLength,
__in PCUNICODE_STRING Component,
__out PFILE_NAMES_INFORMATION ExpandComponentName,
__in ULONG ExpandComponentNameLength,
__in FLT_NORMALIZE_NAME_FLAGS Flags,
__inout PVOID *NormalizationContext
)
{
FILE_NAMES_INFORMATION fileNameInfo;
OBJECT_ATTRIBUTES oa = {0};
IO_STATUS_BLOCK iosb = {0};
PFLT_FILTER filter;
HANDLE dirHandle;
ULONG lengthRet=0;
PFILE_OBJECT dirObject = NULL;
NTSTATUS status=FltGetFilterFromInstance(Instance,
&filter);
if(status != STATUS_SUCCESS)
return status;
InitializeObjectAttributes(&oa,
ParentDirectory,
OBJ_KERNEL_HANDLE,
NULL,
NULL);
status = FltCreateFile(filter,
Instance,
&dirHandle,
GENERIC_READ,
&oa,
&iosb,
NULL,
0 , // File Attribs
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
FILE_OPEN,
FILE_DIRECTORY_FILE |FILE_SYNCHRONOUS_IO_NONALERT,
NULL, //EaBuffer
0, // EaBuffer length
IO_IGNORE_SHARE_ACCESS_CHECK); // Flags
if(status != STATUS_SUCCESS)
return status;
status = ObReferenceObjectByHandle(dirHandle, //Handle
FILE_GENERIC_READ, //DesiredAccess
*IoFileObjectType, //FileObjectType
KernelMode, //AccessMode
&dirObject, //object
NULL);
if(status != STATUS_SUCCESS) {
FltClose(dirHandle);
return status;
}
status=FltQueryDirectoryFile(Instance,
dirObject,
ExpandComponentName,
sizeof(FILE_NAMES_INFORMATION),
FileNamesInformation,
TRUE,
Component,
TRUE,
&lengthRet);
if(status != STATUS_SUCCESS) {
PT_DBG_PRINT(PTDBG_TRACE_OPERATION_STATUS,
(“PT!MyNormalizeNameComponent: FltQueryDirectoryfile(0x%x)\n”,
status));
ObDereferenceObject(dirObject);
FltClose(dirHandle);
return status;
}
ObDereferenceObject(dirObject);
FltClose(dirHandle);
return STATUS_SUCCESS;
}