Juil 202014
 

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:

Devio in action :
imdisk_ewf

3
Poster un Commentaire

avatar
3 Fils de commentaires
0 Réponses de fil
0 Abonnés
 
Commentaire avec le plus de réactions
Le plus populaire des commentaires
0 Auteurs du commentaire
Auteurs de commentaires récents

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

  S’abonner  
plus récent plus ancien
Notifier de
trackback

[…] a previous article, I showed how to setup a « proxy » for ImDisk thru devio to mount an EWF […]

trackback

[…] a previous article, I showed how to setup a « proxy » for ImDisk thru devio to mount an EWF […]

trackback

[…] a previous article, I showed how to setup a « proxy » for ImDisk thru devio to mount an EWF […]