C#读硬盘序列号的源代码

public  class  IDE
ExpandedBlockStart.gifContractedBlock.gif
{
    [StructLayout(LayoutKind.Sequential, CharSet 
= CharSet.Ansi)]
    
internal struct IDSECTOR
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public ushort wGenConfig;
        
public ushort wNumCyls;
        
public ushort wReserved;
        
public ushort wNumHeads;
        
public ushort wBytesPerTrack;
        
public ushort wBytesPerSector;
        
public ushort wSectorsPerTrack;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst 
= 3)]
        
public ushort[] wVendorUnique;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst 
= 20)]
        
public string sSerialNumber;
        
public ushort wBufferType;
        
public ushort wBufferSize;
        
public ushort wECCSize;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst 
= 8)]
        
public string sFirmwareRev;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst 
= 40)]
        
public string sModelNumber;
        
public ushort wMoreVendorUnique;
        
public ushort wDoubleWordIO;
        
public ushort wCapabilities;
        
public ushort wReserved1;
        
public ushort wPIOTiming;
        
public ushort wDMATiming;
        
public ushort wBS;
        
public ushort wNumCurrentCyls;
        
public ushort wNumCurrentHeads;
        
public ushort wNumCurrentSectorsPerTrack;
        
public uint ulCurrentSectorCapacity;
        
public ushort wMultSectorStuff;
        
public uint ulTotalAddressableSectors;
        
public ushort wSingleWordDMA;
        
public ushort wMultiWordDMA;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst 
= 128)]
        
public byte[] bReserved;
    }


    [StructLayout(LayoutKind.Sequential)]
    
internal struct DRIVERSTATUS
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public byte bDriverError;
        
public byte bIDEStatus;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst 
= 2)]
        
public byte[] bReserved;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst 
= 2)]
        
public uint[] dwReserved;
    }


    [StructLayout(LayoutKind.Sequential)]
    
internal struct SENDCMDOUTPARAMS
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public uint cBufferSize;
        
public DRIVERSTATUS DriverStatus;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst 
= 513)]
        
public byte[] bBuffer;
    }


    [StructLayout(LayoutKind.Sequential, CharSet 
= CharSet.Ansi)]
    
internal struct SRB_IO_CONTROL
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public uint HeaderLength;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst 
= 8)]
        
public string Signature;
        
public uint Timeout;
        
public uint ControlCode;
        
public uint ReturnCode;
        
public uint Length;
    }


    [StructLayout(LayoutKind.Sequential)]
    
internal struct IDEREGS
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public byte bFeaturesReg;
        
public byte bSectorCountReg;
        
public byte bSectorNumberReg;
        
public byte bCylLowReg;
        
public byte bCylHighReg;
        
public byte bDriveHeadReg;
        
public byte bCommandReg;
        
public byte bReserved;
    }


    [StructLayout(LayoutKind.Sequential)]
    
internal struct SENDCMDINPARAMS
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public uint cBufferSize;
        
public IDEREGS irDriveRegs;
        
public byte bDriveNumber;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst 
= 3)]
        
public byte[] bReserved;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst 
= 4)]
        
public uint[] dwReserved;
        
public byte bBuffer;
    }


    [StructLayout(LayoutKind.Sequential)]
    
internal struct GETVERSIONOUTPARAMS
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public byte bVersion;
        
public byte bRevision;
        
public byte bReserved;
        
public byte bIDEDeviceMap;
        
public uint fCapabilities;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst 
= 4)]
        
public uint[] dwReserved; // For future use. 
    }


    [DllImport(
"kernel32.dll")]
    
private static extern int CloseHandle(uint hObject);

    [DllImport(
"kernel32.dll")]
    
private static extern int DeviceIoControl(uint hDevice,
    
uint dwIoControlCode,
    
ref SENDCMDINPARAMS lpInBuffer,
    
int nInBufferSize,
    
ref SENDCMDOUTPARAMS lpOutBuffer,
    
int nOutBufferSize,
    
ref uint lpbytesReturned,
    
int lpOverlapped);

    [DllImport(
"kernel32.dll")]
    
