Skip to content

Commit b7076d3

Browse files
committed
Issue #1, #14 - now using a loop to increase the buffer size for QueryDosDevice API if it is not enough to hold all DOS device names. The loop is limited to 10 cycles.
1 parent 547cbc1 commit b7076d3

File tree

5 files changed

+32
-16
lines changed

5 files changed

+32
-16
lines changed

RamRemove.pas

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ function AutoEjectVolume(AVolumeHandle: THandle): boolean;
9898
begin
9999
dw:=GetLastError;
100100
if dw = ERROR_FILE_NOT_FOUND then DebugLog('Arsenal Driver not installed',EVENTLOG_ERROR_TYPE)
101-
else DebugLog(SysErrorMessage(dw),EVENTLOG_ERROR_TYPE);
101+
else DebugLog('Can not open the SCSI adapter when detaching RAM-disk = ' + SysErrorMessage(dw),EVENTLOG_ERROR_TYPE);
102102
raise ERamDiskError.Create(RamNotInstalled);
103103
end;
104104
deviceNumber.LongNumber:=IMSCSI_ALL_DEVICES;
@@ -112,7 +112,7 @@ function AutoEjectVolume(AVolumeHandle: THandle): boolean;
112112
end
113113
else
114114
begin
115-
DebugLog(SysErrorMessage(dw),EVENTLOG_ERROR_TYPE);
115+
DebugLog('Can not remove the SCSI adapter = ' + SysErrorMessage(dw),EVENTLOG_ERROR_TYPE);
116116
Exit;
117117
end;
118118
end;

RamVolume.pas

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,26 +26,38 @@ function GetVolumePathNamesForVolumeName(lpszVolumeName, lpszVolumePathNames: LP
2626
dw: DWORD;
2727
dev_path: WideString;
2828
config:TScsiDeviceConfig;
29-
i, len: Integer;
29+
i, len, multiple: Integer;
3030
devices: TStringList;
3131
address: TScsiAddress;
3232
device_number: TStorageDeviceNumber;
3333
disk_size: Int64;
3434
Begin
35-
SetLength(dosDevs, MAX_DOS_NAMES);
3635
disk_number:= -1;
3736
Result:=INVALID_HANDLE_VALUE;
38-
len:=QueryDosDevice(NIL, PAnsiChar(dosdevs), Length(dosdevs));
39-
// ImScsiDebugMessage(L"Error opening SCSI port %1!i!: %2!ws!", PortNumber & 0xFF, (LPCWSTR)errmsg);
40-
if len=0 then Exit;
41-
37+
multiple:=1;
38+
Repeat
39+
SetLength(dosDevs, MAX_DOS_NAMES * multiple);
40+
len:=QueryDosDevice(NIL, PAnsiChar(dosdevs), Length(dosdevs));
41+
// ImScsiDebugMessage(L"Error opening SCSI port %1!i!: %2!ws!", PortNumber & 0xFF, (LPCWSTR)errmsg);
42+
if len=0 then Inc(multiple);
43+
if multiple > 10 then
44+
begin
45+
DebugLog(Format('QueryDosDevice can not fit DOS device names inside %d bytes',[Length(dosdevs)]),EVENTLOG_ERROR_TYPE);
46+
Exit;
47+
end;
48+
Until len <> 0;
4249
adapter := ImScsiOpenScsiAdapterByScsiPortNumber(PortNumber);
43-
if adapter = INVALID_HANDLE_VALUE then Exit;
50+
if adapter = INVALID_HANDLE_VALUE then
51+
Begin
52+
DebugLog('Could not open SCSI adapter inside ImScsiOpenDiskByDeviceNumber',EVENTLOG_ERROR_TYPE);
53+
Exit;
54+
end;
4455

4556
config.DeviceNumber := DeviceNumber;
4657
If not ImScsiQueryDevice(adapter, @config, SizeOf(TScsiDeviceConfig)) Then
4758
begin
4859
CloseHandle(adapter);
60+
DebugLog('Could not get SCSI device config inside ImScsiOpenDiskByDeviceNumber',EVENTLOG_ERROR_TYPE);
4961
Exit;
5062
end;
5163
CloseHandle(adapter);
@@ -95,7 +107,11 @@ function GetVolumePathNamesForVolumeName(lpszVolumeName, lpszVolumePathNames: LP
95107
ERROR_INVALID_PARAMETER,
96108
ERROR_INVALID_FUNCTION,
97109
ERROR_NOT_SUPPORTED,
98-
ERROR_IO_DEVICE: break;
110+
ERROR_IO_DEVICE:
111+
Begin
112+
DebugLog(Format('Could not get the SCSI address of device %s',[devices[i]]),EVENTLOG_ERROR_TYPE);
113+
break;
114+
end;
99115
end;
100116
CloseHandle(disk);
101117
end;

RamdiskUI.dof

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ AutoIncBuild=0
115115
MajorVer=1
116116
MinorVer=1
117117
Release=1
118-
Build=10
118+
Build=11
119119
Debug=0
120120
PreRelease=0
121121
Special=0
@@ -126,7 +126,7 @@ CodePage=1251
126126
[Version Info Keys]
127127
CompanyName=
128128
FileDescription=
129-
FileVersion=1.1.1.10
129+
FileVersion=1.1.1.11
130130
InternalName=
131131
LegalCopyright=
132132
LegalTrademarks=

RamdiskUI.res

0 Bytes
Binary file not shown.

SrvMain.pas

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ procedure TArsenalRamDisk.ServiceStart(Sender: TService; var Started: Boolean);
131131
try
132132
if CreateRamDisk(config,False) Then Started:=True;
133133
except
134-
On E:ERamDiskError do DebugLog(decodeException(E.ArsenalCode));
135-
On E:Exception do DebugLog(E.Message);
134+
On E:ERamDiskError do DebugLog('Service could not create RAM-disk, error = ' + decodeException(E.ArsenalCode));
135+
On E:Exception do DebugLog('Exception in service start = ' + E.Message);
136136
End;
137137
end;
138138

@@ -145,8 +145,8 @@ procedure TArsenalRamDisk.ServiceStop(Sender: TService; var Stopped: Boolean);
145145
try
146146
If DetachRamDisk(config) then Stopped:=True;
147147
except
148-
On E:ERamDiskError do DebugLog(decodeException(E.ArsenalCode));
149-
On E:Exception Do DebugLog(E.Message);
148+
On E:ERamDiskError do DebugLog('Service could not destroy RAM-disk, error = ' + decodeException(E.ArsenalCode));
149+
On E:Exception Do DebugLog('Exception in service stop = ' + E.Message);
150150
end;
151151
End
152152
Else Stopped:=True;

0 commit comments

Comments
 (0)