Access violation could be caused because you're mapping longs to fixed size byte arrays. Long size may vary depending on the platform, so you should always use NativeLong:

public class StatusHardware extends Structure {
public byte SerialNumber[] = new byte[12];
public NativeLong HWVersion;
public NativeLong FWVersion;
public NativeLong MemorySize;
public short BootVersion;
public short FPGAVersion;
public NativeLong Devices;
public byte Reserved[] = new byte[8];
}