In a previous article, I have shared a delphi unit for libewf.
Now lets code a proxy for ImDisk using that external libyal library to mount an EWF file.
I initially used this template from reboot.pro and came with the below basic delphi unit.
Once I had done that, it was pretty easy to fill in the missing parts to mount and EWF reusing my previous libewf delphi unit.
See code attached.proxy_EWF
library proxy; uses SysUtils, Classes,windows; {$R *.res} type dllread_proc = function (handle:thandle; buf:pointer; size:cardinal; offset:int64): integer; cdecl; dllwrite_proc = function (handle:thandle; buf:pointer; size:cardinal; offset:int64): integer; cdecl; dllclose_proc = function (handle:thandle): integer; cdecl; var file_handle:thandle; function SetFilePointerEx (hFile: THandle; lDistanceToMove: int64; lpNewFilePointer: Pointer; dwMoveMethod: DWORD): BOOL; stdcall; external 'kernel32.dll'; function GetFileSizeEx(hFile: THandle; var lpFileSize: Int64): BOOL; stdcall; external 'kernel32.dll' name 'GetFileSizeEx'; function my_read_proc(handle:thandle; buf:pointer; size:cardinal; offset:int64): integer; cdecl; var bytes_read:cardinal; begin writeln('Read request - size:'+inttostr(size)+' offset:'+inttostr(offset)); SetFilePointerEx(handle, offset, nil, FILE_BEGIN); ReadFile(handle, buf^, size, bytes_read, nil); result:=bytes_read; end; function my_write_proc(handle:thandle; buf:pointer; size:cardinal; offset:int64): integer; cdecl; var bytes_written:cardinal; begin writeln('Write request - size:'+inttostr(size)+' offset:'+inttostr(offset)); SetFilePointerEx(handle, offset, nil, FILE_BEGIN); WriteFile(handle, buf^, size, bytes_written, nil); result:=bytes_written; end; function my_close_proc(handle:thandle): integer; cdecl; begin writeln('Close request'); CloseHandle(handle); result:=0; end; function dllopen(filename:pchar; read_only:integer; var dllread:dllread_proc; var dllwrite:dllwrite_proc; var dllclose:dllclose_proc; var size:int64):thandle;cdecl; begin writeln('File to open: '+filename); dllread := my_read_proc; dllwrite := my_write_proc; dllclose := my_close_proc; file_handle := CreateFile(filename, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); GetFileSizeEx(file_handle, size); result:=file_handle; end; exports dllopen index 1; begin end.
The command lines for the proxy and ImDisk are below :
devio --dll=proxy.dll;dllopen shm:test_proxy c:\test.vmdk
imdisk -a -t proxy -o shm -o ro -f test_proxy -m Z: