⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dmi_sn.bak

📁  通过smbios 50h,51h,52h等功能调用
💻 BAK
📖 第 1 页 / 共 2 页
字号:
/*----------------------------------------------------------------------------
	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 + -