19 #define LIBSMBIOS_SOURCE
30 MemoryFactoryImpl::MemoryFactoryImpl()
32 setParameter(
"memFile",
"\\Device\\PhysicalMemory");
55 hNtdll = GetModuleHandle(L
"ntdll.dll");
56 hKerneldll = GetModuleHandle( L
"kernel32.dll" );
57 if (!(hNtdll && hKerneldll))
61 NtOpenSection = (NtOpenSectionPtr) GetProcAddress(hNtdll,
"NtOpenSection");
62 NtClose = (NtClosePtr) GetProcAddress(hNtdll,
"NtClose");
63 NtMapViewOfSection = (NtMapViewOfSectionPtr) GetProcAddress(hNtdll,
"NtMapViewOfSection");
84 HANDLE hPhysMem = NULL;
112 int MapMem(HANDLE hPhysMem, PVOID pBaseAddr, PDWORD pPhysAddr, PDWORD pSize)
117 * (DWORD *) pBaseAddr = (DWORD) NULL;
119 paAddr.LowPart = *pPhysAddr;
121 *pSize, &paAddr, pSize,
ViewShare, 0, PAGE_READONLY);
129 *pPhysAddr = paAddr.LowPart;
150 HANDLE hCurrentProcess;
152 TOKEN_PRIVILEGES tkprivs;
155 hCurrentProcess = GetCurrentProcess();
156 if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
159 LookupPrivilegeValue(NULL, privilegeName, &tkprivs.Privileges[0].Luid);
160 tkprivs.PrivilegeCount = 1;
161 tkprivs.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
164 AdjustTokenPrivileges(hToken, FALSE, &tkprivs, 0, (PTOKEN_PRIVILEGES)NULL, NULL);
167 err = GetLastError();
169 return err == ERROR_SUCCESS;
174 unsigned int totalBytes = 0;
175 unsigned int originalSize = length;
176 unsigned int pageSize = length;
180 throw AccessErrorImpl(
_(
"Handle to physical memory was not set or could not be opened.") );
185 throw AccessErrorImpl(
_(
"Error accessing buffer.") );
188 while(totalBytes != originalSize )
191 DWORD PhysAddr =
static_cast<DWORD
>(offset);
196 if (!
MapMem(hPhysMem, (PVOID) &BaseAddr, &PhysAddr, reinterpret_cast<PDWORD>(&pageSize)))
198 throw AccessErrorImpl(
_(
"Error mapping physical memory.") );
202 unsigned int index =
static_cast<DWORD
>(offset) - PhysAddr;
206 while( index < pageSize && totalBytes != originalSize)
208 u64 tmp = BaseAddr + index;
209 buffer[totalBytes] = *
reinterpret_cast<u8 *
>(tmp);
215 if (!
UnMapMem(reinterpret_cast<PVOID>(tmp)))
217 throw AccessErrorImpl(
_(
"Error unmapping physical memory."));
223 offset = PhysAddr + index;
224 pageSize = originalSize-totalBytes;
234 memset(&mem, 0,
sizeof(mem));
235 mem.
Addr = (DWORD)offset;
247 throw AccessErrorImpl(
_(
"Could not use Debug Sysctl to read physical memory."));
258 if( offset >= 0xC0000 && offset < 0xDFFFF &&
CBlockBuffer != NULL )
260 memset( buffer, 0, length );
261 memcpy( buffer, &
CBlockBuffer[(DWORD)offset - 0xC0000], length );
267 if( offset >= 0xE0000 && offset < 0xFFFFF &&
EBlockBuffer != NULL )
269 memset( buffer, 0, length );
270 memcpy( buffer, &
EBlockBuffer[(DWORD)offset - 0xE0000], length );
274 DWORD iSignature = 0x46000000 | 0x00490000 | 0x00005200 | 0x0000004D ;
278 if( iBufferSizeNeeded > 0 )
280 DWORD * FirmwareTableEnumBuffer =
new DWORD[iBufferSizeNeeded];
282 for( i = 0; i < iBufferSizeNeeded; i++ )
284 FirmwareTableEnumBuffer[i] = 0;
288 DWORD FirmwareTableNameToUse = 0;
289 for( i = 0; i < iBufferSizeNeeded; i++ )
291 if( FirmwareTableEnumBuffer[i] > 0 && FirmwareTableEnumBuffer[i] <= offset && offset <= FirmwareTableEnumBuffer[i] + 128 * 1024 )
293 FirmwareTableNameToUse = FirmwareTableEnumBuffer[i];
296 delete [] FirmwareTableEnumBuffer;
298 if( FirmwareTableNameToUse == 0 )
300 throw AccessErrorImpl(
_(
"Could not locate a table which can be used.") );
305 if( iBufferSizeNeeded > 0 )
307 u8 * MemoryAtRequestedOffSet = NULL;
308 MemoryAtRequestedOffSet =
new u8[iBufferSizeNeeded];
309 if( MemoryAtRequestedOffSet != NULL )
311 memset( MemoryAtRequestedOffSet, 0, iBufferSizeNeeded );
312 memset( buffer, 0, length );
314 memcpy( buffer, &MemoryAtRequestedOffSet[(DWORD)offset - FirmwareTableNameToUse], length );
315 if( FirmwareTableNameToUse == 0xC0000 )
320 if( FirmwareTableNameToUse == 0xE0000 )
326 delete MemoryAtRequestedOffSet;
331 throw AccessErrorImpl(
_(
"Failed to allocate memory for Firmware table.") );
336 throw AccessErrorImpl(
_(
"GetSystemFirmwareTable returned 0 for table length.") );
341 throw AccessErrorImpl(
_(
"EnumSystemFirmwareTables returned 0 for table size.") );
346 MemoryOsSpecific::MemoryOsSpecific(
const string )
349 HANDLE hPhysMem = NULL;
355 throw AccessErrorImpl(
_(
"Could not load ntdll functions!") );
364 osData =
static_cast<HANDLE *
>(hPhysMem);
367 MemoryOsSpecific::~MemoryOsSpecific()
369 HANDLE hPhysMem =
static_cast<HANDLE
>(osData);
384 void MemoryOsSpecific::fillBuffer(
u8 *buffer, u64 offset,
unsigned int length)
const
397 HANDLE hPhysMem =
static_cast<HANDLE
>(osData);
409 u8 MemoryOsSpecific::getByte( u64 offset )
const
412 fillBuffer(&value, offset, 1);
416 void MemoryOsSpecific::putByte( u64 ,
u8 )
const
418 throw smbios::NotImplementedImpl(
_(
"writing to physical memory is not implemented on Windows yet.") );
423 int MemoryOsSpecific::incReopenHint()
427 int MemoryOsSpecific::decReopenHint()