代码之家  ›  专栏  ›  技术社区  ›  abatishchev Karl Johan

使用C以编程方式重新启动Windows Mobile 6.x设备#

  •  5
  • abatishchev Karl Johan  · 技术社区  · 15 年前

    我的HTC HD2无法从操作系统重新启动,请关闭。所以我想写一个小程序来做这个。

    是否可以使用c_以编程方式重新启动Windows Mobile 6.x设备?

    3 回复  |  直到 10 年前
        1
  •  6
  •   abatishchev Karl Johan    15 年前

    你应该使用文件 ExitWindowsEx 应用程序编程接口。 IOCTL 只能在缺少exitWindowsEx功能调用的平台上使用(Pocket PC 2000、2002和2003)。见 MSDN doc 更多信息。

    [DllImport("aygshell.dll", SetLastError=""true"")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool ExitWindowsEx([MarshalAs(UnmanagedType.U4)]uint dwFlags, [MarshalAs(UnmanagedType.U4)]uint dwReserved);
    
    enum ExitWindowsAction : uint
    {
        EWX_LOGOFF = 0,
        EWX_SHUTDOWN = 1,
        EWX_REBOOT = 2,
        EWX_FORCE = 4,
        EWX_POWEROFF = 8
    }
    
    void rebootDevice()
    {
        ExitWindowsEx(ExitWindowsAction.EWX_REBOOT, 0);
    }
    
        2
  •  5
  •   swapnil Dongare    12 年前

    软重置/硬重置

    public class Reboot
    {
        public const uint FILE_DEVICE_HAL = 0x00000101;
        public const uint METHOD_BUFFERED = 0;
        public const uint FILE_ANY_ACCESS = 0;
    
        public static uint CTL_CODE(uint DeviceType, uint Function, uint Method, uint Access)
        {
            return ((DeviceType << 16) | (Access << 14) | (Function << 2) | Method);
        }
    
        [DllImport("Coredll.dll")]
        public extern static uint KernelIoControl
        (
            uint dwIoControlCode,
            IntPtr lpInBuf,
            uint nInBufSize,
            IntPtr lpOutBuf,
            uint nOutBufSize,
            ref uint lpBytesReturned
        );
    
        /// <summary>
        /// Causes the CE device to soft/warm reset
        /// </summary>
        public static uint SoftReset()
        {
            uint bytesReturned = 0;
            uint IOCTL_HAL_REBOOT = CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS);
            SetCleanRebootFlag();
            return KernelIoControl(IOCTL_HAL_REBOOT, IntPtr.Zero, 0, IntPtr.Zero, 0, ref bytesReturned);
        }
    
        [DllImport("coredll.dll")]
        public extern static uint SetSystemPowerState
        (
            String psState,
            Int32 StateFlags,
            Int32 Options
        );
    
        const int POWER_FORCE = 4096;
        const int POWER_STATE_RESET = 0x00800000;
    
        public static uint ColdReset()
        {
            SetCleanRebootFlag();
            return SetSystemPowerState(null, POWER_STATE_RESET, POWER_FORCE);
        }
    
        [DllImport("Coredll.dll")]
        public extern static int KernelIoControl(int dwIoControlCode, IntPtr lpInBuf, int nInBufSize, IntPtr lpOutBuf, int nOutBufSize, ref int lpBytesReturned);
    
        [DllImport("Coredll.dll")]
        public extern static void SetCleanRebootFlag();
    
        public static void HardReset()
        {
            int IOCTL_HAL_REBOOT = 0x101003C;
            int bytesReturned = 0;
            SetCleanRebootFlag();
            KernelIoControl(IOCTL_HAL_REBOOT, IntPtr.Zero, 0, IntPtr.Zero, 0, ref bytesReturned);
        }
    
    
        [DllImport("aygshell.dll", SetLastError=true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool ExitWindowsEx([MarshalAs(UnmanagedType.U4)]uint dwFlags, [MarshalAs(UnmanagedType.U4)]uint dwReserved);
    
        enum ExitWindowsAction : uint
        {
            EWX_LOGOFF = 0,
            EWX_SHUTDOWN = 1,
            EWX_REBOOT = 2,
            EWX_FORCE = 4,
            EWX_POWEROFF = 8
        }
    //
        void rebootDevice()
        {
            ExitWindowsEx(ExitWindowsAction.EWX_REBOOT, 0);
        }
    
        3
  •  3
  •   0x49D1    15 年前

    我认为这将有助于您: Hard Reset Windows Mobile Device …不过,这个方法并不是“清晰的C代码”,因为它使用interop,但它可以工作,所以它可以解决您的问题。
    为了 软的 重置:

    [DllImport("coredll.dll", SetLastError=true)]
    private static extern bool KernelIoControl(int dwIoControlCode, byte[] inBuf, int inBufSize, byte[] outBuf, int outBufSize, ref int bytesReturned);
    
    private const uint FILE_DEVICE_HAL = 0x00000101;
    private const uint METHOD_BUFFERED = 0;
    private const uint FILE_ANY_ACCESS = 0;
    
    private static uint CTL_CODE(uint DeviceType, uint Function, uint Method, uint Access)
    {
         return ((DeviceType << 16) | (Access << 14) | (Function << 2) | Method);
    }
    
    public static void softReset()
    {
         uint bytesReturned = 0;
         uint IOCTL_HAL_REBOOT = CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS);
         KernelIoControl(IOCTL_HAL_REBOOT, IntPtr.Zero, 0, IntPtr.Zero, 0, ref bytesReturned);
    }
    

    (我自己没有用过这个方法……看 here )