⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 registry.c

📁 DC的SEGA_GG模拟器源代码
💻 C
字号:
#include <windows.h>
#include "shared.h"
#include "dinput.h"
#include "main.h"
#include "input.h"
#include "registry.h"

REGISTRY_INFO								RegistryInfo;

// Sets up the default registry entries, either for first time use
// or incase the load registry entries fails
void InitRegistryEntries(void)
{
	unsigned char	ButtonMap[MAX_PLAYERS][NO_OF_BUTTONS] = REGISTRY_DEFAULT_BUTTON_MAP;
	char			TempPath[MAX_PATH];
	int				i, j;

	GetTempPath(MAX_PATH, TempPath);

	memset(&RegistryInfo, 0, sizeof(REGISTRY_INFO));

	RegistryInfo.ScreenScale	 = REGISTRY_DEFAULT_SCREEN_SCALE;
	RegistryInfo.UpdateFrequency = REGISTRY_DEFAULT_UPDATE_FREQUENCY;
	RegistryInfo.FrameSkip		 = REGISTRY_DEFAULT_FRAME_SKIP;
	memcpy(RegistryInfo.ButtonMap, ButtonMap, sizeof(ButtonMap));
	strcpy(RegistryInfo.ROMPath, REGISTRY_DEFAULT_ROM_PATH);
	strcpy(RegistryInfo.SRAMPath, TempPath);
	strcpy(RegistryInfo.ScreenshotPath, REGISTRY_DEFAULT_SCREENSHOT_PATH);
	strcpy(RegistryInfo.SaveStatePath, REGISTRY_DEFAULT_SAVESTATE_PATH);
	strcpy(RegistryInfo.SoundRecordPath, REGISTRY_DEFAULT_SOUND_PATH);

	for (j = 0 ; j < 2 ; j++)
	{
		for (i = 0 ; i < sizeof(RegistryInfo.JoystickMap) ; i++)
		{
			RegistryInfo.JoystickMap[j][i] = i;
		}

		strcpy(RegistryInfo.Joystick[j], "");
		RegistryInfo.DisableKeys[j]   = REGISTRY_DEFAULT_DISABLE_KEYS;
		RegistryInfo.RapidFireRate[j] = REGISTRY_DEFAULT_RAPID_FIRE_RATE;
	}

	RegistryInfo.EnableSound	 = REGISTRY_DEFAULT_SOUND_ENABLE;
	RegistryInfo.EnableFMSound	 = REGISTRY_DEFAULT_SOUND_ENABLE;
	RegistryInfo.SoundFrequency	 = REGISTRY_DEFAULT_SOUND_FREQUENCY;
	memset(RegistryInfo.RapidFire, 0, sizeof(RegistryInfo.RapidFire));
	RegistryInfo.Region			 = REGISTRY_DEFAULT_REGION;
	RegistryInfo.SingleSaveState = REGISTRY_DEFAULT_SINGLE_SAVESTATE;
	RegistryInfo.Gamma			 = REGISTRY_DEFAULT_GAMMA;
	RegistryInfo.ScreenSmoothing = REGISTRY_DEFAULT_SCREEN_SMOOTHING;
	RegistryInfo.FullScreenMode  = REGISTRY_DEFAULT_FULL_SCREEN_MODE;
	RegistryInfo.FullScreen		 = REGISTRY_DEFAULT_FULL_SCREEN;
	RegistryInfo.EnableDirectDraw= REGISTRY_DEFAULT_DIRECT_DRAW_ENABLE;
	RegistryInfo.EnableScanLines = REGISTRY_DEFAULT_SCANLINES;
	RegistryInfo.FMVolume		 = REGISTRY_DEFAULT_FM_VOLUME;
}

