.NET Compact Framework Version 2 .CAB Files Explained
Abstract
Just like other Windows CE applications, .Net Compact Framework V2 (NETCF V2) is distributed as a set of CAB files. This article describes these CABs and discusses potential installation problems as well as ways to solve these problems.
NETCF V2 CABs – which one is for which device?
NETCF V2 currently includes seven CAB files. Table below describes platforms and CPUs supported by each CAB.
CAB name | Supported Platform(s) | Supported CPU(s) |
NETCFv2.ppc.ARMV4.cab | Pocket PC 2003
Pocket PC 2003 SE |
ARMV4 |
NETCFv2.wm.armv4i.cab | Windows Mobile 5.0 Pocket PC
Windows Mobile 5.0 Smart Phone |
ARMV4I |
NETCFv2.wce5.sh4.cab | Windows CE 5.0 | SH4 |
NETCFv2.wce5.mipsii.cab | Windows CE 5.0 | MIPS II
MIPS II FP |
NETCFv2.wce5.mipsiv.cab | Windows CE 5.0 | MIPS IV
MIPS IV FP |
NETCFv2.wce5.armv4i.cab | Windows CE 5.0 | ARMV4I |
NETCFv2.wce5.x86.cab | Windows CE 5.0 | X86 |
Note: “Pocket PC” also includes “Pocket PC Phone Edition”.
What is inside the CAB?
Each CAB file contains at least one native (CPU dependent) NETCF runtime, CPU independent managed libraries and setup DLL. In some cases CAB file contains more than one native runtimes, each optimized for particular CPU flavor. For example, NETCFv2.wce5.mipsii.cab contains two runtimes, one for MIPS II CPU and another one for MIPS II FP CPU (which has dedicated floating point unit). Correct runtime files are picked at installation time by setup DLL, unused files are discarded to save space.
Some files in runtime called shared files are special – they have the same names and install locations as similar files in NETCF V1. They are treated in a special way. That is needed to allow side by side installation of NETCF versions.
What happens upon NETCF V2 CAB installation?
NETCF V2 installation is handled by standard WCELOAD utility just like with any normal CAB. It would invoke setup DLL which performs following tasks:
- Locating other installed NETCF versions.
- Creates registry entries for installed version and removes entries for old one if found
- Picks and deploys runtime for specific CPU flavor. Shared files are deployed based on files versions to avoid issues with incorrect time stamps.
- Creates list of managed libraries and adds them to GAC.
- Verifies versions of shared files to ensure correct installation.
All these steps along with some extra information like available memory and device type are logged to the file “Microsoft .NET CF 2.0.LOG.TXT” located in the root folder. In case of failure this log file can be used to figure out the failure reason and take appropriate steps to correct the situation. Failures are also reported to the end user via message box (unless installation runs in silent mode).
Installing NETCF V2 to storage card
While it is technically possible to redirect installation of NETCF onto storage card via standard Active Sync/WCELOD capabilities, it won’t save precious RAM on device. NETCF files have to be in \Windows folder in order for NETCF to function properly.
If NETCF is installed to storage card, NETCF files will be initially deployed to it. However, at some point they would moved to \Windows folder taking out exactly the same space as normal installation would.
In some cases attempt to use storage card would lead to installation failure due to some subtle storage card issues. Thus it’s not recommended to install NETCF V2 to storage card or embedded storage and there are no benefits of doing so.
Platform and CPU restriction in NETCF CAB files
NETCF V2 CAB files can be deployed via Active Sync by using standard CEAPPMGR.EXE and properly constructed INI file. Active Sync will pick the right CAB for connected device and install it.
To accomplish that, platform and CPU information from CAB file is used. That makes NETCF V2 CAB files somewhat restricted to specific platforms because WCELOAD also verifies this information upon installation and will refuse to install CAB file if it appears to be incompatible with the device.
Here’s information from each CAB:
CAB name | OS version min | OS version max | CPU ID | Supported platform | Unsupported platforms |
NETCFv2.ppc.ARMV4.cab | 4.000 | 4.999 | 2577 | PocketPC 3.000-3.999 | SmartPhone |
NETCFv2.wm.armv4i.cab | 5.000 | 5.999 | 2577 | n/a | n/a |
NETCFv2.wce5.sh4.cab | 5.000 | 5.999 | 10005 | n/a | SmartPhone
PocketPC |
NETCFv2.wce5.mipsii.cab | 5.000 | 5.999 | 4000 | n/a | SmartPhone
PocketPC |
NETCFv2.wce5.mipsiv.cab | 5.000 | 5.999 | 5000 | n/a | SmartPhone
PocketPC |
NETCFv2.wce5.armv4i.cab | 5.000 | 5.999 | n/a | n/a | SmartPhone
PocketPC |
NETCFv2.wce5.x86.cab | 5.000 | 5.999 | n/a | n/a | SmartPhone
PocketPC |
Note: All CAB files also have obsolete HPC and Jupiter in a list of unsupported platforms.
As you can see, ARMV4I and x86 Windows CE 5.0 CABs don’t have CPU ID information. That’s because multiple supported CPU IDs are possible. For example, x86 device can have CPU ID of 586 or 686. Since both are supported, but CAB file format only allows for no more than one CPU ID, we choose to remove CPU ID from such CAB files.
Another problem to notice, x86 and ARMV4I Windows CE CABs have exactly the same information in the CAB, so how does Active Sync distinguish them? To our regret, it does not. To resolve this situation x86 CAB was removed from CABs list in INF file and won’t be deployed by NETCF MSI. We hope it won’t be a problem since embedded x86 devices are rarely connected via Active Sync and software is unlikely to be installed by end user via NETCF MSI. That does not affect Visual Studio ability to deploy NETCF.
What exactly are those platform names and CPU ID CAB file has and how to retrieve them?
This information is specified by device’s OEM and can be obtained via Windows APIs. It is retrieved by Active Sync to pick the CAB and also by WCELOAD to see if CAB is compatible.
CPU ID information can be obtained by calling GetSystemInfo() function. It would be in dwProcessorType field of SYSTEM_INFO structure.
Details can be found here:
Platform name and version can be retrieved by calling SystemParametersInfo() function with SPI_GETPLATFORMTYPE and SPI_GETPLATFORMVERSION arguments respectively.
Please see this for details:
Installation failed. Now what?
Platform restriction issues.
In case WCELOAD believes CAB file does not match the device, it will refuse to proceed with installation. For example, attempt to install NETCFv2.ppc.ARMV4.cab on generic Windows CE 4.2 device will fail even though Pocket PC 2003 based on the same Windows CE version. This is unsupported platform, so failure is expected.
In some rare cases WCELOAD might refuse to install NETCF V2 CAB file on supported device due to issues with OS. For example, it’s not possible to install NETCF V2 CAB file on some early Pocket PC 2003 devices due to following issue:
https://support.microsoft.com/default.aspx?scid=kb;en-us;824409
There’s no workaround besides ROM upgrade. Check with your hardware manufacturer to see if there is a ROM update available.
Other potential issues with platform restriction can arise in custom built Windows CE images. It is important to make sure all OEM information is set correctly and calls to APIs described above returns expected results on custom Windows CE devices.
Installation time issues.
If CAB file was not rejected by WCELOAD right away as described in a previous section, failure might occur later on. Most common reasons for these failures are:
- Newer version of NETCF is installed.
- Device is not compatible with selected CAB file.
- Low storage and/or program memory.
- Device security settings prohibit installation (for Windows Mobile 5.0)
- Managed application is running which prevents deployment of new files.
- Failure to add managed files to GAC.
Since downgrade is not supported, if newer (not side by side) version is installed (e.g. future NETCF V2 release), installation will be terminated. That can be fixed by removing newer version.
In all other cases generic error message with error ID will be reported. These errors are:
ID | Meaning | Most likely reasons | Way to fix it |
1 | CAB expansion failed | Low memory
|
Free up some memory. |
2 | Setup DLL failed to copy runtime files | Managed application is running, preventing files from been overwritten. | Terminate running managed applications. |
3 | CGACUTIL can not add managed libraries to GAC | Low memory, attempt to install to HP 4700 file storage. | Free up some memory, install to main memory only. |
4 | Shared files version is incorrect | Incompatible device, security issues on WM 5.0 (installation prohibited by phone carrier). | Use correct CAB file for this device. Try manual installation, answer “yes” to security prompt. |
Note: “memory” in this table refers to normal storage memory (persistent storage on WM 5.0). Adding storage card won’t help in low memory condition.
Log file walk through
Log entry | Description |
10/10/2005 14:44:10: Entered Install_Init().
First Call: Yes Previously Installed: No Installation folder is: '\Program Files\.NET CF 2.0'. |
Installation started, CAB file is not unpacked yet. Information passed by WCELOAD to setup DLL is printed out. |
10/10/2005 14:44:10: Build 2.0.5238.00 | NETCF build number we’re installing. |
10/10/2005 14:44:10: Device CPU: 'ARMV4', 05010000 (83951616)
10/10/2005 14:44:10: PocketPC 4.20 10/10/2005 14:44:10: Our trust level is: 2 10/10/2005 14:44:10: User LCID: 1033 10/10/2005 14:44:10: System LCID: 1033 |
Device information which includes CPU type, platform name, OS version and device locale. |
10/10/2005 14:44:10: Invoker's command line: '"\NETCFv2.ppc.ARMV4.cab"' | WCELOAD’s command line. |
10/10/2005 14:44:10: Memory status, K --------------------------
10/10/2005 14:44:10: Load : 31 10/10/2005 14:44:10: Physical : 31804 10/10/2005 14:44:10: Physical free : 22080 10/10/2005 14:44:10: Virtual : 32768 10/10/2005 14:44:10: Virtual free : 28864 10/10/2005 14:44:10: Storage status, K ------------------------- 10/10/2005 14:44:10: Available to us: 23114 10/10/2005 14:44:10: Total storage : 31732 10/10/2005 14:44:10: Available total: 23114 10/10/2005 14:44:10: ------------------------------------------- |
Memory status information prior to installation.
|
10/10/2005 14:44:10: About to process registry.
10/10/2005 14:44:10: Opened CF registry key OK. 10/10/2005 14:44:10: Looking for upgradeable installations for version '2.0.5238.00' 10/10/2005 14:44:10: Added new CF version value '2.0.5238.00'. 10/10/2005 14:44:10: CF registry key closed. |
Setup DLL would check for installed version by looking into NETCF registry entry. That entry would be removed if “upgradeable” version is found. Side by side version would remain unchanged. New entry would be added for version we’re installing. |
10/10/2005 14:44:18: Entered Install_Exit().
Failed Dirs: 0 Failed Files: 0 Failed RegKeys: 0 Failed RegVals: 0 Failed Shortcuts: 0 |
WCELOAD just expanded the CAB file, number of failed items shown. |
10/10/2005 14:44:18: Memory status, K --------------------------
10/10/2005 14:44:18: Load : 31 10/10/2005 14:44:18: Physical : 31804 10/10/2005 14:44:18: Physical free : 22072 10/10/2005 14:44:18: Virtual : 32768 10/10/2005 14:44:18: Virtual free : 28864 10/10/2005 14:44:18: Storage status, K ------------------------- 10/10/2005 14:44:18: Available to us: 23160 10/10/2005 14:44:18: Total storage : 31732 10/10/2005 14:44:18: Available total: 23160 10/10/2005 14:44:18: ------------------------------------------- |
Memory status after CAB file was expanded. |
10/10/2005 14:44:18: About to verify reference count.
10/10/2005 14:44:18: PocketPC 4.20 10/10/2005 14:44:18: CE 4 or below detected. Attempting to correct ref count. 10/10/2005 14:44:18: Counting CF installations. 10/10/2005 14:44:18: Found matching file 'MSCOREE2_0.dll'. 10/10/2005 14:44:18: Found 1 CF installation(s). 10/10/2005 14:44:18: Number of CF installations determined to be 1. 10/10/2005 14:44:18: Opened ref count registry key OK. |
Special process to work around shared files reference count on Window CE 4.2 based platforms. Reference count is responsible for keeping track of shared files to allow side by side installations. |
10/10/2005 14:44:19: About to process alternative files. | “Alternative files” are CPU specific NETCF runtime(s). |
10/10/2005 14:44:19: PocketPC 4.20
10/10/2005 14:44:19: Processing alternative file: '\Program Files\.NET CF 2.0\cgacutil.exe.-410~-410~ARMV4'. 10/10/2005 14:44:19: Special file extension: '.-410~-410~ARMV4'. 10/10/2005 14:44:19: File is intended for OS: -410 to -410, CPU: ARMV4 10/10/2005 14:44:19: Device CPU: 'ARMV4', 05010000 (83951616) 10/10/2005 14:44:19: CPU matches. 10/10/2005 14:44:19: Version MIN ignored. 10/10/2005 14:44:19: Version MAX ignored. |
Setup DLL checks file’s information (encoded in file’s extension) and compares it with device information. In this case file matches the device.
If file does not match, it will be deleted. That means if device does not match the CAB, vital files won’t be deployed at all. That would be caught later on in shared file version verification. |
10/10/2005 14:44:19: Querying version of file '\Program Files\.NET CF 2.0\cgacutil.exe.-410~-410~ARMV4'.
10/10/2005 14:44:19: Version determined to be: 2.0.5238.0. 10/10/2005 14:44:19: Get version completed. 10/10/2005 14:44:19: Querying version of file '\Windows\cgacutil.exe'. 10/10/2005 14:44:19: Version determined to be: 2.0.5238.0. 10/10/2005 14:44:19: Get version completed. 10/10/2005 14:44:19: Suggestion: overwrite. |
Setup DLL now queries version of the file already on device and version of a file to be installed. Older file won’t overwrite newer one to allow for side by side installations. |
10/10/2005 14:44:19: Copy file from '\Program Files\.NET CF 2.0\cgacutil.exe.-410~-410~ARMV4' to '\Windows\cgacutil.exe': done. | File is deployed OK. |
10/10/2005 14:44:19: Delete file '\Program Files\.NET CF 2.0\cgacutil.exe.-410~-410~ARMV4': done. | And original deleted to save space. |
10/10/2005 14:44:19: Processing alternative file: '\Program Files\.NET CF 2.0\mscoree.dll.-410~-410~ARMV4'.
10/10/2005 14:44:19: Special file extension: '.-410~-410~ARMV4'. 10/10/2005 14:44:19: File is intended for OS: -410 to -410, CPU: ARMV4 10/10/2005 14:44:19: Device CPU: 'ARMV4', 05010000 (83951616) 10/10/2005 14:44:19: CPU matches. 10/10/2005 14:44:19: Version MIN ignored. 10/10/2005 14:44:19: Version MAX ignored. 10/10/2005 14:44:19: Querying version of file '\Program Files\.NET CF 2.0\mscoree.dll.-410~-410~ARMV4'. 10/10/2005 14:44:19: Version determined to be: 2.0.5238.0. 10/10/2005 14:44:19: Get version completed. 10/10/2005 14:44:19: Querying version of file '\Windows\mscoree.dll'. 10/10/2005 14:44:19: Version determined to be: 2.0.5238.0. 10/10/2005 14:44:19: Get version completed. 10/10/2005 14:44:19: Suggestion: overwrite. 10/10/2005 14:44:19: Copy file from '\Program Files\.NET CF 2.0\mscoree.dll.-410~-410~ARMV4' to '\Windows\mscoree.dll': done. 10/10/2005 14:44:19: Delete file '\Program Files\.NET CF 2.0\mscoree.dll.-410~-410~ARMV4': done. |
Process is repeated for other files we have. |
10/10/2005 14:44:19: Attempting to remove old files from GAC.
10/10/2005 14:44:19: Delete GAC list file: failure 10/10/2005 14:44:20: Run: '\Windows\cgacutil.exe /silent /refresh ', error code: 0 (00000000), exit code: -1 (FFFFFFFF) 10/10/2005 14:44:20: Refreshed GAC. |
We’ll try to remove older version of NETCF V2 assemblies form GAC. That’s needed if update or reinstall is been performed. |
10/10/2005 14:44:20: About to add files to the GAC.
10/10/2005 14:44:20: GAC list file opened. 10/10/2005 14:44:20: Writing UTF8 signature: done. 10/10/2005 14:44:20: Adding file 'mscorlib.dll': added. 10/10/2005 14:44:20: Adding file 'system.dll': added. 10/10/2005 14:44:20: Adding file 'system.drawing.dll': added. 10/10/2005 14:44:20: Adding file 'system.messaging.dll': added. 10/10/2005 14:44:20: Adding file 'system.web.services.dll': added. 10/10/2005 14:44:20: Adding file 'system.windows.forms.dll': added. 10/10/2005 14:44:20: Adding file 'system.windows.forms.datagrid.dll': added. 10/10/2005 14:44:20: Adding file 'system.xml.dll': added. 10/10/2005 14:44:20: Adding file 'system.net.irda.dll': added. 10/10/2005 14:44:20: Adding file 'system.data.dll': added. 10/10/2005 14:44:20: Adding file 'microsoft.visualbasic.dll': added. 10/10/2005 14:44:20: Adding file 'microsoft.windowsce.forms.dll': added. 10/10/2005 14:44:20: Adding file 'Microsoft.WindowsMobile.DirectX.dll': added. 10/10/2005 14:44:20: Adding file 'CustomMarshalers.dll': added. 10/10/2005 14:44:20: Closed list file. |
List of files to add to the GAC is created. It can not be hard coded as install location might vary on localized devices. |
10/10/2005 14:44:28: Run: '\Windows\cgacutil.exe /silent /id \Windows\Microsoft .NET CF 2.0.GAC', error code: 0 (00000000), exit code: 0 (00000000)
10/10/2005 14:44:28: GACing: completed. |
CGACUTIL utility is invoked to add files to the GAC. None-zero exits code means failure. |
10/10/2005 14:44:28: About to verify installation...
10/10/2005 14:44:28: Querying version of file '\Windows\cgacutil.exe'. 10/10/2005 14:44:28: Version determined to be: 2.0.5238.0. 10/10/2005 14:44:28: Get version completed. 10/10/2005 14:44:28: Querying version of file '\Windows\mscoree.dll'. 10/10/2005 14:44:28: Version determined to be: 2.0.5238.0. 10/10/2005 14:44:28: Get version completed. 10/10/2005 14:44:28: Shared files version verification: done. |
Shared files versions (and files presence) are compared against installing NETCF version. If versions are same or above, installation considered successful. |
10/10/2005 14:44:28: Installation completed, no errors detected. | We’re good to go. |
10/10/2005 14:44:28: Memory status, K --------------------------
10/10/2005 14:44:28: Load : 31 10/10/2005 14:44:28: Physical : 31804 10/10/2005 14:44:28: Physical free : 22064 10/10/2005 14:44:28: Virtual : 32768 10/10/2005 14:44:28: Virtual free : 28864 10/10/2005 14:44:28: Storage status, K ------------------------- 10/10/2005 14:44:28: Available to us: 23190 10/10/2005 14:44:28: Total storage : 31732 10/10/2005 14:44:28: Available total: 23190 10/10/2005 14:44:28: ------------------------------------------- |
Memory status after installation is done. |
Changes in CAB files since Beta 2.
We’ve made some changes since beta 2.
- Windows Mobile 5.0 CAB file was signed with test certificate in Beta 2, now we’re using official certificate. That would allow CAB to install without security prompt on production (locked) devices. However, NETCF certificate can be disabled by network carrier or device manufacturer. That would prevent installation of NETCF V2 (or cause a security prompt).
- In Beta 2 NETCFv2.wce5.armv4i.cab has CPU ID of 2336. It was later removed since some OEM platforms were using other IDs for compatibility reasons.
- Platform restriction was added to NETCFv2.ppc.ARMV4.cab to allow for Active Sync deployment.
[Author: Ilya Tumanov]
Disclaimers:
This posting is provided "AS IS" with no warranties, and confers no rights.
Comments
Anonymous
February 14, 2006
PingBack from http://fluidbits.com/2006/02/14/getting-started-with-windows-mobile-5-development/Anonymous
February 17, 2006
 
