获取主板BIOS的信息

2016-02-19 15:13 121 1 收藏

只要你有一台电脑或者手机,都能关注图老师为大家精心推荐的获取主板BIOS的信息,手机电脑控们准备好了吗?一起看过来吧!

【 tulaoshi.com - 编程语言 】

  1、读取主板序列号

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  2、AWard Bios密码读取

  3、读取BIOS信息

  4、获取BIOS日期信息

  =========================================

  1、读取主板序列号

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)
uses SHA1, Base64;function GetHashedBiosInfo: string;var  SHA1Context: TSHA1Context;  SHA1Digest: TSHA1Digest;begin  // Get the BIOS data  SetString(Result, PChar(Ptr($F0000)), $10000);  // Hash the string  SHA1Init(SHA1Context);  SHA1Update(SHA1Context, PChar(Result), Length(Result));  SHA1Final(SHA1Context, SHA1Digest);  SetString(Result, PChar(@SHA1Digest), sizeof(SHA1Digest));  // Return the hash string encoded in printable characters  Result := B64Encode(Result);end;function GetBiosInfoAsText: string;var  p, q: pchar;begin  q := nil;  p := PChar(Ptr($FE000));  repeat   if q  nil then begin    if not (p^ in [#10, #13, #32..#126, #169, #184]) then begin     if (p^ = #0) and (p - q = 8) then begin      Result := Result + TrimRight(String(q)) + #13#10;     end;     q := nil;    end;   end else    if p^ in [#33..#126, #169, #184] then     q := p;   inc(p);  until p  PChar(Ptr($FFFFF));  Result := TrimRight(Result);end;procedure TForm1.FormCreate(Sender: TObject);begin  Memo1.Lines.Text := GetBiosInfoAsText;end;

  ==========================================

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  2、AWard Bios密码读取(应该是jingtao的文章,但是ID没有记录)

Unit AwardBiosPas;//Write by lovejingtao//http://www.138soft.cominterfaceuses windows,SysUtils;function My_GetBiosPassword:String;implementationfunction CalcPossiblePassword(PasswordValue: WORD): string;varI: BYTE;C: CHAR;S: string[8];beginI := 0;while PasswordValue  0 do  begin   Inc(I);   if $263  PasswordValue then    begin     if $80  PasswordValue then      S[I] := CHAR(PasswordValue)     else if $B0  PasswordValue then      S[I] := CHAR(PasswordValue and $77)     else if $11D  PasswordValue then      S[I] := CHAR($30 or (PasswordValue and $0F))     else if $114  PasswordValue then      begin       S[I] := CHAR($64 or (PasswordValue and $0F));       if '0'  S[I] then        S[I] := CHAR(BYTE(S[I]) + 8);      end     else if $1C2  PasswordValue then      S[I] := CHAR($70 or (PasswordValue and $03))     else if $1E4  PasswordValue then      S[I] := CHAR($30 or (PasswordValue and $03))     else      begin       S[I] := CHAR($70 or (PasswordValue and $0F));       if 'z'  S[I] then        S[I] := CHAR(BYTE(S[I]) - 8);      end;    end   else    S[I] := CHAR($30 or (PasswordValue and $3));   PasswordValue := (PasswordValue - BYTE(S[I])) shr 2;  end;S[0] := CHAR(I);PasswordValue := I shr 1;while PasswordValue  I do  begin {this is to do because award starts calculating with the last letter}   C := S[BYTE(S[0]) - I + 1];   S[BYTE(S[0]) - I + 1] := S[I];   S[I] := C;   Dec(I);  end;CalcPossiblePassword := S;end;function readcmos(off: byte): byte;varvalue: byte;beginasm   xor ax, ax   mov al, off   out 70h, al   in al, 71h   mov value, alend;readcmos := value;end;function My_GetBiosPassword:String;varsuperpw, userpw: word;S:String;beginif Win32Platform  VER_PLATFORM_WIN32_NT then //不是NTbeginpchar(@superpw)[0] := char(readcmos($1C));pchar(@superpw)[1] := char(readcmos($1D));pchar(@userpw)[0] := char(readcmos($64));pchar(@userpw)[1] := char(readcmos($65));S:='超级用户密码为:'+CalcPossiblePassword(superpw)+#13+'用户密码为:'+CalcPossiblePassword(userpw);Result:=S;endelseResult:='用户系统为NT,无法获取BISO密码!';end;end.

  ==========================================

  3、读取BIOS信息

  {程序使用Windows 95/2000平台,自动检测系统类型,然后进行不同调用}

