高分求修改硬盘序列号的软件或具体实现方法

xYwJ 2002-10-28 11:11:55
谢谢
...全文
64 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xYwJ 2002-10-28
  • 打赏
  • 举报
回复
今天可以放给我吗?
xYwJ 2002-10-28
  • 打赏
  • 举报
回复
hncy668@163.com


马上结贴!
LinHanLao 2002-10-28
  • 打赏
  • 举报
回复
留你的email吧
xYwJ 2002-10-28
  • 打赏
  • 举报
回复
非常感谢!

请问为什么没有并没有

GetDiskID.h

头文件的内容呀?
LinHanLao 2002-10-28
  • 打赏
  • 举报
回复
LONG APIENTRY GetDiskID()
{
BOOL bGetDiskID = FALSE;

bGetDiskID = ReadPhysicalDriveInNT();
if(!bGetDiskID)
{
bGetDiskID = ReadIdeDriveAsScsiDriveInNT();
}
if(!bGetDiskID)
{
bGetDiskID = ReadDrivePortsInWin9X();
}
return 0;
}

BOOL ReadPhysicalDriveInNT()
{
BOOL bGetDiskID = FALSE;
INT iDrive = 0;

for(iDrive = 0; iDrive < MAX_IDE_DRIVES; iDrive ++)
{
HANDLE hPhysicalDriveIOCTL = NULL;

CHAR szDriveName[256];
sprintf(szDriveName, "\\\\.\\PhysicalDrive%d", iDrive);

hPhysicalDriveIOCTL = CreateFile(
szDriveName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);

if(hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
{
GETVERSIONOUTPARAMS VersionParams;
DWORD cbBytesReturned = 0;

memset((void*)&VersionParams, 0, sizeof(VersionParams));

if(!DeviceIoControl(
hPhysicalDriveIOCTL,
DFP_GET_VERSION,
NULL,
0,
&VersionParams,
sizeof(VersionParams),
&cbBytesReturned,
NULL))
{
continue;
}

if(VersionParams.byIDEDeviceMap > 0)
{
BYTE byIDCmd = 0;
SENDCMDINPARAMS scip;

byIDCmd = ((VersionParams.byIDEDeviceMap >> iDrive) & 0x10) ?
IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;

memset(&scip, 0, sizeof(scip));
memset(g_byIdOutCmd, 0, sizeof(g_byIdOutCmd));

if(DoIdentify(
hPhysicalDriveIOCTL,
&scip,
(PSENDCMDOUTPARAMS)&g_byIdOutCmd,
(BYTE)byIDCmd,
(BYTE)iDrive,
&cbBytesReturned))
{
DWORD dwDiskData[256];
INT i = 0;
USHORT* pIdSector = (USHORT*)((PSENDCMDOUTPARAMS)g_byIdOutCmd) -> byBuffer;

for(i = 0; i < 256; i ++)
{
dwDiskData[i] = pIdSector[i];
}

PrintIdeInfo(iDrive, dwDiskData);

bGetDiskID = TRUE;
}
}
CloseHandle (hPhysicalDriveIOCTL);
}
}
return bGetDiskID;
}

BOOL DoIdentify(HANDLE hPhysicalDriveIOCTL,
PSENDCMDINPARAMS pScip,
PSENDCMDOUTPARAMS pScop,
BYTE byIDCmd,
BYTE byDriveNum,
PDWORD lpcbBytesReturned)
{
pScip->cbBufferSize = IDENTIFY_BUFFER_SIZE;
pScip->irDriveRegs.byFeaturesReg = 0;
pScip->irDriveRegs.bySectorCountReg = 1;
pScip->irDriveRegs.bySectorNumberReg = 1;
pScip->irDriveRegs.byCylLowReg = 0;
pScip->irDriveRegs.byCylHighReg = 0;
pScip->irDriveRegs.byDriveHeadReg = 0xA0 | ((byDriveNum & 1) << 4);
pScip->irDriveRegs.byCommandReg = byIDCmd;

pScip->byDriveNumber = byDriveNum;
pScip->cbBufferSize = IDENTIFY_BUFFER_SIZE;

return(DeviceIoControl(
hPhysicalDriveIOCTL,
DFP_RECEIVE_DRIVE_DATA,
(LPVOID)pScip,
sizeof(SENDCMDINPARAMS) - 1,
(LPVOID)pScop,
sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,
lpcbBytesReturned,
NULL));
}
LinHanLao 2002-10-28
  • 打赏
  • 举报
回复

typedef struct _SENDCMDINPARAMS
{
DWORD cbBufferSize;
IDEREGS irDriveRegs;
BYTE byDriveNumber;
BYTE byReserved[3];
DWORD dwReserved[4];
BYTE byBuffer[1];
} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;

typedef struct _IDSECTOR
{
USHORT wGenConfig;
USHORT wNumCyls;
USHORT wReserved;
USHORT wNumHeads;
USHORT wBytesPerTrack;
USHORT wBytesPerSector;
USHORT wSectorsPerTrack;
USHORT wVendorUnique[3];
CHAR szSerialNumber[20];
USHORT wBufferType;
USHORT wBufferSize;
USHORT wECCSize;
CHAR szFirmwareRev[8];
CHAR szModelNumber[40];
USHORT wMoreVendorUnique;
USHORT wDoubleWordIO;
USHORT wCapabilities;
USHORT wReserved1;
USHORT wPIOTiming;
USHORT wDMATiming;
USHORT wBS;
USHORT wNumCurrentCyls;
USHORT wNumCurrentHeads;
USHORT wNumCurrentSectorsPerTrack;
ULONG ulCurrentSectorCapacity;
USHORT wMultSectorStuff;
ULONG ulTotalAddressableSectors;
USHORT wSingleWordDMA;
USHORT wMultiWordDMA;
BYTE byReserved[128];
} IDSECTOR, *PIDSECTOR;

typedef struct _SRBIOCONTROL
{
ULONG ulHeaderLength;
UCHAR ucSignature[8];
ULONG ulTimeout;
ULONG ulControlCode;
ULONG ulReturnCode;
ULONG ulLength;
} SRBIOCONTROL, *PSRBIOCONTROL;

BOOL ReadPhysicalDriveInNT();
BOOL ReadIdeDriveAsScsiDriveInNT();
BOOL ReadDrivePortsInWin9X();
VOID GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bySize);
VOID SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bySize);
VOID CallRing0(PVOID pvRing0FuncAddr, WORD wPortAddr, PDWORD pdwPortVal, BYTE bySize);
VOID Ring0GetPortVal();
VOID Ring0SetPortVal();
BOOL DoIdentify(HANDLE hPhysicalDriveIOCTL,
PSENDCMDINPARAMS pScip,
PSENDCMDOUTPARAMS pScop,
BYTE byIDCmd,
BYTE byDriveNum,
PDWORD lpcbBytesReturned);
void PrintIdeInfo(INT iDrive, DWORD dwDiskData[256]);// //
BYTE g_byIdOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];
/////////////////////////////////////////////////////////////////////////////
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpvReserved)
{
return TRUE;
}
LinHanLao 2002-10-28
  • 打赏
  • 举报
