mxStartup; micekeychip fix; SDCM fix
This commit is contained in:
parent
3565da0040
commit
cae05bde85
336
lib/ewfapi.h
Normal file
336
lib/ewfapi.h
Normal file
@ -0,0 +1,336 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
|
||||||
|
Copyright (c) 2003 Microsoft Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
ewfapi.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Defines the EWF APIs
|
||||||
|
|
||||||
|
Environment:
|
||||||
|
|
||||||
|
User mode
|
||||||
|
|
||||||
|
Revision History:
|
||||||
|
|
||||||
|
|
||||||
|
****************************************************************************/
|
||||||
|
#ifndef __EWFAPI_H__
|
||||||
|
#define __EWFAPI_H__
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EWFIMP
|
||||||
|
#define EWFIMP __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _EWF_VOLUME_NAME_ENTRY
|
||||||
|
{
|
||||||
|
struct _EWF_VOLUME_NAME_ENTRY * Next;
|
||||||
|
WCHAR Name[1];
|
||||||
|
} EWF_VOLUME_NAME_ENTRY, *PEWF_VOLUME_NAME_ENTRY;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
EWF_NO_CMD = 0, // no pending command
|
||||||
|
EWF_ENABLE, // overlay will be enabled
|
||||||
|
EWF_DISABLE, // overlay will be disabled
|
||||||
|
EWF_SET_LEVEL, // overlay level will be set
|
||||||
|
EWF_COMMIT // current level will be committed to the protected volume
|
||||||
|
} EWF_CMD;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
EWF_ENABLED, // The overlay is enabled on the volume
|
||||||
|
EWF_DISABLED // The overlay is disabled on the volume
|
||||||
|
} EWF_STATE;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
EWF_DISK, // DISK overlay
|
||||||
|
EWF_RAM, // RAM overlay, with an associated overlay volume store
|
||||||
|
EWF_RAM_REG, // RAM overlay, without an associated overlay volume store
|
||||||
|
} EWF_TYPE, *PEWF_TYPE;
|
||||||
|
|
||||||
|
|
||||||
|
#define EWF_MAX_DEVICE_NAME_LENGTH (256)
|
||||||
|
#define EWF_VOLUME_ID_SIZE (16)
|
||||||
|
|
||||||
|
typedef struct _EWF_VOLUME_DESC
|
||||||
|
{
|
||||||
|
WCHAR DeviceName[EWF_MAX_DEVICE_NAME_LENGTH]; // Device name of the volume
|
||||||
|
UCHAR VolumeID[EWF_VOLUME_ID_SIZE]; // 16 byte volume identifier
|
||||||
|
} EWF_VOLUME_DESC, * PEWF_VOLUME_DESC;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// This is a variable size structure depending on how many protected overlay
|
||||||
|
// volumes there are.
|
||||||
|
//
|
||||||
|
typedef struct _EWF_OVERLAY_STORE_CONFIG
|
||||||
|
{
|
||||||
|
ULONG FormatVersion; // Version of Overlay-Store format
|
||||||
|
LONGLONG VolumeSize; // Size of the overlay volume in bytes
|
||||||
|
|
||||||
|
ULONG NumSegments; // Number of segments that the volume is divided into
|
||||||
|
ULONG FreeSegments; // Number of segments that are free
|
||||||
|
ULONG SegmentSize; // Size of each segment in bytes
|
||||||
|
|
||||||
|
ULONG MaxVolumes; // Maximum number of protected volumes
|
||||||
|
ULONG NumVolumes; // Number of currently protected volumes
|
||||||
|
USHORT MaxLevels; // Maximum number of overlay levels
|
||||||
|
EWF_VOLUME_DESC VolumeDescArray[1];
|
||||||
|
// The array holds NumVolume count volume descriptions
|
||||||
|
} EWF_OVERLAY_STORE_CONFIG, * PEWF_OVERLAY_STORE_CONFIG;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _EWF_COMMAND
|
||||||
|
{
|
||||||
|
EWF_CMD Command; // ENABLE, DISABLE, etc..
|
||||||
|
ULONG Param1; // command first parameter.
|
||||||
|
ULONG Param2; // command second parameter.
|
||||||
|
|
||||||
|
} EWF_COMMAND, *PEWF_COMMAND;
|
||||||
|
|
||||||
|
|
||||||
|
#define EWF_MAX_LEVEL_NAME_LENGTH (64)
|
||||||
|
|
||||||
|
typedef struct _EWF_LEVEL_DESC
|
||||||
|
{
|
||||||
|
WCHAR LevelName[EWF_MAX_LEVEL_NAME_LENGTH];
|
||||||
|
// friendly name of the level
|
||||||
|
// If the length is equal to EWF_MAX_LEVEL_NAME_LENGTH
|
||||||
|
// then no null terminator is stored.
|
||||||
|
FILETIME LevelEndTime; // time at which the level was ended
|
||||||
|
LONGLONG LevelDataSize; // Size of the data in the level in bytes
|
||||||
|
} EWF_LEVEL_DESC, * PEWF_LEVEL_DESC;
|
||||||
|
|
||||||
|
|
||||||
|
#define EWF_MAX_PERSISTENT_DATA (32) // maximum number of bytes that can be persisted
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _EWF_VOLUME_CONFIG
|
||||||
|
{
|
||||||
|
EWF_TYPE Type; // Type of overlay for this volume
|
||||||
|
EWF_STATE State; // state of the overlay for this volume, ENABLED or DISABLED
|
||||||
|
EWF_COMMAND BootCommand; // Command to execute on next restart
|
||||||
|
|
||||||
|
UCHAR PersistentData[EWF_MAX_PERSISTENT_DATA];
|
||||||
|
// Small amount of persistent data that survives a restore
|
||||||
|
|
||||||
|
USHORT MaxLevels; // Maximum number of checkpoint levels for this volume
|
||||||
|
ULONG ClumpSize; // 512 bytes
|
||||||
|
USHORT CurrentLevel; // Current checkpoint level
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
LONGLONG DiskMapSize; // Size of the mapping data on disk
|
||||||
|
LONGLONG DiskDataSize; // Size of the data stored on disk for this protected volume
|
||||||
|
} DiskOverlay;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
LONGLONG RamDataSize; // Size of the data stored in RAM for this protected volume
|
||||||
|
} RamOverlay;
|
||||||
|
};
|
||||||
|
ULONG MemMapSize; // Size of the mapping data in memory
|
||||||
|
|
||||||
|
EWF_VOLUME_DESC VolumeDesc; // volume device name, and volume ID
|
||||||
|
|
||||||
|
EWF_LEVEL_DESC LevelDescArray[1]; // Level descripton and end time, and level data size
|
||||||
|
|
||||||
|
} EWF_VOLUME_CONFIG, * PEWF_VOLUME_CONFIG;
|
||||||
|
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
WCHAR
|
||||||
|
WINAPI
|
||||||
|
EwfMgrGetDriveLetterFromVolumeName(
|
||||||
|
IN LPCWSTR lpVolumeName
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
EwfMgrVolumeNameListIsEmpty(
|
||||||
|
IN PEWF_VOLUME_NAME_ENTRY pVolumeNameList
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
EwfMgrVolumeNameEntryPop(
|
||||||
|
IN PEWF_VOLUME_NAME_ENTRY * ppVolumeNameList
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
EwfMgrVolumeNameListDelete(
|
||||||
|
IN PEWF_VOLUME_NAME_ENTRY pVolumeNameList
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
HANDLE
|
||||||
|
WINAPI
|
||||||
|
EwfMgrOpenProtected(
|
||||||
|
IN LPCWSTR lpVolume
|
||||||
|
);
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
EwfMgrClose(
|
||||||
|
IN HANDLE hDevice
|
||||||
|
);
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
EwfMgrClearCommand(
|
||||||
|
IN HANDLE hDevice
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
EwfMgrSetPersistentData(
|
||||||
|
IN HANDLE hDevice,
|
||||||
|
IN LPBYTE lpPersistentData,
|
||||||
|
IN DWORD cbPersistentData
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
EwfMgrGetPersistentData(
|
||||||
|
IN HANDLE hDevice,
|
||||||
|
OUT LPBYTE lpPersistentData,
|
||||||
|
IN DWORD cbPersistentData
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
EwfMgrCheckpoint(
|
||||||
|
IN HANDLE hDevice,
|
||||||
|
IN OPTIONAL LPCWSTR lpDescription
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
EwfMgrRestore(
|
||||||
|
IN HANDLE hDevice
|
||||||
|
);
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
EwfMgrDisable(
|
||||||
|
IN HANDLE hDevice,
|
||||||
|
IN BOOL fCommit
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
EwfMgrEnable(
|
||||||
|
IN HANDLE hDevice
|
||||||
|
);
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
EwfMgrCommit(
|
||||||
|
IN HANDLE hDevice
|
||||||
|
);
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
EwfMgrCommitAndDisableLive(
|
||||||
|
IN HANDLE hDevice
|
||||||
|
);
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
EwfMgrCommitFile(
|
||||||
|
IN HANDLE hDevice,
|
||||||
|
IN LPWSTR lpFile
|
||||||
|
);
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
EwfMgrSetLevel(
|
||||||
|
IN HANDLE hDevice,
|
||||||
|
IN OPTIONAL LPCWSTR lpDescription,
|
||||||
|
IN int Level,
|
||||||
|
IN BOOL fDeleteLevel
|
||||||
|
);
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
PEWF_VOLUME_CONFIG
|
||||||
|
WINAPI
|
||||||
|
EwfMgrGetProtectedVolumeConfig(
|
||||||
|
IN HANDLE hDevice
|
||||||
|
);
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
PEWF_VOLUME_NAME_ENTRY
|
||||||
|
WINAPI
|
||||||
|
EwfMgrGetProtectedVolumeList(
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
HANDLE
|
||||||
|
WINAPI
|
||||||
|
EwfMgrOpenOverlayStore(
|
||||||
|
IN BOOL fOpenForAsyncIO
|
||||||
|
);
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
PEWF_OVERLAY_STORE_CONFIG
|
||||||
|
WINAPI
|
||||||
|
EwfMgrGetOverlayStoreConfig(
|
||||||
|
IN HANDLE hDevice
|
||||||
|
);
|
||||||
|
|
||||||
|
EWFIMP
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
EwfMgrRegisterLowSpaceNotification(
|
||||||
|
IN HANDLE hDevice,
|
||||||
|
IN LONGLONG FreeBytesRemaining,
|
||||||
|
IN LPOVERLAPPED lpOverlapped
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // __EWFAPI_H__
|
||||||
|
|
BIN
lib/ewfapi.lib
Normal file
BIN
lib/ewfapi.lib
Normal file
Binary file not shown.
@ -39,6 +39,9 @@ else
|
|||||||
endif
|
endif
|
||||||
assert(openssl_lib.found(), 'Please download openssl!')
|
assert(openssl_lib.found(), 'Please download openssl!')
|
||||||
|
|
||||||
|
ewfapi_lib = meson.get_compiler('c').find_library('ewfapi', dirs: [
|
||||||
|
join_paths(meson.source_root(), 'lib')
|
||||||
|
], required: true)
|
||||||
freeglut_lib = meson.get_compiler('c').find_library('freeglut', dirs: [
|
freeglut_lib = meson.get_compiler('c').find_library('freeglut', dirs: [
|
||||||
join_paths(meson.source_root(), 'lib')
|
join_paths(meson.source_root(), 'lib')
|
||||||
], required: true)
|
], required: true)
|
||||||
|
@ -144,13 +144,9 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t m_Crc;
|
uint32_t m_Crc;
|
||||||
uint32_t m_Uk1;
|
uint8_t m_Uk04[4];
|
||||||
uint32_t m_Uk2;
|
char m_Name[16];
|
||||||
uint32_t m_Uk3;
|
uint8_t m_Uk18[8];
|
||||||
uint32_t m_Uk4;
|
|
||||||
uint32_t m_Uk5;
|
|
||||||
uint32_t m_Uk6;
|
|
||||||
uint32_t m_Uk7;
|
|
||||||
} AM_SYSDATAwH_ALPB_COMPUTER_NAME, *PAM_SYSDATAwH_ALPB_COMPUTER_NAME;
|
} AM_SYSDATAwH_ALPB_COMPUTER_NAME, *PAM_SYSDATAwH_ALPB_COMPUTER_NAME;
|
||||||
|
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
#include "mx.h"
|
#include "mx.h"
|
||||||
|
|
||||||
BOOL WINAPI mxhwreset_DeviceIoControl(file_context_t* ctx, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize,
|
BOOL WINAPI mxhwreset_DeviceIoControl(file_context_t* ctx, DWORD dwIoControlCode, LPVOID lpInBuffer,
|
||||||
LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned,
|
DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize,
|
||||||
LPOVERLAPPED lpOverlapped) {
|
LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped) {
|
||||||
switch (dwIoControlCode) {
|
switch (dwIoControlCode) {
|
||||||
case IOCTL_MXHWRESET_RESET:
|
case IOCTL_MXHWRESET_RESET:
|
||||||
if (lpBytesReturned) *lpBytesReturned = 0;
|
if (lpBytesReturned) *lpBytesReturned = 0;
|
||||||
break;
|
ExitProcess(-1);
|
||||||
default:
|
default:
|
||||||
log_warning(plfMxHwreset, "unhandled 0x%08x", dwIoControlCode);
|
log_warning(plfMxHwreset, "unhandled 0x%08x", dwIoControlCode);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup_mxhwreset() {
|
void setup_mxhwreset() {
|
||||||
|
@ -61,6 +61,8 @@ void mxjvs_handle(unsigned char* lpMaskedIn, short nMaskedCount, unsigned char*
|
|||||||
if ((++jvsDTHCount) > _countof(jvsDTHistory)) jvsDTHCount = _countof(jvsDTHistory);
|
if ((++jvsDTHCount) > _countof(jvsDTHistory)) jvsDTHCount = _countof(jvsDTHistory);
|
||||||
|
|
||||||
jvsRate = (jvsRateAccum > 0.0f) ? (1.0f / (jvsRateAccum / (float)jvsDTHCount)) : FLT_MAX;
|
jvsRate = (jvsRateAccum > 0.0f) ? (1.0f / (jvsRateAccum / (float)jvsDTHCount)) : FLT_MAX;
|
||||||
|
|
||||||
|
// log_game(plfAime, "jvs rate: %.2fHz", jvsRate);
|
||||||
}
|
}
|
||||||
last_tick = now;
|
last_tick = now;
|
||||||
|
|
||||||
|
@ -168,7 +168,7 @@ void hud_fps() {
|
|||||||
|
|
||||||
igText("FPS: %.1f", io->Framerate);
|
igText("FPS: %.1f", io->Framerate);
|
||||||
igText(" dT: %.2fms", 1000 / io->Framerate);
|
igText(" dT: %.2fms", 1000 / io->Framerate);
|
||||||
igText("JVS Rate: %.2f", jvsRate);
|
igText("JVS Rate: %.2fHz", jvsRate);
|
||||||
}
|
}
|
||||||
|
|
||||||
igEnd();
|
igEnd();
|
||||||
@ -957,8 +957,7 @@ void tab_system_buttons() {
|
|||||||
igTextUnformatted(keyName, NULL);
|
igTextUnformatted(keyName, NULL);
|
||||||
}
|
}
|
||||||
igNextColumn();
|
igNextColumn();
|
||||||
if (igButton("Bind##Bind1P", vec0))
|
if (igButton("Bind##Bind1P", vec0)) igOpenPopup_Str("BindSys1P", ImGuiPopupFlags_None);
|
||||||
igOpenPopup_Str("BindSys1P", ImGuiPopupFlags_None);
|
|
||||||
if (MiceConfig.keys.card_p1) {
|
if (MiceConfig.keys.card_p1) {
|
||||||
igSameLine(0, -1);
|
igSameLine(0, -1);
|
||||||
if (igButton("Clear##Clear1P", vec0)) {
|
if (igButton("Clear##Clear1P", vec0)) {
|
||||||
@ -984,8 +983,7 @@ void tab_system_buttons() {
|
|||||||
igTextUnformatted(keyName, NULL);
|
igTextUnformatted(keyName, NULL);
|
||||||
}
|
}
|
||||||
igNextColumn();
|
igNextColumn();
|
||||||
if (igButton("Bind##Bind2P", vec0))
|
if (igButton("Bind##Bind2P", vec0)) igOpenPopup_Str("BindSys2P", ImGuiPopupFlags_None);
|
||||||
igOpenPopup_Str("BindSys2P", ImGuiPopupFlags_None);
|
|
||||||
if (MiceConfig.keys.card_p2) {
|
if (MiceConfig.keys.card_p2) {
|
||||||
igSameLine(0, -1);
|
igSameLine(0, -1);
|
||||||
if (igButton("Clear##Clear2P", vec0)) {
|
if (igButton("Clear##Clear2P", vec0)) {
|
||||||
@ -1090,11 +1088,12 @@ void hud_control(ImGuiKey open_key) {
|
|||||||
|
|
||||||
void __stdcall hud_gui(unsigned int hookType, IDirect3DDevice9* dev) {
|
void __stdcall hud_gui(unsigned int hookType, IDirect3DDevice9* dev) {
|
||||||
static bool lastAnyOpen = false;
|
static bool lastAnyOpen = false;
|
||||||
bool anyOpen = showControl || showEeprom || showSram || showCardP1;
|
bool anyOpen = showControl || showEeprom || showSram || showCardP1 || showFps;
|
||||||
if (anyOpen != lastAnyOpen) {
|
if (anyOpen != lastAnyOpen) {
|
||||||
changeCursorState = anyOpen ? 1 : 0;
|
changeCursorState = anyOpen ? 1 : 0;
|
||||||
lastAnyOpen = anyOpen;
|
lastAnyOpen = anyOpen;
|
||||||
}
|
}
|
||||||
|
// if (!anyOpen) return;
|
||||||
|
|
||||||
static bool initialized = false;
|
static bool initialized = false;
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
@ -1123,8 +1122,10 @@ void __stdcall hud_gui(unsigned int hookType, IDirect3DDevice9* dev) {
|
|||||||
|
|
||||||
if (hookType == UI_HOOK_DX9) {
|
if (hookType == UI_HOOK_DX9) {
|
||||||
igEndFrame();
|
igEndFrame();
|
||||||
igRender();
|
if (anyOpen) {
|
||||||
ImGui_ImplDX9_RenderDrawData(igGetDrawData());
|
igRender();
|
||||||
|
ImGui_ImplDX9_RenderDrawData(igGetDrawData());
|
||||||
|
}
|
||||||
} else if (hookType == UI_HOOK_GLUT) {
|
} else if (hookType == UI_HOOK_GLUT) {
|
||||||
igRender();
|
igRender();
|
||||||
ImGui_ImplOpenGL3_RenderDrawData(igGetDrawData());
|
ImGui_ImplOpenGL3_RenderDrawData(igGetDrawData());
|
||||||
|
@ -373,6 +373,7 @@ char matchWorkFilename[MAX_PATH + 1];
|
|||||||
inline static BOOL matchVolume(disk_volume_t* volume, LPCSTR lpRootPathName, DWORD match) {
|
inline static BOOL matchVolume(disk_volume_t* volume, LPCSTR lpRootPathName, DWORD match) {
|
||||||
if (match & VOL_MATCH_GUID) {
|
if (match & VOL_MATCH_GUID) {
|
||||||
strcpy_s(matchWorkFilename, sizeof matchWorkFilename, volume->m_FilenameA);
|
strcpy_s(matchWorkFilename, sizeof matchWorkFilename, volume->m_FilenameA);
|
||||||
|
if (strcmp(matchWorkFilename, lpRootPathName) == 0) return TRUE;
|
||||||
strcat_s(matchWorkFilename, sizeof matchWorkFilename, "\\");
|
strcat_s(matchWorkFilename, sizeof matchWorkFilename, "\\");
|
||||||
if (strcmp(matchWorkFilename, lpRootPathName) == 0) return TRUE;
|
if (strcmp(matchWorkFilename, lpRootPathName) == 0) return TRUE;
|
||||||
}
|
}
|
||||||
@ -385,6 +386,12 @@ inline static BOOL matchVolume(disk_volume_t* volume, LPCSTR lpRootPathName, DWO
|
|||||||
"\\\\.\\%c:", char_upper(volume->m_MountPoint));
|
"\\\\.\\%c:", char_upper(volume->m_MountPoint));
|
||||||
if (strstr(lpRootPathName, matchWorkFilename) == lpRootPathName) return TRUE;
|
if (strstr(lpRootPathName, matchWorkFilename) == lpRootPathName) return TRUE;
|
||||||
}
|
}
|
||||||
|
if (match & VOL_MATCH_PATH && volume->m_pDrive && volume->m_pPartition) {
|
||||||
|
sprintf_s(matchWorkFilename, sizeof matchWorkFilename, "\\device\\harddisk%d\\partition%d",
|
||||||
|
volume->m_pDrive->m_DriveNumber, volume->m_pPartition->m_PartitionNumber);
|
||||||
|
|
||||||
|
if (_stricmp(lpRootPathName, matchWorkFilename) == 0) return TRUE;
|
||||||
|
}
|
||||||
if (match & VOL_MATCH_DOS_DEVICE && volume->m_MountPoint) {
|
if (match & VOL_MATCH_DOS_DEVICE && volume->m_MountPoint) {
|
||||||
if (char_lower(volume->m_MountPoint) == char_lower(lpRootPathName[0])) {
|
if (char_lower(volume->m_MountPoint) == char_lower(lpRootPathName[0])) {
|
||||||
if (lpRootPathName[1] == ':' && lpRootPathName[2] == '\0') return TRUE;
|
if (lpRootPathName[1] == ':' && lpRootPathName[2] == '\0') return TRUE;
|
||||||
@ -779,6 +786,7 @@ void hook_drives() {
|
|||||||
NULL);
|
NULL);
|
||||||
hook("Kernel32.dll", "DeleteVolumeMountPointA", &FakeDeleteVolumeMountPointA, NULL);
|
hook("Kernel32.dll", "DeleteVolumeMountPointA", &FakeDeleteVolumeMountPointA, NULL);
|
||||||
hook("Kernel32.dll", "SetVolumeMountPointA", &FakeSetVolumeMountPointA, NULL);
|
hook("Kernel32.dll", "SetVolumeMountPointA", &FakeSetVolumeMountPointA, NULL);
|
||||||
|
hook("Kernel32.dll", "DefineDosDeviceA", &FakeDefineDosDeviceA, NULL);
|
||||||
hook("Kernel32.dll", "GetDriveTypeA", &FakeGetDriveTypeA, (void**)&TrueGetDriveTypeA);
|
hook("Kernel32.dll", "GetDriveTypeA", &FakeGetDriveTypeA, (void**)&TrueGetDriveTypeA);
|
||||||
hook("Kernel32.dll", "GetDiskFreeSpaceExA", &FakeGetDiskFreeSpaceExA,
|
hook("Kernel32.dll", "GetDiskFreeSpaceExA", &FakeGetDiskFreeSpaceExA,
|
||||||
(void**)&TrueGetDiskFreeSpaceExA);
|
(void**)&TrueGetDiskFreeSpaceExA);
|
||||||
|
@ -78,6 +78,7 @@ BOOL WINAPI FakeGetVolumePathNamesForVolumeNameA(LPCSTR lpszVolumeName, LPCH lps
|
|||||||
DWORD cchBufferLength, PDWORD lpcchReturnLength);
|
DWORD cchBufferLength, PDWORD lpcchReturnLength);
|
||||||
BOOL WINAPI FakeDeleteVolumeMountPointA(LPCSTR lpszVolumeMountPoint);
|
BOOL WINAPI FakeDeleteVolumeMountPointA(LPCSTR lpszVolumeMountPoint);
|
||||||
BOOL WINAPI FakeSetVolumeMountPointA(LPCSTR lpszVolumeMountPoint, LPCSTR lpszVolumeName);
|
BOOL WINAPI FakeSetVolumeMountPointA(LPCSTR lpszVolumeMountPoint, LPCSTR lpszVolumeName);
|
||||||
|
BOOL WINAPI FakeDefineDosDeviceA(DWORD dwFlags, LPCSTR lpDeviceName, LPCSTR lpTargetPath);
|
||||||
DWORD WINAPI FakeQueryDosDeviceA(LPCSTR lpDeviceName, LPSTR lpTargetPath, DWORD ucchMax);
|
DWORD WINAPI FakeQueryDosDeviceA(LPCSTR lpDeviceName, LPSTR lpTargetPath, DWORD ucchMax);
|
||||||
DWORD WINAPI FakeQueryDosDeviceW(LPCWSTR lpDeviceName, LPWSTR lpTargetPath, DWORD ucchMax);
|
DWORD WINAPI FakeQueryDosDeviceW(LPCWSTR lpDeviceName, LPWSTR lpTargetPath, DWORD ucchMax);
|
||||||
BOOL WINAPI FakeDefineDosDeviceW(DWORD dwFlags, LPCWSTR lpDeviceName, LPCWSTR lpTargetPath);
|
BOOL WINAPI FakeDefineDosDeviceW(DWORD dwFlags, LPCWSTR lpDeviceName, LPCWSTR lpTargetPath);
|
||||||
|
@ -19,26 +19,28 @@ disk_volume_t* incrementFindIndex(HANDLE hFindVolume) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (find_index->partition > 3) {
|
if (find_index->partition > 3) {
|
||||||
if (AVAILABLE_DISKS[find_index->disk].m_Disk
|
if (AVAILABLE_DISKS[find_index->disk]
|
||||||
->m_Extended[find_index->partition - 4]
|
.m_Disk->m_Extended[find_index->partition - 4]
|
||||||
.m_PartitionNumber == 0) {
|
.m_PartitionNumber == 0) {
|
||||||
find_index->disk++;
|
find_index->disk++;
|
||||||
find_index->partition = 0;
|
find_index->partition = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return &(AVAILABLE_DISKS[find_index->disk].m_Disk
|
return &(AVAILABLE_DISKS[find_index->disk]
|
||||||
->m_Extended[(find_index->partition++) - 4]
|
.m_Disk->m_Extended[(find_index->partition++) - 4]
|
||||||
.m_Volume);
|
.m_Volume);
|
||||||
}
|
}
|
||||||
if (AVAILABLE_DISKS[find_index->disk].m_Disk
|
if (AVAILABLE_DISKS[find_index->disk]
|
||||||
->m_Partitions[find_index->partition]
|
.m_Disk->m_Partitions[find_index->partition]
|
||||||
.m_PartitionNumber == 0) {
|
.m_PartitionNumber == 0) {
|
||||||
find_index->partition = 4;
|
find_index->partition = 4;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return &(AVAILABLE_DISKS[find_index->disk].m_Disk->m_Partitions[find_index->partition++].m_Volume);
|
return &(AVAILABLE_DISKS[find_index->disk]
|
||||||
|
.m_Disk->m_Partitions[find_index->partition++]
|
||||||
|
.m_Volume);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,9 +184,10 @@ BOOL WINAPI FakeDeleteVolumeMountPointA(LPCSTR lpszVolumeMountPoint) {
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
BOOL WINAPI FakeSetVolumeMountPointA(LPCSTR lpszVolumeMountPoint, LPCSTR lpszVolumeName) {
|
BOOL WINAPI FakeSetVolumeMountPointA(LPCSTR lpszVolumeMountPoint, LPCSTR lpszVolumeName) {
|
||||||
log_trace(plfDrive, "SetVolumeMountPointA(%s)", lpszVolumeMountPoint);
|
log_misc(plfDrive, "SetVolumeMountPointA(%s, %s)", lpszVolumeMountPoint, lpszVolumeName);
|
||||||
disk_volume_t* volume = getVolumeByPath(lpszVolumeName, VOL_MATCH_GUID);
|
disk_volume_t* volume = getVolumeByPath(lpszVolumeName, VOL_MATCH_GUID);
|
||||||
if (volume == NULL) {
|
if (volume == NULL) {
|
||||||
|
log_error(plfDrive, "No match found for %s", lpszVolumeName);
|
||||||
SetLastError(ERROR_FILE_NOT_FOUND);
|
SetLastError(ERROR_FILE_NOT_FOUND);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -197,6 +200,12 @@ BOOL WINAPI FakeSetVolumeMountPointA(LPCSTR lpszVolumeMountPoint, LPCSTR lpszVol
|
|||||||
volume->m_MountPoint = cMountPoint;
|
volume->m_MountPoint = cMountPoint;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
if (sscanf_s(lpszVolumeMountPoint, "\\\\.\\%c:\\%n", &cMountPoint, 1, &nScan) == 1 &&
|
||||||
|
nScan == 7) {
|
||||||
|
log_info(plfDrive, "Mounting %s at %c:\\", volume->m_Name, cMountPoint);
|
||||||
|
volume->m_MountPoint = cMountPoint;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
if (sscanf_s(lpszVolumeMountPoint, "%c:\\%n", &cMountPoint, 1, &nScan) == 1 && nScan == 3) {
|
if (sscanf_s(lpszVolumeMountPoint, "%c:\\%n", &cMountPoint, 1, &nScan) == 1 && nScan == 3) {
|
||||||
log_info(plfDrive, "Mounting %s at %c:\\", volume->m_Name, cMountPoint);
|
log_info(plfDrive, "Mounting %s at %c:\\", volume->m_Name, cMountPoint);
|
||||||
volume->m_MountPoint = cMountPoint;
|
volume->m_MountPoint = cMountPoint;
|
||||||
@ -206,6 +215,32 @@ BOOL WINAPI FakeSetVolumeMountPointA(LPCSTR lpszVolumeMountPoint, LPCSTR lpszVol
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL WINAPI FakeDefineDosDeviceA(DWORD dwFlags, LPCSTR lpDeviceName, LPCSTR lpTargetPath) {
|
||||||
|
disk_volume_t* volume = NULL;
|
||||||
|
if (dwFlags & DDD_REMOVE_DEFINITION) {
|
||||||
|
if (dwFlags & DDD_EXACT_MATCH_ON_REMOVE) {
|
||||||
|
volume = getVolumeByPath(lpTargetPath, VOL_MATCH_PATH);
|
||||||
|
} else {
|
||||||
|
volume = getVolumeByPath(lpDeviceName, VOL_MATCH_ALL);
|
||||||
|
}
|
||||||
|
if (!volume) {
|
||||||
|
log_trace(plfDrive, "DDDA-: Unmatched: %s | %s", lpTargetPath, lpDeviceName);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
volume->m_MountPoint = '\0';
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
volume = getVolumeByPath(lpTargetPath, VOL_MATCH_ALL);
|
||||||
|
if (!volume) {
|
||||||
|
log_error(plfDrive, "DDDA+: Unmatched: %s | %s", lpTargetPath, lpDeviceName);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
volume->m_MountPoint = lpDeviceName[0]; // Awful? Yes.
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
DWORD WINAPI FakeQueryDosDeviceA(LPCSTR lpDeviceName, LPSTR lpTargetPath, DWORD ucchMax) {
|
DWORD WINAPI FakeQueryDosDeviceA(LPCSTR lpDeviceName, LPSTR lpTargetPath, DWORD ucchMax) {
|
||||||
log_warning(plfDrive, "QueryDosDeviceA(%s, -, %d)", lpDeviceName, ucchMax);
|
log_warning(plfDrive, "QueryDosDeviceA(%s, -, %d)", lpDeviceName, ucchMax);
|
||||||
if (lpDeviceName != NULL) {
|
if (lpDeviceName != NULL) {
|
||||||
@ -338,8 +373,8 @@ BOOL WINAPI FakeGetDiskFreeSpaceExA(LPCSTR lpDirectoryName,
|
|||||||
// return FALSE;
|
// return FALSE;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// We're going to be remapping the drive to ./mice/dev/, so the free bytes are whatever the current
|
// We're going to be remapping the drive to ./mice/dev/, so the free bytes are whatever the
|
||||||
// real drive has free. No point claiming we have more than we do!
|
// current real drive has free. No point claiming we have more than we do!
|
||||||
return TrueGetDiskFreeSpaceExA(NULL, lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes,
|
return TrueGetDiskFreeSpaceExA(NULL, lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes,
|
||||||
lpTotalNumberOfFreeBytes);
|
lpTotalNumberOfFreeBytes);
|
||||||
}
|
}
|
||||||
|
@ -293,13 +293,48 @@ DWORD WINAPI FakeGetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize) {
|
|||||||
return file_hook->GetFileSizeEx(&(pHData->ctx), lpFileSize);
|
return file_hook->GetFileSizeEx(&(pHData->ctx), lpFileSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CHAR stdoutBuffer[256];
|
||||||
|
DWORD stdoutCount = 0;
|
||||||
|
CHAR stderrBuffer[256];
|
||||||
|
DWORD stderrCount = 0;
|
||||||
DWORD WINAPI FakeWriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
|
DWORD WINAPI FakeWriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
|
||||||
LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped) {
|
LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped) {
|
||||||
if (hFile == GetStdHandle(STD_OUTPUT_HANDLE) || hFile == GetStdHandle(STD_ERROR_HANDLE)) {
|
if (hFile == GetStdHandle(STD_OUTPUT_HANDLE)) {
|
||||||
return TrueWriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten,
|
for (DWORD_PTR i = 0; i < nNumberOfBytesToWrite; i++) {
|
||||||
lpOverlapped);
|
stdoutBuffer[stdoutCount] = ((CHAR*)lpBuffer)[i];
|
||||||
|
if (stdoutBuffer[stdoutCount] == '\n' || stdoutBuffer[stdoutCount] == '\r') {
|
||||||
|
if (stdoutCount) log_game(plfStdout, "%.*s", stdoutCount, stdoutBuffer);
|
||||||
|
stdoutCount = 0;
|
||||||
|
} else if (stdoutCount == _countof(stdoutBuffer)) {
|
||||||
|
log_game(plfStdout, "%.*s", _countof(stdoutBuffer), stdoutBuffer);
|
||||||
|
stdoutCount = 0;
|
||||||
|
} else {
|
||||||
|
stdoutCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
} else if (hFile == GetStdHandle(STD_ERROR_HANDLE)) {
|
||||||
|
for (DWORD_PTR i = 0; i < nNumberOfBytesToWrite; i++) {
|
||||||
|
stderrBuffer[stderrCount] = ((CHAR*)lpBuffer)[i];
|
||||||
|
if (stderrBuffer[stderrCount] == '\n' || stderrBuffer[stderrCount] == '\r') {
|
||||||
|
if (stderrCount) log_game(plfStderr, "%.*s", stderrCount, stderrBuffer);
|
||||||
|
stderrCount = 0;
|
||||||
|
} else if (stderrCount == _countof(stderrBuffer) - 1) {
|
||||||
|
log_game(plfStderr, "%.*s", _countof(stderrBuffer), stderrBuffer);
|
||||||
|
stderrCount = 0;
|
||||||
|
} else {
|
||||||
|
stderrCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if (hFile == GetStdHandle(STD_OUTPUT_HANDLE) || hFile == GetStdHandle(STD_ERROR_HANDLE)) {
|
||||||
|
// log_game(plfFile, "Temp STDIO %.*s", nNumberOfBytesToWrite, lpBuffer);
|
||||||
|
// return TrueWriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten,
|
||||||
|
// lpOverlapped);
|
||||||
|
// }
|
||||||
|
|
||||||
open_hook_t* pHData = GetDataForHandle(hFile);
|
open_hook_t* pHData = GetDataForHandle(hFile);
|
||||||
if (pHData == NULL) {
|
if (pHData == NULL) {
|
||||||
return TrueWriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten,
|
return TrueWriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten,
|
||||||
|
@ -104,6 +104,7 @@ extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam
|
|||||||
HWND mainWindow = NULL;
|
HWND mainWindow = NULL;
|
||||||
|
|
||||||
static unsigned int hookType;
|
static unsigned int hookType;
|
||||||
|
static IDirect3DDevice9* g_pd3dDevice = NULL;
|
||||||
|
|
||||||
static HWND window;
|
static HWND window;
|
||||||
BOOL CALLBACK EnumWindowsCallback(HWND handle, LPARAM lParam) {
|
BOOL CALLBACK EnumWindowsCallback(HWND handle, LPARAM lParam) {
|
||||||
@ -178,7 +179,7 @@ BOOL UnadjustWindowRect(LPRECT prc, DWORD dwStyle, BOOL fMenu) {
|
|||||||
return fRc;
|
return fRc;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL GetD3D9Device(void** pTable, size_t Size) {
|
BOOL GetD3D9Device(IDirect3DDevice9Vtbl* pTable, size_t Size) {
|
||||||
if (!pTable) return false;
|
if (!pTable) return false;
|
||||||
|
|
||||||
IDirect3D9* pD3D =
|
IDirect3D9* pD3D =
|
||||||
@ -214,7 +215,9 @@ BOOL GetD3D9Device(void** pTable, size_t Size) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT(WINAPI* TrueEndScene)(IDirect3DDevice9*);
|
static STDMETHOD(TruePresent)(IDirect3DDevice9* This, CONST RECT* pSourceRect,
|
||||||
|
CONST RECT* pDestRect, HWND hDestWindowOverride,
|
||||||
|
CONST RGNDATA* pDirtyRegion);
|
||||||
|
|
||||||
void draw_rect(IDirect3DDevice9* dev, int x, int y, int w, int h, unsigned char r, unsigned char g,
|
void draw_rect(IDirect3DDevice9* dev, int x, int y, int w, int h, unsigned char r, unsigned char g,
|
||||||
unsigned char b) {
|
unsigned char b) {
|
||||||
@ -224,16 +227,22 @@ void draw_rect(IDirect3DDevice9* dev, int x, int y, int w, int h, unsigned char
|
|||||||
dev->lpVtbl->Clear(dev, 1, &BarRect, D3DCLEAR_TARGET | D3DCLEAR_TARGET, rectColor, 0, 0);
|
dev->lpVtbl->Clear(dev, 1, &BarRect, D3DCLEAR_TARGET | D3DCLEAR_TARGET, rectColor, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT __stdcall hkEndScene(IDirect3DDevice9* pDevice) {
|
HRESULT STDMETHODCALLTYPE hkPresent(IDirect3DDevice9* This, CONST RECT* pSourceRect,
|
||||||
static bool showMenu = false;
|
CONST RECT* pDestRect, HWND hDestWindowOverride,
|
||||||
|
CONST RGNDATA* pDirtyRegion) {
|
||||||
hookType = UI_HOOK_DX9;
|
hookType = UI_HOOK_DX9;
|
||||||
|
|
||||||
|
if (g_pd3dDevice != NULL) g_pd3dDevice->lpVtbl->BeginScene(g_pd3dDevice);
|
||||||
|
|
||||||
end_scene_hook_t* head = end_scene_hook_list;
|
end_scene_hook_t* head = end_scene_hook_list;
|
||||||
while (head != NULL) {
|
while (head != NULL) {
|
||||||
head->hook(hookType, pDevice);
|
head->hook(hookType, This);
|
||||||
head = head->next;
|
head = head->next;
|
||||||
}
|
}
|
||||||
return TrueEndScene(pDevice);
|
|
||||||
|
if (g_pd3dDevice != NULL) g_pd3dDevice->lpVtbl->EndScene(g_pd3dDevice);
|
||||||
|
|
||||||
|
return TruePresent(This, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);
|
||||||
}
|
}
|
||||||
|
|
||||||
void register_gui_hook(FnEndScene* end_scene) {
|
void register_gui_hook(FnEndScene* end_scene) {
|
||||||
@ -326,18 +335,18 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UIN
|
|||||||
|
|
||||||
void post_win_create(HWND hWnd) {
|
void post_win_create(HWND hWnd) {
|
||||||
// Don't double-hook!
|
// Don't double-hook!
|
||||||
if (TrueEndScene != NULL) return;
|
if (TruePresent != NULL) return;
|
||||||
|
|
||||||
mainWindow = hWnd;
|
mainWindow = hWnd;
|
||||||
|
|
||||||
if (hookType == UI_HOOK_DX9) {
|
if (hookType == UI_HOOK_DX9) {
|
||||||
void* d3d9Device[119];
|
IDirect3DDevice9Vtbl d3d9Device;
|
||||||
if (GetD3D9Device(d3d9Device, sizeof(d3d9Device))) {
|
if (GetD3D9Device(&d3d9Device, sizeof(d3d9Device))) {
|
||||||
TrueEndScene = d3d9Device[42];
|
TruePresent = d3d9Device.Present;
|
||||||
|
|
||||||
DetourTransactionBegin();
|
DetourTransactionBegin();
|
||||||
DetourUpdateThread(GetCurrentThread());
|
DetourUpdateThread(GetCurrentThread());
|
||||||
DetourAttach((PVOID*)&TrueEndScene, hkEndScene);
|
DetourAttach((PVOID*)&TruePresent, hkPresent);
|
||||||
DetourTransactionCommit();
|
DetourTransactionCommit();
|
||||||
}
|
}
|
||||||
// MiceInputInit will be called by our D3D9 hooks instead
|
// MiceInputInit will be called by our D3D9 hooks instead
|
||||||
@ -474,11 +483,13 @@ HRESULT STDMETHODCALLTYPE FakeCreateDevice(IDirect3D9* this, UINT Adapter, D3DDE
|
|||||||
IDirect3DDevice9** ppReturnedDeviceInterface) {
|
IDirect3DDevice9** ppReturnedDeviceInterface) {
|
||||||
if (MiceConfig.window.windowed) {
|
if (MiceConfig.window.windowed) {
|
||||||
pPresentationParameters->Windowed = TRUE;
|
pPresentationParameters->Windowed = TRUE;
|
||||||
pPresentationParameters->FullScreen_RefreshRateInHz = 0;
|
pPresentationParameters->PresentationInterval = D3DPRESENT_INTERVAL_ONE;
|
||||||
} else if (pPresentationParameters->Windowed) {
|
pPresentationParameters->FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
|
||||||
|
} else /* if (pPresentationParameters->Windowed) */ {
|
||||||
D3DDISPLAYMODE d3ddm;
|
D3DDISPLAYMODE d3ddm;
|
||||||
this->lpVtbl->GetAdapterDisplayMode(this, Adapter, &d3ddm);
|
this->lpVtbl->GetAdapterDisplayMode(this, Adapter, &d3ddm);
|
||||||
pPresentationParameters->Windowed = FALSE;
|
pPresentationParameters->Windowed = FALSE;
|
||||||
|
pPresentationParameters->PresentationInterval = D3DPRESENT_INTERVAL_ONE;
|
||||||
pPresentationParameters->FullScreen_RefreshRateInHz = d3ddm.RefreshRate;
|
pPresentationParameters->FullScreen_RefreshRateInHz = d3ddm.RefreshRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -520,6 +531,8 @@ HRESULT STDMETHODCALLTYPE FakeCreateDevice(IDirect3D9* this, UINT Adapter, D3DDE
|
|||||||
log_error(plfD3D9, "CreateDevice failed: %08x", res);
|
log_error(plfD3D9, "CreateDevice failed: %08x", res);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
g_pd3dDevice = *ppReturnedDeviceInterface;
|
||||||
}
|
}
|
||||||
log_info(plfD3D9, "Device created: %d", res);
|
log_info(plfD3D9, "Device created: %d", res);
|
||||||
|
|
||||||
|
@ -30,23 +30,34 @@ int WINAPIV Fakeprintf(const char* _Format, ...) {
|
|||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, _Format);
|
va_start(args, _Format);
|
||||||
|
|
||||||
int ret = vlog_game(plfPrintf, _Format, args);
|
int ret = vlog_game(plfStdout, _Format, args);
|
||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int WINAPIV Fakefprintf(FILE* _File, const char* _Format, ...) {
|
int WINAPIV Fakefprintf(FILE* _File, const char* _Format, ...) {
|
||||||
size_t flen = strlen(_Format);
|
|
||||||
if (flen == strcspn(_Format, "\n") + 1 && flen < (sizeof format_buf)) {
|
|
||||||
strcpy_s(format_buf, WORK_FORMAT_MAX, _Format);
|
|
||||||
format_buf[flen - 1] = 0;
|
|
||||||
_Format = format_buf;
|
|
||||||
}
|
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, _Format);
|
va_start(args, _Format);
|
||||||
|
int ret;
|
||||||
|
|
||||||
int ret = vlog_game(plfFprintf, _Format, args);
|
// log_game(plfStdout, "file: %d %p %p %p", _fileno(_File), _File, stdout, stderr);
|
||||||
|
// STDOUT_FILENO
|
||||||
|
// TODO: wtf.
|
||||||
|
_File = stdout;
|
||||||
|
|
||||||
|
if (_File != stdout && _File != stderr) {
|
||||||
|
// ret = vfprintf(_File, _Format, args);
|
||||||
|
ret = 0;
|
||||||
|
} else {
|
||||||
|
size_t flen = strlen(_Format);
|
||||||
|
if (flen == strcspn(_Format, "\n") + 1 && flen < (sizeof format_buf)) {
|
||||||
|
strcpy_s(format_buf, WORK_FORMAT_MAX, _Format);
|
||||||
|
format_buf[flen - 1] = 0;
|
||||||
|
_Format = format_buf;
|
||||||
|
}
|
||||||
|
ret = vlog_game(_File == stdout ? plfStdout : plfStderr, _Format, args);
|
||||||
|
}
|
||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -120,8 +120,18 @@ BOOL WINAPI FakeGetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode) {
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HINSTANCE WINAPI FakeShellExecuteA(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile,
|
||||||
|
LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd) {
|
||||||
|
MiceFSRedirectPathA(lpFile, &lpFile);
|
||||||
|
if (lpDirectory) MiceFSRedirectPathA(lpDirectory, &lpDirectory);
|
||||||
|
return TrueShellExecuteA(hwnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd);
|
||||||
|
}
|
||||||
|
|
||||||
void hook_processes() {
|
void hook_processes() {
|
||||||
hook("Kernel32.dll", "CreateProcessW", FakeCreateProcessW, (void**)&TrueCreateProcessW);
|
hook("Kernel32.dll", "CreateProcessW", FakeCreateProcessW, (void**)&TrueCreateProcessW);
|
||||||
hook("Kernel32.dll", "CreateProcessA", FakeCreateProcessA, (void**)&TrueCreateProcessA);
|
hook("Kernel32.dll", "CreateProcessA", FakeCreateProcessA, (void**)&TrueCreateProcessA);
|
||||||
hook("Kernel32.dll", "GetExitCodeProcess", FakeGetExitCodeProcess, NULL);
|
hook("Kernel32.dll", "GetExitCodeProcess", FakeGetExitCodeProcess, NULL);
|
||||||
|
// hook("Shell32.dll", "ShellExecuteA", FakeShellExecuteA, (void**)TrueShellExecuteA);
|
||||||
|
|
||||||
|
// TODO: ShellExecuteA
|
||||||
}
|
}
|
||||||
|
@ -15,5 +15,7 @@ static BOOL(WINAPI* TrueCreateProcessA)(LPCSTR lpApplicationName, LPSTR lpComman
|
|||||||
LPVOID lpEnvironment, LPCSTR lpCurrentDirectory,
|
LPVOID lpEnvironment, LPCSTR lpCurrentDirectory,
|
||||||
LPSTARTUPINFOW lpStartupInfo,
|
LPSTARTUPINFOW lpStartupInfo,
|
||||||
LPPROCESS_INFORMATION lpProcessInformation);
|
LPPROCESS_INFORMATION lpProcessInformation);
|
||||||
|
static HINSTANCE(WINAPI* TrueShellExecuteA)(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile,
|
||||||
|
LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);
|
||||||
|
|
||||||
void hook_processes();
|
void hook_processes();
|
||||||
|
@ -106,9 +106,11 @@ void hook_system() {
|
|||||||
// hook("User32.dll", "DeleteObject", FakeDeleteObject, NULL);
|
// hook("User32.dll", "DeleteObject", FakeDeleteObject, NULL);
|
||||||
|
|
||||||
const char* SystemVersion = "00691001\r\n";
|
const char* SystemVersion = "00691001\r\n";
|
||||||
|
const char* DefaultSystemVersion = "00000303\r\n";
|
||||||
const char* UpdateVersion = "0000\r\n";
|
const char* UpdateVersion = "0000\r\n";
|
||||||
|
|
||||||
HANDLE hGM = CreateFileA("GrooveMaster.ini", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
|
HANDLE hGM = CreateFileA("GrooveMaster.ini", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
|
||||||
|
0, NULL);
|
||||||
BOOL bGmIs1P = FALSE;
|
BOOL bGmIs1P = FALSE;
|
||||||
if (hGM != INVALID_HANDLE_VALUE) {
|
if (hGM != INVALID_HANDLE_VALUE) {
|
||||||
CHAR line[256];
|
CHAR line[256];
|
||||||
@ -137,7 +139,7 @@ void hook_system() {
|
|||||||
if (bGmIs1P) {
|
if (bGmIs1P) {
|
||||||
const char* GrooveMaster1P =
|
const char* GrooveMaster1P =
|
||||||
("# TODO: Get maimai_deliver not rebooting the cab\r\n"
|
("# TODO: Get maimai_deliver not rebooting the cab\r\n"
|
||||||
"NO_DELIVER 1\r\n"
|
// "NO_DELIVER 1\r\n"
|
||||||
"# TODO: figure out how to do this without also needing a USB\r\n"
|
"# TODO: figure out how to do this without also needing a USB\r\n"
|
||||||
"USB_DL_DISABLE 1\r\n"
|
"USB_DL_DISABLE 1\r\n"
|
||||||
"# These are just easier to do via GM than a patch\r\n"
|
"# These are just easier to do via GM than a patch\r\n"
|
||||||
@ -149,14 +151,14 @@ void hook_system() {
|
|||||||
} else {
|
} else {
|
||||||
const char* GrooveMaster =
|
const char* GrooveMaster =
|
||||||
("# TODO: Get maimai_deliver not rebooting the cab\r\n"
|
("# TODO: Get maimai_deliver not rebooting the cab\r\n"
|
||||||
"NO_DELIVER 1\r\n"
|
// "NO_DELIVER 1\r\n"
|
||||||
"# TODO: figure out how to do this without also needing a USB\r\n"
|
"# TODO: figure out how to do this without also needing a USB\r\n"
|
||||||
"USB_DL_DISABLE 1\r\n"
|
"USB_DL_DISABLE 1\r\n"
|
||||||
"# These are just easier to do via GM than a patch\r\n"
|
"# These are just easier to do via GM than a patch\r\n"
|
||||||
"NO_REBOOT 1\r\n"
|
"NO_REBOOT 1\r\n"
|
||||||
"ROTATE 1\r\n");
|
"ROTATE 1\r\n");
|
||||||
hook_file_with_buffer(L"GrooveMaster.ini", (LPBYTE)GrooveMaster,
|
hook_file_with_buffer(L"GrooveMaster.ini", (LPBYTE)GrooveMaster, strlen(GrooveMaster) + 1,
|
||||||
strlen(GrooveMaster) + 1, GENERIC_READ);
|
GENERIC_READ);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* RingmasterPub =
|
const char* RingmasterPub =
|
||||||
@ -172,6 +174,8 @@ void hook_system() {
|
|||||||
// more generic.
|
// more generic.
|
||||||
hook_file_with_buffer(L"C:\\System\\SystemVersion.txt", (LPBYTE)SystemVersion,
|
hook_file_with_buffer(L"C:\\System\\SystemVersion.txt", (LPBYTE)SystemVersion,
|
||||||
strlen(SystemVersion) + 1, GENERIC_READ);
|
strlen(SystemVersion) + 1, GENERIC_READ);
|
||||||
|
hook_file_with_buffer(L"C:\\System\\DefaultSystemVersion.txt", (LPBYTE)DefaultSystemVersion,
|
||||||
|
strlen(DefaultSystemVersion) + 1, GENERIC_READ);
|
||||||
hook_file_with_buffer(L"C:\\System\\UpdateVersion.txt", (LPBYTE)UpdateVersion,
|
hook_file_with_buffer(L"C:\\System\\UpdateVersion.txt", (LPBYTE)UpdateVersion,
|
||||||
strlen(UpdateVersion) + 1, GENERIC_READ);
|
strlen(UpdateVersion) + 1, GENERIC_READ);
|
||||||
hook_file_with_buffer(L"c:\\System\\Execute\\ringmaster_pub.pem", (LPBYTE)RingmasterPub,
|
hook_file_with_buffer(L"c:\\System\\Execute\\ringmaster_pub.pem", (LPBYTE)RingmasterPub,
|
||||||
|
@ -351,7 +351,7 @@ BOOL MiceFSRedirectPathA(LPCSTR lpFilename, LPCSTR* pszRedirected) {
|
|||||||
|
|
||||||
MultiByteToWideChar(0, 0, _redirected_path, -1, szwPath, _countof(szwPath));
|
MultiByteToWideChar(0, 0, _redirected_path, -1, szwPath, _countof(szwPath));
|
||||||
|
|
||||||
if (FileExistsW(szwPath)) {
|
if (FileOrFolderExistsW(szwPath)) {
|
||||||
MiceReleaseLockShared(miceFsLockCount);
|
MiceReleaseLockShared(miceFsLockCount);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -414,7 +414,7 @@ BOOL MiceFSDebugTraceRedirectPathA(LPCSTR lpFilename, LPCSTR* pszRedirected) {
|
|||||||
MultiByteToWideChar(0, 0, _redirected_path, -1, szwPath, _countof(szwPath));
|
MultiByteToWideChar(0, 0, _redirected_path, -1, szwPath, _countof(szwPath));
|
||||||
|
|
||||||
printf("-> %s\n", _redirected_path);
|
printf("-> %s\n", _redirected_path);
|
||||||
if (FileExistsW(szwPath)) {
|
if (FileOrFolderExistsW(szwPath)) {
|
||||||
MiceReleaseLockShared(miceFsLockCount);
|
MiceReleaseLockShared(miceFsLockCount);
|
||||||
printf(":: Redirect ended with valid redirection found.");
|
printf(":: Redirect ended with valid redirection found.");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "hook.h"
|
#include "hook.h"
|
||||||
|
|
||||||
|
BOOL FileOrFolderExistsW(const wchar_t* szPath);
|
||||||
BOOL FileExistsW(const wchar_t* szPath);
|
BOOL FileExistsW(const wchar_t* szPath);
|
||||||
BOOL FileExistsA(const char* szPath);
|
BOOL FileExistsA(const char* szPath);
|
||||||
PVOID GetDataForHandle(HANDLE hObject);
|
PVOID GetDataForHandle(HANDLE hObject);
|
||||||
|
@ -31,6 +31,10 @@ void PrintStack(void) {
|
|||||||
free(symbol);
|
free(symbol);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL FileOrFolderExistsW(const wchar_t* szPath) {
|
||||||
|
DWORD dwAttrib = _GetFileAttributesW(szPath);
|
||||||
|
return (dwAttrib != INVALID_FILE_ATTRIBUTES);
|
||||||
|
}
|
||||||
BOOL FileExistsW(const wchar_t* szPath) {
|
BOOL FileExistsW(const wchar_t* szPath) {
|
||||||
DWORD dwAttrib = _GetFileAttributesW(szPath);
|
DWORD dwAttrib = _GetFileAttributesW(szPath);
|
||||||
return (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
|
return (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
|
||||||
|
@ -20,6 +20,7 @@ executable(
|
|||||||
dummyinstaller,
|
dummyinstaller,
|
||||||
dummygdeliver,
|
dummygdeliver,
|
||||||
dummynetwork,
|
dummynetwork,
|
||||||
|
dummystorage,
|
||||||
|
|
||||||
amSerialId,
|
amSerialId,
|
||||||
],
|
],
|
||||||
|
@ -9,6 +9,7 @@ spawn_t mxspawns[] = {
|
|||||||
{ "installer", SPAWN_DUMMY, MdiThreadProc, NULL },
|
{ "installer", SPAWN_DUMMY, MdiThreadProc, NULL },
|
||||||
{ "network", SPAWN_DUMMY, MdnThreadProc, NULL },
|
{ "network", SPAWN_DUMMY, MdnThreadProc, NULL },
|
||||||
{ "gdeliver", SPAWN_DUMMY, MdgdThreadProc, NULL },
|
{ "gdeliver", SPAWN_DUMMY, MdgdThreadProc, NULL },
|
||||||
|
{ "storage", SPAWN_DUMMY, MdsThreadProc, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
int mxkMain();
|
int mxkMain();
|
||||||
@ -17,6 +18,7 @@ int miceDummyMaster(unsigned short textPort, unsigned short binaryPort, bool glo
|
|||||||
int miceDummyInstaller(unsigned short textPort, unsigned short binaryPort, bool global);
|
int miceDummyInstaller(unsigned short textPort, unsigned short binaryPort, bool global);
|
||||||
int miceDummyNetwork(unsigned short textPort, unsigned short binaryPort, bool global);
|
int miceDummyNetwork(unsigned short textPort, unsigned short binaryPort, bool global);
|
||||||
int miceDummyGDeliver(unsigned short textPort, unsigned short binaryPort, bool global);
|
int miceDummyGDeliver(unsigned short textPort, unsigned short binaryPort, bool global);
|
||||||
|
int miceDummyStorage(unsigned short textPort, unsigned short binaryPort, bool global);
|
||||||
DWORD WINAPI MdkThreadProc(LPVOID lpParameter) {
|
DWORD WINAPI MdkThreadProc(LPVOID lpParameter) {
|
||||||
miceDummyKeychip(40106, 40107, false);
|
miceDummyKeychip(40106, 40107, false);
|
||||||
return 0;
|
return 0;
|
||||||
@ -41,6 +43,10 @@ DWORD WINAPI MdgdThreadProc(LPVOID lpParameter) {
|
|||||||
miceDummyGDeliver(40108, 40112, false);
|
miceDummyGDeliver(40108, 40112, false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
DWORD WINAPI MdsThreadProc(LPVOID lpParameter) {
|
||||||
|
miceDummyStorage(40114, 40115, false);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void spawn_one(spawn_t* spawn) {
|
static inline void spawn_one(spawn_t* spawn) {
|
||||||
if (spawn->mode == SPAWN_NONE) {
|
if (spawn->mode == SPAWN_NONE) {
|
||||||
|
@ -12,7 +12,7 @@ typedef struct {
|
|||||||
#define SPAWN_REAL 2
|
#define SPAWN_REAL 2
|
||||||
#define SPAWN_BOTH (SPAWN_DUMMY | SPAWN_REAL)
|
#define SPAWN_BOTH (SPAWN_DUMMY | SPAWN_REAL)
|
||||||
|
|
||||||
extern spawn_t mxspawns[5];
|
extern spawn_t mxspawns[6];
|
||||||
|
|
||||||
DWORD WINAPI MxkThreadProc(LPVOID lpParameter);
|
DWORD WINAPI MxkThreadProc(LPVOID lpParameter);
|
||||||
DWORD WINAPI MdkThreadProc(LPVOID lpParameter);
|
DWORD WINAPI MdkThreadProc(LPVOID lpParameter);
|
||||||
@ -20,5 +20,6 @@ DWORD WINAPI MdmThreadProc(LPVOID lpParameter);
|
|||||||
DWORD WINAPI MdiThreadProc(LPVOID lpParameter);
|
DWORD WINAPI MdiThreadProc(LPVOID lpParameter);
|
||||||
DWORD WINAPI MdnThreadProc(LPVOID lpParameter);
|
DWORD WINAPI MdnThreadProc(LPVOID lpParameter);
|
||||||
DWORD WINAPI MdgdThreadProc(LPVOID lpParameter);
|
DWORD WINAPI MdgdThreadProc(LPVOID lpParameter);
|
||||||
|
DWORD WINAPI MdsThreadProc(LPVOID lpParameter);
|
||||||
|
|
||||||
void spawn_pcp_processes(void);
|
void spawn_pcp_processes(void);
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
#ifndef MICE_VERSION
|
||||||
|
#define MICE_VERSION "Unk"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define AM_LIB_C_HEADER(name, storage_type) \
|
#define AM_LIB_C_HEADER(name, storage_type) \
|
||||||
int name##DebugLevel = 0; \
|
int name##DebugLevel = 0; \
|
||||||
struct storage_type name; \
|
struct storage_type name; \
|
||||||
|
@ -4,3 +4,4 @@
|
|||||||
#include "amOemstring.h"
|
#include "amOemstring.h"
|
||||||
#include "amPlatform.h"
|
#include "amPlatform.h"
|
||||||
#include "amSram.h"
|
#include "amSram.h"
|
||||||
|
#include "amLog.h"
|
||||||
|
407
src/micetools/lib/am/amBackup.c
Normal file
407
src/micetools/lib/am/amBackup.c
Normal file
@ -0,0 +1,407 @@
|
|||||||
|
#include "amBackup.h"
|
||||||
|
|
||||||
|
#include "../ami/amiCrc.h"
|
||||||
|
#include "../ami/amiDebug.h"
|
||||||
|
|
||||||
|
AM_LIB_C_HEADER(amBackup, AM_BACKUP)
|
||||||
|
|
||||||
|
AM_BACKUP_STATUS amBackupInit(void) {
|
||||||
|
if (amBackup.m_Init) return AM_BACKUP_STATUS_ALREADY_INIT;
|
||||||
|
|
||||||
|
ZeroMemory(&amBackup, sizeof amBackup);
|
||||||
|
amiCrc32RCreateTable(amBackup.m_CrcTable);
|
||||||
|
|
||||||
|
amBackup.m_Init = TRUE;
|
||||||
|
return AM_BACKUP_STATUS_OK;
|
||||||
|
}
|
||||||
|
AM_BACKUP_STATUS amBackupExit(void) {
|
||||||
|
if (!amBackup.m_Init) return AM_BACKUP_STATUS_NO_INIT;
|
||||||
|
ZeroMemory(&amBackup, sizeof amBackup);
|
||||||
|
return AM_BACKUP_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL amBackupValidateAddress(AM_PLATFORM_NV_DEVICE_CONFIG *lpConfig, DWORD wAddress,
|
||||||
|
WORD wCount) {
|
||||||
|
if (lpConfig == NULL) return FALSE;
|
||||||
|
if (wAddress < lpConfig->m_Base) return FALSE;
|
||||||
|
if (wAddress + wCount > lpConfig->m_Base + lpConfig->m_Size) return FALSE;
|
||||||
|
|
||||||
|
DWORD mask = lpConfig->m_BlockSize - 1;
|
||||||
|
if ((wAddress & mask) != 0) return FALSE;
|
||||||
|
if ((wCount & mask) != 0) return FALSE;
|
||||||
|
|
||||||
|
if (wCount > lpConfig->m_Size) return FALSE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
AM_BACKUP_STATUS amBackupWrite(AM_PLATFORM_NV_DEVICE_CONFIG *lpConfig, LPVOID lpBuffer,
|
||||||
|
WORD wAddress, WORD wCount) {
|
||||||
|
if (amBackup.m_Init == 0) return AM_BACKUP_STATUS_NO_INIT;
|
||||||
|
if (lpConfig == NULL || lpBuffer == NULL) return AM_BACKUP_STATUS_INVALID_PARAM;
|
||||||
|
|
||||||
|
if (!amBackupValidateAddress(lpConfig, wAddress, wCount)) {
|
||||||
|
if (amBackupDebugLevel > 0) amiDebugLog("invalid address.");
|
||||||
|
return AM_BACKUP_STATUS_INVALID_ADDR;
|
||||||
|
}
|
||||||
|
if (lpConfig->m_WriteFunc == NULL) {
|
||||||
|
if (amBackupDebugLevel > 0) amiDebugLog("No Write Function Error!.");
|
||||||
|
return AM_BACKUP_STATUS_INVALID_STORAGE;
|
||||||
|
}
|
||||||
|
return (lpConfig->m_WriteFunc)(wAddress, lpBuffer, wCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
AM_BACKUP_STATUS amBackupRecordCheckValid(AM_BACKUP_RECORD *lpConfig, LPVOID lpBuffer) {
|
||||||
|
if (!amBackup.m_Init) return AM_BACKUP_STATUS_NO_INIT;
|
||||||
|
if (lpConfig == NULL || lpBuffer == NULL) return AM_BACKUP_STATUS_INVALID_PARAM;
|
||||||
|
|
||||||
|
LPDWORD bufferAsDW = (LPDWORD)lpBuffer;
|
||||||
|
|
||||||
|
if (lpConfig->m_bHasCrc) {
|
||||||
|
DWORD calcCrc =
|
||||||
|
amiCrc32RGet(amBackup.m_CrcTable, lpConfig->m_wCount - 4, bufferAsDW + 1, 0);
|
||||||
|
if (calcCrc != bufferAsDW[0]) {
|
||||||
|
if (amBackupDebugLevel > 0)
|
||||||
|
amiDebugLog("crc error. NewCrc=%08X OrgCrc=%08X", calcCrc, bufferAsDW[0]);
|
||||||
|
return AM_BACKUP_STATUS_BAD_CRC;
|
||||||
|
}
|
||||||
|
bufferAsDW++;
|
||||||
|
}
|
||||||
|
if (lpConfig->m_bHasID) {
|
||||||
|
if (*(LPDWORD)(lpConfig->m_sID) != bufferAsDW[0]) {
|
||||||
|
if (amBackupDebugLevel > 0)
|
||||||
|
amiDebugLog("id error. NewId=%08x OrgId=%08x", *(LPDWORD)lpConfig->m_sID,
|
||||||
|
bufferAsDW[0]);
|
||||||
|
return AM_BACKUP_STATUS_BAD_ID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return AM_BACKUP_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
AM_BACKUP_STATUS amBackupRead(AM_PLATFORM_NV_DEVICE_CONFIG *lpConfig, WORD wAddress,
|
||||||
|
LPVOID lpBuffer, WORD wCount) {
|
||||||
|
if (!amBackup.m_Init) return AM_BACKUP_STATUS_NO_INIT;
|
||||||
|
if (lpConfig == NULL || lpBuffer == NULL) return AM_BACKUP_STATUS_INVALID_PARAM;
|
||||||
|
|
||||||
|
if (!amBackupValidateAddress(lpConfig, wAddress, wCount)) {
|
||||||
|
if (amBackupDebugLevel > 0) amiDebugLog("invalid address.");
|
||||||
|
return AM_BACKUP_STATUS_INVALID_ADDR;
|
||||||
|
}
|
||||||
|
if (lpConfig->m_ReadFunc == NULL) {
|
||||||
|
if (amBackupDebugLevel > 0) amiDebugLog("No Read Function Error!.");
|
||||||
|
return AM_BACKUP_STATUS_INVALID_STORAGE;
|
||||||
|
}
|
||||||
|
return (lpConfig->m_ReadFunc)(wAddress, lpBuffer, wCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
AM_BACKUP_STATUS amBackupRecordRead(AM_BACKUP_RECORD *lpConfig, LPVOID lpBuffer) {
|
||||||
|
if (!amBackup.m_Init) return AM_BACKUP_STATUS_NO_INIT;
|
||||||
|
if (lpConfig == NULL || lpBuffer == NULL) return AM_BACKUP_STATUS_INVALID_PARAM;
|
||||||
|
|
||||||
|
AM_PLATFORM_NV_DEVICE_CONFIG *device = amPlatformGetNvDevice(lpConfig->m_Device);
|
||||||
|
if (device == NULL) return AM_BACKUP_STATUS_NO_DEVICE;
|
||||||
|
|
||||||
|
int err = amBackupRead(device, lpConfig->m_wAddress, lpBuffer, lpConfig->m_wCount);
|
||||||
|
if (err < 0) return err;
|
||||||
|
|
||||||
|
err = amBackupRecordCheckValid(lpConfig, lpBuffer);
|
||||||
|
return err >= 0 ? AM_BACKUP_STATUS_OK : err;
|
||||||
|
}
|
||||||
|
|
||||||
|
AM_BACKUP_STATUS amBackupRecordReadDup(AM_BACKUP_RECORD *lpConfig, LPVOID lpBuffer) {
|
||||||
|
if (!amBackup.m_Init) return AM_BACKUP_STATUS_NO_INIT;
|
||||||
|
if (lpConfig == NULL || lpBuffer == NULL) return AM_BACKUP_STATUS_INVALID_PARAM;
|
||||||
|
|
||||||
|
int err = amBackupRecordRead(lpConfig, lpBuffer);
|
||||||
|
if (err > -1) return AM_BACKUP_STATUS_OK;
|
||||||
|
|
||||||
|
if (err < -19) {
|
||||||
|
err = amBackupRecordRead(lpConfig + 1, lpBuffer);
|
||||||
|
if (-1 < err) return amBackupRecordWrite(lpConfig, lpBuffer);
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
AM_BACKUP_STATUS amBackupRecordValidate(AM_BACKUP_RECORD *lpConfig, LPVOID lpBuffer) {
|
||||||
|
if (!amBackup.m_Init) return AM_BACKUP_STATUS_NO_INIT;
|
||||||
|
if (lpConfig == NULL || lpBuffer == NULL) return AM_BACKUP_STATUS_INVALID_PARAM;
|
||||||
|
|
||||||
|
LPBYTE lpData = (LPBYTE)lpBuffer;
|
||||||
|
WORD wCount = lpConfig->m_wCount;
|
||||||
|
if (lpConfig->m_bHasCrc) {
|
||||||
|
wCount -= 4;
|
||||||
|
lpData += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lpConfig->m_bHasID) {
|
||||||
|
*((LPDWORD)lpData) = *(LPDWORD)lpConfig->m_sID;
|
||||||
|
lpData += 4;
|
||||||
|
wCount -= 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lpConfig->m_bHasCrc) {
|
||||||
|
*((LPDWORD)lpBuffer) = amiCrc32RGet(amBackup.m_CrcTable, wCount, lpData, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return AM_BACKUP_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
AM_BACKUP_STATUS amBackupRecordWrite(AM_BACKUP_RECORD *lpConfig, LPVOID lpBuffer) {
|
||||||
|
if (!amBackup.m_Init) return AM_BACKUP_STATUS_NO_INIT;
|
||||||
|
if (lpConfig == NULL || lpBuffer == NULL) return AM_BACKUP_STATUS_INVALID_PARAM;
|
||||||
|
|
||||||
|
AM_PLATFORM_NV_DEVICE_CONFIG *device = amPlatformGetNvDevice(lpConfig->m_Device);
|
||||||
|
if (device == NULL) return AM_BACKUP_STATUS_NO_DEVICE;
|
||||||
|
|
||||||
|
int err = amBackupRecordValidate(lpConfig, lpBuffer);
|
||||||
|
if (err < 0) return err;
|
||||||
|
|
||||||
|
err = amBackupWrite(device, lpBuffer, lpConfig->m_wAddress, lpConfig->m_wCount);
|
||||||
|
return err >= 0 ? AM_BACKUP_STATUS_OK : err;
|
||||||
|
}
|
||||||
|
|
||||||
|
AM_BACKUP_STATUS amBackupRecordWriteDup(AM_BACKUP_RECORD *lpConfig, LPVOID lpBuffer) {
|
||||||
|
if (!amBackup.m_Init) return AM_BACKUP_STATUS_NO_INIT;
|
||||||
|
if (lpConfig == NULL || lpBuffer == NULL) return AM_BACKUP_STATUS_INVALID_PARAM;
|
||||||
|
|
||||||
|
int err = amBackupRecordWrite(&(lpConfig[1]), lpBuffer);
|
||||||
|
if (err + 19 <= 18) return err;
|
||||||
|
|
||||||
|
return amBackupRecordWrite(&(lpConfig[0]), lpBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
static AM_BACKUP_RECORD _amBackupStructs[12][2] = {
|
||||||
|
// AM_BACKUP_RECORD_STATIC
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x000,
|
||||||
|
.m_wCount = 0x20,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x200,
|
||||||
|
.m_wCount = 0x20,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// AM_BACKUP_RECORD_CREDIT
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x020,
|
||||||
|
.m_wCount = 0x20,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x220,
|
||||||
|
.m_wCount = 0x20,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// AM_BACKUP_RECORD_NETWORK_ETH0
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x040,
|
||||||
|
.m_wCount = 0x20,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x240,
|
||||||
|
.m_wCount = 0x20,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// AM_BACKUP_RECORD_NETWORK_ETH1
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x060,
|
||||||
|
.m_wCount = 0x20,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x260,
|
||||||
|
.m_wCount = 0x20,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// AM_BACKUP_RECORD_HISTORY
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x080,
|
||||||
|
.m_wCount = 0x10,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x280,
|
||||||
|
.m_wCount = 0x10,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// AM_BACKUP_RECORD_ALPB_CARD_ID
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x090,
|
||||||
|
.m_wCount = 0x10,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x290,
|
||||||
|
.m_wCount = 0x10,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// AM_BACKUP_RECORD_ALPB_COMPUTER_NAME
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x0a0,
|
||||||
|
.m_wCount = 0x20,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x2a0,
|
||||||
|
.m_wCount = 0x20,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// AM_BACKUP_RECORD_BACKUP
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_SRAM,
|
||||||
|
.m_wAddress = 0x0000,
|
||||||
|
.m_wCount = 0x200,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_SRAM,
|
||||||
|
.m_wAddress = 0x1000,
|
||||||
|
.m_wCount = 0x200,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// AM_BACKUP_RECORD_HM_PEAK
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_SRAM,
|
||||||
|
.m_wAddress = 0x0200,
|
||||||
|
.m_wCount = 0x200,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_SRAM,
|
||||||
|
.m_wAddress = 0x1200,
|
||||||
|
.m_wCount = 0x200,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// AM_BACKUP_RECORD_TIMEZONE
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_SRAM,
|
||||||
|
.m_wAddress = 0x0400,
|
||||||
|
.m_wCount = 0x200,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_SRAM,
|
||||||
|
.m_wAddress = 0x1400,
|
||||||
|
.m_wCount = 0x200,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// AM_BACKUP_RECORD_ERROR_LOG
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_SRAM,
|
||||||
|
.m_wAddress = 0x0600,
|
||||||
|
.m_wCount = 0x200,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_SRAM,
|
||||||
|
.m_wAddress = 0x1600,
|
||||||
|
.m_wCount = 0x200,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// AM_BACKUP_RECORD_ALPB_DEV_CONFIG
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x0c0,
|
||||||
|
.m_wCount = 0x40,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.m_Device = AM_PLATFORM_NV_DEVICE_EEPROM,
|
||||||
|
.m_wAddress = 0x2c0,
|
||||||
|
.m_wCount = 0x40,
|
||||||
|
.m_bHasCrc = TRUE,
|
||||||
|
.m_bHasID = FALSE,
|
||||||
|
.m_sID = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
AM_BACKUP_RECORD *amBackupGetRecord(DWORD dwWhich) {
|
||||||
|
if (dwWhich < 12) return (AM_BACKUP_RECORD *)&(_amBackupStructs[dwWhich]);
|
||||||
|
return NULL;
|
||||||
|
}
|
@ -1,10 +1,67 @@
|
|||||||
void amBackupInit(void);
|
#pragma once
|
||||||
void amBackupExit(void);
|
|
||||||
void amBackupRead(void);
|
#include <Windows.h>
|
||||||
void amBackupRecordCheckValid(void);
|
#include <stdint.h>
|
||||||
void amBackupRecordReadDup(void);
|
|
||||||
void amBackupRecordWriteDup(void);
|
#include "../_am.h"
|
||||||
void amBackupRecordValidate(void);
|
#include "amPlatform.h"
|
||||||
void amBackupRecordWrite(void);
|
|
||||||
void amBackupRecordWriteDup(void);
|
AM_LIB_H_HEADER(amBackup, AM_BACKUP)
|
||||||
void amBackupWrite(void);
|
|
||||||
|
typedef struct AM_BACKUP {
|
||||||
|
BOOL m_Init;
|
||||||
|
uint32_t m_CrcTable[256];
|
||||||
|
} AM_BACKUP;
|
||||||
|
|
||||||
|
typedef enum AM_BACKUP_STATUS {
|
||||||
|
AM_BACKUP_STATUS_OK = 0,
|
||||||
|
AM_BACKUP_STATUS_NO_DEVICE = -21,
|
||||||
|
AM_BACKUP_STATUS_INVALID_ADDR = -22,
|
||||||
|
AM_BACKUP_STATUS_BAD_CRC = -23,
|
||||||
|
AM_BACKUP_STATUS_BAD_ID = -24,
|
||||||
|
AM_BACKUP_STATUS_INVALID_STORAGE = -25,
|
||||||
|
AM_BACKUP_STATUS_INVALID_PARAM = -27,
|
||||||
|
AM_BACKUP_STATUS_NO_INIT = -28,
|
||||||
|
AM_BACKUP_STATUS_ALREADY_INIT = -29,
|
||||||
|
} AM_BACKUP_STATUS;
|
||||||
|
|
||||||
|
typedef struct AM_BACKUP_RECORD {
|
||||||
|
AM_PLATFORM_NV_DEVICE m_Device;
|
||||||
|
WORD m_wAddress;
|
||||||
|
WORD m_wCount;
|
||||||
|
BOOL m_bHasCrc;
|
||||||
|
BOOL m_bHasID;
|
||||||
|
CHAR m_sID[4];
|
||||||
|
} AM_BACKUP_RECORD;
|
||||||
|
|
||||||
|
typedef enum AM_BACKUP_RECORD_N {
|
||||||
|
AM_BACKUP_RECORD_STATIC = 0,
|
||||||
|
AM_BACKUP_RECORD_CREDIT = 1,
|
||||||
|
AM_BACKUP_RECORD_NETWORK_ETH0 = 2,
|
||||||
|
AM_BACKUP_RECORD_NETWORK_ETH1 = 3,
|
||||||
|
AM_BACKUP_RECORD_HISTORY = 4,
|
||||||
|
AM_BACKUP_RECORD_ALPB_CARD_ID = 5,
|
||||||
|
AM_BACKUP_RECORD_ALPB_COMPUTER_NAME = 6,
|
||||||
|
AM_BACKUP_RECORD_BACKUP = 7,
|
||||||
|
AM_BACKUP_RECORD_HM_PEAK = 8,
|
||||||
|
AM_BACKUP_RECORD_TIMEZONE = 9,
|
||||||
|
AM_BACKUP_RECORD_ERROR_LOG = 10,
|
||||||
|
AM_BACKUP_RECORD_ALPB_DEV_CONFIG = 11,
|
||||||
|
} AM_BACKUP_RECORD_N;
|
||||||
|
|
||||||
|
AM_BACKUP_STATUS amBackupInit(void);
|
||||||
|
AM_BACKUP_STATUS amBackupExit(void);
|
||||||
|
|
||||||
|
AM_BACKUP_STATUS amBackupWrite(AM_PLATFORM_NV_DEVICE_CONFIG *lpConfig, LPVOID lpBuffer,
|
||||||
|
WORD wAddress, WORD wCount);
|
||||||
|
AM_BACKUP_STATUS amBackupRecordWrite(AM_BACKUP_RECORD *lpConfig, LPVOID lpBuffer);
|
||||||
|
AM_BACKUP_STATUS amBackupRecordWriteDup(AM_BACKUP_RECORD *lpConfig, LPVOID lpBuffer);
|
||||||
|
AM_BACKUP_STATUS amBackupRecordValidate(AM_BACKUP_RECORD *lpConfig, LPVOID lpBuffer);
|
||||||
|
|
||||||
|
AM_BACKUP_STATUS amBackupRead(AM_PLATFORM_NV_DEVICE_CONFIG *lpConfig, WORD wAddress,
|
||||||
|
LPVOID lpBuffer, WORD wCount);
|
||||||
|
AM_BACKUP_STATUS amBackupRecordRead(AM_BACKUP_RECORD *lpConfig, LPVOID lpBuffer);
|
||||||
|
AM_BACKUP_STATUS amBackupRecordReadDup(AM_BACKUP_RECORD *lpConfig, LPVOID lpBuffer);
|
||||||
|
AM_BACKUP_STATUS amBackupRecordCheckValid(AM_BACKUP_RECORD *lpConfig, LPVOID lpBuffer);
|
||||||
|
|
||||||
|
AM_BACKUP_RECORD *amBackupGetRecord(DWORD dwWhich);
|
||||||
|
@ -1,25 +1,27 @@
|
|||||||
#include "amCmos.h"
|
#include "amCmos.h"
|
||||||
|
|
||||||
|
#include "../mice/ioctl.h"
|
||||||
|
|
||||||
AM_LIB_C_HEADER(amCmos, AM_CMOS)
|
AM_LIB_C_HEADER(amCmos, AM_CMOS)
|
||||||
|
|
||||||
AM_CMOS_STATUS amCmosInit(AM_CMOS_CONFIG *lpConfig) {
|
AM_CMOS_STATUS amCmosInit(AM_PLATFORM_CMOS_PARAM *lpParam) {
|
||||||
if (amCmos.m_bInit != 0) return AM_CMOS_STATUS_ERR_ALREADY_INIT;
|
if (amCmos.m_bInit != 0) return AM_CMOS_STATUS_ERR_ALREADY_INIT;
|
||||||
if (lpConfig == NULL) return AM_CMOS_STATUS_ERR_INVALID_PARAM;
|
if (lpParam == NULL) return AM_CMOS_STATUS_ERR_INVALID_PARAM;
|
||||||
|
|
||||||
HANDLE hMutex = CreateMutexA(NULL, 0, "AM_CMOS_MUTEX");
|
HANDLE hMutex = CreateMutexA(NULL, 0, "AM_CMOS_MUTEX");
|
||||||
if (hMutex == NULL) return AM_CMOS_STATUS_ERR_SYS;
|
if (hMutex == NULL) return AM_CMOS_STATUS_ERR_SYS;
|
||||||
|
|
||||||
HANDLE hCmos = CreateFileA("\\\\.\\mxcmos", 0xc0000000, 3, NULL, 3, 0, NULL);
|
HANDLE hDriver = CreateFileA("\\\\.\\mxcmos", 0xc0000000, 3, NULL, 3, 0, NULL);
|
||||||
if (hCmos == INVALID_HANDLE_VALUE) {
|
if (hDriver == INVALID_HANDLE_VALUE) {
|
||||||
CloseHandle(hMutex);
|
CloseHandle(hMutex);
|
||||||
return AM_CMOS_STATUS_ERR_OPEN_FAILED;
|
return AM_CMOS_STATUS_ERR_OPEN_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
amCmos.m_bInit = TRUE;
|
amCmos.m_bInit = TRUE;
|
||||||
amCmos.m_hMutex = hMutex;
|
amCmos.m_hMutex = hMutex;
|
||||||
amCmos.m_hCmos = hCmos;
|
amCmos.m_hDriver = hDriver;
|
||||||
|
|
||||||
memcpy(&amCmos.m_Config, lpConfig, sizeof *lpConfig);
|
memcpy(&amCmos.m_Param, lpParam, sizeof *lpParam);
|
||||||
|
|
||||||
return AM_CMOS_STATUS_OK;
|
return AM_CMOS_STATUS_OK;
|
||||||
}
|
}
|
||||||
@ -31,29 +33,28 @@ AM_CMOS_STATUS amCmosExit(void) {
|
|||||||
CloseHandle(amCmos.m_hMutex);
|
CloseHandle(amCmos.m_hMutex);
|
||||||
amCmos.m_hMutex = NULL;
|
amCmos.m_hMutex = NULL;
|
||||||
}
|
}
|
||||||
if (amCmos.m_hCmos != INVALID_HANDLE_VALUE) {
|
if (amCmos.m_hDriver != INVALID_HANDLE_VALUE) {
|
||||||
CloseHandle(amCmos.m_hCmos);
|
CloseHandle(amCmos.m_hDriver);
|
||||||
amCmos.m_hCmos = INVALID_HANDLE_VALUE;
|
amCmos.m_hDriver = INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
amCmos.m_bInit = FALSE;
|
amCmos.m_bInit = FALSE;
|
||||||
return AM_CMOS_STATUS_OK;
|
return AM_CMOS_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
AM_CMOS_STATUS amCmosReadByteInRearpart(BYTE nIndex, LPBYTE lpData) {
|
AM_CMOS_STATUS amCmosReadByteInRearpart(BYTE addr, LPBYTE lpValue) {
|
||||||
if (amCmos.m_bInit == 0) return AM_CMOS_STATUS_ERR_NO_INIT;
|
if (amCmos.m_bInit == 0) return AM_CMOS_STATUS_ERR_NO_INIT;
|
||||||
|
if (lpValue == NULL || addr > 0x7f) return AM_CMOS_STATUS_ERR_INVALID_PARAM;
|
||||||
if (lpData == NULL || nIndex > 0x7f) return AM_CMOS_STATUS_ERR_INVALID_PARAM;
|
|
||||||
|
|
||||||
if (WaitForSingleObject(amCmos.m_hMutex, 0) != WAIT_OBJECT_0) return AM_CMOS_STATUS_ERR_LOCK;
|
if (WaitForSingleObject(amCmos.m_hMutex, 0) != WAIT_OBJECT_0) return AM_CMOS_STATUS_ERR_LOCK;
|
||||||
|
|
||||||
BYTE request[2];
|
BYTE request[2];
|
||||||
request[0] = nIndex;
|
request[0] = addr;
|
||||||
request[1] = 0;
|
request[1] = 0;
|
||||||
|
|
||||||
DWORD nBytesReturned;
|
DWORD nBytesReturned;
|
||||||
BOOL bErr = DeviceIoControl(amCmos.m_hCmos, IOCTL_MXCMOS_READ, request, sizeof request, lpData,
|
BOOL bErr = DeviceIoControl(amCmos.m_hDriver, IOCTL_MXCMOS_READ, request, sizeof request,
|
||||||
1, &nBytesReturned, NULL);
|
lpValue, 1, &nBytesReturned, NULL);
|
||||||
|
|
||||||
int iRet = 0;
|
int iRet = 0;
|
||||||
if (!bErr) {
|
if (!bErr) {
|
||||||
@ -69,3 +70,85 @@ AM_CMOS_STATUS amCmosReadByteInRearpart(BYTE nIndex, LPBYTE lpData) {
|
|||||||
}
|
}
|
||||||
return iRet;
|
return iRet;
|
||||||
}
|
}
|
||||||
|
AM_CMOS_STATUS amCmosWriteByteInRearpart(BYTE addr, BYTE value) {
|
||||||
|
if (amCmos.m_bInit == 0) return AM_CMOS_STATUS_ERR_NO_INIT;
|
||||||
|
if (addr > 0x7f) return AM_CMOS_STATUS_ERR_INVALID_PARAM;
|
||||||
|
|
||||||
|
if (WaitForSingleObject(amCmos.m_hMutex, 0) != WAIT_OBJECT_0) return AM_CMOS_STATUS_ERR_LOCK;
|
||||||
|
|
||||||
|
BYTE request[2];
|
||||||
|
request[0] = addr;
|
||||||
|
request[1] = value;
|
||||||
|
|
||||||
|
DWORD nBytesReturned;
|
||||||
|
BOOL bErr = DeviceIoControl(amCmos.m_hDriver, IOCTL_MXCMOS_READ, request, sizeof request,
|
||||||
|
NULL, 0, &nBytesReturned, NULL);
|
||||||
|
|
||||||
|
if (!ReleaseMutex(amCmos.m_hMutex)) {
|
||||||
|
if (amCmosDebugLevel > 0)
|
||||||
|
amiDebugLog("ReleaseMutex Error!! Error Code is %ld!!", GetLastError());
|
||||||
|
return AM_CMOS_STATUS_ERR_SYS;
|
||||||
|
}
|
||||||
|
return bErr ? AM_CMOS_STATUS_OK : AM_CMOS_STATUS_ERR_SYS;
|
||||||
|
}
|
||||||
|
|
||||||
|
AM_CMOS_STATUS amCmosSetPartition(BYTE addr, BYTE bitOffset, BYTE mbrCount, BYTE partition) {
|
||||||
|
if (!amCmos.m_bInit) return AM_CMOS_STATUS_ERR_NO_INIT;
|
||||||
|
if (partition > 4) return AM_CMOS_STATUS_ERR_INVALID_PARAM;
|
||||||
|
if (addr == 0 || bitOffset > 8) return AM_CMOS_STATUS_NG;
|
||||||
|
|
||||||
|
BYTE bValue;
|
||||||
|
AM_CMOS_STATUS err = amCmosReadByteInRearpart(addr, &bValue);
|
||||||
|
if (amCmosReadByteInRearpart(addr, &bValue)) {
|
||||||
|
if (amCmosDebugLevel >= 1) amiDebugLog("Error: amCmosReadByteInRearpart()");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (partition < mbrCount) partition += 5;
|
||||||
|
|
||||||
|
/*
|
||||||
|
parition range: 0, 1, 2, 3, 4, [5]
|
||||||
|
mbrCount values: 0, 1
|
||||||
|
|
||||||
|
-> if partition == 0 && mbrCount == 1 ::-> partition = 5
|
||||||
|
|
||||||
|
value range: 0, 1, 2, 3, 4
|
||||||
|
|
||||||
|
bO | mask
|
||||||
|
0 | 11111000 <--
|
||||||
|
1 | 11110001
|
||||||
|
2 | 11100011
|
||||||
|
3 | 11000111
|
||||||
|
4 | 10001111
|
||||||
|
5 | 00011111 <--
|
||||||
|
6 | 00111111
|
||||||
|
7 | 01111111
|
||||||
|
|
||||||
|
bO | value
|
||||||
|
0 | 00 01 02 03 04 <--
|
||||||
|
1 | 00 02 04 06 08
|
||||||
|
2 | 00 04 08 0c 10
|
||||||
|
3 | 00 08 10 18 20
|
||||||
|
4 | 00 10 20 30 40
|
||||||
|
5 | 00 20 40 60 80 <--
|
||||||
|
6 | 00 40 80 c0 00
|
||||||
|
7 | 00 80 00 80 00
|
||||||
|
*/
|
||||||
|
|
||||||
|
byte value = partition - mbrCount;
|
||||||
|
byte mask = 0b11111000;
|
||||||
|
for (int uVar4 = bitOffset; uVar4 != 0; uVar4--) {
|
||||||
|
mask = (mask << 1) | 1;
|
||||||
|
value <<= 1;
|
||||||
|
}
|
||||||
|
return amCmosWriteByteInRearpart(addr, (bValue & mask) | value);
|
||||||
|
}
|
||||||
|
|
||||||
|
AM_CMOS_STATUS amCmosSetPartition_0(byte partition) {
|
||||||
|
return amCmosSetPartition(amCmos.m_Param.index[0][0], amCmos.m_Param.index[0][1],
|
||||||
|
amCmos.m_Param.m_MbrCount, partition);
|
||||||
|
}
|
||||||
|
AM_CMOS_STATUS amCmosSetPartition_1(byte partition) {
|
||||||
|
return amCmosSetPartition(amCmos.m_Param.index[1][0], amCmos.m_Param.index[1][1],
|
||||||
|
amCmos.m_Param.m_MbrCount, partition);
|
||||||
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include "../../dll/smbus.h"
|
#include "../../dll/smbus.h"
|
||||||
#include "../_am.h"
|
#include "../_am.h"
|
||||||
|
#include "./amPlatform.h"
|
||||||
|
|
||||||
AM_LIB_H_HEADER(amCmos, AM_CMOS)
|
AM_LIB_H_HEADER(amCmos, AM_CMOS)
|
||||||
|
|
||||||
@ -18,22 +19,20 @@ typedef enum {
|
|||||||
AM_CMOS_STATUS_ERR_LOCK = -7,
|
AM_CMOS_STATUS_ERR_LOCK = -7,
|
||||||
} AM_CMOS_STATUS;
|
} AM_CMOS_STATUS;
|
||||||
|
|
||||||
typedef struct AM_CMOS_CONFIG {
|
|
||||||
BYTE index[4];
|
|
||||||
BYTE m_MbrCount;
|
|
||||||
} AM_CMOS_CONFIG;
|
|
||||||
|
|
||||||
typedef struct AM_CMOS {
|
typedef struct AM_CMOS {
|
||||||
BOOL m_bInit;
|
BOOL m_bInit;
|
||||||
HANDLE m_hMutex;
|
HANDLE m_hMutex;
|
||||||
HANDLE m_hCmos;
|
HANDLE m_hDriver;
|
||||||
AM_CMOS_CONFIG m_Config;
|
AM_PLATFORM_CMOS_PARAM m_Param;
|
||||||
} AM_CMOS;
|
} AM_CMOS;
|
||||||
|
|
||||||
|
AM_CMOS_STATUS amCmosInit(AM_PLATFORM_CMOS_PARAM* lpParam);
|
||||||
AM_CMOS_STATUS amCmosInit(AM_CMOS_CONFIG* lpConfig);
|
|
||||||
AM_CMOS_STATUS amCmosExit(void);
|
AM_CMOS_STATUS amCmosExit(void);
|
||||||
|
|
||||||
AM_CMOS_STATUS amCmosReadByteInRearpart(BYTE param_1, LPBYTE param_2);
|
AM_CMOS_STATUS amCmosReadByteInRearpart(BYTE addr, LPBYTE lpValue);
|
||||||
void amCmosWriteByteInRearpart(void);
|
AM_CMOS_STATUS amCmosWriteByteInRearpart(BYTE addr, BYTE value);
|
||||||
void amCmosSetPartition(void);
|
|
||||||
|
AM_CMOS_STATUS amCmosSetPartition(BYTE addr, BYTE bitOffset, BYTE mbrCount, BYTE partition);
|
||||||
|
|
||||||
|
AM_CMOS_STATUS amCmosSetPartition_0(byte partition);
|
||||||
|
AM_CMOS_STATUS amCmosSetPartition_1(byte partition);
|
||||||
|
@ -18,8 +18,7 @@ HANDLE amEepromCreateDeviceFile(const GUID *guid, LPCSTR resource, DWORD member_
|
|||||||
HDEVINFO DeviceInfoSet =
|
HDEVINFO DeviceInfoSet =
|
||||||
SetupDiGetClassDevsA(guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
|
SetupDiGetClassDevsA(guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
|
||||||
if (DeviceInfoSet == INVALID_HANDLE_VALUE) {
|
if (DeviceInfoSet == INVALID_HANDLE_VALUE) {
|
||||||
if (amEepromDebugLevel > 0)
|
if (amEepromDebugLevel > 0) amiDebugLog("SetupDiGetClassDevs Error(%ld).", GetLastError());
|
||||||
amiDebugLog("SetupDiGetClassDevs Error(%ld).", GetLastError());
|
|
||||||
return INVALID_HANDLE_VALUE;
|
return INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,8 +95,7 @@ AM_EEPROM_STATUS amEepromCreateMutex(AM_EEPROM *device) {
|
|||||||
idAuth.Value[5] = 1;
|
idAuth.Value[5] = 1;
|
||||||
|
|
||||||
if (!AllocateAndInitializeSid(&idAuth, 1, 0, 0, 0, 0, 0, 0, 0, 0, pSid)) {
|
if (!AllocateAndInitializeSid(&idAuth, 1, 0, 0, 0, 0, 0, 0, 0, 0, pSid)) {
|
||||||
if (amEepromDebugLevel > 0)
|
if (amEepromDebugLevel > 0) amiDebugLog("AllocateAndInitializeSid Error in amEepromInit.");
|
||||||
amiDebugLog("AllocateAndInitializeSid Error in amEepromInit.");
|
|
||||||
*pSid = NULL;
|
*pSid = NULL;
|
||||||
goto amEepromCreateMutexError;
|
goto amEepromCreateMutexError;
|
||||||
}
|
}
|
||||||
@ -109,8 +107,7 @@ AM_EEPROM_STATUS amEepromCreateMutex(AM_EEPROM *device) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!SetSecurityDescriptorDacl(&securityDescriptor, TRUE, NULL, FALSE)) {
|
if (!SetSecurityDescriptorDacl(&securityDescriptor, TRUE, NULL, FALSE)) {
|
||||||
if (amEepromDebugLevel > 0)
|
if (amEepromDebugLevel > 0) amiDebugLog("SetSecurityDescriptorDacl Error in amEepromInit.");
|
||||||
amiDebugLog("SetSecurityDescriptorDacl Error in amEepromInit.");
|
|
||||||
goto amEepromCreateMutexError;
|
goto amEepromCreateMutexError;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,8 +156,7 @@ AM_EEPROM_STATUS amEepromInit(AM_EEPROM_TIMEOUT *timeout) {
|
|||||||
|
|
||||||
amEeprom.m_superio = amEepromCreateDeviceFile(&MXSMBUS_GUID, 0, 0);
|
amEeprom.m_superio = amEepromCreateDeviceFile(&MXSMBUS_GUID, 0, 0);
|
||||||
if (amEeprom.m_superio == INVALID_HANDLE_VALUE) {
|
if (amEeprom.m_superio == INVALID_HANDLE_VALUE) {
|
||||||
if (amEepromDebugLevel > 0)
|
if (amEepromDebugLevel > 0) amiDebugLog("amEepromCreateDeviceFile Error in amEepromInit.");
|
||||||
amiDebugLog("amEepromCreateDeviceFile Error in amEepromInit.");
|
|
||||||
ret = AM_EEPROM_STATUS_ERR_SYS;
|
ret = AM_EEPROM_STATUS_ERR_SYS;
|
||||||
goto amEepromInitError;
|
goto amEepromInitError;
|
||||||
}
|
}
|
||||||
@ -176,7 +172,7 @@ AM_EEPROM_STATUS amEepromInit(AM_EEPROM_TIMEOUT *timeout) {
|
|||||||
if (amEepromDebugLevel > 0)
|
if (amEepromDebugLevel > 0)
|
||||||
amiDebugLog(
|
amiDebugLog(
|
||||||
"Unknown SMBUS Driver Protocol(0x%08x). Please update SMBUS driver or user "
|
"Unknown SMBUS Driver Protocol(0x%08x). Please update SMBUS driver or user "
|
||||||
"program.\n",
|
"program.",
|
||||||
driverVersion);
|
driverVersion);
|
||||||
|
|
||||||
ret = AM_EEPROM_STATUS_ERR_PROTOCOL_VER;
|
ret = AM_EEPROM_STATUS_ERR_PROTOCOL_VER;
|
||||||
@ -238,8 +234,8 @@ BOOL amEepromI2CReadBlock(AM_EEPROM *device, WORD reg, BYTE nBytes, LPBYTE buffe
|
|||||||
|
|
||||||
if (packet.status != 0) {
|
if (packet.status != 0) {
|
||||||
if (amEepromDebugLevel > 0)
|
if (amEepromDebugLevel > 0)
|
||||||
amiDebugLog(" .. SMBus read error. prt=0x%02x addr=0x%02x reg=0x%04x",
|
amiDebugLog(" .. SMBus read error. prt=0x%02x addr=0x%02x reg=0x%04x", packet.command,
|
||||||
packet.command, packet.v_addr, packet.command_code);
|
packet.v_addr, packet.command_code);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,9 +265,8 @@ BOOL amEepromI2CWriteBlock(AM_EEPROM *device, WORD reg, BYTE nBytes, LPBYTE buff
|
|||||||
|
|
||||||
if (packet.status != 0) {
|
if (packet.status != 0) {
|
||||||
if (amEepromDebugLevel > 0)
|
if (amEepromDebugLevel > 0)
|
||||||
amiDebugLog(
|
amiDebugLog(" .. SMBus write error. status=0x%02x, prt=0x%02x addr=0x%02x reg=0x%04x\n",
|
||||||
" .. SMBus write error. status=0x%02x, prt=0x%02x addr=0x%02x reg=0x%04x\n",
|
packet.status, packet.command, packet.v_addr, packet.command_code);
|
||||||
packet.status, packet.command, packet.v_addr, packet.command_code);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,16 +309,14 @@ AM_EEPROM_STATUS amEepromRead(WORD reg, LPBYTE buf, DWORD length) {
|
|||||||
|
|
||||||
DWORD err = WaitForSingleObject(amEeprom.m_mutex, 256);
|
DWORD err = WaitForSingleObject(amEeprom.m_mutex, 256);
|
||||||
if (err == WAIT_FAILED) {
|
if (err == WAIT_FAILED) {
|
||||||
if (amEepromDebugLevel > 0)
|
if (amEepromDebugLevel > 0) amiDebugLog("WaitForSingleObject Error(%ld).", GetLastError());
|
||||||
amiDebugLog("WaitForSingleObject Error(%ld).", GetLastError());
|
|
||||||
return AM_EEPROM_STATUS_ERR_SYS;
|
return AM_EEPROM_STATUS_ERR_SYS;
|
||||||
}
|
}
|
||||||
if (err == WAIT_TIMEOUT) return AM_EEPROM_STATUS_ERR_GET_MUTEX;
|
if (err == WAIT_TIMEOUT) return AM_EEPROM_STATUS_ERR_GET_MUTEX;
|
||||||
|
|
||||||
if (!(err == WAIT_OBJECT_0 || err == WAIT_ABANDONED)) {
|
if (!(err == WAIT_OBJECT_0 || err == WAIT_ABANDONED)) {
|
||||||
if (amEepromDebugLevel > 0)
|
if (amEepromDebugLevel > 0)
|
||||||
amiDebugLog("WaitForSingleObject Error(%ld). Return Value is %d.", GetLastError(),
|
amiDebugLog("WaitForSingleObject Error(%ld). Return Value is %d.", GetLastError(), err);
|
||||||
err);
|
|
||||||
return AM_EEPROM_STATUS_ERR_SYS;
|
return AM_EEPROM_STATUS_ERR_SYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -359,16 +352,14 @@ AM_EEPROM_STATUS amEepromWrite(WORD reg, LPBYTE buf, DWORD length) {
|
|||||||
|
|
||||||
DWORD err = WaitForSingleObject(amEeprom.m_mutex, 256);
|
DWORD err = WaitForSingleObject(amEeprom.m_mutex, 256);
|
||||||
if (err == WAIT_FAILED) {
|
if (err == WAIT_FAILED) {
|
||||||
if (amEepromDebugLevel > 0)
|
if (amEepromDebugLevel > 0) amiDebugLog("WaitForSingleObject Error(%ld).", GetLastError());
|
||||||
amiDebugLog("WaitForSingleObject Error(%ld).", GetLastError());
|
|
||||||
return AM_EEPROM_STATUS_ERR_SYS;
|
return AM_EEPROM_STATUS_ERR_SYS;
|
||||||
}
|
}
|
||||||
if (err == WAIT_TIMEOUT) return AM_EEPROM_STATUS_ERR_GET_MUTEX;
|
if (err == WAIT_TIMEOUT) return AM_EEPROM_STATUS_ERR_GET_MUTEX;
|
||||||
|
|
||||||
if (!(err == WAIT_OBJECT_0 || err == WAIT_ABANDONED)) {
|
if (!(err == WAIT_OBJECT_0 || err == WAIT_ABANDONED)) {
|
||||||
if (amEepromDebugLevel > 0)
|
if (amEepromDebugLevel > 0)
|
||||||
amiDebugLog("WaitForSingleObject Error(%ld). Return Value is %d.", GetLastError(),
|
amiDebugLog("WaitForSingleObject Error(%ld). Return Value is %d.", GetLastError(), err);
|
||||||
err);
|
|
||||||
return AM_EEPROM_STATUS_ERR_SYS;
|
return AM_EEPROM_STATUS_ERR_SYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
69
src/micetools/lib/am/amLog.c
Normal file
69
src/micetools/lib/am/amLog.c
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#include "amLog.h"
|
||||||
|
|
||||||
|
AM_LIB_C_HEADER(amLog, AM_LOG)
|
||||||
|
|
||||||
|
int amLogInit(void) {
|
||||||
|
if (amLog.m_Init) return AM_LOG_STATUS_ERR_ALREADY_INIT;
|
||||||
|
|
||||||
|
amLog.m_Option.m_EventSource = "am";
|
||||||
|
amLog.m_Option.m_EventType = 1;
|
||||||
|
amLog.m_Option.m_EventCategory = 0;
|
||||||
|
amLog.m_Option.m_EventId = 0;
|
||||||
|
amLog.m_Init = TRUE;
|
||||||
|
return AM_LOG_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int amLogFinalize(void) {
|
||||||
|
if (!amLog.m_Init) return AM_LOG_STATUS_ERR_INVALID_PARAM;
|
||||||
|
|
||||||
|
amLog.m_Option.m_EventSource = NULL;
|
||||||
|
amLog.m_Option.m_EventType = 0;
|
||||||
|
amLog.m_Option.m_EventCategory = 0;
|
||||||
|
amLog.m_Option.m_EventId = 0;
|
||||||
|
amLog.m_Init = FALSE;
|
||||||
|
return AM_LOG_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int amLogSetEventOption(AM_LOG_OPTION* lpOption) {
|
||||||
|
if (!amLog.m_Init) return AM_LOG_STATUS_ERR_INVALID_PARAM;
|
||||||
|
if (lpOption == NULL) return AM_LOG_STATUS_ERR_NO_INIT;
|
||||||
|
memcpy_s(&amLog.m_Option, sizeof amLog.m_Option, lpOption, sizeof *lpOption);
|
||||||
|
return AM_LOG_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int amLogReportEvent(LPCSTR lpMsg) {
|
||||||
|
if (!amLog.m_Init) return AM_LOG_STATUS_ERR_INVALID_PARAM;
|
||||||
|
if (lpMsg == NULL) return AM_LOG_STATUS_ERR_NO_INIT;
|
||||||
|
|
||||||
|
HANDLE hEventLog = RegisterEventSourceA(NULL, amLog.m_Option.m_EventSource);
|
||||||
|
if (hEventLog == INVALID_HANDLE_VALUE) return AM_LOG_STATUS_ERR_REGISTER;
|
||||||
|
|
||||||
|
WORD wType;
|
||||||
|
switch (amLog.m_Option.m_EventType) {
|
||||||
|
case 0:
|
||||||
|
wType = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
wType = 1;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
wType = 2;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
wType = 4;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
wType = 8;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
wType = 16;
|
||||||
|
}
|
||||||
|
BOOL suc = ReportEventA(hEventLog, wType, amLog.m_Option.m_EventCategory,
|
||||||
|
amLog.m_Option.m_EventId, NULL, 1, 0, &lpMsg, NULL);
|
||||||
|
if (!suc) {
|
||||||
|
DeregisterEventSource(hEventLog);
|
||||||
|
return AM_LOG_STATUS_ERR_REPORT;
|
||||||
|
}
|
||||||
|
DeregisterEventSource(hEventLog);
|
||||||
|
return AM_LOG_STATUS_OK;
|
||||||
|
}
|
@ -1,2 +1,34 @@
|
|||||||
void amLogInit(void);
|
#pragma once
|
||||||
void amLogSetEventOption(void);
|
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
#include "../_am.h"
|
||||||
|
|
||||||
|
AM_LIB_H_HEADER(amLog, AM_LOG)
|
||||||
|
|
||||||
|
typedef struct AM_LOG_OPTION {
|
||||||
|
LPCSTR m_EventSource;
|
||||||
|
DWORD m_EventType;
|
||||||
|
WORD m_EventId;
|
||||||
|
WORD m_EventCategory;
|
||||||
|
} AM_LOG_OPTION;
|
||||||
|
|
||||||
|
typedef struct AM_LOG {
|
||||||
|
BOOL m_Init;
|
||||||
|
AM_LOG_OPTION m_Option;
|
||||||
|
} AM_LOG;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
AM_LOG_STATUS_OK = 0,
|
||||||
|
AM_LOG_STATUS_NG = -1,
|
||||||
|
AM_LOG_STATUS_ERR_INVALID_PARAM = -2,
|
||||||
|
AM_LOG_STATUS_ERR_NO_INIT = -3,
|
||||||
|
AM_LOG_STATUS_ERR_ALREADY_INIT = -4,
|
||||||
|
AM_LOG_STATUS_ERR_REGISTER = -5,
|
||||||
|
AM_LOG_STATUS_ERR_REPORT = -6,
|
||||||
|
} AM_LOG_STATUS;
|
||||||
|
|
||||||
|
int amLogInit(void);
|
||||||
|
int amLogFinalize(void);
|
||||||
|
int amLogSetEventOption(AM_LOG_OPTION* lpOption);
|
||||||
|
int amLogReportEvent(LPCSTR lpMsg);
|
||||||
|
@ -22,6 +22,8 @@ typedef struct AM_OEMSTRING {
|
|||||||
CHAR m_strings[5][32];
|
CHAR m_strings[5][32];
|
||||||
} AM_OEMSTRING;
|
} AM_OEMSTRING;
|
||||||
|
|
||||||
|
#define OEMSTRING_PLATFORM 2
|
||||||
|
#define OEMSTRING_BOARD_TYPE 4
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
AM_OEMSTRING_STATUS_OK = 0,
|
AM_OEMSTRING_STATUS_OK = 0,
|
||||||
@ -30,7 +32,6 @@ typedef enum {
|
|||||||
AM_OEMSTRING_STATUS_ERR_SYS = -3,
|
AM_OEMSTRING_STATUS_ERR_SYS = -3,
|
||||||
} AM_OEMSTRING_STATUS;
|
} AM_OEMSTRING_STATUS;
|
||||||
|
|
||||||
|
|
||||||
void amiOemstringLocateDMITable(HANDLE hColumba, LPDWORD lpDmiBase, LPWORD lpDmiLength);
|
void amiOemstringLocateDMITable(HANDLE hColumba, LPDWORD lpDmiBase, LPWORD lpDmiLength);
|
||||||
void amiOemstringStoreString(BYTE type, int stringno, LPSTR string);
|
void amiOemstringStoreString(BYTE type, int stringno, LPSTR string);
|
||||||
BOOL amiOemstringLoadStrings(void);
|
BOOL amiOemstringLoadStrings(void);
|
||||||
|
@ -16,94 +16,94 @@ AM_PLATFORM_NV_DEVICE_CONFIG amPlatformNvDevices[3][4] = {
|
|||||||
// RingEdge 1
|
// RingEdge 1
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
.m_base = 0x0,
|
.m_Base = 0x0,
|
||||||
.m_size = 0x1000,
|
.m_Size = 0x1000,
|
||||||
.m_blockSize = 1,
|
.m_BlockSize = 1,
|
||||||
.m_read = _amEepromRead,
|
.m_ReadFunc = _amEepromRead,
|
||||||
.m_write = _amEepromWrite,
|
.m_WriteFunc = _amEepromWrite,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.m_base = 0x1000,
|
.m_Base = 0x1000,
|
||||||
.m_size = 0x1000,
|
.m_Size = 0x1000,
|
||||||
.m_blockSize = 1,
|
.m_BlockSize = 1,
|
||||||
.m_read = _amEepromRead,
|
.m_ReadFunc = _amEepromRead,
|
||||||
.m_write = _amEepromWrite,
|
.m_WriteFunc = _amEepromWrite,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.m_base = 0,
|
.m_Base = 0,
|
||||||
.m_size = 0x4000,
|
.m_Size = 0x4000,
|
||||||
.m_blockSize = 512,
|
.m_BlockSize = 512,
|
||||||
.m_read = _amSramRead,
|
.m_ReadFunc = _amSramRead,
|
||||||
.m_write = _amSramWrite,
|
.m_WriteFunc = _amSramWrite,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.m_base = 0x4000,
|
.m_Base = 0x4000,
|
||||||
.m_size = 0x1FC000,
|
.m_Size = 0x1FC000,
|
||||||
.m_blockSize = 512,
|
.m_BlockSize = 512,
|
||||||
.m_read = _amSramRead,
|
.m_ReadFunc = _amSramRead,
|
||||||
.m_write = _amSramWrite,
|
.m_WriteFunc = _amSramWrite,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// RingEdge 2
|
// RingEdge 2
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
.m_base = 0x0,
|
.m_Base = 0x0,
|
||||||
.m_size = 0x1000,
|
.m_Size = 0x1000,
|
||||||
.m_blockSize = 1,
|
.m_BlockSize = 1,
|
||||||
.m_read = _amEepromRead,
|
.m_ReadFunc = _amEepromRead,
|
||||||
.m_write = _amEepromWrite,
|
.m_WriteFunc = _amEepromWrite,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.m_base = 0x1000,
|
.m_Base = 0x1000,
|
||||||
.m_size = 0x1000,
|
.m_Size = 0x1000,
|
||||||
.m_blockSize = 1,
|
.m_BlockSize = 1,
|
||||||
.m_read = _amEepromRead,
|
.m_ReadFunc = _amEepromRead,
|
||||||
.m_write = _amEepromWrite,
|
.m_WriteFunc = _amEepromWrite,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.m_base = 0,
|
.m_Base = 0,
|
||||||
.m_size = 0x4000,
|
.m_Size = 0x4000,
|
||||||
.m_blockSize = 4,
|
.m_BlockSize = 4,
|
||||||
.m_read = _amSramRead,
|
.m_ReadFunc = _amSramRead,
|
||||||
.m_write = _amSramWrite,
|
.m_WriteFunc = _amSramWrite,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.m_base = 0x4000,
|
.m_Base = 0x4000,
|
||||||
.m_size = 0x1FC000,
|
.m_Size = 0x1FC000,
|
||||||
.m_blockSize = 4,
|
.m_BlockSize = 4,
|
||||||
.m_read = _amSramRead,
|
.m_ReadFunc = _amSramRead,
|
||||||
.m_write = _amSramWrite,
|
.m_WriteFunc = _amSramWrite,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// RingWide
|
// RingWide
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
.m_base = 0x0,
|
.m_Base = 0x0,
|
||||||
.m_size = 0x1000,
|
.m_Size = 0x1000,
|
||||||
.m_blockSize = 1,
|
.m_BlockSize = 1,
|
||||||
.m_read = _amEepromRead,
|
.m_ReadFunc = _amEepromRead,
|
||||||
.m_write = _amEepromWrite,
|
.m_WriteFunc = _amEepromWrite,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.m_base = 0x1000,
|
.m_Base = 0x1000,
|
||||||
.m_size = 0x1000,
|
.m_Size = 0x1000,
|
||||||
.m_blockSize = 1,
|
.m_BlockSize = 1,
|
||||||
.m_read = _amEepromRead,
|
.m_ReadFunc = _amEepromRead,
|
||||||
.m_write = _amEepromWrite,
|
.m_WriteFunc = _amEepromWrite,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.m_base = 0,
|
.m_Base = 0,
|
||||||
.m_size = 0x4000,
|
.m_Size = 0x4000,
|
||||||
.m_blockSize = 512,
|
.m_BlockSize = 512,
|
||||||
.m_read = _amSramRead,
|
.m_ReadFunc = _amSramRead,
|
||||||
.m_write = _amSramWrite,
|
.m_WriteFunc = _amSramWrite,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.m_base = 0x4000,
|
.m_Base = 0x4000,
|
||||||
.m_size = 0x3C000,
|
.m_Size = 0x3C000,
|
||||||
.m_blockSize = 512,
|
.m_BlockSize = 512,
|
||||||
.m_read = _amSramRead,
|
.m_ReadFunc = _amSramRead,
|
||||||
.m_write = _amSramWrite,
|
.m_WriteFunc = _amSramWrite,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -135,21 +135,21 @@ AM_PLATFORM_STATUS amPlatformGetPlatformId(AM_PLATFORM_PLATFORM_ID *platformId)
|
|||||||
char oemstringManufacturer[32];
|
char oemstringManufacturer[32];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If platform starts with "AAM" (RW) or "AAL" (RE):
|
* If platform starts with PLATFORM_RINGWIDE (RW) or PLATFORM_RINGEDGE (RE):
|
||||||
* copy it into m_platformId verbatim
|
* copy it into m_platformId verbatim
|
||||||
* Otherwise
|
* Otherwise
|
||||||
* fetch the manufacturer name
|
* fetch the manufacturer name
|
||||||
* If manufacturer is "NEC"
|
* If manufacturer is MANUFACTURER_RE
|
||||||
* m_platformId = "AAL" (RE)
|
* m_platformId = PLATFORM_RINGEDGE (RE)
|
||||||
* If manufacturer if "Supermicro" or "Advantech"
|
* If manufacturer if MANUFACTURER_RW_1 or MANUFACTURER_RW_2
|
||||||
* m_platformId = "AAM" (RW)
|
* m_platformId = PLATFORM_RINGWIDE (RW)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!amPlatform.m_platformIdCached) {
|
if (!amPlatform.m_platformIdCached) {
|
||||||
if (amOemstringGetOemstring(oemstringPlatform, 2) != AM_OEMSTRING_STATUS_OK) {
|
if (amOemstringGetOemstring(oemstringPlatform, OEMSTRING_PLATFORM) !=
|
||||||
|
AM_OEMSTRING_STATUS_OK) {
|
||||||
if (amPlatformDebugLevel > 0)
|
if (amPlatformDebugLevel > 0)
|
||||||
amiDebugLog("amOemstringGetOemstring Error!! (%d)",
|
amiDebugLog("amOemstringGetOemstring Error!! (%d)", AM_PLATFORM_STATUS_ERR_SYS);
|
||||||
AM_PLATFORM_STATUS_ERR_SYS);
|
|
||||||
return AM_PLATFORM_STATUS_ERR_SYS;
|
return AM_PLATFORM_STATUS_ERR_SYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,7 +214,8 @@ AM_PLATFORM_STATUS amPlatformGetBoardType(AM_PLATFORM_BOARD_TYPE *boardType) {
|
|||||||
if (strcmp(oemstringManufacturer, MANUFACTURER_RE) == 0) {
|
if (strcmp(oemstringManufacturer, MANUFACTURER_RE) == 0) {
|
||||||
ZeroMemory(oemstring4, sizeof oemstring4);
|
ZeroMemory(oemstring4, sizeof oemstring4);
|
||||||
|
|
||||||
if (amOemstringGetOemstring(oemstring4, 4) != AM_OEMSTRING_STATUS_OK) {
|
if (amOemstringGetOemstring(oemstring4, OEMSTRING_BOARD_TYPE) !=
|
||||||
|
AM_OEMSTRING_STATUS_OK) {
|
||||||
*boardType = amPlatform.m_boardType = AM_PLATFORM_BOARD_TYPE_UNKNOWN;
|
*boardType = amPlatform.m_boardType = AM_PLATFORM_BOARD_TYPE_UNKNOWN;
|
||||||
return AM_PLATFORM_STATUS_ERR_SYS;
|
return AM_PLATFORM_STATUS_ERR_SYS;
|
||||||
}
|
}
|
||||||
@ -237,3 +238,220 @@ AM_PLATFORM_STATUS amPlatformGetBoardType(AM_PLATFORM_BOARD_TYPE *boardType) {
|
|||||||
amPlatform.m_boardTypeCached = TRUE;
|
amPlatform.m_boardTypeCached = TRUE;
|
||||||
return AM_PLATFORM_STATUS_OK;
|
return AM_PLATFORM_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AM_PLATFORM_STATUS amPlatformGetPlatformIdEx(AM_PLATFORM_PLATFORM_ID_EX *lpPlatform) {
|
||||||
|
char oemstring[32];
|
||||||
|
char manufacturer[32];
|
||||||
|
|
||||||
|
if (lpPlatform == NULL) {
|
||||||
|
if (amPlatformDebugLevel > 0) amiDebugLog("PARAM Error!!");
|
||||||
|
return AM_PLATFORM_STATUS_ERR_INVALID_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char m_strPlatformId[4];
|
||||||
|
static DWORD m_dwPlatformId;
|
||||||
|
static bool m_platformIdCached = false;
|
||||||
|
|
||||||
|
int err;
|
||||||
|
|
||||||
|
ZeroMemory(oemstring, sizeof oemstring);
|
||||||
|
if (!m_platformIdCached) {
|
||||||
|
err = amOemstringGetOemstring(oemstring, OEMSTRING_PLATFORM);
|
||||||
|
if (err != AM_OEMSTRING_STATUS_OK) {
|
||||||
|
if (amPlatformDebugLevel > 0) amiDebugLog("amOemstringGetOemstring Error!! (%d)", err);
|
||||||
|
goto oemstring_bad;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(oemstring, PLATFORM_RINGEDGE) == 0 ||
|
||||||
|
strcmp(oemstring, PLATFORM_RINGWIDE) == 0) {
|
||||||
|
strncpy_s(m_strPlatformId, sizeof m_strPlatformId, oemstring, 0xFFFFFFFF);
|
||||||
|
} else if (!amOemstringGetManufacturer(manufacturer)) {
|
||||||
|
if (strcmp(manufacturer, MANUFACTURER_RE) == 0) {
|
||||||
|
strncpy_s(m_strPlatformId, sizeof m_strPlatformId, PLATFORM_RINGEDGE, 0xFFFFFFFF);
|
||||||
|
} else if (strcmp(manufacturer, MANUFACTURER_RW_1) == 0 ||
|
||||||
|
strcmp(manufacturer, MANUFACTURER_RW_2) == 0) {
|
||||||
|
strncpy_s(m_strPlatformId, sizeof m_strPlatformId, PLATFORM_RINGWIDE, 0xFFFFFFFF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
oemstring[0] = 0;
|
||||||
|
err = amOemstringGetOemstring(oemstring, OEMSTRING_BOARD_TYPE);
|
||||||
|
if (err != AM_OEMSTRING_STATUS_OK) {
|
||||||
|
if (amPlatformDebugLevel > 0) amiDebugLog("amOemstringGetOemstring Error!! (%d)", err);
|
||||||
|
goto oemstring_bad;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t boardTypeLen = strlen(oemstring);
|
||||||
|
m_dwPlatformId = 0;
|
||||||
|
if (strcmp(m_strPlatformId, PLATFORM_RINGEDGE) == 0) {
|
||||||
|
if (boardTypeLen == 0) {
|
||||||
|
m_dwPlatformId = 1;
|
||||||
|
m_platformIdCached = true;
|
||||||
|
goto LABEL_11;
|
||||||
|
} else if (boardTypeLen == 1) {
|
||||||
|
if (strcmp(oemstring, " ") == 0) {
|
||||||
|
m_dwPlatformId = 1;
|
||||||
|
m_platformIdCached = true;
|
||||||
|
goto LABEL_11;
|
||||||
|
}
|
||||||
|
if (amPlatformDebugLevel > 0) amiDebugLog("Oemstring length Error!!");
|
||||||
|
goto oemstring_bad;
|
||||||
|
}
|
||||||
|
} else if (strcmp(m_strPlatformId, PLATFORM_RINGWIDE) == 0 && boardTypeLen == 0) {
|
||||||
|
m_dwPlatformId = 1;
|
||||||
|
m_platformIdCached = true;
|
||||||
|
goto LABEL_11;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (boardTypeLen < 3) {
|
||||||
|
if (amPlatformDebugLevel > 0) amiDebugLog("Oemstring length Error!!");
|
||||||
|
goto oemstring_bad;
|
||||||
|
}
|
||||||
|
if (strncmp(m_strPlatformId, oemstring, 3) != 0) {
|
||||||
|
if (amPlatformDebugLevel > 0) amiDebugLog("Oemstring compare Error!!");
|
||||||
|
goto oemstring_bad;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (boardTypeLen > 3) {
|
||||||
|
for (size_t i = 3; i < boardTypeLen; i++) {
|
||||||
|
if (oemstring[i] < '0' || oemstring[i] > '9') {
|
||||||
|
if (amPlatformDebugLevel > 0) amiDebugLog("Oemstring format Error!!");
|
||||||
|
goto oemstring_bad;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_dwPlatformId = atoi(&oemstring[3]);
|
||||||
|
if (!m_dwPlatformId) goto oemstring_bad;
|
||||||
|
m_platformIdCached = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
LABEL_11:
|
||||||
|
memcpy(lpPlatform->strPlatformId, m_strPlatformId, 4);
|
||||||
|
lpPlatform->platformId = m_dwPlatformId;
|
||||||
|
return m_platformIdCached ? AM_PLATFORM_STATUS_OK : AM_PLATFORM_STATUS_ERR_SYS;
|
||||||
|
|
||||||
|
oemstring_bad:
|
||||||
|
if (!m_platformIdCached) {
|
||||||
|
ZeroMemory(m_strPlatformId, sizeof m_strPlatformId);
|
||||||
|
m_dwPlatformId = 0;
|
||||||
|
}
|
||||||
|
goto LABEL_11;
|
||||||
|
}
|
||||||
|
|
||||||
|
int amPlatformGetBiosInfo(AM_PLATFORM_BIOS_INFO *lpInfo) {
|
||||||
|
if (lpInfo == NULL) {
|
||||||
|
if (amPlatformDebugLevel > 0) amiDebugLog("PARAM Error!!");
|
||||||
|
return AM_PLATFORM_STATUS_ERR_INVALID_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
CHAR biosVer[32];
|
||||||
|
int err = amOemstringGetSBiosVer(biosVer);
|
||||||
|
if (err < 0) {
|
||||||
|
if (amPlatformDebugLevel > 0) amiDebugLog("amOemstringGetSBiosVer Error!! (%d)", err);
|
||||||
|
return AM_PLATFORM_STATUS_ERR_SYS;
|
||||||
|
}
|
||||||
|
|
||||||
|
CHAR biosReleaseDate[12];
|
||||||
|
err = amOemstringGetSBiosReleaseDate(biosReleaseDate);
|
||||||
|
if (err < 0) {
|
||||||
|
if (amPlatformDebugLevel > 0)
|
||||||
|
amiDebugLog("amOemstringGetSBiosReleaseDate Error!! (%d)", err);
|
||||||
|
return AM_PLATFORM_STATUS_ERR_SYS;
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy_s(lpInfo->m_BiosVer, sizeof lpInfo->m_BiosVer, biosVer, 0xffffffff);
|
||||||
|
strncpy_s(lpInfo->m_BiosReleaseDate, sizeof lpInfo->m_BiosReleaseDate, biosReleaseDate,
|
||||||
|
0xffffffff);
|
||||||
|
return AM_PLATFORM_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int amPlatformGetOsVersion(DWORD *lpVersion) {
|
||||||
|
if (lpVersion == NULL) {
|
||||||
|
if (amPlatformDebugLevel > 0) amiDebugLog("PARAM Error!!");
|
||||||
|
return AM_PLATFORM_STATUS_ERR_INVALID_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD osVersion = 0;
|
||||||
|
|
||||||
|
if (osVersion == 0) {
|
||||||
|
HANDLE hSysver = CreateFileW(L"C:\\System\\SystemVersion.txt", GENERIC_READ, 1, NULL,
|
||||||
|
OPEN_EXISTING, FILE_SHARE_READ, NULL);
|
||||||
|
if (hSysver == INVALID_HANDLE_VALUE) {
|
||||||
|
if (amPlatformDebugLevel > 0)
|
||||||
|
amiDebugLog("CreateFile Error!! Error Code is %d", GetLastError());
|
||||||
|
} else {
|
||||||
|
DWORD nRead = 0;
|
||||||
|
char buffer[8];
|
||||||
|
|
||||||
|
if (!ReadFile(hSysver, buffer, 8, &nRead, NULL)) {
|
||||||
|
if (amPlatformDebugLevel > 0)
|
||||||
|
amiDebugLog("ReadFile Error!! Error Code is %d", GetLastError());
|
||||||
|
} else if (nRead != 8) {
|
||||||
|
if (amPlatformDebugLevel > 0)
|
||||||
|
amiDebugLog("ReadFile Error!! Error Code is %d", GetLastError());
|
||||||
|
} else {
|
||||||
|
WORD ver1 = (((buffer[0] - '0') * 1000) + ((buffer[1] - '0') * 100) +
|
||||||
|
(buffer[2] - '0') * 10 + (buffer[3] - '0'));
|
||||||
|
BYTE ver2 = (buffer[4] - '0') * 10 + (buffer[5] - '0');
|
||||||
|
BYTE ver3 = (buffer[6] - '0') * 10 + (buffer[7] - '0');
|
||||||
|
|
||||||
|
osVersion = (((ver1 << 16) | ver2) << 8) | ver3;
|
||||||
|
}
|
||||||
|
CloseHandle(hSysver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*lpVersion = osVersion;
|
||||||
|
return osVersion == 0 ? AM_PLATFORM_STATUS_ERR_SYS : AM_PLATFORM_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int amPlatformGetMemorySize(PLARGE_INTEGER size) {
|
||||||
|
if (size == NULL) {
|
||||||
|
if (amPlatformDebugLevel > 0) amiDebugLog("PARAM Error!!");
|
||||||
|
return AM_PLATFORM_STATUS_ERR_INVALID_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
MEMORYSTATUSEX statex;
|
||||||
|
statex.dwLength = sizeof statex;
|
||||||
|
if (!GlobalMemoryStatusEx((LPMEMORYSTATUSEX)&statex)) {
|
||||||
|
if (amPlatformDebugLevel > 0)
|
||||||
|
amiDebugLog("GlobalMemoryStatusEx Error!! (%d)", GetLastError());
|
||||||
|
size->QuadPart = 0;
|
||||||
|
return AM_PLATFORM_STATUS_ERR_SYS;
|
||||||
|
}
|
||||||
|
|
||||||
|
size->QuadPart = statex.ullTotalPhys;
|
||||||
|
return AM_PLATFORM_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static AM_PLATFORM_CMOS_PARAM _cmosParam[5] = {
|
||||||
|
// RE
|
||||||
|
{
|
||||||
|
.index = { { 0x60, 0x00 }, { 0x61, 0x00 } },
|
||||||
|
.m_MbrCount = 0,
|
||||||
|
},
|
||||||
|
// RW 1
|
||||||
|
{
|
||||||
|
.index = { { 0x3a, 0x05 }, { 0x3a, 0x02 } },
|
||||||
|
.m_MbrCount = 1,
|
||||||
|
},
|
||||||
|
// RW 2
|
||||||
|
{
|
||||||
|
.index = { { 0x28, 0x00 }, { 0x28, 0x00 } },
|
||||||
|
.m_MbrCount = 1,
|
||||||
|
},
|
||||||
|
// RE 2
|
||||||
|
{
|
||||||
|
.index = { { 0x60, 0x00 }, { 0x61, 0x00 } },
|
||||||
|
.m_MbrCount = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.index = { { 0x00, 0x00 }, { 0x00, 0x00 } },
|
||||||
|
.m_MbrCount = 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
AM_PLATFORM_CMOS_PARAM *amPlatformGetCmosParam(AM_PLATFORM_BOARD_TYPE boardType) {
|
||||||
|
if (boardType < 5) return &_cmosParam[boardType];
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
@ -17,6 +17,10 @@ AM_LIB_H_HEADER(amPlatform, AM_PLATFORM)
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
char strPlatformId[4];
|
char strPlatformId[4];
|
||||||
} AM_PLATFORM_PLATFORM_ID;
|
} AM_PLATFORM_PLATFORM_ID;
|
||||||
|
typedef struct {
|
||||||
|
char strPlatformId[4];
|
||||||
|
int platformId;
|
||||||
|
} AM_PLATFORM_PLATFORM_ID_EX;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
AM_PLATFORM_BOARD_TYPE_RINGEDGE = 0,
|
AM_PLATFORM_BOARD_TYPE_RINGEDGE = 0,
|
||||||
@ -33,7 +37,7 @@ typedef struct AM_PLATFORM {
|
|||||||
AM_PLATFORM_PLATFORM_ID m_platformId;
|
AM_PLATFORM_PLATFORM_ID m_platformId;
|
||||||
} AM_PLATFORM;
|
} AM_PLATFORM;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct AM_PLATFORM_ID_GROUP {
|
||||||
char strVendorId[5];
|
char strVendorId[5];
|
||||||
char strDeviceId[5];
|
char strDeviceId[5];
|
||||||
char strSubId[9];
|
char strSubId[9];
|
||||||
@ -67,24 +71,42 @@ typedef enum {
|
|||||||
typedef int(amPlatformRead_t)(WORD addr, LPBYTE buf, DWORD length);
|
typedef int(amPlatformRead_t)(WORD addr, LPBYTE buf, DWORD length);
|
||||||
typedef int(amPlatformWrite_t)(WORD addr, LPBYTE buf, DWORD length);
|
typedef int(amPlatformWrite_t)(WORD addr, LPBYTE buf, DWORD length);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct AM_PLATFORM_NV_DEVICE_CONFIG {
|
||||||
DWORD m_base;
|
DWORD m_Base;
|
||||||
DWORD m_size;
|
DWORD m_Size;
|
||||||
DWORD m_blockSize;
|
DWORD m_BlockSize;
|
||||||
amPlatformRead_t* m_read;
|
amPlatformRead_t* m_ReadFunc;
|
||||||
amPlatformWrite_t* m_write;
|
amPlatformWrite_t* m_WriteFunc;
|
||||||
} AM_PLATFORM_NV_DEVICE_CONFIG;
|
} AM_PLATFORM_NV_DEVICE_CONFIG;
|
||||||
|
|
||||||
|
typedef struct AM_PLATFORM_BIOS_INFO {
|
||||||
|
CHAR m_BiosVer[64];
|
||||||
|
CHAR m_BiosReleaseDate[11];
|
||||||
|
} AM_PLATFORM_BIOS_INFO;
|
||||||
|
|
||||||
|
typedef struct AM_PLATFORM_CMOS_PARAM {
|
||||||
|
// [address, bit offset][2]
|
||||||
|
BYTE index[2][2];
|
||||||
|
BYTE m_MbrCount;
|
||||||
|
} AM_PLATFORM_CMOS_PARAM;
|
||||||
|
|
||||||
AM_PLATFORM_NV_DEVICE_CONFIG* amPlatformGetNvDevice(AM_PLATFORM_NV_DEVICE device);
|
AM_PLATFORM_NV_DEVICE_CONFIG* amPlatformGetNvDevice(AM_PLATFORM_NV_DEVICE device);
|
||||||
|
|
||||||
AM_PLATFORM_STATUS amPlatformGetBoardType(AM_PLATFORM_BOARD_TYPE* boardType);
|
AM_PLATFORM_STATUS amPlatformGetBoardType(AM_PLATFORM_BOARD_TYPE* boardType);
|
||||||
AM_PLATFORM_STATUS amPlatformGetPlatformId(AM_PLATFORM_PLATFORM_ID* platformId);
|
AM_PLATFORM_STATUS amPlatformGetPlatformId(AM_PLATFORM_PLATFORM_ID* platformId);
|
||||||
|
AM_PLATFORM_STATUS amPlatformGetPlatformIdEx(AM_PLATFORM_PLATFORM_ID_EX* platformId);
|
||||||
|
|
||||||
|
int amPlatformGetBiosInfo(AM_PLATFORM_BIOS_INFO* lpInfo);
|
||||||
|
int amPlatformGetOsVersion(DWORD* lpVersion); // Reads SystemVersion.txt
|
||||||
|
int amPlatformGetMemorySize(PLARGE_INTEGER size);
|
||||||
|
|
||||||
|
AM_PLATFORM_CMOS_PARAM* amPlatformGetCmosParam(AM_PLATFORM_BOARD_TYPE boardType);
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
|
// usbDongle.exe -> see in maimai 1.90 folder
|
||||||
void amPlatformAsyncClose(void);
|
void amPlatformAsyncClose(void); // usbDongle.exe
|
||||||
void amPlatformAsyncReqUsbDeviceCount(void);
|
void amPlatformAsyncReqUsbDeviceCount(void); // usbDongle.exe
|
||||||
void amPlatformAsyncResUsbDeviceCount(void);
|
void amPlatformAsyncResUsbDeviceCount(void); // usbDongle.exe
|
||||||
void amPlatformChangeDisplayModeAmd(void);
|
void amPlatformChangeDisplayModeAmd(void);
|
||||||
void amPlatformChangeDisplayModeNvidia(void);
|
void amPlatformChangeDisplayModeNvidia(void);
|
||||||
void amPlatformChangeDisplayModeNvidiaEx(void);
|
void amPlatformChangeDisplayModeNvidiaEx(void);
|
||||||
@ -93,23 +115,19 @@ void amPlatformChangeDisplayResolutionNvidia(void);
|
|||||||
void amPlatformChangeDisplayResolutionNvidiaEx(void);
|
void amPlatformChangeDisplayResolutionNvidiaEx(void);
|
||||||
void amPlatformChangeDisplayResolutionWinAPI(void);
|
void amPlatformChangeDisplayResolutionWinAPI(void);
|
||||||
void amPlatformDestroyCheckInterfaceHandle(void);
|
void amPlatformDestroyCheckInterfaceHandle(void);
|
||||||
void amPlatformGetAvailableAmdDriver(void);
|
void amPlatformGetAvailableAmdDriver(void); // usbDongle.exe
|
||||||
void amPlatformGetAvailableNvidiaDriver(void);
|
void amPlatformGetAvailableNvidiaDriver(void); // usbDongle.exe
|
||||||
void amPlatformGetBiosInfo(void);
|
void amPlatformGetCheckInterfaceHandle(void); // usbDongle.exe
|
||||||
void amPlatformGetCheckInterfaceHandle(void);
|
void amPlatformGetComInfo(void); // usbDongle.exe
|
||||||
void amPlatformGetComInfo(void);
|
void amPlatformGetDevInfo(void); // usbDongle.exe
|
||||||
void amPlatformGetDevInfo(void);
|
void amPlatformGetGpuPstate(void); // usbDongle.exe
|
||||||
void amPlatformGetGpuPstate(void);
|
void amPlatformGetGraphicInfo(void); // usbDongle.exe
|
||||||
void amPlatformGetGraphicInfo(void);
|
void amPlatformGetPartitionInfo(void); // usbDongle.exe
|
||||||
void amPlatformGetMemorySize(void);
|
void amPlatformGetPortName(void); // usbDongle.exe
|
||||||
void amPlatformGetOsVersion(void);
|
void amPlatformGetSearchDevInfo(void); // usbDongle.exe
|
||||||
void amPlatformGetPartitionInfo(void);
|
void amPlatformGetSoundInfo(void); // usbDongle.exe
|
||||||
void amPlatformGetPlatformIdEx(void);
|
void amPlatformGetStorageInfo(void); // usbDongle.exe
|
||||||
void amPlatformGetPortName(void);
|
void amPlatformNvapiInit(void); // usbDongle.exe
|
||||||
void amPlatformGetSearchDevInfo(void);
|
|
||||||
void amPlatformGetSoundInfo(void);
|
|
||||||
void amPlatformGetStorageInfo(void);
|
|
||||||
void amPlatformNvapiInit(void);
|
|
||||||
void amPlatformSetDisplayMode(void);
|
void amPlatformSetDisplayMode(void);
|
||||||
void amPlatformSetDisplayResolution(void);
|
void amPlatformSetDisplayResolution(void);
|
||||||
void amPlatformSetDisplayResolutionAndMode(void);
|
void amPlatformSetDisplayResolutionAndMode(void);
|
||||||
|
@ -13,6 +13,7 @@ amEeprom = static_library(
|
|||||||
link_with: [
|
link_with: [
|
||||||
amiDebug,
|
amiDebug,
|
||||||
amiCrc,
|
amiCrc,
|
||||||
|
amiTimer,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -35,6 +36,7 @@ amPlatform = static_library(
|
|||||||
amiDebug,
|
amiDebug,
|
||||||
amSram,
|
amSram,
|
||||||
amEeprom,
|
amEeprom,
|
||||||
|
amOemstring,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -78,3 +80,20 @@ amCmos = static_library(
|
|||||||
amiDebug,
|
amiDebug,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
amLog = static_library(
|
||||||
|
'amLog',
|
||||||
|
sources: [
|
||||||
|
'amLog.c',
|
||||||
|
],
|
||||||
|
)
|
||||||
|
amBackup = static_library(
|
||||||
|
'amBackup',
|
||||||
|
sources: [
|
||||||
|
'amBackup.c',
|
||||||
|
],
|
||||||
|
link_with: [
|
||||||
|
amiDebug,
|
||||||
|
amiCrc,
|
||||||
|
],
|
||||||
|
)
|
||||||
|
@ -449,7 +449,8 @@ e_pcpa_t pcpaServer(pcpa_t *stream, timeout_t timeout_ms) {
|
|||||||
case 10:
|
case 10:
|
||||||
// TODO: Figure out why recv_buf is empty at this point in the FSM
|
// TODO: Figure out why recv_buf is empty at this point in the FSM
|
||||||
if (stream->before_cb != NULL)
|
if (stream->before_cb != NULL)
|
||||||
stream->before_cb(stream, stream->pcpp.sock.recv_buf);
|
stream->before_cb(stream, (char *)stream->pcpp.sock.recv_buf,
|
||||||
|
*stream->pcpp.sock.recv_buf_count);
|
||||||
|
|
||||||
if (stream->callback_table == NULL) {
|
if (stream->callback_table == NULL) {
|
||||||
amiDebugLog("error Callback_table buffer isn't set");
|
amiDebugLog("error Callback_table buffer isn't set");
|
||||||
|
@ -45,6 +45,7 @@ e_pcpa_t _pcpaGetErrorFromPcpp(e_pcpp_t err);
|
|||||||
|
|
||||||
struct pcpa;
|
struct pcpa;
|
||||||
typedef void(pcpa_callback)(struct pcpa* stream, void* data);
|
typedef void(pcpa_callback)(struct pcpa* stream, void* data);
|
||||||
|
typedef void(pcpa_log_callback)(struct pcpa* stream, char* data, size_t nData);
|
||||||
|
|
||||||
typedef struct pcpa_cb_table {
|
typedef struct pcpa_cb_table {
|
||||||
char keyword[PCP_KEYWORD_MAX];
|
char keyword[PCP_KEYWORD_MAX];
|
||||||
@ -73,7 +74,7 @@ typedef struct pcpa {
|
|||||||
pcp_send_data_t send_data;
|
pcp_send_data_t send_data;
|
||||||
|
|
||||||
// Our additions
|
// Our additions
|
||||||
pcpa_callback* before_cb;
|
pcpa_log_callback* before_cb;
|
||||||
} pcpa_t;
|
} pcpa_t;
|
||||||
|
|
||||||
void pcpaClose(pcpa_t* stream);
|
void pcpaClose(pcpa_t* stream);
|
||||||
@ -81,7 +82,8 @@ void pcpaCloseBinary(pcpa_t* stream);
|
|||||||
char* pcpaGetKeyword(pcpa_t* stream, uint keyword_num);
|
char* pcpaGetKeyword(pcpa_t* stream, uint keyword_num);
|
||||||
e_pcpa_t pcpaInitStream(pcpa_t* stream);
|
e_pcpa_t pcpaInitStream(pcpa_t* stream);
|
||||||
e_pcpa_t pcpaOpenClient(pcpa_t* stream, char* ipAddr, ushort port, uint param_4, timeout_t timeout);
|
e_pcpa_t pcpaOpenClient(pcpa_t* stream, char* ipAddr, ushort port, uint param_4, timeout_t timeout);
|
||||||
e_pcpa_t pcpaOpenServerWithBinary(pcpa_t* stream, int open_mode, ushort port, ushort binary_port, timeout_t param_5);
|
e_pcpa_t pcpaOpenServerWithBinary(pcpa_t* stream, int open_mode, ushort port, ushort binary_port,
|
||||||
|
timeout_t param_5);
|
||||||
e_pcpa_t pcpaRecvBinary(pcpa_t* stream, timeout_t something);
|
e_pcpa_t pcpaRecvBinary(pcpa_t* stream, timeout_t something);
|
||||||
e_pcpa_t pcpaSendBinary(pcpa_t* stream, timeout_t something);
|
e_pcpa_t pcpaSendBinary(pcpa_t* stream, timeout_t something);
|
||||||
e_pcpa_t pcpaServer(pcpa_t* stream, timeout_t timeout_ms);
|
e_pcpa_t pcpaServer(pcpa_t* stream, timeout_t timeout_ms);
|
||||||
@ -89,15 +91,16 @@ e_pcpa_t pcpaSetAfterBinaryModeCallBackFunc(pcpa_t* stream, pcpa_callback* callb
|
|||||||
e_pcpa_t pcpaSetBeforeBinaryModeCallBackFunc(pcpa_t* stream, pcpa_callback* callback, void* data);
|
e_pcpa_t pcpaSetBeforeBinaryModeCallBackFunc(pcpa_t* stream, pcpa_callback* callback, void* data);
|
||||||
e_pcpa_t pcpaSetBinaryMode(pcpa_t* stream, binary_mode_t binary_mode);
|
e_pcpa_t pcpaSetBinaryMode(pcpa_t* stream, binary_mode_t binary_mode);
|
||||||
e_pcpa_t pcpaSetCallbackFunc(pcpa_t* stream, char* keyword, pcpa_callback* callback, void* data);
|
e_pcpa_t pcpaSetCallbackFunc(pcpa_t* stream, char* keyword, pcpa_callback* callback, void* data);
|
||||||
e_pcpa_t pcpaSetCallbackFuncBuffer(pcpa_t* stream, pcpa_cb_table_t* callback_table, uint callbacks_max);
|
e_pcpa_t pcpaSetCallbackFuncBuffer(pcpa_t* stream, pcpa_cb_table_t* callback_table,
|
||||||
|
uint callbacks_max);
|
||||||
e_pcpa_t pcpaSetRecvBinaryBuffer(pcpa_t* stream, unsigned char* recv_buffer, size_t len);
|
e_pcpa_t pcpaSetRecvBinaryBuffer(pcpa_t* stream, unsigned char* recv_buffer, size_t len);
|
||||||
e_pcpa_t pcpaSetSendBinaryBuffer(pcpa_t* stream, const unsigned char* send_buffer, size_t len);
|
e_pcpa_t pcpaSetSendBinaryBuffer(pcpa_t* stream, const unsigned char* send_buffer, size_t len);
|
||||||
pcp_send_data_t* pcpaSetSendPacket(pcpa_t* stream, char* keyword, char* value);
|
pcp_send_data_t* pcpaSetSendPacket(pcpa_t* stream, char* keyword, char* value);
|
||||||
pcp_send_data_t *pcpaAddSendPacket(pcpa_t *stream, char *keyword, char *value);
|
pcp_send_data_t* pcpaAddSendPacket(pcpa_t* stream, char* keyword, char* value);
|
||||||
char* pcpaGetCommand(pcpa_t* pcpa, char* command);
|
char* pcpaGetCommand(pcpa_t* pcpa, char* command);
|
||||||
e_pcpa_t pcpaIsBusy(pcpa_t *pcpa, timeout_t timeout);
|
e_pcpa_t pcpaIsBusy(pcpa_t* pcpa, timeout_t timeout);
|
||||||
e_pcpa_t pcpaSendRequest(pcpa_t *stream, timeout_t timeout);
|
e_pcpa_t pcpaSendRequest(pcpa_t* stream, timeout_t timeout);
|
||||||
e_pcpa_t pcpaRecvResponse(pcpa_t *stream, timeout_t timeout);
|
e_pcpa_t pcpaRecvResponse(pcpa_t* stream, timeout_t timeout);
|
||||||
e_pcpa_t pcpaOpenBinaryClient(pcpa_t *stream, ushort port, timeout_t timeout);
|
e_pcpa_t pcpaOpenBinaryClient(pcpa_t* stream, ushort port, timeout_t timeout);
|
||||||
|
|
||||||
e_pcpa_t pcpaAccessClient(pcpa_t* stream, timeout_t timeout);
|
e_pcpa_t pcpaAccessClient(pcpa_t* stream, timeout_t timeout);
|
||||||
|
@ -56,10 +56,8 @@ void pcpaPrint(pcpa_t* stream) {
|
|||||||
printf(" %d commands:\n", stream->recv_data.cmd_count);
|
printf(" %d commands:\n", stream->recv_data.cmd_count);
|
||||||
for (size_t i = 0; i < stream->recv_data.cmd_count; i++) {
|
for (size_t i = 0; i < stream->recv_data.cmd_count; i++) {
|
||||||
byte kwd = stream->recv_data.keywords[i];
|
byte kwd = stream->recv_data.keywords[i];
|
||||||
if (kwd != 0) kwd++;
|
|
||||||
printf(" & %02d '%s'\n", kwd, stream->recv_data.strings + kwd);
|
printf(" & %02d '%s'\n", kwd, stream->recv_data.strings + kwd);
|
||||||
byte value = stream->recv_data.values[i];
|
byte value = stream->recv_data.values[i];
|
||||||
if (value != 0) value++;
|
|
||||||
printf(" = %02d '%s'\n", value, stream->recv_data.strings + value);
|
printf(" = %02d '%s'\n", value, stream->recv_data.strings + value);
|
||||||
if (stream->recv_data.strings[kwd] == 0) break;
|
if (stream->recv_data.strings[kwd] == 0) break;
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,8 @@ _LF(Internal, Hooks, "hooks")
|
|||||||
_LF(Internal, Misc, "misc")
|
_LF(Internal, Misc, "misc")
|
||||||
|
|
||||||
_LF(Misc, Tea, "tea")
|
_LF(Misc, Tea, "tea")
|
||||||
_LF(Misc, Printf, "printf")
|
_LF(Misc, Stdout, "stdout")
|
||||||
|
_LF(Misc, Stderr, "stderr")
|
||||||
_LF(Misc, Fprintf, "fprintf")
|
_LF(Misc, Fprintf, "fprintf")
|
||||||
_LF(Misc, Fprintf_s, "fprintf_s")
|
_LF(Misc, Fprintf_s, "fprintf_s")
|
||||||
_LF(Misc, Vfprintf_s, "vfprintf_s")
|
_LF(Misc, Vfprintf_s, "vfprintf_s")
|
||||||
|
@ -11,6 +11,21 @@ executable(
|
|||||||
win_subsystem: subsystem,
|
win_subsystem: subsystem,
|
||||||
sources: [
|
sources: [
|
||||||
'mxstartup.c',
|
'mxstartup.c',
|
||||||
|
'osu.c',
|
||||||
|
'osg.c',
|
||||||
|
],
|
||||||
|
link_with: [
|
||||||
|
amLog,
|
||||||
|
amiDebug,
|
||||||
|
amiCrc,
|
||||||
|
amBackup,
|
||||||
|
amEeprom,
|
||||||
|
amBackup,
|
||||||
|
amCmos,
|
||||||
|
amPlatform,
|
||||||
|
],
|
||||||
|
dependencies: [
|
||||||
|
ewfapi_lib,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
348
src/micetools/miceboot/osg.c
Normal file
348
src/micetools/miceboot/osg.c
Normal file
@ -0,0 +1,348 @@
|
|||||||
|
#include "osg.h"
|
||||||
|
|
||||||
|
#include <memory.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
mxdraw *mxdrawZero(mxdraw *this, OSU *osu) {
|
||||||
|
this->hasState = 0;
|
||||||
|
this->s1 = NULL;
|
||||||
|
this->s2 = NULL;
|
||||||
|
this->hInstance = NULL;
|
||||||
|
this->nCmdShow = 0;
|
||||||
|
this->hWnd = NULL;
|
||||||
|
this->hBitmap = NULL;
|
||||||
|
this->hDc = NULL;
|
||||||
|
this->dispWidth = 0;
|
||||||
|
this->dispHeight = 0;
|
||||||
|
this->font1 = NULL;
|
||||||
|
this->font2 = NULL;
|
||||||
|
this->font3 = NULL;
|
||||||
|
ShowCursor(0);
|
||||||
|
if (osu != NULL) {
|
||||||
|
this->hInstance = osu->hInstance;
|
||||||
|
this->nCmdShow = osu->nShowCmd;
|
||||||
|
this->s1 = osu->s1;
|
||||||
|
this->s2 = osu->s2;
|
||||||
|
this->hasState = 1;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mxdrawCleanup(mxdraw *this) {
|
||||||
|
ShowCursor(1);
|
||||||
|
DeleteObject(this->font1);
|
||||||
|
DeleteObject(this->font2);
|
||||||
|
DeleteObject(this->font3);
|
||||||
|
DeleteObject(this->hBitmap);
|
||||||
|
ReleaseDC(this->hWnd, this->hDc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void peekDispatchLoop(void) {
|
||||||
|
MSG msg;
|
||||||
|
PeekMessageA(&msg, NULL, 0, 0, 0);
|
||||||
|
while (msg.message != WM_QUIT) {
|
||||||
|
if (PeekMessageA(&msg, NULL, 0, 0, 1)) {
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessageA(&msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
COLORREF GetColour(colour col) {
|
||||||
|
switch (col) {
|
||||||
|
case Black:
|
||||||
|
return 0x000000;
|
||||||
|
case Red:
|
||||||
|
return 0x0000ff;
|
||||||
|
case Blue:
|
||||||
|
return 0xc80000;
|
||||||
|
case Green:
|
||||||
|
return 0xb4ffb4;
|
||||||
|
case Grey:
|
||||||
|
return 0x646464;
|
||||||
|
default:
|
||||||
|
return 0xffffff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void mxdrawR1(mxdraw *this) {
|
||||||
|
RECT rect;
|
||||||
|
rect.bottom = this->dispHeight;
|
||||||
|
rect.left = 0;
|
||||||
|
rect.top = 0;
|
||||||
|
rect.right = this->dispWidth;
|
||||||
|
|
||||||
|
EnterCriticalSection(&this->s1->criticalSection);
|
||||||
|
HBRUSH hbr = CreateSolidBrush(GetColour(this->s2->backgroundColour));
|
||||||
|
LeaveCriticalSection(&this->s1->criticalSection);
|
||||||
|
|
||||||
|
FillRect(this->hDc, &rect, hbr);
|
||||||
|
DeleteObject(hbr);
|
||||||
|
}
|
||||||
|
void mxdrawR2(mxdraw *this) {
|
||||||
|
if (!this->s1->show_top) return;
|
||||||
|
|
||||||
|
switch (this->s1->top_text_font) {
|
||||||
|
case 1:
|
||||||
|
SelectObject(this->hDc, this->font3);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
SelectObject(this->hDc, this->font1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SelectObject(this->hDc, this->font2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetTextAlign(this->hDc, TA_CENTER + TA_BASELINE);
|
||||||
|
SetTextColor(this->hDc, GetColour(this->s1->top_text_colour));
|
||||||
|
SetBkMode(this->hDc, TRANSPARENT);
|
||||||
|
|
||||||
|
EnterCriticalSection(&this->s1->criticalSection);
|
||||||
|
if (this->s1->str1)
|
||||||
|
TextOutA(this->hDc, this->dispWidth / 2, this->dispHeight / 6, this->s1->str1,
|
||||||
|
strlen(this->s1->str1));
|
||||||
|
LeaveCriticalSection(&this->s1->criticalSection);
|
||||||
|
}
|
||||||
|
void mxdrawR3(mxdraw *this) {
|
||||||
|
if (!this->s1->show_top) return;
|
||||||
|
|
||||||
|
switch (this->s1->top_text_font) {
|
||||||
|
case 1:
|
||||||
|
SelectObject(this->hDc, this->font3);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
SelectObject(this->hDc, this->font1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SelectObject(this->hDc, this->font2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetTextAlign(this->hDc, TA_CENTER + TA_BASELINE);
|
||||||
|
SetTextColor(this->hDc, GetColour(this->s1->top_text_colour));
|
||||||
|
SetBkMode(this->hDc, TRANSPARENT);
|
||||||
|
|
||||||
|
EnterCriticalSection(&this->s1->criticalSection);
|
||||||
|
if (this->s1->str2)
|
||||||
|
TextOutA(this->hDc, this->dispWidth / 2, this->dispHeight / 3, this->s1->str2,
|
||||||
|
strlen(this->s1->str2));
|
||||||
|
LeaveCriticalSection(&this->s1->criticalSection);
|
||||||
|
}
|
||||||
|
void mxdrawR4(mxdraw *this) {
|
||||||
|
static int _counter = 0;
|
||||||
|
|
||||||
|
SetTextAlign(this->hDc, TA_CENTER + TA_BASELINE);
|
||||||
|
switch (this->s2->status_font) {
|
||||||
|
case 1:
|
||||||
|
SelectObject(this->hDc, this->font3);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
SelectObject(this->hDc, this->font1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SelectObject(this->hDc, this->font2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetTextColor(this->hDc, GetColour(this->s2->status_colour));
|
||||||
|
SetBkMode(this->hDc, TRANSPARENT);
|
||||||
|
EnterCriticalSection(&this->s1->criticalSection);
|
||||||
|
if (this->s2->status_use_counter == 0 || _counter > 1) {
|
||||||
|
if (this->s2->status_str)
|
||||||
|
TextOutA(this->hDc, this->dispWidth / 2, this->dispHeight / 2, this->s2->status_str,
|
||||||
|
strlen(this->s2->status_str));
|
||||||
|
}
|
||||||
|
LeaveCriticalSection(&this->s1->criticalSection);
|
||||||
|
_counter = (_counter + 1) % 7;
|
||||||
|
}
|
||||||
|
void mxdrawR5(mxdraw *this) {
|
||||||
|
static int _counter = 0;
|
||||||
|
|
||||||
|
SetTextAlign(this->hDc, TA_CENTER + TA_TOP);
|
||||||
|
switch (this->s2->power_font) {
|
||||||
|
case 1:
|
||||||
|
SelectObject(this->hDc, this->font3);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
SelectObject(this->hDc, this->font1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SelectObject(this->hDc, this->font2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetTextColor(this->hDc, GetColour(this->s2->power_colour));
|
||||||
|
|
||||||
|
EnterCriticalSection(&this->s1->criticalSection);
|
||||||
|
if (this->s2->hide_power != 1 || _counter > 1) {
|
||||||
|
if (this->s2->str2)
|
||||||
|
TextOutA(this->hDc, (int)this->dispWidth / 2, (this->dispHeight * 4) / 6,
|
||||||
|
this->s2->str2, strlen(this->s2->str2));
|
||||||
|
}
|
||||||
|
LeaveCriticalSection(&this->s1->criticalSection);
|
||||||
|
_counter = (_counter + 1) % 7;
|
||||||
|
}
|
||||||
|
void mxdrawR6(mxdraw *this) {
|
||||||
|
if (!this->s1->debugEnable) return;
|
||||||
|
|
||||||
|
SetTextAlign(this->hDc, TA_LEFT + TA_BASELINE);
|
||||||
|
SelectObject(this->hDc, this->font3);
|
||||||
|
SetTextColor(this->hDc, GetColour(this->s2->debug_colour));
|
||||||
|
|
||||||
|
EnterCriticalSection(&this->s1->criticalSection);
|
||||||
|
if (this->s2->debug_text)
|
||||||
|
TextOutA(this->hDc, this->dispWidth / 10, (this->dispHeight * 10) / 11,
|
||||||
|
this->s2->debug_text, strlen(this->s2->debug_text));
|
||||||
|
LeaveCriticalSection(&this->s1->criticalSection);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mxdrawR7(mxdraw *this) {
|
||||||
|
SetTextAlign(this->hDc, TA_LEFT + TA_BASELINE);
|
||||||
|
SelectObject(this->hDc, this->font3);
|
||||||
|
SetTextColor(this->hDc, GetColour(this->s2->line5_colour));
|
||||||
|
|
||||||
|
EnterCriticalSection(&this->s1->criticalSection);
|
||||||
|
if (this->s2->line5)
|
||||||
|
TextOutA(this->hDc, 0, this->dispHeight, this->s2->line5, strlen(this->s2->line5));
|
||||||
|
LeaveCriticalSection(&this->s1->criticalSection);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mxdrawRender(mxdraw *this) {
|
||||||
|
this->dispWidth = GetSystemMetrics(0);
|
||||||
|
this->dispHeight = GetSystemMetrics(1);
|
||||||
|
if (this->dispWidth != 640 || this->dispHeight != 480) {
|
||||||
|
// iVar1 = amSysDataGetDotClockTiming(640, 480, local_38);
|
||||||
|
// if (iVar1 == 0) {
|
||||||
|
// amPlatformSetDisplayResolution(local_38, extraout_EDX, (ushort *)local_38);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
mxdrawR1(this); // Clear background
|
||||||
|
mxdrawR2(this); // s1, str1
|
||||||
|
mxdrawR3(this); // s1, str2
|
||||||
|
mxdrawR4(this); // s2, status_str
|
||||||
|
mxdrawR5(this); // s2, str2
|
||||||
|
mxdrawR6(this); // s2, debug_text
|
||||||
|
mxdrawR7(this); // s2, line5
|
||||||
|
|
||||||
|
HDC hdc = GetDC(this->hWnd);
|
||||||
|
BitBlt(hdc, 0, 0, this->dispWidth, this->dispHeight, this->hDc, 0, 0, SRCCOPY);
|
||||||
|
ReleaseDC(this->hWnd, hdc);
|
||||||
|
SetWindowPos(this->hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
||||||
|
if (uMsg == WM_CREATE) {
|
||||||
|
SetTimer(hWnd, 15000, 0x80, NULL);
|
||||||
|
} else if (uMsg == WM_DESTROY) {
|
||||||
|
RemovePropA(hWnd, "prp");
|
||||||
|
PostQuitMessage(0);
|
||||||
|
} else if (uMsg == WM_TIMER) {
|
||||||
|
mxdraw *this = (mxdraw *)GetPropA(hWnd, "prp");
|
||||||
|
mxdrawRender(this);
|
||||||
|
if (this->s2->only_sends_if == 1) {
|
||||||
|
SendMessageA(hWnd, WM_DESTROY, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DefWindowProcA(hWnd, uMsg, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mxdrawSetup(mxdraw *this) {
|
||||||
|
if (this->hasState == 0) return 1;
|
||||||
|
|
||||||
|
WNDCLASSEXA class;
|
||||||
|
class.hInstance = this->hInstance;
|
||||||
|
class.cbSize = 0x30;
|
||||||
|
class.style = 3;
|
||||||
|
class.lpfnWndProc = WndProc;
|
||||||
|
class.cbClsExtra = 0;
|
||||||
|
class.cbWndExtra = 0;
|
||||||
|
class.hIcon = LoadIconA(NULL, IDI_APPLICATION);
|
||||||
|
class.hCursor = LoadCursorA(NULL, IDC_ARROW);
|
||||||
|
class.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
|
||||||
|
class.lpszMenuName = NULL;
|
||||||
|
class.lpszClassName = "MxDraw";
|
||||||
|
class.hIconSm = LoadIconA(NULL, IDI_APPLICATION);
|
||||||
|
if (!RegisterClassExA(&class)) {
|
||||||
|
if (GetLastError() != ERROR_CLASS_ALREADY_EXISTS) return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->dispWidth = GetSystemMetrics(SM_CXSCREEN);
|
||||||
|
this->dispHeight = GetSystemMetrics(SM_CYSCREEN);
|
||||||
|
if (this->dispWidth != 640 || this->dispHeight != 480) {
|
||||||
|
// TODO: This
|
||||||
|
// setres_640_480();
|
||||||
|
this->dispWidth = GetSystemMetrics(SM_CXSCREEN);
|
||||||
|
this->dispHeight = GetSystemMetrics(SM_CYSCREEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->hWnd =
|
||||||
|
CreateWindowExA(0, "MxDraw", "MxDraw", WS_DISABLED | WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT,
|
||||||
|
this->dispWidth, this->dispHeight, NULL, NULL, this->hInstance, NULL);
|
||||||
|
SetPropA(this->hWnd, "prp", this);
|
||||||
|
|
||||||
|
this->font1 = CreateFontA((int)(this->dispHeight * 0.125f), 0, 0, 0, 700, FALSE, FALSE, FALSE,
|
||||||
|
0, 7, 0, 0, 1, "Tahoma bold");
|
||||||
|
this->font2 = CreateFontA((int)(this->dispHeight * 0.09f), 0, 0, 0, 700, FALSE, FALSE, FALSE, 0,
|
||||||
|
7, 0, 0, 1, "Tahoma bold");
|
||||||
|
this->font3 = CreateFontA((int)(this->dispHeight * 0.03125f), 0, 0, 0, 700, FALSE, FALSE, FALSE,
|
||||||
|
0, 7, 0, 0, 1, "Tahoma bold");
|
||||||
|
|
||||||
|
ShowWindow(this->hWnd, this->nCmdShow);
|
||||||
|
UpdateWindow(this->hWnd);
|
||||||
|
HDC hdc = GetDC(this->hWnd);
|
||||||
|
this->hBitmap = CreateCompatibleBitmap(hdc, this->dispWidth, this->dispHeight);
|
||||||
|
this->hDc = CreateCompatibleDC(hdc);
|
||||||
|
ReleaseDC(this->hWnd, hdc);
|
||||||
|
SelectObject(this->hDc, this->hBitmap);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD mxdrawThread(OSU *osu) {
|
||||||
|
mxdraw *this = (mxdraw *)malloc(sizeof *this);
|
||||||
|
if (this != NULL) mxdrawZero(this, osu);
|
||||||
|
mxdrawSetup(this);
|
||||||
|
peekDispatchLoop();
|
||||||
|
if (this != NULL) {
|
||||||
|
mxdrawCleanup(this);
|
||||||
|
free(this);
|
||||||
|
}
|
||||||
|
ExitThread(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL osgInitDraw(OSU *lpOsu) {
|
||||||
|
OSU *lpParameter;
|
||||||
|
HANDLE pvVar1;
|
||||||
|
|
||||||
|
lpParameter = lpOsu;
|
||||||
|
if (lpOsu == NULL) return FALSE;
|
||||||
|
|
||||||
|
InitializeCriticalSection(&lpOsu->s1->criticalSection);
|
||||||
|
EnterCriticalSection(&lpParameter->s1->criticalSection);
|
||||||
|
lpParameter->s2->only_sends_if = 0;
|
||||||
|
LeaveCriticalSection(&lpParameter->s1->criticalSection);
|
||||||
|
pvVar1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)mxdrawThread, lpParameter, 0,
|
||||||
|
(LPDWORD)&lpOsu);
|
||||||
|
lpParameter->handle = pvVar1;
|
||||||
|
if (pvVar1 == NULL) {
|
||||||
|
lpParameter->field3_0xc = 0;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
lpParameter->field3_0xc = 1;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL osgExit(OSU *this) {
|
||||||
|
if (this->field3_0xc != 1) return FALSE;
|
||||||
|
|
||||||
|
EnterCriticalSection(&this->s1->criticalSection);
|
||||||
|
this->s2->only_sends_if = 1;
|
||||||
|
LeaveCriticalSection(&this->s1->criticalSection);
|
||||||
|
WaitForSingleObject(this->handle, INFINITE);
|
||||||
|
CloseHandle(this->handle);
|
||||||
|
DeleteCriticalSection(&this->s1->criticalSection);
|
||||||
|
this->field3_0xc = 0;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
72
src/micetools/miceboot/osg.h
Normal file
72
src/micetools/miceboot/osg.h
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
typedef enum colour {
|
||||||
|
White = 0,
|
||||||
|
Black = 1,
|
||||||
|
Red = 2,
|
||||||
|
Blue = 3,
|
||||||
|
Green = 4,
|
||||||
|
Grey = 5,
|
||||||
|
} colour;
|
||||||
|
|
||||||
|
typedef struct OSU_TOP {
|
||||||
|
BOOL show_top;
|
||||||
|
BOOL debugEnable;
|
||||||
|
char *str1;
|
||||||
|
char *str2;
|
||||||
|
colour top_text_colour;
|
||||||
|
DWORD top_text_font;
|
||||||
|
CRITICAL_SECTION criticalSection;
|
||||||
|
} OSU_TOP;
|
||||||
|
|
||||||
|
typedef struct OSU_BOTTOM {
|
||||||
|
colour backgroundColour;
|
||||||
|
char *status_str;
|
||||||
|
colour status_colour;
|
||||||
|
DWORD status_font;
|
||||||
|
DWORD status_use_counter;
|
||||||
|
char *str2;
|
||||||
|
colour power_colour;
|
||||||
|
DWORD power_font;
|
||||||
|
DWORD hide_power;
|
||||||
|
char *line5;
|
||||||
|
colour line5_colour;
|
||||||
|
char *debug_text;
|
||||||
|
colour debug_colour;
|
||||||
|
DWORD only_sends_if;
|
||||||
|
} OSU_BOTTOM;
|
||||||
|
|
||||||
|
typedef struct OSU {
|
||||||
|
HINSTANCE hInstance;
|
||||||
|
int nShowCmd;
|
||||||
|
HANDLE handle;
|
||||||
|
unsigned int field3_0xc;
|
||||||
|
OSU_TOP *s1;
|
||||||
|
OSU_BOTTOM *s2;
|
||||||
|
} OSU;
|
||||||
|
|
||||||
|
typedef struct mxdraw {
|
||||||
|
unsigned int hasState;
|
||||||
|
OSU_TOP *s1;
|
||||||
|
OSU_BOTTOM *s2;
|
||||||
|
HINSTANCE hInstance;
|
||||||
|
unsigned int nCmdShow;
|
||||||
|
HWND hWnd;
|
||||||
|
HBITMAP hBitmap;
|
||||||
|
HDC hDc;
|
||||||
|
unsigned int dispWidth;
|
||||||
|
unsigned int dispHeight;
|
||||||
|
HGDIOBJ font1;
|
||||||
|
HGDIOBJ font2;
|
||||||
|
HGDIOBJ font3;
|
||||||
|
} mxdraw;
|
||||||
|
|
||||||
|
mxdraw *mxdrawZero(mxdraw *this, OSU *osu);
|
||||||
|
void mxdrawCleanup(mxdraw *this);
|
||||||
|
void peekDispatchLoop(void);
|
||||||
|
void mxdrawRender(mxdraw *this);
|
||||||
|
int mxdrawSetup(mxdraw *this);
|
||||||
|
DWORD mxdrawThread(OSU *osu);
|
||||||
|
|
||||||
|
BOOL osgInitDraw(OSU *lpOsu);
|
||||||
|
BOOL osgExit(OSU *lpOsu);
|
126
src/micetools/miceboot/osu.c
Normal file
126
src/micetools/miceboot/osu.c
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
#include "osu.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "../lib/am/amCmos.h"
|
||||||
|
#include "../lib/am/amPlatform.h"
|
||||||
|
|
||||||
|
int osuExecProcess(LPSTR command) {
|
||||||
|
PROCESS_INFORMATION processInformation = { 0 };
|
||||||
|
STARTUPINFOA startupInfo = {
|
||||||
|
.cb = 68,
|
||||||
|
.dwFlags = STARTF_USESHOWWINDOW,
|
||||||
|
.wShowWindow = SW_HIDE,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (command == NULL) return -150;
|
||||||
|
|
||||||
|
BOOL spanwed = CreateProcessA(NULL, command, NULL, NULL, 0, 0, NULL, NULL, &startupInfo,
|
||||||
|
&processInformation);
|
||||||
|
DWORD wait = WaitForSingleObject(processInformation.hProcess, INFINITE);
|
||||||
|
|
||||||
|
int ret;
|
||||||
|
if (!spanwed) {
|
||||||
|
ret = -140;
|
||||||
|
} else if (wait == WAIT_OBJECT_0) {
|
||||||
|
DWORD exitCode;
|
||||||
|
GetExitCodeProcess(processInformation.hProcess, &exitCode);
|
||||||
|
ret = exitCode == 0 ? 0 : -141;
|
||||||
|
} else {
|
||||||
|
ret = -141;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(processInformation.hProcess);
|
||||||
|
CloseHandle(processInformation.hThread);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int osuMountPartition(LPCSTR lpTargetPath, LPCSTR lpszVolumeMountPoint) {
|
||||||
|
if (lpTargetPath == NULL || lpszVolumeMountPoint == NULL) return -150;
|
||||||
|
|
||||||
|
DefineDosDeviceA(DDD_RAW_TARGET_PATH, "B:", lpTargetPath);
|
||||||
|
char szVolumeName[256];
|
||||||
|
GetVolumeNameForVolumeMountPointA("B:\\", szVolumeName, sizeof szVolumeName);
|
||||||
|
DefineDosDeviceA(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE,
|
||||||
|
"B:", lpTargetPath);
|
||||||
|
|
||||||
|
if (!SetVolumeMountPointA(lpszVolumeMountPoint, szVolumeName)) return -129;
|
||||||
|
|
||||||
|
for (int i = 0; i < 100; i++)
|
||||||
|
if (DefineDosDeviceA(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION, "B:", NULL)) break;
|
||||||
|
|
||||||
|
char szDeviceName[260];
|
||||||
|
sprintf_s(szDeviceName, sizeof szDeviceName, "%c:", lpszVolumeMountPoint[4]);
|
||||||
|
|
||||||
|
if (!DefineDosDeviceA(DDD_RAW_TARGET_PATH, szDeviceName, lpTargetPath)) return -130;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int osuOpenDevice(DWORD dwDrive, LPHANDLE lphDevice) {
|
||||||
|
char szFileName[32];
|
||||||
|
sprintf_s(szFileName, sizeof szFileName, "\\\\.\\PhysicalDrive%d", dwDrive);
|
||||||
|
|
||||||
|
HANDLE hDevice = *lphDevice = CreateFileA(szFileName, 0xc0000000, 3, NULL, 3, 0x80, NULL);
|
||||||
|
if (hDevice == INVALID_HANDLE_VALUE) return -123;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int osuReadSector(HANDLE hDevice, DWORD dwLBA, DWORD dwSectors, LPVOID lpBuffer) {
|
||||||
|
LARGE_INTEGER liPointer;
|
||||||
|
liPointer.QuadPart = (unsigned long long)dwLBA * 0x200;
|
||||||
|
if (!SetFilePointerEx(hDevice, liPointer, NULL, FILE_BEGIN)) return -124;
|
||||||
|
if (lpBuffer == NULL) return -150;
|
||||||
|
|
||||||
|
DWORD nNumberOfBytesToRead = dwSectors * 0x200;
|
||||||
|
DWORD nRead = 0;
|
||||||
|
if (!ReadFile(hDevice, lpBuffer, nNumberOfBytesToRead, &nRead, NULL)) return -125;
|
||||||
|
if (nRead != nNumberOfBytesToRead || ((dwSectors * 0x200) >> 32) != 0) return -126;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int osuSystemReboot(void) {
|
||||||
|
int eCode = 0;
|
||||||
|
|
||||||
|
HANDLE hToken = INVALID_HANDLE_VALUE;
|
||||||
|
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
|
||||||
|
eCode = -142;
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
|
TOKEN_PRIVILEGES privileges;
|
||||||
|
if (!LookupPrivilegeValueA(NULL, "SeShutdownPrivilege", &privileges.Privileges[0].Luid)) {
|
||||||
|
eCode = -143;
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
|
privileges.PrivilegeCount = 1;
|
||||||
|
privileges.Privileges[0].Attributes = 2;
|
||||||
|
if (!AdjustTokenPrivileges(hToken, 0, &privileges, 0, NULL, NULL)) {
|
||||||
|
eCode = -144;
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
|
if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0)) {
|
||||||
|
eCode = -145;
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
|
|
||||||
|
_end:
|
||||||
|
if (hToken != INVALID_HANDLE_VALUE) CloseHandle(hToken);
|
||||||
|
return eCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
int osuSetActivePartition(BYTE partition) {
|
||||||
|
AM_PLATFORM_BOARD_TYPE board_type;
|
||||||
|
|
||||||
|
if (amPlatformGetBoardType(&board_type) != AM_PLATFORM_STATUS_OK) return -110;
|
||||||
|
|
||||||
|
AM_PLATFORM_CMOS_PARAM* lpParam = amPlatformGetCmosParam(board_type);
|
||||||
|
if (amCmosInit(lpParam) != 0) return -114;
|
||||||
|
|
||||||
|
if (amCmosSetPartition_0(partition) != 0) {
|
||||||
|
amCmosExit();
|
||||||
|
return -111;
|
||||||
|
}
|
||||||
|
|
||||||
|
amCmosExit();
|
||||||
|
return 0;
|
||||||
|
}
|
8
src/micetools/miceboot/osu.h
Normal file
8
src/micetools/miceboot/osu.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
int osuExecProcess(LPSTR command);
|
||||||
|
int osuMountPartition(LPCSTR lpTargetPath, LPCSTR lpszVolumeMountPoint);
|
||||||
|
int osuOpenDevice(DWORD dwDrive, LPHANDLE lphDevice);
|
||||||
|
int osuReadSector(HANDLE hDevice, DWORD dwLBA, DWORD dwSectors, LPVOID lpBuffer);
|
||||||
|
int osuSystemReboot(void);
|
||||||
|
int osuSetActivePartition(BYTE partition);
|
@ -13,34 +13,37 @@ void mxkPcpTdRestore(pcpa_t* stream, void* data) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
void mxkPcpTdPut(pcpa_t* stream, void* data) {
|
void mxkPcpTdPut(pcpa_t* stream, void* data) {
|
||||||
char* sPut = pcpaGetCommand(stream, TRA_PUT);
|
// char* sPut = pcpaGetCommand(stream, TRA_PUT);
|
||||||
|
|
||||||
if (strcmp(sPut, "?")) {
|
// if (strcmp(sPut, "?")) {
|
||||||
pcpaSetSendPacket(stream, TRA_PUT, "0");
|
// pcpaSetSendPacket(stream, TRA_PUT, "0");
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Process packet maybe?
|
// // Process packet maybe?
|
||||||
pcpaSetSendPacket(stream, TRA_PUT, "0");
|
// pcpaSetSendPacket(stream, TRA_PUT, "0");
|
||||||
|
pcpaSetSendPacket(stream, TRA_PUT, "6410");
|
||||||
}
|
}
|
||||||
void mxkPcpTdGet(pcpa_t* stream, void* data) {
|
void mxkPcpTdGet(pcpa_t* stream, void* data) {
|
||||||
char* sPut = pcpaGetCommand(stream, TRA_GET);
|
// char* sPut = pcpaGetCommand(stream, TRA_GET);
|
||||||
pcpaSetSendPacket(stream, TRA_GET, "0");
|
// pcpaSetSendPacket(stream, TRA_GET, "0");
|
||||||
if (sPut && strcmp(sPut, "?") == 0) {
|
// if (sPut && strcmp(sPut, "?") == 0) {
|
||||||
pcpaAddSendPacket(stream, "address", "0");
|
// pcpaAddSendPacket(stream, "address", "0");
|
||||||
} else {
|
// } else {
|
||||||
pcpaSetBinaryMode(stream, binary_mode_send);
|
// pcpaSetBinaryMode(stream, binary_mode_send);
|
||||||
pcpaSetBeforeBinaryModeCallBackFunc(stream, mxkBinaryCallback, NULL);
|
// pcpaSetBeforeBinaryModeCallBackFunc(stream, mxkBinaryCallback, NULL);
|
||||||
|
|
||||||
BINARY_DATA_LEN = 0;
|
// BINARY_DATA_LEN = 0;
|
||||||
pcpaSetRecvBinaryBuffer(stream, BINARY_DATA, BINARY_DATA_LEN);
|
// pcpaSetRecvBinaryBuffer(stream, BINARY_DATA, BINARY_DATA_LEN);
|
||||||
pcpaAddSendPacket(stream, "port", "40107");
|
// pcpaAddSendPacket(stream, "port", "40107");
|
||||||
pcpaAddSendPacket(stream, "size", "0");
|
// pcpaAddSendPacket(stream, "size", "0");
|
||||||
}
|
// }
|
||||||
|
pcpaSetSendPacket(stream, TRA_GET, "0");
|
||||||
|
pcpaAddSendPacket(stream, "address", "0");
|
||||||
}
|
}
|
||||||
void mxkPcpTdLogicalErase(pcpa_t* stream, void* data) {
|
void mxkPcpTdLogicalErase(pcpa_t* stream, void* data) {
|
||||||
pcpaSetSendPacket(stream, TRA_LOGICALERASE, "");
|
pcpaSetSendPacket(stream, TRA_LOGICALERASE, "0");
|
||||||
}
|
}
|
||||||
void mxkPcpTdSectorErase(pcpa_t* stream, void* data) {
|
void mxkPcpTdSectorErase(pcpa_t* stream, void* data) {
|
||||||
pcpaSetSendPacket(stream, TRA_SECTOREERASE, "");
|
pcpaSetSendPacket(stream, TRA_SECTOREERASE, "0");
|
||||||
}
|
}
|
||||||
|
@ -26,11 +26,25 @@ int mxkInit() {
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void log_callback(struct pcpa *stream, void *data) {
|
void log_callback(struct pcpa *stream, char *data, size_t nData) {
|
||||||
FILE *log_file;
|
FILE *log_file;
|
||||||
fopen_s(&log_file, "pcp.log", "a");
|
fopen_s(&log_file, "pcp.log", "a");
|
||||||
|
|
||||||
|
for (uint i = 0; i < stream->recv_data.cmd_count; i++) {
|
||||||
|
if (i != 0) fprintf(stderr, "&");
|
||||||
|
fprintf(stderr, "%s=%s", stream->recv_data.strings + stream->recv_data.keywords[i],
|
||||||
|
stream->recv_data.strings + stream->recv_data.values[i]);
|
||||||
|
|
||||||
|
if (log_file != NULL) {
|
||||||
|
if (i != 0) fprintf(log_file, "&");
|
||||||
|
fprintf(log_file, "%s=%s", stream->recv_data.strings + stream->recv_data.keywords[i],
|
||||||
|
stream->recv_data.strings + stream->recv_data.values[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
|
||||||
if (log_file != NULL) {
|
if (log_file != NULL) {
|
||||||
fprintf(log_file, "%s\n", (char *)data);
|
fprintf(log_file, "\n");
|
||||||
fclose(log_file);
|
fclose(log_file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
93
src/micetools/system_dummy/dummystorage/dummystorage.c
Normal file
93
src/micetools/system_dummy/dummystorage/dummystorage.c
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
#include "dummystorage.h"
|
||||||
|
|
||||||
|
#include "../../lib/ami/amiLog.h"
|
||||||
|
#include "../../lib/libpcp/libpcp.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
pcpa_t m_pcp;
|
||||||
|
pcpa_cb_table_t m_pcpCallbacks[1];
|
||||||
|
} mdsd_t;
|
||||||
|
|
||||||
|
void mdsdRequest(pcpa_t* stream, void* mdsd) {
|
||||||
|
char* szRequest = pcpaGetCommand(stream, pcpaGetKeyword(stream, 0));
|
||||||
|
|
||||||
|
if (szRequest == NULL) {
|
||||||
|
pcpaSetSendPacket(stream, "result", "invalid_request");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pcpaSetSendPacket(stream, "response", szRequest);
|
||||||
|
|
||||||
|
if (strcmp(szRequest, "query_storage_status") == 0) {
|
||||||
|
// pcpaAddSendPacket(stream, "result", "success");
|
||||||
|
pcpaAddSendPacket(stream, "result", "notask");
|
||||||
|
} else if (strcmp(szRequest, "query_storage_count") == 0) {
|
||||||
|
pcpaAddSendPacket(stream, "result", "success");
|
||||||
|
// Under normal operation, this is 0 (no USB inserted).
|
||||||
|
pcpaAddSendPacket(stream, "count", "1");
|
||||||
|
} else if (strcmp(szRequest, "get_volume") == 0) {
|
||||||
|
pcpaAddSendPacket(stream, "result", "success");
|
||||||
|
pcpaAddSendPacket(stream, "volume", "SEGA_DL");
|
||||||
|
} else {
|
||||||
|
pcpaAddSendPacket(stream, "result", "invalid_request");
|
||||||
|
// TODO: Remove this once enough has been implemented for most games?
|
||||||
|
pcpaPrint(stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e_pcpa_t mdsPcpStreamInit(mdsd_t* mdsd, unsigned short textPort, unsigned short binaryPort,
|
||||||
|
bool global) {
|
||||||
|
e_pcpa_t err;
|
||||||
|
|
||||||
|
err = pcpaInitStream(&mdsd->m_pcp);
|
||||||
|
if (err != e_pcpa_ok) {
|
||||||
|
amiDebugLog("pcpaInitStream Error. Code:%d", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = pcpaSetCallbackFuncBuffer(&mdsd->m_pcp, mdsd->m_pcpCallbacks, 1);
|
||||||
|
if (err != e_pcpa_ok) {
|
||||||
|
amiDebugLog("pcpaSetCallBackFuncBuffer Error. Code:%d", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcpaSetCallbackFunc(&mdsd->m_pcp, "request", mdsdRequest, mdsd);
|
||||||
|
|
||||||
|
err = pcpaOpenServerWithBinary(&mdsd->m_pcp, global ? OPEN_MODE_GLOBAL : OPEN_MODE_LOCAL,
|
||||||
|
textPort, binaryPort, 300000);
|
||||||
|
if (err != e_pcpa_ok && err != e_pcpa_to) {
|
||||||
|
amiDebugLog("pcpaOpenServerWithBinary Error. Code %d", err);
|
||||||
|
return e_pcpa_not_open;
|
||||||
|
}
|
||||||
|
if (global)
|
||||||
|
amiDebugLog("Listening on 0.0.0.0:%d (:%d)", textPort, binaryPort);
|
||||||
|
else
|
||||||
|
amiDebugLog("Listening on 127.0.0.1:%d (:%d)", textPort, binaryPort);
|
||||||
|
return e_pcpa_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
void miceDummyStorage(unsigned short textPort, unsigned short binaryPort, bool global) {
|
||||||
|
mdsd_t* mdsd = malloc(sizeof *mdsd);
|
||||||
|
e_pcpa_t err;
|
||||||
|
|
||||||
|
WSADATA wsaData;
|
||||||
|
if (WSAStartup(2, &wsaData)) {
|
||||||
|
amiDebugLog("WSAStartup Error. Code %d", GetLastError());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = mdsPcpStreamInit(mdsd, textPort, binaryPort, global);
|
||||||
|
if (err != e_pcpa_ok) {
|
||||||
|
amiDebugLog("mdsdPcpStreamInit Error. Code %d", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
err = pcpaServer(&mdsd->m_pcp, 16);
|
||||||
|
if (err == e_pcpa_to || err == e_pcpa_closed) err = e_pcpa_ok;
|
||||||
|
|
||||||
|
if (err != e_pcpa_ok) {
|
||||||
|
amiDebugLog("Error pcpaServer. Code %d", err);
|
||||||
|
pcpaClose(&mdsd->m_pcp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
src/micetools/system_dummy/dummystorage/dummystorage.h
Normal file
3
src/micetools/system_dummy/dummystorage/dummystorage.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
void miceDummyStorage(unsigned short textPort, unsigned short binaryPort, bool global);
|
3
src/micetools/system_dummy/dummystorage/main.c
Normal file
3
src/micetools/system_dummy/dummystorage/main.c
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#include "dummystorage.h"
|
||||||
|
|
||||||
|
int main() { miceDummyStorage(40114, 40115, false); }
|
7
src/micetools/system_dummy/dummystorage/meson.build
Normal file
7
src/micetools/system_dummy/dummystorage/meson.build
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
dummystorage = static_library(
|
||||||
|
'dummystorage',
|
||||||
|
sources: [
|
||||||
|
'dummystorage.c',
|
||||||
|
],
|
||||||
|
link_with: [libpcp, amiDebug],
|
||||||
|
)
|
@ -3,3 +3,4 @@ subdir('dummymaster')
|
|||||||
subdir('dummyinstaller')
|
subdir('dummyinstaller')
|
||||||
subdir('dummygdeliver')
|
subdir('dummygdeliver')
|
||||||
subdir('dummynetwork')
|
subdir('dummynetwork')
|
||||||
|
subdir('dummystorage')
|
||||||
|
@ -27,9 +27,10 @@ Cmos:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../lib/am/amCmos.h"
|
#include "../lib/am/amCmos.h"
|
||||||
|
#include "../lib/am/amPlatform.h"
|
||||||
|
|
||||||
AM_CMOS_CONFIG config = {
|
AM_PLATFORM_CMOS_PARAM config = {
|
||||||
.index = { 0, 0, 0, 0 },
|
.index = { { 0, 0 }, { 0, 0 } },
|
||||||
.m_MbrCount = 0,
|
.m_MbrCount = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user