Develop and Download Open Source Software

Browse CVS Repository

Contents of /enbanfukusyaya/EnbanKensa/common/drive.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.5 - (show annotations) (download) (as text)
Sun Dec 11 15:25:30 2005 UTC (18 years, 4 months ago) by bananajinn
Branch: MAIN
CVS Tags: HEAD
Changes since 1.4: +108 -108 lines
File MIME type: text/x-csrc
*** empty log message ***

1 /**
2 * 円盤複写屋 - EnbanKensa
3 * Copyright (C) 2005 Kagetani Hideto
4 * drive.c - 光ディスク系ドライブアクセス関数群
5 * $Date: 2005/12/11 15:21:45 $
6 * $Revision: 1.4 $
7 */
8
9 #if !defined(WIN32)
10 # include <stdlib.h>
11 # include <string.h>
12 #endif
13
14 #include "drive.h"
15 #include "cmd.h"
16
17 int SendCmd(CMDDRIVE *drive, BYTE *cdb, DWORD buflen, BYTE reqflag)
18 {
19 int ret;
20
21 if(drive->cmd_type == CMDDRVCTYPE_UNKNOWN){
22 drive->cmd_type = CMDDRVCTYPE_CHECKING;
23 CheckAtapi(drive);
24 }
25
26 drive->cmdcode = cdb[0];
27 ret = SendAspiCmd(&drive->drive, cdb, drive->data_buf, buflen,
28 drive->sense_data, sizeof(drive->sense_data), reqflag);
29 return ret;
30 }
31
32 int InitializeCmdDrive(CMDDRIVE *drive, int bufsize)
33 {
34 int ret;
35
36 FreeCmdDrive(drive);
37 drive->cmd_type = CMDDRVCTYPE_UNKNOWN;
38
39 if(bufsize>0){
40 drive->data_buf = (BYTE *)malloc(bufsize);
41 if(drive->data_buf==NULL){
42 return RET_NG;
43 }
44 drive->bufsize = bufsize;
45 drive->own_alloc = TRUE;
46 }
47
48 ret = InitializeDrive(&drive->drive);
49 if(ret != RET_OK){
50 if(drive->own_alloc){
51 free(drive->data_buf);
52 drive->data_buf=NULL;
53 }
54 return ret;
55 }
56
57 return RET_OK;
58 }
59
60 void FreeCmdDrive(CMDDRIVE *drive)
61 {
62 if(drive->data_buf!=NULL){
63 if(drive->own_alloc){
64 free(drive->data_buf);
65 }
66 drive->data_buf=NULL;
67 }
68
69 FreeDrive(&drive->drive);
70 }
71
72 void CheckAtapi(CMDDRIVE *drive)
73 {
74 BYTE cdb[12];
75 BYTE buf[12];
76 BYTE *keep;
77 int ret;
78
79 keep = drive->data_buf;
80 drive->data_buf = buf;
81
82 memset(cdb, 0, sizeof(cdb));
83 cdb[0] = CMD_MODE_SENSE10;
84 cdb[2] = 0x2a;
85 cdb[8] = 12;
86 ret = SendCmd(drive, cdb, 12, REQ_DATAIN);
87 if(ret!=RET_OK){
88 drive->cmd_type = CMDDRVCTYPE_SCSI;
89 }
90 else{
91 drive->cmd_type = (drive->data_buf[8]==0x2a ? CMDDRVCTYPE_ATAPI:CMDDRVCTYPE_SCSI);
92 }
93
94 drive->data_buf = keep;
95 }
96
97 int SetDriveAspiSetting(CMDDRIVE *drive, int *ha, int *tg, DWORD *timeout)
98 {
99 drive->cmd_type = CMDDRVCTYPE_UNKNOWN;
100 return SetAspiSetting(&drive->drive, ha, tg, timeout);
101 }
102
103 void SetDriveBuffer(CMDDRIVE *drive, char *data_buf, int bufsize)
104 {
105 drive->data_buf = data_buf;
106 drive->bufsize = bufsize;
107 }
108

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26