【发布时间】:2019-06-12 06:35:02
【问题描述】:
我想比较 2 个安全目录 (.cat) 文件的每个标签的哈希值。
我使用 CryptCATEnumerateMember 函数获取所有标签,并尝试使用 CryptCATEnumerateAttr 获取哈希值,但这不起作用。
IntPtr pMemberPtr = CatalogFunctions.CryptCATEnumerateMember(hCatalog, IntPtr.Zero);
while (pMemberPtr != IntPtr.Zero)
{
CRYPTCATMEMBER cdf = (CRYPTCATMEMBER)Marshal.PtrToStructure(pMemberPtr, typeof(CRYPTCATMEMBER));
IntPtr pAttributePtr = CatalogFunctions.CryptCATEnumerateAttr(hCatalog, pMemberPtr, IntPtr.Zero);
while (pAttributePtr != IntPtr.Zero)
{
CRYPTCATATTRIBUTE cdfa = (CRYPTCATATTRIBUTE)Marshal.PtrToStructure(pAttributePtr, typeof(CRYPTCATATTRIBUTE));
data.Add(cdfa.cbValue.ToString());
pAttributePtr = CatalogFunctions.CryptCATEnumerateAttr(hCatalog, pMemberPtr, pAttributePtr);
}
data.Add(cdf.pwszReferenceTag);
pMemberPtr = CatalogFunctions.CryptCATEnumerateMember(hCatalog, pMemberPtr);
}
//with the functions and classes:
[DllImport("Wintrust.dll")]
public static extern unsafe IntPtr CryptCATEnumerateMember(
IntPtr hCatalog,
IntPtr pPrevMember);
[DllImport("Wintrust.dll")]
public static extern unsafe IntPtr CryptCATEnumerateAttr(
IntPtr hCatalog,
IntPtr pCatMember,
IntPtr pPrevAttr);
[StructLayout(LayoutKind.Sequential)]
public class CRYPTCATATTRIBUTE {
public uint cbStruct;
public string pwszReferenceTag;
public uint dwAttrTypeAndAction;
public uint cbValue;
public unsafe byte* pdValue;
public uint dwReserved;
}
[StructLayout(LayoutKind.Sequential)]
public class CRYPTCATMEMBER
{
public uint cbStruct;
[MarshalAs(UnmanagedType.LPWStr)]
public string pwszReferenceTag;
[MarshalAs(UnmanagedType.LPWStr)]
public string pwszFileName;
public GUID gSubjectType;
public uint fdwMemberFlags;
public IntPtr pIndirectData;
public uint dwCertVersion;
public uint dwReserved;
public IntPtr hReserved;
public CRYPTOAPI_BLOB sEncodedIndirectData;
public CRYPTOAPI_BLOB sEncodedMemberInfo;
}
项目编译,但 pAttributePtr 始终指向 0。
【问题讨论】:
标签: c# winapi cryptography catalog