This BLOG started out as a way for me to describe managed game development on devices. I'm responsible...Anonymous
February 24, 2006
I've talked before about application configuration file support in the .NET Compact Framework version...Anonymous
April 07, 2006
PingBack from http://www.cengizhan.com/PermaLink.aspx?guid=58ab2684-72a4-4052-ab41-c0f2d31e6602Anonymous
July 13, 2006
PingBack from http://www.mbartels.com/index.php/2006/07/14/installation-net-compact-framework-version-2-sp1-auf-sda2/Anonymous
November 28, 2006
PingBack from http://james.manners.net.au/2006/11/28/install-net-compact-framwork-without-activesync/Anonymous
January 12, 2007
This takes up nearly 5.5Mb on my device - this is far too big for my liking. Can it be installed onto Storage Card? According to the .NET Compact Framework Team it can, but the CAB file will still attempt...Anonymous
January 12, 2007
This takes up nearly 5.5Mb on my device - this is far too big for my liking. Can it be installed onto Storage Card? According to the .NET Compact Framework Team it can, but the CAB file will still attempt...Anonymous
April 14, 2007
PingBack from http://sanal.org/?p=127Anonymous
April 14, 2008
PingBack from http://guru.xs4all.nl/?p=123Anonymous
May 15, 2008
PingBack from http://robert.mediacenternews.info/netframeworkversion.htmlAnonymous
May 15, 2008
PingBack from http://abbie.formedianews.info/netframeworkversion.htmlAnonymous
May 26, 2008
PingBack from http://tylerspace.justfree.com/cabfiles.htmlAnonymous
August 24, 2008
PingBack from http://budgie.uberstomping.com/?p=327Anonymous
January 20, 2009
PingBack from http://www.hilpers.com/923134-net-compact-framework-2-0-aAnonymous
January 21, 2009
PingBack from http://www.keyongtech.com/464233-bundling-net-cf-v2-0-aAnonymous
January 24, 2009
PingBack from http://www.adivor.it/forum/f57/ritornare-pseudo-desktop-desktop-windows-ce-12145/index2.html#post103509Anonymous
February 06, 2009
PingBack from http://www.iadventuregame.com/iadventuregame/page/Support.aspxAnonymous
February 06, 2009
PingBack from http://www.iadventuregame.com/iadventuregame/post/Product-Support.aspxAnonymous
February 18, 2009
PingBack from http://www.pockster.com/page/Support.aspxAnonymous
February 18, 2009
PingBack from http://www.pockster.com/post/Support.aspxAnonymous
June 15, 2009
PingBack from http://einternetmarketingtools.info/story.php?id=15731