#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include #include #include BOOL WINAPI EnumNameProc(HMODULE hMod, LPCWSTR lpType, LPWSTR lpName, LONG_PTR lParam) { HRSRC hResRc = FindResource(hMod, lpName, lpType); HGLOBAL hRes = LoadResource(hMod, hResRc); LPVOID pData = LockResource(hRes); DWORD size = SizeofResource(hMod, hResRc); std::wstring resName = L"resource-"; if(IS_INTRESOURCE(lpName)) { std::wostringstream str; str << reinterpret_cast(lpName); resName += str.str(); } else { resName += lpName; } resName += L".bin"; std::wcout << L"Creating file " << resName << L'\n'; HANDLE hFile = CreateFile(resName.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile == INVALID_HANDLE_VALUE) { DWORD err = GetLastError(); std::cout << "Failed to create file, error " << err << '\n'; FreeResource(hRes); return TRUE; } if(!WriteFile(hFile, pData, size, &size, NULL)) { DWORD err = GetLastError(); std::cout << "Failed to write to file, error " << err << '\n'; CloseHandle(hFile); DeleteFile(resName.c_str()); FreeResource(hRes); return TRUE; } CloseHandle(hFile); FreeResource(hRes); return TRUE; } int __cdecl wmain(int argc, WCHAR** argv) { int retVal = 0; if(argc >= 2) { HMODULE hMod = LoadLibraryEx(argv[1], NULL, LOAD_LIBRARY_AS_IMAGE_RESOURCE); if(hMod) { LPCWSTR lpType = (argc >= 3) ? argv[2] : RT_RCDATA; if(!EnumResourceNames(hMod, lpType, &EnumNameProc, 0)) { DWORD err = GetLastError(); std::wcout << L"Failed to enum resources, error " << err << L'\n'; retVal = 3; } } else { DWORD err = GetLastError(); std::wcout << L"Failed to load " << argv[1] << L", error " << err << L'\n'; retVal = 2; } } else { std::cout << "Usage: ResDataDumper file [type]\n"; retVal = 1; } return retVal; }