// Loads the settings from the registry
BOOL LoadRegistryEntries(void)
{
	char			Key[_MAX_PATH];
	int				Result;
	HKEY			hkey;
	unsigned long	DataSize;

	wsprintf(Key, "Software%s", REGISTRY_KEY);
	
	Result = RegOpenKeyEx(HKEY_CURRENT_USER,	// handle
						  Key,					// subkey
						  0,
						  KEY_READ,				// access mask
						  &hkey);				// pointer to recieving handle

	if (Result != ERROR_SUCCESS) return FALSE;

	DataSize = sizeof(RegistryInfo.ScreenScale);
	RegQueryValueEx(hkey, REGISTRY_SCREEN_SCALE, NULL, NULL, (LPBYTE)&RegistryInfo.ScreenScale, &DataSize);
	DataSize = sizeof(RegistryInfo.UpdateFrequency);
	RegQueryValueEx(hkey, REGISTRY_UPDATE_FREQUENCY, NULL, NULL, (LPBYTE)&RegistryInfo.UpdateFrequency, &DataSize);
	DataSize = sizeof(RegistryInfo.FrameSkip);
	RegQueryValueEx(hkey, REGISTRY_FRAME_SKIP, NULL, NULL, (LPBYTE)&RegistryInfo.FrameSkip, &DataSize);
	DataSize = sizeof(RegistryInfo.ButtonMap);
	RegQueryValueEx(hkey, REGISTRY_BUTTON_MAP, NULL, NULL, (LPBYTE)&RegistryInfo.ButtonMap, &DataSize);
	DataSize = sizeof(RegistryInfo.ROMPath);
	RegQueryValueEx(hkey, REGISTRY_ROM_PATH, NULL, NULL, (LPBYTE)&RegistryInfo.ROMPath, &DataSize);
	DataSize = sizeof(RegistryInfo.SRAMPath);
	RegQueryValueEx(hkey, REGISTRY_SRAM_PATH, NULL, NULL, (LPBYTE)&RegistryInfo.SRAMPath, &DataSize);
	DataSize = sizeof(RegistryInfo.ScreenshotPath);
	RegQueryValueEx(hkey, REGISTRY_SCREENSHOT_PATH, NULL, NULL, (LPBYTE)&RegistryInfo.ScreenshotPath, &DataSize);
	DataSize = sizeof(RegistryInfo.SaveStatePath);
	RegQueryValueEx(hkey, REGISTRY_SAVESTATE_PATH, NULL, NULL, (LPBYTE)&RegistryInfo.SaveStatePath, &DataSize);
	DataSize = sizeof(RegistryInfo.SoundRecordPath);
	RegQueryValueEx(hkey, REGISTRY_SOUND_PATH, NULL, NULL, (LPBYTE)&RegistryInfo.SoundRecordPath, &DataSize);
	DataSize = sizeof(RegistryInfo.Joystick);
	RegQueryValueEx(hkey, REGISTRY_JOYSTICK, NULL, NULL, (LPBYTE)&RegistryInfo.Joystick, &DataSize);
	DataSize = sizeof(RegistryInfo.JoystickMap);
	RegQueryValueEx(hkey, REGISTRY_JOYSTICK_MAP, NULL, NULL, (LPBYTE)&RegistryInfo.JoystickMap, &DataSize);
	DataSize = sizeof(RegistryInfo.EnableSound);
	RegQueryValueEx(hkey, REGISTRY_SOUND_ENABLE, NULL, NULL, (LPBYTE)&RegistryInfo.EnableSound, &DataSize);
	DataSize = sizeof(RegistryInfo.EnableFMSound);
	RegQueryValueEx(hkey, REGISTRY_SOUND_FM_ENABLE, NULL, NULL, (LPBYTE)&RegistryInfo.EnableFMSound, &DataSize);
	DataSize = sizeof(RegistryInfo.SoundFrequency);
	RegQueryValueEx(hkey, REGISTRY_SOUND_FREQUENCY, NULL, NULL, (LPBYTE)&RegistryInfo.SoundFrequency, &DataSize);
	DataSize = sizeof(RegistryInfo.RapidFire);
	RegQueryValueEx(hkey, REGISTRY_RAPID_FIRE, NULL, NULL, (LPBYTE)&RegistryInfo.RapidFire, &DataSize);
	DataSize = sizeof(RegistryInfo.RapidFireRate);
	RegQueryValueEx(hkey, REGISTRY_RAPID_FIRE_RATE, NULL, NULL, (LPBYTE)&RegistryInfo.RapidFireRate, &DataSize);
	DataSize = sizeof(RegistryInfo.DisableKeys);
	RegQueryValueEx(hkey, REGISTRY_DISABLE_KEYS, NULL, NULL, (LPBYTE)&RegistryInfo.DisableKeys, &DataSize);
	DataSize = sizeof(RegistryInfo.Region);
	RegQueryValueEx(hkey, REGISTRY_REGION, NULL, NULL, (LPBYTE)&RegistryInfo.Region, &DataSize);
	DataSize = sizeof(RegistryInfo.SingleSaveState);
	RegQueryValueEx(hkey, REGISTRY_SINGLE_SAVESTATE, NULL, NULL, (LPBYTE)&RegistryInfo.SingleSaveState, &DataSize);
	DataSize = sizeof(RegistryInfo.Gamma);
	RegQueryValueEx(hkey, REGISTRY_GAMMA, NULL, NULL, (LPBYTE)&RegistryInfo.Gamma, &DataSize);
	DataSize = sizeof(RegistryInfo.ScreenSmoothing);
	RegQueryValueEx(hkey, REGISTRY_SCREEN_SMOOTHING, NULL, NULL, (LPBYTE)&RegistryInfo.ScreenSmoothing, &DataSize);
	DataSize = sizeof(RegistryInfo.FullScreenMode);
	RegQueryValueEx(hkey, REGISTRY_FULL_SCREEN_MODE, NULL, NULL, (LPBYTE)&RegistryInfo.FullScreenMode, &DataSize);
	DataSize = sizeof(RegistryInfo.FullScreen);
	RegQueryValueEx(hkey, REGISTRY_FULL_SCREEN, NULL, NULL, (LPBYTE)&RegistryInfo.FullScreen, &DataSize);
	DataSize = sizeof(RegistryInfo.EnableDirectDraw);
	RegQueryValueEx(hkey, REGISTRY_DIRECT_DRAW_ENABLE, NULL, NULL, (LPBYTE)&RegistryInfo.EnableDirectDraw, &DataSize);
	DataSize = sizeof(RegistryInfo.EnableScanLines);
	RegQueryValueEx(hkey, REGISTRY_SCANLINES, NULL, NULL, (LPBYTE)&RegistryInfo.EnableScanLines, &DataSize);
	DataSize = sizeof(RegistryInfo.FMVolume);
	RegQueryValueEx(hkey, REGISTRY_FM_VOLUME, NULL, NULL, (LPBYTE)&RegistryInfo.FMVolume, &DataSize);

	RegCloseKey(hkey);			

	return TRUE;
}

