You haven't actually said which system call you're invoking, but from the
name CERT_CONTEXT and the layout of the struct I'm guessing it's probably
CertCreateCertificateContext
<https://godoc.org/golang.org/x/sys/windows#CertCreateCertificateContext>
 or CertEnumCertificatesInStore
<https://godoc.org/golang.org/x/sys/windows#CertEnumCertificatesInStore>?

I don't really know anything about Windows system calls, but it does seem
like those allocate memory somewhere outside of the Go heap.


On Fri, Dec 15, 2017 at 1:54 AM, snmed <sandro.p.da...@gmail.com> wrote:

> Hi Bryan
>
> But the returned uintptr from syscall is as far as i know a pointer to a
> struct which has been created by the C API, so go runtime won't touch it or
> do I miss something?
>
>
> Am Freitag, 15. Dezember 2017 00:48:51 UTC+1 schrieb Bryan Mills:
>>
>> In this case, the vet tool is correct if you're making the syscall with
>> Go-allocated memory.
>> The Go runtime is allowed to move values around: the address of a Go
>> variable is only pinned for the duration of the syscall itself.
>>
>> If you've got C-allocated memory (or statically-allocated memory),
>> https://golang.org/issue/13656#issuecomment-303216308 has a solution
>> that avoids copying and is more robust to large sizes.
>>
>>
>> On Thursday, December 14, 2017 at 5:27:57 AM UTC-5, snmed wrote:
>>>
>>> Okay I found a way, this seems to work:
>>>
>>> ca := (*[1000000]byte) (unsafe.Pointer(certctx.pbCertEncoded))[:certctx.
>>> cbCertEncoded]
>>>
>>> or
>>>
>>> mm := make([]byte, certctx.cbCertEncoded)
>>>     for i := uint32(0) ; i < certctx.cbCertEncoded; i++ {
>>>         mm[i] = *((*byte)(unsafe.Pointer(certctx.pbCertEncoded + uintptr
>>> (i) * unsafe.Sizeof(new(byte)))))
>>>     }
>>>
>>>
>>>
>>> Anyway, the vet tool is complaining:
>>>
>>> main.go:106: possible misuse of unsafe.Pointer
>>> main.go:109: possible misuse of unsafe.Pointer
>>>
>>> This is the code fragment:
>>>
>>> 104    certctx := new(CERT_CONTEXT)
>>> 105
>>> 106    certctx = (*CERT_CONTEXT) (unsafe.Pointer(pccert_context))
>>> 107
>>> 108
>>> 109    ca := (*[1000000]byte) (unsafe.Pointer(certctx.pbCertEncoded))[:
>>> certctx.cbCertEncoded]
>>>
>>> Is there another way to use syscall return values uintptr without vet
>>> warnings? And which solution should I prefer? I think the later one should
>>> be more safe, isn't it?
>>>
>>> Cheers
>>>
>>>
>>> Am Donnerstag, 14. Dezember 2017 09:29:38 UTC+1 schrieb snmed:
>>>>
>>>> Hi Miki
>>>>
>>>> I'm using syscall package and no C import, but maybe it is possible to
>>>> use this function as well?
>>>>
>>>> Am Donnerstag, 14. Dezember 2017 09:18:26 UTC+1 schrieb Miki Tebeka:
>>>>>
>>>>> Do you mean
>>>>>
>>>>> func C.GoBytes(unsafe.Pointer, C.int) []byte
>>>>>
>>>>>  ?
>>>>>
>>>>> On Thursday, December 14, 2017 at 9:05:32 AM UTC+2, snmed wrote:
>>>>>>
>>>>>> Hi all
>>>>>>
>>>>>> I'm trying to map a C structure to an equivalent go struct, but I
>>>>>> bumped into a problem with a pointer to byte that is actually an array of
>>>>>> bytes.
>>>>>>
>>>>>> Here is the C struct:
>>>>>>
>>>>>> typedef struct _CERT_CONTEXT {
>>>>>>   DWORD      dwCertEncodingType;
>>>>>>   BYTE       *pbCertEncoded;
>>>>>>   DWORD      cbCertEncoded;
>>>>>>   PCERT_INFO pCertInfo;
>>>>>>   HCERTSTORE hCertStore;
>>>>>> } CERT_CONTEXT, *PCERT_CONTEXT;
>>>>>>
>>>>>>
>>>>>> and this is my go struct:
>>>>>>
>>>>>> type CERT_CONTEXT struct {
>>>>>>     dwCertEncodingType uint32
>>>>>>     pbCertEncoded      uintptr
>>>>>>     cbCertEncoded      uint32
>>>>>>     pCertInfo          uintptr
>>>>>>     hCertStore         uintptr
>>>>>> }
>>>>>>
>>>>>> for my case I need only the first 3 fields and I do not have any
>>>>>> problem to get 1 and 3, but I can't remember how to translate the second
>>>>>> field to a slice of bytes.
>>>>>> This is how I map the struct from an uintptr and print it to the
>>>>>> console:
>>>>>>
>>>>>>     certctx = (*CERT_CONTEXT) (unsafe.Pointer(pccert_context))
>>>>>>     fmt.Printf("%v\n", certctx)
>>>>>>
>>>>>>     >&{1 807520 674 833008 789360}
>>>>>>
>>>>>> Any advise is warmly welcome.
>>>>>>
>>>>>> Cheers,
>>>>>> Sandro
>>>>>>
>>>>> --
> You received this message because you are subscribed to a topic in the
> Google Groups "golang-nuts" group.
> To unsubscribe from this topic, visit https://groups.google.com/d/
> topic/golang-nuts/0JYB0-ZcFpk/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> golang-nuts+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to