javasript的按位的结果是有符号整数,而pythonecc的是无符号整数。
Java环境可用来开发能在任何计算平台上运行的应用软件。
它实际上是一种非常基本且结构紧凑的技术,而它对WorldWideWeb以及商业的总体影响已可同电子表格对PC机的影响相比拟。
代码如下##from winioctlcon import *
##from win32file import *
from ctypes import *
from ctypes.wintypes import *
import win32api
import win32file
import winioctlcon
import win32con
IDE_ATA_IDENTIFY = 0xEC
DFP_SEND_DRIVE_COMMAND = 0x0007c084
class _IDEREGS(Structure):
_fields_=[
("bFeaturesReg",BYTE), ## 特征寄存器(用于SMART命令)
("bSectorCountReg",BYTE), ## 扇区数目寄存器
("bSectorNumberReg",BYTE), ## 开始扇区寄存器
("bCylLowReg",BYTE), ## 开始柱面低字节寄存器
("bCylHighReg",BYTE), ## 开始柱面高字节寄存器
("bDriveHeadReg",BYTE), ## 驱动器/磁头寄存器
("bCommandReg",BYTE), ## 指令寄存器
("bReserved",BYTE), ## 保留
]
IDEREGS = _IDEREGS #*PIDEREGS, *LPIDEREGS
## 从驱动程序返回的状态
class _DRIVERSTATUS(Structure):
_fields_=[
("bDriverError",BYTE), ## 错误码
("bIDEStatus",BYTE), ## IDE状态寄存器
("bReserved",BYTE*2), ## 保留
("dwReserved",DWORD*2), ## 保留
]
DRIVERSTATUS=_DRIVERSTATUS #*PDRIVERSTATUS, *LPDRIVERSTATUS
## IDE设备IOCTL输入数据结构
class _SENDCMDINPARAMS(Structure):
_fields_=[
("cBufferSize",DWORD), ## 缓冲区字节数
("irDriveRegs",IDEREGS), ## IDE寄存器组
("bDriveNumber",BYTE), ## 驱动器号
("bReserved",BYTE*3), ## 保留
("dwReserved",DWORD*4), ## 保留
("bBuffer[1]",BYTE), ## 输入缓冲区(此处象征性地包含1字节)
]
SENDCMDINPARAMS=_SENDCMDINPARAMS #*PSENDCMDINPARAMS, *LPSENDCMDINPARAMS
## IDE设备IOCTL输出数据结构
class _SENDCMDOUTPARAMS(Structure):
_fields_=[
("cBufferSize",DWORD), ## 缓冲区字节数
("DriverStatus",DRIVERSTATUS), ## 驱动程序返回状态
("bBuffer[1]",BYTE), ## 输入缓冲区(此处象征性地包含1字节)
]
SENDCMDOUTPARAMS = _SENDCMDOUTPARAMS # *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS
## IDE的ID命令返回的数据
## 共512字节(256个WORD),这里仅定义了一些感兴趣的项(基本上依据ATA/ATAPI-4)
USHORT = c_ushort
CHAR = c_char
ULONG = c_ulong
UCHAR = c_ubyte
class Capabilities(Structure): ## WORD 49: 一般能力
_fields_=[
("reserved1:8",USHORT),
("DMA:1",USHORT), ## 1=支持DMA
("LBA:1",USHORT), ## 1=支持LBA
("DisIORDY:1",USHORT), ## 1=可不使用IORDY
("IORDY:1",USHORT), ## 1=支持IORDY
("SoftReset:1",USHORT), ## 1=需要ATA软启动
("Overlap:1",USHORT), ## 1=支持重叠操作
("Queue:1",USHORT), ## 1=支持命令队列
("InlDMA:1",USHORT), ## 1=支持交叉存取DMA
]
class FieldValidity(Structure): ## WORD 53: 后续字段有效性标志
_fields_=[
("CHSNumber:1",USHORT), ## 1=WORD 54-58有效
("CycleNumber:1",USHORT), ## 1=WORD 64-70有效
("UnltraDMA:1",USHORT), ## 1=WORD 88有效
("reserved:13",USHORT),
]
class MultSectorStuff(Structure): ## WORD 59: 多扇区读写设定
_fields_=[
("CurNumber:8",USHORT), ## 当前一次性可读写扇区数
("Multi:1",USHORT), ## 1=已选择多扇区读写
("reserved1:7",USHORT),
]
class MultiWordDMA(Structure): ## WORD 63: 多字节DMA支持能力
_fields_=[
("Mode0:1",USHORT), ## 1=支持模式0 (4.17Mb/s)
("Mode1:1",USHORT), ## 1=支持模式1 (13.3Mb/s)
("Mode2:1",USHORT), ## 1=支持模式2 (16.7Mb/s)
("Reserved1:5",USHORT),
("Mode0Sel:1",USHORT), ## 1=已选择模式0
("Mode1Sel:1",USHORT), ## 1=已选择模式1
("Mode2Sel:1",USHORT), ## 1=已选择模式2
("Reserved2:5",USHORT),
]
class PIOCapacity(Structure): ## WORD 64: 高级PIO支持能力
_fields_=[
("AdvPOIModes:8",USHORT), ## 支持高级POI模式数
("reserved:8",USHORT),
]class MajorVersion(Structure): ## WORD 80: 主版本
_fields_=[
("Reserved1:1",USHORT),
("ATA1:1",USHORT), ## 1=支持ATA-1
("ATA2:1",USHORT), ## 1=支持ATA-2
("ATA3:1",USHORT), ## 1=支持ATA-3
("ATA4:1",USHORT), ## 1=支持ATA/ATAPI-4
("ATA5:1",USHORT), ## 1=支持ATA/ATAPI-5
("ATA6:1",USHORT), ## 1=支持ATA/ATAPI-6
("ATA7:1",USHORT), ## 1=支持ATA/ATAPI-7
("ATA8:1",USHORT), ## 1=支持ATA/ATAPI-8
("ATA9:1",USHORT), ## 1=支持ATA/ATAPI-9
("ATA10:1",USHORT), ## 1=支持ATA/ATAPI-10
("ATA11:1",USHORT), ## 1=支持ATA/ATAPI-11
("ATA12:1",USHORT), ## 1=支持ATA/ATAPI-12
("ATA13:1",USHORT), ## 1=支持ATA/ATAPI-13
("ATA14:1",USHORT), ## 1=支持ATA/ATAPI-14
("Reserved2:1",USHORT),
]
class UltraDMA(Structure): ## WORD 88: Ultra DMA支持能力
_fields_=[
("Mode0:1",USHORT), ## 1=支持模式0 (16.7Mb/s)
("Mode1:1",USHORT), ## 1=支持模式1 (25Mb/s)
("Mode2:1",USHORT), ## 1=支持模式2 (33Mb/s)
("Mode3:1",USHORT), ## 1=支持模式3 (44Mb/s)
("Mode4:1",USHORT), ## 1=支持模式4 (66Mb/s)
("Mode5:1",USHORT), ## 1=支持模式5 (100Mb/s)
("Mode6:1",USHORT), ## 1=支持模式6 (133Mb/s)
("Mode7:1",USHORT), ## 1=支持模式7 (166Mb/s) ???
("Mode0Sel:1",USHORT), ## 1=已选择模式0
("Mode1Sel:1",USHORT), ## 1=已选择模式1
("Mode2Sel:1",USHORT), ## 1=已选择模式2
("Mode3Sel:1",USHORT), ## 1=已选择模式3
("Mode4Sel:1",USHORT), ## 1=已选择模式4
("Mode5Sel:1",USHORT), ## 1=已选择模式5
("Mode6Sel:1",USHORT), ## 1=已选择模式6
("Mode7Sel:1",USHORT), ## 1=已选择模式7
]
class _IDINFO(Structure):
_fields_=[
("wGenConfig",USHORT), ## WORD 0: 基本信息字
("wNumCyls",USHORT), ## WORD 1: 柱面数
("wReserved2",USHORT), ## WORD 2: 保留
("wNumHeads",USHORT), ## WORD 3: 磁头数
("wReserved4",USHORT), ## WORD 4: 保留
("wReserved5",USHORT), ## WORD 5: 保留
("wNumSectorsPerTrack",USHORT), ## WORD 6: 每磁道扇区数
("wVendorUnique",USHORT*3), ## WORD 7-9: 厂家设定值
("sSerialNumber",CHAR*20), ## WORD 20: 缓冲类型
("wBufferSize",USHORT), ## WORD 21: 缓冲大小
("wECCSize",USHORT), ## WORD 22: ECC校验大小
("sFirmwareRev",CHAR*8), ## WORD 23-26: 固件版本
("sModelNumber",CHAR*40), ## WORD 27-46: 内部型号
("wMoreVendorUnique",USHORT), ## WORD 47: 厂家设定值
("wReserved48",USHORT), ## WORD 48: 保留
("wCapabilities",Capabilities),
("wReserved1",USHORT), ## WORD 50: 保留
("wPIOTiming",USHORT), ## WORD 51: PIO时序
("wDMATiming",USHORT), ## WORD 52: DMA时序
("wFieldValidity",FieldValidity),
("wNumCurCyls",USHORT), ## WORD 54: CHS可寻址的柱面数
("wNumCurHeads",USHORT), ## WORD 55: CHS可寻址的磁头数
("wNumCurSectorsPerTrack",USHORT), ## WORD 56: CHS可寻址每磁道扇区数
("wCurSectorsLow",USHORT), ## WORD 57: CHS可寻址的扇区数低位字
("wCurSectorsHigh",USHORT), ## WORD 58: CHS可寻址的扇区数高位字
("wMultSectorStuff",MultSectorStuff),
("dwTotalSectors",ULONG), ## WORD 60-61: LBA可寻址的扇区数
("wSingleWordDMA",USHORT), ## WORD 62: 单字节DMA支持能力
("wMultiWordDMA",MultiWordDMA),
("wPIOCapacity",PIOCapacity),
("wMinMultiWordDMACycle",USHORT), ## WORD 65: 多字节DMA传输周期的最小值
("wRecMultiWordDMACycle",USHORT), ## WORD 66: 多字节DMA传输周期的建议值
("wMinPIONoFlowCycle",USHORT), ## WORD 67: 无流控制时PIO传输周期的最小值
("wMinPOIFlowCycle",USHORT), ## WORD 68: 有流控制时PIO传输周期的最小值
("wReserved69[11]",USHORT), ## WORD 69-79: 保留
("wMajorVersion",MajorVersion),
("wMinorVersion",USHORT), ## WORD 81: 副版本
("wReserved82",USHORT*6), ## WORD 82-87: 保留
("wUltraDMA",UltraDMA),
("wReserved89",USHORT*167) # WORD 89-255
]
IDINFO = _IDINFO #*PIDINFO
hDisk = win32file.CreateFile('\\\\.\\PhysicalDrive0',
win32file.GENERIC_READ | win32file.GENERIC_WRITE,
win32file.FILE_SHARE_READ|win32file.FILE_SHARE_WRITE,
None,
win32file.OPEN_EXISTING,
0,
None)
print(hDisk)
pSCIP=SENDCMDINPARAMS()
pSCOP=SENDCMDOUTPARAMS()
#print(pSCIP)
pSCIP.irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY
#print(pSCIP.irDriveRegs.bCommandReg)
pSCIP.cBufferSize = 0
#pSCIP=create_string_buffer(pSCIP)
pSCOP.cBufferSize=sizeof(IDINFO)
Total=pSCOP.cBufferSize + sizeof(pSCOP)
#print(pSCIP.irDriveRegs.bCommandReg)
#print(pSCIP)
#print(pSCOP)
#print(Total)
##IOCTL_DISK_GET_DRIVE_GEOMETRY=0x0007c084
##IOCTL_DISK_GET_MEDIA_TYPES = 0x70c00
info = win32file.DeviceIoControl(hDisk,
DFP_SEND_DRIVE_COMMAND,
pSCIP,
Total, #sizeof(SENDCMDOUTPARAMS) + sizeof(IDINFO) - 1,
None)
print(info)
win32file.CloseHandle(hDisk)