www.pudn.com > InsProDisk.Partial.Src.rar > BusLIb.cpp
#include "stdafx.h" #include#include "buslib.h" #include #include #include #include "../SDBUSGUID.H" #include "../SDBUSCMD.H" static void Err(char *s) { MessageBox(0,s,"Error!",MB_OK|MB_ICONERROR); } HANDLE __stdcall SDBusOpen() { LPBUSHANDLE BusHandle= new BUSHANDLE; // //Allocate the handle buffer // if (!BusHandle) { return INVALID_HANDLE_VALUE; } // //Get all device that support GUID_SDBUS_BUS_INTERFACE // BusHandle->hardwareDeviceInfo = SetupDiGetClassDevs( (LPGUID)&GUID_SDBUS_BUS_INTERFACE, NULL, // Define no enumerator (global) NULL, // Define no (DIGCF_PRESENT |DIGCF_INTERFACEDEVICE) ); if(INVALID_HANDLE_VALUE == BusHandle->hardwareDeviceInfo) { Err("SetupDiGetClassDevs failed\n"); return INVALID_HANDLE_VALUE; } // //pick out the first device support interface for SDBUS // BusHandle->deviceInterfaceData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA); if (!SetupDiEnumDeviceInterfaces(BusHandle->hardwareDeviceInfo, 0, // No care about specific PDOs (LPGUID)&GUID_SDBUS_BUS_INTERFACE, 0, // &BusHandle->deviceInterfaceData)) { SetupDiDestroyDeviceInfoList(BusHandle->hardwareDeviceInfo); delete BusHandle; return INVALID_HANDLE_VALUE; } PSP_INTERFACE_DEVICE_DETAIL_DATA deviceInterfaceDetailData; ULONG predictedLength = 100000; ULONG requiredLength; // //Get the WIN32 link name for BUS interface // SetupDiGetInterfaceDeviceDetail ( BusHandle->hardwareDeviceInfo, &BusHandle->deviceInterfaceData, NULL, // probing so no output buffer yet 0, // probing so output buffer length of zero &requiredLength, NULL); predictedLength = requiredLength; deviceInterfaceDetailData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)new char[predictedLength]; deviceInterfaceDetailData->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA); if (! SetupDiGetInterfaceDeviceDetail ( BusHandle->hardwareDeviceInfo, &BusHandle->deviceInterfaceData, deviceInterfaceDetailData, predictedLength, &requiredLength, NULL)) { Err("Error in SetupDiGetInterfaceDeviceDetail\n"); delete deviceInterfaceDetailData; SetupDiDestroyDeviceInfoList(BusHandle->hardwareDeviceInfo); delete BusHandle; return INVALID_HANDLE_VALUE; } // //Open the handle to device // BusHandle->hBusInterface = CreateFile ( deviceInterfaceDetailData->DevicePath, GENERIC_READ | GENERIC_WRITE, 0, // FILE_SHARE_READ | FILE_SHARE_WRITE NULL, // no SECURITY_ATTRIBUTES structure OPEN_EXISTING, // No special create flags 0, // No special attributes NULL); // No template file if (INVALID_HANDLE_VALUE == BusHandle->hBusInterface) { Err("Device not ready!"); delete deviceInterfaceDetailData; SetupDiDestroyDeviceInfoList(BusHandle->hardwareDeviceInfo); delete BusHandle; return INVALID_HANDLE_VALUE; } delete deviceInterfaceDetailData; return (HANDLE)BusHandle; } VOID __stdcall SDBusClose(HANDLE handle) { LPBUSHANDLE BusHandle= (LPBUSHANDLE)handle; CloseHandle(BusHandle->hBusInterface); SetupDiDestroyDeviceInfoList(BusHandle->hardwareDeviceInfo); delete BusHandle; } LONG __stdcall SDBusCreateDisk(HANDLE handle,char *FileName,ULONG BlockCount) { HANDLE hvdisk; DWORD attr; LARGE_INTEGER li; // //Create the file // hvdisk = CreateFile(FileName,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); if (hvdisk == INVALID_HANDLE_VALUE) { return -1; } //WriteFile(hvdisk,"1",1,&attr,0); CloseHandle(hvdisk); attr = GetFileAttributes(FileName); hvdisk = CreateFile(FileName,GENERIC_WRITE|GENERIC_READ,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); if (hvdisk == INVALID_HANDLE_VALUE) { return -1; } if (attr & FILE_ATTRIBUTE_COMPRESSED) { USHORT cmpr = COMPRESSION_FORMAT_NONE; if (!DeviceIoControl(hvdisk,FSCTL_SET_COMPRESSION,&cmpr,sizeof(cmpr),NULL,0,&attr,0)) { Err("Can't change file attributes\n"); CloseHandle(hvdisk); return -1; } } li.QuadPart = ((__int64)BlockCount/0x3f/0xff + 2)*0x3f*0xff*512; if ( INVALID_SET_FILE_POINTER == SetFilePointer(hvdisk,li.LowPart,&li.HighPart,FILE_BEGIN)) { Err("Create disk image error\n"); CloseHandle(hvdisk); return -1; } if (!SetEndOfFile(hvdisk)) { Err("Create disk image error when enlarge the image file\n"); CloseHandle(hvdisk); return -1; } CloseHandle(hvdisk); return 0; } LONG __stdcall SDBusPlugInDisk(HANDLE handle,char *FileName) { LPBUSHANDLE BusHandle= (LPBUSHANDLE)handle; HANDLE hvdisk; I_PLUGIN plugindev = {0}; ULARGE_INTEGER li; ULONG SlotNum; DWORD dw; DWORD attr; hvdisk = CreateFile(FileName,GENERIC_WRITE|GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if (hvdisk == INVALID_HANDLE_VALUE) { return -1; } li.LowPart = GetFileSize(hvdisk,&li.HighPart); attr = GetFileAttributes(FileName); CloseHandle(hvdisk); if (attr & FILE_ATTRIBUTE_COMPRESSED) { Err("Don't use file compress to Vitrual Disk Image\n"); return -1; } wcscpy(plugindev.DEVICE_ID,L"SDBUS\\DISK"); wcscpy(plugindev.DeviceDesc,L"Secu-X bus Disk"); plugindev.VirtualDiskInfo.VitualHDDBlockCount = li.QuadPart/512; swprintf(plugindev.VirtualDiskInfo.VitualHDDFileName,L"%S",FileName); if (!DeviceIoControl(BusHandle->hBusInterface, IOCTL_SECUXBUS_PLUGIN_HARDWARE, &plugindev,sizeof(plugindev), &SlotNum,sizeof(SlotNum),&dw,0)) { Err("IOCTL_SECUXBUS_PLUGIN_HARDWARE failed\n"); return -1; } return SlotNum; } LONG __stdcall SDBusUnPlugDisk(HANDLE handle,LONG SlotNum) { LPBUSHANDLE BusHandle= (LPBUSHANDLE)handle; DWORD dw; if (!DeviceIoControl(BusHandle->hBusInterface,IOCTL_SECUXBUS_EJECT_HARDWARE,&SlotNum,sizeof(SlotNum),0,0,&dw,0)) { Err("IOCTL_SECUXBUS_EJECT_HARDWARE failed\n"); return -1; } return 0; } LONG __stdcall SDBusGetList(HANDLE handle,void *Buffer,ULONG cbBuffer) { LPBUSHANDLE BusHandle= (LPBUSHANDLE)handle; DWORD dw; if (!DeviceIoControl(BusHandle->hBusInterface,IOCTL_SECUBUS_GET_HARDWARE_LIST,0,0,Buffer,cbBuffer,&dw,0)) { return 0; } return dw/sizeof(I_GET_LIST); }