Драйвер фильтр флеш памяти
От: megamanrsdn  
Дата: 05.05.08 22:05
Оценка:
Нужно написать драйвер филтр флешки. что б перехватывать запросы чтения, записи только от флеш памяти.
сам фильтр, аппер, и цепляется над usbhub. Пока неполучается нормально его аттачить
вот фрагмент
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) 
{
    NTSTATUS          status;
    UNICODE_STRING    devName; 
    PDEVICE_OBJECT    fdo;
    int i;

    DbgPrint("DriverEntry...");

    for(i=0; i<IRP_MJ_MAXIMUM_FUNCTION; i++)
    {
        DriverObject->MajorFunction[i] = DispatchPass;
    }

    DriverObject->DriverUnload = FilterDriverUnload;
    
    status = IoCreateDevice(DriverObject,sizeof(PDEVICE_OBJECT),NULL,FILE_DEVICE_MASS_STORAGE,0,FALSE,&fdo);
    if(!NT_SUCCESS(status))return status;
    fdo->Flags |= 0x3040;

    RtlInitUnicodeString(&devName,L"\\Device\\USBPDO-2");

    status = IoGetDeviceObjectPointer(&devName,STANDARD_RIGHTS_ALL,&FileObj,&pdDevObjTarg);
    if(!NT_SUCCESS(status))return status;
    
    DbgPrint("IoGetDeviceObjectPointer -ok-");

    IoAttachDeviceToDeviceStack(fdo,pdDevObjTarg);
    if(!NT_SUCCESS(status))return status;
    
    DbgPrint("IoAttachDeviceToDeviceStack -ok-");

    
    return STATUS_SUCCESS;
}
/*************************************************************************/
VOID FilterDriverUnload(IN PDRIVER_OBJECT fdo)
{
    IoDetachDevice(pdDevObjTarg);
    ObDereferenceObject(FileObj);
    IoDeleteDevice(fdo->DeviceObject); 

    DbgPrint("FilterDriverUnload");

}

ТАк я делаю? подкажите если что.
Загружаю его лоадером. показывается в DeviceTree, что он прицепился. после повторной загрузки пишет что такая служба уже есть и вылетает. а в DeviceTree ничего нет. ЧТо делать?

сам лоадер

int main()
{
    cout<<" ------------------- "<<endl;
    cout<<"| Loader is running |"<<endl;
    cout<<" ------------------- "<<endl;

    SC_HANDLE sch = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);  
    if(sch)
    {
        SC_HANDLE schServiceUSB = CreateService(sch,"FilterDriver","FilterDriver",SERVICE_ALL_ACCESS,
                                             SERVICE_KERNEL_DRIVER,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,
                                             "C:\\FilterDriver\\sys\\objchk\\i386\\FilterDriver.sys",NULL,NULL,NULL,NULL,NULL);
        if(schService)
        {
            if(StartService(schService,NULL,NULL))
            {
                cout<<"PAUSE: Press any key to exit pause..."<<endl;
                while(!getch());

                SERVICE_STATUS ServiceStatus;
                if(ControlService(schService,SERVICE_CONTROL_STOP,&ServiceStatus))
                {cout<<"ControlService - status ok"<<endl;}
                else{cout<<"Error ControlService..."<<endl;ErrorView();}
                
                if(DeleteService(schService))
                {cout<<"DeleteService - status ok"<<endl;}
                else{cout<<"Error DeleteService..."<<endl;ErrorView();}/**/
                
                if(CloseServiceHandle(schService))
                {cout<<"CloseServiceHandle - status ok"<<endl;}
                else{cout<<"Error CloseServiceHandle..."<<endl;ErrorView();}/**/
                
                if(CloseServiceHandle(sch))
                {cout<<"CloseServiceHandle - status ok"<<endl;}
                else{cout<<"Error CloseServiceHandle..."<<endl;ErrorView();}/**/
/*---------------------------------------------------------------------------------------------------------*/
            }else{cout<<"Error StartService..."<<endl;ErrorView();}
        }else{cout<<"Error CreateService..."<<endl;ErrorView();}
     }else{cout<<"Error OpenSCManager..."<<endl;ErrorView();}
    
    cout<<" ------------------- "<<endl;
    cout<<"| Loader is stopped |"<<endl;
    cout<<" ------------------- "<<endl;
    cout<<"Press any key to exit"<<endl;
    while(!getch());
    return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.