0.7.8c release
This commit is contained in:
parent
bd4db908c8
commit
aa44e5cb4b
|
@ -1,10 +1,18 @@
|
|||
cxbx website: http://www.caustik.com/xbox/
|
||||
|
||||
version: 0.7.9 (??/??/??)
|
||||
version: 0.7.8c (09/02/03)
|
||||
--------------------------------
|
||||
|
||||
- Spontaneous CreateDevice failures fixed (many, at least)
|
||||
|
||||
- Exe now able to generate into temporary directory, allowing
|
||||
games to be run from a read only device without path issues.
|
||||
|
||||
- Finally, Cxbx.dll and Cxbx.exe enforce version synchronization.
|
||||
This should at least diagnose about 9 billion people's problems.
|
||||
|
||||
- Very minor splash image tweaks
|
||||
|
||||
version: 0.7.8b (08/30/03)
|
||||
--------------------------------
|
||||
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
Cxbx Todo (* denotes high priority, + denotes medium priority)
|
||||
|
||||
* CreateDevice/Release must be called in the context of the same thread,
|
||||
so there needs to be a proxy CreateDevice and Release thread.
|
||||
|
||||
* Go lower level with mutants (maybe unnecessary), use \??\ and also
|
||||
set root directory to null.
|
||||
|
||||
|
|
|
@ -244,6 +244,11 @@ class Xbe : public Error
|
|||
// ******************************************************************
|
||||
uint08 **m_bzSection;
|
||||
|
||||
// ******************************************************************
|
||||
// * XBE original path
|
||||
// ******************************************************************
|
||||
char m_szPath[260];
|
||||
|
||||
// ******************************************************************
|
||||
// * XBE ascii title, translated from certificate title
|
||||
// ******************************************************************
|
||||
|
|
|
@ -68,9 +68,9 @@ typedef signed long sint32;
|
|||
// * Version information
|
||||
// ******************************************************************
|
||||
#ifndef _DEBUG_TRACE
|
||||
#define _CXBX_VERSION "0.7.9-Pre1"
|
||||
#define _CXBX_VERSION "0.7.8c"
|
||||
#else
|
||||
#define _CXBX_VERSION "0.7.9-Pre1-Trace"
|
||||
#define _CXBX_VERSION "0.7.8c-Trace"
|
||||
#endif
|
||||
|
||||
// ******************************************************************
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by C:\Aaron\Projects\Cxbx\Resource\Cxbx.rc
|
||||
// Used by D:\Projects\Cxbx\Resource\Cxbx.rc
|
||||
//
|
||||
#define IDI_CXBX 101
|
||||
#define IDB_SPLASH 102
|
||||
|
@ -91,13 +91,16 @@
|
|||
#define ID_EDIT_DUMPXBEINFOTO_FILE 40071
|
||||
#define ID_EDIT_DUMPXBEINFOTO_DEBUGCONSOLE 40072
|
||||
#define ID_SETTINGS_DIR 40076
|
||||
#define ID_SETTINGS_GENXP 40078
|
||||
#define ID_SETTINGS_GENWT 40079
|
||||
#define ID_SETTINGS_GENMA 40080
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 115
|
||||
#define _APS_NEXT_COMMAND_VALUE 40077
|
||||
#define _APS_NEXT_COMMAND_VALUE 40081
|
||||
#define _APS_NEXT_CONTROL_VALUE 1049
|
||||
#define _APS_NEXT_SYMED_VALUE 104
|
||||
#endif
|
||||
|
|
|
@ -44,6 +44,16 @@
|
|||
#define RECENT_XBE_SIZE 10
|
||||
#define RECENT_EXE_SIZE 10
|
||||
|
||||
// ******************************************************************
|
||||
// * AutoConvert methods
|
||||
// ******************************************************************
|
||||
enum EnumAutoConvert
|
||||
{
|
||||
AUTO_CONVERT_MANUAL = 0,
|
||||
AUTO_CONVERT_XBE_PATH = 1,
|
||||
AUTO_CONVERT_WINDOWS_TEMP = 2
|
||||
};
|
||||
|
||||
// ******************************************************************
|
||||
// * class : WndMain
|
||||
// ******************************************************************
|
||||
|
@ -75,7 +85,7 @@ class WndMain : public Wnd
|
|||
// ******************************************************************
|
||||
// * start emulation (converting to .exe if not done already)
|
||||
// ******************************************************************
|
||||
void StartEmulation(bool x_bAutoConvert);
|
||||
void StartEmulation(EnumAutoConvert x_bAutoConvert);
|
||||
|
||||
// ******************************************************************
|
||||
// * accessor
|
||||
|
@ -144,7 +154,7 @@ class WndMain : public Wnd
|
|||
// ******************************************************************
|
||||
// * should emulation always auto-create the .exe?
|
||||
// ******************************************************************
|
||||
BOOL m_bAutoConvertToExe;
|
||||
EnumAutoConvert m_AutoConvertToExe;
|
||||
|
||||
// ******************************************************************
|
||||
// * Recent Xbe files
|
||||
|
|
|
@ -44,6 +44,11 @@
|
|||
// ******************************************************************
|
||||
extern "C" CXBXKRNL_API void NTAPI EmuNoFunc();
|
||||
|
||||
// ******************************************************************
|
||||
// * func: EmuVerifyVersion
|
||||
// ******************************************************************
|
||||
extern "C" CXBXKRNL_API bool NTAPI EmuVerifyVersion(const char *szVersion);
|
||||
|
||||
// ******************************************************************
|
||||
// * func: EmuInit
|
||||
// ******************************************************************
|
||||
|
|
|
@ -63,16 +63,22 @@ class EmuShared : public Mutex
|
|||
CXBXKRNL_API static void Cleanup();
|
||||
|
||||
// ******************************************************************
|
||||
// * Xbox Video Accessor
|
||||
// * Xbox Video Accessors
|
||||
// ******************************************************************
|
||||
CXBXKRNL_API void GetXBVideo(XBVideo *video) { Lock(); memcpy(video, &m_XBVideo, sizeof(XBVideo)); Unlock(); }
|
||||
CXBXKRNL_API void SetXBVideo(XBVideo *video) { Lock(); memcpy(&m_XBVideo, video, sizeof(XBVideo)); Unlock(); }
|
||||
CXBXKRNL_API void GetXBVideo( XBVideo *video) { Lock(); memcpy(video, &m_XBVideo, sizeof(XBVideo)); Unlock(); }
|
||||
CXBXKRNL_API void SetXBVideo(const XBVideo *video) { Lock(); memcpy(&m_XBVideo, video, sizeof(XBVideo)); Unlock(); }
|
||||
|
||||
// ******************************************************************
|
||||
// * Xbox Controller Accessor
|
||||
// * Xbox Controller Accessors
|
||||
// ******************************************************************
|
||||
CXBXKRNL_API void GetXBController(XBController *ctrl) { Lock(); memcpy(ctrl, &m_XBController, sizeof(XBController)); Unlock();}
|
||||
CXBXKRNL_API void SetXBController(XBController *ctrl) { Lock(); memcpy(&m_XBController, ctrl, sizeof(XBController)); Unlock();}
|
||||
CXBXKRNL_API void GetXBController( XBController *ctrl) { Lock(); memcpy(ctrl, &m_XBController, sizeof(XBController)); Unlock();}
|
||||
CXBXKRNL_API void SetXBController(const XBController *ctrl) { Lock(); memcpy(&m_XBController, ctrl, sizeof(XBController)); Unlock();}
|
||||
|
||||
// ******************************************************************
|
||||
// * Xbe Path Accessors
|
||||
// ******************************************************************
|
||||
CXBXKRNL_API void GetXbePath( char *path) { Lock(); strcpy(path, m_XbePath); Unlock(); }
|
||||
CXBXKRNL_API void SetXbePath(const char *path) { Lock(); strcpy(m_XbePath, path); Unlock(); }
|
||||
|
||||
private:
|
||||
// ******************************************************************
|
||||
|
@ -80,6 +86,7 @@ class EmuShared : public Mutex
|
|||
// ******************************************************************
|
||||
XBController m_XBController;
|
||||
XBVideo m_XBVideo;
|
||||
char m_XbePath[260];
|
||||
};
|
||||
|
||||
// ******************************************************************
|
||||
|
|
|
@ -161,7 +161,12 @@ BEGIN
|
|||
, GRAYED
|
||||
MENUITEM "Config &Video...", ID_SETTINGS_CONFIG_VIDEO
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Generate &Exe Automatically", ID_SETTINGS_AUTOGEN
|
||||
POPUP "Executable &Generation"
|
||||
BEGIN
|
||||
MENUITEM "&Automatic (&Windows Temp)", ID_SETTINGS_GENWT
|
||||
MENUITEM "Automatic (&Xbe Path)", ID_SETTINGS_GENXP
|
||||
MENUITEM "&Manual", ID_SETTINGS_GENMA
|
||||
END
|
||||
END
|
||||
POPUP "E&mulation"
|
||||
BEGIN
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 150 KiB |
|
@ -351,9 +351,9 @@ void Exe::Export(const char *x_szExeFilename)
|
|||
|
||||
if(fwrite(m_bzSection[v], RawSize, 1, ExeFile) != 1)
|
||||
{
|
||||
char Buffer[255];
|
||||
sprintf(Buffer, "Could not write PE section %d (%Xh)", v, v);
|
||||
SetError(Buffer, false);
|
||||
char buffer[255];
|
||||
sprintf(buffer, "Could not write PE section %d (%Xh)", v, v);
|
||||
SetError(buffer, false);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
// ******************************************************************
|
||||
#include "Xbe.h"
|
||||
#include "Exe.h"
|
||||
#include "Emu.h"
|
||||
|
||||
#include <memory.h>
|
||||
#include <locale.h>
|
||||
|
@ -44,7 +45,7 @@
|
|||
// ******************************************************************
|
||||
Xbe::Xbe(const char *x_szFilename)
|
||||
{
|
||||
char szBuffer[255];
|
||||
char szBuffer[260];
|
||||
|
||||
ConstructorInit();
|
||||
|
||||
|
@ -63,6 +64,28 @@ Xbe::Xbe(const char *x_szFilename)
|
|||
|
||||
printf("OK\n");
|
||||
|
||||
// ******************************************************************
|
||||
// * remember xbe path
|
||||
// ******************************************************************
|
||||
{
|
||||
printf("Xbe::Xbe Storing Xbe Path...");
|
||||
|
||||
strcpy(m_szPath, x_szFilename);
|
||||
|
||||
int v=0, c=0;
|
||||
|
||||
while(m_szPath[v] != '\0')
|
||||
{
|
||||
if(m_szPath[v] == '\\')
|
||||
c = v+1;
|
||||
v++;
|
||||
}
|
||||
|
||||
m_szPath[c] = '\0';
|
||||
}
|
||||
|
||||
printf("OK\n");
|
||||
|
||||
// ******************************************************************
|
||||
// * read xbe image header
|
||||
// ******************************************************************
|
||||
|
@ -967,7 +990,7 @@ void Xbe::Export(const char *x_szXbeFilename)
|
|||
if(GetError() != 0)
|
||||
return;
|
||||
|
||||
char szBuffer[255];
|
||||
char szBuffer[260];
|
||||
|
||||
printf("Xbe::Export: Writing Xbe file...");
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
// * All rights reserved
|
||||
// *
|
||||
// ******************************************************************
|
||||
#include "Emu.h"
|
||||
#include "WndMain.h"
|
||||
#include "EmuShared.h"
|
||||
#include "EmuExe.h"
|
||||
|
@ -40,6 +41,12 @@
|
|||
// ******************************************************************
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
|
||||
{
|
||||
if(!EmuVerifyVersion(_CXBX_VERSION))
|
||||
{
|
||||
MessageBox(NULL, "Cxbx.dll is the incorrect version", "Cxbx", MB_OK);
|
||||
return 1;
|
||||
}
|
||||
|
||||
EmuShared::Init();
|
||||
|
||||
WndMain *MainWindow = new WndMain(hInstance);
|
||||
|
@ -51,7 +58,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
|||
{
|
||||
MainWindow->OpenXbe(__argv[1]);
|
||||
|
||||
MainWindow->StartEmulation(true);
|
||||
MainWindow->StartEmulation(AUTO_CONVERT_WINDOWS_TEMP);
|
||||
}
|
||||
|
||||
while(MainWindow->GetError() == 0 && MainWindow->ProcessMessages())
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
// ******************************************************************
|
||||
// * constructor
|
||||
// ******************************************************************
|
||||
WndMain::WndMain(HINSTANCE x_hInstance) : Wnd(x_hInstance), m_bCreated(false), m_Xbe(0), m_Exe(0), m_bExeChanged(false), m_bXbeChanged(false), m_bAutoConvertToExe(TRUE), m_KrnlDebug(DM_NONE), m_CxbxDebug(DM_NONE), m_dwRecentXbe(0), m_dwRecentExe(0)
|
||||
WndMain::WndMain(HINSTANCE x_hInstance) : Wnd(x_hInstance), m_bCreated(false), m_Xbe(0), m_Exe(0), m_bExeChanged(false), m_bXbeChanged(false), m_AutoConvertToExe(AUTO_CONVERT_WINDOWS_TEMP), m_KrnlDebug(DM_NONE), m_CxbxDebug(DM_NONE), m_dwRecentXbe(0), m_dwRecentExe(0)
|
||||
{
|
||||
// ******************************************************************
|
||||
// * Initialize members
|
||||
|
@ -105,7 +105,7 @@ WndMain::WndMain(HINSTANCE x_hInstance) : Wnd(x_hInstance), m_bCreated(false), m
|
|||
RegQueryValueEx(hKey, "RecentExe", NULL, &dwType, (PBYTE)&m_dwRecentExe, &dwSize);
|
||||
|
||||
dwType = REG_DWORD; dwSize = sizeof(DWORD);
|
||||
RegQueryValueEx(hKey, "AutoConvertToExe", NULL, &dwType, (PBYTE)&m_bAutoConvertToExe, &dwSize);
|
||||
RegQueryValueEx(hKey, "AutoConvertToExe", NULL, &dwType, (PBYTE)&m_AutoConvertToExe, &dwSize);
|
||||
|
||||
dwType = REG_SZ; dwSize = 260;
|
||||
RegQueryValueEx(hKey, "CxbxDebugFilename", NULL, &dwType, (PBYTE)m_CxbxDebugFilename, &dwSize);
|
||||
|
@ -173,7 +173,7 @@ WndMain::~WndMain()
|
|||
RegSetValueEx(hKey, "RecentExe", 0, dwType, (PBYTE)&m_dwRecentExe, dwSize);
|
||||
|
||||
dwType = REG_DWORD; dwSize = sizeof(DWORD);
|
||||
RegSetValueEx(hKey, "AutoConvertToExe", 0, dwType, (PBYTE)&m_bAutoConvertToExe, dwSize);
|
||||
RegSetValueEx(hKey, "AutoConvertToExe", 0, dwType, (PBYTE)&m_AutoConvertToExe, dwSize);
|
||||
|
||||
dwType = REG_SZ; dwSize = 260;
|
||||
RegSetValueEx(hKey, "CxbxDebugFilename", 0, dwType, (PBYTE)m_CxbxDebugFilename, dwSize);
|
||||
|
@ -359,7 +359,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
|
|||
case VK_F5:
|
||||
{
|
||||
if(m_Xbe != 0)
|
||||
StartEmulation(m_bAutoConvertToExe == TRUE);
|
||||
StartEmulation(m_AutoConvertToExe);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -1018,12 +1018,28 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
|
|||
break;
|
||||
|
||||
case ID_EMULATION_START:
|
||||
StartEmulation(m_bAutoConvertToExe == TRUE);
|
||||
StartEmulation(m_AutoConvertToExe);
|
||||
break;
|
||||
|
||||
case ID_SETTINGS_AUTOGEN:
|
||||
case ID_SETTINGS_GENWT:
|
||||
{
|
||||
m_bAutoConvertToExe = !m_bAutoConvertToExe;
|
||||
m_AutoConvertToExe = AUTO_CONVERT_WINDOWS_TEMP;
|
||||
|
||||
RefreshMenus();
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_SETTINGS_GENXP:
|
||||
{
|
||||
m_AutoConvertToExe = AUTO_CONVERT_XBE_PATH;
|
||||
|
||||
RefreshMenus();
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_SETTINGS_GENMA:
|
||||
{
|
||||
m_AutoConvertToExe = AUTO_CONVERT_MANUAL;
|
||||
|
||||
RefreshMenus();
|
||||
}
|
||||
|
@ -1314,9 +1330,27 @@ void WndMain::RefreshMenus()
|
|||
// ******************************************************************
|
||||
{
|
||||
HMENU sett_menu = GetSubMenu(menu, 3);
|
||||
HMENU auto_menu = GetSubMenu(sett_menu, 4);
|
||||
|
||||
// check "Generate Exe Automatically" if appropriate
|
||||
CheckMenuItem(sett_menu, ID_SETTINGS_AUTOGEN, MF_BYCOMMAND | ((m_bAutoConvertToExe == TRUE) ? MF_CHECKED : MF_UNCHECKED) );
|
||||
// check appropriate choice
|
||||
if(m_AutoConvertToExe == AUTO_CONVERT_WINDOWS_TEMP)
|
||||
{
|
||||
CheckMenuItem(auto_menu, ID_SETTINGS_GENWT, MF_BYCOMMAND | MF_CHECKED);
|
||||
CheckMenuItem(auto_menu, ID_SETTINGS_GENXP, MF_BYCOMMAND | MF_UNCHECKED);
|
||||
CheckMenuItem(auto_menu, ID_SETTINGS_GENMA, MF_BYCOMMAND | MF_UNCHECKED);
|
||||
}
|
||||
else if(m_AutoConvertToExe == AUTO_CONVERT_XBE_PATH)
|
||||
{
|
||||
CheckMenuItem(auto_menu, ID_SETTINGS_GENWT, MF_BYCOMMAND | MF_UNCHECKED);
|
||||
CheckMenuItem(auto_menu, ID_SETTINGS_GENXP, MF_BYCOMMAND | MF_CHECKED);
|
||||
CheckMenuItem(auto_menu, ID_SETTINGS_GENMA, MF_BYCOMMAND | MF_UNCHECKED);
|
||||
}
|
||||
else
|
||||
{
|
||||
CheckMenuItem(auto_menu, ID_SETTINGS_GENWT, MF_BYCOMMAND | MF_UNCHECKED);
|
||||
CheckMenuItem(auto_menu, ID_SETTINGS_GENXP, MF_BYCOMMAND | MF_UNCHECKED);
|
||||
CheckMenuItem(auto_menu, ID_SETTINGS_GENMA, MF_BYCOMMAND | MF_CHECKED);
|
||||
}
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
|
@ -1757,7 +1791,7 @@ bool WndMain::ConvertToExe(const char *x_filename, bool x_bVerifyIfExists)
|
|||
}
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// ******************************************************************
|
||||
// * convert file
|
||||
// ******************************************************************
|
||||
{
|
||||
|
@ -1786,7 +1820,7 @@ bool WndMain::ConvertToExe(const char *x_filename, bool x_bVerifyIfExists)
|
|||
// ******************************************************************
|
||||
// * StartEmulation
|
||||
// ******************************************************************
|
||||
void WndMain::StartEmulation(bool x_bAutoConvert)
|
||||
void WndMain::StartEmulation(EnumAutoConvert x_AutoConvert)
|
||||
{
|
||||
char szBuffer[260];
|
||||
|
||||
|
@ -1795,7 +1829,29 @@ void WndMain::StartEmulation(bool x_bAutoConvert)
|
|||
// ******************************************************************
|
||||
if(m_ExeFilename[0] == '\0' || m_bExeChanged)
|
||||
{
|
||||
if(x_bAutoConvert)
|
||||
if(x_AutoConvert == AUTO_CONVERT_WINDOWS_TEMP)
|
||||
{
|
||||
char szTempPath[260];
|
||||
|
||||
GetTempPath(259, szTempPath);
|
||||
|
||||
SuggestFilename(m_XbeFilename, szBuffer, ".exe");
|
||||
|
||||
int v=0, c=0;
|
||||
|
||||
while(szBuffer[v] != '\0')
|
||||
{
|
||||
if(szBuffer[v] == '\\')
|
||||
c = v+1;
|
||||
v++;
|
||||
}
|
||||
|
||||
strcat(szTempPath, &szBuffer[c]);
|
||||
|
||||
if(!ConvertToExe(szTempPath, false))
|
||||
return;
|
||||
}
|
||||
else if(x_AutoConvert == AUTO_CONVERT_XBE_PATH)
|
||||
{
|
||||
SuggestFilename(m_XbeFilename, szBuffer, ".exe");
|
||||
|
||||
|
@ -1809,6 +1865,11 @@ void WndMain::StartEmulation(bool x_bAutoConvert)
|
|||
}
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * register xbe path with Cxbx.dll
|
||||
// ******************************************************************
|
||||
g_EmuShared->SetXbePath(m_Xbe->m_szPath);
|
||||
|
||||
// ******************************************************************
|
||||
// * shell exe
|
||||
// ******************************************************************
|
||||
|
@ -1838,5 +1899,4 @@ void WndMain::StartEmulation(bool x_bAutoConvert)
|
|||
printf("WndMain: %s emulation started.\n", m_Xbe->m_szAsciiTitle);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -103,6 +103,17 @@ extern "C" CXBXKRNL_API void NTAPI EmuNoFunc()
|
|||
EmuSwapFS(); // XBox FS
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * func: EmuVerifyVersion
|
||||
// ******************************************************************
|
||||
extern "C" CXBXKRNL_API bool NTAPI EmuVerifyVersion(const char *szVersion)
|
||||
{
|
||||
if(strcmp(szVersion, _CXBX_VERSION) != 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * func: EmuCleanThread
|
||||
// ******************************************************************
|
||||
|
@ -223,21 +234,9 @@ extern "C" CXBXKRNL_API void NTAPI EmuInit
|
|||
{
|
||||
char szBuffer[260];
|
||||
|
||||
GetModuleFileName(NULL, szBuffer, 260);
|
||||
g_EmuShared->GetXbePath(szBuffer);
|
||||
|
||||
sint32 spot=-1;
|
||||
for(int v=0;v<260;v++)
|
||||
{
|
||||
if(szBuffer[v] == '\\')
|
||||
spot = v;
|
||||
else if(szBuffer[v] == '\0')
|
||||
break;
|
||||
}
|
||||
|
||||
if(spot != -1)
|
||||
szBuffer[spot] = '\0';
|
||||
|
||||
SetCurrentDirectory(szBuffer);
|
||||
SetCurrentDirectory(szBuffer);
|
||||
|
||||
g_hCurDir = CreateFile(szBuffer, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
|
||||
|
||||
|
|
Loading…
Reference in New Issue