ho trovato alcune informazioni veramente utili qua
http://www.insidewindows.info/
http://www.adp-gmbh.ch/win/misc/writ...icedriver.html
http://www.osronline.com/ddkx/kmarch/k113_6egi.htm
ci sono due esempi che sono veramente d'aiuto
comunque ... qualcuno ha qualche guida che parla di qualcosa di comprensibile ...
ho capito come devo registrare e deregistrare il device, non è troppo complicato ... e ho capito che nella struttura che uso per registrare il device devo anche inserire tutta una serie di chiamate che si occupano di gestire le operazioni che mi interessano ... ma non capisco come da quelle funzioni richiamo le mie funzioni di gestione del tutto:
- ovvero estrarre il nome del file interessato
- confrontarlo con una mia lista
- comportarsi di conseguenza (ovvero negare o passare l'operazione al driver successivo)
il secondo so farlo senza problemi ... so passare l'operazione al driver successivo ... ma non so come estrarre il nome del file interessato e non sono sicuro di come negare l'operazione
per intederci ...
codice:
NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
.
.
.
DriverObject->MajorFunction[IRP_MJ_CREATE] = FilterDriver_IrpMjCreate;
.
.
.
}
NTSTATUS FilterDriver_IrpMjCreate (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) {
// Estraggo il nome del file da DeviceObject
// Lo confronto con la lista
BOOL bFounded = FALSE;
// ...eseguo il confronto...
// verifico se devo completare o meno l'operazione
if (bFounded == FALSE)
{
return STATUS_ACCESS_DENIED;
}
// Completo l'operazione
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
un'altra cosa ... ho visto in altro codice che invece di completare la richiestae di IO passano la richiesta al filtro successivo ...
qual'è quello corretto?
forse è + corretto quello che passa la richiesta al driver successivo dato che il mio non è un file system driver ma solo un filtro
codice:
IoCopyCurrentIrpStackLocationToNext(Irp);
next_io_stack = IoGetNextIrpStackLocation(Irp);
next_io_stack->Parameters.Read.ByteOffset.QuadPart += sizeof(union swap_header);
device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
return IoCallDriver(device_extension->TargetDeviceObject, Irp);
questo è il codice che usa un'altro filter driver che fa quello che deve fare con next_io_stack (quindi io lo devo eliminare)
e quindi mi troverei con
codice:
IoCopyCurrentIrpStackLocationToNext(Irp);
device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
return IoCallDriver(device_extension->TargetDeviceObject, Irp);
---
ricordatevi che ci sta l'offerta sempre delle 2 birre e della pizza e non è un tentativo di corrompervi