Eterlogic Virtual Drive SDK documentation |
Using Native DLL API, it creates disk 'Z' and handles requests.
#include <windows.h> #include <stdio.h> #include <vector> #include <conio.h> #include "VDSDKDll.h" #define DISK_SIZE 16 std::vector<char> g_memory; DRIVE_HANDLE g_hDrive = INVALID_DRIVE_HANDLE; int CreateVirtualDisk(char DriveLetter); int main(int argc, char* argv[]) { char DriveLetter = 'Z'; if(argc == 2) DriveLetter = argv[1][0]; if(!InitializeVDSDK()) { printf("Error: Can not initialize VDSDK\n"); return 1; } // Activate VDSDK. // First parameter is activation key shipped with commercial license // In demo version this method always returns TRUE if(!ActivateVDSDK("")) { printf("ERROR: can not activate VDSDK\n"); return 1; } CreateVirtualDisk(DriveLetter); // Shutdown VDSDK ShutdownVDSDK(TRUE); return 0; } // =========================================== // Virtual disk implementation // =========================================== // read callback handler BOOL _stdcall OnReadCallback ( DRIVE_HANDLE h, ULONGLONG ReadOffset, ULONG ReadSize, void* ReadBuffer, ULONG *BytesRead ) { LONG l = (LONG)(ReadOffset & 0xffffffff); printf("OnReadCallback: low_offset=0x%08X size=%X\n", l, ReadSize); memcpy(ReadBuffer ,&g_memory[0] + ReadOffset, ReadSize); *BytesRead = ReadSize; return TRUE; } // write callback handler BOOL _stdcall OnWriteCallback ( DRIVE_HANDLE h, ULONGLONG WriteOffset, ULONG WriteSize, const void* WriteBuffer, ULONG *BytesWritten ) { LONG l = (LONG)(WriteOffset & 0xffffffff); printf("OnWriteCallback: low_offset=0x%08X size=%X\n", l, WriteSize); memcpy(&g_memory[0] + WriteOffset, WriteBuffer, WriteSize); *BytesWritten = WriteSize; return TRUE; } int CreateVirtualDisk(char DriveLetter) { printf("Creating drive...\n"); // prepare memory buffer g_memory.resize(DISK_SIZE * 1024 * 1024); // create virtual disk g_hDrive = CreateVirtualDrive(DriveLetter,DISK_SIZE, OnReadCallback, OnWriteCallback); if(g_hDrive == INVALID_DRIVE_HANDLE) { printf("ERROR: can not create virtual drive\n"); return 1; } printf("VirtualDrive created. Handle = %d\n",g_hDrive); printf("Press any key to quit\n"); // wait until any key pressed getch(); // dismount disk if(!DestroyVirtualDrive(g_hDrive,FALSE)) { printf("Dismount failed. Forcing dismount operation...\n"); // force dismount... DestroyVirtualDrive(g_hDrive,TRUE); } return 0; }