有没有人知道DeviceIoControl的用法?

mousefather 2003-08-25 10:46:15
有人跟我说可以用DeviceIoControl函数得到cpu的一些信息,比如频率,厂商什么的
但是我查看了msdn,好像没有关于cpu 的参数,请教有用过这个函数的朋友
...全文
180 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
farfh 2003-08-26
  • 打赏
  • 举报
回复
msdn2003的msdn上说明很详细,
以前用2001的时候好象说得很粗略。
zhouyong0371 2003-08-25
  • 打赏
  • 举报
回复
void CHDDInfoDlg::GetHDDSerialNT()
{
char hd[80];
PIDSECTOR phdinfo[4];
char s[41];

ZeroMemory(&vers,sizeof(vers));
//We start in NT/Win2000
for (j=0;j<4;j++){
wsprintf(hd,"\\\\.\\PhysicalDrive%d",j);
h=CreateFile(hd,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
if (!h){
continue;
}
if (!DeviceIoControl(h,DFP_GET_VERSION,0,0,&vers,sizeof(vers),&i,0)){
CloseHandle(h);
continue;
}
//If IDE identify command not supported, fails
if (!(vers.fCapabilities&1)){
MessageBox("Error: IDE identify command not supported.");
CloseHandle(h);
return;
}
//Identify the IDE drives
ZeroMemory(&in,sizeof(in));
ZeroMemory(&out,sizeof(out));
if (j&1){
in.irDriveRegs.bDriveHeadReg=0xb0;
}else{
in.irDriveRegs.bDriveHeadReg=0xa0;
}
if (vers.fCapabilities&(16>>j)){
//We don't detect a ATAPI device.
continue;
}else{
in.irDriveRegs.bCommandReg=0xec;
}
in.bDriveNumber=j;
in.irDriveRegs.bSectorCountReg=1;
in.irDriveRegs.bSectorNumberReg=1;
in.cBufferSize=512;
if (!DeviceIoControl(h,DFP_RECEIVE_DRIVE_DATA,&in,sizeof(in),&out,sizeof(out),&i,0)){
MessageBox("DeviceIoControl failed:DFP_RECEIVE_DRIVE_DATA");
CloseHandle(h);
return;
}
phdinfo[i]=(PIDSECTOR)out.bBuffer;

memcpy(s,phdinfo[i]->sSerialNumber,20);
s[20]=0;
ChangeByteOrder(s,20);
m_Serial=s;
m_Serial.TrimLeft();
m_Serial.TrimRight();
MessageBox(m_Serial);
UpdateData(false);
CloseHandle(h);
}

}
不好意思,代码太长,发不了了。
zhouyong0371 2003-08-25
  • 打赏
  • 举报
回复
下边给你一个用DeviceIoControl获得硬盘序列号的代码:
//StrucDef.h

#define DFP_GET_VERSION 0x00074080
#define DFP_SEND_DRIVE_COMMAND 0x0007c084
#define DFP_RECEIVE_DRIVE_DATA 0x0007c088

//#pragma pack(1)
typedef struct _GETVERSIONOUTPARAMS {
BYTE bVersion; // Binary driver version.
BYTE bRevision; // Binary driver revision.
BYTE bReserved; // Not used.
BYTE bIDEDeviceMap; // Bit map of IDE devices.
DWORD fCapabilities; // Bit mask of driver capabilities.
DWORD dwReserved[4]; // For future use.
} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;

typedef struct _IDEREGS {
BYTE bFeaturesReg; // Used for specifying SMART "commands".
BYTE bSectorCountReg; // IDE sector count register
BYTE bSectorNumberReg; // IDE sector number register
BYTE bCylLowReg; // IDE low order cylinder value
BYTE bCylHighReg; // IDE high order cylinder value
BYTE bDriveHeadReg; // IDE drive/head register
BYTE bCommandReg; // Actual IDE command.
BYTE bReserved; // reserved for future use. Must be zero.
} IDEREGS, *PIDEREGS, *LPIDEREGS;

typedef struct _SENDCMDINPARAMS {
DWORD cBufferSize; // Buffer size in bytes
IDEREGS irDriveRegs; // Structure with drive register values.
BYTE bDriveNumber; // Physical drive number to send
// command to (0,1,2,3).
BYTE bReserved[3]; // Reserved for future expansion.
DWORD dwReserved[4]; // For future use.
//BYTE bBuffer[1]; // Input buffer.
} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;

typedef struct _DRIVERSTATUS {
BYTE bDriverError; // Error code from driver,
// or 0 if no error.
BYTE bIDEStatus; // Contents of IDE Error register.
// Only valid when bDriverError
// is SMART_IDE_ERROR.
BYTE bReserved[2]; // Reserved for future expansion.
DWORD dwReserved[2]; // Reserved for future expansion.
} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;

typedef struct _SENDCMDOUTPARAMS {
DWORD cBufferSize; // Size of bBuffer in bytes
DRIVERSTATUS DriverStatus; // Driver status structure.
BYTE bBuffer[512]; // Buffer of arbitrary length
// in which to store the data read from the drive.
} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;

typedef struct _IDSECTOR {
USHORT wGenConfig;
USHORT wNumCyls;
USHORT wReserved;
USHORT wNumHeads;
USHORT wBytesPerTrack;
USHORT wBytesPerSector;
USHORT wSectorsPerTrack;
USHORT wVendorUnique[3];
CHAR sSerialNumber[20];
USHORT wBufferType;
USHORT wBufferSize;
USHORT wECCSize;
CHAR sFirmwareRev[8];
CHAR sModelNumber[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 bReserved[128];
} IDSECTOR, *PIDSECTOR;

struct tagPort32Struct
{
USHORT wPortAddr;
ULONG dwPortVal;
UCHAR bSize;
};

struct GDTR
{
WORD wGDTLimit;
DWORD dwGDTBase;
};

struct GDT_DESCRIPTOR
{
WORD Limit_0_15;
WORD Base_0_15;
BYTE Base_16_23;
BYTE Type : 4;
BYTE System : 1;
BYTE DPL : 2;
BYTE Present : 1;
BYTE Limit_16_19 : 4;
BYTE Available : 1;
BYTE Reserved : 1;
BYTE D_B : 1;
BYTE Granularity : 1;
BYTE Base_24_31;
};

struct CALLGATE_DESCRIPTOR
{
WORD Offset_0_15;
WORD Selector;
WORD ParamCount : 5;
WORD Unused : 3;
WORD Type : 4;
WORD System : 1;
WORD DPL : 2;
WORD Present : 1;
WORD Offset_16_31;
};

// Define the various device type values. Note that values used by Microsoft
// Corporation are in the range 0-32767, and 32768-65535 are reserved for use
// by customers.
#ifndef WINIO_H
#define WINIO_H

#define FILE_DEVICE_WINIO 0x00008010

// Macro definition for defining IOCTL and FSCTL function control codes.
// Note that function codes 0-2047 are reserved for Microsoft Corporation,
// and 2048-4095 are reserved for customers.

#define WINIO_IOCTL_INDEX 0x810

// Define our own private IOCTL

#define IOCTL_WINIO_MAPPHYSTOLIN CTL_CODE(FILE_DEVICE_WINIO, \
WINIO_IOCTL_INDEX, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)

#define IOCTL_WINIO_UNMAPPHYSADDR CTL_CODE(FILE_DEVICE_WINIO, \
WINIO_IOCTL_INDEX + 1, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)

