Dashboard > Virtual Disk Toolkit > Virtual Disk Drive > Information > Page Comparison
Log In   View a printable version of the current page.
Virtual Disk Drive
Version 1 by RĂ¼diger Jungbeck
on Mar 31, 2008 17:51.


 
compared with
Current by RĂ¼diger Jungbeck
on May 13, 2008 16:13.

(show comment)
 
Key
These lines were removed. This word was removed.
These lines were added. This word was added.

View page history


There are 10 changes. View first change.

 {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}
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.2 Build:#512 Apr 26, 2006) - Bug/feature request - Contact Administrators