Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
d1d5ca53
Commit
d1d5ca53
authored
May 20, 2003
by
Yorick Hardy
Committed by
Alexandre Julliard
May 20, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implement CDROM_ScsiPassThrough and CDROM_ScsiPassThroughDirect on
NetBSD.
parent
b2f32bc6
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
130 additions
and
0 deletions
+130
-0
cdrom.c
dlls/ntdll/cdrom.c
+130
-0
No files found.
dlls/ntdll/cdrom.c
View file @
d1d5ca53
...
...
@@ -1410,6 +1410,67 @@ static DWORD CDROM_ScsiPassThroughDirect(int dev, PSCSI_PASS_THROUGH_DIRECT pPac
pPacket
->
ScsiStatus
=
cmd
.
stat
;
ret
=
CDROM_GetStatusCode
(
io
);
#elif defined(__NetBSD__)
scsireq_t
cmd
;
int
io
;
if
(
pPacket
->
Length
<
sizeof
(
SCSI_PASS_THROUGH_DIRECT
))
return
STATUS_BUFFER_TOO_SMALL
;
if
(
pPacket
->
CdbLength
>
12
)
return
STATUS_INVALID_PARAMETER
;
if
(
pPacket
->
SenseInfoLength
>
SENSEBUFLEN
)
return
STATUS_INVALID_PARAMETER
;
memset
(
&
cmd
,
0
,
sizeof
(
cmd
));
memcpy
(
&
(
cmd
.
cmd
),
&
(
pPacket
->
Cdb
),
pPacket
->
CdbLength
);
cmd
.
cmdlen
=
pPacket
->
CdbLength
;
cmd
.
databuf
=
pPacket
->
DataBuffer
;
cmd
.
datalen
=
pPacket
->
DataTransferLength
;
cmd
.
senselen
=
pPacket
->
SenseInfoLength
;
cmd
.
timeout
=
pPacket
->
TimeOutValue
*
1000
;
/* in milliseconds */
switch
(
pPacket
->
DataIn
)
{
case
SCSI_IOCTL_DATA_OUT
:
cmd
.
flags
|=
SCCMD_WRITE
;
break
;
case
SCSI_IOCTL_DATA_IN
:
cmd
.
flags
|=
SCCMD_READ
;
break
;
case
SCSI_IOCTL_DATA_UNSPECIFIED
:
cmd
.
flags
=
0
;
break
;
default:
return
STATUS_INVALID_PARAMETER
;
}
io
=
ioctl
(
cdrom_cache
[
dev
].
fd
,
SCIOCCOMMAND
,
&
cmd
);
switch
(
cmd
.
retsts
)
{
case
SCCMD_OK
:
break
;
case
SCCMD_TIMEOUT
:
return
STATUS_TIMEOUT
;
break
;
case
SCCMD_BUSY
:
return
STATUS_DEVICE_BUSY
;
break
;
case
SCCMD_SENSE
:
break
;
case
SCCMD_UNKNOWN
:
return
STATUS_UNSUCCESSFUL
;
break
;
}
if
(
pPacket
->
SenseInfoLength
!=
0
)
{
memcpy
((
char
*
)
pPacket
+
pPacket
->
SenseInfoOffset
,
cmd
.
sense
,
pPacket
->
SenseInfoLength
);
}
pPacket
->
ScsiStatus
=
cmd
.
status
;
ret
=
CDROM_GetStatusCode
(
io
);
#endif
return
ret
;
}
...
...
@@ -1480,6 +1541,75 @@ static DWORD CDROM_ScsiPassThrough(int dev, PSCSI_PASS_THROUGH pPacket)
pPacket
->
ScsiStatus
=
cmd
.
stat
;
ret
=
CDROM_GetStatusCode
(
io
);
#elif defined(__NetBSD__)
scsireq_t
cmd
;
int
io
;
if
(
pPacket
->
Length
<
sizeof
(
SCSI_PASS_THROUGH
))
return
STATUS_BUFFER_TOO_SMALL
;
if
(
pPacket
->
CdbLength
>
12
)
return
STATUS_INVALID_PARAMETER
;
if
(
pPacket
->
SenseInfoLength
>
SENSEBUFLEN
)
return
STATUS_INVALID_PARAMETER
;
memset
(
&
cmd
,
0
,
sizeof
(
cmd
));
memcpy
(
&
(
cmd
.
cmd
),
&
(
pPacket
->
Cdb
),
pPacket
->
CdbLength
);
if
(
pPacket
->
DataBufferOffset
>
0x1000
)
{
cmd
.
databuf
=
(
void
*
)
pPacket
->
DataBufferOffset
;
}
else
{
cmd
.
databuf
=
(
char
*
)
pPacket
+
pPacket
->
DataBufferOffset
;
}
cmd
.
cmdlen
=
pPacket
->
CdbLength
;
cmd
.
datalen
=
pPacket
->
DataTransferLength
;
cmd
.
senselen
=
pPacket
->
SenseInfoLength
;
cmd
.
timeout
=
pPacket
->
TimeOutValue
*
1000
;
/* in milliseconds */
switch
(
pPacket
->
DataIn
)
{
case
SCSI_IOCTL_DATA_OUT
:
cmd
.
flags
|=
SCCMD_WRITE
;
break
;
case
SCSI_IOCTL_DATA_IN
:
cmd
.
flags
|=
SCCMD_READ
;
break
;
case
SCSI_IOCTL_DATA_UNSPECIFIED
:
cmd
.
flags
=
0
;
break
;
default:
return
STATUS_INVALID_PARAMETER
;
}
io
=
ioctl
(
cdrom_cache
[
dev
].
fd
,
SCIOCCOMMAND
,
&
cmd
);
switch
(
cmd
.
retsts
)
{
case
SCCMD_OK
:
break
;
case
SCCMD_TIMEOUT
:
return
STATUS_TIMEOUT
;
break
;
case
SCCMD_BUSY
:
return
STATUS_DEVICE_BUSY
;
break
;
case
SCCMD_SENSE
:
break
;
case
SCCMD_UNKNOWN
:
return
STATUS_UNSUCCESSFUL
;
break
;
}
if
(
pPacket
->
SenseInfoLength
!=
0
)
{
memcpy
((
char
*
)
pPacket
+
pPacket
->
SenseInfoOffset
,
cmd
.
sense
,
pPacket
->
SenseInfoLength
);
}
pPacket
->
ScsiStatus
=
cmd
.
status
;
ret
=
CDROM_GetStatusCode
(
io
);
#endif
return
ret
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment