Windows CE .NET 4.2 Product Update Rollup, December 31, 2007

 

2008 Microsoft Corporation. All rights reserved.

 

 

How to install this update

All updates for Windows CE .NET 4.2 require the following:

 

1) Platform Builder .NET 4.2 is installed on the machine.

2) Upon installing the update, the platforms must be rebuilt.

 

Please download the file(s) most appropriate for your installation, as follows:

 

 
WinCEPB42-071231-Product-Update-Rollup-ARMV4I.MSI     For installation based upon ARMV4I processors
WinCEPB42-071231-Product-Update-Rollup-ARMV4.MSI     For installation based upon ARMV4 processors
WinCEPB42-071231-Product-Update-Rollup-MIPSII_FP.MSI     For installation based upon MIPSII-FP processors
WinCEPB42-071231-Product-Update-Rollup-MIPSII.MSI     For installation based upon MIPSII processors
WinCEPB42-071231-Product-Update-Rollup-MIPSIV_FP.MSI     For installation based upon MIPSIV-FP processors
WinCEPB42-071231-Product-Update-Rollup-MIPSIV.MSI     For installation based upon MIPSIV processors
WinCEPB42-071231-Product-Update-Rollup-SH3.MSI     For installation based upon SH3 processors
WinCEPB42-071231-Product-Update-Rollup-SH4.MSI     For installation based upon SH4 processors
WinCEPB42-071231-Product-Update-Rollup-X86.MSI     For installation based upon X86-based processors

 

 

This package will install all updates directly to the build environment specified by the original Platform Builder installation.  This is specified by the following registry key: HKLM\Software\Microsoft\Platform Builder\&!&\Directories - "OS Install Root".  By default, a backup of all updated files will be maintained at the following location:  %_WINCEROOT%\Updates\Backup.  You can remove any files from this directory at your choosing.

 

Note:

If you have trouble installing package on Windows Vista, open command prompt, choose "Run as administrator", confirm UAC prompt, launch an update.

 

If you have installed previous updates

If you have installed previous updates, this package will update your build environment to include the latest files for this component.

 

If you see "Files that will not be installed"

If this message is displayed, it means that you have an update installed with a later version of the files then those that are being installed.  You already have the updates mentioned in this document including some updates released later.  This message is displayed to prevent accidental overwrite of the latest update to that particular component.

 

Note:

If source files have been modified by a user, they may not be overwritten by the files provided with the updates if Date Modified of the files on user's machine is newer.

 

If you reinstall or repair Platform Builder

If you uninstall or repair Platform Builder .NET 4.2, you have to remove corresponding WinCEPBxx.ini file located in %WINDIR%.

 

By Component:

 

Component:  1394 Bus

Component:  1394 SBP-2

Component:  ActiveSync

Component:  AFD

Component:  ATL

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       others\atl\include\ATLCOM.H

Component:  Bluetooth

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\common\oak\drivers\bluetooth\transports\bcsp\csr\hcibcsp.cpp
       public\common\oak\inc\bt_ioctl.h
       public\common\oak\lib\ARMV4\debug\btdrt.def
       public\common\oak\lib\ARMV4\retail\btdrt.def
       public\common\oak\lib\ARMV4I\debug\btdrt.def
       public\common\oak\lib\ARMV4I\retail\btdrt.def
       public\common\oak\lib\MIPSII\debug\btdrt.def
       public\common\oak\lib\MIPSII\retail\btdrt.def
       public\common\oak\lib\MIPSII_FP\debug\btdrt.def
       public\common\oak\lib\MIPSII_FP\retail\btdrt.def
       public\common\oak\lib\MIPSIV\debug\btdrt.def
       public\common\oak\lib\MIPSIV\retail\btdrt.def
       public\common\oak\lib\MIPSIV_FP\debug\btdrt.def
       public\common\oak\lib\MIPSIV_FP\retail\btdrt.def
       public\common\oak\lib\SH3\debug\btdrt.def
       public\common\oak\lib\SH3\retail\btdrt.def
       public\common\oak\lib\SH4\debug\btdrt.def
       public\common\oak\lib\SH4\retail\btdrt.def
       public\common\oak\lib\x86\debug\btdrt.def
       public\common\oak\lib\x86\retail\btdrt.def
       public\common\sdk\inc\bt_api.h
       private\winceos\COMM\bluetooth\rfcomm\portemu.cxx
       private\winceos\COMM\bluetooth\rfcomm\rfcomm.cxx
       private\winceos\COMM\bluetooth\runtime\btdrt.cxx
       private\winceos\COMM\bluetooth\runtime\btdrt.def
       private\winceos\COMM\bluetooth\sys\btd.cxx
       private\winceos\COMM\bluetooth\tdi\tdi.cxx     
       public\common\oak\drivers\bluetooth\sample\btdc\btclient.cxx
       public\common\oak\inc\bt_ddi.h
       private\winceos\COMM\bluetooth\hci\base\hci.cxx

       public\common\oak\drivers\bluetooth\sample\btcp\btcp.cxx

       private\winceos\comm\bluetooth\sdp\base\btsdpcon.cpp
       private\winceos\comm\bluetooth\sdp\inc\btsdp.h

Component:  CEDRMUTIL

Component:  CELOG

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       private\winceos\COREOS\nk\celog\celog.c
       private\winceos\COREOS\nk\kernel\profiler.c

Component:  CEMGR

Component:  Certificates

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

     
 private\test\gwes\gdi\gdiapi\global.cpp

Component:  CETK

If the user is testing a device that does not have a KITL connection to Platform Builder, the user may specify a location accessible to the device, such as a storage card attached to the device or a writable network share. To enable bitmap creation in the release directory, pass the parameter /o to the test dll.

 

To enable bitmap creation in a user specified location, pass /o followed by the path where the bitmap should be stored. The bitmaps can be saved to any location the device has a write access to. Please be certain the location exists before attempting to run the test.

 

To pass the parameter from the tux command line to the test dll, use the tux -c parameter, encapsulating the full text of the /o option in the double quotes.

 

For example, to save the test failure bitmaps to a compact flash card, append -c"/o \storage card" to the existing command line as it appears in the CETK. The full command line would appear as 'tux -o -d gdiapi -c"/o \storage card"'.

Component:  Codecs

Component:  Comm

[HKEY_LOCAL_MACHINE\Comm\Tcpip\Parms]

"IGMPVersion"=dword:3

 

If the value does not exist, IGMPv3 will be used to connect to a router.

If the value is set to dword:2, it will use IGMPv1 to connect to a router.

If the value is set to dword:3, it will use IGMPv2 to connect to a router.

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

private\winceos\COMM\bluetooth\sys\btd.cxx

private\winceos\comm\bluetooth\hci\base\sources