回复
// GetDiskID.cpp : Defines the entry point for the DLL application.
//

#include "StdAfx.h"
#include "GetDiskID.h"
#include "Port32.h"

#define MAX_IDE_DRIVES 4
#define IDENTIFY_BUFFER_SIZE 512
#define DFP_GET_VERSION 0x00074080
#define DFP_SEND_DRIVE_COMMAND 0x0007c084
#define DFP_RECEIVE_DRIVE_DATA 0x0007c088
#define IDE_ATAPI_IDENTIFY 0xA1
#define IDE_ATA_IDENTIFY 0xEC
#define FILE_DEVICE_SCSI 0x0000001B
#define IOCTL_SCSI_MINIPORT 0x0004D008

#define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501)

#define SENDIDLENGTH sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE

long APIENTRY GetDiskID();

typedef struct _GETVERSIONOUTPARAMS
{
BYTE byVersion;
BYTE byRevision;
BYTE byReserved;
BYTE byIDEDeviceMap;
DWORD dwCapabilities;
DWORD dwReserved[4];
} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;

typedef struct _DRIVERSTATUS
{
BYTE byDriverError;
BYTE byIDEStatus;
BYTE byReserved[2];
DWORD dwReserved[2];
} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;

typedef struct _SENDCMDOUTPARAMS
{
DWORD cbBufferSize;
DRIVERSTATUS DriverStatus;
BYTE byBuffer[1];
} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;

typedef struct _IDEREGS
{
BYTE byFeaturesReg;
BYTE bySectorCountReg;
BYTE bySectorNumberReg;
BYTE byCylLowReg;
BYTE byCylHighReg;
BYTE byDriveHeadReg;
BYTE byCommandReg;
BYTE byReserved;
} IDEREGS, *PIDEREGS, *LPIDEREGS;

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