Подскажите, как из драйвера узнать имя обрабатываемого файла? Например мне нужно обрабаьтывать только текстовые. Я написал драйвер-фильтр, но немогу понять, как узнать расширение файла.
Спасибо
Здравствуйте, serg_fork, Вы писали:
_>Здравствуйте, Mike_12, Вы писали:
M_>>Подскажите, как из драйвера узнать имя обрабатываемого файла? Например мне нужно обрабаьтывать только текстовые. Я написал драйвер-фильтр, но немогу понять, как узнать расширение файла.
M_>>Спасибо
_>Если ты написал драйвер-фильтр, то узнать расширение файла для тебя не составит особого труда.
_>P.S. Так и пиши, содрал подчистую пример из IFS/filemon а что он делает, ума не приложу.
VOID GetFileName(PUNICODE_STRING pusFileName)
{
ANSI_STRING asFileName;
RtlUnicodeStringToAnsiString(&asFileName, pusFileName, TRUE);
// напечатать имя файла
if(asFileName.Buffer)
DbgPrint("FILE NAME: %s \n", asFileName.Buffer);
RtlFreeAnsiString(asFileName);
}
}
NTSTATUS HookDispatcher(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
PIO_STACK_LOCATION pCurStack = IoGetCurrentIrpStackLocation();
switch(pCurStack->MajorFunction)
{
case IRP_MJ_CREATE:
// имя файла хранится в pCurStack->FileObject->FileName
GetFileName(&pCurStack->FileObject->FileName);
break;
///другие обработчики
}
}
Здравствуйте, Orifiel, Вы писали:
O>Здравствуйте, serg_fork, Вы писали:
_>>Здравствуйте, Mike_12, Вы писали:
M_>>>Подскажите, как из драйвера узнать имя обрабатываемого файла? Например мне нужно обрабаьтывать только текстовые. Я написал драйвер-фильтр, но немогу понять, как узнать расширение файла.
M_>>>Спасибо
_>>Если ты написал драйвер-фильтр, то узнать расширение файла для тебя не составит особого труда.
_>>P.S. Так и пиши, содрал подчистую пример из IFS/filemon а что он делает, ума не приложу.
O>
O>VOID GetFileName(PUNICODE_STRING pusFileName)
O>{
O> ANSI_STRING asFileName;
O> RtlUnicodeStringToAnsiString(&asFileName, pusFileName, TRUE);
O> // напечатать имя файла
O> if(asFileName.Buffer)
O> DbgPrint("FILE NAME: %s \n", asFileName.Buffer);
O> RtlFreeAnsiString(asFileName);
O>}
O>}
O> NTSTATUS HookDispatcher(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
O> {
O> PIO_STACK_LOCATION pCurStack = IoGetCurrentIrpStackLocation();
O> switch(pCurStack->MajorFunction)
O> {
O> case IRP_MJ_CREATE:
O> // имя файла хранится в pCurStack->FileObject->FileName
O> GetFileName(&pCurStack->FileObject->FileName);
O> break;
O> ///другие обработчики
O> }
O> }
O>
1.
Можно без RtlUnicodeStringToAnsiString, с помощью "%S" вместо "%s".
Кроме того, нельзя надеяться на наличие NULL-терминатора у строки.
if(asFileName.Buffer)
DbgPrint("FILE NAME: %.*S \n", asFileName.Length/sizeof(WCHAR), asFileName.Buffer);
2.
В 2000 и старше довольно часто приезжают IRP_MJ_CREATE, у которых нет имени, а только RelatedObject.
Имя нужно брать из него. (Вообще, нужно склеивать имя из RelatedObject и pCurStack->FileObject->FileName).