Имя обрабатываемого файла в драйвере
От: Mike_12  
Дата: 10.06.05 03:21
Оценка:
Подскажите, как из драйвера узнать имя обрабатываемого файла? Например мне нужно обрабаьтывать только текстовые. Я написал драйвер-фильтр, но немогу понять, как узнать расширение файла.
Спасибо
Re: Имя обрабатываемого файла в драйвере
От: serg_fork  
Дата: 10.06.05 05:07
Оценка: :))
Здравствуйте, Mike_12, Вы писали:

M_>Подскажите, как из драйвера узнать имя обрабатываемого файла? Например мне нужно обрабаьтывать только текстовые. Я написал драйвер-фильтр, но немогу понять, как узнать расширение файла.

M_>Спасибо

Если ты написал драйвер-фильтр, то узнать расширение файла для тебя не составит особого труда.

P.S. Так и пиши, содрал подчистую пример из IFS/filemon а что он делает, ума не приложу.
Re[2]: Имя обрабатываемого файла в драйвере
От: Orifiel  
Дата: 10.06.05 08:14
Оценка:
Здравствуйте, 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;
   ///другие обработчики
  }
 }
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...
Пока на собственное сообщение не было ответов, его можно удалить.