How can I do a coldboot (reboot) in C# with my Apalis module?
With WinCE 2.0 I could call the function KernelIoControl(…); but this doesn’t work anymore in verson 2.2
How can I do a coldboot (reboot) in C# with my Apalis module?
With WinCE 2.0 I could call the function KernelIoControl(…); but this doesn’t work anymore in verson 2.2
Dear @TriUrs
The only difference between V2.0 and V2.2 is a more stringent parameter verification.
KernelIoControl()
functionRegards, Andy
I use the following code for a coldboot:
private static extern bool KernelIoControl(Int32 dwIoControlCode, IntPtr lpInBuf,
Int32 nInBufSize, byte[] lpOutBuf, Int32 nOutBufSize, ref Int32 lpBytesReturned);
private int CTL_CODE(int DeviceType, int Func, int Method, int Access)
{
return (DeviceType << 16) | (Access << 14) | (Func << 2) | Method;
}
public void ColdBoot()
{
const int FILE_DEVICE_HAL = 0x101;
const int METHOD_BUFFERED = 0;
const int FILE_ANY_ACCESS = 0;
int bytesReturned = 0;
int IOCTL_HAL_REBOOT;
IOCTL_HAL_REBOOT = CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS);
byte[] outbuff = new byte[0];
KernelIoControl(IOCTL_HAL_REBOOT, IntPtr.Zero, 4, outbuff, nOutBufSize: 0, lpBytesReturned: ref bytesReturned);
}
This worked under WinCE 2.0. And I think I do the same as you suggest for other modules here: IOCTL HAL REBOOT | Toradex Developer Center
Coldboot works with built-in UpdateTool (which I use right now always).
Dear @TriUrs
There’s a number of issues in your code:
byte[] outbuff = new byte[0];
), but state it is 0 bytes in length ( nOutBufSize: 0
). In reality this will not generate a problem. The parameter is ignored anyway. You can simplify your code by removing outbuff at all.lpBytesReturned
can be ignored (just to simplify the code)lpInBuf: IntPtr.Zero
), but state it is 4 bytes in length ( nOutBufSize: 4
). This one is causing the problem.There’s two options to solve it. Please refer also to the developer page article:
The following two code snippets should be fine in c#
{
System.UInt32 zero = 0;
// Cold Boot
KernelIoControl(IOCTL_HAL_REBOOT, ref zero, 4, IntPtr.zero, 0, IntPtr.zero);
// Warm Boot
KernelIoControl(IOCTL_HAL_REBOOT, IntPtr.zero, 0, IntPtr.zero, 0, IntPtr.zero);
}
Regards, Andy
With your help it worked. Thank you.