📄 dmi_sn.bak
字号:
/*----------------------------------------------------------------------------
Rev Date Name Description
------------------------------------------------------------------------------
v1.00 08/26/97 Kevin Initial version
------------------------------------------------------------------------------*/
#include <extern.h>
#include <define.h>
#define DMI_SN_file "DMI_SN.DOC"
#define Get_DMI_Information_Func 0x50
#define Get_DMI_Struct_Func 0x51
#define Set_DMI_Struct_Func 0x52
int far *DMI_Entry_Point;
unsigned short BiosSelector;
unsigned char DMIBIOSRev;
unsigned short NumStructures=0;
unsigned short StructureSize;
unsigned long DMIStorageBase;
unsigned long DMIStorageSize;
struct Type_Structure_Header *DMIStrucBuffer;
struct DMI_set_struct *Set_DMIStrucBuffer;
unsigned char *DMIWorkBuffer;
int Structure_No,stack_temp_byte;
/*------------------- DMI subroutine ------------------start*/
int Get_DMI_Information()
{
asm push BiosSelector;
stack_temp_byte = FP_SEG (&DMIStorageSize);
asm push stack_temp_byte;
stack_temp_byte = FP_OFF (&DMIStorageSize);
asm push stack_temp_byte;
stack_temp_byte = FP_SEG (&DMIStorageBase);
asm push stack_temp_byte;
stack_temp_byte = FP_OFF (&DMIStorageBase);
asm push stack_temp_byte;
stack_temp_byte = FP_SEG (&StructureSize);
asm push stack_temp_byte;
stack_temp_byte = FP_OFF (&StructureSize);
asm push stack_temp_byte;
stack_temp_byte = FP_SEG (&NumStructures);
asm push stack_temp_byte;
stack_temp_byte = FP_OFF (&NumStructures);
asm push stack_temp_byte;
stack_temp_byte = FP_SEG (&DMIBIOSRev);
asm push stack_temp_byte;
stack_temp_byte = FP_OFF (&DMIBIOSRev);
asm push stack_temp_byte;
asm push Get_DMI_Information_Func;
asm call dword ptr DMI_Entry_Point;
asm add sp,24
asm mov stack_temp_byte,ax
return (stack_temp_byte);
}
int Get_DMI_Struct()
{
asm push BiosSelector;
asm push BiosSelector; /* DMI_Selector */
stack_temp_byte = FP_SEG (DMIStrucBuffer);
asm push stack_temp_byte;
stack_temp_byte = FP_OFF (DMIStrucBuffer);
asm push stack_temp_byte;
stack_temp_byte = FP_SEG (&Structure_No);
asm push stack_temp_byte;
stack_temp_byte = FP_OFF (&Structure_No);
asm push stack_temp_byte;
asm push Get_DMI_Struct_Func;
asm call dword ptr DMI_Entry_Point;
asm add sp,14
asm mov stack_temp_byte,ax
return (stack_temp_byte);
}
int Set_DMI_Struct()
{
int Control=1;;
asm push BiosSelector;
asm push BiosSelector; /* DMI_Selector */
asm push Control;
stack_temp_byte = FP_SEG (DMIWorkBuffer);
asm push stack_temp_byte;
stack_temp_byte = FP_OFF (DMIWorkBuffer);
asm push stack_temp_byte;
stack_temp_byte = FP_SEG (Set_DMIStrucBuffer);
asm push stack_temp_byte;
stack_temp_byte = FP_OFF (Set_DMIStrucBuffer);
asm push stack_temp_byte;
asm push Set_DMI_Struct_Func;
asm call dword ptr DMI_Entry_Point;
asm add sp,16
asm mov stack_temp_byte,ax
return (stack_temp_byte);
}
/*------------------- DMI subroutine ------------------end*/
char Compare_PnP_Signature(unsigned char far *temp_addr)
{
char temp;
temp = 0;
if ((*temp_addr == '$') && (*(temp_addr+1) == 'P'))
if ((*(temp_addr+2) == 'n') && (*(temp_addr+3) == 'P'))
temp = 1;
return (temp);
}
/*-----------------------------------------------------*/
/*-----------------------------------------------------*/
/*-------------------------------------------------------------------*/
void Print_Help_Func(void)
{
printf ("Usage:DMI_SN [/C][/W][//leading_code][serial#start_code][serial#ending_code]\n");
printf (" [//addendum_code][/D|H|A][/P][/O][/S]\n");
printf (" /C : Clear serial unmber counter and serial#end_code\n");
printf (" /W : Write leading_code serial#start_code serial#ending_code\n");
printf (" [addendum_code][/Dec|Hex|All][/P][/O]\n");
printf (" /D : DMI serial#count in decimal number<0-9> {Default}\n");
printf (" /H : DMI serial#count in hex number<0-9,A-F>\n");
printf (" /A : DMI serial#count in number and alphabet<0-9,A-Z>\n");
printf (" /P : program will not show prompt and wait for user verify\n");
printf (" write process.\n");
printf (" /O : program will not show warring massage when serial number\n");
printf (" overflow or > [serial#ending_code]\n");
printf (" /S : Set DMI serial number to Type03[System Enclosure or Chassis]\n");
printf (" Default is set to Type02 [Base Board Information]\n");
printf (" /? : Display this help screen\n\n");
printf (" <<< Examples >>>\n");
printf (" DMI_SN /W //AWD430TX 01005400 01009700 //BS /H\n");
printf (" DMI_SN /W // 01005400 01009700 //BS /H\n");
printf (" DMI_SN /W // 01005400 01009700 // /H\n");
return;
}
/*-----------------------------------------------------*/
/****** MAIN ROUTINE *******/
void main (int argc, char *argv[])
{
unsigned char exit_flag=1;
unsigned char far *temp_addr;
unsigned char parm_leading[10],parm_start[40],parm_end[40],parm_adm[10],num_temp[3];
unsigned char parm_counter[40],parm_counter_next[40],file_check[6];
FILE *dmi_sn;
char *temp_offset,argv_buffer[64];
unsigned char Temp_str[20];
char Temps[64];
char *Temp_Str_Point;
struct Type1_Structure *Type1_DMIStrucBuffer;
struct Type3_Structure *Type3_DMIStrucBuffer; /*;;;;;*/
int i,over_flag=0,help_flag=0,prompt_flag=0,file_flag=0;
int Write_flag=0,Clear_flag=0,pcount=0,Now_Write=0,hex_flag=0,all_flag=0,dec_flag=0;
int counter,end_len,counter_len,cmp_flag=0;
int system_flag=0;
unsigned char argv_leading[64],argv_start[64],argv_end[64],argv_adm[64],argv_num[3];
strcpy((char *)argv_leading,"NULL");
strcpy((char *)argv_start,"NULL");
strcpy((char *)argv_end,"NULL");
strcpy((char *)argv_adm,"NULL");
strcpy((char *)argv_num,"/D");
printf ("DMI_SN v1.01\n");
printf ("Copyright (c) Award Software, Inc. 1998 All Rights Reserved.\n\n");
if(argc == 1) printf ("Usage : DMI_SN /? for help\n\n");
/* ------------- Check BIOS have support DMI ---------------------start*/
for (temp_addr=(unsigned char far *)0xf0000000l ; (unsigned)temp_addr<0xffffu ; (unsigned)temp_addr++)
if ((exit_flag = Compare_PnP_Signature(temp_addr)) != 0) break;
if (exit_flag == 0)
for (temp_addr=(unsigned char far *)0xe0000000l ; (unsigned)temp_addr<0xffffu ; (unsigned)temp_addr++)
if ((exit_flag = Compare_PnP_Signature(temp_addr)) != 0) break;
if (exit_flag)
{
DMI_Entry_Point = (int far *) ((long)*(temp_addr+13) + \
(long)*(temp_addr+14)*0x100l + \
(long)*(temp_addr+15)*0x10000l + \
(long)*(temp_addr+16)*0x1000000l);
BiosSelector = (unsigned)*(temp_addr+27)+(unsigned)*(temp_addr+28)*0x100u;
if (Get_DMI_Information() != 0) exit_flag = 0;
}
if (exit_flag == 0)
{
printf ("This BIOS not support DMI function...");
return;
}
/* ------------- Check BIOS have support DMI ---------------------end*/
DMIWorkBuffer = malloc (DMI_StructureSize_Max);
Set_DMIStrucBuffer = malloc (DMI_StructureSize_Max+sizeof(struct DMI_set_struct)-sizeof(struct Type_Structure_Header));
DMIStrucBuffer = (struct Type_Structure_Header *)((unsigned char *)Set_DMIStrucBuffer + \
sizeof(struct DMI_set_struct) - sizeof(struct Type_Structure_Header));
/*;;;;;*/
for (i=1;i<argc;i++)
{
if(!strcmpi(argv[i],"/S"))
system_flag = 1;
}
if(system_flag)
{
Type3_DMIStrucBuffer = (struct Type3_Structure *)DMIStrucBuffer;
Structure_No = 3;
Get_DMI_Struct();
Temp_Str_Point = (char *)Type3_DMIStrucBuffer + 4;
}
else
{
Type1_DMIStrucBuffer = (struct Type1_Structure *)DMIStrucBuffer;
Structure_No = 2;
Get_DMI_Struct();
Temp_Str_Point = (char *)Type1_DMIStrucBuffer + 4;
}
/*;;;;;*/
/*-------------- Find DMI_SN.DOC Exist --------------------------start*/
/*-------------------------------------------------------*/
if ((dmi_sn=fopen(DMI_SN_file, "r+t")) != NULL)
{
fscanf (dmi_sn,"%s",(char *)file_check);
fseek (dmi_sn,1,SEEK_CUR);
if (strcmpi((char *)file_check,"*DMI*") == 0)
{
fscanf (dmi_sn,"%s",(char *)parm_leading);
fseek (dmi_sn,1,SEEK_CUR);
fscanf (dmi_sn,"%s",(char *)parm_start);
fseek (dmi_sn,1,SEEK_CUR);
fscanf (dmi_sn,"%s",(char *)parm_end);
fseek (dmi_sn,1,SEEK_CUR);
fscanf (dmi_sn,"%s",(char *)parm_adm);
fseek (dmi_sn,1,SEEK_CUR);
fscanf (dmi_sn,"%s",(char *)parm_counter);
fseek (dmi_sn,1,SEEK_CUR);
fscanf (dmi_sn,"%s",(char *)num_temp);
file_flag=1;
}
else
{
dmi_sn=fopen(DMI_SN_file, "w+t");
file_flag=0;
}
}
else
{
dmi_sn=fopen(DMI_SN_file, "w+t");
file_flag=0;
}
/*----------------------------------------start*/
for (i=1;i<argc;i++)
{
strcpy((char *)Temps,argv[i]);
if (Temps[0] == '/')
{
switch (Temps[1])
{
case 'w' :
case 'W' :
Write_flag = 1;
break;
case 'c' :
case 'C' :
Clear_flag = 1;
break;
case 'p' :
case 'P' :
prompt_flag = 1;
break;
case 'o' :
case 'O' :
over_flag = 1;
break;
case '?' :
help_flag = 1;
break;
case 'h' :
case 'H' :
if (dec_flag == 1 || all_flag == 1)
{
printf("Counting select ERROR.\n");
return;
}
else
{
strcpy((char *)argv_num,"/H");
hex_flag = 1;
}
break;
case 'a' :
case 'A' :
if (dec_flag == 1 || hex_flag == 1)
{
printf("Counting select ERROR.\n");
return;
}
else
{
strcpy((char *)argv_num,"A");
all_flag = 1;
}
break;
case 'd' :
case 'D' :
if (all_flag == 1 || hex_flag == 1)
{
printf("Counting select ERROR.\n");
return;
}
else
dec_flag = 1;
break;
case '/' :
if (i != argc-1)
{
strcpy((char *)Temps,argv[i+1]);
if (Temps[0] != '/')
{
strcpy((char *)Temps,argv[i]);
if(!strcmpi((char *)Temps,"//"))
strcpy((char *)argv_leading,Temps);
else
strcpy((char *)argv_leading,Temps+2);
}
else
{
strcpy((char *)Temps,argv[i]);
if(!strcmpi((char *)Temps,"//"))
strcpy((char *)argv_adm,Temps);
else
strcpy((char *)argv_adm,Temps+2);
}
}
else
{
strcpy((char *)Temps,argv[i]);
if(!strcmpi((char *)Temps,"//"))
strcpy((char *)argv_adm,Temps);
else
strcpy((char *)argv_adm,Temps+2);
}
break;
}
}
else
{
if (pcount == 0)
{
strcpy((char *)argv_start,argv[i]);
pcount ++;
}
else if (pcount == 1)
{
strcpy((char *)argv_end,argv[i]);
pcount ++;
}
}
}
if(help_flag == 1)
{
Print_Help_Func();
return;
}
if (pcount == 1) Now_Write = 1;
if (pcount > 2)
{
printf ("ERROR!!\n");
return;
}
/*-----------------------------------------------*/
/*-----------------------------------------------*/
if (Clear_flag == 1)
{
if(system_flag)
temp_offset = (char *)Type3_DMIStrucBuffer + *((char *)Type3_DMIStrucBuffer + 1);
else
temp_offset = (char *)Type1_DMIStrucBuffer + *((char *)Type1_DMIStrucBuffer + 1);
for (i=0;i<3;i++)
{
strcpy ((char *)Temp_str,temp_offset);
temp_offset += (strlen((char *)Temp_str)+1);
}
if (strcmpi((char *)temp_offset,"NULL") == 0)
printf ("DMI serial number = %s\n\n","NULL");
else
printf ("DMI serial number = %s\n\n",temp_offset);
if (file_flag == 1)
{
strcpy ((char *)parm_counter,(char *)parm_start);
strcpy ((char *)parm_end,(char *)parm_start);
if (strcmpi((char *)parm_leading,"//") == 0)
{
if (strcmpi((char *)parm_adm,"//") == 0)
{
printf ("Next DMI serial number = %s\n\n",parm_counter);
printf ("Last DMI serial number = %s\n\n",parm_end);
}
else
{
printf ("Next DMI serial number = %s%s\n\n",parm_leading,parm_counter,parm_adm);
printf ("Last DMI serial number = %s%s\n\n",parm_leading,parm_end,parm_adm);
}
}
else
{
if (strcmpi((char *)parm_adm,"//") == 0)
{
printf ("Next DMI serial number = %s%s\n\n",parm_leading,parm_counter);
printf ("Last DMI serial number = %s%s\n\n",parm_leading,parm_end);
}
else
{
printf ("Next DMI serial number = %s%s%s\n\n",parm_leading,parm_counter,parm_adm);
printf ("Last DMI serial number = %s%s%s\n\n",parm_leading,parm_end,parm_adm);
}
}
}
else
{
printf ("Next DMI serial number = No steup number\n\n");
printf ("Last DMI serial number = No steup number\n\n");
}
}
/*-----------------------*/
else if (Write_flag == 1)
{
if (Now_Write == 0)
{
if (file_flag == 1)
{
if (strcmpi((char *)parm_leading,(char *)argv_leading) == 0)
if (strcmpi((char *)parm_start,(char *)argv_start) == 0)
if (strcmpi((char *)parm_end,(char *)argv_end) == 0)
if (strcmpi((char *)parm_adm,(char *)argv_adm) == 0)
if (strcmpi((char *)num_temp,(char *)argv_num) == 0)
cmp_flag=1;
if (cmp_flag == 0)
{
strcpy ((char *)parm_leading,(char *)argv_leading);
strupr ((char *)parm_leading);
strcpy ((char *)parm_start,(char *)argv_start);
strupr ((char *)parm_start);
strcpy ((char *)parm_end,(char *)argv_end);
strupr ((char *)parm_end);
strcpy ((char *)parm_adm,(char *)argv_adm);
strupr ((char *)parm_adm);
strcpy ((char *)parm_counter,(char *)parm_start);
strcpy ((char *)num_temp,(char *)argv_num);
}
/*------------------------*/
if(system_flag)
temp_offset = (char *)Type3_DMIStrucBuffer + *((char *)Type3_DMIStrucBuffer + 1);
else
temp_offset = (char *)Type1_DMIStrucBuffer + *((char *)Type1_DMIStrucBuffer + 1);
for (i=0;i<3;i++)
{
strcpy ((char *)Temp_str,(char *)temp_offset);
temp_offset += (strlen((char *)Temp_str)+1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -