| 1 | // Licensed to the .NET Foundation under one or more agreements. | 
|---|
| 2 | // The .NET Foundation licenses this file to you under the MIT license. | 
|---|
| 3 | // See the LICENSE file in the project root for more information. | 
|---|
| 4 | #ifndef __STRONG_NAME_H | 
|---|
| 5 | #define __STRONG_NAME_H | 
|---|
| 6 |  | 
|---|
| 7 | // =========================================================================== | 
|---|
| 8 | // File: StrongName.h | 
|---|
| 9 | // | 
|---|
| 10 | // Wrappers for signing and hashing functions needed to implement strong names | 
|---|
| 11 | // =========================================================================== | 
|---|
| 12 |  | 
|---|
| 13 |  | 
|---|
| 14 | #include <windows.h> | 
|---|
| 15 | #include <wincrypt.h> | 
|---|
| 16 | #include <ole2.h> | 
|---|
| 17 |  | 
|---|
| 18 | #include <corerror.h> | 
|---|
| 19 | #include <winapifamily.h> | 
|---|
| 20 |  | 
|---|
| 21 | #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) | 
|---|
| 22 |  | 
|---|
| 23 | #ifdef __cplusplus | 
|---|
| 24 | extern "C"{ | 
|---|
| 25 | #endif | 
|---|
| 26 |  | 
|---|
| 27 |  | 
|---|
| 28 | // Public key blob binary format. | 
|---|
| 29 | typedef struct { | 
|---|
| 30 | unsigned int SigAlgID;       // (ALG_ID) signature algorithm used to create the signature | 
|---|
| 31 | unsigned int HashAlgID;      // (ALG_ID) hash algorithm used to create the signature | 
|---|
| 32 | ULONG        cbPublicKey;    // length of the key in bytes | 
|---|
| 33 | BYTE         PublicKey[1];   // variable length byte array containing the key value in format output by CryptoAPI | 
|---|
| 34 | } PublicKeyBlob; | 
|---|
| 35 |  | 
|---|
| 36 |  | 
|---|
| 37 | // Location in the registry (under HKLM) that strong name configuration info is | 
|---|
| 38 | // stored. | 
|---|
| 39 | #define SN_CONFIG_KEY               "Software\\Microsoft\\StrongName" | 
|---|
| 40 | #define SN_CONFIG_CSP               "CSP"                   // REG_SZ | 
|---|
| 41 | #define SN_CONFIG_MACHINE_KEYSET    "MachineKeyset"         // REG_DWORD | 
|---|
| 42 | #define SN_CONFIG_KEYSPEC           "KeySpec"               // REG_DWORD | 
|---|
| 43 | #define SN_CONFIG_HASH_ALG          "HashAlgorithm"         // REG_DWORD | 
|---|
| 44 | #define SN_CONFIG_SIGN_ALG          "SignAlgorithm"         // REG_DWORD | 
|---|
| 45 | #define SN_CONFIG_VERIFICATION      "Verification"          // Registry subkey | 
|---|
| 46 | #define SN_CONFIG_USERLIST          "UserList"              // REG_MULTI_SZ | 
|---|
| 47 | #define SN_CONFIG_CACHE_VERIFY      "CacheVerify"           // REG_DWORD | 
|---|
| 48 |  | 
|---|
| 49 | #define SN_CONFIG_KEY_W             L"Software\\Microsoft\\StrongName" | 
|---|
| 50 | #define SN_CONFIG_CSP_W             L"CSP"                  // REG_SZ | 
|---|
| 51 | #define SN_CONFIG_PROV_TYPE_W       L"ProvType"             // REG_DWORD | 
|---|
| 52 | #define SN_CONFIG_MACHINE_KEYSET_W  L"MachineKeyset"        // REG_DWORD | 
|---|
| 53 | #define SN_CONFIG_KEYSPEC_W         L"KeySpec"              // REG_DWORD | 
|---|
| 54 | #define SN_CONFIG_HASH_ALG_W        L"HashAlgorithm"        // REG_DWORD | 
|---|
| 55 | #define SN_CONFIG_SIGN_ALG_W        L"SignAlgorithm"        // REG_DWORD | 
|---|
| 56 | #define SN_CONFIG_VERIFICATION_W    L"Verification"         // Registry subkey | 
|---|
| 57 | #define SN_CONFIG_USERLIST_W        L"UserList"             // REG_MULTI_SZ | 
|---|
| 58 | #define SN_CONFIG_TESTPUBLICKEY_W   L"TestPublicKey"        // REG_SZ | 
|---|
| 59 | #define SN_CONFIG_CACHE_VERIFY_W    L"CacheVerify"          // REG_DWORD | 
|---|
| 60 |  | 
|---|
| 61 | // VM related registry locations (Note, these values are under HKLM\Software\Microsoft\.NETFramework, rather | 
|---|
| 62 | // than SN_CONFIG_KEY | 
|---|
| 63 | #define SN_CONFIG_BYPASS_POLICY     "AllowStrongNameBypass" // REG_DWORD | 
|---|
| 64 | #define SN_CONFIG_BYPASS_POLICY_W   L"AllowStrongNameBypass" // REG_DWORD | 
|---|
| 65 |  | 
|---|
| 66 | #if defined(_MSC_VER) && !defined(USE_DEPRECATED_CLR_API_WITHOUT_WARNING) | 
|---|
| 67 | #define DEPRECATED_CLR_API_MESG "This API has been deprecated. Refer to http://go.microsoft.com/fwlink/?LinkId=143720 for more details." | 
|---|
| 68 | #define DECLARE_DEPRECATED __declspec(deprecated(DEPRECATED_CLR_API_MESG)) | 
|---|
| 69 | #else // _MSC_VER && !USE_DEPRECATED_CLR_API_WITHOUT_WARNING | 
|---|
| 70 | #define DECLARE_DEPRECATED | 
|---|
| 71 | #endif // _MSC_VER && !USE_DEPRECATED_CLR_API_WITHOUT_WARNING | 
|---|
| 72 |  | 
|---|
| 73 | #define SNAPI DECLARE_DEPRECATED BOOLEAN __stdcall | 
|---|
| 74 | #define SNAPI_(_type) DECLARE_DEPRECATED _type __stdcall | 
|---|
| 75 |  | 
|---|
| 76 | // Return last error. | 
|---|
| 77 | SNAPI_(DWORD) StrongNameErrorInfo(VOID); | 
|---|
| 78 |  | 
|---|
| 79 |  | 
|---|
| 80 | // Free buffer allocated by routines below. | 
|---|
| 81 | SNAPI_(VOID) StrongNameFreeBuffer(BYTE *pbMemory);  // [in] address of memory to free | 
|---|
| 82 |  | 
|---|
| 83 |  | 
|---|
| 84 | // Generate a new key pair for strong name use. | 
|---|
| 85 | SNAPI StrongNameKeyGen(LPCWSTR  wszKeyContainer,    // [in] desired key container name | 
|---|
| 86 | DWORD    dwFlags,            // [in] flags (see below) | 
|---|
| 87 | BYTE   **ppbKeyBlob,         // [out] public/private key blob | 
|---|
| 88 | ULONG   *pcbKeyBlob); | 
|---|
| 89 |  | 
|---|
| 90 | // Generate a new key pair with the specified key size for strong name use. | 
|---|
| 91 | SNAPI StrongNameKeyGenEx(LPCWSTR  wszKeyContainer,    // [in] desired key container name, must be a non-empty string | 
|---|
| 92 | DWORD    dwFlags,            // [in] flags (see below) | 
|---|
| 93 | DWORD    dwKeySize,          // [in] desired key size. | 
|---|
| 94 | BYTE   **ppbKeyBlob,         // [out] public/private key blob | 
|---|
| 95 | ULONG   *pcbKeyBlob); | 
|---|
| 96 |  | 
|---|
| 97 | // Flags for StrongNameKeyGen. | 
|---|
| 98 | #define SN_LEAVE_KEY    0x00000001                  // Leave key pair registered with CSP | 
|---|
| 99 |  | 
|---|
| 100 |  | 
|---|
| 101 | // Import key pair into a key container. | 
|---|
| 102 | SNAPI StrongNameKeyInstall(LPCWSTR  wszKeyContainer,// [in] desired key container name, must be a non-empty string | 
|---|
| 103 | BYTE    *pbKeyBlob,      // [in] public/private key pair blob | 
|---|
| 104 | ULONG    cbKeyBlob); | 
|---|
| 105 |  | 
|---|
| 106 |  | 
|---|
| 107 | // Delete a key pair. | 
|---|
| 108 | SNAPI StrongNameKeyDelete(LPCWSTR wszKeyContainer); // [in] desired key container name | 
|---|
| 109 |  | 
|---|
| 110 | // Retrieve the public portion of a key pair. | 
|---|
| 111 | SNAPI StrongNameGetPublicKey (LPCWSTR   wszKeyContainer,    // [in] desired key container name | 
|---|
| 112 | BYTE     *pbKeyBlob,          // [in] public/private key blob (optional) | 
|---|
| 113 | ULONG     cbKeyBlob, | 
|---|
| 114 | BYTE    **ppbPublicKeyBlob,   // [out] public key blob | 
|---|
| 115 | ULONG    *pcbPublicKeyBlob); | 
|---|
| 116 |  | 
|---|
| 117 | // Retrieve the public portion of a key pair. | 
|---|
| 118 | SNAPI StrongNameGetPublicKeyEx (LPCWSTR   wszKeyContainer,    // [in] desired key container name | 
|---|
| 119 | BYTE     *pbKeyBlob,          // [in] public/private key blob (optional) | 
|---|
| 120 | ULONG     cbKeyBlob, | 
|---|
| 121 | BYTE    **ppbPublicKeyBlob,   // [out] public key blob | 
|---|
| 122 | ULONG    *pcbPublicKeyBlob, | 
|---|
| 123 | ULONG     uHashAlgId, | 
|---|
| 124 | ULONG     uReserved);          // reserved for future use | 
|---|
| 125 |  | 
|---|
| 126 | // Hash and sign a manifest. | 
|---|
| 127 | SNAPI StrongNameSignatureGeneration(LPCWSTR     wszFilePath,        // [in] valid path to the PE file for the assembly | 
|---|
| 128 | LPCWSTR     wszKeyContainer,    // [in] desired key container name | 
|---|
| 129 | BYTE       *pbKeyBlob,          // [in] public/private key blob (optional) | 
|---|
| 130 | ULONG       cbKeyBlob, | 
|---|
| 131 | BYTE      **ppbSignatureBlob,   // [out] signature blob | 
|---|
| 132 | ULONG      *pcbSignatureBlob); | 
|---|
| 133 |  | 
|---|
| 134 | SNAPI StrongNameSignatureGenerationEx(LPCWSTR     wszFilePath,        // [in] valid path to the PE file for the assembly | 
|---|
| 135 | LPCWSTR     wszKeyContainer,    // [in] desired key container name | 
|---|
| 136 | BYTE       *pbKeyBlob,          // [in] public/private key blob (optional) | 
|---|
| 137 | ULONG       cbKeyBlob, | 
|---|
| 138 | BYTE      **ppbSignatureBlob,   // [out] signature blob | 
|---|
| 139 | ULONG      *pcbSignatureBlob, | 
|---|
| 140 | DWORD       dwFlags);           // [in] modifer flags; see below | 
|---|
| 141 |  | 
|---|
| 142 | #define SN_SIGN_ALL_FILES   0x00000001      // Rehash all linked modules as well as resigning the manifest | 
|---|
| 143 | #define SN_TEST_SIGN        0x00000002      // Test sign the assembly | 
|---|
| 144 | #define SN_ECMA_SIGN        0x00000004      // Sign the assembly treating the input key as the real ECMA key | 
|---|
| 145 |  | 
|---|
| 146 | // Digest signing support | 
|---|
| 147 |  | 
|---|
| 148 | // Generate the digest of an input assembly, which can be signed with StrongNameDigestSign | 
|---|
| 149 | SNAPI StrongNameDigestGenerate(_In_z_ LPCWSTR                                       wszFilePath,        // [in] valid path to the PE file for the assembly | 
|---|
| 150 | _Outptr_result_bytebuffer_(*pcbDigestBlob) BYTE**    ppbDigestBlob,      // [out] digest of the assembly, free with StrongNameFreeBuffer | 
|---|
| 151 | _Out_  ULONG*                                        pcbDigestBlob,      // [out] number of bytes in the assembly digest | 
|---|
| 152 | DWORD                                                dwFlags);           // [in] modifier flags (see StrongNameSignatureGenerationEx) | 
|---|
| 153 |  | 
|---|
| 154 | // Sign an the digest of an assembly calculated by StrongNameDigestGenerate | 
|---|
| 155 | SNAPI StrongNameDigestSign(_In_opt_z_ LPCWSTR                                   wszKeyContainer,        // [in] desired key container name (optional) | 
|---|
| 156 | _In_reads_bytes_opt_(cbKeyBlob) BYTE*                pbKeyBlob,              // [in] public/private key blob (optional) | 
|---|
| 157 | ULONG                                                cbKeyBlob, | 
|---|
| 158 | _In_reads_bytes_(cbDigestBlob) BYTE*                 pbDigestBlob,           // [in] digest blob, from StrongNameDigestGenerate | 
|---|
| 159 | ULONG                                                cbDigestBlob, | 
|---|
| 160 | DWORD                                                hashAlgId,              // [in] algorithm id of the hash algorithm used with pbDigestBlob | 
|---|
| 161 | _Outptr_result_bytebuffer_(*pcbSignatureBlob) BYTE** ppbSignatureBlob,       // [out] signature blob, freed with StrongNameFreeBuffer | 
|---|
| 162 | _Out_ ULONG*                                         pcbSignatureBlob, | 
|---|
| 163 | DWORD                                                dwFlags);               // [in] modifier flags (see StrongNameSignatureGenerationEx) | 
|---|
| 164 |  | 
|---|
| 165 | // Embed a digest signature generated with StrongNameDigestSign into an assembly | 
|---|
| 166 | SNAPI StrongNameDigestEmbed(_In_z_ LPCWSTR                          wszFilePath,                        // [in] valid path to the PE file for the assembly to update | 
|---|
| 167 | _In_reads_bytes_(cbSignatureBlob) BYTE* pbSignatureBlob,                    // [in] signature blob for the assembly | 
|---|
| 168 | ULONG                                   cbSignatureBlob); | 
|---|
| 169 |  | 
|---|
| 170 | // Create a strong name token from an assembly file. | 
|---|
| 171 | SNAPI StrongNameTokenFromAssembly(LPCWSTR   wszFilePath,            // [in] valid path to the PE file for the assembly | 
|---|
| 172 | BYTE    **ppbStrongNameToken,     // [out] strong name token | 
|---|
| 173 | ULONG    *pcbStrongNameToken); | 
|---|
| 174 |  | 
|---|
| 175 | // Create a strong name token from an assembly file and additionally return the full public key. | 
|---|
| 176 | SNAPI StrongNameTokenFromAssemblyEx(LPCWSTR   wszFilePath,            // [in] valid path to the PE file for the assembly | 
|---|
| 177 | BYTE    **ppbStrongNameToken,     // [out] strong name token | 
|---|
| 178 | ULONG    *pcbStrongNameToken, | 
|---|
| 179 | BYTE    **ppbPublicKeyBlob,       // [out] public key blob | 
|---|
| 180 | ULONG    *pcbPublicKeyBlob); | 
|---|
| 181 |  | 
|---|
| 182 | // Create a strong name token from a public key blob. | 
|---|
| 183 | SNAPI StrongNameTokenFromPublicKey(BYTE    *pbPublicKeyBlob,        // [in] public key blob | 
|---|
| 184 | ULONG    cbPublicKeyBlob, | 
|---|
| 185 | BYTE   **ppbStrongNameToken,     // [out] strong name token | 
|---|
| 186 | ULONG   *pcbStrongNameToken); | 
|---|
| 187 |  | 
|---|
| 188 |  | 
|---|
| 189 | // Verify a strong name/manifest against a public key blob. | 
|---|
| 190 | SNAPI StrongNameSignatureVerification(LPCWSTR wszFilePath,      // [in] valid path to the PE file for the assembly | 
|---|
| 191 | DWORD   dwInFlags,        // [in] flags modifying behaviour (see below) | 
|---|
| 192 | DWORD  *pdwOutFlags);     // [out] additional output info (see below) | 
|---|
| 193 |  | 
|---|
| 194 |  | 
|---|
| 195 | // Verify a strong name/manifest against a public key blob. | 
|---|
| 196 | SNAPI StrongNameSignatureVerificationEx(LPCWSTR     wszFilePath,        // [in] valid path to the PE file for the assembly | 
|---|
| 197 | BOOLEAN     fForceVerification, // [in] verify even if settings in the registry disable it | 
|---|
| 198 | BOOLEAN    *pfWasVerified);     // [out] set to false if verify succeeded due to registry settings | 
|---|
| 199 |  | 
|---|
| 200 | // Verify a strong name/manifest against a public key blob. | 
|---|
| 201 | SNAPI StrongNameSignatureVerificationEx2(LPCWSTR    wszFilePath,         // [in] valid path to the PE file for the assembly | 
|---|
| 202 | BOOLEAN    fForceVerification,  // [in] verify even if settings in the registry disable it | 
|---|
| 203 | BYTE      *pbEcmaPublicKey,     // [in] mapping from the ECMA public key to the real key used for verification | 
|---|
| 204 | DWORD      cbEcmaPublicKey,     // [in] length of the real ECMA public key | 
|---|
| 205 | BOOLEAN   *pfWasVerified);      // [out] set to false if verify succeeded due to registry settings | 
|---|
| 206 |  | 
|---|
| 207 | // Verify a strong name/manifest against a public key blob when the assembly is | 
|---|
| 208 | // already memory mapped. | 
|---|
| 209 | SNAPI StrongNameSignatureVerificationFromImage(BYTE     *pbBase,             // [in] base address of mapped manifest file | 
|---|
| 210 | DWORD     dwLength,           // [in] length of mapped image in bytes | 
|---|
| 211 | DWORD     dwInFlags,          // [in] flags modifying behaviour (see below) | 
|---|
| 212 | DWORD    *pdwOutFlags);       // [out] additional output info (see below) | 
|---|
| 213 |  | 
|---|
| 214 | // Flags for use with the verify routines. | 
|---|
| 215 | #define SN_INFLAG_FORCE_VER      0x00000001     // verify even if settings in the registry disable it | 
|---|
| 216 | #define SN_INFLAG_INSTALL        0x00000002     // verification is the first (on entry to the cache) | 
|---|
| 217 | #define SN_INFLAG_ADMIN_ACCESS   0x00000004     // cache protects assembly from all but admin access | 
|---|
| 218 | #define SN_INFLAG_USER_ACCESS    0x00000008     // cache protects user's assembly from other users | 
|---|
| 219 | #define SN_INFLAG_ALL_ACCESS     0x00000010     // cache provides no access restriction guarantees | 
|---|
| 220 |  | 
|---|
| 221 | #define SN_INFLAG_RUNTIME        0x80000000     // internal debugging use only | 
|---|
| 222 |  | 
|---|
| 223 | #define SN_OUTFLAG_WAS_VERIFIED  0x00000001     // set to false if verify succeeded due to registry settings | 
|---|
| 224 | #define SN_OUTFLAG_MICROSOFT_SIGNATURE 0x00000002 // set if the public key corresponds to SN_THE_KEY | 
|---|
| 225 |  | 
|---|
| 226 | // Verify that two assemblies differ only by signature blob. | 
|---|
| 227 | SNAPI StrongNameCompareAssemblies(LPCWSTR   wszAssembly1,           // [in] file name of first assembly | 
|---|
| 228 | LPCWSTR   wszAssembly2,           // [in] file name of second assembly | 
|---|
| 229 | DWORD    *pdwResult);             // [out] result of comparison (see codes below) | 
|---|
| 230 |  | 
|---|
| 231 | #define SN_CMP_DIFFERENT    0   // Assemblies contain different data | 
|---|
| 232 | #define SN_CMP_IDENTICAL    1   // Assemblies are exactly the same, even signatures | 
|---|
| 233 | #define SN_CMP_SIGONLY      2   // Assemblies differ only by signature (and checksum etc.) | 
|---|
| 234 |  | 
|---|
| 235 |  | 
|---|
| 236 | // Compute the size of buffer needed to hold a hash for a given hash algorithm. | 
|---|
| 237 | SNAPI StrongNameHashSize(ULONG  ulHashAlg,  // [in] hash algorithm | 
|---|
| 238 | DWORD *pcbSize);   // [out] size of the hash in bytes | 
|---|
| 239 |  | 
|---|
| 240 |  | 
|---|
| 241 | // Compute the size that needs to be allocated for a signature in an assembly. | 
|---|
| 242 | SNAPI StrongNameSignatureSize(BYTE    *pbPublicKeyBlob,    // [in] public key blob | 
|---|
| 243 | ULONG    cbPublicKeyBlob, | 
|---|
| 244 | DWORD   *pcbSize);           // [out] size of the signature in bytes | 
|---|
| 245 |  | 
|---|
| 246 |  | 
|---|
| 247 | SNAPI_(DWORD) GetHashFromAssemblyFile(LPCSTR szFilePath, // [IN] location of file to be hashed | 
|---|
| 248 | unsigned int *piHashAlg, // [IN/OUT] constant specifying the hash algorithm (set to 0 if you want the default) | 
|---|
| 249 | BYTE   *pbHash,    // [OUT] hash buffer | 
|---|
| 250 | DWORD  cchHash,    // [IN]  max size of buffer | 
|---|
| 251 | DWORD  *pchHash);  // [OUT] length of hash byte array | 
|---|
| 252 |  | 
|---|
| 253 | SNAPI_(DWORD) GetHashFromAssemblyFileW(LPCWSTR wszFilePath, // [IN] location of file to be hashed | 
|---|
| 254 | unsigned int *piHashAlg, // [IN/OUT] constant specifying the hash algorithm (set to 0 if you want the default) | 
|---|
| 255 | BYTE   *pbHash,    // [OUT] hash buffer | 
|---|
| 256 | DWORD  cchHash,    // [IN]  max size of buffer | 
|---|
| 257 | DWORD  *pchHash);  // [OUT] length of hash byte array | 
|---|
| 258 |  | 
|---|
| 259 | SNAPI_(DWORD) GetHashFromFile(LPCSTR szFilePath, // [IN] location of file to be hashed | 
|---|
| 260 | unsigned int *piHashAlg,   // [IN/OUT] constant specifying the hash algorithm (set to 0 if you want the default) | 
|---|
| 261 | BYTE   *pbHash,    // [OUT] hash buffer | 
|---|
| 262 | DWORD  cchHash,    // [IN]  max size of buffer | 
|---|
| 263 | DWORD  *pchHash);  // [OUT] length of hash byte array | 
|---|
| 264 |  | 
|---|
| 265 | SNAPI_(DWORD) GetHashFromFileW(LPCWSTR wszFilePath, // [IN] location of file to be hashed | 
|---|
| 266 | unsigned int *piHashAlg,   // [IN/OUT] constant specifying the hash algorithm (set to 0 if you want the default) | 
|---|
| 267 | BYTE   *pbHash,    // [OUT] hash buffer | 
|---|
| 268 | DWORD  cchHash,    // [IN]  max size of buffer | 
|---|
| 269 | DWORD  *pchHash);  // [OUT] length of hash byte array | 
|---|
| 270 |  | 
|---|
| 271 | SNAPI_(DWORD) GetHashFromHandle(HANDLE hFile,      // [IN] handle of file to be hashed | 
|---|
| 272 | unsigned int *piHashAlg,   // [IN/OUT] constant specifying the hash algorithm (set to 0 if you want the default) | 
|---|
| 273 | BYTE   *pbHash,    // [OUT] hash buffer | 
|---|
| 274 | DWORD  cchHash,    // [IN]  max size of buffer | 
|---|
| 275 | DWORD  *pchHash);  // [OUT] length of hash byte array | 
|---|
| 276 |  | 
|---|
| 277 | SNAPI_(DWORD) GetHashFromBlob(BYTE   *pbBlob,       // [IN] pointer to memory block to hash | 
|---|
| 278 | DWORD  cchBlob,       // [IN] length of blob | 
|---|
| 279 | unsigned int *piHashAlg,  // [IN/OUT] constant specifying the hash algorithm (set to 0 if you want the default) | 
|---|
| 280 | BYTE   *pbHash,       // [OUT] hash buffer | 
|---|
| 281 | DWORD  cchHash,       // [IN]  max size of buffer | 
|---|
| 282 | DWORD  *pchHash);     // [OUT] length of hash byte array | 
|---|
| 283 |  | 
|---|
| 284 | SNAPI StrongNameGetBlob(LPCWSTR            wszFilePath,         // [in] valid path to the PE file for the assembly | 
|---|
| 285 | BYTE               *pbBlob,             // [in] buffer to fill with blob | 
|---|
| 286 | DWORD              *pcbBlob);           // [in/out] size of buffer/number of bytes put into buffer | 
|---|
| 287 |  | 
|---|
| 288 | SNAPI StrongNameGetBlobFromImage(BYTE      *pbBase,             // [in] base address of mapped manifest file | 
|---|
| 289 | DWORD     dwLength,            // [in] length of mapped image in bytes | 
|---|
| 290 | BYTE      *pbBlob,             // [in] buffer to fill with blob | 
|---|
| 291 | DWORD     *pcbBlob);           // [in/out] size of buffer/number of bytes put into buffer | 
|---|
| 292 |  | 
|---|
| 293 | #undef DECLARE_DEPRECATED | 
|---|
| 294 | #undef DEPRECATED_CLR_API_MESG | 
|---|
| 295 | #undef SNAPI | 
|---|
| 296 | #undef SNAPI_ | 
|---|
| 297 | #define SNAPI BOOLEAN __stdcall | 
|---|
| 298 | #define SNAPI_(_type) _type __stdcall | 
|---|
| 299 |  | 
|---|
| 300 | #ifdef __cplusplus | 
|---|
| 301 | } | 
|---|
| 302 | #endif | 
|---|
| 303 |  | 
|---|
| 304 | #endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) | 
|---|
| 305 |  | 
|---|
| 306 | #endif | 
|---|
| 307 |  | 
|---|