xhlxhl
驱动牛犊
驱动牛犊
  • 注册日期2004-10-15
  • 最后登录2011-01-23
  • 粉丝0
  • 关注0
  • 积分177分
  • 威望19点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
阅读:1156回复:0

虚拟光驱C源码请高手纠错

楼主#
更多 发布于:2004-11-12 10:07
这是我根据网上一汇编源程序改编的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"
xhlxhl
游客

返回顶部