FileDisk.sys是驱动程序要修改注册表安装到系统的.
调用驱动就是调用DeviceIoControl这个API就行了.和你的驱动约定好调用的协议.
2007年的时候写过FileDisk的Delphi版,太久远了,具体DeviceIOControl的约定你看下FileDisk代码中的声明吧

解决方案 »

  1.   

    fileDisk的如何映射磁盘已找到C代码,但是如何注册以及如何启动驱动仍未找到源代码,fileDisk.sys可以随时注册并启动,无需重启,将StartType设为3即可,但是完整的注册并启动驱动的代码未找到,下面是C翻译过来的映射磁盘的核心代码,前提是必须注册并已经启动驱动
    function FileDiskMount(
      DeviceNumber:Integer;//设备类型,光驱为1,磁盘为0
      OpenFileInformation:POPEN_FILE_INFORMATION;//映射文件信息
      CdImage:Boolean)//是否为cd驱动
      :Integer;
    var
      DeviceName:array [0..MAX_PATH] of char;
      VolumeName:string;
      DriveName:string;
      Device:THandle;
      BytesReturned:DWORD;
    begin
      VolumeName :='\\.\ :';
      VolumeName[5] := Char(OpenFileInformation^.DriveLetter);
      DriveName := ' :\';
      DriveName[1] :=Char(OpenFileInformation^.DriveLetter);
      Device := CreateFile(
            PChar(VolumeName),
            GENERIC_READ or GENERIC_WRITE,
            FILE_SHARE_READ or FILE_SHARE_WRITE,
            nil,
            OPEN_EXISTING,
            FILE_FLAG_NO_BUFFERING,
            0
            );
      if (Device <> INVALID_HANDLE_VALUE) then
      begin
        CloseHandle(Device);
        SetLastError(ERROR_BUSY);
        Result := ERROR_BUSY;
        exit;
      end;
      FillChar(DeviceName,sizeof(DeviceName),0);
      if CdImage then
        StrPCopy(PChar(@DeviceName),Format(DEVICE_NAME_PREFIX+'Cd%d',[DeviceNumber]))
      else
        StrPCopy(PChar(@DeviceName),Format(DEVICE_NAME_PREFIX+'%d',[DeviceNumber]));
      if ( not DefineDosDevice(
            DDD_RAW_TARGET_PATH,
            PChar(@VolumeName[5]),
            PChar(@DeviceName)
            )) then
      begin
        Result :=GetLastError;
        exit;
      end;
      Device := CreateFile(
            PChar(VolumeName),
            GENERIC_READ or GENERIC_WRITE,
            FILE_SHARE_READ or FILE_SHARE_WRITE,
            nil,
            OPEN_EXISTING,
            FILE_FLAG_NO_BUFFERING,
            0
            );  if (Device = INVALID_HANDLE_VALUE) then
      begin
        DefineDosDevice(DDD_REMOVE_DEFINITION, PChar(@VolumeName[5]), nil);
        Result :=GetLastError;
        exit;
      end;
      if ( not DeviceIoControl(
            Device,
            IOCTL_FILE_DISK_OPEN_FILE,
            OpenFileInformation,
            sizeof(OPEN_FILE_INFORMATION) + OpenFileInformation^.FileNameLength - 1,
            nil,
            0,
            BytesReturned,
            nil
            )) then
      begin
        DefineDosDevice(DDD_REMOVE_DEFINITION, PChar(@VolumeName[5]), nil);
        CloseHandle(Device);
        Result :=GetLastError;
        exit;
      end;
      CloseHandle(Device);
      SHChangeNotify(SHCNE_DRIVEADD, SHCNF_PATH, PChar(DriveName), nil);
      Result :=NO_ERROR;
    end;MountCD是自己写的函数
    function MountCD(
      const FileName:string;//文件名
      const Drive:char//盘符
      ):Integer;
    var
      OpenFileInformation:POPEN_FILE_INFORMATION;
      s:string;
      buflen:Integer;
    begin
      buflen :=sizeof(OPEN_FILE_INFORMATION)+Length(FileName)+7;
      GetMem(OpenFileInformation,buflen);
      ZeroMemory(OpenFileInformation,buflen);
      if FileName[1]='\' then
      begin
        if FileName[2]='\' then
        begin
          s :=Copy(FileName,2,Length(FileName)-1);
          s :='\??\UNC'+s;
          StrPCopy(PChar(@OpenFileInformation^.FileName),s);
        end
        else
          StrPCopy(PChar(@OpenFileInformation^.FileName),FileName);
      end
      else
      begin
        s :='\??\'+FileName;
        StrPCopy(PChar(@OpenFileInformation^.FileName),s);
      end;
      OpenFileInformation^.FileNameLength :=StrLen(PChar(@OpenFileInformation^.FileName));
    //  OpenFileInformation.ReadOnly :=true;
      OpenFileInformation.DriveLetter := UChar(Drive);
      Result :=FileDiskMount(1, OpenFileInformation,true);
      FreeMem(OpenFileInformation);
    end;FileDiskMount重载函数
    function FileDiskMount(
      DriveLette:Char;//映射盘符
      const FileName:string;//文件全名
      const FileSize:Int64;//文件大小
      const ReadOnly:Boolean;//是否只读
      const CDImage:Boolean//是否为光盘
      )
      :Integer;  overload;
    var
      OpenFileInformation:POPEN_FILE_INFORMATION;
      s:string;
      buflen:Integer;
    begin
      if CDImage then
        Result :=MountCD(FIleName,DriveLette)
      else
      begin
        buflen :=sizeof(OPEN_FILE_INFORMATION)+Length(FileName)+7;
        GetMem(OpenFileInformation,buflen);
        ZeroMemory(OpenFileInformation,buflen);
        if FileName[1]='\' then
        begin
          if FileName[2]='\' then
          begin
            s :=Copy(FileName,2,Length(FileName)-1);
            s :='\??\UNC'+s;
            StrPCopy(PChar(@OpenFileInformation^.FileName),s);
          end
          else
            StrPCopy(PChar(@OpenFileInformation^.FileName),FileName);
        end
        else
        begin
          s :='\??\'+FileName;
          StrPCopy(PChar(@OpenFileInformation^.FileName),s);
        end;
        OpenFileInformation^.ReadOnly :=ReadOnly;
        OpenFileInformation^.FileSize.QuadPart :=FileSize;
        OpenFileInformation^.DriveLetter :=UChar(DriveLette);
        OpenFileInformation^.FileNameLength := StrLen(PChar(@OpenFileInformation^.FileName));
        Result :=FileDiskMount(0,OpenFileInformation,false);
        FreeMem(OpenFileInformation);
      end;
    目前测试虚拟光驱磁盘成功,但是前提需注册驱动及启动驱动,如何注册并启动驱动代码目前仍没有。注册驱动应该是写注册表信息,这个通过捕获注册表操作已经找到具体位置,但是启动驱动不知道代码是什么
      

  2.   

    原始代码中的DriverManager.exe程序有“注册驱动”和“运行驱动”两个按钮,“注册驱动”似乎是往注册表内写信息,“运行驱动”就不知道做了什么动作,注册表信息如下,单纯的导入该注册信息无法调用驱动,并且DriverManager.exe也不认为驱动已经注册,不知何故Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\filedisk]
    "Type"=dword:00000001
    "Start"=dword:00000003
    "ErrorControl"=dword:00000000
    "ImagePath"=hex(2):5c,00,3f,00,3f,00,5c,00,43,00,3a,00,5c,00,55,00,73,00,65,00,\
      72,00,73,00,5c,00,41,00,64,00,6d,00,69,00,6e,00,69,00,73,00,74,00,72,00,61,\
      00,74,00,6f,00,72,00,5c,00,44,00,65,00,73,00,6b,00,74,00,6f,00,70,00,5c,00,\
      33,00,33,00,31,00,31,00,34,00,31,00,39,00,30,00,66,00,69,00,6c,00,65,00,64,\
      00,69,00,73,00,6b,00,2d,00,31,00,37,00,5c,00,66,00,69,00,6c,00,65,00,64,00,\
      69,00,73,00,6b,00,2d,00,31,00,37,00,5c,00,66,00,69,00,6c,00,65,00,64,00,69,\
      00,73,00,6b,00,2e,00,73,00,79,00,73,00,00,00
    "DisplayName"="filedisk"[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\filedisk\Enum]
    "0"="Root\\LEGACY_FILEDISK\\0000"
    "Count"=dword:00000001
    "NextInstance"=dword:00000001其中"Start"=dword:00000003,表示手动启动,无需重启即可,如果为1,则表示在计算机引导时才启动
      

  3.   

    找到了注册和启动驱动的代码,能启动,但是停不下来,一停就再也挂不上去了,包括DriverManager.exe也挂不上去,代码如下
    procedure TForm1.Button5Click(Sender: TObject);
    type
      _StartService=function(hService:SC_HANDLE;dwNumServiceArgs:DWORD;
      lpServiceArgVectors:PPChar):BOOL;stdcall;
    var
      sjk,ljk:SC_HANDLE;
      s:string;
    begin
      s :=ExtractFilePath(Application.ExeName);
      s :=s+'FileDisk.sys';
      sjk:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
      ljk:=CreateService(sjk,
        'Filedisk',
        'FileDisk',
        SERVICE_ALL_ACCESS,
        SERVICE_KERNEL_DRIVER,
        SERVICE_DEMAND_START,
        SERVICE_ERROR_NORMAL,
        PChar(s),//'System32\drivers\FileDisk.Sys',
        nil,nil,nil,nil,nil);
      ljk:=OpenService(sjk,'Filedisk',SERVICE_ALL_ACCESS);
      _StartService(@StartService)(ljk,0,nil);
    end;
      

  4.   

    楼主说的LZZ Vritual Drive是用Visual Studio .NET 2005/2008写的,使用的时候会释放出来五个文件:
    isocmd.exe
    ISODrive.sys(这个应该是32位系统的)
    ISODrv64.sys(这个应该是64位系统的)
    isoimg.exe
    vdhelp.txt(这个是帮助文档)这五个文件,其中前三个是EZB Systems公司的,如果我没有猜错的话乐滋滋工作室是用了EasyBoot和UltraISO中的核心文件。把资源释放出来然后执行CMD命令的。
      

  5.   

    注册表项函数:
    function RegCloseKey(hKey: HKEY): Longint; stdcall; external 'advapi32.dll' name 'RegCloseKey';
    function RegCreateKey(hKey: HKEY; lpSubKey: PAnsiChar; var phkResult: HKEY): Longint; stdcall; external 'advapi32.dll' name 'RegCreateKeyA';
    function RegCreateKeyEx(hKey: HKEY; lpSubKey: PAnsiChar; Reserved: DWORD; lpClass: PAnsiChar; dwOptions: DWORD; samDesired: REGSAM; lpSecurityAttributes: PSecurityAttributes; var phkResult: HKEY; lpdwDisposition: PDWORD): Longint; stdcall; external 'advapi32.dll' name 'RegCreateKeyExA';
    function RegDeleteKey(hKey: HKEY; lpSubKey: PAnsiChar): Longint; stdcall; external 'advapi32.dll' name 'RegDeleteKeyA';
    function RegDeleteValue(hKey: HKEY; lpValueName: PAnsiChar): Longint; stdcall; external 'advapi32.dll' name 'RegDeleteValueA';
    function RegOpenKeyEx(hKey: HKEY; lpSubKey: PAnsiChar; ulOptions: DWORD; samDesired: REGSAM; var phkResult: HKEY): Longint; stdcall; external 'advapi32.dll' name 'RegOpenKeyExA';
    function RegQueryValue(hKey: HKEY; lpSubKey: PAnsiChar; lpValue: PAnsiChar; var lpcbValue: Longint): Longint; stdcall; external 'advapi32.dll' name 'RegQueryValueA';
    function RegQueryValueEx(hKey: HKEY; lpValueName: PAnsiChar; lpReserved: Pointer; lpType: PDWORD; lpData: PByte; lpcbData: PDWORD): Longint; stdcall; external 'advapi32.dll' name 'RegQueryValueExA';
    function RegSetValueEx(hKey: HKEY; lpValueName: PAnsiChar; Reserved: DWORD; dwType: DWORD; lpData: Pointer; cbData: DWORD): Longint; stdcall; external 'advapi32.dll' name 'RegSetValueExA';