diff options
Diffstat (limited to 'utils/scsi/rbscsi.c')
-rw-r--r-- | utils/scsi/rbscsi.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/utils/scsi/rbscsi.c b/utils/scsi/rbscsi.c index aa62ba0118..8a263f29e6 100644 --- a/utils/scsi/rbscsi.c +++ b/utils/scsi/rbscsi.c | |||
@@ -151,13 +151,33 @@ void rb_scsi_close(rb_scsi_device_t dev) | |||
151 | 151 | ||
152 | /* Windpws */ | 152 | /* Windpws */ |
153 | #elif defined(RB_SCSI_WINDOWS) | 153 | #elif defined(RB_SCSI_WINDOWS) |
154 | /* return either path or something allocated with malloc() */ | ||
155 | static const char *map_to_physical_drive(const char *path, unsigned flags, void *user, | ||
156 | rb_scsi_printf_t printf) | ||
157 | { | ||
158 | /* don't do anything if path starts with '\' */ | ||
159 | if(path[0] == '\\') | ||
160 | return path; | ||
161 | /* Convert to UNC path (C: -> \\.\C:) otherwise it won't work) */ | ||
162 | char *unc_path = malloc(strlen(path) + 5); | ||
163 | sprintf(unc_path, "\\\\.\\%s", path); | ||
164 | if(flags & RB_SCSI_DEBUG) | ||
165 | printf(user, "rb_scsi: map to UNC path: %s\n", unc_path); | ||
166 | return unc_path; | ||
167 | } | ||
168 | |||
154 | rb_scsi_device_t rb_scsi_open(const char *path, unsigned flags, void *user, | 169 | rb_scsi_device_t rb_scsi_open(const char *path, unsigned flags, void *user, |
155 | rb_scsi_printf_t printf) | 170 | rb_scsi_printf_t printf) |
156 | { | 171 | { |
157 | if(printf == NULL) | 172 | if(printf == NULL) |
158 | printf = misc_std_printf; | 173 | printf = misc_std_printf; |
159 | HANDLE h = CreateFileA(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, | 174 | /* magic to auto-detect physical drive */ |
175 | const char *open_path = map_to_physical_drive(path, flags, user, printf); | ||
176 | HANDLE h = CreateFileA(open_path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, | ||
160 | NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING, NULL); | 177 | NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING, NULL); |
178 | /* free path if it was allocated */ | ||
179 | if(open_path != path) | ||
180 | free((char *)open_path); | ||
161 | if(h == INVALID_HANDLE_VALUE) | 181 | if(h == INVALID_HANDLE_VALUE) |
162 | { | 182 | { |
163 | if(flags & RB_SCSI_DEBUG) | 183 | if(flags & RB_SCSI_DEBUG) |