FileDisk.sys是驱动程序要修改注册表安装到系统的.
调用驱动就是调用DeviceIoControl这个API就行了.和你的驱动约定好调用的协议.
2007年的时候写过FileDisk的Delphi版,太久远了,具体DeviceIOControl的约定你看下FileDisk代码中的声明吧
调用驱动就是调用DeviceIoControl这个API就行了.和你的驱动约定好调用的协议.
2007年的时候写过FileDisk的Delphi版,太久远了,具体DeviceIOControl的约定你看下FileDisk代码中的声明吧
解决方案 »
- Form中加入flash控件,显示“没有加载影片”怎么办?
- 关于检查sql表是否有数据更新
- 一个关于for循环的问题,急!!
- 大家推荐一个 Outlook Express 左边那种样子的 Bar 控件,上面要可以放 TreeView 的
- 高分求教Win3.11workgroup的问题。网络老手请进,100分坚决俸上。
- 数据是从EXCEL里导到DBGrid里,也读到ADOQuery里,意思是没有SQL语句,现在怎么把某列重复的行的记录隐藏,同时把另一个补贴列汇总?
- 发邮件的程序,小问题。
- 能否在安装时自动配置BDE,谢谢!
- Delphi 新手!多多关照.
- Kylix编译的文件怎样直接运行?
- Label的caption中放长箭头????
- ODAC远程连接Oracle数据库的问题
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;
目前测试虚拟光驱磁盘成功,但是前提需注册驱动及启动驱动,如何注册并启动驱动代码目前仍没有。注册驱动应该是写注册表信息,这个通过捕获注册表操作已经找到具体位置,但是启动驱动不知道代码是什么
"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,则表示在计算机引导时才启动
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;
isocmd.exe
ISODrive.sys(这个应该是32位系统的)
ISODrv64.sys(这个应该是64位系统的)
isoimg.exe
vdhelp.txt(这个是帮助文档)这五个文件,其中前三个是EZB Systems公司的,如果我没有猜错的话乐滋滋工作室是用了EasyBoot和UltraISO中的核心文件。把资源释放出来然后执行CMD命令的。
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';