Re[3]: Имя обрабатываемого файла в драйвере
От: Аноним  
Дата: 10.06.05 17:16
Оценка:
Здравствуйте, 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).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.