//
挂载设备
NTSTATUS FsFilterAttachToDevice(
IN PDEVICE_OBJECT DeviceObject,
OUT PDEVICE_OBJECT* pFilterDeviceObject
)
{
NTSTATUS status = STATUS_SUCCESS;
PDEVICE_OBJECT filterDeviceObject = NULL;
PFSFILTER_DEVICE_EXTENSION pDevExt = NULL;
ULONG i = 0;
//
防止重复挂载
ASSERT(!FsFilterIsAttachedToDevice(DeviceObject));
//
创建过滤设备
status = IoCreateDevice(g_FsFilterDriverObject,sizeof(FSFILTER_DEVICE_EXTENSION),NULL,DeviceObject->DeviceType,0,FALSE,&filterDeviceObject);
if
(!NT_SUCCESS(status))
{
return
status;
}
pDevExt = (PFSFILTER_DEVICE_EXTENSION)filterDeviceObject->DeviceExtension;
//
复制标志位
if
(FlagOn(DeviceObject->Flags,DO_BUFFERED_IO))
{
SetFlag(filterDeviceObject->Flags,DO_BUFFERED_IO);
}
if
(FlagOn(DeviceObject->Flags,DO_DIRECT_IO))
{
SetFlag(filterDeviceObject->Flags,DO_DIRECT_IO);
}
if
(FlagOn(DeviceObject->Characteristics,FILE_DEVICE_SECURE_OPEN))
{
SetFlag(filterDeviceObject->Characteristics,FILE_DEVICE_SECURE_OPEN);
}
//
如果挂载失败说明是设备对象还没有完成初始化,这种情况一般发生在卷正在被装入的时候过滤驱动被加载
//
所以用
for
循环,失败后可以再次尝试挂载
for
(i = 0; i < 8; i++)
{
LARGE_INTEGER interval;
//
正式挂载设备
status = IoAttachDeviceToDeviceStackSafe(filterDeviceObject,DeviceObject,&pDevExt->AttachedToDeviceObject);
if
(NT_SUCCESS(status))
{
break
;
}
//
延时5秒,给设备足够的时间完成初始化
interval.QuadPart = (500 * DELAY_ONE_MILLISECOND);
KeDelayExecutionThread(KernelMode, FALSE, &interval);
}
if
(!NT_SUCCESS(status))
{
//
失败则清理现场
IoDeleteDevice(filterDeviceObject);
filterDeviceObject = NULL;
}
else
{
//
设置正在初始化的标志
ClearFlag(filterDeviceObject->Flags, DO_DEVICE_INITIALIZING);
if
(NULL != pFilterDeviceObject)
{
*pFilterDeviceObject = filterDeviceObject;
}
}
return
status;
}