mirror of
https://github.com/AppleWin/AppleWin.git
synced 2025-02-06 09:30:20 +00:00
Prevent uninitialized value bugs and improve string safety.
This change does two things: 1. Updates the registry APIs to reduce the likelihood of uninitialized variables. The code wasn't always checking the return value of registry load operations. In some cases, this led to uninitialized memory being used, and crashes could result. For example, LoadConfiguration in Applewin.cpp was using an uninitialized value for the computer type if no registry variable for the "Apple 2 type" was set. New registry reading methods and macros have also been introduced, allowing default value fallbacks for the cases where a registry variable is not found. This makes registry access simpler and safer when a default value is known in advance. The registry code's style has also been updated to conform with the rest of the code base (tabs instead of spaces, naming conventions, etc.) 2. Introduces string safety improvements. A number of code paths have been modified to use safe-string functions instead of their unsafe counterparts (e.g., strcpy, sprintf). In the process, some strings were converted from "char" to "TCHAR". This was done mostly for consistency with the rest of the code-base.
This commit is contained in:
parent
df5127684a
commit
9e5e21b8c9
@ -60,9 +60,11 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#include "Configuration/PropertySheet.h"
|
||||
#include "Tfe/Tfe.h"
|
||||
|
||||
#define VERSIONSTRING_SIZE 16
|
||||
|
||||
static UINT16 g_AppleWinVersion[4] = {0};
|
||||
char VERSIONSTRING[16] = "xx.yy.zz.ww";
|
||||
static UINT16 g_OldAppleWinVersion[4] = {0};
|
||||
TCHAR VERSIONSTRING[VERSIONSTRING_SIZE] = "xx.yy.zz.ww";
|
||||
|
||||
const TCHAR *g_pAppTitle = NULL;
|
||||
|
||||
@ -522,7 +524,7 @@ static void LoadConfigOldJoystick_v1(const UINT uJoyNum)
|
||||
//Reads configuration from the registry entries
|
||||
void LoadConfiguration(void)
|
||||
{
|
||||
DWORD dwComputerType;
|
||||
DWORD dwComputerType = 0;
|
||||
eApple2Type apple2Type = A2TYPE_APPLE2EENHANCED;
|
||||
|
||||
if (REGLOAD(TEXT(REGVALUE_APPLE2_TYPE), &dwComputerType))
|
||||
@ -559,16 +561,15 @@ void LoadConfiguration(void)
|
||||
|
||||
apple2Type = (eApple2Type) dwComputerType;
|
||||
}
|
||||
else // Support older AppleWin registry entries
|
||||
else if (REGLOAD(TEXT(REGVALUE_OLD_APPLE2_TYPE), &dwComputerType)) // Support older AppleWin registry entries
|
||||
{
|
||||
REGLOAD(TEXT(REGVALUE_OLD_APPLE2_TYPE), &dwComputerType);
|
||||
switch (dwComputerType)
|
||||
{
|
||||
// NB. No A2TYPE_APPLE2E (this is correct)
|
||||
case 0: apple2Type = A2TYPE_APPLE2; break;
|
||||
case 1: apple2Type = A2TYPE_APPLE2PLUS; break;
|
||||
case 2: apple2Type = A2TYPE_APPLE2EENHANCED; break;
|
||||
default: apple2Type = A2TYPE_APPLE2EENHANCED;
|
||||
default: apple2Type = A2TYPE_APPLE2EENHANCED; break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -576,18 +577,11 @@ void LoadConfiguration(void)
|
||||
|
||||
//
|
||||
|
||||
DWORD dwCpuType;
|
||||
eCpuType cpu = CPU_65C02;
|
||||
|
||||
if (REGLOAD(TEXT(REGVALUE_CPU_TYPE), &dwCpuType))
|
||||
{
|
||||
if (dwCpuType != CPU_6502 && dwCpuType != CPU_65C02)
|
||||
dwCpuType = CPU_65C02;
|
||||
|
||||
cpu = (eCpuType) dwCpuType;
|
||||
}
|
||||
|
||||
SetMainCpu(cpu);
|
||||
DWORD dwMainCpuType;
|
||||
REGLOAD_DEFAULT(TEXT(REGVALUE_CPU_TYPE), &dwMainCpuType, CPU_65C02);
|
||||
if (dwMainCpuType != CPU_6502 && dwMainCpuType != CPU_65C02)
|
||||
dwMainCpuType = CPU_65C02;
|
||||
SetMainCpu((eCpuType)dwMainCpuType);
|
||||
|
||||
//
|
||||
|
||||
@ -607,7 +601,7 @@ void LoadConfiguration(void)
|
||||
LoadConfigOldJoystick_v1(JN_JOYSTICK1);
|
||||
|
||||
DWORD dwSoundType;
|
||||
REGLOAD(TEXT("Sound Emulation"), &dwSoundType);
|
||||
REGLOAD_DEFAULT(TEXT("Sound Emulation"), &dwSoundType, REG_SOUNDTYPE_NONE);
|
||||
switch (dwSoundType)
|
||||
{
|
||||
case REG_SOUNDTYPE_NONE:
|
||||
@ -621,29 +615,32 @@ void LoadConfiguration(void)
|
||||
break;
|
||||
}
|
||||
|
||||
char aySerialPortName[ CSuperSerialCard::SIZEOF_SERIALCHOICE_ITEM ];
|
||||
if (RegLoadString( TEXT(REG_CONFIG),
|
||||
TCHAR serialPortName[CSuperSerialCard::SIZEOF_SERIALCHOICE_ITEM];
|
||||
if (RegLoadString(
|
||||
TEXT(REG_CONFIG),
|
||||
TEXT(REGVALUE_SERIAL_PORT_NAME),
|
||||
TRUE,
|
||||
aySerialPortName,
|
||||
sizeof(aySerialPortName) ) )
|
||||
serialPortName,
|
||||
CSuperSerialCard::SIZEOF_SERIALCHOICE_ITEM))
|
||||
{
|
||||
sg_SSC.SetSerialPortName(aySerialPortName);
|
||||
sg_SSC.SetSerialPortName(serialPortName);
|
||||
}
|
||||
|
||||
REGLOAD(TEXT(REGVALUE_EMULATION_SPEED) ,&g_dwSpeed);
|
||||
REGLOAD_DEFAULT(TEXT(REGVALUE_EMULATION_SPEED), &g_dwSpeed, SPEED_NORMAL);
|
||||
Config_Load_Video();
|
||||
SetCurrentCLK6502(); // Pre: g_dwSpeed && Config_Load_Video()->SetVideoRefreshRate()
|
||||
|
||||
DWORD dwEnhanceDisk;
|
||||
REGLOAD(TEXT(REGVALUE_ENHANCE_DISK_SPEED), &dwEnhanceDisk);
|
||||
REGLOAD_DEFAULT(TEXT(REGVALUE_ENHANCE_DISK_SPEED), &dwEnhanceDisk, 1);
|
||||
sg_Disk2Card.SetEnhanceDisk(dwEnhanceDisk ? true : false);
|
||||
|
||||
REGLOAD(TEXT("Uthernet Active") ,(DWORD *)&tfe_enabled);
|
||||
DWORD dwTfeEnabled;
|
||||
REGLOAD_DEFAULT(TEXT("Uthernet Active"), &dwTfeEnabled, 0);
|
||||
tfe_enabled = dwTfeEnabled ? 1 : 0;
|
||||
|
||||
//
|
||||
|
||||
DWORD dwTmp;
|
||||
DWORD dwTmp = 0;
|
||||
|
||||
if(REGLOAD(TEXT(REGVALUE_FS_SHOW_SUBUNIT_STATUS), &dwTmp))
|
||||
SetFullScreenShowSubunitStatus(dwTmp ? true : false);
|
||||
@ -704,10 +701,10 @@ void LoadConfiguration(void)
|
||||
|
||||
//
|
||||
|
||||
char szFilename[MAX_PATH] = {0};
|
||||
TCHAR szFilename[MAX_PATH];
|
||||
|
||||
RegLoadString(TEXT(REG_PREFS), TEXT(REGVALUE_PREF_HDV_START_DIR), 1, szFilename, MAX_PATH);
|
||||
if (szFilename[0] == 0)
|
||||
RegLoadString(TEXT(REG_PREFS), TEXT(REGVALUE_PREF_HDV_START_DIR), 1, szFilename, MAX_PATH, TEXT(""));
|
||||
if (szFilename[0] == '\0')
|
||||
GetCurrentDirectory(sizeof(szFilename), szFilename);
|
||||
SetCurrentImageDir(szFilename);
|
||||
|
||||
@ -717,8 +714,8 @@ void LoadConfiguration(void)
|
||||
//
|
||||
|
||||
// Current/Starting Dir is the "root" of where the user keeps his disk images
|
||||
RegLoadString(TEXT(REG_PREFS), TEXT(REGVALUE_PREF_START_DIR), 1, szFilename, MAX_PATH);
|
||||
if (szFilename[0] == 0)
|
||||
RegLoadString(TEXT(REG_PREFS), TEXT(REGVALUE_PREF_START_DIR), 1, szFilename, MAX_PATH, TEXT(""));
|
||||
if (szFilename[0] == '\0')
|
||||
GetCurrentDirectory(sizeof(szFilename), szFilename);
|
||||
SetCurrentImageDir(szFilename);
|
||||
|
||||
@ -727,21 +724,17 @@ void LoadConfiguration(void)
|
||||
|
||||
//
|
||||
|
||||
szFilename[0] = 0;
|
||||
RegLoadString(TEXT(REG_CONFIG),TEXT(REGVALUE_SAVESTATE_FILENAME),1,szFilename,sizeof(szFilename));
|
||||
RegLoadString(TEXT(REG_CONFIG), TEXT(REGVALUE_SAVESTATE_FILENAME), 1, szFilename, MAX_PATH, TEXT(""));
|
||||
Snapshot_SetFilename(szFilename); // If not in Registry than default will be used (ie. g_sCurrentDir + default filename)
|
||||
|
||||
szFilename[0] = 0;
|
||||
RegLoadString(TEXT(REG_CONFIG),TEXT(REGVALUE_PRINTER_FILENAME),1,szFilename,sizeof(szFilename));
|
||||
RegLoadString(TEXT(REG_CONFIG), TEXT(REGVALUE_PRINTER_FILENAME), 1, szFilename, MAX_PATH, TEXT(""));
|
||||
Printer_SetFilename(szFilename); // If not in Registry than default will be used
|
||||
|
||||
dwTmp = 10;
|
||||
REGLOAD(TEXT(REGVALUE_PRINTER_IDLE_LIMIT), &dwTmp);
|
||||
REGLOAD_DEFAULT(TEXT(REGVALUE_PRINTER_IDLE_LIMIT), &dwTmp, 10);
|
||||
Printer_SetIdleLimit(dwTmp);
|
||||
|
||||
char szUthernetInt[MAX_PATH] = {0};
|
||||
RegLoadString(TEXT(REG_CONFIG),TEXT("Uthernet Interface"),1,szUthernetInt,MAX_PATH);
|
||||
update_tfe_interface(szUthernetInt,NULL);
|
||||
RegLoadString(TEXT(REG_CONFIG), TEXT("Uthernet Interface"), 1, szFilename, MAX_PATH, TEXT(""));
|
||||
update_tfe_interface(szFilename, NULL);
|
||||
|
||||
if (REGLOAD(TEXT(REGVALUE_WINDOW_SCALE), &dwTmp))
|
||||
SetViewportScale(dwTmp);
|
||||
@ -1169,14 +1162,15 @@ static void InsertHardDisks(LPSTR szImageName_harddisk[NUM_HARDDISKS], bool& bBo
|
||||
|
||||
static bool CheckOldAppleWinVersion(void)
|
||||
{
|
||||
char szOldAppleWinVersion[sizeof(VERSIONSTRING)] = {0};
|
||||
RegLoadString(TEXT(REG_CONFIG), TEXT(REGVALUE_VERSION), 1, szOldAppleWinVersion, sizeof(szOldAppleWinVersion));
|
||||
TCHAR szOldAppleWinVersion[VERSIONSTRING_SIZE + 1];
|
||||
RegLoadString(TEXT(REG_CONFIG), TEXT(REGVALUE_VERSION), 1, szOldAppleWinVersion, VERSIONSTRING_SIZE, TEXT(""));
|
||||
const bool bShowAboutDlg = strcmp(szOldAppleWinVersion, VERSIONSTRING) != 0;
|
||||
|
||||
// version: xx.yy.zz.ww
|
||||
// offset : 0123456789
|
||||
char* p0 = szOldAppleWinVersion;
|
||||
szOldAppleWinVersion[strlen(szOldAppleWinVersion)] = '.'; // Overwrite null terminator with '.'
|
||||
int len = strlen(szOldAppleWinVersion);
|
||||
szOldAppleWinVersion[len] = '.'; // append a null terminator
|
||||
szOldAppleWinVersion[len + 1] = '\0';
|
||||
for (UINT i=0; i<4; i++)
|
||||
{
|
||||
char* p1 = strstr(p0, ".");
|
||||
@ -1515,7 +1509,7 @@ int APIENTRY WinMain(HINSTANCE passinstance, HINSTANCE, LPSTR lpCmdLine, int)
|
||||
unsigned long minor = g_AppleWinVersion[1] = pFixedFileInfo->dwFileVersionMS & 0xffff;
|
||||
unsigned long fix = g_AppleWinVersion[2] = pFixedFileInfo->dwFileVersionLS >> 16;
|
||||
unsigned long fix_minor = g_AppleWinVersion[3] = pFixedFileInfo->dwFileVersionLS & 0xffff;
|
||||
sprintf(VERSIONSTRING, "%d.%d.%d.%d", major, minor, fix, fix_minor); // potential buffer overflow
|
||||
StringCbPrintf(VERSIONSTRING, VERSIONSTRING_SIZE, "%d.%d.%d.%d", major, minor, fix, fix_minor);
|
||||
}
|
||||
|
||||
delete [] pVerInfoBlock;
|
||||
|
@ -9,7 +9,7 @@ void LogFileTimeUntilFirstKeyRead(void);
|
||||
bool SetCurrentImageDir(const char* pszImageDir);
|
||||
|
||||
extern const UINT16* GetOldAppleWinVersion(void);
|
||||
extern char VERSIONSTRING[]; // Constructed in WinMain()
|
||||
extern TCHAR VERSIONSTRING[]; // Constructed in WinMain()
|
||||
|
||||
extern const TCHAR *g_pAppTitle;
|
||||
|
||||
|
@ -27,7 +27,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#include "../Frame.h"
|
||||
#include "../resource/resource.h"
|
||||
|
||||
static const char g_szGPL[] =
|
||||
static const TCHAR g_szGPL[] =
|
||||
"This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\
|
||||
\r\n\
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\
|
||||
@ -65,8 +65,8 @@ static BOOL CALLBACK DlgProcAbout(HWND hWnd, UINT message, WPARAM wparam, LPARAM
|
||||
HICON hIcon = LoadIcon(g_hInstance, TEXT("APPLEWIN_ICON"));
|
||||
SendDlgItemMessage(hWnd, IDC_APPLEWIN_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon);
|
||||
|
||||
char szAppleWinVersion[50];
|
||||
sprintf(szAppleWinVersion, "AppleWin v%s", VERSIONSTRING);
|
||||
TCHAR szAppleWinVersion[50];
|
||||
StringCbPrintf(szAppleWinVersion, 50, "AppleWin v%s", VERSIONSTRING);
|
||||
SendDlgItemMessage(hWnd, IDC_APPLEWIN_VERSION, WM_SETTEXT, 0, (LPARAM)szAppleWinVersion);
|
||||
|
||||
SendDlgItemMessage(hWnd, IDC_GPL_TEXT, WM_SETTEXT, 0, (LPARAM)g_szGPL);
|
||||
|
@ -217,8 +217,9 @@ BOOL CPageConfig::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPARAM
|
||||
BOOL bCustom = TRUE;
|
||||
if (g_dwSpeed == SPEED_NORMAL)
|
||||
{
|
||||
bCustom = FALSE;
|
||||
REGLOAD(TEXT(REGVALUE_CUSTOM_SPEED),(DWORD *)&bCustom);
|
||||
DWORD dwCustomSpeed;
|
||||
REGLOAD_DEFAULT(TEXT(REGVALUE_CUSTOM_SPEED), &dwCustomSpeed, 0);
|
||||
bCustom = dwCustomSpeed ? TRUE : FALSE;
|
||||
}
|
||||
CheckRadioButton(hWnd, IDC_AUTHENTIC_SPEED, IDC_CUSTOM_SPEED, bCustom ? IDC_CUSTOM_SPEED : IDC_AUTHENTIC_SPEED);
|
||||
SetFocus(GetDlgItem(hWnd, bCustom ? IDC_SLIDER_CPU_SPEED : IDC_AUTHENTIC_SPEED));
|
||||
|
@ -143,10 +143,10 @@ int CPageConfigTfe::gray_ungray_items(HWND hwnd)
|
||||
int enable;
|
||||
int number;
|
||||
|
||||
int disabled = 0;
|
||||
|
||||
//resources_get_value("ETHERNET_DISABLED", (void *)&disabled);
|
||||
REGLOAD(TEXT("Uthernet Disabled") ,(DWORD *)&disabled);
|
||||
DWORD dwDisabled;
|
||||
REGLOAD_DEFAULT(TEXT("Uthernet Disabled"), &dwDisabled, 0);
|
||||
int disabled = dwDisabled ? 1 : 0;
|
||||
get_disabled_state(&disabled);
|
||||
|
||||
if (disabled)
|
||||
|
@ -148,8 +148,8 @@ BOOL CPageDisk::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPARAM l
|
||||
|
||||
InitComboHDD(hWnd);
|
||||
|
||||
TCHAR PathToCiderPress[MAX_PATH] = "";
|
||||
RegLoadString(TEXT(REG_CONFIG), REGVALUE_CIDERPRESSLOC, 1, PathToCiderPress,MAX_PATH);
|
||||
TCHAR PathToCiderPress[MAX_PATH];
|
||||
RegLoadString(TEXT(REG_CONFIG), REGVALUE_CIDERPRESSLOC, 1, PathToCiderPress, MAX_PATH, TEXT(""));
|
||||
SendDlgItemMessage(hWnd, IDC_CIDERPRESS_FILENAME ,WM_SETTEXT, 0, (LPARAM)PathToCiderPress);
|
||||
|
||||
CheckDlgButton(hWnd, IDC_HDD_ENABLE, HD_CardIsEnabled() ? BST_CHECKED : BST_UNCHECKED);
|
||||
|
@ -141,8 +141,7 @@ std::string CPropertySheetHelper::BrowseToFile(HWND hWindow, TCHAR* pszTitle, TC
|
||||
strcpy(PathToFile, Snapshot_GetFilename()); //RAPCS, line 2.
|
||||
TCHAR szDirectory[MAX_PATH] = TEXT("");
|
||||
TCHAR szFilename[MAX_PATH];
|
||||
strcpy(szFilename, "");
|
||||
RegLoadString(TEXT("Configuration"), REGVALUE, 1, szFilename ,MAX_PATH);
|
||||
RegLoadString(TEXT("Configuration"), REGVALUE, 1, szFilename, MAX_PATH, TEXT(""));
|
||||
std::string PathName = szFilename;
|
||||
|
||||
OPENFILENAME ofn;
|
||||
@ -175,7 +174,7 @@ std::string CPropertySheetHelper::BrowseToFile(HWND hWindow, TCHAR* pszTitle, TC
|
||||
}
|
||||
else // Cancel is pressed
|
||||
{
|
||||
RegLoadString(TEXT("Configuration"), REGVALUE, 1, szFilename,MAX_PATH);
|
||||
RegLoadString(TEXT("Configuration"), REGVALUE, 1, szFilename, MAX_PATH, TEXT(""));
|
||||
PathName = szFilename;
|
||||
}
|
||||
|
||||
|
@ -154,17 +154,13 @@ void Disk2InterfaceCard::LoadLastDiskImage(const int drive)
|
||||
{
|
||||
_ASSERT(drive == DRIVE_1 || drive == DRIVE_2);
|
||||
|
||||
char sFilePath[ MAX_PATH + 1];
|
||||
sFilePath[0] = 0;
|
||||
const TCHAR *pRegKey = (drive == DRIVE_1)
|
||||
? TEXT(REGVALUE_PREF_LAST_DISK_1)
|
||||
: TEXT(REGVALUE_PREF_LAST_DISK_2);
|
||||
|
||||
const char *pRegKey = (drive == DRIVE_1)
|
||||
? REGVALUE_PREF_LAST_DISK_1
|
||||
: REGVALUE_PREF_LAST_DISK_2;
|
||||
|
||||
if (RegLoadString(TEXT(REG_PREFS), pRegKey, 1, sFilePath, MAX_PATH))
|
||||
TCHAR sFilePath[MAX_PATH];
|
||||
if (RegLoadString(TEXT(REG_PREFS), pRegKey, 1, sFilePath, MAX_PATH, TEXT("")))
|
||||
{
|
||||
sFilePath[ MAX_PATH ] = 0;
|
||||
|
||||
m_saveDiskImage = false;
|
||||
// Pass in ptr to local copy of filepath, since RemoveDisk() sets DiskPathFilename = ""
|
||||
InsertDisk(drive, sFilePath, IMAGE_USE_FILES_WRITE_PROTECT_STATUS, IMAGE_DONT_CREATE);
|
||||
@ -181,21 +177,21 @@ void Disk2InterfaceCard::SaveLastDiskImage(const int drive)
|
||||
if (!m_saveDiskImage)
|
||||
return;
|
||||
|
||||
const char *pFileName = m_floppyDrive[drive].m_disk.m_fullname;
|
||||
const TCHAR *pFileName = m_floppyDrive[drive].m_disk.m_fullname;
|
||||
|
||||
if (drive == DRIVE_1)
|
||||
RegSaveString(TEXT(REG_PREFS), REGVALUE_PREF_LAST_DISK_1, TRUE, pFileName);
|
||||
RegSaveString(TEXT(REG_PREFS), TEXT(REGVALUE_PREF_LAST_DISK_1), TRUE, pFileName);
|
||||
else
|
||||
RegSaveString(TEXT(REG_PREFS), REGVALUE_PREF_LAST_DISK_2, TRUE, pFileName);
|
||||
RegSaveString(TEXT(REG_PREFS), TEXT(REGVALUE_PREF_LAST_DISK_2), TRUE, pFileName);
|
||||
|
||||
//
|
||||
|
||||
char szPathName[MAX_PATH];
|
||||
strcpy(szPathName, DiskGetFullPathName(drive));
|
||||
if (_tcsrchr(szPathName, TEXT('\\')))
|
||||
TCHAR szPathName[MAX_PATH];
|
||||
StringCbCopy(szPathName, MAX_PATH, DiskGetFullPathName(drive));
|
||||
TCHAR* slash = _tcsrchr(szPathName, TEXT('\\'));
|
||||
if (slash != NULL)
|
||||
{
|
||||
char* pPathEnd = _tcsrchr(szPathName, TEXT('\\'))+1;
|
||||
*pPathEnd = 0;
|
||||
slash[1] = '\0';
|
||||
RegSaveString(TEXT(REG_PREFS), TEXT(REGVALUE_PREF_START_DIR), 1, szPathName);
|
||||
}
|
||||
}
|
||||
@ -678,52 +674,51 @@ bool Disk2InterfaceCard::IsConditionForFullSpeed(void)
|
||||
|
||||
void Disk2InterfaceCard::NotifyInvalidImage(const int drive, LPCTSTR pszImageFilename, const ImageError_e Error)
|
||||
{
|
||||
TCHAR szBuffer[MAX_PATH+128];
|
||||
szBuffer[sizeof(szBuffer)-1] = 0;
|
||||
TCHAR szBuffer[MAX_PATH + 128];
|
||||
|
||||
switch (Error)
|
||||
{
|
||||
case eIMAGE_ERROR_UNABLE_TO_OPEN:
|
||||
case eIMAGE_ERROR_UNABLE_TO_OPEN_GZ:
|
||||
case eIMAGE_ERROR_UNABLE_TO_OPEN_ZIP:
|
||||
_snprintf(
|
||||
StringCbPrintf(
|
||||
szBuffer,
|
||||
sizeof(szBuffer)-1,
|
||||
MAX_PATH + 128,
|
||||
TEXT("Unable to open the file %s."),
|
||||
pszImageFilename);
|
||||
break;
|
||||
|
||||
case eIMAGE_ERROR_BAD_SIZE:
|
||||
_snprintf(
|
||||
StringCbPrintf(
|
||||
szBuffer,
|
||||
sizeof(szBuffer)-1,
|
||||
MAX_PATH + 128,
|
||||
TEXT("Unable to use the file %s\nbecause the ")
|
||||
TEXT("disk image is an unsupported size."),
|
||||
pszImageFilename);
|
||||
break;
|
||||
|
||||
case eIMAGE_ERROR_BAD_FILE:
|
||||
_snprintf(
|
||||
StringCbPrintf(
|
||||
szBuffer,
|
||||
sizeof(szBuffer)-1,
|
||||
MAX_PATH + 128,
|
||||
TEXT("Unable to use the file %s\nbecause the ")
|
||||
TEXT("OS can't access it."),
|
||||
pszImageFilename);
|
||||
break;
|
||||
|
||||
case eIMAGE_ERROR_UNSUPPORTED:
|
||||
_snprintf(
|
||||
StringCbPrintf(
|
||||
szBuffer,
|
||||
sizeof(szBuffer)-1,
|
||||
MAX_PATH + 128,
|
||||
TEXT("Unable to use the file %s\nbecause the ")
|
||||
TEXT("disk image format is not recognized."),
|
||||
pszImageFilename);
|
||||
break;
|
||||
|
||||
case eIMAGE_ERROR_UNSUPPORTED_HDV:
|
||||
_snprintf(
|
||||
StringCbPrintf(
|
||||
szBuffer,
|
||||
sizeof(szBuffer)-1,
|
||||
MAX_PATH + 128,
|
||||
TEXT("Unable to use the file %s\n")
|
||||
TEXT("because this UniDisk 3.5/Apple IIGS/hard-disk image is not supported.\n")
|
||||
TEXT("Try inserting as a hard-disk image instead."),
|
||||
@ -731,9 +726,9 @@ void Disk2InterfaceCard::NotifyInvalidImage(const int drive, LPCTSTR pszImageFil
|
||||
break;
|
||||
|
||||
case eIMAGE_ERROR_UNSUPPORTED_MULTI_ZIP:
|
||||
_snprintf(
|
||||
StringCbPrintf(
|
||||
szBuffer,
|
||||
sizeof(szBuffer)-1,
|
||||
MAX_PATH + 128,
|
||||
TEXT("Unable to use the file %s\nbecause the ")
|
||||
TEXT("first file (%s) in this multi-zip archive is not recognized.\n")
|
||||
TEXT("Try unzipping and using the disk images directly.\n"),
|
||||
@ -743,34 +738,34 @@ void Disk2InterfaceCard::NotifyInvalidImage(const int drive, LPCTSTR pszImageFil
|
||||
|
||||
case eIMAGE_ERROR_GZ:
|
||||
case eIMAGE_ERROR_ZIP:
|
||||
_snprintf(
|
||||
StringCbPrintf(
|
||||
szBuffer,
|
||||
sizeof(szBuffer)-1,
|
||||
MAX_PATH + 128,
|
||||
TEXT("Unable to use the compressed file %s\nbecause the ")
|
||||
TEXT("compressed disk image is corrupt/unsupported."),
|
||||
pszImageFilename);
|
||||
break;
|
||||
|
||||
case eIMAGE_ERROR_FAILED_TO_GET_PATHNAME:
|
||||
_snprintf(
|
||||
StringCbPrintf(
|
||||
szBuffer,
|
||||
sizeof(szBuffer)-1,
|
||||
MAX_PATH + 128,
|
||||
TEXT("Unable to GetFullPathName() for the file: %s."),
|
||||
pszImageFilename);
|
||||
break;
|
||||
|
||||
case eIMAGE_ERROR_ZEROLENGTH_WRITEPROTECTED:
|
||||
_snprintf(
|
||||
StringCbPrintf(
|
||||
szBuffer,
|
||||
sizeof(szBuffer)-1,
|
||||
MAX_PATH + 128,
|
||||
TEXT("Unsupported zero-length write-protected file: %s."),
|
||||
pszImageFilename);
|
||||
break;
|
||||
|
||||
case eIMAGE_ERROR_FAILED_TO_INIT_ZEROLENGTH:
|
||||
_snprintf(
|
||||
StringCbPrintf(
|
||||
szBuffer,
|
||||
sizeof(szBuffer)-1,
|
||||
MAX_PATH + 128,
|
||||
TEXT("Failed to resize the zero-length file: %s."),
|
||||
pszImageFilename);
|
||||
break;
|
||||
@ -1346,8 +1341,8 @@ void Disk2InterfaceCard::DumpTrackWOZ(FloppyDisk floppy) // pass a copy of m_flo
|
||||
|
||||
nibbleCount++;
|
||||
|
||||
char str[10];
|
||||
sprintf(str, "%02X ", shiftReg);
|
||||
TCHAR str[10];
|
||||
StringCbPrintf(str, 10, "%02X ", shiftReg);
|
||||
OutputDebugString(str);
|
||||
if ((nibbleCount % 32) == 0)
|
||||
OutputDebugString("\n");
|
||||
@ -1400,15 +1395,14 @@ void Disk2InterfaceCard::ResetSwitches(void)
|
||||
|
||||
bool Disk2InterfaceCard::UserSelectNewDiskImage(const int drive, LPCSTR pszFilename/*=""*/)
|
||||
{
|
||||
TCHAR directory[MAX_PATH] = TEXT("");
|
||||
TCHAR filename[MAX_PATH] = TEXT("");
|
||||
TCHAR directory[MAX_PATH];
|
||||
TCHAR filename[MAX_PATH];
|
||||
TCHAR title[40];
|
||||
|
||||
strcpy(filename, pszFilename);
|
||||
StringCbCopy(filename, MAX_PATH, pszFilename);
|
||||
|
||||
RegLoadString(TEXT(REG_PREFS), REGVALUE_PREF_START_DIR, 1, directory, MAX_PATH);
|
||||
_tcscpy(title, TEXT("Select Disk Image For Drive "));
|
||||
_tcscat(title, drive ? TEXT("2") : TEXT("1"));
|
||||
RegLoadString(TEXT(REG_PREFS), REGVALUE_PREF_START_DIR, 1, directory, MAX_PATH, TEXT(""));
|
||||
StringCbPrintf(title, 40, TEXT("Select Disk Image For Drive %d"), drive + 1);
|
||||
|
||||
_ASSERT(sizeof(OPENFILENAME) == sizeof(OPENFILENAME_NT4)); // Required for Win98/ME support (selected by _WIN32_WINNT=0x0400 in stdafx.h)
|
||||
|
||||
@ -1431,7 +1425,7 @@ bool Disk2InterfaceCard::UserSelectNewDiskImage(const int drive, LPCSTR pszFilen
|
||||
if (GetOpenFileName(&ofn))
|
||||
{
|
||||
if ((!ofn.nFileExtension) || !filename[ofn.nFileExtension])
|
||||
_tcscat(filename,TEXT(".dsk"));
|
||||
StringCbCat(filename, MAX_PATH, TEXT(".dsk"));
|
||||
|
||||
ImageError_e Error = InsertDisk(drive, filename, ofn.Flags & OFN_READONLY, IMAGE_CREATE);
|
||||
if (Error == eIMAGE_ERROR_NONE)
|
||||
|
@ -2050,10 +2050,17 @@ static void ProcessButtonClick(int button, bool bFromButtonUI /*=false*/)
|
||||
// http://www.codeproject.com/menu/MenusForBeginners.asp?df=100&forumid=67645&exp=0&select=903061
|
||||
|
||||
void ProcessDiskPopupMenu(HWND hwnd, POINT pt, const int iDrive)
|
||||
{
|
||||
//This is the default installation path of CiderPress. It shall not be left blank, otherwise an explorer window will be open.
|
||||
TCHAR PathToCiderPress[MAX_PATH] = "C:\\Program Files\\faddenSoft\\CiderPress\\CiderPress.exe";
|
||||
RegLoadString(TEXT("Configuration"), REGVALUE_CIDERPRESSLOC, 1, PathToCiderPress,MAX_PATH);
|
||||
{
|
||||
// This is the default installation path of CiderPress.
|
||||
// It shall not be left blank, otherwise an explorer window will be open.
|
||||
TCHAR PathToCiderPress[MAX_PATH];
|
||||
RegLoadString(
|
||||
TEXT("Configuration"),
|
||||
REGVALUE_CIDERPRESSLOC,
|
||||
1,
|
||||
PathToCiderPress,
|
||||
MAX_PATH,
|
||||
TEXT("C:\\Program Files\\faddenSoft\\CiderPress\\CiderPress.exe"));
|
||||
//TODO: A directory is open if an empty path to CiderPress is set. This has to be fixed.
|
||||
|
||||
std::string filename1= "\"";
|
||||
|
@ -210,17 +210,13 @@ void HD_LoadLastDiskImage(const int iDrive)
|
||||
{
|
||||
_ASSERT(iDrive == HARDDISK_1 || iDrive == HARDDISK_2);
|
||||
|
||||
char sFilePath[ MAX_PATH + 1];
|
||||
sFilePath[0] = 0;
|
||||
|
||||
const char *pRegKey = (iDrive == HARDDISK_1)
|
||||
? REGVALUE_PREF_LAST_HARDDISK_1
|
||||
: REGVALUE_PREF_LAST_HARDDISK_2;
|
||||
|
||||
if (RegLoadString(TEXT(REG_PREFS), pRegKey, 1, sFilePath, MAX_PATH))
|
||||
TCHAR sFilePath[MAX_PATH];
|
||||
if (RegLoadString(TEXT(REG_PREFS), pRegKey, 1, sFilePath, MAX_PATH, TEXT("")))
|
||||
{
|
||||
sFilePath[ MAX_PATH ] = 0;
|
||||
|
||||
g_bSaveDiskImage = false;
|
||||
// Pass in ptr to local copy of filepath, since RemoveDisk() sets DiskPathFilename = "" // todo: update comment for HD func
|
||||
HD_Insert(iDrive, sFilePath);
|
||||
@ -419,13 +415,13 @@ BOOL HD_Insert(const int iDrive, LPCTSTR pszImageFilename)
|
||||
|
||||
static bool HD_SelectImage(const int iDrive, LPCSTR pszFilename)
|
||||
{
|
||||
TCHAR directory[MAX_PATH] = TEXT("");
|
||||
TCHAR filename[MAX_PATH] = TEXT("");
|
||||
TCHAR directory[MAX_PATH];
|
||||
TCHAR filename[MAX_PATH];
|
||||
TCHAR title[40];
|
||||
|
||||
strcpy(filename, pszFilename);
|
||||
|
||||
RegLoadString(TEXT(REG_PREFS), TEXT(REGVALUE_PREF_HDV_START_DIR), 1, directory, MAX_PATH);
|
||||
RegLoadString(TEXT(REG_PREFS), TEXT(REGVALUE_PREF_HDV_START_DIR), 1, directory, MAX_PATH, TEXT(""));
|
||||
_tcscpy(title, TEXT("Select HDV Image For HDD "));
|
||||
_tcscat(title, iDrive ? TEXT("2") : TEXT("1"));
|
||||
|
||||
|
@ -30,70 +30,95 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
//===========================================================================
|
||||
BOOL RegLoadString (LPCTSTR section, LPCTSTR key, BOOL peruser,
|
||||
LPTSTR buffer, DWORD chars) {
|
||||
int success = 0;
|
||||
TCHAR fullkeyname[256];
|
||||
wsprintf(fullkeyname,
|
||||
TEXT("Software\\AppleWin\\CurrentVersion\\%s"),
|
||||
(LPCTSTR)section);
|
||||
HKEY keyhandle;
|
||||
if (!RegOpenKeyEx((peruser ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE),
|
||||
fullkeyname,
|
||||
0,
|
||||
KEY_READ,
|
||||
&keyhandle)) {
|
||||
DWORD type;
|
||||
DWORD size = chars;
|
||||
success = (!RegQueryValueEx(keyhandle,key,0,&type,(LPBYTE)buffer,&size)) &&
|
||||
size;
|
||||
RegCloseKey(keyhandle);
|
||||
}
|
||||
return success;
|
||||
BOOL RegLoadString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPTSTR buffer, DWORD chars)
|
||||
{
|
||||
TCHAR fullkeyname[256];
|
||||
StringCbPrintf(fullkeyname, 256, TEXT("Software\\AppleWin\\CurrentVersion\\%s"), section);
|
||||
|
||||
BOOL success = FALSE;
|
||||
HKEY keyhandle;
|
||||
LSTATUS status = RegOpenKeyEx(
|
||||
(peruser ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE),
|
||||
fullkeyname,
|
||||
0,
|
||||
KEY_READ,
|
||||
&keyhandle);
|
||||
if (status == 0)
|
||||
{
|
||||
DWORD type;
|
||||
DWORD size = chars;
|
||||
status = RegQueryValueEx(keyhandle, key, NULL, &type, (LPBYTE)buffer, &size);
|
||||
if (status == 0 && size != 0)
|
||||
success = TRUE;
|
||||
}
|
||||
|
||||
RegCloseKey(keyhandle);
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
BOOL RegLoadValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD *value) {
|
||||
if (!value)
|
||||
return 0;
|
||||
TCHAR buffer[32] = TEXT("");
|
||||
if (!RegLoadString(section,key,peruser,buffer,32))
|
||||
return 0;
|
||||
buffer[31] = 0;
|
||||
*value = (DWORD)_ttoi(buffer);
|
||||
return 1;
|
||||
BOOL RegLoadString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPTSTR buffer, DWORD chars, LPCTSTR defaultValue)
|
||||
{
|
||||
BOOL success = RegLoadString(section, key, peruser, buffer, chars);
|
||||
if (!success)
|
||||
StringCbCopy(buffer, chars, defaultValue);
|
||||
return success;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
BOOL RegLoadValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD* value) {
|
||||
TCHAR buffer[32];
|
||||
if (!RegLoadString(section, key, peruser, buffer, 32))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
*value = (DWORD)_ttoi(buffer);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
BOOL RegLoadValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD* value, DWORD defaultValue) {
|
||||
BOOL success = RegLoadValue(section, key, peruser, value);
|
||||
if (!success)
|
||||
*value = defaultValue;
|
||||
return success;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
void RegSaveString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPCTSTR buffer) {
|
||||
TCHAR fullkeyname[256];
|
||||
wsprintf(fullkeyname,
|
||||
TEXT("Software\\AppleWin\\CurrentVersion\\%s"),
|
||||
(LPCTSTR)section);
|
||||
HKEY keyhandle;
|
||||
DWORD disposition;
|
||||
if (!RegCreateKeyEx((peruser ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE),
|
||||
fullkeyname,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
KEY_READ | KEY_WRITE,
|
||||
(LPSECURITY_ATTRIBUTES)NULL,
|
||||
&keyhandle,
|
||||
&disposition)) {
|
||||
RegSetValueEx(keyhandle,
|
||||
key,
|
||||
0,
|
||||
REG_SZ,
|
||||
(CONST BYTE *)buffer,
|
||||
(_tcslen(buffer)+1)*sizeof(TCHAR));
|
||||
RegCloseKey(keyhandle);
|
||||
}
|
||||
TCHAR fullkeyname[256];
|
||||
StringCbPrintf(fullkeyname, 256, TEXT("Software\\AppleWin\\CurrentVersion\\%s"), section);
|
||||
|
||||
HKEY keyhandle;
|
||||
DWORD disposition;
|
||||
LSTATUS status = RegCreateKeyEx(
|
||||
(peruser ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE),
|
||||
fullkeyname,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
KEY_READ | KEY_WRITE,
|
||||
(LPSECURITY_ATTRIBUTES)NULL,
|
||||
&keyhandle,
|
||||
&disposition);
|
||||
if (status == 0)
|
||||
{
|
||||
RegSetValueEx(
|
||||
keyhandle,
|
||||
key,
|
||||
0,
|
||||
REG_SZ,
|
||||
(CONST LPBYTE)buffer,
|
||||
(_tcslen(buffer) + 1) * sizeof(TCHAR));
|
||||
RegCloseKey(keyhandle);
|
||||
}
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
void RegSaveValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD value) {
|
||||
TCHAR buffer[32] = TEXT("");
|
||||
_ultot(value,buffer,10);
|
||||
RegSaveString(section,key,peruser,buffer);
|
||||
TCHAR buffer[32] = TEXT("");
|
||||
StringCbPrintf(buffer, 32, "%d", value);
|
||||
RegSaveString(section, key, peruser, buffer);
|
||||
}
|
||||
|
@ -1,11 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#define REGLOAD(a,b) RegLoadValue(TEXT(REG_CONFIG),a,1,b)
|
||||
#define REGSAVE(a,b) RegSaveValue(TEXT(REG_CONFIG),a,1,b)
|
||||
#define REGLOAD(a, b) RegLoadValue(TEXT(REG_CONFIG), (a), TRUE, (b))
|
||||
#define REGLOAD_DEFAULT(a, b, c) RegLoadValue(TEXT(REG_CONFIG), (a), TRUE, (b), (c))
|
||||
#define REGSAVE(a, b) RegSaveValue(TEXT(REG_CONFIG), (a), TRUE, (b))
|
||||
|
||||
BOOL RegLoadString (LPCTSTR,LPCTSTR,BOOL,LPTSTR,DWORD);
|
||||
BOOL RegLoadValue (LPCTSTR,LPCTSTR,BOOL,DWORD *);
|
||||
void RegSaveString (LPCTSTR,LPCTSTR,BOOL,LPCTSTR);
|
||||
void RegSaveValue (LPCTSTR,LPCTSTR,BOOL,DWORD);
|
||||
|
||||
BOOL RegLoadValue (LPCTSTR,LPCTSTR,BOOL,BOOL *);
|
||||
BOOL RegLoadString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPTSTR buffer, DWORD chars);
|
||||
BOOL RegLoadString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPTSTR buffer, DWORD chars, LPCTSTR defaultValue);
|
||||
BOOL RegLoadValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD* value);
|
||||
BOOL RegLoadValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD* value, DWORD defaultValue);
|
||||
void RegSaveString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPCTSTR buffer);
|
||||
void RegSaveValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD value);
|
||||
|
@ -36,6 +36,7 @@ typedef UINT64 uint64_t;
|
||||
|
||||
#include <windows.h>
|
||||
#include <winuser.h> // WM_MOUSEWHEEL
|
||||
#include <strsafe.h>
|
||||
#include <commctrl.h>
|
||||
#include <ddraw.h>
|
||||
#include <htmlhelp.h>
|
||||
|
@ -125,9 +125,9 @@ static bool g_bVideoScannerNTSC = true; // NTSC video scanning (or PAL)
|
||||
|
||||
bool g_bDisplayPrintScreenFileName = false;
|
||||
bool g_bShowPrintScreenWarningDialog = true;
|
||||
void Util_MakeScreenShotFileName( char *pFinalFileName_ );
|
||||
bool Util_TestScreenShotFileName( const char *pFileName );
|
||||
void Video_SaveScreenShot( const VideoScreenShot_e ScreenShotType, const char *pScreenShotFileName );
|
||||
void Util_MakeScreenShotFileName( TCHAR *pFinalFileName_, DWORD chars );
|
||||
bool Util_TestScreenShotFileName( const TCHAR *pFileName );
|
||||
void Video_SaveScreenShot( const VideoScreenShot_e ScreenShotType, const TCHAR *pScreenShotFileName );
|
||||
void Video_MakeScreenShot( FILE *pFile, const VideoScreenShot_e ScreenShotType );
|
||||
void videoCreateDIBSection();
|
||||
|
||||
@ -439,8 +439,8 @@ void VideoDisplayLogo ()
|
||||
SetTextAlign(hFrameDC,TA_RIGHT | TA_TOP);
|
||||
SetBkMode(hFrameDC,TRANSPARENT);
|
||||
|
||||
char szVersion[ 64 ] = "";
|
||||
sprintf( szVersion, "Version %s", VERSIONSTRING );
|
||||
TCHAR szVersion[ 64 ];
|
||||
StringCbPrintf(szVersion, 64, "Version %s", VERSIONSTRING);
|
||||
int xoff = GetFullScreenOffsetX(), yoff = GetFullScreenOffsetY();
|
||||
|
||||
#define DRAWVERSION(x,y,c) \
|
||||
@ -461,7 +461,7 @@ void VideoDisplayLogo ()
|
||||
}
|
||||
|
||||
#if _DEBUG
|
||||
sprintf( szVersion, "DEBUG" );
|
||||
StringCbPrintf(szVersion, 64, "DEBUG");
|
||||
DRAWVERSION( 2, -358*scale,RGB(0x00,0x00,0x00));
|
||||
DRAWVERSION( 1, -357*scale,RGB(0x00,0x00,0x00));
|
||||
DRAWVERSION( 0, -356*scale,RGB(0xFF,0x00,0xFF));
|
||||
@ -902,32 +902,32 @@ bool VideoGetVblBar(const DWORD uExecutedCycles)
|
||||
|
||||
static int g_nLastScreenShot = 0;
|
||||
const int nMaxScreenShot = 999999999;
|
||||
static char *g_pLastDiskImageName = NULL;
|
||||
static TCHAR *g_pLastDiskImageName = NULL;
|
||||
|
||||
//===========================================================================
|
||||
void Video_ResetScreenshotCounter( char *pImageName )
|
||||
void Video_ResetScreenshotCounter( TCHAR *pImageName )
|
||||
{
|
||||
g_nLastScreenShot = 0;
|
||||
g_pLastDiskImageName = pImageName;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
void Util_MakeScreenShotFileName( char *pFinalFileName_ )
|
||||
void Util_MakeScreenShotFileName( TCHAR *pFinalFileName_, DWORD chars )
|
||||
{
|
||||
char sPrefixScreenShotFileName[ 256 ] = "AppleWin_ScreenShot";
|
||||
const TCHAR * sPrefixScreenShotFileName = "AppleWin_ScreenShot";
|
||||
// TODO: g_sScreenshotDir
|
||||
char *pPrefixFileName = g_pLastDiskImageName ? g_pLastDiskImageName : sPrefixScreenShotFileName;
|
||||
const TCHAR *pPrefixFileName = g_pLastDiskImageName ? g_pLastDiskImageName : sPrefixScreenShotFileName;
|
||||
#if SCREENSHOT_BMP
|
||||
sprintf( pFinalFileName_, "%s_%09d.bmp", pPrefixFileName, g_nLastScreenShot );
|
||||
StringCbPrintf( pFinalFileName_, chars, TEXT("%s_%09d.bmp"), pPrefixFileName, g_nLastScreenShot );
|
||||
#endif
|
||||
#if SCREENSHOT_TGA
|
||||
sprintf( pFinalFileName_, "%s%09d.tga", pPrefixFileName, g_nLastScreenShot );
|
||||
StringCbPrintf( pFinalFileName_, chars, TEXT("%s%09d.tga"), pPrefixFileName, g_nLastScreenShot );
|
||||
#endif
|
||||
}
|
||||
|
||||
// Returns TRUE if file exists, else FALSE
|
||||
//===========================================================================
|
||||
bool Util_TestScreenShotFileName( const char *pFileName )
|
||||
bool Util_TestScreenShotFileName( const TCHAR *pFileName )
|
||||
{
|
||||
bool bFileExists = false;
|
||||
FILE *pFile = fopen( pFileName, "rt" );
|
||||
@ -942,7 +942,7 @@ bool Util_TestScreenShotFileName( const char *pFileName )
|
||||
//===========================================================================
|
||||
void Video_TakeScreenShot( const VideoScreenShot_e ScreenShotType )
|
||||
{
|
||||
char sScreenShotFileName[ MAX_PATH ];
|
||||
TCHAR sScreenShotFileName[ MAX_PATH ];
|
||||
|
||||
// find last screenshot filename so we don't overwrite the existing user ones
|
||||
bool bExists = true;
|
||||
@ -950,13 +950,14 @@ void Video_TakeScreenShot( const VideoScreenShot_e ScreenShotType )
|
||||
{
|
||||
if (g_nLastScreenShot > nMaxScreenShot) // Holy Crap! User has maxed the number of screenshots!?
|
||||
{
|
||||
sprintf( sScreenShotFileName, "You have more then %d screenshot filenames! They will no longer be saved.\n\nEither move some of your screenshots or increase the maximum in video.cpp\n", nMaxScreenShot );
|
||||
MessageBox( g_hFrameWindow, sScreenShotFileName, "Warning", MB_OK );
|
||||
TCHAR msg[512];
|
||||
StringCbPrintf( msg, 512, "You have more then %d screenshot filenames! They will no longer be saved.\n\nEither move some of your screenshots or increase the maximum in video.cpp\n", nMaxScreenShot );
|
||||
MessageBox( g_hFrameWindow, msg, "Warning", MB_OK );
|
||||
g_nLastScreenShot = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
Util_MakeScreenShotFileName( sScreenShotFileName );
|
||||
Util_MakeScreenShotFileName( sScreenShotFileName, MAX_PATH );
|
||||
bExists = Util_TestScreenShotFileName( sScreenShotFileName );
|
||||
if( !bExists )
|
||||
{
|
||||
@ -969,7 +970,7 @@ void Video_TakeScreenShot( const VideoScreenShot_e ScreenShotType )
|
||||
g_nLastScreenShot++;
|
||||
}
|
||||
|
||||
void Video_RedrawAndTakeScreenShot( const char* pScreenshotFilename )
|
||||
void Video_RedrawAndTakeScreenShot( const TCHAR* pScreenshotFilename )
|
||||
{
|
||||
_ASSERT(pScreenshotFilename);
|
||||
if (!pScreenshotFilename)
|
||||
@ -1137,7 +1138,7 @@ static void Video_MakeScreenShot(FILE *pFile, const VideoScreenShot_e ScreenShot
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
static void Video_SaveScreenShot( const VideoScreenShot_e ScreenShotType, const char *pScreenShotFileName )
|
||||
static void Video_SaveScreenShot( const VideoScreenShot_e ScreenShotType, const TCHAR *pScreenShotFileName )
|
||||
{
|
||||
FILE *pFile = fopen( pScreenShotFileName, "wb" );
|
||||
if( pFile )
|
||||
@ -1162,7 +1163,7 @@ static BYTE g_videoRom[kVideoRomSizeMax];
|
||||
static UINT g_videoRomSize = 0;
|
||||
static bool g_videoRomRockerSwitch = false;
|
||||
|
||||
bool ReadVideoRomFile(const char* pRomFile)
|
||||
bool ReadVideoRomFile(const TCHAR* pRomFile)
|
||||
{
|
||||
g_videoRomSize = 0;
|
||||
|
||||
@ -1227,23 +1228,29 @@ enum VideoType127_e
|
||||
|
||||
void Config_Load_Video()
|
||||
{
|
||||
REGLOAD(TEXT(REGVALUE_VIDEO_MODE) ,&g_eVideoType);
|
||||
REGLOAD(TEXT(REGVALUE_VIDEO_STYLE) ,(DWORD*)&g_eVideoStyle);
|
||||
REGLOAD(TEXT(REGVALUE_VIDEO_MONO_COLOR),&g_nMonochromeRGB);
|
||||
DWORD dwTmp;
|
||||
|
||||
DWORD rate = VR_60HZ;
|
||||
REGLOAD(TEXT(REGVALUE_VIDEO_REFRESH_RATE), &rate);
|
||||
SetVideoRefreshRate((VideoRefreshRate_e)rate);
|
||||
REGLOAD_DEFAULT(TEXT(REGVALUE_VIDEO_MODE), &dwTmp, (DWORD)VT_DEFAULT);
|
||||
g_eVideoType = dwTmp;
|
||||
|
||||
REGLOAD_DEFAULT(TEXT(REGVALUE_VIDEO_STYLE), &dwTmp, (DWORD)VS_HALF_SCANLINES);
|
||||
g_eVideoStyle = (VideoStyle_e)dwTmp;
|
||||
|
||||
REGLOAD_DEFAULT(TEXT(REGVALUE_VIDEO_MONO_COLOR), &dwTmp, (DWORD)RGB(0xC0, 0xC0, 0xC0));
|
||||
g_nMonochromeRGB = (COLORREF)dwTmp;
|
||||
|
||||
REGLOAD_DEFAULT(TEXT(REGVALUE_VIDEO_REFRESH_RATE), &dwTmp, (DWORD)VR_60HZ);
|
||||
SetVideoRefreshRate((VideoRefreshRate_e)dwTmp);
|
||||
|
||||
//
|
||||
|
||||
const UINT16* pOldVersion = GetOldAppleWinVersion();
|
||||
if (pOldVersion[0] == 1 && pOldVersion[1] <= 28 && pOldVersion[2] <= 1)
|
||||
{
|
||||
DWORD halfScanLines = 0;
|
||||
REGLOAD(TEXT(REGVALUE_VIDEO_HALF_SCAN_LINES),&halfScanLines);
|
||||
DWORD dwHalfScanLines;
|
||||
REGLOAD_DEFAULT(TEXT(REGVALUE_VIDEO_HALF_SCAN_LINES), &dwHalfScanLines, 0);
|
||||
|
||||
if (halfScanLines)
|
||||
if (dwHalfScanLines)
|
||||
g_eVideoStyle = (VideoStyle_e) ((DWORD)g_eVideoStyle | VS_HALF_SCANLINES);
|
||||
else
|
||||
g_eVideoStyle = (VideoStyle_e) ((DWORD)g_eVideoStyle & ~VS_HALF_SCANLINES);
|
||||
|
Loading…
x
Reference in New Issue
Block a user