#define IOCTL_WINIO_WRITEPORT CTL_CODE(FILE_DEVICE_WINIO, \
WINIO_IOCTL_INDEX + 2, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)

#define IOCTL_WINIO_READPORT CTL_CODE(FILE_DEVICE_WINIO, \
WINIO_IOCTL_INDEX + 3, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#endif


//HDDInfoDlg.h
#include"StrucDef.h"
#include"winioctl.h"

/////////////////////////////////////////////////////////////////////////////
// CHDDInfoDlg dialog

class CHDDInfoDlg : public CDialog
{
// Construction
public:
CHDDInfoDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CHDDInfoDlg)
enum { IDD = IDD_HDDINFO_DIALOG };
CString m_Serial;
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CHDDInfoDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
HICON m_hIcon;

// Generated message map functions
//{{AFX_MSG(CHDDInfoDlg)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
bool IsWinNT();
bool InitializeWinIo();
char * ConvertToString (DWORD diskdata [256], int firstIndex, int lastIndex);
bool SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);
bool CallRing0(PVOID pvRing0FuncAddr, WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
bool GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
void CallJudge();
void ChangeByteOrder(PCHAR szString, USHORT uscStrSize);
void GetHDDSerialNT();
void GetHDDSerial9x();
void DetectIDE(BYTE bIDEDeviceMap);

GETVERSIONOUTPARAMS vers;
SENDCMDINPARAMS in;
SENDCMDOUTPARAMS out;
HANDLE h;
DWORD i;
BYTE j;
bool IsNT;
bool IsWinIoInitialized;
HANDLE hDriver;
};
zhouyong0371 2003-08-25
  • 打赏
  • 举报
回复
先给你这个
bool CHardwareInfoDlg::GetProcessorInfo()
{
SYSTEM_INFO sysInfo;
char str [MAX_PATH];
LONG result;
HKEY hKey;
TCHAR vendorData [64];
DWORD data;
DWORD dataSize;

// Get the processor speed info.

result = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,
"Hardware\\Description\\System\\CentralProcessor\\0", 0, KEY_QUERY_VALUE, &hKey);

// Check if the function has succeeded.

if (result == ERROR_SUCCESS) {
result = ::RegQueryValueEx (hKey, _T("~MHz"), NULL, NULL,
(LPBYTE)&data, &dataSize);

m_stCPUSpeed.Format ("%d", data);
m_stCPUSpeed += _T (" MHz");

dataSize = sizeof (vendorData);

result = ::RegQueryValueEx (hKey, _T("VendorIdentifier"), NULL, NULL,
(LPBYTE)vendorData, &dataSize);

m_stVendorInfo.Format ("%s", vendorData);
}

// Make sure to close the reg key

RegCloseKey (hKey);

// Get the hardware information

GetSystemInfo (&sysInfo);

// Lets check the processor type first

if (sysInfo.dwProcessorType == PROCESSOR_INTEL_386) {
m_stProcessorType = _T ("Intel 386");
}
else if (sysInfo.dwProcessorType == PROCESSOR_INTEL_486) {
m_stProcessorType = _T ("Intel 486");
}
else if (sysInfo.dwProcessorType == PROCESSOR_INTEL_PENTIUM) {
m_stProcessorType = _T ("Intel Pentium");
}
else if (sysInfo.dwProcessorType == PROCESSOR_MIPS_R4000) {
// only for NT
m_stProcessorType = _T ("MIPS");
}
else if (sysInfo.dwProcessorType == PROCESSOR_ALPHA_21064) {
// only for NT
m_stProcessorType = _T ("Alpha");
}
else {
m_stProcessorType = _T ("Unknown");
}

// check number of processors

itoa (sysInfo.dwNumberOfProcessors , str, 10);

m_stNumProcessors = CString (str);

// Check the architecture type and processor level

// Windows 95 doesn't use processor level

if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) {
m_stArchitecture = _T ("Pentium");
switch (sysInfo.wProcessorLevel) {
case 3:
m_stProcessorLevel = _T ("Intel 80386");
break;
case 4:
m_stProcessorLevel = _T ("Intel 80486");
break;
case 5:
m_stProcessorLevel = _T ("Pentium");
// Check if the MMX instruction set is availbale or not.

if (IsProcessorFeaturePresent (PF_MMX_INSTRUCTIONS_AVAILABLE)) {
m_stProcessorLevel += _T (" MMX");
}
break;
case 6:
m_stProcessorLevel = _T ("Pentium (II/Pro)");
break;
}
}
else if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_MIPS) {
m_stArchitecture = _T ("MIPS");
if (sysInfo.wProcessorLevel == 0004) {
m_stProcessorLevel = _T ("MIPS R4000");
}
else {
m_stProcessorLevel = _T ("Unknown");
}
}
else if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ALPHA) {
m_stArchitecture = _T ("Alpha");

itoa (sysInfo.wProcessorLevel , str, 10);

m_stProcessorLevel = m_stArchitecture + CString (str);
}
else if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_PPC) {
m_stArchitecture = _T ("PPC");

switch (sysInfo.wProcessorLevel) {
case 1:
m_stProcessorLevel = _T ("PPC 601");
break;
case 3:
m_stProcessorLevel = _T ("PPC 603");
break;
case 4:
m_stProcessorLevel = _T ("PPC 604");
break;
case 6:
m_stProcessorLevel = _T ("PPC 603+");
break;
case 9:
m_stProcessorLevel = _T ("PPC 604+");
break;
case 20:
m_stProcessorLevel = _T ("PPC 620");
break;
}
}
else if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_UNKNOWN) {
m_stArchitecture = _T ("Unknown");
}


// Check page size

itoa (sysInfo.dwPageSize , str, 10);
m_stPageSize = CString (str);

// Application address

TCHAR buffer [64];

sprintf( buffer, "%p", sysInfo.lpMaximumApplicationAddress);

m_stMaxAddress = _T ("0x") + CString (buffer);

sprintf( buffer, "%p", sysInfo.lpMinimumApplicationAddress);

m_stMinAdress = _T ("0x") + CString (buffer);

// Get active processor mask
// It represent how many processors are active (?? I am not sure)

itoa (sysInfo.dwActiveProcessorMask , str, 10);
m_stMask = CString (str);

UpdateData (FALSE);

return (true);
}

bool CHardwareInfoDlg::GetMouseInfo()
{
int mouseInfo[3]; // We need an array (size 3) of int for mouse information
TCHAR str [32];
BOOL stat;

// Check if mouse is present or not.

stat = GetSystemMetrics (SM_MOUSEPRESENT);

if (!stat) {
m_stMouse = _T ("Not installed");
}
else {
m_stMouse = _T ("Installed");

// Check if buttons are swapped

stat = GetSystemMetrics (SM_SWAPBUTTON);

m_stButtonsSwapped = (stat) ? _T ("Swapped") : _T ("Not swapped");

}

// Get mouse speed

SystemParametersInfo (SPI_GETMOUSE, NULL, mouseInfo, NULL);

// mouseInfo [0] & mouseInfo [1], give twp threshold values for mouse
// mpuseInfo [2] gives the mouse speed.

sprintf (str, "%d", mouseInfo[2]);

m_stMouseSpeed = CString (str);

UpdateData (FALSE);

return (true);
}

bool CHardwareInfoDlg::GetMemoryInfo ()
{
double var;
MEMORYSTATUS memoryStatus;

memset (&memoryStatus, sizeof (MEMORYSTATUS), 0);
memoryStatus.dwLength = sizeof (MEMORYSTATUS);

GlobalMemoryStatus (&memoryStatus);

m_stMemoryUsed.Format ("%d", memoryStatus.dwMemoryLoad);

var = memoryStatus.dwTotalPhys / 1024;
m_stPhysicalMemory.Format ("%7.0f", var);
m_stPhysicalMemory += _T (" KB");
m_stPhysicalMemory.TrimLeft ();

var = memoryStatus.dwAvailPhys / 1024;
m_stPhysicalMemAvailable.Format ("%7.0f", var);
m_stPhysicalMemAvailable += _T (" KB");
m_stPhysicalMemAvailable.TrimLeft ();

var = memoryStatus.dwTotalVirtual / 1024;
m_stVirtualMemory.Format ("%7.0f", var);
m_stVirtualMemory += _T (" KB");
m_stVirtualMemory.TrimLeft ();

UpdateData (FALSE);
return (true);
}
mousefather 2003-08-25
  • 打赏
  • 举报
回复
那个GetSystemInfo好像没办法得到amd的cpu的型号和频率是吗?

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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