private static extern int DeviceIoControl(uint hDevice,
    
uint dwIoControlCode,
    
int lpInBuffer,
    
int nInBufferSize,
    
ref GETVERSIONOUTPARAMS lpOutBuffer,
    
int nOutBufferSize,
    
ref uint lpbytesReturned,
    
int lpOverlapped);

    [DllImport(
"kernel32.dll")]
    
private static extern uint CreateFile(string lpFileName,
    
uint dwDesiredAccess,
    
uint dwShareMode,
    
int lpSecurityAttributes,
    
uint dwCreationDisposition,
    
uint dwFlagsAndAttributes,
    
int hTemplateFile);

    
private const uint GENERIC_READ = 0x80000000;
    
private const uint GENERIC_WRITE = 0x40000000;
    
private const uint FILE_SHARE_READ = 0x00000001;
    
private const uint FILE_SHARE_WRITE = 0x00000002;
    
private const uint OPEN_EXISTING = 3;
    
private const uint INVALID_HANDLE_VALUE = 0xffffffff;
    
private const uint DFP_GET_VERSION = 0x00074080;
    
private const int IDE_ATAPI_IDENTIFY = 0xA1// Returns ID sector for ATAPI. 
    private const int IDE_ATA_IDENTIFY = 0xEC// Returns ID sector for ATA. 
    private const int IDENTIFY_BUFFER_SIZE = 512;
    
private const uint DFP_RECEIVE_DRIVE_DATA = 0x0007c088;

    
public static string Read(byte drive)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        OperatingSystem os 
= Environment.OSVersion;
        
if (os.Platform != PlatformID.Win32NT) throw new NotSupportedException("仅 支持WindowsNT/2000/XP");
        
//if (os.Version.Major < 5) throw new NotSupportedException(" 仅支持WindowsNT/2000/XP"); 

        
string driveName = "\\\\.\\PhysicalDrive" + drive.ToString();
        
uint device = CreateFile(driveName,
        GENERIC_READ 
| GENERIC_WRITE,
        FILE_SHARE_READ 
| FILE_SHARE_WRITE,
        
0, OPEN_EXISTING, 00);
        
if (device == INVALID_HANDLE_VALUE) return "";
        GETVERSIONOUTPARAMS verPara 
= new GETVERSIONOUTPARAMS();
        
uint bytRv = 0;

        
if (0 != DeviceIoControl(device, DFP_GET_VERSION,
        
00ref verPara, Marshal.SizeOf(verPara),
        
ref bytRv, 0))
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
if (verPara.bIDEDeviceMap > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
byte bIDCmd = (byte)(((verPara.bIDEDeviceMap >> drive & 0x10!= 0? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY);
                SENDCMDINPARAMS scip 
= new SENDCMDINPARAMS();
                SENDCMDOUTPARAMS scop 
= new SENDCMDOUTPARAMS();

                scip.cBufferSize 
= IDENTIFY_BUFFER_SIZE;
                scip.irDriveRegs.bFeaturesReg 
= 0;
                scip.irDriveRegs.bSectorCountReg 
= 1;
                scip.irDriveRegs.bCylLowReg 
= 0;
                scip.irDriveRegs.bCylHighReg 
= 0;
                scip.irDriveRegs.bDriveHeadReg 
= (byte)(0xA0 | ((drive & 1<< 4));
                scip.irDriveRegs.bCommandReg 
= bIDCmd;
                scip.bDriveNumber 
= drive;

                
if (0 != DeviceIoControl(device, DFP_RECEIVE_DRIVE_DATA,
                
ref scip, Marshal.SizeOf(scip), ref scop,
                Marshal.SizeOf(scop), 
ref bytRv, 0))
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    StringBuilder s 
= new StringBuilder();
                    
for (int i = 20; i < 40; i += 2)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        s.Append((
char)(scop.bBuffer[i + 1]));
                        s.Append((
char)scop.bBuffer[i]);
                    }

                    CloseHandle(device);
                    
return s.ToString().Trim();
                }

            }

        }

        CloseHandle(device);
        
return "";
    }

}

转载于:https://www.cnblogs.com/wenanry/archive/2010/03/25/1692091.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值