RT。驱动初学者,请多指教。

解决方案 »

  1.   

    驱动程序初始化的时候调用PsSetLoadImageNotifyRoutine设置一个回调函数,当进程加载模块文件时会调用这个函数,函数参数中给出了要加载模块的完整路径,根据该路径可以判断是不是移动设备上的EXE文件,然后再结束进程。
      

  2.   

    多谢cnzdgs。可是我不明白如何判断是不是移动设备上的EXE文件,这个应该怎么做呢?
      

  3.   

    根据FullImageName参数,可以用ZwCreateFile、ZwQueryVolumeInformationFile来取FileFsDeviceInformation来判断其所在卷的Characteristics是不是FILE_REMOVABLE_MEDIA。
      

  4.   

    谢谢。我试了多次,但是ZwCreateFile始终没有返回STATUS_SUCCESS,不知是何缘故。
      

  5.   

    这是我的回调函数:
    NTSTATUS Status;
        OBJECT_ATTRIBUTES         ObjectAttributes;
        PHANDLE FileHandle;
        HANDLE hProcess;
        IO_STATUS_BLOCK IoStatus;
        FILE_FS_DEVICE_INFORMATION                 DeviceInfo;
        CLIENT_ID ClientId;
                
                hProcess    = NULL;
        FileHandle    = NULL;
        ClientId.UniqueProcess = ProcessId;
        ClientId.UniqueThread  = 0;     InitializeObjectAttributes(&ObjectAttributes,
           FullImageName,
           OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
           NULL,
           NULL
          );     Status = ZwCreateFile(FileHandle,
      GENERIC_READ,
      &ObjectAttributes,
      &IoStatus,
      NULL,
      FILE_ATTRIBUTE_NORMAL,
      0,
      FILE_OPEN,
      FILE_NO_INTERMEDIATE_BUFFERING | FILE_SYNCHRONOUS_IO_ALERT,
      NULL,
      0
     );

    if (!NT_SUCCESS(Status))
    {
    return;
    } Status = ZwQueryVolumeInformationFile(FileHandle,
          &IoStatus,
          &DeviceInfo,
          sizeof(FILE_FS_DEVICE_INFORMATION),
          FileFsDeviceInformation
         );
    if (!NT_SUCCESS(Status))
    {
    ZwClose(*FileHandle);
    *FileHandle = NULL;
    return;
    } if(DeviceInfo.Characteristics == FILE_REMOVABLE_MEDIA)
    {
    Status = ZwOpenProcess(&hProcess,PROCESS_ALL_ACCESS,&ObjectAttributes,&ClientId);
    ZwTerminateProcess(hProcess,0);
    ZwClose(hProcess);
    }
      

  6.   

    ZwCreateFile的第1参数要给一个HANDLE型变量的地址,把FileHandle前面加上&号再试试。
      

  7.   

    可是我FileHandle变量的类型定义的是PHANDLE呀。
      

  8.   

    你把PHANDLE前面的P去掉,再按我上面说的来修改。如果定义PHANDLE类型,你需要给该变量赋值,不能是NULL。
      

  9.   

    成了。不过这种方式只能拦截U盘上的EXE文件运行,对于移动硬盘却没有什么效果。这又是为什么呢?感觉系统好像没有把移动硬盘认成移动设备而认成了本地磁盘了。这样理解可以么?
      

  10.   

    可能要取接口类型,或者从设备的GUID来判断,没做过这样的程序。
      

  11.   

    DBT_DEVTYP_VOLUME 和 DBT_DEVTYP_PORT //最近好像碰到有例外的,还没仔细调试。
      

  12.   

    嗯,那我再研究研究。这贴先到这里,多谢cnzdgs。