// Saves the settings to the registry
BOOL SaveRegistryEntries(void)
{
	char			Key[_MAX_PATH];
	HKEY			hkey;
	DWORD			dwdisp;
	int				Result;

	wsprintf(Key, "Software%s", REGISTRY_KEY);

	Result = RegCreateKeyEx(HKEY_CURRENT_USER,			// handle
							Key,						// subkey
							0,							// reserved
							"",							// class string
							REG_OPTION_NON_VOLATILE,	// flags
							KEY_ALL_ACCESS,				// access mask	
							NULL,						// security attributes ptr
							&hkey,						// pointer to recieving handle
							&dwdisp);					// pointer to recieving disposition

	if (Result != ERROR_SUCCESS) return FALSE;

	RegSetValueEx(hkey, REGISTRY_SCREEN_SCALE, 0, REG_BINARY, (BYTE *)&RegistryInfo.ScreenScale, sizeof(RegistryInfo.ScreenScale));
	RegSetValueEx(hkey, REGISTRY_UPDATE_FREQUENCY, 0, REG_BINARY, (BYTE *)&RegistryInfo.UpdateFrequency, sizeof(RegistryInfo.UpdateFrequency));
	RegSetValueEx(hkey, REGISTRY_FRAME_SKIP, 0, REG_BINARY, (BYTE *)&RegistryInfo.FrameSkip, sizeof(RegistryInfo.FrameSkip));
	RegSetValueEx(hkey, REGISTRY_BUTTON_MAP, 0, REG_BINARY, (BYTE *)&RegistryInfo.ButtonMap, sizeof(RegistryInfo.ButtonMap));
	RegSetValueEx(hkey, REGISTRY_ROM_PATH, 0, REG_SZ, (BYTE *)RegistryInfo.ROMPath, strlen(RegistryInfo.ROMPath) + 1);
	RegSetValueEx(hkey, REGISTRY_SRAM_PATH, 0, REG_SZ, (BYTE *)RegistryInfo.SRAMPath, strlen(RegistryInfo.SRAMPath) + 1);
	RegSetValueEx(hkey, REGISTRY_SCREENSHOT_PATH, 0, REG_SZ, (BYTE *)RegistryInfo.ScreenshotPath, strlen(RegistryInfo.ScreenshotPath) + 1);
	RegSetValueEx(hkey, REGISTRY_SAVESTATE_PATH, 0, REG_SZ, (BYTE *)RegistryInfo.SaveStatePath, strlen(RegistryInfo.SaveStatePath) + 1);
	RegSetValueEx(hkey, REGISTRY_SOUND_PATH, 0, REG_SZ, (BYTE *)RegistryInfo.SoundRecordPath, strlen(RegistryInfo.SoundRecordPath) + 1);
	RegSetValueEx(hkey, REGISTRY_JOYSTICK, 0, REG_BINARY, (BYTE *)RegistryInfo.Joystick, sizeof(RegistryInfo.Joystick));
	RegSetValueEx(hkey, REGISTRY_JOYSTICK_MAP, 0, REG_BINARY, (BYTE *)&RegistryInfo.JoystickMap, sizeof(RegistryInfo.JoystickMap));
	RegSetValueEx(hkey, REGISTRY_SOUND_ENABLE, 0, REG_BINARY, (BYTE *)&RegistryInfo.EnableSound, sizeof(RegistryInfo.EnableSound));
	RegSetValueEx(hkey, REGISTRY_SOUND_FM_ENABLE, 0, REG_BINARY, (BYTE *)&RegistryInfo.EnableFMSound, sizeof(RegistryInfo.EnableFMSound));
	RegSetValueEx(hkey, REGISTRY_SOUND_FREQUENCY, 0, REG_BINARY, (BYTE *)&RegistryInfo.SoundFrequency, sizeof(RegistryInfo.SoundFrequency));
	RegSetValueEx(hkey, REGISTRY_RAPID_FIRE, 0, REG_BINARY, (BYTE *)&RegistryInfo.RapidFire, sizeof(RegistryInfo.RapidFire));
	RegSetValueEx(hkey, REGISTRY_RAPID_FIRE_RATE, 0, REG_BINARY, (BYTE *)&RegistryInfo.RapidFireRate, sizeof(RegistryInfo.RapidFireRate));
	RegSetValueEx(hkey, REGISTRY_DISABLE_KEYS, 0, REG_BINARY, (BYTE *)&RegistryInfo.DisableKeys, sizeof(RegistryInfo.DisableKeys));
	RegSetValueEx(hkey, REGISTRY_REGION, 0, REG_BINARY, (BYTE *)&RegistryInfo.Region, sizeof(RegistryInfo.Region));
	RegSetValueEx(hkey, REGISTRY_SINGLE_SAVESTATE, 0, REG_BINARY, (BYTE *)&RegistryInfo.SingleSaveState, sizeof(RegistryInfo.SingleSaveState));
	RegSetValueEx(hkey, REGISTRY_GAMMA, 0, REG_BINARY, (BYTE *)&RegistryInfo.Gamma, sizeof(RegistryInfo.Gamma));
	RegSetValueEx(hkey, REGISTRY_SCREEN_SMOOTHING, 0, REG_BINARY, (BYTE *)&RegistryInfo.ScreenSmoothing, sizeof(RegistryInfo.ScreenSmoothing));
	RegSetValueEx(hkey, REGISTRY_FULL_SCREEN_MODE, 0, REG_BINARY, (BYTE *)&RegistryInfo.FullScreenMode, sizeof(RegistryInfo.FullScreenMode));
	RegSetValueEx(hkey, REGISTRY_FULL_SCREEN, 0, REG_BINARY, (BYTE *)&RegistryInfo.FullScreen, sizeof(RegistryInfo.FullScreen));
	RegSetValueEx(hkey, REGISTRY_DIRECT_DRAW_ENABLE, 0, REG_BINARY, (BYTE *)&RegistryInfo.EnableDirectDraw, sizeof(RegistryInfo.EnableDirectDraw));
	RegSetValueEx(hkey, REGISTRY_SCANLINES, 0, REG_BINARY, (BYTE *)&RegistryInfo.EnableScanLines, sizeof(RegistryInfo.EnableScanLines));
	RegSetValueEx(hkey, REGISTRY_FM_VOLUME, 0, REG_BINARY, (BYTE *)&RegistryInfo.FMVolume, sizeof(RegistryInfo.FMVolume));
	
	RegCloseKey(hkey);

	return TRUE;
}