uses BiosHelp;procedure TForm1.Button1Click(Sender: TObject);varDump: TRomBiosDump;i: Integer;beginReadRomBios(Dump, rrbmAutomatic);for i := 1 to $000FFFFF - $000F0000 - 1 do  Memo1.Lines.Add(IntToHex(Dump[i + $000FFFFF], 2));end;(********************************************************************************                                       ** BIOS Help - read ROM BIOS on Windows 95/98/SE/ME/NT/2K/XP          **                                       ** Copyright (C) 2001, Nico Bendlin (nico@bendlin.de)              **                                       ** Compiler: Delphi 4.03/5.01/6.00                       ** Version: 1.03, 2001-09-02                          **                                       ********************************************************************************){ postum scriptum: sorry for the bad english, i wrote it in a hurry }unit BiosHelp;{$ALIGN ON}{$MINENUMSIZE 4}interfaceusesWindows;typePRomBiosDump = ^TRomBiosDump;TRomBiosDump = array[$000F0000..$000FFFFF] of Byte;typeTReadRomBiosMethod = (  rrbmAutomatic,                     { Autodetect OS type and use proper method }  rrbmGeneric,                      { Use 16-bit COM program to dump the BIOS }  rrbmMemory,                       { Read from memory (Win9x)         }  rrbmPhysical                      { Read from physical memory object (WinNT) }  );function ReadRomBios(var Dump: TRomBiosDump; Method: TReadRomBiosMethod;Timeout: DWORD = INFINITE): Boolean;function GetRomBiosBuffer(const Dump: TRomBiosDump; Address: Pointer;var Buffer; BufferSize: Cardinal): Cardinal;function GetRomBiosString(const Dump: TRomBiosDump; Address: Pointer): string;function GetRomBiosLongLong(const Dump: TRomBiosDump; Address: Pointer): LONGLONG;function GetRomBiosDWord(const Dump: TRomBiosDump; Address: Pointer): DWORD;function GetRomBiosWord(const Dump: TRomBiosDump; Address: Pointer): Word;function GetRomBiosByte(const Dump: TRomBiosDump; Address: Pointer): Byte;implementation{################################################################################                                       ##               GENERIC METHOD                  ##                                       ## Create an temporary folder, save an 16bit COM program (RomDump.com) into it, ## execute program redirected to an file (Rom.dmp, RomDump.com simply dumps the ## memory range F000:0000-F000:FFFF to STDOUT), read dump file into the buffer, ## and finally cleanup all temporary files and directories.           ##                                       ## (the function RomDumpCode is x86 specific, which i wrote to generate 16-bit ## code with the help of the 23-bit Delphi compiler, never try to execute the ## pseudo-code in your program! it will not work in 32-bit protected mode)   ##                                       ################################################################################}{ *INTERNAL* - Pseudo 16-bit code }typePRomDumpCodeInfo = ^TRomDumpCodeInfo;TRomDumpCodeInfo = (rdciStart, rdciEnd, rdciSize);function _RomDumpCode(Info: TRomDumpCodeInfo): Pointer;varCodeStart: Pointer;CodeEnd: Pointer;beginasm     JMP   @@End     { *BEGIN* 16-bit code }     { -- never use it in your program! -- }     { COM which writes ROM-BIOS to StdOut }@@Start:     { Dump F000:0000-F000:FFFE }     XOR   eDX, eDX // DS = 0xF000  ; Data segment     MOV   DH, 0F0h     MOV   DS, eDX     XOR   eDX, eDX // DX = 0x0000  ; Data offset     XOR   eCX, eCX // CX = 0xFFFF  ; Data length     DEC   eCX     XOR   eBX, eBX // BX = 0x0001  ; STDOUT (file handle)     INC   eBX     MOV   AH, 40h  // DosCall(0x40) ; INT21, DOS_WRITE_TO_HANDLE     INT   21h     JC   @@Exit  // On error exit ; AL = Error code     { Dump F000:FFFF }     XOR   eDX, eDX // DS = 0xF000  ; Data segment     MOV   DH, 0F0h     MOV   DS, eDX     XOR   eDX, eDX // DX = 0xFFFF  ; Data offset     DEC   eDX     XOR   eCX, eCX // CX = 0x0001  ; Data length     INC   eCX     MOV   eBX, eCX // BX = 0x0001  ; STDOUT (file handle)     MOV   AH, 40h  // DosCall(0x40) ; INT21, DOS_WRITE_TO_HANDLE     INT   21h     JC   @@Exit  // On error exit ; AL = Error code     MOV   AL, 0   // no error   ; AL = 0@@Exit:     MOV   AH, 4Ch  // DosCall(0x4C) ; INT21, DOS_TERMINATE_EXE     INT   21h@@End:     { *END* 16-bit code }     MOV   CodeStart, OFFSET @@Start     MOV   CodeEnd, OFFSET @@Endend;case Info of  rdciStart:   Result := CodeStart;  rdciEnd:   Result := CodeEnd;  rdciSize:   Result := Pointer(Cardinal(CodeEnd) - Cardinal(CodeStart));else  Result := nil;end;end;{ *INTERNAL* - Save 16-bit code to file }function _RomDumpCodeToFile(const Filename: string): Boolean;varComFile: THandle;Size: Cardinal;beginResult := False;ComFile := CreateFile(PChar(Filename), GENERIC_WRITE, FILE_SHARE_READ, nil,  CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);if ComFile  INVALID_HANDLE_VALUE thentry  Result := WriteFile(ComFile, _RomDumpCode(rdciStart)^,   Cardinal(_RomDumpCode(rdciSize)), Size, nil) and   (Size = Cardinal(_RomDumpCode(rdciSize)));  if not Result then   DeleteFile(PChar(Filename));finally  CloseHandle(ComFile);end;end;{ *INTERNAL* - Execute 16-bit code redirected to file }function _RomDumpCodeExecute(const Com, Dmp: string; Timeout: DWORD): Boolean;varComSpec: string;si: TStartupInfo;pi: TProcessInformation;beginResult := False;SetLength(ComSpec, MAX_PATH);SetLength(ComSpec,  GetEnvironmentVariable('ComSpec', PChar(@ComSpec[1]), MAX_PATH));if Length(ComSpec)  0 thenbegin  FillChar(si, SizeOf(TStartupInfo), 0);  si.cb := SizeOf(TStartupInfo);  si.dwFlags := STARTF_USESHOWWINDOW;  si.wShowWindow := SW_HIDE;  if CreateProcess(nil, PChar(ComSpec + ' /C ' + Com + '  ' + Dmp),   nil, nil, False, CREATE_NEW_CONSOLE or CREATE_NEW_PROCESS_GROUP, nil,   nil, si, pi) then  try   Result := WaitForSingleObject(pi.hProcess, Timeout)  WAIT_TIMEOUT;  finally   CloseHandle(pi.hProcess);   CloseHandle(pi.hThread);  end;end;end;function DirectoryExists(const Dir: string): Boolean;varAttr: DWORD;beginAttr := GetFileAttributes(PChar(Dir));Result := (Attr  $FFFFFFFF) and  (Attr and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY);end;{ Get BIOS dump the generic way }function ReadRomBios16(var Buffer: TRomBiosDump; Timeout: DWORD): Boolean;constTempSub = '~RomDmp';ComName = 'RomDump.com';DmpName = 'Rom.dmp';varTempPath: string;TempDir: string;TempIdx: Integer;TempIdxStr: string;ComFile: string;DmpFile: string;DmpHandle: THandle;Written: DWORD;beginResult := False;SetLength(TempPath, MAX_PATH);SetLength(TempPath, GetTempPath(MAX_PATH, PChar(@TempPath[1])));if Length(TempPath)  0 thenbegin  if (TempPath[Length(TempPath)]  '') then   TempPath := TempPath + '';  TempIdx := 0;  repeat   Inc(TempIdx);   Str(TempIdx, TempIdxStr);   TempDir := TempPath + TempSub + TempIdxStr;  until not DirectoryExists(TempDir);  if CreateDirectory(PChar(TempDir), nil) then  try   TempDir := TempDir + '';   ComFile := TempDir + ComName;   DmpFile := TempDir + DmpName;   if _RomDumpCodeToFile(ComFile) then   try    if _RomDumpCodeExecute(ComFile, DmpFile, Timeout) then    begin     DmpHandle := CreateFile(PChar(DmpFile), GENERIC_READ,      FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);     if DmpHandle  INVALID_HANDLE_VALUE then     try      FillChar(Buffer, SizeOf(TRomBiosDump), 0);      Result := ReadFile(DmpHandle, Buffer, SizeOf(TRomBiosDump),       Written, nil) and (Written = SizeOf(TRomBiosDump));     finally      CloseHandle(DmpHandle);     end;    end;   finally    DeleteFile(PChar(DmpFile));    DeleteFile(PChar(ComFile));   end;  finally   RemoveDirectory(PChar(TempDir));  end;end;end;{################################################################################                                       ##              DIRECT METHOD (Win9x)               ##                                       ## Due to the fact that Windows 95/98/ME maps the BIOS into every Win32 process ## for read access it is very simple to fill the buffer from memory.      ##                                       ################################################################################}function ReadRomBios9x(var Buffer: TRomBiosDump): Boolean;beginResult := False;try  FillChar(Buffer, SizeOf(TRomBiosDump), 0);  Move(Pointer(Low(TRomBiosDump))^, Buffer, SizeOf(TRomBiosDump));  Result := True;except  // ignore exceptionsendend;{################################################################################                                       ##            PHYSICAL MEMORY METHOD (WinNT)             ##                                       ## On Windows NT the ROM BIOS is only available through the named kernel object ## 'DevicePhysicalMemory'. Because it is impossible to open kernel objects in ## user mode with standard Win32 API functions we make use of NT's nativeAPI in ## NtDll.dll ("NT-Layer") namely ZwOpenSection.                 ##                                       ## (note: mostly there are two versions of every function ZwXxx and NtXxx. The ## only difference in kernel mode is that the NtXxx version works in conside- ## ration to security while ZwXxx not. But in user mode both work like NtXxx.) ##                                       ## At first the section is opened with ZwOpenSection. Normally we would proceed ## ZwMapViewOfSection, ZwUnmapViewOfSection, and NtClose. But the functions are ## more complex and there is no needing for it. With the handle (because we are ## in the "very simple" user mode =) we now use MapViewOfFile, UnmapViewOfFile, ## and CloseHandle to map an memory window (the ROM BIOS) into our process.   ##                                       ## Due to the fact that ZwOpenSection returns NT error-codes in case of failure ## we have to translate it to an Win32 error-code (RtlNtStatusToDosError).   ## All NT specific functions are dynamically loaded -- because the applications ## should start on Win9x systems =)                       ##                                       ################################################################################}{ For more information see Windows 2000/XP DDK }{ It works on Windows NT 4.0 too, use NtDll.dll }typeNTSTATUS = Integer;constSTATUS_SUCCESS = NTSTATUS(0);STATUS_INVALID_HANDLE = NTSTATUS($C0000008);STATUS_ACCESS_DENIED = NTSTATUS($C0000022);typePUnicodeString = ^TUnicodeString;TUnicodeString = packed record  Length: Word;  MaximumLength: Word;  Buffer: PWideChar;end;constOBJ_INHERIT = $00000002;OBJ_PERMANENT = $00000010;OBJ_EXCLUSIVE = $00000020;OBJ_CASE_INSENSITIVE = $00000040;OBJ_OPENIF = $00000080;OBJ_OPENLINK = $00000100;OBJ_KERNEL_HANDLE = $00000200;OBJ_VALID_ATTRIBUTES = $000003F2;typePObjectAttributes = ^TObjectAttributes;TObjectAttributes = record  Length: ULONG;  RootDirectory: THandle;  ObjectName: PUnicodeString;  Attributes: ULONG;  SecurityDescriptor: PSecurityDescriptor;  SecurityQualityOfService: PSecurityQualityOfService;end;constObjectPhysicalMemoryDeviceName = 'DevicePhysicalMemory';ObjectPhysicalMemoryName: TUnicodeString = (  Length: Length(ObjectPhysicalMemoryDeviceName) * 2;  MaximumLength: Length(ObjectPhysicalMemoryDeviceName) * 2 + 2;  Buffer: ObjectPhysicalMemoryDeviceName;  );ObjectPhysicalMemoryAccessMask: ACCESS_MASK = SECTION_MAP_READ;ObjectPhysicalMemoryAttributes: TObjectAttributes = (  Length: SizeOf(TObjectAttributes);  RootDirectory: 0;  ObjectName: @ObjectPhysicalMemoryName;  Attributes: OBJ_CASE_INSENSITIVE;  SecurityDescriptor: nil;  SecurityQualityOfService: nil;  );typeTFNZwOpenSection = function(out SectionHandle: THandle;  DesiredAccess: ACCESS_MASK; ObjectAttributes: PObjectAttributes): NTSTATUS;stdcall;TFNRtlNtStatusToDosError = function(Status: NTSTATUS): DWORD; stdcall;constntdll = 'ntdll.dll';varZwOpenSection: TFNZwOpenSection;RtlNtStatusToDosError: TFNRtlNtStatusToDosError;function ReadRomBiosNt(var Buffer: TRomBiosDump; Timeout: DWORD): Boolean;varNtLayer: HMODULE;Status: NTSTATUS;Section: THandle;View: Pointer;beginResult := False;NtLayer := GetModuleHandle(ntdll);if NtLayer = 0 then  SetLastError(ERROR_CALL_NOT_IMPLEMENTED)elsebegin  if not Assigned(ZwOpenSection) then   ZwOpenSection := GetProcAddress(NtLayer, 'ZwOpenSection');  if not Assigned(RtlNtStatusToDosError) then   RtlNtStatusToDosError := GetProcAddress(NtLayer, 'RtlNtStatusToDosError');  if not (Assigned(ZwOpenSection) and Assigned(RtlNtStatusToDosError)) then   SetLastError(ERROR_CALL_NOT_IMPLEMENTED)  else  begin   Status := ZwOpenSection(Section, ObjectPhysicalMemoryAccessMask,    @ObjectPhysicalMemoryAttributes);   case Status of    STATUS_SUCCESS:     try      View := MapViewOfFile(Section, ObjectPhysicalMemoryAccessMask, 0,       Low(TRomBiosDump), SizeOf(TRomBiosDump));      if Assigned(View) then      try       FillChar(Buffer, SizeOf(TRomBiosDump), 0);       Move(View^, Buffer, SizeOf(TRomBiosDump));       Result := True;      finally       UnmapViewOfFile(View);      end;     finally      CloseHandle(Section);     end;    STATUS_ACCESS_DENIED:     Result := ReadRomBios16(Buffer, Timeout);   else    SetLastError(RtlNtStatusToDosError(Status))   end;  end;end;end;{################################################################################                                       ##                ReadRomBios                  ##                                       ################################################################################}function ReadRomBios(var Dump: TRomBiosDump; Method: TReadRomBiosMethod;Timeout: DWORD = INFINITE): Boolean;beginResult := False;case Method of  rrbmAutomatic:   if (Integer(GetVersion)  0) then   try    Result := ReadRomBios9x(Dump);   except    Result := ReadRomBios16(Dump, Timeout);   end   else    Result := ReadRomBiosNt(Dump, Timeout);  rrbmGeneric:   Result := ReadRomBios16(Dump, Timeout);  rrbmMemory:   Result := ReadRomBios9x(Dump);  rrbmPhysical:   Result := ReadRomBiosNt(Dump, Timeout);else  SetLastError(ERROR_INVALID_PARAMETER);end;end;{################################################################################                                       ##   Utilities to simplify the access to data as generic standard types    ##                                       ################################################################################}function GetRomBiosBuffer(const Dump: TRomBiosDump; Address: Pointer;var Buffer; BufferSize: Cardinal): Cardinal;beginResult := 0;if (Cardinal(Address) = Low(TRomBiosDump)) and  (Cardinal(Address) = High(TRomBiosDump)) thenbegin  Result := BufferSize;  if (Cardinal(Address) + BufferSize  High(TRomBiosDump)) then   Result := High(TRomBiosDump) - Cardinal(Address) + 1;  Move(Dump[Cardinal(Address)], Buffer, Result);end;end;function GetRomBiosString(const Dump: TRomBiosDump; Address: Pointer): string;beginResult := '';if (Cardinal(Address) = Low(TRomBiosDump)) and  (Cardinal(Address) = High(TRomBiosDump)) then  Result := string(PChar(@Dump[Cardinal(Address)]));end;function GetRomBiosLongLong(const Dump: TRomBiosDump; Address: Pointer): LONGLONG;typePLongLong = ^LONGLONG;beginResult := 0;if (Cardinal(Address) = Low(TRomBiosDump)) and  (Cardinal(Address) = High(TRomBiosDump) - SizeOf(LONGLONG) + 1) then  Result := PLongLong(@Dump[Cardinal(Address)])^;end;function GetRomBiosDWord(const Dump: TRomBiosDump; Address: Pointer): DWORD;beginResult := 0;if (Cardinal(Address) = Low(TRomBiosDump)) and  (Cardinal(Address) = High(TRomBiosDump) - SizeOf(DWORD) + 1) then  Result := PDWORD(@Dump[Cardinal(Address)])^;end;function GetRomBiosWord(const Dump: TRomBiosDump; Address: Pointer): Word;beginResult := 0;if (Cardinal(Address) = Low(TRomBiosDump)) and  (Cardinal(Address) = High(TRomBiosDump) - SizeOf(Word) + 1) then  Result := PWord(@Dump[Cardinal(Address)])^;end;function GetRomBiosByte(const Dump: TRomBiosDump; Address: Pointer): Byte;beginResult := 0;if (Cardinal(Address) = Low(TRomBiosDump)) and  (Cardinal(Address) = High(TRomBiosDump) - SizeOf(Byte) + 1) then  Result := PByte(@Dump[Cardinal(Address)])^;end;end.

  ==========================================

  4、获取BIOS日期信息

{--------------------------------------------------------------------------}{获取BIOS的日期信息,估计可能在2000下适用,但是可能需要获取权限}function GetBiosDate1: String;varBuffer: Array[0..8] Of Char;N: DWORD;beginReadProcessMemory(GetCurrentProcess,  Ptr($FFFF5),  @Buffer,  8,  N);Buffer[8] := #0;result := StrPas(Buffer)end;function GetBiosDate2: String;beginresult := string(pchar(ptr($FFFF5)));end;

来源:http://www.tulaoshi.com/n/20160219/1609188.html

延伸阅读
System.Diagnostics.StackTrace可以看到很多运行时当前堆栈中有用的信息,权威参考 http://msdn.microsoft.com/zh-cn/library/system.diagnostics.stacktrace.aspx 开始我是为了得到webservice中当前执行的方法的名称而找到的这个东西。 下面代码演示了,一个类中方法的之间的调用次序 using System; using System.Collection...
Delphi以其优良的可视化编程,灵活的Windows API接口,丰富的底层操作越来越受到编程爱好者的青睐。 在Delphi中,通过调用Windows API,可以很方便地获取系统信息,这有助于我们编写出更好的Windows应用程序。以下程序在Delphi3.0 For Windows 9x下编译通过。 一、 用GetDriveType函数获取磁盘信息 Lbl_DriveType:Tlabel; ...
标签: Web开发
如果我们需要通过触发事件得到数据行的信息,可以用脚本了来实现,下面是单击数据行得到行信息的代码: function db(index) {     var str = new String("");     var curTRObj = this.Rows[index].Control;     //var column=this.column.lengh;     for ...
//错误处理,显示原因 void __fastcall TSerialPort::ProcessErrorMessage(char* ErrorText) { char ErrorMsg[400]; LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER //自动分配消息缓冲区 FORMAT_MESSAGE_FROM_SYSTEM, //从系统获取信息 NULL,GetLastError(), //获取错误信息标识 MAKELAN...
标签: 电脑入门
怎么查看U盘的具体芯片类型呢?下面教你几种办法: 一、可以使用工具软件Chipgenius来查看你的U盘型号信息,比如显示:芯片制造商Phison(群联)芯片型号;UP12,就知道用Phison量产工具来量产了,就找Phison UP12的量产工具。但使用时可能用这个软件无法得到那两个信息,那么就要先用checkudisk查看U盘ID,类似于 Vid_13fe&Pid_1d00,再到网...

经验教程

967

收藏

92
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部