#include <stdio.h> #include<string.h> #include<dos.h> #include<conio.h> unsigned char far *TblAddr_Ptr; /*pointer to SMBIOS Address*/ unsigned int TblLen; /*SMBIOS Table length*/ typedef struct { unsigned char type; unsigned char length; unsigned short handle; }Header; /*search two strings in one function*/ int Search_Strs(unsigned int seg_addr,unsigned int offset_addr,char *str1,char *str2) { unsigned char far *ptr; int i,j; ptr=MK_FP(seg_addr,offset_addr); for(i=0x10;ptr<=0xFFFF0;) { for(j=0;j<strlen(str1);j++) /*search the first string*/ if(*(ptr+j)!=*(str1+j))break; if(j>=strlen(str1)) { ptr+=0x10; for(j=0;j<strlen(str2);j++) /*search the next*/ if(*(ptr+j)!=*(str2+j))break; if(j>=strlen(str2)){TblAddr_Ptr=ptr+8;TblLen=*((unsigned int far *)(ptr+6));return 1;} } else { ptr+=0x10; } } return 0; } /*print the string in a structure specified by the number of it*/ void PrintSpecifiedStr(unsigned char far *HeadAddrOfTypeN,unsigned char length,unsigned char NumOfStr,char *HeaderOfStr) { unsigned char far *p=HeadAddrOfTypeN+length; int i=1,j=0; printf("%s",HeaderOfStr); if(!NumOfStr){printf("Unknow/n");return;} while(1) { while(*(p+(j++))); if(i==NumOfStr) { for(i=0;i<j;i++) printf("%c",*(p+i)); putchar('/n'); return; } else {i++;p+=j;j=0;} } } main() { char *str1="_SM_"; char *str2="_DMI_"; unsigned int seg,offset; unsigned char far *TableAddr; unsigned char type,LenOfStructure; int i=0,flag=0; if(Search_Strs(0xF000,0,str1,str2)) { /*get segment and offset address of SMBIOS Table*/ seg=*((unsigned int far *)(TblAddr_Ptr+2)); seg<<=12; offset=*((unsigned int far *)TblAddr_Ptr); TableAddr=MK_FP(seg,offset); while(i<TblLen) { type=((Header far *)TableAddr)->type; if(!type&&!flag) /*print Type 0*/ { LenOfStructure=((Header far *)TableAddr)->length; printf("/nType 0(BIOS Information:)/n"); printf("Type:%d/n",type); printf("Length:%d/n",LenOfStructure); printf("Handle:%.4x/n",((Header far *)TableAddr)->handle); PrintSpecifiedStr(TableAddr,LenOfStructure,*(TableAddr+4),"Vendor:"); PrintSpecifiedStr(TableAddr,LenOfStructure,*(TableAddr+5),"BIOS Version:"); printf("BIOS Starting Address Segment:%.4x/n",(*(unsigned int far *)(TableAddr+6))); PrintSpecifiedStr(TableAddr,LenOfStructure,*(TableAddr+8),"BIOS Release Date:"); printf("BIOS ROM Size:%dKB/n",(*(TableAddr+9)+1)*64); printf("BIOS Characteristics:%.8x%.8x/n",*((long far *)(TableAddr+0x0e)),*((long far *)(TableAddr+0x0a))); printf("BIOS Characterics Extension Bytes:%.4x/n",*((int far *)(TableAddr+0x12))); printf("System BIOS Major Release:%d/n",*(TableAddr+0x14)); printf("System BIOS Minor Release:%d/n",*(TableAddr+0x15)); printf("Embedded Controller Firmware Major Release:%d/n",*(TableAddr+0x16)); printf("Embedded Controller Firmware Minor Release:%d/n",*(TableAddr+0x17)); flag=1; printf("press any key to print Type 17.../n"); getch(); clrscr(); } else if(type==17) /*print Type 17*/ { LenOfStructure=((Header far *)TableAddr)->length; printf("Type 17(Memory Device:)/n"); printf("Type:%d/n",type); printf("Length:%d/n",LenOfStructure); printf("Handle:%.4x/n",((Header far *)TableAddr)->handle); printf("Physical Memory Array Handle:%.4x/n",*((int far *)(TableAddr+4))); printf("Memory Error Information Handle:%.4x/n",*((int far *)(TableAddr+6))); printf("Total Width:%d/n",*((int far *)(TableAddr+8))); printf("Data Width:%d/n",*((int far *)(TableAddr+10))); printf("size:%d%s/n",(*((int far *)(TableAddr+0x0c))& 0x7fff),(*((int far *)(TableAddr+0x0c))& 0x8000)?"KB":"MB"); printf("Form Factor:%d/n",*(TableAddr+0x0e)); printf("Device Set:%d/n",*(TableAddr+0x0f)); PrintSpecifiedStr(TableAddr,LenOfStructure,*(TableAddr+0x10),"Device Locator:"); PrintSpecifiedStr(TableAddr,LenOfStructure,*(TableAddr+0x11),"Bank Locator:"); printf("Meomroy Type:%d/n",*(TableAddr+0x12)); printf("Type Detail:%.4x/n",*((int far *)(TableAddr+0x13))); printf("Speed:%dMHz/n",*((int far *)(TableAddr+0x15))); PrintSpecifiedStr(TableAddr,LenOfStructure,*(TableAddr+0x17),"Manufacturer:"); PrintSpecifiedStr(TableAddr,LenOfStructure,*(TableAddr+0x18),"Serial Number:"); PrintSpecifiedStr(TableAddr,LenOfStructure,*(TableAddr+0x19),"Asset Tag:"); PrintSpecifiedStr(TableAddr,LenOfStructure,*(TableAddr+0x1a),"Part Number:"); printf("Attributes:%.2x/n",*(TableAddr+0x1b)); getch(); break; } /*skip the unformatted string*/ TableAddr+=((Header far *)TableAddr)->length; while(*((int far *)TableAddr)!=0) TableAddr++; TableAddr+=2; i++; } } }