2013年4月4日星期四

微软的东东,多数是把聪明人搞晕,把晕的人搞残,把残的人搞死

呵呵

驱动模型 Vxd WDM(DDK) WDF(WDK)

驱动模型

Vxd
95/98/ME下  这个东西已经过时
Vxd驱动文件扩展名为:.vxd

WDM(开发包DDK)    Windows Driver Model
2000/XP/2003下
开发2000/XP/2003的驱动开发包为:DDK
WDM和WDF驱动文件扩展名为:.sys

WDF(开发包WDK)    Windows Driver Foudation
Vista及以后版本
对应的开发包:WDK
WDM和WDF驱动文件扩展名为:.sys


WDK可以看做是DDK的升级版本,现在一般的WDK是包含以前DDK相关的功能,现在XP下也可以用WDK开发驱动,WDK能编译出2000-2008的各种驱动

WDF驱动程序包括两个类型,
一个是内核级的,称为KMDF(Kernel-Mode Driver Framework),为SYS文件
一个是用户级的,称为UMDF(User-Mode Driver Framework),为DLL文件

WDM驱动模型和WDF驱动模型的最大的区别是
WDF驱动框架对WDM进行了一次封装
WDF 驱动采用队列进行IO处理,而WDM中将所有的IO操作都用默认的队列进行处理,如果要进行IRp同步,必须使用StartIO
WDF是面向对象的,而WDM是面向过程的,WDF提供对象的封装,如将IRP封装成WDFREQUEST,对象提供方法和Event

The IRP structure is a partial opaque structure that represents an I/O request packet. 

IOCTL_SCSI_PASS_THROUGH_DIRECT - Command Descriptor Block (CDB)

IOCTL_SCSI_PASS_THROUGH_DIRECT

Ntddscsi.h


typedef struct SCSI_PASS_THROUGH_DIRECT
{
    USHORT Length;
    UCHAR ScsiStatus;
    UCHAR PathId;
    UCHAR TargetId;
    UCHAR Lun;
    UCHAR CdbLength;
    UCHAR SenseInfoLength;
    UCHAR DataIn;
    ULONG DataTransferLength;
    ULONG TimeOutValue;
    PVOID DataBuffer;
    ULONG SenseInfoOffset;
    UCHAR Cdb[16];
} SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT;

SCSI Operation Codes
Command Descriptor Blocks 列表
there are specifications for CD/DVD devices (MMC), hard drives (SBC), tape drives (SSC), and more

SCSI Request Block (SRB)  == SCSI Pass Through request

SRBs and CDBs are used across any hard drive whether it's SCSI, ATA, Fibre Channel, RAID, SAS, or others.


SCSI Multimedia Commands



SCSI Multimedia Commands (MMC) defines a SCSI/ATAPI based command set for accessing multimedia features on devices capable of such functionality. T10 subcommittee is responsible for developing it as well as other SCSI command set standards.


R - C/DVD DEVICE (MMC-6) 



Cdrecord(刻录) 用到的命令

43       O          READ TOC/PMA/ATIP
46       M          GET CONFIGURATION
AC       O          GET PERFORMANCE
23       O          READ FORMAT CAPACITIES  read_format_capacities

2013年4月3日星期三

VC类向导模板

VC类向导模板

item templates

怎样建立自己的 C++类向导?


Inside Visual C++ Wizards

Wizard (.vsz) files
VSDir files, and how they affect the Add Item and New Project dialog boxes.

2013年4月2日星期二

DeviceIoControl


DeviceIoControl   Winbase.h  Kernel32.lib

直接向指定设备驱动程序(device driver),发送一个控制代码(control code),使设备执行相应的操作。
为应用程序提供了一个,直接与设备驱动程序 通信\输入输出 接口。
The DeviceIoControl function provides a device input and output control (IOCTL) interface through which an application can communicate directly with a device driver.
控制代码(LINUX里叫做命令代码): winioctl.h
标准控制代码(standard control codes)
驱动程序自定义控制代码(device-specific control codes)
Diagram illustrating the I/O control code layout
生成控制代码的宏
DeviceType
FunctionCode
TransferType
                  METHOD_BUFFERED
                  METHOD_IN_DIRECT or METHOD_OUT_DIRECT
                  METHOD_NEITHER
RequiredAccess
                  FILE_ANY_ACCESS
                  FILE_READ_DATA
                  FILE_WRITE_DATA

Windows定义的 控制代码列表
http://www.ioctls.net/

有用的宏:(Wdm.h and Ntddk.h)
#define IOCTL_Device_Function CTL_CODE(DeviceType, Function, Method, Access)
#define DEVICE_TYPE_FROM_CTL_CODE(ctrlCode) (((ULONG)(ctrlCode & 0xffff0000)) >> 16)
#define METHOD_FROM_CTL_CODE(ctrlCode)        ((ULONG)(ctrlCode & 3))

BOOL WINAPI DeviceIoControl(
  _In_         HANDLE hDevice,          设备句柄
  _In_         DWORD dwIoControlCode,   控制码
  _In_opt_     LPVOID lpInBuffer,
  _In_         DWORD nInBufferSize,
  _Out_opt_    LPVOID lpOutBuffer,
  _In_         DWORD nOutBufferSize,
  _Out_opt_    LPDWORD lpBytesReturned,
  _Inout_opt_  LPOVERLAPPED lpOverlapped
);

ioctl.h

在头文件winioctl.h中,预定义的标准设备控制码,都以IOCTL或FSCTL开头。
例如,IOCTL_DISK_GET_DRIVE_GEOMETRY是对物理驱动器取结构参数(介质类型、柱面数、每柱面磁道数、每磁道扇区数等)的控制码,FSCTL_LOCK_VOLUME是对逻辑驱动器的卷加锁的控制码

IoControlCode由四部分组成:DeviceType、Access(读/写)、Function、Method


HANDLE CreateFile(
    LPCTSTR lpFileName,                         // 文件名/设备路径
    DWORD dwDesiredAccess,                      // 访问方式
    DWORD dwShareMode,                          // 共享方式
    LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全描述符指针
    DWORD dwCreationDisposition,                // 创建方式
    DWORD dwFlagsAndAttributes,                 // 文件属性及标志
    HANDLE hTemplateFile                        // 模板文件的句柄
);
设备驱动的“文件名”(常称为“设备路径”)形式固定为“//./DeviceName”(注意在C程序中该字符串写法为“////.//DeviceName”),DeviceName必须与设备驱动程序内定义的设备名称一致

2013年4月1日星期一

General SCSI addressing


scsibus/target/lun



LUN是英文 Logical unit number的缩写,即逻辑单元号

16位宽的SCSI总线,其寻址范围只有16个,即只能挂载16个外围设备,每个设备称为一个target


Linux has a four level hierarchical addressing scheme for SCSI devices:
  • SCSI adapter number [host]
  • channel number [bus]
  • id number [target]
  • lun [lun]



在SCSI术语里,HBA称为“initiator“,占用一个SCSI id号(绝大部分是7,如果不是,改为7)

scsi设备地址映射
SCSI adapter number [host]
host说的是适配卡在计算机内部IO总线的位置(比如PCI,PCMCIA,ISA等),适配器也称为HBA,其编号由内核以0开始的升序分配。
host id,也就是scsi适配器的id,可以认为就是scsi适配器的序号。顺序一般情况下和通过lspci列出来scsi适配器的顺序是一致的

channel number [bus]
一个HBA可能控制一个或者多个SCSI总线
channel id,对应不同的scsi总线类型。一个scsi适配器可以支持多种不同的总线类型,连接不同的scsi设备

id number [target]
每一个SCSI总线可以有多个SCSI设备连接在上面。

