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

📄 node_win32.c

📁 betaplayer的源码 tcpmp的老版本
💻 C
📖 第 1 页 / 共 2 页
字号:
		}
	}

	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 + -