線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2658
推到 Plurk!
推到 Facebook!

I/O 埠讀寫的實現

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-09-30 02:32:07 IP:61.70.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-10-01 11:02:31 IP:210.63.xxx.xxx 未訂閱
以上這個方法只能在Win9x系列下運作 WinNT系列, 只能透過Driver來作動作
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-10-04 14:02:36 IP:61.221.xxx.xxx 未訂閱
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>j)){ //We don't detect a ATAPI device. cout<<"Drive "<<(int)(j 1)<<" is a ATAPI device, we don't detect it"< 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)){ cout<<"DeviceIoControl failed:DFP_RECEIVE_DRIVE_DATA"< CloseHandle(h); return; } phdinfo=(PIDSECTOR)out.bBuffer; memcpy(s,phdinfo->sModelNumber,40); s[40]=0; ChangeByteOrder(s,40); cout< memcpy(s,phdinfo->sFirmwareRev,8); s[8]=0; ChangeByteOrder(s,8); cout<<"\tFirmware rev:"< memcpy(s,phdinfo->sSerialNumber,20); s[20]=0; ChangeByteOrder(s,20); cout<<"\tSerial Number:"< cout<<"\tCapacity:">j)){ //We don't detect a ATAPI device. cout<<"Drive "<<(int)(j 1)<<" is a ATAPI device, we don't detect it"< 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)){ cout<<"DeviceIoControl failed:DFP_RECEIVE_DRIVE_DATA"< CloseHandle(h); return; } phdinfo=(PIDSECTOR)out.bBuffer; memcpy(s,phdinfo->sModelNumber,40); s[40]=0; ChangeByteOrder(s,40); cout< memcpy(s,phdinfo->sFirmwareRev,8); s[8]=0; ChangeByteOrder(s,8); cout<<"\tFirmware rev:"< memcpy(s,phdinfo->sSerialNumber,20); s[20]=0; ChangeByteOrder(s,20); cout<<"\tSerial Number:"< cout<<"\tCapacity:"
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-04-27 0:28:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!