2 回答

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
這是預(yù)期的行為。
根據(jù)這個(gè):https : //msdn.microsoft.com/en-us/library/windows/desktop/aa387313(v=pPFX
vs.85) .aspx,該結(jié)構(gòu)需要一個(gè)預(yù)先分配的緩沖區(qū),大小在cbData
字段中,它將隨著復(fù)制的數(shù)據(jù)大小而更新。
如果調(diào)用pbData
等于NULL
,則僅cbData
更新字段以反映輸出緩沖區(qū)所需的大小。

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
JimB 的回答肯定是正確的,但我想添加這個(gè)以進(jìn)行后續(xù)處理,以防其他人沿著這條路走下去。我必須用來獲取 PFX 文件的實(shí)際代碼CRYPTOAPI_BLOB是:
var (
crypt32 = syscall.NewLazyDLL("crypt32.dll")
procPFXExportCertStoreEx = crypt32.NewProc("PFXExportCertStoreEx")
procCryptMemAlloc = crypt32.NewProc("CryptMemAlloc")
procCryptMemFree = crypt32.NewProc("CryptMemFree")
)
type CRYPTOAPI_BLOB struct {
cbData uint32
pbData *byte
}
func (b *CRYPTOAPI_BLOB) ToByteArray() []byte {
d := make([]byte, b.cbData)
copy(d, (*[1 << 30]byte)(unsafe.Pointer(b.pbData))[:])
return d
}
func PfxExportCertStore(storeHandle syscall.Handle, password string, flags uint32) (returnData []byte, err error) {
var pfxBlob CRYPTOAPI_BLOB
r1, _, _ := syscall.Syscall6(procPFXExportCertStoreEx.Addr(), 5,
uintptr(storeHandle), //hStore
uintptr(unsafe.Pointer(&pfxBlob)), //*pPFX
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(password))), //szPassword
0, //*pvPara
uintptr(flags), //dwFlags
0)
r2, _, _ := syscall.Syscall(procCryptMemAlloc.Addr(), 1, uintptr(unsafe.Pointer(&pfxBlob.cbData)), 0, 0)
p := unsafe.Pointer(&r2)
q := (*byte)(p)
pfxBlob.pbData = q
defer syscall.Syscall(procCryptMemFree.Addr(), 1, uintptr(unsafe.Pointer(pfxBlob.pbData)), 0, 0)
r3, _, _ := syscall.Syscall6(procPFXExportCertStoreEx.Addr(), 5,
uintptr(storeHandle), //hStore
uintptr(unsafe.Pointer(&pfxBlob)), //*pPFX
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(password))), //szPassword
0, //*pvPara
uintptr(flags), //dwFlags
0)
returnData = pfxBlob.ToByteArray()
return
}
(我已經(jīng)剝離了錯誤處理以使其更易于閱讀)。第一次調(diào)用PFXExportCertStoreEx只返回大小,一旦我們有了大小,我們就可以調(diào)用來PFXExportCertStoreEx分配一個(gè)緩沖區(qū),然后我們將相同的指針傳遞給PFXExportCertStoreEx,但這次它有分配的緩沖區(qū),我們得到了完整的 PFX文件返回。
- 2 回答
- 0 關(guān)注
- 153 瀏覽
添加回答
舉報(bào)