Marvin, thanks. What i'm doing is similar to your guessing.
I use syscall.Syscall to call win32 api, and encounter some padding issues. I have resolve my problems by mannual padding days ago, but I want to know if there is a more graceful way to finish that. One of the Apis is: DWORD WINAPI FwpmFilterAdd0( _In_ HANDLE engineHandle, _In_ const FWPM_FILTER0 *filter, _In_opt_ SECURITY_DESCRIPTOR sd, _Out_opt_ UINT64 *id ); I have call with a FWPM_FILTER0 struct as below: typedef struct FWPM_FILTER0_ { GUID filterKey; FWPM_DISPLAY_DATA0 displayData; UINT32 flags; GUID *providerKey; FWP_BYTE_BLOB providerData; GUID layerKey; GUID subLayerKey; FWP_VALUE0 weight; UINT32 numFilterConditions; FWPM_FILTER_CONDITION0 *filterCondition; FWPM_ACTION0 action; union { UINT64 rawContext; // makes this union aligns to 8 bytes GUID providerContextKey; }; GUID *reserved; UINT64 filterId; // filterId aligns to 8 bytes FWP_VALUE0 effectiveWeight; } FWPM_FILTER0; In win32, I have to define the sturct as below: type FWPM_FILTER0 struct { FilterKey GUID DisplayData FWPM_DISPLAY_DATA0 Flags uint32 ProviderKey *GUID ProviderData FWP_BYTE_BLOB LayerKey GUID SubLayerKey GUID Weight FWP_VALUE0 NumFilterConditions uint32 FilterCondition *FWPM_FILTER_CONDITION0 Action FWPM_ACTION0 /* union { UINT64 rawContext; GUID providerContextKey; }; */ reserved1 uint32 // mannul padding ProviderContextKey GUID // the max size field of that anonymous union Reserved *GUID reserved2 uint32 // mannul padding FilterId uint64 EffectiveWeight FWP_VALUE0 } Now I can run my code in 32bit go. But I hope my code can run 64bit go without any conditional compile. best regards, xjdrew On Monday, May 22, 2017 at 8:57:28 PM UTC+8, Marvin Renich wrote: > > * xjdrew <xj....@gmail.com <javascript:>> [170522 02:06]: > > How can i use this kind of Go in windows? my machine is 64bit also. If I > > download the amd64 Go, the pointer size will be 8 bytes. > > > > My real issue is , when I call win32 api, uint64 type in the struct of > > win32 is aligned to 8 bytes. > > I have to pad the go struct by manual to make it work with win32 api. > > > > > On Friday, May 19, 2017 at 7:28:54 AM UTC-4, xjdrew wrote: > > >> Code as below, playground url(https://play.golang.org/p/XSx--6uF0E): > > >> > > >> package main > > >> > > >> import "fmt" > > >> import "unsafe" > > >> > > >> type A struct { > > >> a uint8 > > >> b uint64 > > >> } > > >> func main() { > > >> a := &A{} > > >> fmt.Println(unsafe.Sizeof(a)) > > >> fmt.Println(unsafe.Sizeof(*a)) > > >> } > > As Dan said, you have not given us enough information to provide you > with useful help (at least not without a lot of good guessing on our > part as to what you are really trying to do). I am guessing that you > are importing "golang.org/x/sys/windows" and using syscall to call > functions in DLLs. If so, what DLL and what entry? What is the C > structure you are trying to pass to that entry? Must it work in both > win32 and win64? > > When you are mixing Go and C ABIs, there is likely to be some manual > alignment, especially if you are trying to do this on multiple > OS/architecture combinations (e.g. win32 and win64). > > I believe (but am not 100% positive) that on all platforms supported by > Go, the following will produce the same alignment: > > type A struct { > a uint8 > _ uint32 > b uint64 > } > > ...Marvin > > -- 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.