lun [lun]
每一个SCSI设备本身(绝大部分情况下说的是虚拟存储,比如RAID)能够包含多个LUN


Ntddscsi.h
IOCTL_SCSI_GET_ADDRESS
Returns the address information, such as the target ID (TID) and the logical unit number (LUN) of a particular SCSI target

typedef struct _SCSI_ADDRESS {
  ULONG Length;      结构体的大小
  UCHAR PortNumber;  Contains the number of the SCSI adapter
  UCHAR PathId;      Contains the number of the bus.
  UCHAR TargetId;
  UCHAR Lun;
} SCSI_ADDRESS, *PSCSI_ADDRESS;
#define MAX_SCG  64 /* Max # of SCSI controllers */
#define MAX_TGT  16 /* Max # of SCSI Targets */
#define MAX_LUN  8 /* Max # of SCSI LUNs  */
typedef struct {
 BYTE ha;   /* SCSI Bus #   */
 BYTE tgt;   /* SCSI Target #  */
 BYTE lun;   /* SCSI Lun #   */
 BYTE PortNumber;  /* SCSI Card # (\\.\SCSI%d) */
 BYTE PathId;   /* SCSI Bus/Channel # on card n */
 BYTE driveLetter;  /* Win32 drive letter (e.g. c:) */
 BOOL bUsed;   /* Win32 drive letter is used */
 HANDLE hDevice;  /* Win32 handle for ioctl() */
 BYTE inqData[NTSCSI_HA_INQUIRY_SIZE];
} DRIVE;

  BOOL rt = DeviceIoControl(
   device, IOCTL_SCSI_GET_ADDRESS,
   NULL, 0, &s_add, sizeof(s_add),
   &rtBytes, NULL);
it does not work for USB CD-RW
I don't know how to 
map 
USB/Firewire CD-RW drive's driver letter (e.g. E:) to 
SCSI bus/target/lun 
because USB/Firewire CD-RW has nothing to do with SCSI.


support USB/FIREWIRE devices where this call is not supported assign drive letter as device ID


HANDLE device = CreateFile(L"\\\\.\\c:", 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
                      0, OPEN_EXISTING, 0, NULL);
The "\\.\" prefix will access the Win32 device namespace instead of the Win32 file namespace.  例如:
\\.\COM56   \\.\SCSI1


 * Universal function to get a file handle to the CD device.  Since
 * NT 4.0 wants just the GENERIC_READ flag, and Win2K wants both
 * GENERIC_READ and GENERIC_WRITE (why a read-only CD device needs
 * GENERIC_WRITE access is beyond me...), the easist workaround is to just
 * try them both.


--------------------------------------------------------------------------
SCSI总线-任何实现了ANSI的SCSI标准的并行(多信号)I/O总线。wide SCSI总线可以连接16个发起者和目标。narrow SCSI总线可以连接8个发起者和目标。

2013年3月31日星期日

ISO 镜像制作工具 - mkisofs

mkisofs - create an hybrid ISO-9660/JOLIET/HFS/UDF filesystem-image with optional Rock Ridge attributes.


mkisofs [ options ] [ -o filename ] pathspec [pathspec ...]
mkisofs [ options ] [ -o filename ] -find [find expression]

mkisofs -J -r -o output.iso dir_with_files/

通过管道 mkisofs 与 cdrecord相结合:
mkisofs -J -r dir_with_files/ | cdrecord dev=ATAPI:0,1,0 -v -multi -pad -data -
mkisofs -R /master/tree | cdrecord -v fs=6m speed=2 dev=2,0 -


mkisofs -r -J -T -V BackupData -o my1.iso /dir1 
"-J" 代表燒成 Joliet 格式 
"-T" 代表各目錄中放一個長檔名與 8.3 格式檔名對照表 
"-V BackupData" 代表燒好的光碟以 BackupData 為標籤名 
"my1.iso" is the first iso_9660 image file 
"/dir1" is the directory of files you are backing up