To programmatically detect a warm reset, cold reset and a clean reset, you'll need the following Kernel IOCTLs:
These IOCTLs utilize the KernelIoControl API: http://msdn.microsoft.com/en-us/library/aa909165.aspx
The both return a BOOL value in their respective lpOutBuf parameters. Depending on the Operating System variant, the combination of both IOCTLs will tell you whether a warm, cold, or clean reboot have occured:
Warm/Cold Reboot (*)
(*) NOTE: For Windows Mobile 6.x, there is no notion of warm or cold reset. Its just a reboot (as it would be on a PC.
See also: http://community.psion.com/downloads/developer_sdkhdk/m/sample__demo_code/22234.aspx