Sunteți pe pagina 1din 4

Foreword: HORM is an acronym for "Hibernate Once Resume Many," a valuable feature for quickly booting a Windows XP Embedded

system. In this whitepaper, Mike Moini, a developer on the Windows XP Embedded team, reviews the basics of HORM and describes some new APIs added in Feature Pack 2007. What is HORM and how can you use it? by Mike Moini The HORM feature allows a rapid reboot and return to the same hibernated image over and over again. Much different from the way you typically use hibernate mode on shut down with your desktop. With your desktop non-XP embedded operating system, you can only restore the image you hibernated last and hibernated images do not persist across reboots. If you want to return to the same image after a rapid reboot on your device, your choice is HORM. HORM works with EWF (Enhanced Write Filter). This feature is not new to the XP Embedded operating system and was introduced in SP2. We did not change the functionality of HORM in FP2007. We changed the way HORM is activated and enabled. Previously, for HORM to work, you had to manually create a file in the root directory. To disable HORM, you had to disable EWF, reboot (for EWF disable to take effect), delete the file, reboot (for resume from hibernation to get clear), enable EWF and reboot again (for EWF enable to take effect). Not any more. Now the interface to HORM has become more user friendly and more importantly, it requires fewer reboots when you need to deactivate HORM. "Why would you need to deactivate such a marvelous feature," you ask? When you want to service your device: upgrade the software, install a new application, apply a security patch, etc. First of all, lets cover the basics together. You must first enable HORM in your configuration before being able to activate or deactivate it at run time. If HORM is not enabled during configuration (that is before building an embedded image), the run time commands and APIs to activate or deactivate HORM will return an error. Something like "HORM is not supported on this image." So, you have to plan ahead if you want to use HORM on a system. The process for using HORM looks like the block diagram pictured at right. Once you have enabled HORM for your image, it defaults to being active. All

subsequent activation/deactivation of HORM takes effect immediately and does not require a reboot. There are two ways to activate/deactivate HORM; one is using the EWF API and the other one is using the EWF command line interface (EWFMGR). There 3 new APIs added to EWF; two for activation/deactivation and one for returning the state of HORM. These are: EwfMgrActivateHORM (HANDLE hDevice),EwfMgrDeactivateHORM (HANDLE hDevice), and EwfMgIsHORMActivated( HANDLE hDevice)). Sample code to use these APIs is provided at the end of this article. There are only two new command options added to EWFMGR (-activatehorm and -deactivatehorm). The current state of HORM is added to generic command responses. This is the response that gets printed to the screen when you type "ewfmgr" with no command option. Sample code illustrating use of HORM APIs
// EWFTestAPI.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include windows.h #include windef.h #include winbase.h #include winioctl.h #include stdio.h #include stdlib.h #include string.h #define EWFIMP #include "ewfapi.h" #include "ewfapip.h" // main body int _tmain(int argc, _TCHAR* argv[]) { HANDLE hSrcDevice = INVALID_HANDLE_VALUE; char szSource[255]; char * psz; int i; BOOL ret_status; *szSource = '\0'; strcpy_s(szSource, "\\\\.\\c:"); hSrcDevice = CreateFile((LPCWSTR)szSource, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL); if (hSrcDevice == INVALID_HANDLE_VALUE)

{ %ld\n",

printf("Failed opening the target device %s with error szSource, GetLastError()); return 0;

} for (i = 1; i argc; i++) { psz = (char *)argv[i]; if (*psz == '?') { goto usage; } else if (*psz == 'A') { printf("Activation..."); ret_status = EwfMgrActivateHORM(hSrcDevice); if (ret_status) printf("PASSED\n"); else printf ("FAILED\n"); } else if (*psz == 'D') { printf("Deactivating..."); ret_status = EwfMgrDeactivateHORM(hSrcDevice); if (ret_status) printf("PASSED\n"); else printf ("FAILED\n"); } else if (*psz == 'G') { printf("Geting the state..."); ret_status = EwfMgIsHORMActivated(hSrcDevice); if (ret_status) printf("Activated\n"); else printf ("Deactivated\n"); } else goto usage; } return 0; usage: printf ("USAGE: EWFTestAPI A: Activates HORM \n"); printf (" EWFTestAPI D: Deactivates HORM\n"); printf (" EWFTestAPI G: Returns the state of HORM (NotSupported, Active, or Deactive)\n"); return 0; }

Copyright (c) 2006 Microsoft Corp. All rights reserved. Reproduced by WindowsForDevices.com with permission. This article was originally published on the Windows XP Embedded Team Blog, here. About the author: Mike Moini is a software developer who joined Microsoft's Windows XP Embedded product team last summer. For the Windows XP Embedded Feature Pack 2007 product, he was part of the Embedded Enabling Features team, and was specifically responsible for EWF enhancements and HORM enhancements. Moini, who was born in Tehran, holds BS and MS degrees in Electrical Engineering and has developed embedded and real-time software, mostly for wired and wireless communication equipment. Related stories:

Tool simplifies HORM management on Windows XPe All about Windows XPe's new HORM feature Technical article explores Windows XPe SP2 HORM Free tool simplifies XPe Device Update Agent scripting Using EWF and DUA to field-update Windows XP Embedded devices Windows XP Embedded USB boot The Windows XP Embedded Command-Line Tool Getting to know Windows XPe's new File Based Write Filter Enabling desktop technologies on Windows XP Embedded SP2 Feature Pack 2007 Component Enhancements in Windows XP Embedded SP2 Feature Pack 2007

S-ar putea să vă placă și