changes.
| {code} |
| /******************************************************************************* |
| |
| vdrive.c |
| |
|  | Purpose: main source of Virtual Disk Drive |
| |
| Author: SB, RSJ Software GmbH |
| |
| Date: 10/2006 |
| |
| (c) Copyright 2006 by RSJ Software GmbH, Germering. All rights reserved. |
| |
| *******************************************************************************/ |
| |
| |
| /*------ includes ------------------------------------------------------------*/ |
| #include <stdlib.h> |
| #include <windows.h> |
| |
| #include "abstractvd.h" |
| #include "avdioctl.h" |
| |
| /*------ typedefs ------------------------------------------------------------*/ |
| /******************************************************************************* |
| |
| VDRIVE_HANDLE |
| |
| *******************************************************************************/ |
| typedef struct { |
| AVD_HANDLE fileHandle; |
| UINT64 fileSize; |
| wchar_t fileName[_MAX_PATH+1]; |
| } VDRIVE_HANDLE; |
| |
| |
| /******************************************************************************* |
| |
| AvdOpen() |
| |
| *******************************************************************************/ |
| AVD_RET AVD_LINK AvdOpen(void *RequestContext, |
| void **ImplContext, |
| const wchar_t *Parms) |
| { |
| VDRIVE_HANDLE *vdhandle; |
| AVD_RET avd_ret; |
| wchar_t *cfsize; |
| UINT64 fsize; |
| wchar_t *fname_end; |
| size_t fname_len; |
| wchar_t *s; |
| wchar_t parm_copy[2 * _MAX_PATH + 1]; |
| |
 |  | |
| if (Parms == NULL || wcslen(Parms) > 2 * _MAX_PATH) { |
| return(AVD_INVALID_PARAMETER); |
| } |
| |
| wcscpy(parm_copy, Parms); |
| |
 |  | fname_end = wcschr(parm_copy, ';'); |
| if (fname_end) { |
| *fname_end = 0x00; |
| fname_len = wcslen(parm_copy); |
| cfsize = fname_end + 1; |
| } |
| | fname_len = wcslen(parm_copy); |
| |
 |  | if (fname_len > _MAX_PATH || cfsize == NULL || *cfsize == 0x00) { |
| | if (fname_len > _MAX_PATH) { |
| AvdDebugMessage(2, "AvdOpen(): Invalid Parms"); |
| return(AVD_INVALID_PARAMETER); |
| } |
| |
 |  | /* determine filesize */ |
| s = cfsize; |
| while (*s != 0x00 && (*s < '0' || *s > '9')) { |
| s++; |
| } |
| fsize = 0; |
| |
| while (*s != 0x00 && *s >= '0' && *s <= '9') { |
| fsize = (UINT64) (10 * fsize + (*s - '0')) ; |
| s++; |
| } |
| |
| if ((avd_ret = AvdMemoryAlloc(&vdhandle, sizeof(VDRIVE_HANDLE))) != AVD_OK) { |
| return(avd_ret); |
| } |
| |
| wcscpy(vdhandle->fileName, parm_copy); |
| |
| if ((avd_ret = AvdFileOpen(&vdhandle->fileHandle, |
| vdhandle->fileName)) != AVD_OK) { |
| AvdDebugMessage(2, "AvdFileOpen() returned %d\n", (int) avd_ret); |
| AvdMemoryFree(vdhandle); |
| return(avd_ret); |
| } |
 |  | |
| vdhandle->fileSize = fsize * 1024 * 1024; |
| |
 |  | AvdFileSizeGet(vdhandle->fileHandle, |
| &(vdhandle->fileSize)); |
| |
 |  | |
| if ((avd_ret = AvdFileSizeSet(vdhandle->fileHandle, |
| vdhandle->fileSize)) != AVD_OK) { |
| AvdDebugMessage(2, |
| "AvdFileSizeSet (%d) returned %d\n", |
| (int) vdhandle->fileSize, |
| (int) avd_ret); |
| AvdFileClose(vdhandle->fileHandle); |
| AvdMemoryFree(vdhandle); |
| return(avd_ret); |
| } |
| |
| *ImplContext = (void *) vdhandle; |
| |
| return(AVD_OK); |
| } |
| |
| |
| /******************************************************************************* |
| |
| AvdClose() |
| |
| *******************************************************************************/ |
| AVD_RET AVD_LINK AvdClose(void *RequestContext, void *ImplContext) |
| { |
| VDRIVE_HANDLE *vdhandle = (VDRIVE_HANDLE *) ImplContext; |
| |
| if (vdhandle == NULL) { |
| return(AVD_INVALID_PARAMETER); |
| } |
| |
| if (vdhandle->fileHandle) { |
| AvdFileClose(vdhandle->fileHandle); |
| } |
| |
| AvdMemoryFree(vdhandle); |
| |
| return(AVD_OK); |
| } |
| |
| |
| /******************************************************************************* |
| |
| AvdGetMediaSize() |
| |
| *******************************************************************************/ |
| AVD_RET AVD_LINK AvdGetMediaSize(void *RequestContext, |
| void *ImplContext, |
 |  | UINT64 *MediaSize) |
| | UINT64 *MediaSize, |
| unsigned short *SectorsPerTrack, |
| BOOLEAN *Writable) |
| { |
| VDRIVE_HANDLE *vdhandle = (VDRIVE_HANDLE *) ImplContext; |
| |
| if (vdhandle == NULL || |
| !vdhandle->fileHandle) { |
| return(AVD_INVALID_PARAMETER); |
| } |
| |
| *MediaSize = vdhandle->fileSize; |
 | | *Writable = TRUE; |
| *SectorsPerTrack = 32; |
| |
| return(AVD_OK); |
| } |
| |
| |
| /******************************************************************************* |
| |
| AvdRead() |
| |
| *******************************************************************************/ |
| AVD_RET AVD_LINK AvdRead(void *RequestContext, |
| void *ImplContext, |
| unsigned char *Buffer, |
| UINT64 Offset, |
| size_t Length, |
| size_t *BytesRead) |
| { |
| VDRIVE_HANDLE *vdhandle = (VDRIVE_HANDLE *) ImplContext; |
| |
| if (vdhandle == NULL || |
| !vdhandle->fileHandle) { |
| return(AVD_INVALID_PARAMETER); |
| } |
| |
| return(AvdFileRead(Buffer, vdhandle->fileHandle, Offset, Length, BytesRead)); |
| } |
| |
| |
| /******************************************************************************* |
| |
| AvdWrite() |
| |
| *******************************************************************************/ |
| AVD_RET AVD_LINK AvdWrite(void *RequestContext, |
| void *ImplContext, |
| unsigned char *Buffer, |
| UINT64 Offset, |
| size_t Length, |
| size_t *BytesWritten) |
| { |
| VDRIVE_HANDLE *vdhandle = (VDRIVE_HANDLE *) ImplContext; |
| |
| if (vdhandle == NULL || |
| !vdhandle->fileHandle) { |
| return(AVD_INVALID_PARAMETER); |
| } |
| |
| return(AvdFileWrite(Buffer, vdhandle->fileHandle, Offset, Length, BytesWritten)); |
| } |
| |
| |
| /******************************************************************************* |
| |
| AvdCommmandInvoke() |
| |
| *******************************************************************************/ |
| AVD_RET AVD_LINK AvdCommandInvoke (void *RequestContext, |
| void *ImplContext, |
| void *Request, |
| size_t RequestLength, |
| void *Response, |
| size_t MaxResponseLen, |
| size_t *ActualResponseLen) |
| { |
| *ActualResponseLen = 0; |
| |
| return(AVD_OK); |
| } |
| {code} |