public\common\oak\drivers\netui\getuser.c
public\common\oak\drivers\netui\netui.def
public\common\oak\inc\eap.h
public\common\oak\lib\ARMV4\debug\netui.def
public\common\oak\lib\ARMV4\retail\netui.def
public\common\oak\lib\ARMV4I\debug\netui.def
public\common\oak\lib\ARMV4I\retail\netui.def
public\common\oak\lib\MIPSII\debug\netui.def
public\common\oak\lib\MIPSII\retail\netui.def
public\common\oak\lib\MIPSII_FP\debug\netui.def
public\common\oak\lib\MIPSII_FP\retail\netui.def
public\common\oak\lib\MIPSIV\debug\netui.def
public\common\oak\lib\MIPSIV\retail\netui.def
public\common\oak\lib\MIPSIV_FP\debug\netui.def
public\common\oak\lib\MIPSIV_FP\retail\netui.def
public\common\oak\lib\SH3\debug\netui.def
public\common\oak\lib\SH3\retail\netui.def
public\common\oak\lib\SH4\debug\netui.def
public\common\oak\lib\SH4\retail\netui.def
public\common\oak\lib\x86\debug\netui.def
public\common\oak\lib\x86\retail\netui.def

Component:  Common Controls

Component:  Compiler

Component:  Core

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

private\winceos\COREOS\core\dll\time.c

Component:  Core GWES

The file(s) with the new public source code changes for this component can be found in the directory %_WINCEROOT%\:

     private\winceos\coreos\gwe\mgdi\inc\gdiobj.h

Component:  Cursor

Component:  Database API

Component:  DCOM

Component:  Debugger

Component:  DHCP

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

private\winceos\COMM\dhcp\autonet.c
private\winceos\COMM\dhcp\dhcp.c
private\winceos\COMM\dhcp\dhcpp.h
private\winceos\COMM\dhcp\init.c
private\winceos\COMM\dhcp\packet.c
private\winceos\COMM\inc\dhcp.h

private\winceos\comm\dhcp\globals.h

Component:  Diffbin

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

private\winceos\coreos\nk\tools\romimage\diffbin\imgdata.cpp

Component:  DirectDVD

Component:  DirectX

        Description of the issues addressed in this update:

 

·   Improvements to the broadcast stream that decrease startup latency.

·   Updates to the buffering startup time in order not to loose packets at the beginning of the streaming process.

·   Add an ability to hold more buffered data for MSB streams.

·   Improvements to the incomplete objects handling.

·   Improvements to video DMO and overlay mixer interaction in order to make connections possible.

·   Address macro-blocking issue that may occur with some encoded content.

Inside the DRM OCX

The support for such a feature either has to come from the client side or the server side.  Windows CE provide a way for the client to be notified that a DRM license has been successfully acquired.  The OCX will call the GetExternal method of IDocHostUIHandler which will return an IDispatch interface from the host application of the browser.  The final stage is for the OCX to call "LicenseAcquired" that has been exposed by the host application of the browser.   The function has one parameter which is a BOOL where TRUE indicates that a license has been acquired and FALSE otherwise.

Inside the host application of the browser

To set up the proper calling sequence the host application of the browser must enable the "LicenseAcquired" method by first enabling an IDispatch interface to be returned.

// IDocHostUIHandler methods

STDMETHOD(GetExternal)(IDispatch **ppDispatch)

{ *ppDispatch = (IDispatch *)this; return S_OK ; }

Note that the application can implement a separate object for IDispatch requests instead of using ‘this’ in GetExternal.

When a license is acquired, the OCX initiates call to IDispatch::Invoke.  Therefore inside your implementation of IDispatch::Invoke a new dispatch ID is required. 

#define DISPID_LICENSEACQUIRED            <nnn>

    [id(DISPID_LICENSEACQUIRED), helpstring("Fired when License is acquired."), helpcontext(0x0000)]

    HRESULT LicenseAcquired([in] VARIANT_BOOL varResult );

Now you can modify IDispatch::Invoke method on the following lines:

case DISPID_LICENSEACQUIRED :

    VARIANT_BOOL fAcquired;

fAcquired = pdparams->rgvarg[0].boolVal;

    LicenseAcquired( fAcquired ) ;

    break ;

where definition of LicenseAcquired can be as follows:

HRESULT       LicenseAcquired( VARIANT_BOOL varRestult )

{

MessageBox(NULL, L"License”, "Notification",MB_OK|MB_ICONSTOP);

...

...

return S_OK ;

}

At this point you have received notification on the status of a license and can make further callouts as necessary as shown by the code snippet.

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\directx\cesysgen\makefile

       public\directx\sdk\inc\axcore.idl

       public\directx\sdk\inc\playlist.h

       public\directx\sdk\inc\strmif.h

       public\directx\sdk\samples\ddvd\dvdsample\appstate.cpp
       public\directx\sdk\samples\ddvd\dvdsample\appstate.h
       public\directx\sdk\samples\ddvd\dvdsample\dvdcore.cpp
       public\directx\sdk\samples\ddvd\dvdsample\dvdcore.h
       public\directx\sdk\samples\ddvd\dvdsample\dvdsink.cpp
       public\directx\sdk\samples\ddvd\dvdsample\sinkmsg.h

       public\directx\sdk\inc\dvdnav.h
       public\directx\sdk\inc\dvdnav.idl

       public\directx\oak\files\directx.reg

       private\servers\smbprint\dialects\pc_net_prog.cpp
       private\servers\smbprint\fileserver\code\fileserver.cpp
       private\servers\smbprint\inc\fileserver.h
       private\servers\smbprint\inc\smbpackets.h

Component:  EAP/CHAP

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\common\oak\inc\netui.h

Component:  EAPOL

Component:  Edit Control

Component:  FAL

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\common\oak\drivers\fsd\fatutil\main\formatdisk.cpp

Component:  FATUTIL

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\common\oak\drivers\fsd\fatutil\main\formatdisk.cpp

Component:  FILESYS

For the first issue, the update checks that El Torito is not considered as a valid volume descriptor. For the second, it makes sure that we default to the recognized file system on those CDs which have multiple SVDs containing at least one unsupported file system (regardless of the order of SVDs).

 

NOTE:  This was formerly released as update 030731_KB824427.  That is the incorrect KB article number.  All references to this update are now changes to 030731_KB824247.

This registry key has to be enabled in order to force LFN generation:

[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]
"Flags"=dword:00800064

The file(s) with the new public source code changes for this component can be found in directory %_WINCEROOT%\:

public\common\oak\drivers\block\msflashfmd\sdnpci\fmd.cpp
public\common\oak\drivers\ethdbg\bootpart\bootpart.cpp

private\winceos\COREOS\fsd\fatfs\cache.c
private\winceos\COREOS\fsd\fatfs\find.c

private\winceos\COREOS\storage\dospart\part.cpp

private\winceos\COREOS\fsd\udfs\udfscdfs.cpp

private\winceos\COREOS\fsd\fatfs\fatfs.h

private\winceos\COREOS\fsd\fatfs\find.c

private\winceos\COREOS\fsd\fatfs\name.c

private\winceos\COREOS\storage\fsdmain\fsdmain.cpp

private\winceos\COREOS\storage\fsdmain\sources

private\winceos\COREOS\storage\fsdserv\fsdalloc.cpp

private\winceos\COREOS\storage\fsdserv\fsdapis.cpp

private\winceos\COREOS\storage\fsdserv\fsdserv.cpp

private\winceos\COREOS\storage\inc\fsdmgrp.h

private\winceos\COREOS\storage\storemgr\storemain.cpp

private\winceos\COREOS\fsd\fatfs\volume.c

private\winceos\coreos\storage\fsdserv\fsdapis.cpp     

private\winceos\coreos\fsd\udfs\udfscln.cpp
private\winceos\coreos\fsd\udfs\udfsfile.cpp
private\winceos\coreos\fsd\udfs\udfsfind.cpp
private\winceos\coreos\fsd\udfs\udfsinit.cpp
private\winceos\coreos\fsd\udfs\udfsio.cpp
private\winceos\coreos\fsd\udfs\udfsmain.cpp

private\winceos\coreos\fsd\udfs\udfs.h

private\winceos\COREOS\fsd\fatfs\path.c

private\winceos\COREOS\fsd\fatfs\misc.c

private\winceos\COREOS\fsd\fatfs\disk.c

private\winceos\COREOS\fsd\fatfs\fat.c  

private\winceos\COREOS\fsd\fatfs\stream.c  

public\shell\oak\hpc\ceshell\copyfilepriv.cpp

private\winceos\COREOS\fsd\fatfs\api.c

Component:  Firewall

Component:  FSDMGR

The registry key which controls this:

 [HKEY_LOCAL_MACHINE\System\StorageManager]

 "PNPThreadPrio256"=dword:<value>

where the <value> is the priority value in hexadecimal.

        The following regkey has to be implemented to enable the fix:

 

               [HKEY_LOCAL_MACHINE\System\StorageManager\<MyProfile>]

               "MountFlags"=dword:40

MountFlags in the storage profile set to dword:40 forces the store to be treated as permanent. All attempts to dismount or to delete partitions will fail.

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       private\winceos\COREOS\storage\storemgr\store.cpp
       private\winceos\COREOS\storage\storemgr\storemain.cpp

       public\common\oak\files\common.reg
       public\common\oak\inc\pwindbas.h
       private\winceos\COREOS\storage\fsdmain\fsdmain.cpp

Component: General

There are two registry settings which control this:

[HKEY_LOCAL_MACHINE\Comm\Tcpip\Parms\NumForwardPackets]

[HKEY_LOCAL_MACHINE\Comm\Tcpip\Parms\MaxNumForwardPackets]

NumForwardPackets specifies the number allocated initially whereas MaxNumForwardPackets specifies the maximum that can be allocated. Note that when MaxNumForwardPackets is greater than NumForwardPackets any allocations made after the NumForwardPackets number of allocations will be slower as these buffers will be allocated/deallocated dynamically. For maximum efficiency NumForwardPackets should be equal to MaxNumForwardPackets in most cases.

Component:  GWES

Component:  Help

Component:  HTTPD

The following registry key have to be added to allow configuration of the Web Server timeout:

[HKEY_LOCAL_MACHINE\COMM\HTTPD\]

"ServerTimeout"=dword:<timeout in ms>

The default timeout is 30000 milliseconds (dword:00007530).

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       private\servers\http\core\request.h
       private\servers\http\auth\auth.cpp
       private\servers\http\auth\ssl.cpp
       private\servers\http\core\httpd.h
       private\servers\http\core\httpmain.cpp
       private\servers\http\extns\extns.cpp
       private\servers\http\extns\extns.h
       private\servers\http\parser\buffio.cpp
       private\servers\http\parser\buffio.h

Component:  IDE

Component:  IE

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\ie\oak\iesample\core\animthrd.cpp
       public\ie\oak\iesample\core\animthrd.h
       public\ie\oak\iesample\core\mainwnd.cpp

Component:  Imaging

Component:  IME

The file(s) with the new public source code changes for this component can be found in directory %_WINCEROOT%\:

public\wceshellfe\oak\inputmethods\korean\msimk\im.cpp
public\wceshellfe\oak\inputmethods\korean\msimk\im.h

public\wceshellfe\oak\inputmethods\korean\msimk\sip_i.c

Component:  IPSec

Component:  IPv6

Component:  IR

Component:  IRCOMM

Component:  Kernel

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       private\winceos\coreos\nk\inc\heap.h

       private\winceos\coreos\nk\kernel\loader.c

Component:  L2TP

Component:  LDAP

Component:  Makeimg

Component:  Messenger

The date on the device must be current in order for Messenger to be able to acquire the proper certificate authentication for MSNP8.

 

If proxy settings are necessary to connect to the Internet, the proxy settings for Windows Messenger must also be set accordingly.

The file(s) with the new public source code changes for this component can be found in directory %_WINCEROOT%\:

public\common\sdk\inc\rtccore.h
public\common\sdk\inc\rtccore.idl
public\common\sdk\inc\rtcerr.h

public\directx\cesysgen\makefile

Component:  MFC

Description of issues addressed in this update:

 

·   An update to implement proper handling of VT_I1, VT_UI2, VT_UI4, VT_R4 and VT_R8 dispatch parameters for SH4, MIPSII_FP and MIPSIV_FP CPUs.

·   Improvement to CPU-specific thunk code according to the correct calling convention for SH3, SH4, MIPSII_FP and MIPSIV_FP.

·   Eliminates a memory leak in dispatch code marshaling.

These are fixes in MFC OLECE400(d).DLL libraries that result in an assert for the described dispatch parameter types, incorrect function parameters and return values on SH3, SH4, MIPSII_FP and MIPSIV_FP platforms.

This update modifies the following MFC source files: dispimpl.h, oledisp1.cpp, oledisp2.cpp, and afxdisp.h. This package also updates the MFC libraries OLECE400(d).DLL. The updated MFC libraries can be redistributed when exporting a platform SDK.

Information for OEMs (Original Equipment Manufacturers):
After applying this update, a platform SDK should be re-exported to update it with the libraries and source files provided by this update. It is not necessary to rebuild any DLLs included in the platform that use the shared MFC DLL.

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

others\mfc\include\MIPS2ThunkBldr.h
others\mfc\include\MIPS4ThunkBldr.h
others\mfc\include\SH4ThunkBldr.h
others\mfc\src\oledisp1.cpp

others\mfc\include\afxdisp.h
others\mfc\src\dispimpl.h
others\mfc\src\oledisp2.cpp

others\mfc\src\wceole.cpp

Component:  MLANG

Component:  MSHTML

Component:  MSPY2

Component:  MSXML

The file(s) with the new public source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\ie\oak\files\ie.reg

Component:  Multimedia

When mapping a frame buffer to virtual memory, write-combining may now be enabled by setting a memory attribute in the kernel. For example:

if(VirtualCopy((void *)(pVirtualAddress, (void *)(pPhysicalAddress >> 8), cbBytesToMap,

                            PAGE_READWRITE | PAGE_PHYSICAL | PAGE_NOCACHE))

{

        CeSetMemoryAttributes(void *)(pVirtualAddress, (void *)(pPhysicalAddress >> 8), cbBytesToMap,

                            PAGE_WRITECOMBINE);

}

Hardware support must also be provided in the OAL via MTRR (Memory Type Range Registers) or the PAT (Page Attribute Table). Sample code changes are provided for the x86 processors. To implement, a user has to add the following lines to OEMInit():

g_dwCPUFeatures = IdentifyCPU();

InitializePATAndMTRR();

Several new functions have been added to cfwpc.c to implement these changes:

WriteMTRRRegPair()

DumpMTRR()

CheckExistingMTRR()

PATSetMemoryAttributes()

MTRRSetMemoryAttributes()

OEMSetMemoryAttributes()

InitializePATAndMTRR()

The file(s) with the new public source code changes for this component can be found in directory %_WINCEROOT%\:

public\common\oak\csp\i486\inc\msr.h
public\common\oak\csp\i486\oal\cfwpc.c
public\common\oak\csp\i486\oal\oeminit.asm
public\common\oak\drivers\display\ati\ati.cpp
public\common\oak\drivers\display\mq200\config.cpp
public\common\oak\drivers\display\perm3\memory.c
public\common\oak\drivers\display\rflat\rflat.cpp
public\common\oak\drivers\display\tvia5000\config.cpp
public\common\oak\drivers\display\vgaflat\gpeflat.cpp
public\common\oak\inc\pkfuncs.h

public\common\sdk\inc\winnt.h

private\winceos\COREOS\nk\inc\kernel.h
private\winceos\COREOS\nk\inc\kwin32.h
private\winceos\COREOS\nk\inc\mem_x86.h

private\winceos\COREOS\nk\inc\nkx86.h

private\winceos\COREOS\nk\kernel\kdriver.c
private\winceos\COREOS\nk\kernel\kwin32.c
private\winceos\COREOS\nk\kernel\virtmem.c

private\winceos\COREOS\nk\kernel\x86\fault.c

Component:  NDIS

The following registry switches have to be applied to address this issue:

For memory-mapped I/O:

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NDIS]

    "NeedsMapToScrap"=dword:1     ; any non-0 value

For bus I/O:

 

        [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NDIS]

            "NeedsMapToScrap"=dword:0

Component:  .Net Compact Framework

·    Fixed crash when SQLClient or SQLServerCe is installed
·    DataRowCollection.Find() method throws wrong exception
·    Fixed erroneous parsing of HttpWebRequest response stream
·    Form does not get the focus when all controls are removed from the form
·    InputPanel Button disappears from MainMenu on Pocket PC 2002
·    InputPanel's EnabledChanged Event fires inspite of setting the enabled property to the same value.
·    IrDAClient.DiscoverDevices device names garbled
·    Memory leak in the NumericUpDown, DomainUpDown, ComboBox and TextBox controls
·    Native Exception occurs when using the get accessor for Control.Capture
·    Navigation bar flickers when new form is being loaded.
·    ObjectDisposedException occurs when DataBinding a control to a form shown via Show()
·    OK button eventually goes away when re-using recycled form for ShowDialog()
·    Setting the InputPanel.Enabled property when the form is closing throws an exception
·    SIP button does not go away when the toolbar control is removed from a form that does not have a menu
·    The Focus method does not work correctly for the NumericUpDown and DomainUpDown controls
·    The Text property of a ListView column is reset to "" when removing the column from the ListView and then adding it back
·    ContextMenu: Fixed TreeView issues on Pocket PC 2003
·    ContextMenu: Fixed side effects on controls like Scrollbar and Label
·    ContextMenu: erroneous functionality when bound to ListBox
·    ContextMenu: Showing a context menu on Pocket PC for a textbox unselects the selected text in the textbox
·    ContextMenu: Empty ContextMenu on Pocket PC should not pop up
·    Web services: After repeatedly canceling asynchronous web request, all web service calls fail
·    Conversion of 0.0F to a string and results in a memory leak
·    Web services: An XmlException is thrown when deserializing a qualified name that has no prefix and there is no default namespace defined
·    Web services: Incorrect handling of null headers in SOAP message
Description of issues addressed in this update:
 
·    Transitions between managed and native code may cause memory leaks on ARM platforms.
·    A NullReferenceException may occur when a Web Method returns an empty array using the xsi:Nil attribute.
·    Modifying the SoapClientMessage.ContentType property does not modify the Http requests ContentType header.
·    Stack corruption may occur on SHx, MIPS and x86 platforms when local variables are created but never used.
·    Invoking a multicase delegate from a catch handler may cause a MissingMethodException on SHx, MIPS and x86 platforms.
·    Command line arguments containing double byte characters may get truncated to a single byte.
·    An ObjectDisposedException may occur when a asynchronous web request is aborted before the response is received.
·    Invoke on a disposed control may hang the application. 
·    An array containing one or more elements may be sent to the Web Service incorrectly.
·    An application may hang when invoking a Web Method that uses multiple XmlElementAttributes on a single argument, member or property.
·    Memory corruption may occur on devices that have the native security model enabled and both .NET CF V1 SP3.
·    Deadlocks may occur when running under severe resource constraints.
·    The issue of the Tool Bars loosing their image on Windows Mobile 2003 SE when removed from the form is addressed by this update.
·    An ObjectDisposedException may occur when the server closes the socket connection
·    Setting the Minimum and Maximum properties of a progress bar may crash the application
·    An exception may occur when adding an image to an imagelist on an Hx4700 and Hx4705
·    Data misalignment may occur on decimal fields in MIPSIV devices

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

public\netcf\cesysgen\makefile
public\netcf\oak\files\netcf.bib
public\netcf\oak\files\netcf.reg

Component:  .NET Compact Framework 2.0 SP1

Note:

.NET Compact Framework 2.0 does not support SH3 processors.

Added Features:

·   Added the Serializable attribute

·   Allow DataGrid cell drawing to be overridden

Fixed Issues:

·   Changing VT_BYREF Variants in managed code could lead to a memory leak

·   Inappropriate caching of current UI culture even after CultureInfo.ClearCachedData is called

·   For the HttpWebRequest method, an uncatchable ObjectDisposedException could occur when exiting an application with
asynchronous requests

·   Visual Studio may hang on setting a Breakpoint in a function with an infinite loop when it is called from the Immediate Window

·   Breakpoints do not work if the cached, managed dlls in the bcl directory differ from the ones on the device

·   Environment.GetFolderPath may return an InvalidOperationException

·   An access violation may occur when accessing .the Controls or .Controls.Count property of a control once it has begun the
disposing process

·   The WebBrowser.DocumentCompleted event is fired in a loop when the DocumentText property contains an image inside of a
table

·   For the HttpWebRequest method, an ArgumentOutOfRangeException may occur when accessing some https:// URLs

·   Timer may break after GetTickCount wraps around (49.7 days)

·   Error may occur when loading the .NET Compact Framework 2.0 on a device using an ActiveSync push

·   Memory leaks may occur when using Com marshaling

·   For the SerialPort class, an IOException may occur when opening a serial port on the IPAQ 4150

·   A call to HttpWebRequest over SSL with a payload greater than 32 KB may hang on the client when SendChunked returns false

·   For the SerialPort class,an uncatchable exception may occur when Bluetooth is turned off

·   A finalizer for the FileStream class may cause the application to crash if a previous IO operation failed

·   PInvoke return types of UIntPtr may throw a NotSupportedException

·   The Debug.WriteLine method in the .NET Compact framework v2.0 is not working

·   For the SerialPort class, virtual serial ports may not get reported by the SerialPort.GetPortNames method

·   When using COM Interop, a VARIANT_BOOL type may get passed incorrectly on ARMV4I

·   The .NET Compact Framework may performs version comparison incorrectly when loading assemblies

·   Corrections needed for Http Abort semantics

·   The DateTime.Now method may throw an ArgumentOutOfRangeException

·   Under certain rare stress conditions, a crash may occur when using CurrentTimeZone.GetDaylightTime and CurrentTimeZone.GetStandardTime

 

Note:   

Dependencies for .NET CF 2.0 are not displayed. This should not affect the build.

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\iabase\oak\misc\cesysgen.bat
       public\netcfv2\netcfv2.cec
       public\netcfv2\cesysgen\makefile
       public\netcfv2\cesysgen\sources
       public\netcfv2\cesysgen\sources.gen
       public\netcfv2\oak\files\netcfv2.bib
       public\netcfv2\oak\files\netcfv2.reg

Component:  .NET Compact Framework 2.0 SP2

Note:

.NET Compact Framework 2.0 does not support SH3 processors.

 

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

     public\netcfv2\cesysgen\makefile

Component:  NetBIOS

The following registry keys are required to enable this fix:

[HKEY_LOCAL_MACHINE\Comm\NetBIOS]
"EnableLoopBack"=dword:1

"EnableLoopBack" must be set to any non-zero value to enable loopback on the device. The default behavior when this value is not present is to disable loopback. The fix also requires a registry entry for a dummy "localhost" adapter, e.g., as follows:

[HKEY_LOCAL_MACHINE\Services\SMBServer]
"AdapterList"="VMINI1;localhost"

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       private\servers\smbprint\transport\netbiostransport.cpp

Component: NETUI

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\common\oak\inc\netui.h

       public\common\oak\drivers\netui\wzcprops.c

Component:  NK

This Registry setting allows unprivileged applications read-only access to SYSTEM files.

[HKEY_LOCAL_MACHINE\System\ObjectStore]

"AllowSystemAccess"=dword:1

This registry key enables a device-side JIT debugger:

[HKEY_LOCAL_MACHINE\Debug]

"LaunchJITOnFirstChance"=dword:1

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

private\winceos\COREOS\nk\kernel\kmisc.c

private\winceos\COREOS\nk\kernel\loader.c

private\winceos\COREOS\nk\kernel\schedule.c

private\winceos\COREOS\core\dll\apis.c

private\winceos\COREOS\nk\kernel\x86\mdx86.c

private\winceos\COREOS\nk\kernel\arm\mdarm.c

private\winceos\COREOS\nk\mapfile\mapfile.c

private\winceos\COREOS\nk\kernel\pgpool.c

private\winceos\COREOS\nk\kernel\virtmem.c

private\winceos\COREOS\nk\celog\celog.c

private\winceos\COREOS\nk\kernel\profiler.c

private\winceos\coreos\nk\kernel\objdisp.c

Component:  OLE Headers

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\common\sdk\inc\olectl.h

Component:  OLEAUT32

Component:  PDF Viewer

       Description of issues addressed in this update:

·   Provide Adobe Type 1 and Type 3 font support in the PDF viewer

·   Add character mapping support for Korean, Japanese, Chinese (Simplified) and Chinese (Traditional) using the predefined Adobe Character mapping files (CMAPs)

·   Allow PDF files created using Crystal Reports to be correctly opened

·   Allow correct mapping of European characters to the proper Unicode value

·   Support demand loading of pages, provide quick document load times

 

Viewer enhancements and updates

 

This PDF Viewer update adds character mapping support for Korean, Japanese, Chinese (Simplified) and Chinese (Traditional) using the predefined Adobe character mapping files (CMAPs).  The Microsoft PDF viewer uses these character mapping files to map from the character index used in a document to a matching TrueType glyph, using the glyph’s Unicode value.  When a document is opened that requires a predefined mapping, the PDF Viewer will attempt to locate the appropriate character mapping file in the \Windows directory.

 

There are a total of 16 predefined character mapping files provided, four files for each of the four Far East languages.  The table below contains the files required for each language:

 

Japanese

 

Adobe-Japan1-UCS2

90ms-RKSJ-UCS2

90pv-RKSJ-UCS2

90pv-RKSJ-UCS2C

Korean

 

Adobe-Korea1-UCS2

KSCms-UHC-UCS2

KSCpc-EUC-UCS2

KSCpc-EUC-UCS2C

Chinese Simplified

 

Adobe-GB1-UCS2

GBK-EUC-UCS2

GBpc-EUC-UCS2

GBpc-EUC-UCS2C

Chinese Traditional

 

Adobe-CNS1-UCS2

ETen-B5-UCS2

B5pc-UCS2

B5pc-UCS2C

 

 

These tables are not automatically added to the image when the Microsoft PDF Viewer is selected.  The files exist in the following location:

 %_WINCEROOT%\public\viewers\oak\files\pdfviewertbls

During the build process all the files are copied to the %_FLATRELEASEDIR%.  An OEM at that point can use a modified MyProject.BIB file to include the required files.  The files should only be added to the FILES section of the BIB file and by default should be compressed to save space.

 

FILES

Adobe-Japan1-UCS2. %_FLATRELEASEDIR%\CEPC\x86\iabase\retail\ Adobe-Japan1-UCS2.          NK 

 

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

public\viewers\cesysgen\makefile

Component: Performance

·   Optimized forwarding path in networking components (TCP/IP, NAT, firewall and bridge) to increase performance on CPUs with small instruction and data caches.

·   Modified networking components to allocate memory from physical address region to reduce number of TLB misses (most benefit for platforms with SW TLB miss handler). See Enabling IMGLOADNETHIGH section.

·   Modified networking components to allow them to be optionally run from physical address region to reduce number of TLB misses (most benefit for platforms with SW TLB miss handler).

·   Modified interrupts to allow them to be shared among network controllers, which can reduce task switching (and increase performance) in routing scenarios.  In order to take advantage of this change, the OEM will need to implement some changes in the OAL code. See Shared IST section for details.

    There is an additional information for this update at the end of the document.

 

Component:  pIE

Component:  Platform Manager

Component:  Pocket Inbox

Component:  PPP

This update introduces an algorithm to detect if a PPP link is unresponsive by use of the LCP echo request mechanism.  If a link is determined to be idle (no packets received for ½ of the disconnect timeout interval), then the CE PPP implementation will begin sending LCP echo request messages periodically until either a response is received from the peer, or the timeout is exceeded.  If no packets are received for the disconnect timeout interval, the connection is terminated.   Several registry settings exist to configure this behavior, described below:

 

By default, dead link detection is only enabled for PPPoE connections. The specific device types for which it is enabled can be specified by setting the registry value:

[HKEY_LOCAL_MACHINE\Comm\Ppp\Parms]

"LcpIdleDeviceTypes"=multi_sz:<values>

where values are device type strings such as vpn, direct, or pppoe.  Default is pppoe.

 

The following setting can be used to configure the disconnect timeout. Values are in milliseconds. Default is 15000 (15 seconds).

[HKEY_LOCAL_MACHINE\Comm\Ppp\Parms]

“LcpIdleDisconnectMs”=DWORD:<value>

The following can be used to configure the time between sending echo requests when the line is idle.  Values are in milliseconds. Default is 1000 (1 second).

[HKEY_LOCAL_MACHINE\Comm\Ppp\Parms]

“LcpEchoRequestIntervalMs”=DWORD:<value>

Component: PPPoE

The number of buffers was made registry configurable with this fix, using the following registry key:

[HKEY_LOCAL_MACHINE\Comm\PPPOE1\Parms]
   "MaxSendPackets"=dword:30

Where the dword value is the maximum number of transmit buffers.

Component:  PPTP

Component:  RAS

The following registry key must be set in the project.reg file before building an image:

[HKEY_LOCAL_MACHINE\ExtModems\HayesCompat]

"CmdSendDelay"=dword:0xc8

 NOTE: the 0xc8 is a preferred delay value (equating to a delay of 200 msec). The users may have to find a suitable ‘modem command send delay’ value pertaining to their own hardware.

 

The file(s) with the new public source code changes for this component can be found in directory %_WINCEROOT%\:

private\winceos\COMM\tapi\unimodem\modem.c

Component:  RES2EXE.EXE

Component:  RDP

public\rdp\cesysgen\makefile
public\rdp\oak\files\rdp.bib
public\rdp\oak\files\rdp.reg
public\rdp\oak\uit\dirs
public\rdp\oak\uit\filterfs\file.cpp
public\rdp\oak\uit\filterfs\filterfs.h
public\rdp\oak\uit\filterfs\find.cpp
public\rdp\oak\uit\filterfs\main.cpp
public\rdp\oak\uit\filterfs\makefile
public\rdp\oak\uit\filterfs\path.cpp
public\rdp\oak\uit\filterfs\sources

public\iabase\oak\misc\cesysgen.bat

Component:  Redir

Component:  Regcomp

Component:  ROMIMAGE

The file(s) with the new public source code changes for this component can be found in directory %_WINCEROOT%\:

private\winceos\COREOS\nk\tools\romimage\ribld.bat

private\winceos\COREOS\nk\tools\romimage\compbin\compbin.cpp

private\winceos\coreos\nk\tools\romimage\diffbin\reloc.cpp

private\winceos\coreos\nk\tools\romimage\romimage\config.cpp

private\winceos\COREOS\nk\tools\romimage\compbin\config.h

private\winceos\COREOS\nk\tools\romimage\compbin\memory.cpp

private\winceos\COREOS\nk\tools\romimage\compbin\memory.h

private\winceos\COREOS\nk\tools\romimage\compbin\module.cpp

private\winceos\COREOS\nk\tools\romimage\compbin\module.h

private\winceos\COREOS\nk\tools\romimage\compbin\pbtimebomb.h

private\winceos\COREOS\nk\tools\romimage\compbin\romimage.cpp

private\winceos\COREOS\nk\tools\romimage\stampbin\stampbin.c

Component:  Security

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

public\common\oak\files\common.reg

Component:  Script

Component:  SERVICES

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

private\servers\services\lib\servacpt.cpp

Component:  SHDOCVW

Component:  Shell

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

public\shell\oak\hpc\explorer\taskbar\taskbar.cpp

private\shell\shellpsl\haveaygshell\keymap.cpp

Component:  SMBFile

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       private\servers\smbprint\dialects\pc_net_prog.cpp
       private\servers\smbprint\fileserver\code\fileserver.cpp
       private\servers\smbprint\inc\fileserver.h
       private\servers\smbprint\inc\smbpackets.h

Component:  SNMP

Component:  SNTP

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\shell\oak\hpc\explorer\main\dst.cpp
       public\shell\oak\hpc\explorer\main\dst.h
       public\wceshellfe\oak\taskman\dst.cpp
       public\wceshellfe\oak\taskman\dst.h
       private\servers\timesvc\timesvc.cxx

Component:  Software Mixer

Component:  SQL Mobile

Overview:

SQL Mobile update provides SQL Mobile functionality in a new catalog item.  This new catalog item is in the Application and Services Development node next to the SQL Server CE 2.0 catalog.  These catalog items are mutually exclusive; one can be included in a project at a time. 

SQL Mobile on Windows CE .NET 4.2 is not supported for Headless devices.

SQL Mobile on Windows CE .NET 4.2 is not supported on SH3 processors.

Details:

The SQL Mobile catalog item group contains the following items:

Note:

    Dependencies for the components are not displayed. This should not affect the build.

 

To enable support for SQL Mobile .Net 2.0 Data Provider and SQL Server .NET 2.0 Data Provider, a user needs to install .NET CF 2.0 SP1 for Platform Builder 4.2. NetCF 2.0 SP1 is available in the Windows CE .NET 4.2 June monthly update for 2006 and can be downloaded from the following link:

http://www.microsoft.com/downloads/details.aspx?FamilyID=aeef5159-ecd5-4456-830f-97b6c4893d79&DisplayLang=en

Installation Instruction:

1.      Close Platform Builder 4.2.

2.      Run the update.

3.     Run Platform Builder 4.2 and add the new SQL Mobile Catalog item to your workspace.

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\iabase\oak\misc\cesysgen.bat
       public\sqlmobile\sqlmobile.cec
       public\sqlmobile\cesysgen\makefile
       public\sqlmobile\cesysgen\sources
       public\sqlmobile\cesysgen\sources.gen
       public\sqlmobile\oak\files\sqlmobile.bib
       public\sqlmobile\oak\files\sqlmobile.reg

Component:  Stampbin

Component:  TAPI

Component:  TCP/IP

Component:  TFAT

        In the case of FAT12 or FAT16, it is also necessary to specify FATFS_DISABLE_TFAT_REDIR (bit-wise OR with 0x00100000) in the

        registry flags to fix the issue:

        [HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]

        “Flags”=dword:01540054

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       private\winceos\COREOS\fsd\fatfs\api.c
       private\winceos\COREOS\fsd\fatfs\buffer.c
       private\winceos\COREOS\fsd\fatfs\cache.c
       private\winceos\COREOS\fsd\fatfs\cacherw.c
       private\winceos\COREOS\fsd\fatfs\disk.c
       private\winceos\COREOS\fsd\fatfs\fatfs.h
       private\winceos\COREOS\fsd\fatfs\find.c
       private\winceos\COREOS\fsd\fatfs\path.c
       private\winceos\COREOS\fsd\fatfs\volume.c

       private\winceos\COREOS\fsd\fatfs\fat.c

Component:  TimeSVC

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\shell\oak\hpc\explorer\main\dst.cpp
       public\shell\oak\hpc\explorer\main\dst.h
       public\wceshellfe\oak\taskman\dst.cpp
       public\wceshellfe\oak\taskman\dst.h

       public\wceshellfe\oak\ctlpnl\cplmain\cplmain.rc
       public\wceshellfe\oak\ctlpnl\cplmain\cplres.h

Component:  Transcriber

Component:  TV Lens

Component:  UDFS

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       private\winceos\COREOS\fsd\udfs\udfs.h
       private\winceos\COREOS\fsd\udfs\udfscdda.cpp
       private\winceos\COREOS\fsd\udfs\udfscdfs.cpp
       private\winceos\COREOS\fsd\udfs\udfsinit.cpp
       private\winceos\COREOS\fsd\udfs\udfsmain.cpp
       private\winceos\COREOS\fsd\udfs\udfsmnt.cpp
       private\winceos\COREOS\fsd\udfs\udfssrch.cpp
       private\winceos\COREOS\fsd\udfs\udfsudfs.cpp
       private\winceos\COREOS\fsd\udfs\udfscln.cpp
       private\winceos\COREOS\fsd\udfs\udfshelper.h

       private\winceos\coreos\fsd\udfs\udfsfind.cpp

Component:  Unimodem

A new configurable registry key was added in order to provide a delay between commands sent to a modem to accommodate slower-responding modems:

[HKEY_LOCAL_MACHINE\ExtModems]

value: "CmdSendDelay"=DWORD:FA

Where the DWORD value is 0-500ms, entered as a hexadecimal. 250ms (FAh) as shown above is for example purposes only. Your modem may require a larger, smaller or no delay value.


No delay is introduced between commands if the CmdSendDelay value is not present.


If a value greater than 500ms is used it will default to 500ms, as 500ms is the maximum allowable delay this update allows.


The CmdSendDelay value is read from the registry during modem enumeration, so a device reset is generally required if the CmdSendDelay value is added or modified.

The file(s) with the new public source code changes for this component can be found in directory %_WINCEROOT%\:

private\winceos\COMM\tapi\unimodem\modem.c

private\winceos\COMM\tapi\unimodem\dial.c

private\winceos\COMM\tapi\unimodem\misc.c

private\winceos\COMM\tapi\unimodem\tspip.c

Component:  UPnP, TCPIPv6

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

     private\servers\upnp\upnpcapi\upnpcapi.cpp

Component:  URLMON

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\directx\cesysgen\makefile

Component:  Viewers

  • 040423_KB835850 - Image Viewer may not be started using the command line.

Component:  WDMLIB

  • 050204_KB893095 - CXPORT may not properly interpret a timeout value specified at load time by WDMLIB. This may cause some previously queued events to not fire.

Component:  Web Server

  • 040430_KB833270 - Security issue resolved: buffer overrun may occur when using ASP parser on the web server.

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       private\servers\asp\parseext\parseext.cpp

Component:  Windows Media Player

  • 031114_KB830765 - Windows Media Player control may not display when loaded again as a "Windowed" control and displays an assert.

Component:  WININET

Special build instructions:

After applying this update, please perform the "File\Build\Rebuild Platform" operation and perform a clean build of your project.

Component:  WinMgr

Component:  WMP Control

Component:  WPA

The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\common\ddk\inc\nuiouser.h
       public\common\oak\drivers\ndisuio\ndisuio.h
       public\common\oak\drivers\ndisuio\uio_ce.c

Component:  ZeroConfig 802.11

The file(s) with the new public source code changes for this component can be found in the directory %_WINCEROOT%\:

       public\common\ddk\inc\ntddndis.h
       public\common\oak\inc\eapol.h

Additional information for the fixes in the update 031203_KB812950:

 

 

Coding Techniques

Shared IST

 

The performance gain can only be achieved if the miniport driver indicates multiple packets (i.e. using NdisMIndicateReceivePacket ()) and with NDIS_STATUS_SUCCESS (i.e. letting the protocol driver keep the packets for processing). 

 

Before enabling this functionality, please note the following concerns:

  • NDIS assumes that the system runs in ALLKMODE.

  • OEMIntrMask stores the bits mask value of the 1 << IRQ, whereas OEMIntrEnable stores the IRQ number.

To enable the shared IST behavior, the OEM must implement changes in the OEM Abstraction Layer (OAL) code, as illustrated below.  If the query for IOCTL_HAL_SYSINTR_NETWORK returns false, the shared IST functionality is not enabled, and the system will behave as before.

 

Once shared IST changes are enabled, the priority to run MBridge must be overridden in order to effectively implement the MBridge optimizations.  This is accomplished with the following registry key:

[HKEY_LOCAL_MACHINE\Comm\MBRIDGE]

"PRIORITY256"=dword:74

There are 2 shared global variables that are needed between NDIS and the ISR code.  OEMIntrMask stores the bits mask value of the 1 << IRQ, where as OEMIntrEnable stores the IRQ number.

NDIS uses the IOCTL_HAL_SYSINTR_NETWORK to query the address of these variables as shown below:

 

ULONG OEMIntrEnable = 0;
ULONG OEMIntrMask = 0;

BOOL OEMIoControl(

   DWORD code, PVOID pInpBuffer, DWORD inpSize, PVOID pOutBuffer, DWORD outSize,

   DWORD *pOutSize

) {     

   BOOL ok = TRUE;

….
   case IOCTL_HAL_SYSINTR_NETWORK:
      if (outSize < 2*sizeof(ULONG) || pOutBuffer == NULL) {
         ok = FALSE;
         SetLastError(ERROR_INVALID_PARAMETER);
         break;
      }
      ((ULONG*)pOutBuffer)[0] = (ULONG)&OEMIntrMask;
      ((ULONG*)pOutBuffer)[1] = (ULONG)&OEMIntrEnable;
      if (pOutSize != NULL) *pOutSize = 2*sizeof(ULONG);
      break;

...

return ok;

}

The OEMIntrMask variable is updated by the ISR code as the SYSINTR_NETWORK is returned as shown below (MIPS example):

    la   a0, OEMIntrMask
    lw   a1, 0(a0)
    or   a1, (1 << IRQ_MAC1)
    sw   a1, 0(a0)
    j    ra
    li   v0, SYSINTR_NETWORK

 

The OEMIntrEnable variable is updated by NDIS before it calls InterruptDone( ) and InterurptDisable( ) which map to OEMInterruptEnable( ) and OEMInterruptDisable( ) respectively. The HAL code will then need to consider OEMIntrEnable to determine which interrupt to enable or disable.

 

Code sample below:

 

   BOOL OEMInterruptEnable(DWORD sysIntr, LPVOID pvData, DWORD cbData)
   {
      DEBUGMSG(FALSE, (L"+OEMInterruptEnable %d\n", sysIntr));
      switch (sysIntr) {
         case SYSINTR_NETWORK:
            if (OEMIntrEnable == IRQ_PCI) {
               OUT32(PCI_BASE + PCI_INTMASK, PCI_INT_PA);

               OEMIntrEnable = 0x00;
          }
          break;

 

 

Enabling IMGLOADNETHIGH and cxport alloc from physical memory. 

 

On certain architectures and performance-critical scenarios such as network routing, the translation lookaside buffer (TLB) miss handling can have a large impact on performance.  To address this, two optional changes were made to Windows CE .NET 4.2 which enable the network stack direct access to physical memory for critical code and data. First was an option to allocate memory for use by the networking stack out of the kernel memory region (above address 0x80000000). The second change was loading some DLLs’ code into the same region. In Windows CE memory above 0x80000000 is partitioned into two blocks, 0x80000000-0xa0000000 that is mapped to contiguous CACHED physical memory, and 0xa0000000-0xc0000000 which is mapped to UNCACHED physical memory. Both regions are either mapped with larg TLB entries (on x86 or ARM), or CPU architecture defined (SHx or MIPS).  Therefore, code running out of it, as well as data addressed from it generates no TLB miss penalties.

 

To enable the networking stack to allocate from this high memory region, set the following registry key:

[HKEY_LOCAL_MACHINE\Comm\Cxport]

    “PhysHeap”=dword:1

  • Note1: The heap created in high-memory region will not be tracked with LMEMDEBUG.

  • Note2: The heap in high memory region is committed in large blocks (192K, as opposed to page granularity of normal heap), and is not subject to per-page decommit on compacting. As such it is considerably less memory-efficient than the normal heap.

  • Note3: The file(s) to be loaded high must be in the FILES section in the .BIB file.

 

To force loading DLLs into high memory region, in the HAL code, set the following variable early in your OEMInit() function:

extern BOOL (*pfnOEMIsKernelSpaceDll) (LPCWSTR pszDllName);

to a pointer to a function that will be called by the loader every time a DLL is about to load. The function will be passed a pointer to DLL’s name. Return TRUE if the DLL needs to be loaded into high memory space.

Examples of DLLs that could be loaded in high memory region for high-performance networking/routing scenario are: tcpstk, cxport, ndis, mbridge, ipnat, fw6 as well as network and/or wireless network miniport drivers.

 

Modules that are intended to be loaded into high memory area of the kernel space need to have their placement in image adjusted by ROMIMAGE tool (part of makeimg process). This can be done by listing the modules under the FILES section:

Ex. common.bib:

...

FILES

...

ndis.dll    $(_FLATRELEASEDIR)\ndis.dll                 NK  SH

...


or under the MODULES section with the 'K' flag set:

Ex. common.bib:

...

MODULES

...

ndis.dll    $(_FLATRELEASEDIR)\ndis.dll                 NK  SHM

...

Failure to place modules in the FILES section may result in exceptions during device boot time when loading these modules.

 

Note that an uncaught exception in the high-memory region is treated as a kernel exception and causes the entire system to halt!  Debug your platform fully before putting DLLs into the high memory region.

 

Also note that DLLs loaded into a high memory region can only be loaded by a single process.  That is, if a DLL is being used by more than one process, it cannot be loaded into a high memory region or it will fail when the second process tries to load the DLL. These DLLs are also need to be moved to the FILES section from the MODULES section where they reside by default in ce.bib file.

 

Sample implementation of aforementioned logic would be:

#if defined (IMGLOADNETHIGH)

 static LPCWSTR pszSpecialDlls[] = {

    L"tcpstk",

    L"cxport",

    L"ndis",

    L"mbridge",

    L"ipnat",

    L"fw6",

    L"myminiportdriver",

    L”mywirelessminiportdriver”

};

 

static WCHAR lowerW(WCHAR ch) {

    return ((ch >= 'A') && (ch <= 'Z')) ? (ch - 'A' + 'a') : ch;

}

 

static int strcmponeiW(const wchar_t *pwc1, const wchar_t *pwc2) {

    while (*pwc1 && (lowerW(*pwc1) == *pwc2)) {

        pwc1++;

        pwc2++;

    }

    return (*pwc1 ? 1 : 0);

}

 

static int strcmpdllnameW(LPCWSTR src, LPCWSTR tgt) {

    while (*src && (*src == lowerW(*tgt))) {

        src++;

        tgt++;

    }

    return ((*tgt && strcmponeiW(tgt,L".dll") && strcmponeiW(tgt,L".cpl")) || (*src && memcmp(src,L".dll",10) && memcmp(src,L".cpl",10))) ? 1 : 0;

}

 

static BOOL CheckDlls (LPCWSTR pszDllName) {

    int i;

 

    for (i = 0; i < sizeof(pszSpecialDlls)/sizeof(pszSpecialDlls[0]); i ++) {

        if (!strcmpdllnameW (pszSpecialDlls[i], pszDllName)) {

            RETAILMSG (1, (L"CheckDll: %s returns TRUE\r\n", pszDllName));

            return TRUE;

        }

    }

 

    return FALSE;

}

 

extern BOOL (* pfnOEMIsKernelSpaceDll) (LPCWSTR pszDllName);

 

#endif

 

void OEMInit(void)

{

#if defined (IMGLOADNETHIGH)

   pfnOEMIsKernelSpaceDll = CheckDlls;

#endif

Sample steps to pragmatically move the DLLs to the FILES section (This will update ce.bib file during the makeimage process):

 

Create a preromimage.bat file in % _TARGETPLATROOT%\FILES directory with the following text; you may need to modify this script to include/exclude files based on the pszSpecialDlls list.

@echo off

 

IF not "%IMGLOADNETHIGH%"=="1" goto :endfile

 

echo Moving DLLs to the file region

 

pushd %_FLATRELEASEDIR%

 

findstr /I " mbridge.dll ipnat.dll fw6.dll tcpstk.dll cxport.dll ndis.dll myminiportdriver mywirelessminiportdriver  " ce.bib > ce_net.bib

 

findstr /I /v " mbridge.dll ipnat.dll fw6.dll tcpstk.dll cxport.dll ndis.dll myminiportdriver mywirelessminiportdriver " ce.bib > ce_nonet.bib

 

copy /A ce_nonet.bib+ce_net.bib ce.bib

 

popd

 

:endfile

 

The file(s) with the new source code changes for this update can be found in the directory %_WINCEROOT%\


       public\common\cesysgen\makefile
       public\common\ddk\inc\ntcompat.h
       public\common\oak\drivers\ceddk\ddk_time\ddk_time.c
       public\common\oak\inc\nkintr.h
       public\common\oak\inc\pkfuncs.h
       public\common\sdk\inc\winbase.h
       platform\Aspen\inc\oalintr.h
       platform\Aspen\inc\oalintr.inc
       platform\keywest\inc\OALINTR.H
       platform\keywest\inc\OALINTR.INC
       private\winceos\COMM\tcpipw\ipnat\autodial\autodial.c
       private\winceos\COMM\tcpipw\ipnat\autodial\autodprv.h
       private\winceos\COMM\tcpipw\ipnat\autodial\sources
       private\winceos\COMM\tcpipw\ipnat\autodial\status.cpp
       private\winceos\COREOS\core\inc\coredll.h
       private\winceos\COREOS\core\lmem\heap.c
       private\winceos\COREOS\core\lmem\heap.h
       private\winceos\COREOS\core\lmem\rmem.c
       private\winceos\COREOS\nk\kernel\loader.c