77package credman
88
99import (
10- "reflect"
1110 "time"
1211 "unsafe"
1312
@@ -59,7 +58,7 @@ func DeleteCredential(credential *Credential, credentialType CredentialType) err
5958// Credential Manager
6059func EnumerateCredentials (filter string , all bool ) ([]* Credential , error ) {
6160 var count int
62- var systemCredential uintptr
61+ var systemCredential unsafe. Pointer
6362 var filterPtr * uint16
6463 if ! all {
6564 filterPtr , _ = syscall .UTF16PtrFromString (filter )
@@ -73,12 +72,8 @@ func EnumerateCredentials(filter string, all bool) ([]*Credential, error) {
7372 if ret == 0 {
7473 return nil , err
7574 }
76- defer credFree .Call (systemCredential )
77- systemCredentials := * (* []* CREDENTIAL )(unsafe .Pointer (& reflect.SliceHeader {
78- Data : systemCredential ,
79- Len : count ,
80- Cap : count ,
81- }))
75+ defer func () { _ , _ , _ = credFree .Call (uintptr (systemCredential )) }()
76+ systemCredentials := unsafe .Slice ((* * CREDENTIAL )(systemCredential ), count )
8277 credentials := make ([]* Credential , count )
8378 for i , c := range systemCredentials {
8479 credentials [i ] = convertFromSystemCredential (c )
@@ -118,9 +113,9 @@ func convertToSystemCredential(cred *Credential) (result *CREDENTIAL) {
118113 result .LastWritten = syscall .NsecToFiletime (cred .LastWritten .UnixNano ())
119114 result .CredentialBlobSize = uint32 (len (cred .CredentialBlob ))
120115 if len (cred .CredentialBlob ) > 0 {
121- result .CredentialBlob = uintptr ( unsafe .Pointer (& cred .CredentialBlob [0 ]) )
116+ result .CredentialBlob = unsafe .Pointer (& cred .CredentialBlob [0 ])
122117 } else {
123- result .CredentialBlob = 0
118+ result .CredentialBlob = nil
124119 }
125120 result .Persist = uint32 (cred .Persist )
126121 result .TargetAlias , _ = syscall .UTF16PtrFromString (cred .TargetAlias )
@@ -129,15 +124,11 @@ func convertToSystemCredential(cred *Credential) (result *CREDENTIAL) {
129124 return
130125}
131126
132- func copyBytesToSlice (src uintptr , len uint32 ) (bytes []byte ) {
133- if src == uintptr ( 0 ) {
127+ func copyBytesToSlice (src unsafe. Pointer , len uint32 ) (bytes []byte ) {
128+ if src == nil {
134129 return []byte {}
135130 }
136131 bytes = make ([]byte , len )
137- copy (bytes , * (* []byte )(unsafe .Pointer (& reflect.SliceHeader {
138- Data : src ,
139- Len : int (len ),
140- Cap : int (len ),
141- })))
132+ copy (bytes , unsafe .Slice ((* byte )(src ), len ))
142133 return
143134}
0 commit comments