阅读:1157回复:0
虚拟光驱C源码请高手纠错
这是我根据网上一汇编源程序改编的WIN98下虚拟光驱的C源码,目前存在以下问题:
1.第一次安装该驱动程序,“我的电脑”中不出现虚拟光驱盘符,但设备管理器中有该设备且显示正常; 2.卸载该驱动程序,不重新启动系统,再安装一次该驱动程序,“我的电脑”中出现虚拟光驱盘符,但 使用“系统信息”工具或“VXDVIEW”工具查看,显示已加载的模块中没有该驱动程序; 3.如不卸载该驱动程序,WIN98不能正常启动。 以下是源程序及头文件 // TESTVXD4.c - main module for pdr TESTVXD4 #define DEVICE_MAIN #include "testvxd4.h" #include "ddb.h" #undef DEVICE_MAIN #define TESTVXD4_NAME "TESTVXD4 " #define TESTVXD4_FEATURE 0 #define TESTVXD4_REV 0//1 #define TESTVXD4_IFR 0 int hFile=0; DefineControlHandler(SYS_DYNAMIC_DEVICE_INIT, OnSysDynamicDeviceInit); DefineControlHandler(W32_DEVICEIOCONTROL, OnDeviceIoControl); Declare_Port_Driver(TESTVXD4,DRP_MISC_PD,TESTVXD4_NAME,\ TESTVXD4_REV,TESTVXD4_FEATURE,TESTVXD4_IFR,DRP_BT_ESDI,0) BOOL __cdecl ControlDispatcher( DWORD dwControlMessage, DWORD EBX, DWORD EDX, DWORD ESI, DWORD EDI, DWORD ECX) { START_CONTROL_DISPATCH ON_SYS_DYNAMIC_DEVICE_INIT(OnSysDynamicDeviceInit); ON_W32_DEVICEIOCONTROL(OnDeviceIoControl); END_CONTROL_DISPATCH return TRUE; } BOOL OnSysDynamicDeviceInit(void) { int fh; char str_tmp[100]; IOS_Register(&TESTVXD4_Drp); switch(TESTVXD4_Drp.DRP_reg_result) { case DRP_REMAIN_RESIDENT: return 0; break; case DRP_MINIMIZE: return 0; break; default: return -1; break; } } VOID __cdecl TESTVXD4_Aer(AEP* pAep) { DCB_COMMON* pDcb; ISP_ddb_create createISP; ISP_calldown_insert InsertISP; int fh; char str_tmp[100]; pAep->AEP_result=AEP_SUCCESS; switch (pAep->AEP_func) { case AEP_INITIALIZE: createISP.ISP_ddb_hdr.ISP_func=ISP_CREATE_DDB; createISP.ISP_ddb_size=sizeof(DDB); createISP.ISP_ddb_flags=0; TESTVXD4_Ilb.ILB_service_rtn((PISP)&createISP); if(createISP.ISP_ddb_hdr.ISP_result!=0) pAep->AEP_result = AEP_FAILURE; return; case AEP_BOOT_COMPLETE: if(devcount==0) pAep->AEP_result=AEP_FAILURE; return; case AEP_CONFIG_DCB: pDcb = ((AEP_dcb_config*)pAep)->AEP_d_c_dcb; if (pDcb->DCB_device_type == DCB_type_cdrom) { memset(&InsertISP, 0, sizeof(InsertISP)); InsertISP.ISP_i_cd_hdr.ISP_func = ISP_INSERT_CALLDOWN; // set function InsertISP.ISP_i_cd_dcb = pDcb; // set device InsertISP.ISP_i_cd_req = TESTVXD4_RequestHandler; // specify our request handler InsertISP.ISP_i_cd_lgn = pAep->AEP_lgn; // specify IOS layer InsertISP.ISP_i_cd_flags = DCB_dmd_small_memory| DCB_dmd_physical|DCB_dmd_load_eject_media; InsertISP.ISP_i_cd_expan_len=0; InsertISP.ISP_i_cd_ddb =pDcb->DCB_ptr_cd->DCB_cd_ddb;//pAep->AEP_ddb; TESTVXD4_Ilb.ILB_service_rtn((PISP)&InsertISP); devcount++; } return; case AEP_IOP_TIMEOUT: return; case AEP_DEVICE_INQUIRY: pDcb = ((AEP_inquiry_device*)pAep)->AEP_i_d_dcb; if (((DCB*)pDcb)->DCB_unit_on_ctl == 0) { ((DCB*)pDcb)->DCB_inquiry_flags[0]=DCB_type_cdrom; strcpy(((DCB*)pDcb)->DCB_vendor_id, "TEST "); strcpy(((DCB*)pDcb)->DCB_product_id, "VCD"); pDcb->DCB_device_type=DCB_type_cdrom; pDcb->DCB_disk_bpb_flags=DCBF_DISK_BPB_USEFAKE; pDcb->DCB_device_flags|= DCB_DEV_REMOVABLE; pDcb->DCB_TSD_Flags|=DCB_TSD_ACTUAL_PRE_SET; ((DCB*)pDcb)->DCB_max_xfer_len=0x8000; ((DCB*)pDcb)->DCB_max_sg_elements=16; } else pAep->AEP_result = AEP_NO_MORE_DEVICES; return; break; default: break; } pAep->AEP_result=AEP_FAILURE; } VOID __cdecl TESTVXD4_RequestHandler(IOP* pIop) { int fh; char str_tmp[100]; PDCB dcb=(PDCB)pIop->IOP_physical_dcb; pIop->IOP_ior.IOR_status=IORS_SUCCESS; dcb->DCB_cmn.DCB_device_flags|=DCB_DEV_IO_ACTIVE; //pIop->IOP_physical_dcb->DCB_device_flags|=DCB_DEV_IO_ACTIVE; if(pIop->IOP_ior.IOR_func>=IOR_FORMAT) { //pIop->IOP_physical_dcb->DCB_device_flags&=~DCB_DEV_IO_ACTIVE; dcb->DCB_cmn.DCB_device_flags&=~DCB_DEV_IO_ACTIVE; if(pIop->IOP_ior.IOR_func==IOR_RESTART_QUEUE) pIop->IOP_ior.IOR_status=IORS_SUCCESS; else { pIop->IOP_ior.IOR_status=IORS_INVALID_COMMAND; //pIop->IOP_physical_dcb->DCB_device_flags&=~DCB_DEV_IO_ACTIVE; dcb->DCB_cmn.DCB_device_flags&=~DCB_DEV_IO_ACTIVE; } --pIop->IOP_callback_ptr; pIop->IOP_callback_ptr->IOP_CB_address(pIop); return; } switch(pIop->IOP_ior.IOR_func) { case IOR_READ: if(pIop->IOP_ior.IOR_start_addr<=0x10) { pIop->IOP_ior.IOR_status=IORS_INVALID_SECTOR; } else { if(hFile==0) { } pIop->IOP_ior.IOR_status=IORS_NO_MEDIA; } break; case IOR_MEDIA_CHECK_RESET: pIop->IOP_ior.IOR_status=IORS_NOT_READY; break; case IOR_GEN_IOCTL: OnCDRomIOCtl(&pIop->IOP_ior); break; case IOR_COMPUTE_GEOM: pIop->IOP_ior.IOR_status=IORS_SUCCESS; break; default: break; } //pIop->IOP_physical_dcb->DCB_device_flags&=~DCB_DEV_IO_ACTIVE; dcb->DCB_cmn.DCB_device_flags&=~DCB_DEV_IO_ACTIVE; --pIop->IOP_callback_ptr; pIop->IOP_callback_ptr->IOP_CB_address(pIop); return; } void OnCDRomIOCtl(IOR* IOR_ptr) { int fh; char str_tmp[100]; pcdrom_dev cdrom_p; switch(IOR_ptr->_ureq.sdeffsd_req_usage._IOR_ioctl_function) { case CD_IO_RESET_DRIVE: IOR_ptr->_ureq.sdeffsd_req_usage._IOR_ioctl_return=NO_ERROR; break; case CD_IO_SEEK: IOR_ptr->_ureq.sdeffsd_req_usage._IOR_ioctl_return=NO_ERROR; break; case CD_IO_GET_DEV_STATUS: IOR_ptr->_ureq.sdeffsd_req_usage._IOR_ioctl_return=NO_ERROR; cdrom_p=(pcdrom_dev)IOR_ptr->IOR_ioctl_buffer_ptr; cdrom_p->Reserved=0; cdrom_p->DeviceStatus=CDDEVSTAT_AUDIO_MANIPULATE| CDDEVSTAT_REDBOOK_TOO|(CDDEVSTAT_NO_DISK_IN_DRIVE+CDDEVSTAT_CDXA); //IOR_ptr->IOR_ioctl_buffer_ptr=0; //IOR_ptr->IOR_ioctl_client_params=CDDEVSTAT_AUDIO_MANIPULATE| //IOR_ptr->IOR_ioctl_buffer_ptr=CDDEVSTAT_AUDIO_MANIPULATE| //CDDEVSTAT_REDBOOK_TOO|(CDDEVSTAT_NO_DISK_IN_DRIVE+CDDEVSTAT_CDXA);//CDDEVSTAT_PLAY_AUDIO_TOO| break; case CD_IO_DISC_INFO: IOR_ptr->_ureq.sdeffsd_req_usage._IOR_ioctl_return=IORS_NO_MEDIA; break; default: IOR_ptr->_ureq.sdeffsd_req_usage._IOR_ioctl_return=IORS_INVALID_COMMAND; IOR_ptr->IOR_status= IORS_INVALID_COMMAND; return; break; } IOR_ptr->IOR_status=IORS_SUCCESS; } DWORD OnDeviceIoControl(PIOCTLPARAMS p) { return 0; } // TESTVXD4.h - include file for pdr TESTVXD4 #include <vtoolsc.h> #define TESTVXD4_Major 4 #define TESTVXD4_Minor 0 #define TESTVXD4_DeviceID UNDEFINED_DEVICE_ID #define TESTVXD4_Init_Order UNDEFINED_INIT_ORDER unsigned char devcount; #define CDDEVSTAT_DOOR_OPEN 1 #define CDDEVSTAT_DOOR_UNLOCKED 2 #define CDDEVSTAT_READ_RAW_TOO 4 #define CDDEVSTAT_WRITE_TOO 8 #define CDDEVSTAT_PLAY_AUDIO_TOO 0x010 #define CDDEVSTAT_INTERLEAVE 0x020 #define CDDEVSTAT_RESERVED_6 0x040 #define CDDEVSTAT_PREFETCHING 0x080 #define CDDEVSTAT_AUDIO_MANIPULATE 0x0100 #define CDDEVSTAT_REDBOOK_TOO 0x0200 #define CDDEVSTAT_CDXA 0x0400 #define CDDEVSTAT_NO_DISK_IN_DRIVE 0x0800 #define CDDEVSTAT_RW_CHANNELS_OK 0x01000 #define CDDEVSTAT_RESERVED_13 0x02000 #define CDDEVSTAT_PLAYING_AUDIO 0x04000 #define CDDEVSTAT_SPEED_ADJUSTABLE 0x08000 #define CDDEVSTAT_SPEED_NONSTANDARD 0x010000 #define CD_IO_DISC_INFO 0xCD0B // Get Disk Information #define CD_IO_RESET_DRIVE 0xCD00 #define CD_IO_SEEK 0xCD01 // Seek the Read Head #define CD_IO_GET_DEV_STATUS 0xCD02 // Get Device Status Info #define CD_IO_GET_SECTOR_SIZE 0xCD03 // Get Current Sector Size #define CD_IO_GET_HEAD_LOCATION 0xCD04 // Get Head Location #define CD_IO_QCHAN_UPC 0xCD05 // Get Media Catalog Number #define CD_IO_QCHAN_ISRC 0xCD06 // Get ISRC for Track #define CD_IO_QCHAN_CURRENT_INFO 0xCD07 // Get Current Q Channel Info #define CD_IO_GET_AUDIO_STATE 0xCD08 // Get Audio Pause State #define CD_IO_GET_AUDIO_CHAN_CTRL 0xCD09 // Get Audio Volume Controls #define CD_IO_SET_AUDIO_CHAN_CTRL 0xCD0A // Set Audio Volume Controls #define CD_IO_TRACK_INFO 0xCD0C // Get Track Parameters #define CD_IO_AUDIO_SUB_CHAN_INFO 0xCD0D // Get P-W Subchannel Vector #define CD_IO_AUDIO_PLAY 0xCD0E // Play Audio Selection #define CD_IO_AUDIO_STOP 0xCD0F // Pause or Stop Audio Play #define CD_IO_AUDIO_RESUME 0xCD10 // Resume Audio Play #define CD_IO_SECTOR_INFO 0xCD11 // Get Sector Information #define CD_IO_QUERY_SPEED 0xCD12 // Get Current Device Speed #define CD_IO_QUERY_SPEED_CAPS 0xCD13 // Get Speed Capabilities #define CD_IO_SET_SPEED 0xCD14 // Set New Device Speed #define CD_IO_GENERIC 0xCD15 // Generic Vendor specific IOCTL #define CD_IO_READ_DRIVE_INFO 0xCD16 // Reads driver specific info #define CD_IO_READ_ERROR_STATS 0xCD17 // Reads error statistic info // specific to each IOCTL #define CD_IO_WRITE_DRIVE_INFO 0xCD18 ; // Writes driver specific info #define CD_IO_QUERY_IOCTL_FUNC 0xCF00 typedef struct CDROM_DEVTag{ unsigned long Reserved; // Reserved - must be zero unsigned long DeviceStatus; // CD-ROM Device Status Indicator }cdrom_dev,*pcdrom_dev; VOID __cdecl TESTVXD4_RequestHandler(IOP* pIop); void OnCDRomIOCtl(IOR* IOR_ptr); 以下是inf文件 ;Copyright 2004 xiao.h.l [Version] Signature="$CHICAGO$" Class=adapter Provider=%String0% [Manufacturer] %String0%=SECTION_0 [SECTION_0] %String1%=XHL123.Install,XHL_TEST_ID [XHL123.Install] AddReg=AddReg_XHL123 Copyfiles=@testvxd4.pdr [AddReg_XHL123] HKR,,DevLoader,,"*IOS" HKR,,PortDriver,,"testvxd4.pdr" [DestinationDirs] DefaultDestDir=12 [Strings] String0="XHL Corp" String1="testvxd4 vcd 123" |
|
|