Native dll API usage is the most quick and efficient way to implement virtual drive callback handlers. Native DLL can be used by any programming language that supports external DLL functions calls. It can be C++, Delphi, Visual Basic etc. Script languages like python should use
COM interface.
#ifndef _VSDK_COMMON_DECL_H_
#define _VSDK_COMMON_DECL_H_
#include <windows.h>
typedef long DRIVE_HANDLE;
#define INVALID_DRIVE_HANDLE -1
typedef BOOL (_stdcall *ON_READ_CALLBACK)(
DRIVE_HANDLE h,
ULONGLONG ReadOffset,
ULONG ReadSize,
void* ReadBuffer,
ULONG *BytesRead
);
typedef BOOL (_stdcall *ON_WRITE_CALLBACK)(
DRIVE_HANDLE h,
ULONGLONG WriteOffset,
ULONG WriteSize,
const void* WriteBuffer,
ULONG *BytesWritten
);
enum
{
VDSDK_OnUnmountRemovableMedia = 0,
VDSDK_OnUnmountedDrive = 1,
};
typedef BOOL (_stdcall *ON_VDSDK_NOTIFICATION)(
DRIVE_HANDLE h,
ULONG NotificationCode,
ULONG Reserved
);
typedef BOOL (_stdcall *ON_FORMAT_CALLBACK)(ULONG Progress);
#endif
#ifndef _VSDK_DLL_H_
#define _VSDK_DLL_H_
#include "VDSDKCommon.h"
#ifdef VSDK_DLL_EXPORTS
#define VDSDK_API extern "C" _declspec(dllexport)
#else
#define VDSDK_API extern "C" _declspec(dllimport)
#endif
enum
{
DRIVE_FLAG_REMOVABLE = 1,
DRIVE_FLAG_CDROM = 2,
DRIVE_FLAG_FLOPPY = 4,
};
VDSDK_API
BOOL
_stdcall InitializeVDSDK();
VDSDK_API
void
_stdcall ShutdownVDSDK(BOOL bForceUnmountDisks);
VDSDK_API
DRIVE_HANDLE
_stdcall CreateVirtualDrive(
char DriveLetter,
ULONG DriveSize,
ON_READ_CALLBACK pReadCallback,
ON_WRITE_CALLBACK pWriteCallback
);
VDSDK_API
DRIVE_HANDLE
_stdcall CreateVirtualDriveEx(
char DriveLetter,
ULONG DriveSize,
ON_READ_CALLBACK pReadCallback,
ON_WRITE_CALLBACK pWriteCallback,
BOOL bReadOnly,
ULONG DriveFlags
);
VDSDK_API
BOOL
_stdcall FormatVirtualDrive(
DRIVE_HANDLE h,
BOOL bQuickFormat,
const char* FileSystem,
const char* VolumeLabel,
ON_FORMAT_CALLBACK pCallbackHandler);
VDSDK_API
BOOL
_stdcall DestroyVirtualDrive(DRIVE_HANDLE h, BOOL bForce);
VDSDK_API
int
_stdcall GetVDSDKErrorCode();
VDSDK_API
void
_stdcall RegisterNotificationHandler(ON_VDSDK_NOTIFICATION pNotificationHandler);
VDSDK_API
BOOL
_stdcall InstallDriver();
VDSDK_API
BOOL
_stdcall StartDriver();
VDSDK_API
BOOL
_stdcall StopDriver();
VDSDK_API
BOOL
_stdcall UninstallDriver();
VDSDK_API
BOOL
_stdcall IsDriverReady();
VDSDK_API
BOOL
_stdcall GetVDSDKDriverVersion(int &major, int &minor);
VDSDK_API
BOOL
_stdcall ActivateVDSDK(const char* ActivationKey);
#endif
#ifndef _VSDK_DYNAMIC_LOAD_H_
#define _VSDK_DYNAMIC_LOAD_H_
#include "VDSDKCommon.h"
typedef BOOL (_stdcall *Proc_InitializeVDSDK)();
typedef void (_stdcall *Proc_ShutdownVDSDK)(BOOL bForceUnmountDisks);
typedef DRIVE_HANDLE (_stdcall *Proc_CreateVirtualDrive)(
char DriveLetter,
ULONG DriveSize,
ON_READ_CALLBACK pReadCallback,
ON_WRITE_CALLBACK pWriteCallback
);
typedef DRIVE_HANDLE (_stdcall *Proc_CreateVirtualDriveEx)(
char DriveLetter,
ULONG DriveSize,
ON_READ_CALLBACK pReadCallback,
ON_WRITE_CALLBACK pWriteCallback,
BOOL bReadOnly,
ULONG DriveFlags
);
typedef BOOL (_stdcall *Proc_DestroyVirtualDrive)(DRIVE_HANDLE h, BOOL bForce);
typedef int (_stdcall *Proc_GetVDSDKErrorCode)();
typedef BOOL (_stdcall *Proc_InstallDriver)();
typedef BOOL (_stdcall *Proc_StartDriver)();
typedef BOOL (_stdcall *Proc_StopDriver)();
typedef BOOL (_stdcall *Proc_UninstallDriver)();
typedef BOOL (_stdcall *Proc_IsDriverReady)();
typedef BOOL (_stdcall *Proc_GetVDSDKDriverVersion)(int &major, int &minor);
typedef BOOL (_stdcall *Proc_ActivateVDSDK)(const char* ActivationKey);
typedef BOOL (_stdcall *Proc_FormatVirtualDrive)(DRIVE_HANDLE h, BOOL bQuickFormat, const char* FileSystem, const char* VolumeLabel, ON_FORMAT_CALLBACK pCallback);
typedef void (_stdcall *Proc_RegisterNotificationHandler)(ON_VDSDK_NOTIFICATION pNotificationHandler);
bool InitializeVDSDKFunctionPointers(const char* DllPath = "VDSDKDll.dll");
#ifdef _VDSDK_DECLARE_FUNCTION_POINTERS_
Proc_InitializeVDSDK InitializeVDSDK = NULL;
Proc_ShutdownVDSDK ShutdownVDSDK = NULL;
Proc_CreateVirtualDrive CreateVirtualDrive = NULL;
Proc_CreateVirtualDriveEx CreateVirtualDriveEx = NULL;
Proc_DestroyVirtualDrive DestroyVirtualDrive = NULL;
Proc_GetVDSDKErrorCode GetVDSDKErrorCode = NULL;
Proc_InstallDriver InstallDriver = NULL;
Proc_StartDriver StartDriver = NULL;
Proc_StopDriver StopDriver = NULL;
Proc_UninstallDriver UninstallDriver = NULL;
Proc_IsDriverReady IsDriverReady = NULL;
Proc_GetVDSDKDriverVersion GetVDSDKDriverVersion = NULL;
Proc_ActivateVDSDK ActivateVDSDK = NULL;
Proc_FormatVirtualDrive FormatVirtualDrive = NULL;
Proc_RegisterNotificationHandler RegisterNotificationHandler = NULL;
bool InitializeVDSDKFunctionPointers(const char* DllPath)
{
HMODULE h = LoadLibrary(DllPath);
if(h == NULL)
return false;
if((InitializeVDSDK = (Proc_InitializeVDSDK)GetProcAddress(h, "InitializeVDSDK")) == NULL)return false;
if((ShutdownVDSDK = (Proc_ShutdownVDSDK)GetProcAddress(h, "ShutdownVDSDK")) == NULL)return false;
if((CreateVirtualDrive = (Proc_CreateVirtualDrive)GetProcAddress(h, "CreateVirtualDrive")) == NULL)return false;
if((CreateVirtualDriveEx = (Proc_CreateVirtualDriveEx)GetProcAddress(h, "CreateVirtualDriveEx")) == NULL)return false;
if((DestroyVirtualDrive = (Proc_DestroyVirtualDrive)GetProcAddress(h, "DestroyVirtualDrive")) == NULL)return false;
if((GetVDSDKErrorCode = (Proc_GetVDSDKErrorCode)GetProcAddress(h, "GetVDSDKErrorCode")) == NULL)return false;
if((InstallDriver = (Proc_InstallDriver)GetProcAddress(h, "InstallDriver")) == NULL)return false;
if((StartDriver = (Proc_StartDriver)GetProcAddress(h, "StartDriver")) == NULL)return false;
if((StopDriver = (Proc_StopDriver)GetProcAddress(h, "StopDriver")) == NULL)return false;
if((UninstallDriver = (Proc_UninstallDriver)GetProcAddress(h, "UninstallDriver")) == NULL)return false;
if((IsDriverReady = (Proc_IsDriverReady)GetProcAddress(h, "IsDriverReady")) == NULL)return false;
if((GetVDSDKDriverVersion = (Proc_GetVDSDKDriverVersion)GetProcAddress(h, "GetVDSDKDriverVersion")) == NULL)return false;
if((ActivateVDSDK = (Proc_ActivateVDSDK)GetProcAddress(h, "ActivateVDSDK")) == NULL)return false;
if((FormatVirtualDrive = (Proc_FormatVirtualDrive)GetProcAddress(h, "FormatVirtualDrive")) == NULL)return false;
if((RegisterNotificationHandler = (Proc_RegisterNotificationHandler)GetProcAddress(h, "RegisterNotificationHandler")) == NULL)return false;
return true;
}
#endif
#endif