📄 node_win32.c
字号:
}
}
Lang = 0;
if (Size >= 2 && gzread(gf,s8,2) == 2)
{
Size -= 2;
No = 2;
Unicode = s8[0] == (char)-1 && s8[1] == (char)-2;
if (Unicode)
{
CodePageFound = 1;
No = 0;
}
}
for (;;No=0)
{
if (Unicode)
{
if (Size<2)
break;
while (Size>=2 && gzread(gf,&s16[No],2)==2)
{
Size -= 2;
if (s16[No] == 10 || s16[No] == 13)
break;
if (No<511)
++No;
}
s16[No] = 0;
WcsToTcs(s,s16,sizeof(s)/sizeof(tchar_t));
}
else
{
if (Size<1)
break;
while (Size>=1 && gzread(gf,&s8[No],1)==1)
{
--Size;
if (s8[No] == 10 || s8[No] == 13)
break;
if (No<511)
++No;
}
s8[No] = 0;
#ifdef UNICODE
if (!MultiByteToWideChar(CodePage,MB_PRECOMPOSED,s8,-1,s,sizeof(s)/sizeof(tchar_t)))
{
mbstowcs(s,s8,511);
s[511] = 0;
}
#else
StrToTcs(s,s8,sizeof(s)/sizeof(tchar_t));
#endif
}
if (gzeof(gf))
break;
p = s;
while (*p==' ') ++p;
if (*p==0)
continue;
if (*p==';')
{
if (Scanf(p,T(";CODEPAGE = %d"),&CodePage)==1)
{
CodePageFound = 1;
//if (!IsValidCodePage(CodePage))
// break; // skip file
}
continue;
}
if (*p=='[')
{
q = tcschr(p,']');
if (!q)
break; // not a valid language file
if (!CodePageFound)
break; // not a valid language file
*q = 0;
Lang = StringToFourCC(p+1,1);
if (Lang == FOURCC('D','E','F','A'))
Lang = LANG_DEFAULT;
if (Lang == StringLang && Lang != LANG_DEFAULT)
StringCodePage = CodePage;
}
else
{
if (!Lang)
break;
if (Lang && Lang != LANG_DEFAULT && Lang != StringLang)
continue;
q = tcschr(p,'=');
if (!q)
break; // not a valid language file
*q=0;
++q;
if (tcslen(p)>4)
if (tcslen(p)<8)
No = StringToFourCC(p+4,1);
else
{
No = StringToInt(p+4,1);
if (No >= 32768)
No -= 65536;
}
else
No = 0;
FilterString(q);
StringAdd(Lang,StringToFourCC(p,1),No,q);
}
}
}
static void StringLoadTXT(const tchar_t* FileName)
{
gzFile gf = gzopen(FileName,"rb");
if (gf)
{
StringLoad(FileName,gf,MAX_INT);
gzclose(gf);
}
}
typedef struct tarhead
{
char Name[100];
char mode[8];
char uid[8];
char gid[8];
char size[12];
char mtime[12];
char chksum[8];
char link;
char linkname[100];
char unused[512-100-8-8-8-12-12-8-1-100];
} tarhead;
static void StringLoadTGZ(const tchar_t* FileName)
{
gzFile gf = gzopen(FileName,"rb");
if (gf)
{
tchar_t Name[MAXPATH];
tarhead Head;
int Size,i;
int Pos;
while (!gzeof(gf) && gzread(gf,&Head,sizeof(Head))==sizeof(Head) && Head.size[0])
{
Pos = gztell(gf);
// strtoul is not supported on wince2.11 and earlier
Size = 0;
for (i=0;i<12;++i)
if (Head.size[i] >= '0' && Head.size[i] <= '7')
Size = Size*8 + (Head.size[i] - '0');
else
break;
StrToTcs(Name,Head.Name,MAXPATH);
StringLoad(Name,gf,Size);
gzseek(gf,Pos+((Size+511)&~511)-gztell(gf),SEEK_CUR);
}
gzclose(gf);
}
}
static void PluginError(const tchar_t* FileName)
{
tchar_t Name[MAXPATH];
tchar_t Ext[MAXPATH];
SplitURL(FileName,NULL,NULL,Name,Ext);
TcsUpr(Name);
NodeError(NULL,ERR_ID,ERR_NOT_COMPATIBLE,Name);
}
static void PluginLoad(const tchar_t* FileName)
{
HMODULE Dll;
#if !defined(_WIN32_WCE)
int OldMode = SetErrorMode(SEM_NOOPENFILEERRORBOX| SEM_FAILCRITICALERRORS);
#endif
Dll = LoadLibrary(FileName);
DEBUG_MSG2(DEBUG_SYS,T("LOAD PLUGIN %s %d"),FileName,Dll);
#if !defined(_WIN32_WCE)
SetErrorMode(OldMode);
#endif
if (Dll)
{
int Result;
int No;
lib* Lib;
for (No=0;No<NodeLibCount;++No)
if (NodeLib[No].Dll == Dll)
{
FreeLibrary(Dll);
return;
}
Lib = &NodeLib[NodeLibCount++];
Lib->Min = Lib->Max = NULL;
Lib->Dll = Dll;
Lib->Func = GetProcAddress(Dll,TWIN("DLLRegister"));
if (!Lib->Func)
Lib->Func = GetProcAddress(Dll,TWIN("_DLLRegister@4"));
if (Lib->Func)
{
Result = ((int(*)(int))Lib->Func)(NODE_VERSION);
if (Result != ERR_NONE)
{
Lib->Func = NULL;
if (Result == ERR_NOT_COMPATIBLE)
PluginError(FileName);
}
}
}
else
if (GetFileAttributes(FileName) != (DWORD)-1) //dll exists?
PluginError(FileName);
}
static void FindFiles(const tchar_t* Path, const tchar_t* Mask, void(*Process)())
{
WIN32_FIND_DATA FindData;
tchar_t FindPath[MAXPATH];
HANDLE Find;
tcscpy(FindPath,Path);
tcscat(FindPath,Mask);
Find = FindFirstFile(FindPath,&FindData);
if (Find != INVALID_HANDLE_VALUE)
{
do
{
tcscpy(FindPath,Path);
tcscat(FindPath,FindData.cFileName);
//DebugMessage(T("TIME:%d %s"),GetTimeTick(),FindPath);
DEBUG_MSG1(DEBUG_SYS,T("LOAD %s"),FindPath);
Process(FindPath);
}
while (FindNextFile(Find,&FindData));
FindClose(Find);
}
}
static void PluginsFind(const tchar_t* Module, tchar_t* Path, const tchar_t* Skip )
{
tchar_t *s;
HMODULE Handle = NULL;
if (Module)
Handle = GetModuleHandle(Module);
GetModuleFileName(Handle,Path,MAXPATH);
s = tcsrchr(Path,'\\');
if (s) *s = 0;
tcscat(Path,T("\\"));
if (Skip && TcsICmp(Path,Skip)==0)
return;
FindFiles(Path,T("*.tgz"),StringLoadTGZ);
FindFiles(Path,T("*.txt"),StringLoadTXT);
FindFiles(Path,T("*.plg"),PluginLoad);
}
void NodePlugins()
{
tchar_t Path[MAXPATH];
tchar_t Path2[MAXPATH];
tchar_t Name[64];
DWORD NameSize;
DWORD RegSize;
DWORD RegType;
HKEY Key;
int No;
PluginsFind(NULL,Path,NULL);
PluginsFind(T("common.plg"),Path2,Path); // just in case somebody using the emulator without setting up pathes
tcscpy(Path,T("SOFTWARE\\BetaPlugins"));
if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, Path, 0, ACCESS_LOAD, &Key ) == ERROR_SUCCESS)
{
NameSize = sizeof(Name)/sizeof(tchar_t);
RegSize = sizeof(Path2);
for (No=0;RegEnumValue(Key,No,Name,&NameSize,NULL,&RegType,(LPBYTE)Path2,&RegSize)==ERROR_SUCCESS;++No)
{
if (RegType == REG_SZ)
PluginLoad(Path2);
NameSize = sizeof(Name)/sizeof(tchar_t);
RegSize = sizeof(Path2);
}
}
for (No=1;No<NodeLibCount;++No)
{
lib* Lib = &NodeLib[No];
if (!Lib->Func)
{
FreeLibrary(Lib->Dll);
Lib->Dll = NULL;
}
}
}
void Node_Done()
{
int No;
for (No=NodeLibCount-1;No>=1;--No)
{
lib* Lib = &NodeLib[No];
if (Lib->Dll)
{
FARPROC UnRegister = GetProcAddress(Lib->Dll,TWIN("DLLUnRegister"));
if (!UnRegister)
UnRegister = GetProcAddress(Lib->Dll,TWIN("_DLLUnRegister@0"));
if (UnRegister)
((void(*)())UnRegister)();
FreeLibrary(Lib->Dll);
}
}
NodeLibCount = 0;
}
bool_t NodeLocate( void* Ptr, tchar_t* OutName, int* OutBase )
{
lib* Lib;
int No;
uint8_t* v = (uint8_t*)Ptr;
for (No=0;No<NodeLibCount;++No)
{
Lib = &NodeLib[No];
if (Lib->Dll)
{
if (!Lib->Min)
{
int PageSize;
CodeFindPages(*(void**)&Lib->Func,&Lib->Min,&Lib->Max,&PageSize);
}
if (Lib->Min <= v && Lib->Max > v)
{
tchar_t Path[MAXPATH];
GetModuleFileName(Lib->Dll,Path,MAXPATH);
SplitURL(Path,NULL,NULL,OutName,OutName);
*OutBase = v - Lib->Min;
return 1;
}
}
}
return 0;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -