Read physical memory information from registry
2008-04-14 09:22
483 查看
/////////////////////////////////////////////////////////////////////////
//
// Module:
// Read physical memory information from registry
// HKLM/HARDWARE/RESOURCEMAP/System Resources/Physical Memory
//
// Author:
// CDrea (CDrea_at_SafeChina[dot]ORG
//
// Version:
// 2007-12-24 v0.1
//
/////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
struct _mi {
LARGE_INTEGER Address;
DWORD Length;
DWORD Reserved;
};
#define MI_LEN sizeof(struct _mi)
typedef struct _phy_mem_info {
DWORD BusCount;
DWORD MemoryRangeCount;
struct _mi* MemInfoPtr;
}PHY_MEM_INFO;
BOOL
GetPhyMemoryInfo(
OUT PHY_MEM_INFO* PhyMemInfo
);
void logo();
int main()
{
PHY_MEM_INFO PhyMemInfo = {0};
LARGE_INTEGER TotalSize = {0};
logo();
if(!GetPhyMemoryInfo(&PhyMemInfo)) return -1;
for(DWORD i = 0; i < PhyMemInfo.MemoryRangeCount; i++)
{
TotalSize.QuadPart += (PhyMemInfo.MemInfoPtr + i)->Length;
}
printf("Total memory: %d MB/n", TotalSize.QuadPart / 1024 / 1024);
printf("Bus count: %d/n", PhyMemInfo.BusCount);
printf("Memory ranges:/n");
for(DWORD i = 0; i < PhyMemInfo.MemoryRangeCount; i++)
{
printf(" 0x%-016I64X Length: 0x%X (%dK)/n",
(PhyMemInfo.MemInfoPtr + i)->Address.QuadPart,
(PhyMemInfo.MemInfoPtr + i)->Length,
(PhyMemInfo.MemInfoPtr + i)->Length / 1024);
}
if(PhyMemInfo.MemInfoPtr != NULL)
free(PhyMemInfo.MemInfoPtr);
return 0;
}
BOOL
GetPhyMemoryInfo(
OUT PHY_MEM_INFO* PhyMemInfo
)
{
HKEY hKey;
int nRet = 0;
nRet = RegOpenKey(HKEY_LOCAL_MACHINE, "Hardware//ResourceMap//System Resources//Physical Memory", &hKey);
if(nRet != ERROR_SUCCESS)
{
fprintf(stderr, "RegOpenKey() failed. --err: %d/n", GetLastError());
return FALSE;
}
DWORD Type = 0;
DWORD cbData = 0;
LPBYTE lpData = NULL;
LPBYTE pmrc = NULL;
RegQueryValueEx(hKey, ".Translated", 0, &Type, NULL, &cbData);
lpData = (LPBYTE)malloc(cbData);
RegQueryValueEx(hKey, ".Translated", 0, &Type, lpData, &cbData);
if(nRet != ERROR_SUCCESS)
{
fprintf(stderr, "RegQueryValueEx() failed. --err: %d/n", GetLastError());
return FALSE;
}
DWORD BusCount = *(DWORD*)lpData;
if(BusCount <= 0)
{
fprintf(stderr, "Cannot get valid memory information./n");
return FALSE;
}
LPBYTE p = lpData + 0x10;
DWORD MemoryRangesCount = 0;
for(DWORD i = 1; i <= BusCount; i++)
{
MemoryRangesCount += *(DWORD*)p;
p = p + 0x8 + i * (*(DWORD*)p) * 0x10;
}
p = lpData + 0x10;
PhyMemInfo->MemInfoPtr = (struct _mi*)malloc(MI_LEN * MemoryRangesCount);
if(PhyMemInfo->MemInfoPtr == NULL)
{
fprintf(stderr, "Not enough memory./n");
return FALSE;
}
LPBYTE pmi = NULL;
struct _mi* ptr = PhyMemInfo->MemInfoPtr;
for(DWORD i = 1; i <= BusCount; i++)
{
pmi = p + 0x8;
for(DWORD j = 0; j < *(DWORD*)p; j++)
{
ptr->Address.LowPart = *(DWORD*)pmi;
ptr->Address.HighPart = *(long*)(pmi + 0x4);
ptr->Length = *(DWORD*)(pmi + 0x8);
ptr++;
pmi += MI_LEN;
}
p = p + 0x8 + i * (*(DWORD*)p) * 0x10;
}
PhyMemInfo->BusCount = BusCount;
PhyMemInfo->MemoryRangeCount = MemoryRangesCount;
RegCloseKey(hKey);
free(lpData);
return TRUE;
}
void logo()
{
printf("+------------------------------------+/n");
printf("| Physical Memory Information v0.1 |/n");
printf("| Write by CDrea |/n");
printf("| CDrea_at_SafeChina[dot]ORG |/n");
printf("| 2007-12-24 |/n");
printf("| http://www.safechina.org |/n");
printf("+------------------------------------+/n/n");
}
//
// Module:
// Read physical memory information from registry
// HKLM/HARDWARE/RESOURCEMAP/System Resources/Physical Memory
//
// Author:
// CDrea (CDrea_at_SafeChina[dot]ORG
//
// Version:
// 2007-12-24 v0.1
//
/////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
struct _mi {
LARGE_INTEGER Address;
DWORD Length;
DWORD Reserved;
};
#define MI_LEN sizeof(struct _mi)
typedef struct _phy_mem_info {
DWORD BusCount;
DWORD MemoryRangeCount;
struct _mi* MemInfoPtr;
}PHY_MEM_INFO;
BOOL
GetPhyMemoryInfo(
OUT PHY_MEM_INFO* PhyMemInfo
);
void logo();
int main()
{
PHY_MEM_INFO PhyMemInfo = {0};
LARGE_INTEGER TotalSize = {0};
logo();
if(!GetPhyMemoryInfo(&PhyMemInfo)) return -1;
for(DWORD i = 0; i < PhyMemInfo.MemoryRangeCount; i++)
{
TotalSize.QuadPart += (PhyMemInfo.MemInfoPtr + i)->Length;
}
printf("Total memory: %d MB/n", TotalSize.QuadPart / 1024 / 1024);
printf("Bus count: %d/n", PhyMemInfo.BusCount);
printf("Memory ranges:/n");
for(DWORD i = 0; i < PhyMemInfo.MemoryRangeCount; i++)
{
printf(" 0x%-016I64X Length: 0x%X (%dK)/n",
(PhyMemInfo.MemInfoPtr + i)->Address.QuadPart,
(PhyMemInfo.MemInfoPtr + i)->Length,
(PhyMemInfo.MemInfoPtr + i)->Length / 1024);
}
if(PhyMemInfo.MemInfoPtr != NULL)
free(PhyMemInfo.MemInfoPtr);
return 0;
}
BOOL
GetPhyMemoryInfo(
OUT PHY_MEM_INFO* PhyMemInfo
)
{
HKEY hKey;
int nRet = 0;
nRet = RegOpenKey(HKEY_LOCAL_MACHINE, "Hardware//ResourceMap//System Resources//Physical Memory", &hKey);
if(nRet != ERROR_SUCCESS)
{
fprintf(stderr, "RegOpenKey() failed. --err: %d/n", GetLastError());
return FALSE;
}
DWORD Type = 0;
DWORD cbData = 0;
LPBYTE lpData = NULL;
LPBYTE pmrc = NULL;
RegQueryValueEx(hKey, ".Translated", 0, &Type, NULL, &cbData);
lpData = (LPBYTE)malloc(cbData);
RegQueryValueEx(hKey, ".Translated", 0, &Type, lpData, &cbData);
if(nRet != ERROR_SUCCESS)
{
fprintf(stderr, "RegQueryValueEx() failed. --err: %d/n", GetLastError());
return FALSE;
}
DWORD BusCount = *(DWORD*)lpData;
if(BusCount <= 0)
{
fprintf(stderr, "Cannot get valid memory information./n");
return FALSE;
}
LPBYTE p = lpData + 0x10;
DWORD MemoryRangesCount = 0;
for(DWORD i = 1; i <= BusCount; i++)
{
MemoryRangesCount += *(DWORD*)p;
p = p + 0x8 + i * (*(DWORD*)p) * 0x10;
}
p = lpData + 0x10;
PhyMemInfo->MemInfoPtr = (struct _mi*)malloc(MI_LEN * MemoryRangesCount);
if(PhyMemInfo->MemInfoPtr == NULL)
{
fprintf(stderr, "Not enough memory./n");
return FALSE;
}
LPBYTE pmi = NULL;
struct _mi* ptr = PhyMemInfo->MemInfoPtr;
for(DWORD i = 1; i <= BusCount; i++)
{
pmi = p + 0x8;
for(DWORD j = 0; j < *(DWORD*)p; j++)
{
ptr->Address.LowPart = *(DWORD*)pmi;
ptr->Address.HighPart = *(long*)(pmi + 0x4);
ptr->Length = *(DWORD*)(pmi + 0x8);
ptr++;
pmi += MI_LEN;
}
p = p + 0x8 + i * (*(DWORD*)p) * 0x10;
}
PhyMemInfo->BusCount = BusCount;
PhyMemInfo->MemoryRangeCount = MemoryRangesCount;
RegCloseKey(hKey);
free(lpData);
return TRUE;
}
void logo()
{
printf("+------------------------------------+/n");
printf("| Physical Memory Information v0.1 |/n");
printf("| Write by CDrea |/n");
printf("| CDrea_at_SafeChina[dot]ORG |/n");
printf("| 2007-12-24 |/n");
printf("| http://www.safechina.org |/n");
printf("+------------------------------------+/n/n");
}
相关文章推荐
- 如何利用Win32API取得另一支程式中的ListView內的所有值(RegisterHotKey,ReadProcessMemory,WindowFromPoint和VirtualAllocEx)
- SQL Script for read information from a csv file in FTP Server
- Read tiff from memory(从内存流读取TIFF)
- read physical memory and others
- Talking from Virtual Memory Management: from virtual address to physical address ...
- Can not obtain Oracle client information from registry
- hive: insert数据时Error during job, obtaining debugging information 以及beyond physical memory limits
- Error:Could not read cache value from '/Users/wangjin/.gradle/daemon/2.2.1/registry.bin'.
- Error: ErrorCode<ERRPS008>:SubStatus<ES0001>:Error: Could not read installation path from registry.
- SQL Script for read information from a csv file in FTP Server
- [WASM] Read WebAssembly Memory from JavaScript
- hive: insert数据时Error during job, obtaining debugging information 以及beyond physical memory limits
- Windows SDK Registry: How can I read in data from the registry?
- Extended paging tables to map guest physical memory addresses from virtual memory page tables to host physical memory addresses in a virtual machine system
- ORA-39050: parameter _log_private_parallelism is incompatible with parameter _redo_read_from_memory
- configuration information could not be read from the domain controller报错
- Get Information from Tracert Command
- Step by Step Guide on Creating Physical Standby Using RMAN DUPLICATE...FROM ACTIVE DATABASE (Doc ID
- Playback audio data from memory in windows
- Grepping Executive Objects from Pool Memory