mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
822 lines
93 KiB
822 lines
93 KiB
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
|
<html xmlns:v="urn:schemas-microsoft-com:vml"
|
|
xmlns:o="urn:schemas-microsoft-com:office:office"
|
|
xmlns:w="urn:schemas-microsoft-com:office:word"
|
|
xmlns="http://www.w3.org/TR/REC-html40">
|
|
|
|
<head>
|
|
<meta http-equiv=Content-Type content="text/html; charset=unicode">
|
|
<meta name=ProgId content=Word.Document>
|
|
<meta name=Generator content="Microsoft Word 9">
|
|
<meta name=Originator content="Microsoft Word 9">
|
|
<link rel=File-List href="./spti_files/filelist.xml">
|
|
<!--[if gte mso 9]><xml>
|
|
<w:WordDocument>
|
|
<w:ActiveWritingStyle Lang="EN-US" VendorID="64" DLLVersion="131077"
|
|
NLCheck="1">1</w:ActiveWritingStyle>
|
|
</w:WordDocument>
|
|
</xml><![endif]-->
|
|
<style>
|
|
<!--
|
|
/* Font Definitions */
|
|
@font-face
|
|
{font-family:"MS Sans Serif";
|
|
panose-1:0 0 0 0 0 0 0 0 0 0;
|
|
mso-font-charset:0;
|
|
mso-generic-font-family:swiss;
|
|
mso-font-format:other;
|
|
mso-font-pitch:variable;
|
|
mso-font-signature:3 0 0 0 1 0;}
|
|
@font-face
|
|
{font-family:Wingdings;
|
|
panose-1:5 0 0 0 0 0 0 0 0 0;
|
|
mso-font-charset:2;
|
|
mso-generic-font-family:auto;
|
|
mso-font-pitch:variable;
|
|
mso-font-signature:0 268435456 0 0 -2147483648 0;}
|
|
@font-face
|
|
{font-family:"MS Mincho";
|
|
panose-1:0 0 0 0 0 0 0 0 0 0;
|
|
mso-font-alt:"MS 明朝";
|
|
mso-font-charset:128;
|
|
mso-generic-font-family:roman;
|
|
mso-font-format:other;
|
|
mso-font-pitch:fixed;
|
|
mso-font-signature:1 134676480 16 0 131072 0;}
|
|
@font-face
|
|
{font-family:Verdana;
|
|
panose-1:2 11 6 4 3 5 4 4 2 4;
|
|
mso-font-charset:0;
|
|
mso-generic-font-family:swiss;
|
|
mso-font-pitch:variable;
|
|
mso-font-signature:536871559 0 0 0 415 0;}
|
|
@font-face
|
|
{font-family:"\@MS Mincho";
|
|
panose-1:0 0 0 0 0 0 0 0 0 0;
|
|
mso-font-charset:128;
|
|
mso-generic-font-family:roman;
|
|
mso-font-format:other;
|
|
mso-font-pitch:fixed;
|
|
mso-font-signature:1 134676480 16 0 131072 0;}
|
|
/* Style Definitions */
|
|
p.MsoNormal, li.MsoNormal, div.MsoNormal
|
|
{mso-style-parent:"";
|
|
margin:0in;
|
|
margin-bottom:.0001pt;
|
|
mso-pagination:widow-orphan;
|
|
font-size:12.0pt;
|
|
font-family:"Times New Roman";
|
|
mso-fareast-font-family:"Times New Roman";
|
|
color:black;}
|
|
h2
|
|
{margin-right:0in;
|
|
mso-margin-top-alt:auto;
|
|
mso-margin-bottom-alt:auto;
|
|
margin-left:0in;
|
|
mso-pagination:widow-orphan;
|
|
mso-outline-level:2;
|
|
font-size:18.0pt;
|
|
font-family:"Times New Roman";
|
|
color:black;
|
|
font-weight:bold;}
|
|
h3
|
|
{margin-right:0in;
|
|
mso-margin-top-alt:auto;
|
|
mso-margin-bottom-alt:auto;
|
|
margin-left:0in;
|
|
mso-pagination:widow-orphan;
|
|
mso-outline-level:3;
|
|
font-size:13.5pt;
|
|
font-family:"Times New Roman";
|
|
color:black;
|
|
font-weight:bold;}
|
|
h4
|
|
{margin-right:0in;
|
|
mso-margin-top-alt:auto;
|
|
mso-margin-bottom-alt:auto;
|
|
margin-left:0in;
|
|
mso-pagination:widow-orphan;
|
|
mso-outline-level:4;
|
|
font-size:12.0pt;
|
|
font-family:"Times New Roman";
|
|
color:black;
|
|
font-weight:bold;}
|
|
a:link, span.MsoHyperlink
|
|
{color:blue;
|
|
text-decoration:underline;
|
|
text-underline:single;}
|
|
a:visited, span.MsoHyperlinkFollowed
|
|
{color:purple;
|
|
text-decoration:underline;
|
|
text-underline:single;}
|
|
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
|
|
{margin:0in;
|
|
margin-bottom:.0001pt;
|
|
mso-pagination:widow-orphan;
|
|
font-size:10.0pt;
|
|
font-family:"Courier New";
|
|
mso-fareast-font-family:"Times New Roman";
|
|
mso-bidi-font-family:"Times New Roman";
|
|
color:windowtext;}
|
|
p
|
|
{margin-right:0in;
|
|
mso-margin-top-alt:auto;
|
|
mso-margin-bottom-alt:auto;
|
|
margin-left:0in;
|
|
mso-pagination:widow-orphan;
|
|
font-size:12.0pt;
|
|
font-family:"Times New Roman";
|
|
mso-fareast-font-family:"Times New Roman";
|
|
color:black;}
|
|
pre
|
|
{margin:0in;
|
|
margin-bottom:.0001pt;
|
|
mso-pagination:widow-orphan;
|
|
tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;
|
|
font-size:10.0pt;
|
|
font-family:"Courier New";
|
|
mso-fareast-font-family:"Courier New";
|
|
mso-bidi-font-family:"Times New Roman";
|
|
color:black;}
|
|
@page Section1
|
|
{size:8.5in 11.0in;
|
|
margin:1.0in 1.25in 1.0in 1.25in;
|
|
mso-header-margin:.5in;
|
|
mso-footer-margin:.5in;
|
|
mso-paper-source:0;}
|
|
div.Section1
|
|
{page:Section1;}
|
|
/* List Definitions */
|
|
@list l0
|
|
{mso-list-id:1019158786;
|
|
mso-list-type:hybrid;
|
|
mso-list-template-ids:-386474800 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
|
|
@list l0:level1
|
|
{mso-level-number-format:bullet;
|
|
mso-level-text:;
|
|
mso-level-tab-stop:.5in;
|
|
mso-level-number-position:left;
|
|
text-indent:-.25in;
|
|
font-family:Symbol;}
|
|
ol
|
|
{margin-bottom:0in;}
|
|
ul
|
|
{margin-bottom:0in;}
|
|
-->
|
|
</style>
|
|
<!--[if gte mso 9]><xml>
|
|
<o:shapedefaults v:ext="edit" spidmax="1027"/>
|
|
</xml><![endif]--><!--[if gte mso 9]><xml>
|
|
<o:shapelayout v:ext="edit">
|
|
<o:idmap v:ext="edit" data="1"/>
|
|
</o:shapelayout></xml><![endif]-->
|
|
<meta content="C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\html.dot"
|
|
name=Template>
|
|
</head>
|
|
|
|
<body bgcolor=white lang=EN-US link=blue vlink=purple style='tab-interval:.5in'
|
|
leftmargin=8>
|
|
|
|
<div class=Section1>
|
|
|
|
<h2><a name="_Communicating_with_SCSI"></a><span style='font-family:Verdana'>Communicating
|
|
with SCSI devices via Win32 application <o:p></o:p></span></h2>
|
|
|
|
<p class=MsoNormal><span style='font-family:Verdana;color:red'>[This is
|
|
preliminary documentation and subject to change.]</span><span style='font-family:
|
|
Verdana'> <o:p></o:p></span></p>
|
|
|
|
<h3><span style='font-family:Verdana'>SUMMARY<o:p></o:p></span></h3>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>Win32 applications can communicate
|
|
directly with SCSI devices using the Win32 API DeviceIoControl and specifying the
|
|
appropriate I/O control code (IOCTL).<span style="mso-spacerun: yes">
|
|
</span>Before DeviceIoControl can be used, a valid handle to the device must be
|
|
obtained.<span style="mso-spacerun: yes"> </span>The handle is obtained using
|
|
the Win32 API CreateFile.<o:p></o:p></span></p>
|
|
|
|
<p><b><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>New for Windows 2000:<span
|
|
style="mso-spacerun: yes"> </span></span></b><span style='font-size:10.0pt;
|
|
mso-bidi-font-size:12.0pt;font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>When
|
|
using the SCSI pass through IOCTLs (described below), you must specify an
|
|
access mode of <span style="mso-spacerun: yes"> </span>(GENERIC_READ | GENERIC_WRITE)
|
|
in CreateFile or the DeviceIoControl call will fail with ERROR_ACCESS_DENIED
|
|
(5L).<span style="mso-spacerun: yes"> </span>The access mode is specified in
|
|
the second parameter to CreateFile, dwDesiredAccess.<span style="mso-spacerun:
|
|
yes"> </span>Refer to the MSDN documentation for specific information about
|
|
the Win32 APIs CreateFile and DeviceIoControl.<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>There are several IOCTLs that the SCSI
|
|
port driver supports.<span style="mso-spacerun: yes"> </span>Refer to the DDK
|
|
file NTDDSCSI.H for the most current information regarding the supported
|
|
IOCTLs.<span style="mso-spacerun: yes"> </span>This sample will demonstrate
|
|
the following IOCTLs: <a href="#_IOCTL_SCSI_GET_INQUIRY_DATA">IOCTL_SCSI_GET_INQUIRY_DATA</a>,
|
|
<a href="#_IOCTL_SCSI_GET_CAPABILITIES">IOCTL_SCSI_GET_CAPABILITIES</a>, <a
|
|
href="#_IOCTL_SCSI_PASS_THROUGH_and_IOCTL_SCSI_">IOCTL_SCSI_PASS_THROUGH</a>,
|
|
and <a href="#_IOCTL_SCSI_PASS_THROUGH_and_IOCTL_SCSI_">IOCTL_SCSI_PASS_THROUGH_DIRECT</a>.<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>To issue these IOCTLs, the user must be
|
|
either the administrator or a member of the Administrator's group.<span
|
|
style="mso-spacerun: yes"> </span>If the user does not have the correct privilege
|
|
level, the CreateFile call will fail with ERROR_ACCESS_DENIED (5L).<span
|
|
style="mso-spacerun: yes"> </span><o:p></o:p></span></p>
|
|
|
|
<p style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1;
|
|
tab-stops:list .5in'><![if !supportLists]><span style='font-size:10.0pt;
|
|
mso-bidi-font-size:12.0pt;font-family:Symbol;mso-fareast-font-family:"MS Mincho"'>·<span
|
|
style='font:7.0pt "Times New Roman"'>
|
|
</span></span><![endif]><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>If CreateFile fails
|
|
with ERROR_ACCESS_DENIED, the user doesn't have the correct privilege
|
|
level.<span style="mso-spacerun: yes"> </span><o:p></o:p></span></p>
|
|
|
|
<p style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1;
|
|
tab-stops:list .5in'><![if !supportLists]><span style='font-size:10.0pt;
|
|
mso-bidi-font-size:12.0pt;font-family:Symbol;mso-fareast-font-family:"MS Mincho"'>·<span
|
|
style='font:7.0pt "Times New Roman"'>
|
|
</span></span><![endif]><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>If DeviceIoControl
|
|
fails with ERROR_ACCESS_DENIED, the access mode (GENERIC_READ | GENERIC_WRITE) was
|
|
not specified in the CreateFile call.<o:p></o:p></span></p>
|
|
|
|
<h4><a name="_IOCTL_SCSI_GET_INQUIRY_DATA"></a><span style='font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>IOCTL_SCSI_GET_INQUIRY_DATA<o:p></o:p></span></h4>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>IOCTL_SCSI_GET_INQUIRY_DATA returns a
|
|
SCSI_ADAPTER_BUS_INFO structure for all devices that are on the SCSI bus.<span
|
|
style="mso-spacerun: yes"> </span>The structure member, BusData, is a
|
|
structure of type SCSI_BUS_DATA.<span style="mso-spacerun: yes"> </span>It
|
|
contains an offset to the SCSI Inquiry data, which is also stored as a
|
|
structure, SCSI_INQUIRY_DATA.<span style="mso-spacerun: yes"> </span>See
|
|
NTDDSCSI.H for more details about these structures.<span style="mso-spacerun:
|
|
yes"> </span><o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>Within the SCSI_INQUIRY_DATA structure is
|
|
a member named DeviceClaimed.<span style="mso-spacerun: yes">
|
|
</span>DeviceClaimed indicates whether or not a class driver has claimed this
|
|
particular SCSI device.<span style="mso-spacerun: yes"> </span>If a device is
|
|
claimed, all SCSI pass through requests must be sent first through the class driver,
|
|
which will typically pass the request unmodified to the SCSI port driver.<span
|
|
style="mso-spacerun: yes"> </span>The class driver is allowed to fail the SCSI
|
|
pass through request if it desires.<span style="mso-spacerun: yes">
|
|
</span>However, the drivers currently shipped by Microsoft simply pass the SCSI
|
|
pass through requests on to the SCSI port driver.<span style="mso-spacerun:
|
|
yes"> </span>If the device is unclaimed, the SCSI pass through requests are
|
|
sent directly to the SCSI port driver.<span style="mso-spacerun: yes">
|
|
</span>See <a href="#_Obtaining_a_handle">Obtaining a handle to a device</a>
|
|
for more details.<o:p></o:p></span></p>
|
|
|
|
<h4><a name="_IOCTL_SCSI_GET_CAPABILITIES"></a><span style='font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>IOCTL_SCSI_GET_CAPABILITIES<o:p></o:p></span></h4>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>IOCTL_SCSI_GET_CAPABILITIES returns an
|
|
IO_SCSI_CAPABILITIES structure (also found in NTDDSCSI.H).<span
|
|
style="mso-spacerun: yes"> </span>This structure contains valuable information
|
|
about the capabilities of the SCSI adapter.<span style="mso-spacerun: yes">
|
|
</span>Two items of note are the MaximumTransferLength, which is a byte value
|
|
indicating the largest data block that can be transferred in a single SRB, and
|
|
the MaximumPhysicalPages, which is the maximum number of physical pages that a
|
|
data buffer can span.<span style="mso-spacerun: yes"> </span>The
|
|
MaximumPhysicalPages indicates how many Scatter/Gather entries the SCSI
|
|
miniport driver and adapter can support.<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>To determine the largest transfer that an
|
|
adapter can handle, you have to first convert the MaximumPhysicalPages into a
|
|
byte value that we’ll refer to here as MaximumPhysicalPages_in_bytes.<span
|
|
style="mso-spacerun: yes"> </span>Subtract one from MaximumPhysicalPages and
|
|
then multiply this value by the system PAGE_SIZE (defined in NTDDK.H) to get
|
|
the MaximumPhysicalPages_in_bytes.<span style="mso-spacerun: yes"> </span>Then
|
|
the largest transfer that can be issued on an adapter is the smaller of
|
|
MaximumTransferLength and MaximumPhysicalPages_in_bytes.<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>For example, assume a system has PAGE_SIZE
|
|
= 4KB, and the SCSI capabilities indicate MaximumTransferLength = 16MB and
|
|
MaximumPhysicalPages = 17.<span style="mso-spacerun: yes"> </span>Then, the
|
|
largest transfer on this adapter would be 64KB based on the following
|
|
calculations:<o:p></o:p></span></p>
|
|
|
|
<p style='margin-left:.5in'><span style='font-size:10.0pt;mso-bidi-font-size:
|
|
12.0pt;font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>MaximumPhysicalPages
|
|
– 1 = 17 – 1 = 16 * PAGE_SIZE = 16 * 4096 = 64KB<o:p></o:p></span></p>
|
|
|
|
<p style='margin-left:.5in'><span style='font-size:10.0pt;mso-bidi-font-size:
|
|
12.0pt;font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>largest
|
|
transfer = min(MaximumTransferLength, MaximumPhysicalPages_in_bytes) =
|
|
min(16MB, 64KB) = 64KB<o:p></o:p></span></p>
|
|
|
|
<h4><a name="_IOCTL_SCSI_PASS_THROUGH_and_IOCTL_SCSI_"></a><span
|
|
style='font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>IOCTL_SCSI_PASS_THROUGH
|
|
and IOCTL_SCSI_PASS_THROUGH_DIRECT<o:p></o:p></span></h4>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>The two IOCTLs IOCTL_SCSI_PASS_THROUGH and
|
|
IOCTL_SCSI_PASS_THROUGH_DIRECT allow SCSI CDBs (Command Descriptor Blocks) to
|
|
be sent from a Win32 application to a SCSI device.<span style="mso-spacerun:
|
|
yes"> </span>Depending on which IOCTL is sent, a corresponding pass through structure
|
|
is filled out by the Win32 application.<span style="mso-spacerun: yes">
|
|
</span>IOCTL_SCSI_PASS_THROUGH uses the structure SCSI_PASS_THROUGH.<span
|
|
style="mso-spacerun: yes"> </span>IOCTL_SCSI_PASS_THROUGH_DIRECT uses the
|
|
structure SCSI_PASS_THROUGH_DIRECT.<span style="mso-spacerun: yes"> </span>See
|
|
NTDDSCSI.H for more details about these structures.<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>The structures SCSI_PASS_THROUGH and
|
|
SCSI_PASS_THROUGH_DIRECT are virtually identical.<span style="mso-spacerun:
|
|
yes"> </span>The only difference is that the data buffer for the
|
|
SCSI_PASS_THROUGH structure must be contiguous with the structure.<span
|
|
style="mso-spacerun: yes"> </span>This structure member is called
|
|
DataBufferOffset and is of type ULONG.<span style="mso-spacerun: yes">
|
|
</span>The data buffer for the SCSI_PASS_THROUGH_DIRECT structure does not have
|
|
to be contiguous with the structure.<span style="mso-spacerun: yes">
|
|
</span>This structure member is called DataBuffer and is of type PVOID.<span
|
|
style="mso-spacerun: yes"> </span>This is the only difference between the two
|
|
structures.<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>IOCTL_SCSI_PASS_THROUGH and
|
|
IOCTL_SCSI_PASS_THROUGH_DIRECT are not substitutes for a SCSI class driver and
|
|
should only be used for infrequent I/O processing.<span style="mso-spacerun:
|
|
yes"> </span>For situations in which frequent SCSI commands need to be sent to
|
|
a device, with strict error processing and high performance requirements, the
|
|
best solution is to write a SCSI class driver that will send these CDBs to the
|
|
respective devices.<span style="mso-spacerun: yes"> </span>SCSI pass through
|
|
requests are handled synchronously by the SCSI port driver, even if the Win32
|
|
application has the proper code to handle the requests as overlapped I/O.<o:p></o:p></span></p>
|
|
|
|
<h4><a name="_Obtaining_a_handle"></a><u><span style='font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>Obtaining a handle to a device</span></u><u><span
|
|
style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'><o:p></o:p></span></u></h4>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>Before any IOCTLs can be sent to a SCSI
|
|
device, a handle for the device must be obtained.<span style="mso-spacerun:
|
|
yes"> </span>The Win32 API CreateFile is used to obtain this handle and to
|
|
define the sharing mode and the access mode.<span style="mso-spacerun: yes">
|
|
</span>The access mode must be specified as (GENERIC_READ |
|
|
GENERIC_WRITE).<span style="mso-spacerun: yes"> </span>The key to obtaining a
|
|
valid handle is to supply the proper filename for the device that is to be
|
|
opened.<span style="mso-spacerun: yes"> </span>It is possible to obtain a
|
|
handle to the device via either the SCSI port driver or the appropriate SCSI
|
|
class driver, depending on whether the device was claimed (see the
|
|
DeviceClaimed information returned from <a href="#_IOCTL_SCSI_GET_INQUIRY_DATA">IOCTL_SCSI_GET_INQUIRY_DATA</a>).<span
|
|
style="mso-spacerun: yes"> </span><o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>If the device is claimed by a class
|
|
driver, then you have to specify a filename that will route requests through
|
|
the class driver.<span style="mso-spacerun: yes"> </span>In the case of fixed
|
|
disks and optical storage devices, the filename is typically the corresponding
|
|
drive letter.<span style="mso-spacerun: yes"> </span>"\\.\I:" can be
|
|
used to obtain a handle to a CD-ROM drive that has been mapped to driver
|
|
"I:".<span style="mso-spacerun: yes"> </span>In the case of SCSI
|
|
printers, the filename is "LPTn", where n = 1, 2, etc.<span
|
|
style="mso-spacerun: yes"> </span>For all remaining SCSI devices, the SCSI
|
|
class driver defines the appropriate name.<span style="mso-spacerun: yes">
|
|
</span>Typically the name is related to the device (e.g. -
|
|
"\\.\Scanner0", "\\.\Tape1").<span style="mso-spacerun:
|
|
yes"> </span>Except for COMn and LPTn, all device filenames must be prepended
|
|
with a \\.\ to inform the I/O Manager that this is a device and not a standard
|
|
file name. <o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>If the device is unclaimed by a SCSI class
|
|
driver, then a handle to the SCSI port driver is required.<span
|
|
style="mso-spacerun: yes"> </span>The filename in this case is
|
|
"\\.\ScsiN:", where N = 0, 1, 2, etc.<span style="mso-spacerun:
|
|
yes"> </span>The number N corresponds to the SCSI host adapter card number
|
|
that controls the desired SCSI device.<span style="mso-spacerun: yes">
|
|
</span>When the SCSI port name is used, the Win32 application must set the
|
|
proper PathId, TargetId, and Lun in the SCSI pass through structure.<span
|
|
style="mso-spacerun: yes"> </span>Failure to set this SCSI address information
|
|
will cause the SCSI request to fail (if directed to a target device claimed by
|
|
a class driver) or possibly cause data corruption (if the unexpected target
|
|
device processed the I/O request).<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>If the device is claimed by a class driver
|
|
but a handle to the SCSI port driver is used, the DeviceIoControl call will
|
|
fail the IOCTL_SCSI_PASS_THROUGH and IOCTL_SCSI_PASS_THROUGH_DIRECT with
|
|
ERROR_INVALID_PARAMETER (87L).<span style="mso-spacerun: yes"> </span>The
|
|
Win32 API QueryDosDevice can be used to display the symbolic links between the
|
|
Win32 device names and their corresponding kernel mode names.<span
|
|
style="mso-spacerun: yes"> </span>If you are unsure of which device name to
|
|
specify for CreateFile, one should be able to examine the output from
|
|
QueryDosDevice to determine the correct name.<o:p></o:p></span></p>
|
|
|
|
<p><b><u><span style='font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>Initializing
|
|
the structures</span></u></b><span style='font-size:10.0pt;mso-bidi-font-size:
|
|
12.0pt;font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>Once a valid handle is obtained to a SCSI
|
|
device, then appropriate input and output buffers for the requested IOCTL must
|
|
be allocated and, in some cases, filled in correctly.<span style="mso-spacerun:
|
|
yes"> </span>This section describes general guidelines for setting up the
|
|
parameters for the DeviceIoControl call.<span style="mso-spacerun: yes">
|
|
</span><o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>For IOCTL_SCSI_GET_INQUIRY_DATA, no data
|
|
is sent to the device - data is only read from the device.<span
|
|
style="mso-spacerun: yes"> </span>Set lpInBuffer to NULL and nInBufferSize to
|
|
zero.<span style="mso-spacerun: yes"> </span>The output buffer might be quite
|
|
large, as each SCSI device on the bus will provide data that will fill three
|
|
structures for each device:<span style="mso-spacerun: yes">
|
|
</span>SCSI_ADAPTER_BUS_INFO, SCSI_BUS_DATA, and SCSI_INQUIRY_DATA.<span
|
|
style="mso-spacerun: yes"> </span>Allocate a buffer that will hold the
|
|
information for all the devices on that particular SCSI adapter.<span
|
|
style="mso-spacerun: yes"> </span>Set lpOutBuffer to point to this allocated
|
|
buffer and nOutBufferSize to the size of the allocated buffer.<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>For IOCTL_SCSI_GET_CAPABILITIES, no data
|
|
is sent to the device - data is only read from the device.<span
|
|
style="mso-spacerun: yes"> </span>Set lpInBuffer to NULL and nInBufferSize to
|
|
zero.<span style="mso-spacerun: yes"> </span>Set lpOutBuffer to a pointer to
|
|
hold the IO_SCSI_CAPABILITIES structure, and nOutBufferSize to
|
|
sizeof(IO_SCSI_CAPABILITIES).<span style="mso-spacerun: yes"> </span>A larger
|
|
output buffer can be used, but the output buffer length must be set as
|
|
described here.<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>For the two SCSI pass through IOCTLs,
|
|
IOCTL_SCSI_PASS_THROUGH and IOCTL_SCSI_PASS_THROUGH_DIRECT, both lpInBuffer and
|
|
lpOutBuffer can vary in size depending on the Request Sense buffer size and the
|
|
data buffer size.<span style="mso-spacerun: yes"> </span>In all cases,
|
|
nInBufferSize and nOutBufferSize must be at least the size of the
|
|
SCSI_PASS_THROUGH (or SCSI_PASS_THROUGH_DIRECT) structure.<span
|
|
style="mso-spacerun: yes"> </span>If the SCSI port driver detects that one of
|
|
the two buffers is too small, then the DeviceIoControl API will fail with
|
|
ERROR_INVALID_PARAMETER.<span style="mso-spacerun: yes"> </span><o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>Once the appropriate input and output
|
|
buffers have been allocated, then the appropriate structure must be
|
|
initialized.<span style="mso-spacerun: yes"> </span>The SCSI_PASS_THROUGH
|
|
structure is defined in NTDDSCSI.H as follows:<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>typedef struct
|
|
_SCSI_PASS_THROUGH {<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><span
|
|
style="mso-spacerun: yes"> </span><span style="mso-spacerun:
|
|
yes"> </span>USHORT Length;<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><span
|
|
style="mso-spacerun: yes"> </span>UCHAR ScsiStatus;<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><span
|
|
style="mso-spacerun: yes"> </span>UCHAR PathId;<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><span
|
|
style="mso-spacerun: yes"> </span>UCHAR TargetId;<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><span
|
|
style="mso-spacerun: yes"> </span>UCHAR Lun;<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><span
|
|
style="mso-spacerun: yes"> </span>UCHAR CdbLength;<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><span
|
|
style="mso-spacerun: yes"> </span>UCHAR SenseInfoLength;<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><span
|
|
style="mso-spacerun: yes"> </span>UCHAR DataIn;<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><span
|
|
style="mso-spacerun: yes"> </span>ULONG DataTransferLength;<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><span
|
|
style="mso-spacerun: yes"> </span>ULONG TimeOutValue;<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><span
|
|
style="mso-spacerun: yes"> </span>ULONG DataBufferOffset;<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><span
|
|
style="mso-spacerun: yes"> </span>ULONG SenseInfoOffset;<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><span
|
|
style="mso-spacerun: yes"> </span>UCHAR Cdb[16];<o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in;margin-right:0in;margin-bottom:0in;margin-left:.5in;
|
|
margin-bottom:.0001pt'><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>}SCSI_PASS_THROUGH,
|
|
*PSCSI_PASS_THROUGH;<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>The Length is the size of the
|
|
SCSI_PASS_THROUGH structure.<span style="mso-spacerun: yes"> </span>The
|
|
ScsiStatus should be initialized to 0.<span style="mso-spacerun: yes">
|
|
</span>The SCSI status of the requested SCSI operation is returned in this structure
|
|
member.<span style="mso-spacerun: yes"> </span>The possible SCSI statuses are
|
|
defined in SCSI.H and are of the form SCSISTAT_xxx. The PathId is the bus
|
|
number for the SCSI host adapter that controls the SCSI device in question.<span
|
|
style="mso-spacerun: yes"> </span>Typically, this value will be 0, but there
|
|
are SCSI host adapters that have more than one SCSI bus on the adapter.<span
|
|
style="mso-spacerun: yes"> </span>The TargetId and Lun are the SCSI ID number
|
|
and logical unit number for the device.<span style="mso-spacerun: yes">
|
|
</span>If the handle was obtained for a claimed device, then the PathId,
|
|
TargetId and Lun as defined in this structure will be ignored and the
|
|
appropriate class driver will provide this SCSI address information.<span
|
|
style="mso-spacerun: yes"> </span>If the handle was obtained for the SCSI port
|
|
driver, then the PathId, TargetId and Lun must be correct for the device
|
|
intended.<span style="mso-spacerun: yes"> </span><o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>The CdbLength is the length of the CDB.
|
|
Typical values are 6, 10, and 12 up to the maximum of 16.<span
|
|
style="mso-spacerun: yes"> </span>The SenseInfoLength is the length of the
|
|
SenseInfo buffer.<span style="mso-spacerun: yes"> </span>DataIn has three
|
|
possible values which are defined in NTDDSCSI.H;<span style="mso-spacerun:
|
|
yes"> </span>SCSI_IOCTL_DATA_OUT, SCSI_IOCTL_DATA_IN and
|
|
SCSI_IOCTL_DATA_UNSPECIFIED. <span style="mso-spacerun:
|
|
yes"> </span>SCSI_IOCTL_DATA_UNSPECIFIED should be used only if the appropriate
|
|
SCSI miniport driver supports its usage.<span style="mso-spacerun: yes">
|
|
</span>The DataTransferLength is the byte size of the data buffer.<span
|
|
style="mso-spacerun: yes"> </span>The TimeOutValue is the length of time, in
|
|
seconds, until a time-out error should occur.<span style="mso-spacerun: yes">
|
|
</span>This can range from 0 to a maximum of 30 minutes (108000 seconds).<span
|
|
style="mso-spacerun: yes"> </span><o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>The DataBufferOffset is the offset of the
|
|
data buffer from the beginning of the pass through structure.<span
|
|
style="mso-spacerun: yes"> </span>For the SCSI_PASS_THROUGH_DIRECT structure,
|
|
this value is not an offset, but rather is a pointer to a data buffer.<span
|
|
style="mso-spacerun: yes"> </span>The SenseInfoOffset is similarly an offset
|
|
to the SenseInfo buffer from the beginning of the pass through structure.
|
|
Finally, the sixteen remaining bytes are for the CDB data.<span
|
|
style="mso-spacerun: yes"> </span>The format of this data must conform to the
|
|
SCSI-2 standard as defined by ANSI.<o:p></o:p></span></p>
|
|
|
|
<p><b><u><span style='font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>Buffer
|
|
Alignment</span></u></b><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>The AlignmentMask member returned in the
|
|
structure via the IOCTL_SCSI_GET_CAPABILITIES indicates the buffer alignment
|
|
requirements of the SCSI adapter.<span style="mso-spacerun: yes">
|
|
</span>Buffer alignment is handled using two methods for assuring that buffers
|
|
are aligned on the appropriate boundaries.<span style="mso-spacerun: yes">
|
|
</span><o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>The first method uses the compiler to
|
|
align the buffer on the correct boundary.<span style="mso-spacerun: yes">
|
|
</span>The structure SCSI_PASS_THROUGH_WITH_BUFFERS contains a member, Filler
|
|
that is of type ULONG.<span style="mso-spacerun: yes"> </span>The compiler
|
|
aligns Filler on a ULONG (double word) boundary.<span style="mso-spacerun:
|
|
yes"> </span>The structure member that follows Filler, ucSenseBuf, is also
|
|
aligned on a double word boundary.<span style="mso-spacerun: yes"> </span>The
|
|
ucSenseBuf array is of a size that is a multiple of a double word, and so this
|
|
makes the last structure member, ucDataBuf, also begin on a double word
|
|
boundary. <o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>A second method to ensure buffer alignment
|
|
is demonstrated in the AllocateAlignedBuffer procedure.<span
|
|
style="mso-spacerun: yes"> </span>This procedure depends on the fact that a
|
|
buffer aligned on a certain boundary will have 0's in its least significant
|
|
bits indicating the buffer alignment.<span style="mso-spacerun: yes"> </span>A
|
|
buffer allocation request is made using the C runtime call (malloc) that is the
|
|
size of the requested buffer plus the AlignmentMask value as returned by
|
|
IOCTL_SCSI_GET_CAPABILITIES.<span style="mso-spacerun: yes"> </span>A pointer
|
|
is manipulated so that it is pointing to the first possible address in the
|
|
buffer that meets the alignment requirements.<o:p></o:p></span></p>
|
|
|
|
<p><b><u><span style='font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>Direct
|
|
versus Buffered<o:p></o:p></span></u></b></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>Here's the big difference between
|
|
IOCTL_SCSI_PASS_THROUGH versus IOCTL_SCSI_PASS_THROUGH_DIRECT: the SCSI data is
|
|
transferred directly into the specified ucDataBuf for
|
|
IOCTL_SCSI_PASS_THROUGH_DIRECT while the data will be buffered in an
|
|
intermediate I/O manager allocated buffer for IOCTL_SCSI_PASS_THROUGH.<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>The various IOCTLs that are demonstrated
|
|
in this sample are defined by the SCSI port driver (see NTDDSCSI.H for
|
|
details).<span style="mso-spacerun: yes"> </span>The memory buffering for
|
|
these IOCTLs is METHOD_BUFFERED.<span style="mso-spacerun: yes"> </span>What
|
|
this means is that the I/O manager examines the length lpInBuffer and the
|
|
length of lpOutBuffer as defined by the DeviceIoControl parameters and
|
|
allocates a contiguous buffer that is the size of the larger of the two
|
|
buffers.<span style="mso-spacerun: yes"> </span>On entry to the I/O manager
|
|
(i.e. the call to DeviceIoControl), the contents of the Win32 application's
|
|
lpInBuffer is copied to the buffer that was allocated by the I/O manager.<span
|
|
style="mso-spacerun: yes"> </span>The nInBufferSize controls the amount of
|
|
data copied.<span style="mso-spacerun: yes"> </span>The I/O manager then calls
|
|
the appropriate SCSI class driver's (or port driver's) DeviceIoControl routine
|
|
passing it the new buffer.<span style="mso-spacerun: yes"> </span>On exit, the
|
|
reverse process occurs and the data in the new buffer is copied back into the
|
|
Win32 application's lpOutBuffer.<span style="mso-spacerun: yes"> </span>This
|
|
behavior is not user configurable.<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>When using IOCTL_SCSI_PASS_THROUGH, the
|
|
SCSI data buffer (ucDataBuf) is part of lpInBuffer.<span style="mso-spacerun:
|
|
yes"> </span>Therefore, the data in ucDataBuf is copied into the new buffer
|
|
(allocated by the I/O manager) and presented to the SCSI port driver and the
|
|
SCSI miniport driver.<span style="mso-spacerun: yes"> </span>On completion,
|
|
the new buffer is copied back to the ucDataBuf.<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>When using IOCTL_SCSI_PASS_THROUGH_DIRECT,
|
|
the SCSI data buffer (ucDataBuf) is not part of lpInBuffer.<span
|
|
style="mso-spacerun: yes"> </span>Recall that the SCSI_PASS_THROUGH_DIRECT has
|
|
a PVOID DataBuffer member.<span style="mso-spacerun: yes"> </span>That is,
|
|
DataBuffer is a pointer to the data buffer, and the data buffer does not have
|
|
to be contiguous with the SCSI_PASS_THROUGH_DIRECT structure.<span
|
|
style="mso-spacerun: yes"> </span>When the Win32 application calls
|
|
DeviceIoControl, the lpInBuffer is copied into an I/O manager allocated buffer,
|
|
and this new buffer is passed to the SCSI port driver.<span
|
|
style="mso-spacerun: yes"> </span>In the SCSI port driver, the
|
|
SCSI_PASS_THROUGH_DIRECT structure is examined, the pointer to the DataBuffer
|
|
is retrieved from the structure, and the user's buffer is probed and locked for
|
|
direct access.<span style="mso-spacerun: yes"> </span><o:p></o:p></span></p>
|
|
|
|
<p><b><u><span style='font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>Running
|
|
the SPTI.EXE sample</span></u></b><span style='font-size:10.0pt;mso-bidi-font-size:
|
|
12.0pt;font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>Two command line parameters can be used
|
|
with SPTI.EXE.<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>The first parameter is mandatory.<span
|
|
style="mso-spacerun: yes"> </span>It is the name of the device to be
|
|
opened.<span style="mso-spacerun: yes"> </span>Typical values for this are
|
|
drive letters such as "C:", or device names as defined by a class
|
|
driver such as Scanner0, or the SCSI port driver name, ScsiN:, where N = 0, 1,
|
|
2, etc.<span style="mso-spacerun: yes"> </span>See <a
|
|
href="#_Obtaining_a_handle">Obtaining a handle for a device</a> for details on
|
|
this first parameter.<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>The second parameter is optional and is
|
|
used to set the share mode (note that access mode and share mode are different
|
|
things) and sector size.<span style="mso-spacerun: yes"> </span>The default
|
|
share mode is (FILE_SHARE_READ | FILE_SHARE_WRITE) and the default sector size
|
|
is 512.<span style="mso-spacerun: yes"> </span>A parameter of "r"
|
|
changes the share mode to only FILE_SHARE_READ.<span style="mso-spacerun:
|
|
yes"> </span>A parameter of "w" changes the share mode to only
|
|
FILE_SHARE_WRITE.<span style="mso-spacerun: yes"> </span>A parameter of
|
|
"c" changes the share mode to only FILE_SHARE_READ and also changes
|
|
the sector size to 2048.<span style="mso-spacerun: yes"> </span>Typically, a
|
|
CD-ROM device would use the "c" parameter.<span style="mso-spacerun:
|
|
yes"> </span><o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;
|
|
mso-fareast-font-family:"MS Mincho"'>The examples below assume that there is a
|
|
system with a disk drive "c:", CD-ROM "d:", and an
|
|
unclaimed SCSI device on the second SCSI adapter (scsi1:).<o:p></o:p></span></p>
|
|
|
|
<p style='margin:0in;margin-bottom:.0001pt'><b><span style='font-size:10.0pt;
|
|
mso-bidi-font-size:12.0pt;font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>spti
|
|
c:</span></b><span style='font-size:10.0pt;mso-bidi-font-size:12.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><o:p></o:p></span></p>
|
|
|
|
<p style='margin:0in;margin-bottom:.0001pt'><span style='font-size:10.0pt;
|
|
mso-bidi-font-size:12.0pt;font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>To
|
|
send SCSI commands to the disk drive. <o:p></o:p></span></p>
|
|
|
|
<p style='margin-bottom:0in;margin-bottom:.0001pt'><b><span style='font-size:
|
|
10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;mso-fareast-font-family:
|
|
"MS Mincho"'>spti d: c</span></b><span style='font-size:10.0pt;mso-bidi-font-size:
|
|
12.0pt;font-family:Verdana;mso-fareast-font-family:"MS Mincho"'><o:p></o:p></span></p>
|
|
|
|
<p style='margin:0in;margin-bottom:.0001pt'><span style='font-size:10.0pt;
|
|
mso-bidi-font-size:12.0pt;font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>To
|
|
send SCSI commands to the CD-ROM device.<span style="mso-spacerun: yes">
|
|
</span>Remember that CD-ROM devices typically use 2048 sector size, so the
|
|
"c" parameter should be used. <o:p></o:p></span></p>
|
|
|
|
<p style='margin-bottom:0in;margin-bottom:.0001pt'><b><span style='font-size:
|
|
10.0pt;mso-bidi-font-size:12.0pt;font-family:Verdana;mso-fareast-font-family:
|
|
"MS Mincho"'>spti scsi1:</span></b><span style='font-size:10.0pt;mso-bidi-font-size:
|
|
12.0pt;font-family:Verdana;mso-fareast-font-family:"MS Mincho"'> <o:p></o:p></span></p>
|
|
|
|
<p style='margin-top:0in'><span style='font-size:10.0pt;mso-bidi-font-size:
|
|
12.0pt;font-family:Verdana;mso-fareast-font-family:"MS Mincho"'>To send SCSI
|
|
commands to the unclaimed SCSI device.<span style="mso-spacerun: yes">
|
|
</span>Make sure that the SCSI pass through structure has the correct PathId, TargetId
|
|
and Lun, filled in.<span style="mso-spacerun: yes"> </span>If the SCSI address
|
|
information is incorrectly set, the request might fail or be directed towards
|
|
the wrong device.<span style="mso-spacerun: yes"> </span><o:p></o:p></span></p>
|
|
|
|
<p><b><u>BUILDING THE SAMPLE<o:p></o:p></u></b></p>
|
|
|
|
<p><span style='font-size:10.0pt;font-family:Verdana'>Click the Free Build
|
|
Environment or Checked Build Environment icon under your <b>Development Kits </b>program
|
|
group to set basic environment variables needed by the build utility. <o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;font-family:Verdana'>Change to the directory
|
|
containing the device source code.<o:p></o:p></span></p>
|
|
|
|
<p><span style='font-size:10.0pt;font-family:Verdana'>To build the sample, run <b>build
|
|
-ceZ</b>, or use the macro <b>BLD</b>.<span style="mso-spacerun: yes">
|
|
</span>The "e" option produces a log file (buildXXX.log), a warning
|
|
file (buildXXX.wrn), and an error file (buildXXX.err) where XXX means either <b>fre</b>
|
|
or <b>chk, </b>depending on the environment chosen.<span style="mso-spacerun:
|
|
yes"> </span>If there are no warnings, then the warning file will not be built
|
|
and if there are no errors, there will be no error file built.<span
|
|
style="mso-spacerun: yes"> </span>If the build succeeds, the Win32
|
|
application spti.exe will be placed in a subdirectory of either the objfre (for
|
|
free build) or objchk (for checked build) directories. <o:p></o:p></span></p>
|
|
|
|
No INF file is needed to install this application. <P>
|
|
|
|
<h3><span style='font-family:Verdana'>CODE TOUR<o:p></o:p></span></h3>
|
|
|
|
<h4><span style='font-family:Verdana'>File Manifest<o:p></o:p></span></h4>
|
|
|
|
<pre><u><span style='mso-bidi-font-family:"Courier New"'>File<span
|
|
style='mso-tab-count:2'> </span>Description<o:p></o:p></span></u></pre><pre><span
|
|
style='mso-bidi-font-family:"Courier New"'><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></pre><pre><span
|
|
style='mso-bidi-font-family:"Courier New"'><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></pre><pre><span
|
|
style='mso-bidi-font-family:"Courier New"'>spti.htm<span style='mso-tab-count:
|
|
1'> </span>The documentation for these samples (this file)<o:p></o:p></span></pre><pre><span
|
|
style='mso-bidi-font-family:"Courier New"'>spti.c<span style="mso-spacerun: yes"> </span>Implements the Win32 application to communicate with the SCSI devices.<o:p></o:p></span></pre><pre><span
|
|
style='mso-bidi-font-family:"Courier New"'>spti.h<span style="mso-spacerun: yes"> </span>Header file for spti.c<o:p></o:p></span></pre><pre><span
|
|
style='mso-bidi-font-family:"Courier New"'>Sources<span style="mso-spacerun: yes"> </span>DDK build instructions<o:p></o:p></span></pre>
|
|
|
|
<p style='margin:0in;margin-bottom:.0001pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
|
|
style='font-size:10.0pt;font-family:"Courier New";mso-fareast-font-family:"Courier New"'><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></p>
|
|
|
|
<p style='margin:0in;margin-bottom:.0001pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
|
|
style='font-size:10.0pt;font-family:"Courier New";mso-fareast-font-family:"Courier New"'><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></p>
|
|
|
|
<p align=center style='margin:0in;margin-bottom:.0001pt;text-align:center;
|
|
tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
|
|
style='font-size:10.0pt;font-family:Verdana;mso-fareast-font-family:"Courier New";
|
|
mso-bidi-font-family:"Courier New"'><a href="#_Communicating_with_SCSI">Top of
|
|
page </a></span><span class=MsoHyperlink><span style='font-size:10.0pt;
|
|
font-family:Verdana;mso-fareast-font-family:"Courier New";mso-bidi-font-family:
|
|
"Courier New"'><o:p></o:p></span></span></p>
|
|
|
|
<pre><span style='mso-bidi-font-family:"Courier New"'><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></pre>
|
|
|
|
<table border=0 cellspacing=0 cellpadding=0 width=624 style='width:6.5in;
|
|
mso-cellspacing:0in;mso-padding-alt:0in 0in 0in 0in'>
|
|
<tr style='height:1.5pt'>
|
|
<td style='background:aqua;padding:.75pt .75pt .75pt .75pt;height:1.5pt'>
|
|
<p class=MsoNormal> </p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<pre><span style='mso-bidi-font-family:"Courier New"'><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></pre><pre><span
|
|
style='mso-bidi-font-family:"Courier New"'><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></pre>
|
|
|
|
<p style='margin:0in;margin-bottom:.0001pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
|
|
style='font-size:7.5pt;font-family:"MS Sans Serif";mso-fareast-font-family:
|
|
"Courier New";mso-bidi-font-family:"Courier New"'>© 1999 Microsoft Corporation</span><span
|
|
style='font-size:10.0pt;font-family:Verdana;mso-fareast-font-family:"Courier New";
|
|
mso-bidi-font-family:"Courier New"'> <o:p></o:p></span></p>
|
|
|
|
</div>
|
|
|
|
</body>
|
|
|
|
</html>
|