نمایش نتایج 1 تا 9 از 9

نام تاپیک: بدست آوردن سریال هارد دیسک بدون استفاده از WMI

Threaded View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1
    کاربر دائمی آواتار saber67
    تاریخ عضویت
    بهمن 1389
    محل زندگی
    کرمانشاه
    سن
    35
    پست
    155

    بدست آوردن سریال هارد دیسک بدون استفاده از WMI

    سلام دوستان
    من بعد از کلی زیر و رو کردن اینترنت یه کد پیدا کردم که توی دات نت بشه بدون استفاده از 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("\\\\.\\Physical Drive" + "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();
    آخرین ویرایش به وسیله saber67 : یک شنبه 27 بهمن 1392 در 22:26 عصر

تاپیک های مشابه

  1. بدست آوردن سریال هارد دیسک و مادربرد و سی پی یو
    نوشته شده توسط dll9095 در بخش VB.NET
    پاسخ: 3
    آخرین پست: جمعه 13 بهمن 1396, 00:44 صبح
  2. پاسخ: 1
    آخرین پست: دوشنبه 11 شهریور 1392, 23:00 عصر
  3. سوال: بدست آوردن سریال هارد با زبان سی
    نوشته شده توسط saeed.afshari در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 6
    آخرین پست: دوشنبه 22 تیر 1388, 12:56 عصر
  4. مقاله: مشکل در بدست آوردن سریال هارد ساتا
    نوشته شده توسط محسن بابائی در بخش VB.NET
    پاسخ: 11
    آخرین پست: یک شنبه 02 فروردین 1388, 16:48 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •