Annotation of q_a/samples/ddk/smpi/readme.txt, revision 1.1

1.1     ! root        1: This sample program consists of two parts.  First, all the necessary
        !             2: source code is provided to compile a Win32 sample program that sends
        !             3: an IOCtl_SCSI_MINIPORT request with a custom ControlCode to the SCSI
        !             4: miniport driver.  Second, a detailed description is provided that
        !             5: explains what changes the driver writer has to make to a SCSI
        !             6: miniport driver to allow it to properly recognize and handle the
        !             7: corresponding IOCtl request from the Win32 sample program.
        !             8: 
        !             9: Part 1 - Win32 sample
        !            10: 
        !            11: The SCSI Miniport IOCtl sample, SMPI.C, demonstrates how a Win32
        !            12: application sends a user defined IOCtl Control Code to a SCSI
        !            13: miniport driver. This is a simple program that is composed of four
        !            14: steps.
        !            15: 
        !            16: Step 1, a handle is obtained to the SCSI miniport driver using the
        !            17: Win32 API, CreateFile.  The name of the file to be opened is
        !            18: \\.\Scsi0:.  As an alternative, a drive letter can be substituted for
        !            19: \\.\Scsi0: (e.g. - \\.\C:).  This will map to the appropriate SCSI
        !            20: miniport driver that is responsible for C:.
        !            21: 
        !            22: Step 2, the SRB_IO_CONTROL structure is filled out.  The following
        !            23: items must be completed :
        !            24: 
        !            25:      HeaderLength - must be the size of an SRB_IO_CONTROL structure
        !            26:      ControlCode - while strictly optional, this entry should be
        !            27:               considered mandatory.  The ControlCode value is used to
        !            28:               further sub-divide IOCTL_SCSI_MINIPORT requests.  The
        !            29:               contents of ControlCode are defined by the SCSI miniport
        !            30:               driver writer.
        !            31:      Length - the size of the data buffer immediately following the
        !            32:               SRB_IO_CONTROL structure.  If no additional data buffer
        !            33:               is used, then this must be set to 0.
        !            34: 
        !            35: The following items of the SRB_IO_CONTROL structure are optional :
        !            36: 
        !            37:      Signature - these 8 bytes are available to help prevent IOCtl
        !            38:               conflicts between various vendors
        !            39:      Timeout - indicates the minimum time in seconds before the
        !            40:               request has timed out.  There is no maximum Timeout for
        !            41:               IOCTL_SCSI_MINIPORT.  Note, for IOCTL_SCSI_PASS_THROUGH,
        !            42:               the maximum time out value is 108000 seconds (30 minutes).
        !            43:      ReturnCode - this entry is filled in by the SCSI miniport to
        !            44:               inform the Win32 application of the results of the
        !            45:               requested action.  The contents of ReturnCode are defined
        !            46:               by the SCSI miniport Driver writer.
        !            47: 
        !            48: In the SMPI.C sample, two customer defined ControlCodes are used,
        !            49: SMP_RETURN_3F and SMP_PRINT_STRING.  The first requires
        !            50: no additional data buffer.  The second requires that a contiguous
        !            51: data buffer be appended at the end of the SRB_IO_CONTROL structure. 
        !            52: The ControlCodes are defined by the SCSI miniport driver (see below).
        !            53: 
        !            54: Step 3, send the SRB_IO_CONTROL structure to the SCSI miniport driver
        !            55: via the DeviceIoControl Win32 API.  The dwIoControlCode must be
        !            56: IOCTL_SCSI_MINIPORT.  This particular dwIoControlCode is not
        !            57: currently defined in any of the Win32 SDK header files and must be
        !            58: defined in your own personal header file.  It is defined in the
        !            59: Windows NT DDK header file, NTDDSCSI.H.  Including a Windows NT
        !            60: DDK header file in a Win32 source file has been avoided strictly to
        !            61: demonstrate the ability to write a Win32 application that accesses a
        !            62: device driver without having the Windows NT DDK.
        !            63: 
        !            64: Step 4, close the handle to the SCSI miniport driver.
        !            65: 
        !            66: In SMPI.C, steps 2 and 3 are repeated to demonstrate the two
        !            67: ControlCodes, SMP_RETURN_3F and SMP_PRINT_STRING.  The
        !            68: first requires no extra data buffer and so 'length' is set to 0.  The
        !            69: second does require additional buffer space.  The value of 100 is
        !            70: used as it makes the buffer large enough to handle up to 100 bytes of
        !            71: data returned by the SCSI miniport driver.
        !            72: 
        !            73: When strings are manipulated via the _memXXX functions, the
        !            74: terminating null is not used.  When using strXXX commands, the
        !            75: terminating null is used.  strlen does not include the terminating
        !            76: null in it's total.
        !            77: 
        !            78: Part 2 - SCSI Miniport Driver
        !            79: 
        !            80: The SCSI miniport driver writer is free to define the ControlCode to
        !            81: any value.  Microsoft has provided a template for defining such
        !            82: values and the driver writer can use this template for determining
        !            83: their ControlCode values, but are not obligated to do so.  In this
        !            84: sample, SMP_RETURN_3F was defined using the template and
        !            85: SMP_PRINT_STRING was defined with a random number.
        !            86: 
        !            87: If the microsoft template is to be used, then the Windows NT DDK
        !            88: header file, DEVIOCTL.H, should be consulted before defining a new
        !            89: IOCtl.  Also, the "Kernel-mode Driver Design Guide" contains
        !            90: additional information on page B-12.  There are two documentation
        !            91: errors on this page. First, the bit pattern should be :
        !            92: 
        !            93:       bit(s)     purpose
        !            94:       ------     -------
        !            95:       0,1        Transfer type
        !            96:       2-12       Function Code
        !            97:       13         Customer bit
        !            98:       14,15      Required Access
        !            99:       16-30      Device type
        !           100:       31         Common bit
        !           101: 
        !           102: The second documentation error states that the Function Code values
        !           103: can be 0x00 to 0x7F for Microsoft defined IOCtls and 0x80 to 0xFF for
        !           104: user defined IOCtls.  This should be 0x000 to 0x7FF for Microsoft
        !           105: defined IOCtls and 0x800 to 0xFFF for user defined IOCtls.  The
        !           106: Function Code field defines the function and the Customer bit
        !           107: determines whether the function is defined by Microsoft or a
        !           108: customer.
        !           109: 
        !           110: The following should be added to the SCSI minport driver's header
        !           111: file :
        !           112: 
        !           113: //
        !           114: // IOCtl definitions
        !           115: //
        !           116: 
        !           117: //
        !           118: // Define the various device type values.  Note that values used by Microsoft
        !           119: // Corporation are in the range 0x0000 - 0x7FFF, and 0x8000 - 0xFFFF are
        !           120: // reserved for use by customers.
        !           121: //
        !           122: 
        !           123: #define IOCTL_SCSI_MINIPORT_IO_CONTROL  0x8001
        !           124: 
        !           125: //
        !           126: // Macro definition for defining IOCTL and FSCTL function control codes.
        !           127: // Note that function codes 0x000 - 0x7FF are reserved for Microsoft
        !           128: // Corporation, and 0x800 - 0xFFF are reserved for customers.
        !           129: //
        !           130: 
        !           131: #define RETURNCODE0x0000003F   0x850
        !           132: 
        !           133: #define SMP_RETURN_3F     CTL_CODE(IOCTL_SCSI_MINIPORT_IO_CONTROL, RETURNCODE0x0000003F, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           134: #define SMP_PRINT_STRING  0x80000001
        !           135: 
        !           136: PCHAR Signature="MyDrvr";
        !           137: PCHAR DrvrString="This string was placed in the data area by the SCSI miniport driver\n";
        !           138: 
        !           139: typedef struct {
        !           140:     SRB_IO_CONTROL sic;
        !           141:     UCHAR          ucDataBuffer[512];
        !           142: } SRB_BUFFER, *PSRB_BUFFER;
        !           143: 
        !           144: The following should be added to the SCSI miniport driver's source
        !           145: code :
        !           146: 
        !           147: #include <miniport.h>
        !           148: #include <devioctl.h>
        !           149: #include <ntddscsi.h>
        !           150: #include "mydriver.h"
        !           151: 
        !           152: and the following should be added to the SCSI miniport driver's
        !           153: StartIo routine :
        !           154: 
        !           155: case SRB_FUNCTION_IO_CONTROL:
        !           156: 
        !           157:     if (!memcmp(((PSRB_IO_CONTROL)(Srb->DataBuffer))->Signature,Signature,strlen(Signature))) {
        !           158: 
        !           159:         DebugPrint((1,"MyDriverStartIo: MiniportIOCtl not supported\n"));
        !           160: 
        !           161:         Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
        !           162: 
        !           163:         ScsiPortNotification(RequestComplete,
        !           164:                              CardPtr,
        !           165:                              Srb);
        !           166:         break;
        !           167:         }
        !           168: 
        !           169: 
        !           170:     DebugPrint((1,"MyDriverStartIo: Miniport IOCtl received\n"));
        !           171: 
        !           172:     DebugPrint((3,"MyDriverStartIo: Srb->DataBuffer->ControlCode = %Xh\n",
        !           173:                     ((PSRB_IO_CONTROL)(Srb->DataBuffer))->ControlCode));
        !           174: 
        !           175:     switch (((PSRB_IO_CONTROL)(Srb->DataBuffer))->ControlCode) {
        !           176: 
        !           177:         case SMP_RETURN_3F :
        !           178: 
        !           179:            Srb->SrbStatus = SRB_STATUS_SUCCESS;
        !           180: 
        !           181:            ((PSRB_IO_CONTROL)(Srb->DataBuffer))->ReturnCode =
        !           182:               (ULONG) 0x0000003FL;
        !           183: 
        !           184:            ScsiPortNotification(RequestComplete,
        !           185:                                 CardPtr,
        !           186:                                 Srb);
        !           187:            break;
        !           188: 
        !           189:         case SMP_PRINT_STRING :
        !           190: 
        !           191:            Srb->SrbStatus = SRB_STATUS_SUCCESS;
        !           192: 
        !           193:            DebugPrint((0,"%s",((PSRB_BUFFER)(Srb->DataBuffer))->ucDataBuffer));
        !           194: 
        !           195:            strcpy(((PSRB_BUFFER)(Srb->DataBuffer))->ucDataBuffer,DrvrString);
        !           196: 
        !           197:            ScsiPortNotification(RequestComplete,
        !           198:                                 CardPtr,
        !           199:                                 Srb);
        !           200:            break;
        !           201: 
        !           202:         default :
        !           203: 
        !           204:            DebugPrint((1,"MyDriverStartIo: MiniportIOCtl not supported\n"));
        !           205: 
        !           206:            Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
        !           207: 
        !           208:            ScsiPortNotification(RequestComplete,
        !           209:                                 CardPtr,
        !           210:                                 Srb);
        !           211:            break;
        !           212: 
        !           213:     } // end switch
        !           214: 
        !           215:     break;
        !           216: 
        !           217: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.