2012-03-23 6 views
1

Win32 사용자 모드 응용 프로그램 (임의의 diff 파일을 만드는 경우)에서 WinXP Embedded 32 비트 시스템 용 BIOS의 일련 번호를 얻으려고합니다.WMI없이 BIOS 일련 번호를 얻는 중

"SerialNumber"멤버의 'Win32_BIOS'클래스에서 WMI를 통해 얻을 수있는 것과 동일한 일련 번호를 얻으려고합니다. 문제는 WMI가 설치되어 있지 않은 구형 시스템에서 실행해야하므로 WMI를 사용할 수 없다는 것입니다.

기본적으로이 BIOS 필드에 인코딩 된 데이터가있는 일련의 컴퓨터가 있으므로 사용자가 변경할 수 없으며이 정보를 파일로 출력하여 우리에게 보내야하는 경우가 있습니다.

'GetSystemFirmwareTable'이 발견되었지만 최소 Win 버전은 WinXP 64 비트입니다. WMI는 문제가되지 않으며 직접 매핑 된 실제 주소에서 코드를 읽을 수있는 코드가 이미 있지만 문제는 우리가 실제 주소를 매핑 할 수있는 소프트웨어가 우리 소프트웨어에 묶여 있고 소프트웨어가 실행될 수 없다는 것입니다 이 특정 사용 사례 (라이선스)의이 단계에서

사용자 모드 응용 프로그램의 물리적 하드웨어 주소를 매핑하는 유일한 방법은 드라이버 영역을 파헤 치고 일부 드라이버 라이브러리를 응용 프로그램에 통합하여 실제 주소를 매핑 할 수있게하는 것입니다.

OS가 엄청난 양의 구성없이 액세스 할 수있는 섀도 복사본이 있습니까?

답변

1

Windows XP의 NTVDM은 실제 메모리의 첫 번째 MiB를 매핑하므로 첫 번째 메가 바이트에 SMBIOS BLOB를 찾고 거기에서 BIOS 일련 번호를 가져올 수 있어야합니다. 자세한 내용은 PDF specification을 참조하십시오.

+0

나는 이해할 수 없다. 사양에 따라 하드웨어 주소 0x000f0000에 액세스해야합니다. 즉, 사용자 모드 응용 프로그램에서 가상 주소에 매핑 할 수 있어야합니다. 이는 현재까지는 알 수없는 수준입니다. 내가 위에서 말한 것 때문에. ntvdm이 현재 Windows 버전에서 16 비트 DOS 응용 프로그램을 실행하는 프로세스입니까? 아니요. SMBIOS 데이터의 복사본을 읽을 수 있도록 16 비트 DOS 응용 프로그램을 작성해야한다고 제안합니까? – NaimK

+0

예, 그게 제가 생각하고 있었던 것입니다. MS-DOS COM 파일을 삭제하고 Windows 응용 프로그램에서 실행 한 다음 사용자 모드 응용 프로그램에서 수집 할 수있는 INT 0x21를 사용하여 SMBIOS 데이터를 파일에 씁니다. –

+1

흠, 좋은 생각인데 실제로 sysinternals.com에서 앱의 샘플 코드를 찾아 실제 메모리를 매핑했습니다. http://nah6.com/~itsme/cvs-xdadevtools/itsutils/src/sysint-physmem. cpp 나는 이것을 원했던대로 정확하게 적용 할 수 있었다. 그러나 그것은 XP에서만 작동합니다. 왜냐하면 더 나은 점은 WMI를 사용하게 될 것이기 때문입니다. 왜냐하면 OS가 더 쉽고 간단하기 때문입니다. – NaimK

관련 문제