Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] FileSystem Filter Driver

    Premetto che so a mala pena cos'è e le mie conoscenze di C non sono chissa che cosa: se devo leggere codice C/C++ lo faccio senza problemi, scriverlo però è un'altro discorso

    fatta questa piccola introduzione io avrei bisogno di scrivere un filter driver che mi intercetti TUTTE le richieste di apertura di file e mi permetta di interagire con questo

    ora da quanto so tramite un FileSystem Filter Driver è possibile fare quello che serve a me e negare quindi l'accesso su richiesta ... un Driver che lavora in modalità "passiva", ovvero che non va ad eseguire un hook completo di tutte le funzionalità esposte ma soltanto di alcune e queste comunque usano le funzionalità base se la procedura deve essere completata

    il problema è che so solo quello e non ho idea di come si sviluppi un driver ne come si faccia tutto l'ambaradan ... diciamo che le mie conoscenze sullo sviluppo di driver rasenta quasi lo zero ... l'unica cosa che so è che per comunicare con il driver devo andare con degli IOCTL ... basta

    quello che chiedo io è un'aiutino nel senso che non voglio il codice già pronto (se poi c'è è meglio) però vorrei qualche esempio di qualche driver di questo tipo molto basilare e qualche spiegazione di come funzionano ... per farmi un'idea di cos'è ... se c'è la posso fare in tempi non biblici (in estremis max un paio di settimane)

    ho trovato questi links sull'argomento che credo mi daranno un bell'aiuto per sapere i punti fondamentali per muovermi a dovere penso che mi faciliterebbe la cosa

    ovviamente poi vi devo una 2 birra ed una pizza

    ---
    links:
    http://www.microsoft.com/whdc/driver...v/default.mspx
    http://www.cswl.com/whiteppr/white/Guaranteed.html
    http://www.osr.com/toolkits_fddk.shtml

  2. #2
    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

  3. #3
    faccio l'ultimo up perché sento che c'è veramente poca gente che sa aiutarmi e non credo che abbiano molto tempo da passare sul forum per aiutarmi

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,328
    Il problema non e' sapere come aiutarti.

    Il fatto e' che l'argomento device driver è - obiettivamente - complesso. Doverne discutere in un forum con una persona che (per tua ammissione) ha una lunga serie di dubbi e poche certezze, rende estremamente "laborioso" rispondere.

    Il risultato e' che bisognerebbe "prendere in mano" il tutto in "prima persona", scrivere il driver e mostrartelo.

    E sinceramente, anche volendolo fare, il tempo non lo consente ...

  5. #5
    Originariamente inviato da oregon
    Il problema non e' sapere come aiutarti.

    Il fatto e' che l'argomento device driver è - obiettivamente - complesso. Doverne discutere in un forum con una persona che (per tua ammissione) ha una lunga serie di dubbi e poche certezze, rende estremamente "laborioso" rispondere.

    Il risultato e' che bisognerebbe "prendere in mano" il tutto in "prima persona", scrivere il driver e mostrartelo.

    E sinceramente, anche volendolo fare, il tempo non lo consente ...
    mi sono schiarito un po le idee sull'argomento ma ho un po di dubbi su dove "scrivere" il codice che si occupa di fare i confronti e come negare l'accesso se il metodo che ho esposto su è errato

    se il codice che ho postato sotto è corretto, nel senso che inizializzo correttamente la funzione di check per il createfile et simili e se devo scrivere il codice dentro quella funzione

    se mi confermi questo poi per il resto mi muovo io

  6. #6
    magari non frega niente a nessuno ... ma ho trovato parecchia roba utile dopo aver capito da dove partire

    spero che questi link possano essere utili (oltre ai precedenti s'intende)

    http://support.microsoft.com/kb/q257405/
    http://www.codeguru.com/cpp/w-p/syst...cle.php/c5789/

    poi tutta la serie completa di sviluppo dei driver su codeproject.com (li adoro a questi tizi )
    http://www.codeproject.com/system/driverdev.asp (fa capire TANTEEEEEEEEEEEEEEEEEEEEEEEEEE cose ^^)
    http://www.codeproject.com/system/driverdev2.asp
    http://www.codeproject.com/win32/driverdev3.asp
    http://www.codeproject.com/system/driverdev4asp.asp (che spiega per bene quello che mi serve)
    http://www.codeproject.com/system/driverdev5asp.asp
    http://www.codeproject.com/useritems/driverdev6asp.asp

    Scheletro d'esempio per driver che mostra alcune funzionalità base, cose che in genere sono implementate da ogni device più qualche altra piccola cosa:
    http://www.wd-3.com/archive/PTEx_skeletondispatch.htm

    qui c'è una specie di guida/reference, ma purtroppo funziona male, al ddk e allo sviluppo di driver:
    http://www.osronline.com/ddkx/

    se lo usate insieme a google lo troverete utilissimo!

    spero di essere stato d'aiuto a qualcuno ^^

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.