install.c
来自「windows的加密api源码」· C语言 代码 · 共 202 行
C
202 行
#undef UNICODE // ## Not Yet
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <windows.h>
#include <wincrypt.h>
#define MS_RSA_TYPE "RSA Full (Signature and Key Exchange)"
typedef struct _PROVENTRY
{
LPTSTR szProvider;
DWORD dwType;
LPTSTR szType;
LPTSTR szImagePath;
LPTSTR szSigPath;
} PROVENTRY, *PPROVENTRY;
PROVENTRY provList[] =
{
{
"SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider\\Microsoft Base Cryptographic Provider v1.0",
01,
"SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider Types\\Type 001",
"rsabase.dll",
"rsabase.sig"
},
{
"SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider\\Microsoft Default Provider",
99,
"SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider Types\\Type 099",
"defprov.dll",
"sign"
},
{
"SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider\\CSP Provider",
20,
"SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider Types\\Type 020",
"csp.dll",
"cspsign"
},
{
"SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider\\Microsoft Enhanced Cryptographic Provider v1.0",
01,
"SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider Types\\Type 001",
"rsaenh.dll",
"rsaenh.sig"
},
};
DWORD dwIgn;
HKEY hKey;
DWORD err;
DWORD dwValue;
HANDLE hFileSig;
DWORD NumBytesRead;
DWORD lpdwFileSizeHigh;
LPVOID lpvAddress;
DWORD NumBytes;
int __cdecl main(int cArg, char *rgszArg[])
{
int iLoopCount;
for (iLoopCount=0; iLoopCount<( sizeof(provList)/sizeof(PROVENTRY)); iLoopCount++)
{
//
// Just open signature file. This file was created by sign.exe.
//
if ((hFileSig = CreateFile(provList[iLoopCount].szSigPath,
GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
0)) != INVALID_HANDLE_VALUE)
{
if ((NumBytes = GetFileSize((HANDLE) hFileSig, &lpdwFileSizeHigh)) ==
0xffffffff)
{
printf("Install failed: Getting size of file %s: %x\n",
provList[iLoopCount].szSigPath, GetLastError());
CloseHandle(hFileSig);
return(FALSE);
}
if ((lpvAddress = VirtualAlloc(NULL, NumBytes, MEM_RESERVE |
MEM_COMMIT,
PAGE_READWRITE)) == NULL)
{
CloseHandle(hFileSig);
printf("Install failed: Alloc to read %s: %x\n",
provList[iLoopCount].szSigPath, GetLastError());
return(FALSE);
}
if (!ReadFile((HANDLE) hFileSig, lpvAddress, NumBytes,
&NumBytesRead, 0))
{
CloseHandle(hFileSig);
printf("Install failed: Reading %s: %x\n",
provList[iLoopCount].szSigPath, GetLastError());
VirtualFree(lpvAddress, 0, MEM_RELEASE);
return(FALSE);
}
CloseHandle(hFileSig);
if (NumBytesRead != NumBytes)
{
printf("Install failed: Bytes read doesn't match file size\n");
return(FALSE);
}
//
// Create or open in local machine for provider:
//
if ((err = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
(const char *) provList[iLoopCount].szProvider,
0L, "", REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL, &hKey,
&dwIgn)) != ERROR_SUCCESS)
{
printf("Install failed: RegCreateKeyEx\n");
}
//
// Set Image path to dll
//
if ((err = RegSetValueEx(hKey, "Image Path", 0L, REG_SZ, provList[iLoopCount].szImagePath,
strlen(provList[iLoopCount].szImagePath)+1)) != ERROR_SUCCESS)
{
printf("Install failed: Setting Image Path value\n");
return(FALSE);
}
//
// Set Type
//
dwValue = provList[iLoopCount].dwType;
if ((err = RegSetValueEx(hKey, "Type", 0L, REG_DWORD,
(LPTSTR) &dwValue,
sizeof(DWORD))) != ERROR_SUCCESS)
{
printf("Install failed: Setting Type value: %x\n", err);
return(FALSE);
}
//
// Place signature
//
if ((err = RegSetValueEx(hKey, "Signature", 0L, REG_BINARY,
(LPTSTR) lpvAddress,
NumBytes)) != ERROR_SUCCESS)
{
printf("Install failed: Setting Signature value for %s: %x\n", provList[iLoopCount].szSigPath, err);
return(FALSE);
}
RegCloseKey(hKey);
VirtualFree(lpvAddress, 0, MEM_RELEASE);
//
// Create or open in local machine for provider type: Type
//
if ((err = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
(const char *) provList[iLoopCount].szType,
0L, "", REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL, &hKey,
&dwIgn)) != ERROR_SUCCESS)
{
printf("Install failed: Registry entry existed: %x\n", err);
}
// always set MS_DEF_PROV to be the default provider
if ((err = RegSetValueEx(hKey, "Name", 0L, REG_SZ, MS_DEF_PROV,
strlen(MS_DEF_PROV)+1)) != ERROR_SUCCESS)
{
printf("Install failed: Setting Default type: %x\n", err);
return(FALSE);
}
if ((err = RegSetValueEx(hKey, "TypeName", 0L, REG_SZ, MS_RSA_TYPE,
strlen(MS_RSA_TYPE)+1)) != ERROR_SUCCESS)
{
printf("Install failed: Setting type name: %x\n", err);
return(FALSE);
}
printf("Installed: %s\n", provList[iLoopCount].szImagePath);
}
} // loop through all provs we know about
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?