void SetFileAssociations(void)
{
	HKEY			hkey;
	DWORD			dwdisp;
	char			Filename[MAX_PATH];
	char			String[MAX_PATH];

	GetModuleFileName(GetModuleHandle(NULL), Filename, MAX_PATH);

	RegDeleteKey(HKEY_CLASSES_ROOT, ".sms");
	RegDeleteKey(HKEY_CLASSES_ROOT, "smsfile");
	RegDeleteKey(HKEY_CLASSES_ROOT, ".gg");
	RegDeleteKey(HKEY_CLASSES_ROOT, "ggfile");

	strcpy(String, "smsfile");
	RegCreateKeyEx(HKEY_CLASSES_ROOT, ".sms", 0,	"",	REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwdisp);
	RegSetValueEx(hkey, "", 0, REG_SZ, (BYTE *)String, strlen(String) + 1);
	RegCloseKey(hkey);

	strcpy(String, "MasterSystem");
	RegCreateKeyEx(HKEY_CLASSES_ROOT, "smsfile", 0,	"",	REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwdisp);
	RegSetValueEx(hkey, "", 0, REG_SZ, (BYTE *)String, strlen(String) + 1);
	RegCloseKey(hkey);

	strcpy(String, "");
	RegCreateKeyEx(HKEY_CLASSES_ROOT, "smsfile\\Shell", 0,	"",	REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwdisp);
	RegSetValueEx(hkey, "", 0, REG_SZ, (BYTE *)String, strlen(String) + 1);
	RegCloseKey(hkey);

	String[0] = '"';
	memcpy(&String[1], Filename, strlen(Filename) + 1);
	strcat(String, "\" %1");
	RegCreateKeyEx(HKEY_CLASSES_ROOT, "smsfile\\Shell\\Emulate MasterSystem\\command", 0,	"",	REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwdisp);
	RegSetValueEx(hkey, "", 0, REG_SZ, (BYTE *)String, strlen(String) + 1);
	RegCloseKey(hkey);

	memcpy(String, Filename, strlen(Filename) + 1);
	strcat(String, ",0");
	RegCreateKeyEx(HKEY_CLASSES_ROOT, "smsfile\\DefaultIcon", 0, "",	REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwdisp);
	RegSetValueEx(hkey, "", 0, REG_SZ, (BYTE *)String, strlen(String) + 1);
	RegCloseKey(hkey);

	strcpy(String, "ggfile");
	RegCreateKeyEx(HKEY_CLASSES_ROOT, ".gg", 0,	"",	REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwdisp);
	RegSetValueEx(hkey, "", 0, REG_SZ, (BYTE *)String, strlen(String) + 1);
	RegCloseKey(hkey);

	strcpy(String, "GameGear");
	RegCreateKeyEx(HKEY_CLASSES_ROOT, "ggfile", 0,	"",	REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwdisp);
	RegSetValueEx(hkey, "", 0, REG_SZ, (BYTE *)String, strlen(String) + 1);
	RegCloseKey(hkey);

	strcpy(String, "");
	RegCreateKeyEx(HKEY_CLASSES_ROOT, "ggfile\\Shell", 0,	"",	REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwdisp);
	RegSetValueEx(hkey, "", 0, REG_SZ, (BYTE *)String, strlen(String) + 1);
	RegCloseKey(hkey);

	String[0] = '"';
	memcpy(&String[1], Filename, strlen(Filename) + 1);
	strcat(String, "\" %1");
	RegCreateKeyEx(HKEY_CLASSES_ROOT, "ggfile\\Shell\\Emulate GameGear\\command", 0,	"",	REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwdisp);
	RegSetValueEx(hkey, "", 0, REG_SZ, (BYTE *)String, strlen(String) + 1);
	RegCloseKey(hkey);

	memcpy(String, Filename, strlen(Filename) + 1);
	strcat(String, ",0");
	RegCreateKeyEx(HKEY_CLASSES_ROOT, "ggfile\\DefaultIcon", 0, "",	REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwdisp);
	RegSetValueEx(hkey, "", 0, REG_SZ, (BYTE *)String, strlen(String) + 1);
	RegCloseKey(hkey);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -