![]()
bin下载: base64.zip
#include <Windows.h>
#include <stdio.h>
#pragma comment(lib,"Crypt32.lib")
BOOL EncodeBase64(const char* filename, BOOL Decode)
{
BOOL Result = FALSE;
CHAR NewFilePath[MAX_PATH];
HANDLE hOrigFile = INVALID_HANDLE_VALUE;
HANDLE hNewFile = INVALID_HANDLE_VALUE;
DWORD OrigFileSize;
DWORD NumberOfBytesRead;
DWORD NumberOfBytesWritten;
PBYTE OrigContent = NULL;
PCHAR NewContent = NULL;
DWORD NewLength = 0;
do
{
hOrigFile = CreateFileA(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hOrigFile == INVALID_HANDLE_VALUE)
break;
OrigFileSize = GetFileSize(hOrigFile, NULL);
OrigContent = LocalAlloc(LPTR, OrigFileSize);
if (OrigContent == NULL)
break;
if (ReadFile(hOrigFile, OrigContent, OrigFileSize, &NumberOfBytesRead, NULL) == FALSE)
break;
if (OrigFileSize != NumberOfBytesRead)
break;
lstrcpyA(NewFilePath, filename);
if (Decode)
{
lstrcatA(NewFilePath, ".base64_decode");
if (CryptStringToBinaryA((LPCSTR)OrigContent, OrigFileSize, CRYPT_STRING_BASE64, NULL, &NewLength, NULL, NULL) == FALSE || NewLength == 0)
break;
NewContent = LocalAlloc(LPTR, NewLength);
if (NewContent == NULL)
break;
if (CryptStringToBinaryA((LPCSTR)OrigContent, OrigFileSize, CRYPT_STRING_BASE64, NewContent, &NewLength, NULL, NULL) == FALSE || NewLength == 0)
break;
}
else
{
lstrcatA(NewFilePath, ".base64_encode");
if (CryptBinaryToStringA((const BYTE*)OrigContent, OrigFileSize, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, NULL, &NewLength) == FALSE)
break;
NewContent = LocalAlloc(LPTR, NewLength);
if (NewContent == NULL)
break;
if (CryptBinaryToStringA((const BYTE*)OrigContent, OrigFileSize, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, NewContent, &NewLength) == FALSE)
break;
}
hNewFile = CreateFileA(NewFilePath, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);
if (hNewFile == INVALID_HANDLE_VALUE)
break;
if (WriteFile(hNewFile, NewContent, NewLength, &NumberOfBytesWritten, NULL) == FALSE)
break;
if (NewLength != NumberOfBytesWritten)
break;
Result = TRUE;
} while (0);
if (hOrigFile != INVALID_HANDLE_VALUE)
CloseHandle(hOrigFile);
if (hNewFile != INVALID_HANDLE_VALUE)
CloseHandle(hNewFile);
if (OrigContent)
LocalFree(OrigContent);
if (NewContent)
LocalFree(NewContent);
return Result;
}
BOOL Is64BitOS()
{
typedef VOID(WINAPI* LPFN_GetNativeSystemInfo)(__out LPSYSTEM_INFO lpSystemInfo);
LPFN_GetNativeSystemInfo fnGetNativeSystemInfo = (LPFN_GetNativeSystemInfo)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "GetNativeSystemInfo");
if (fnGetNativeSystemInfo)
{
SYSTEM_INFO stInfo = { 0 };
fnGetNativeSystemInfo(&stInfo);
if (stInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64
|| stInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
{
return TRUE;
}
}
return FALSE;
}
int main(int argc, char* argv[])
{
BOOL Result = FALSE;
PVOID OldValue;
BOOL IsWow64;
IsWow64 = Is64BitOS();
if (IsWow64)
Wow64DisableWow64FsRedirection(&OldValue);
printf("base64.exe {encode|decode} {filepath}\n");
if (argc != 3)
{
return -1;
}
if (lstrcmpiA(argv[1], "encode") == 0)
{
Result = EncodeBase64(argv[2], FALSE);
}
else if (lstrcmpiA(argv[1], "decode") == 0)
{
Result = EncodeBase64(argv[2], TRUE);
}
else
{
printf("Parameter error \n");
}
if (Result)
printf("Encoding or decoding successful \n");
else
printf("Encoding or decoding failed\n");
return 1;
}
发表回复