I/O 埠讀寫的實現 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
I/O 埠讀寫的實現 細心的讀者會發現,C Builder不再支援如inportb()、outportb()一類I/O埠讀寫指令了。準確地說,在Windows環境下,BorlandC 僅支援16位元應用程式的埠操作,對32位元應用程式的埠操作不再支援,而C Builder開發出來的程式是32位元的。我個人以?,這是C Builder設計者的敗筆。因?PC機中,I/O位址空間與記憶體位址空間從來都是各自獨立的。看看Delphi,不就通過Port陣列實現了對I/O埠的訪問了嗎?搞不清楚?什?C Builder就沒有提供類似的機制?下面這幾個函數是筆者從網上淘下來的,經過驗證,在Windows95環境下,的確可實現對I/O埠的讀寫。讀者可以借鑒使用。
voidoutportb(unsignedshortintport,unsignedcharvalue) { // mov edx, *(&port); __emit__(0x8b, 0x95, &port); // mov al, *(&value); __emit__(0x8a, 0x85, &value); // out dx, al; __emit__(0x66, 0xee); } void outportw(unsigned short int port, unsigned short int value) { // mov edx, *(&port); __emit__(0x8b, 0x95, &port); // mov ax, *(&value); __emit__(0x66, 0x8b, 0x85, &value); // out dx, ax; __emit__(0xef); } unsigned char inportb(unsigned short int port) { unsigned char value; // mov edx, *(&port); __emit__(0x8b, 0x95, &port); // in al, dx; __emit__(0x66, 0xec); // mov *(&value), al; __emit__(0x88, 0x85, &value); return value; } unsigned short int inportw(unsigned short int port) { unsigned short int value; // mov edx, *(&port); __emit__(0x8b, 0x95, &port); // in ax, dx __emit__(0xed); // mov *(&value), ax __emit__(0x66, 0x89, 0x85, &value); return value; }
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
c c++直接從RING3獲取硬碟序列號
通常情況下,我們通過0XEC命令對IDE埠進行監測.獲取硬碟資訊.
一般情況下,我們就寫個VXD或者DRIVER來完成.但是現在,通過MS的S.M.A.R.T.介面,我們可以直接從RING3調用API DeviceIoControl()來獲取硬碟資訊.下面乃是我的常式:
另外,也有編譯好的版本供大家平時使用.歡迎下載.
*注:在WIN98SE,WINDOWS ME中,S.M.A.R.T並不缺省安裝.請將SMARTVSD.VXD拷貝到%SYSTEM%\IOSUBSYS目錄下.
在WINDOWS2000下,由於非ADMINISTRATORS組的用戶對硬碟連GENERIC_READ的許可權也沒有,所以請以ADMINISTRATOR登錄後使用.
/*+++
HDID.CPP
Written by Lu Lin
http://lu0.126.com
2000.11.3
---*/
#include
#include
#include #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; /*+++
Global vars
---*/
GETVERSIONOUTPARAMS vers;
SENDCMDINPARAMS in;
SENDCMDOUTPARAMS out;
HANDLE h;
DWORD i;
BYTE j; void CopyRight(){
cerr
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |