saber67
یک شنبه 27 بهمن 1392, 22:33 عصر
سلام دوستان
من بعد از کلی زیر و رو کردن اینترنت یه کد پیدا کردم که توی دات نت بشه بدون استفاده از WMI سریال هارد دیسک رو بدست آورد (WMI بعضی وقتا درست کار نمی کنه!)
اما متاسفانه کدهاش به زبان VB.Net بود، من با مبدل کد تبدیلش کردم به C# حالا موقع اجرا یه خطا می گیره
کد تبدیل شده رو می نویسم، اگه کسی تونست مشکلش رو حل کنه، فکر کنم این کد به درد خیلی های دیگه هم بخوره
// VBConversions Note: VB project level imports
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Diagnostics;
using Microsoft.VisualBasic;
using System.Linq;
using System;
using System.Collections;
using System.Xml.Linq;
using System.Windows.Forms;
// End of VB project level imports
using System.Runtime.InteropServices;
namespace Get_HDD_Serial
{
public class HDDInfo
{
#region Declatrations
[DllImport("kernel32",EntryPoint="CreateFileA", ExactSpelling=true, CharSet=CharSet.Ansi, SetLastError=true)]
private static extern int CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);
[System.Runtime.InteropServices.DllImport("kernel32.dll")]private static extern int CloseHandle(int hObject);
[System.Runtime.InteropServices.DllImport("kernel32.dll")]private static extern int DeviceIoControl(int hDevice, int dwIoControlCode, SENDCMDINPARAMS lpInBuffer, int lpInBufferSize, SENDCMDOUTPARAMS lpOutBuffer, int lpOutBufferSize, ref int lpBytesReturned,
int lpOverlapped);
private const short FILE_SHARE_READ = 0x1;
private const short FILE_SHARE_WRITE = 0x2;
private const int GENERIC_READ = unchecked ((int) 0x80000000);
private const int GENERIC_WRITE = 0x40000000;
private const short OPEN_EXISTING = 3;
private const short CREATE_NEW = 1;
private const int VER_PLATFORM_WIN32_NT = 2;
private const int DFP_RECEIVE_DRIVE_DATA = 0x7C088;
private const int INVALID_HANDLE_VALUE = -1;
#endregion
#region Classes
[StructLayout(LayoutKind.Sequential, Size = 8)]private class IDEREGS
{
public byte Features;
public byte SectorCount;
public byte SectorNumber;
public byte CylinderLow;
public byte CylinderHigh;
public byte DriveHead;
public byte Command;
public byte Reserved;
}
[StructLayout(LayoutKind.Sequential, Size = 32)]private class SENDCMDINPARAMS
{
public int BufferSize;
public IDEREGS DriveRegs;
public byte DriveNumber;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]public byte[] Reserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]public int[] Reserved2;
public SENDCMDINPARAMS()
{
DriveRegs = new IDEREGS();
Reserved = new byte[3];
Reserved2 = new int[4];
}
}
[StructLayout(LayoutKind.Sequential, Size = 12)]private class DRIVERSTATUS
{
public byte DriveError;
public byte IDEStatus;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]public byte[] Reserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]public int[] Reserved2;
public DRIVERSTATUS()
{
Reserved = new byte[2];
Reserved2 = new int[2];
}
}
[StructLayout(LayoutKind.Sequential)]private class IDSECTOR
{
public short GenConfig;
public short NumberCylinders;
public short Reserved;
public short NumberHeads;
public short BytesPerTrack;
public short BytesPerSector;
public short SectorsPerTrack;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]public short[] VendorUnique;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]public char[] SerialNumber;
public short BufferClass;
public short BufferSize;
public short ECCSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]public char[] FirmwareRevision;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]public char[] ModelNumber;
public short MoreVendorUnique;
public short DoubleWordIO;
public short Capabilities;
public short Reserved1;
public short PIOTiming;
public short DMATiming;
public short BS;
public short NumberCurrentCyls;
public short NumberCurrentHeads;
public short NumberCurrentSectorsPerTrack;
public int CurrentSectorCapacity;
public short MultipleSectorCapacity;
public short MultipleSectorStuff;
public int TotalAddressableSectors;
public short SingleWordDMA;
public short MultiWordDMA;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 382)]public byte[] Reserved2;
}
[StructLayout(LayoutKind.Sequential)]private class SENDCMDOUTPARAMS
{
public int BufferSize;
public DRIVERSTATUS Status;
public IDSECTOR IDS;
public SENDCMDOUTPARAMS()
{
Status = new DRIVERSTATUS();
IDS = new IDSECTOR();
}
}
#endregion
#region Methods and Functions
private static string SwapChars(char[] chars)
{
for (int i = 0; i <= (chars.Length - 2); i += 2)
{
char t = (char) 0;
t = chars[i];
chars[i] = chars[i + 1];
chars[i + 1] = t;
}
string s = new string(chars);
return s;
}
public static string GetHDDInfoString()
{
string serialNumber = " ";
string model = " ";
string firmware = " ";
int handle = 0;
int returnSize = 0;
int driveNumber = 0;
SENDCMDINPARAMS sci = new SENDCMDINPARAMS();
SENDCMDOUTPARAMS sco = new SENDCMDOUTPARAMS();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
handle = System.Convert.ToInt32(CreateFile("\\\\.\\PhysicalDrive" + "0", GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0));
}
else
{
handle = System.Convert.ToInt32(CreateFile("\\\\.\\Smartvsd", 0, 0, 0, CREATE_NEW, 0, 0));
}
if (handle != INVALID_HANDLE_VALUE)
{
sci.DriveNumber = (byte) driveNumber;
sci.BufferSize = Marshal.SizeOf(sco);
sci.DriveRegs.DriveHead = System.Convert.ToByte(0xA0 | driveNumber << 4);
sci.DriveRegs.Command = (byte) (0xEC);
sci.DriveRegs.SectorCount = (byte) 1;
sci.DriveRegs.SectorNumber = (byte) 1;
if (DeviceIoControl(handle, DFP_RECEIVE_DRIVE_DATA, sci, Marshal.SizeOf(sci), sco, Marshal.SizeOf(sco), ref
returnSize, 0) != 0)
{
serialNumber = SwapChars(sco.IDS.SerialNumber);
model = SwapChars(sco.IDS.ModelNumber);
firmware = SwapChars(sco.IDS.FirmwareRevision);
}
CloseHandle(handle);
}
return serialNumber.Trim();
}
#endregion
}
}
اینم نحوه تست
TextBox1.Text = HDDInfo.GetHDDInfoString();
من بعد از کلی زیر و رو کردن اینترنت یه کد پیدا کردم که توی دات نت بشه بدون استفاده از WMI سریال هارد دیسک رو بدست آورد (WMI بعضی وقتا درست کار نمی کنه!)
اما متاسفانه کدهاش به زبان VB.Net بود، من با مبدل کد تبدیلش کردم به C# حالا موقع اجرا یه خطا می گیره
کد تبدیل شده رو می نویسم، اگه کسی تونست مشکلش رو حل کنه، فکر کنم این کد به درد خیلی های دیگه هم بخوره
// VBConversions Note: VB project level imports
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Diagnostics;
using Microsoft.VisualBasic;
using System.Linq;
using System;
using System.Collections;
using System.Xml.Linq;
using System.Windows.Forms;
// End of VB project level imports
using System.Runtime.InteropServices;
namespace Get_HDD_Serial
{
public class HDDInfo
{
#region Declatrations
[DllImport("kernel32",EntryPoint="CreateFileA", ExactSpelling=true, CharSet=CharSet.Ansi, SetLastError=true)]
private static extern int CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);
[System.Runtime.InteropServices.DllImport("kernel32.dll")]private static extern int CloseHandle(int hObject);
[System.Runtime.InteropServices.DllImport("kernel32.dll")]private static extern int DeviceIoControl(int hDevice, int dwIoControlCode, SENDCMDINPARAMS lpInBuffer, int lpInBufferSize, SENDCMDOUTPARAMS lpOutBuffer, int lpOutBufferSize, ref int lpBytesReturned,
int lpOverlapped);
private const short FILE_SHARE_READ = 0x1;
private const short FILE_SHARE_WRITE = 0x2;
private const int GENERIC_READ = unchecked ((int) 0x80000000);
private const int GENERIC_WRITE = 0x40000000;
private const short OPEN_EXISTING = 3;
private const short CREATE_NEW = 1;
private const int VER_PLATFORM_WIN32_NT = 2;
private const int DFP_RECEIVE_DRIVE_DATA = 0x7C088;
private const int INVALID_HANDLE_VALUE = -1;
#endregion
#region Classes
[StructLayout(LayoutKind.Sequential, Size = 8)]private class IDEREGS
{
public byte Features;
public byte SectorCount;
public byte SectorNumber;
public byte CylinderLow;
public byte CylinderHigh;
public byte DriveHead;
public byte Command;
public byte Reserved;
}
[StructLayout(LayoutKind.Sequential, Size = 32)]private class SENDCMDINPARAMS
{
public int BufferSize;
public IDEREGS DriveRegs;
public byte DriveNumber;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]public byte[] Reserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]public int[] Reserved2;
public SENDCMDINPARAMS()
{
DriveRegs = new IDEREGS();
Reserved = new byte[3];
Reserved2 = new int[4];
}
}
[StructLayout(LayoutKind.Sequential, Size = 12)]private class DRIVERSTATUS
{
public byte DriveError;
public byte IDEStatus;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]public byte[] Reserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]public int[] Reserved2;
public DRIVERSTATUS()
{
Reserved = new byte[2];
Reserved2 = new int[2];
}
}
[StructLayout(LayoutKind.Sequential)]private class IDSECTOR
{
public short GenConfig;
public short NumberCylinders;
public short Reserved;
public short NumberHeads;
public short BytesPerTrack;
public short BytesPerSector;
public short SectorsPerTrack;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]public short[] VendorUnique;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]public char[] SerialNumber;
public short BufferClass;
public short BufferSize;
public short ECCSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]public char[] FirmwareRevision;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]public char[] ModelNumber;
public short MoreVendorUnique;
public short DoubleWordIO;
public short Capabilities;
public short Reserved1;
public short PIOTiming;
public short DMATiming;
public short BS;
public short NumberCurrentCyls;
public short NumberCurrentHeads;
public short NumberCurrentSectorsPerTrack;
public int CurrentSectorCapacity;
public short MultipleSectorCapacity;
public short MultipleSectorStuff;
public int TotalAddressableSectors;
public short SingleWordDMA;
public short MultiWordDMA;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 382)]public byte[] Reserved2;
}
[StructLayout(LayoutKind.Sequential)]private class SENDCMDOUTPARAMS
{
public int BufferSize;
public DRIVERSTATUS Status;
public IDSECTOR IDS;
public SENDCMDOUTPARAMS()
{
Status = new DRIVERSTATUS();
IDS = new IDSECTOR();
}
}
#endregion
#region Methods and Functions
private static string SwapChars(char[] chars)
{
for (int i = 0; i <= (chars.Length - 2); i += 2)
{
char t = (char) 0;
t = chars[i];
chars[i] = chars[i + 1];
chars[i + 1] = t;
}
string s = new string(chars);
return s;
}
public static string GetHDDInfoString()
{
string serialNumber = " ";
string model = " ";
string firmware = " ";
int handle = 0;
int returnSize = 0;
int driveNumber = 0;
SENDCMDINPARAMS sci = new SENDCMDINPARAMS();
SENDCMDOUTPARAMS sco = new SENDCMDOUTPARAMS();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
handle = System.Convert.ToInt32(CreateFile("\\\\.\\PhysicalDrive" + "0", GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0));
}
else
{
handle = System.Convert.ToInt32(CreateFile("\\\\.\\Smartvsd", 0, 0, 0, CREATE_NEW, 0, 0));
}
if (handle != INVALID_HANDLE_VALUE)
{
sci.DriveNumber = (byte) driveNumber;
sci.BufferSize = Marshal.SizeOf(sco);
sci.DriveRegs.DriveHead = System.Convert.ToByte(0xA0 | driveNumber << 4);
sci.DriveRegs.Command = (byte) (0xEC);
sci.DriveRegs.SectorCount = (byte) 1;
sci.DriveRegs.SectorNumber = (byte) 1;
if (DeviceIoControl(handle, DFP_RECEIVE_DRIVE_DATA, sci, Marshal.SizeOf(sci), sco, Marshal.SizeOf(sco), ref
returnSize, 0) != 0)
{
serialNumber = SwapChars(sco.IDS.SerialNumber);
model = SwapChars(sco.IDS.ModelNumber);
firmware = SwapChars(sco.IDS.FirmwareRevision);
}
CloseHandle(handle);
}
return serialNumber.Trim();
}
#endregion
}
}
اینم نحوه تست
TextBox1.Text = HDDInfo.GetHDDInfoString();