PS может быть вы ложно видите запросы для тех IRP_MJ_CREATE, которые были завершены со статусом ошибки?
Я сперва так и подумал. Посмотрел вывод DbgPrint - вроде нормально всё, всмысле файл открывается. Впоследствие повырезал из кода всё что только можно и добавил максимум вывода (диагностики). получилось примерно так
//------------------------------------------------------------------------------------------
NTSTATUS
SFsCreate(
PDEVICE_OBJECT pDeviceObject,
PIRP pIrp
)
{
NTSTATUS NtStatus, localStatus;
PIO_STACK_LOCATION pStack;
PSFSFILTER_EXTENSION pDevExt;
KEVENT waitEvent;
UNICODE_STRING usFullPath;
BOOLEAN bCheckFStat;
PAGED_CODE();
DBGPRINT(("---> SFsCreate\n"));
pDevExt = (PSFSFILTER_EXTENSION)pDeviceObject->DeviceExtension;
pStack = IoGetCurrentIrpStackLocation(pIrp);
ASSERT(pStack);
usFullPath.Buffer = NULL;
usFullPath.Length = 0;
usFullPath.MaximumLength = 0;
bCheckFStat = TRUE;
DBGPRINT(("FileObject: 0x08%x\n", pStack->FileObject));
if (pStack->FileObject)
{
DBGPRINT(("FileName: %wZ\nCreate options: 0x%08x\nIrpSP->Flags: 0x%08x\n"
"Flags: 0x%08x\nFsContext: 0x%08x\nFsContext2: 0x%08x\n"
"RelatedFileObject: 0x%08x\n",
&pStack->FileObject->FileName,
pStack->Parameters.Create.Options,
pStack->Flags,
pStack->FileObject->Flags,
pStack->FileObject->FsContext,
pStack->FileObject->FsContext2,
(PVOID)pStack->FileObject->RelatedFileObject));
localStatus = SFsGetFullPath( pDeviceObject,
&pStack->FileObject->FileName,
&usFullPath,
TRUE);
DBGPRINT(("DeviceName: %wZ\nDosDevName: %wZ\nFullFileName: %wZ\n",
&pDevExt->TargetDeviceName,
&pDevExt->DosDeviceName,
&usFullPath));
if (usFullPath.Buffer)
{
ExFreePoolWT(usFullPath.Buffer);
usFullPath.Buffer = NULL;
}
}
KeInitializeEvent(&waitEvent, NotificationEvent, FALSE);
IoCopyCurrentIrpStackLocationToNext(pIrp);
IoSetCompletionRoutine( pIrp,
SFsStandartCompletionRoutine,
&waitEvent,
TRUE,
TRUE,
TRUE);
NtStatus = IoCallDriver(pDevExt->LowerDeviceObject, pIrp);
if (NtStatus == STATUS_PENDING)
{
KeWaitForSingleObject( &waitEvent,
Executive,
KernelMode,
FALSE,
NULL);
ASSERT(NtStatus == STATUS_SUCCESS);
}
DBGPRINT(("==AFTER OPEN==\nFlags: 0x%08x\nFsContext: 0x%08x\n"
"FsContext2: 0x%08x\nRelatedFileObject: 0x%08x\n",
pStack->FileObject->Flags,
pStack->FileObject->FsContext,
pStack->FileObject->FsContext2,
(PVOID)pStack->FileObject->RelatedFileObject));
if (bCheckFStat)
{
DBGPRINT(("Operation status: 0x%08x\n",
pIrp->IoStatus.Information));
}
NtStatus = pIrp->IoStatus.Status;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
DBGPRINT(("<--- SFsCreate [Status: 0x%x]\n\n", NtStatus));
return NtStatus;
}
//------------------------------------------------------------------------------------------
NTSTATUS
SFsClose(
PDEVICE_OBJECT pDeviceObject,
PIRP pIrp
)
{
NTSTATUS NtStatus/*, localStatus*/;
PIO_STACK_LOCATION pStack;
PSFSFILTER_EXTENSION pDevExt;
UNICODE_STRING usFileName;
KEVENT waitEvent;
PAGED_CODE();
DBGPRINT(("---> SFsClose\n"));
pDevExt = (PSFSFILTER_EXTENSION)pDeviceObject->DeviceExtension;
pStack = IoGetCurrentIrpStackLocation(pIrp);
DBGPRINT(("FileObject: 0x08%x\n", pStack->FileObject));
if (pStack->FileObject)
{
DBGPRINT(("IrpSP->Flags: 0x%08x\nFlags: 0x%08x\nFsContext: 0x%08x\n"
"FsContext2: 0x%08x\nRelatedFileObject: 0x%08x\n",
pStack->Flags,
pStack->FileObject->Flags,
pStack->FileObject->FsContext,
pStack->FileObject->FsContext2,
(PVOID)pStack->FileObject->RelatedFileObject));
DBGPRINT(("DeviceName: %wZ\nDosDevName: %wZ\nFileName: %wZ\n",
&pDevExt->TargetDeviceName,
&pDevExt->DosDeviceName,
&pStack->FileObject->FileName));
}
KeInitializeEvent(&waitEvent, NotificationEvent, FALSE);
IoCopyCurrentIrpStackLocationToNext(pIrp);
IoSetCompletionRoutine( pIrp,
SFsStandartCompletionRoutine,
&waitEvent,
TRUE,
TRUE,
TRUE);
NtStatus = IoCallDriver(pDevExt->LowerDeviceObject, pIrp);
if (NtStatus == STATUS_PENDING)
{
KeWaitForSingleObject( &waitEvent,
Executive,
KernelMode,
FALSE,
NULL);
ASSERT(NtStatus == STATUS_SUCCESS);
}
NtStatus = pIrp->IoStatus.Status;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
DBGPRINT(("<--- SFsClose [Status: 0x%x]\n\n", NtStatus));
return NtStatus;
}
Извиняюсь за форматирование. У меня в редакторе это выглядит несколько по другому.
По поводу потоков.
Потоки от файлов отличаются на практике тем, что после открытия их FsContext'ы (оба) остаются нулевыми. Но это весьма косвенный признак. Кроме того это видно уже только после открытия. Странно что не передается флаг FO_STREAM_FILE
Собственно прилагаю лог. В логе имеет смысл смотреть на подопытный файл RFC1035.TXT (по этому имени поиск делать). Видно что он открыт больше раз чем закрыт. На строки "File hashed. OpenFilesCount:" можно не обращать внимания