© 2002 Microsoft Corporation. All rights reserved.
All QFEs for Windows CE.NET 4.0 require the following:
1) Platform Builder.NET 4.0 is installed on the machine.
2) The current user has run Platform Builder.NET 4.0 at least once.
Please download the file(s) most appropriate for your installation, as follows:
This package will install
all QFEs directly to your build environment. A backup of all updated files
will be maintained at the following location: %_WINCEROOT%\BACKUP.
You can remove any files from this directory at your choosing. If you have installed previous QFEs
(for Windows CE.NET 4.0),
this will update your build environment to include the latest files for this
component. If this message is displayed, it means that you have
installed a QFE package with a later version of the installed file. You
will already have the updates mentioned in this document, including something
later (documented with that later QFE). This message is displayed to
prevent accidental overwrite of the latest Windows CE QFE to that particular
component.
Component:
CEPLAYER 020507_Q321673 - WMP App does Linear-to-Log
conversion, in order to pass Log values into DShow IBasicAudio. IBasicAudio
then reconverts to Linear.
Component:
CONNMC 020501_Q321520 - Unable to create a new connection
after applying QFE 020304_Q316218. Network apps need updating after
implementing the changes associated with that QFE. The changes in bold also need to be made to
public\common\oak\drivers\netsamp\connmc\rasconninfo.cpp: Old function RasConnInfo::GetDevices(): DWORD RasConnInfo::GetDevices(LPRASDEVINFO *
pRasDevInfo) Old function RasConnInfo::GetDevices(): DWORD RasConnInfo::GetDevices(LPRASDEVINFO *
pRasDevInfo)
Component:
Drivers, Mouse 020612_Q323460 - On a touch screen device, when the
screen is rotated the value returned by GetMouseMovePoints() may not be
correct.
Component:
FATFS 020501_Q321627 - Data is not always flushed to disk
when writing small files. This may result in data loss when the card is
ejected. 020501_Q321627 - Filesys.exe leaks up to 2KB memory
with every insertion of a compact flash memory card, and leaks up to 4KB
memory loading icons from the compact flash card. 020517_Q321946 - The FATFSD driver in Windows
CE.Net issues a IOCTL_DISK_DELETE_SECTORS call to the block device driver. It
is optional for the driver to handle this call, but when doing so, the intent
is to clear the sector of data. For some types of media, this can improve wear
usage and performance. The Disk On Chip driver does handle this IOCtl. FATFSD
in CE.Net sends an incorrect sector number in this call, and therefore the
incorrect sector is cleared.
Component:
FSMAIN 020515_Q322128 - When a hive-based registry resides
on an IPSM file system, the user hive and default directory can't be created
at "coldboot" on a clean IPSM file system.
Component: GWES 020515_Q321991 - On Windows CE.Net, the desktop
background colors may be incorrect when a 16-bit bitmap is selected as the
desktop background. For example, a blue-colored 16-bit bitmap may be displayed
as a red-colored bitmap.
Component: IE 020410_Q320233 - When using Microsoft security APIs
through Wininet to create a secure https connection using SSL 3.0, one of the
three documented certificate checks does not take place. Specifically, the
name of the certificate is not checked against the name of the requested url.
This means that any valid digital certificate works with any url - in other
words, there is no server authentication. As a result, the requesting device
is susceptible to simple IP spoofing attacks.
Component:
Kernel 020418_Q320734 - Memory file system performance is
too slow on StrongArm. To resolve this, the function versions of ''memcpy''
and ''memset'' have been enabled. 020517_Q321628 - Perf issue: Need support for
uncached memory that is still bufferable on XScale. 020607_Q323461 - A thread may not be scheduled
properly the first time it is scheduled after the thread is created. Any
interrupt may cause a reschedule away from the thread to a thread of equal
priority, even if the thread quantum time has not expired. This occurs because
the counter for thread quantum time remaining is left set at 0 when a new
thread is created.
Component:
MSHTML 020418_Q320737 - Windows Media Player does not
handle mms:// (NetShow streaming) and instead displays an error message.
Component:
MSPART 020501_Q321278 - GetDOSPartitions call fails in
mspart.dll on some XP formatted CF cards. 020501_Q321627 - Data is not always flushed to disk
when writing small files. This may result in data loss when the card is
ejected. 020501_Q321627 - Filesys.exe leaks up to 2KB memory
with every insertion of a compact flash memory card, and leaks up to 4KB
memory loading icons from the compact flash card. 020517_Q321946 - The FATFSD driver in Windows
CE.Net issues a IOCTL_DISK_DELETE_SECTORS call to the block device driver. It
is optional for the driver to handle this call, but when doing so, the intent
is to clear the sector of data. For some types of media, this can improve wear
usage and performance. The Disk On Chip driver does handle this IOCtl. FATFSD
in CE.Net sends an incorrect sector number in this call, and therefore the
incorrect sector is cleared.
Component: MSTSC 020509_Q320005 - Korean input issue: Unable to
pass Hangul/English toggle key to RDP server's IME, and therefore unable to
Korean characters via TSC client program. The following entry is necessary in RDP.REG: IF LOCALE=0412 ; Fill in correct keyboard type
and subtype values depending on the keyboard [HKEY_LOCAL_MACHINE\Software\Microsoft\Terminal
Server Client] "Keyboard Type"=dword:8 "Keyboard SubType"=dword:2 "Keyboard FunctionKeys"=dword:c "Keyboard Layout"="0x00000412" ENDIF
020630_ARMV4I_WCE40-2002Q2.EXE For installations based upon the ARM V4I family processors 020630_ARMV4T_WCE40-2002Q2.EXE For installations based upon the ARM V4T family processors 020630_ARMV4_WCE40-2002Q2.EXE For installations based upon the ARM V4 family processors 020630_MIPS16_WCE40-2002Q2.EXE For installations based upon the MIPS-16 family processors 020630_MIPSII_FP_WCE40-2002Q2.EXE For installations based upon the MIPS II floating point family processors 020630_MIPSII_WCE40-2002Q2.EXE For installations based upon the MIPS II family processors 020630_MIPSIV_FP_WCE40-2002Q2.EXE For installations based upon the MIPS IV floating point family processors 020630_MIPSIV_WCE40-2002Q2.EXE For installations based upon the MIPS IV family processors 020630_SH3_WCE40-2002Q2.EXE
For installations based upon the Hitachi SH3 processor 020630_SH4_WCE40-2002Q2.EXE For installations based upon the Hitachi SH4 processor 020630_X86_WCE40-2002Q2.EXE For installations based upon the Intel x86 family processors If
You Have Installed Previous QFEs
If
You See "These files were NOT installed"
Fixes
Made in this QFE:
By Component:
{
if (!pRasDevInfo)
return 0;
*p RasDevInfo = NULL;
DWORD cb = 0;
DWORD dwDeviceCount = 0;
DWORD dwRetVal = ::RasEnumDevices(NULL, &cb, &dwDeviceCount);
if (0 == dwRetVal)
{
// Allocate a buffer (CALLER MUST FREE THIS BUFFER!!!)
*pRasDevInfo = reinterpret_cast<LPRASDEVINFO>(new BYTE[cb]);
ASSERT(*pRasDevInfo);
if (*pRasDevInfo)
dwRetVal = ::RasEnumDevices(*pRasDevInfo, &cb, &dwDeviceCount);
else
dwDeviceCount = 0;
}
{
if (!pRasDevInfo)
return 0;
*pRasDevInfo = NULL;
DWORD cb = 0;
DWORD dwDeviceCount = 0;
DWORD dwRetVal = ::RasEnumDevices(NULL, &cb, &dwDeviceCount);
if (0 == dwRetVal)
{
// Allocate a buffer (CALLER MUST FREE THIS BUFFER!!!)
*pRasDevInfo = reinterpret_cast<LPRASDEVINFO>(new BYTE[cb]);
ASSERT(*pRasDevInfo);
// Q321520 begin
if (*pRasDevInfo)
{
(*pRasDevInfo)->dwSize = sizeof(RASDEVINFO);
dwRetVal = ::RasEnumDevices(*pRasDevInfo, &cb, &dwDeviceCount);
}
// Q321520 end
else
dwDeviceCount = 0;
}
The following keyboard driver may also need to be updated if you use a platform which includes it. Listed below is the function that needs to be changed - first is BEFORE, second is AFTER. Changes are noted in BOLD, deletions are noted in RED.
FILE: public\common\oak\csp\HD64465\keymse2\ps2keybd.cpp
BEFORE
DEBUGMSG(ZONE_SCANCODES, (TEXT("ps2keybd.cpp:
ScanCode: %02X\r\n"), ui8ScanCode));
if ( ui8ScanCode == 0xf0 )
{
tfKeyUp = TRUE;
}
else if ( ui8ScanCode == scE0Extended )
{
scInProgress = 0xe000;
}
else if ( ui8ScanCode == scE1Extended )
{
scInProgress = 0xe10000;
}
else if ( scInProgress == 0xe10000 )
{
scInProgress |= ui8ScanCode << 8;
}
else
{
scInProgress |= ui8ScanCode;
if ( ( scInProgress == scPrevious ) && ( tfKeyUp == FALSE ) )
{
// mdd handles auto-repeat so ignore auto-repeats
from keybd
RETAILMSG(1, (TEXT("ScanCode:%02X\r\n"),
scPrevious));
}
else // Not a repeated key. This is the real thing.
{
if ( tfKeyUp == TRUE )
{
KeyStateFlags = 0;
scPrevious = 0x00000000;
}
else
{
KeyStateFlags = KeyStateDownFlag;
scPrevious = scInProgress;
}
cEvents = ScanCodeToVKeyEx(scInProgress,
KeyStateFlags, VKeyBuf, ScanCodeBuf, KeyStateFlagsBuf);
}
scInProgress = 0;
tfKeyUp = FALSE;
}
v_pp2k -> m_pp2p -> KeybdInterruptEnable();
return(cEvents);
}
AFTER
DEBUGMSG(ZONE_SCANCODES, (TEXT("ps2keybd.cpp:
ScanCode: %02X\r\n"), ui8ScanCode));
if ( ui8ScanCode == 0xf0 )
{
tfKeyUp = TRUE;
}
else if ( ui8ScanCode == scE0Extended )
{
scInProgress = 0xe000;
}
else if ( ui8ScanCode == scE1Extended )
{
scInProgress = 0xe10000;
}
else if ( scInProgress == 0xe10000 )
{
scInProgress |= ui8ScanCode << 8;
}
else
{
scInProgress |= ui8ScanCode;
if ( ( scInProgress == scPrevious ) && ( tfKeyUp == FALSE ) )
{
// mdd handles auto-repeat so ignore auto-repeats
from keybd
RETAILMSG(1, (TEXT("ScanCode:%02X\r\n"),
scPrevious));
}
else // Not a repeated key. This is the real thing.
{
/*The Korean keyboard has two keys which generate a single scan code when pressed. The keys don't auto-repeat or generate a scan code on release. The scan codes are 0xf1 and 0xf2. It doesn't look like any other driver uses the 0x71 or 0x72 scan code so it should be safe.
If it is one of the Korean keys, drop the previous scan code. If we didn't, the earlier check to ignore auto-repeating keys would prevent this key from working twice in a row. (Since the key does not generate a scan code on release.)*/
if ( ( scInProgress == 0xf1 ) ||
( scInProgress == 0xf2 ) )
{
KeyStateFlags = KeyStateDownFlag;
scPrevious = 0;
}
else if ( tfKeyUp == TRUE )
if ( tfKeyUp == TRUE )
{
KeyStateFlags = 0;
scPrevious = 0x00000000;
}
else
{
KeyStateFlags = KeyStateDownFlag;
scPrevious = scInProgress;
}
cEvents = ScanCodeToVKeyEx(scInProgress,
KeyStateFlags, VKeyBuf, ScanCodeBuf, KeyStateFlagsBuf);
}
scInProgress = 0;
tfKeyUp = FALSE;
}
v_pp2k -> m_pp2p -> KeybdInterruptEnable();
return(cEvents);
}
Component: MGDI
020430_Q318622 - When calling the BitBlt() API to transfer a monochrome bitmap into a color destination device context the output will always be black and white even if the colors for destination device context are set to different values.
020515_Q321991 - On Windows CE.Net, the desktop background colors may be incorrect when a 16-bit bitmap is selected as the desktop background. For example, a blue-colored 16-bit bitmap may be displayed as a red-colored bitmap.
Component: MSHTML
020524_Q322111 - Simple UI interaction in IE 5.5 may cause a hang when TVLens navigation is in use.
Component: Multimedia
020507_Q320991 - When the user tries to use waveInOpen with WAVE_MAPPER and an ACM codec-supported format, it generates an error and returns MMSYSERR_INVALPARAM.
Component: NDIS
020617_Q322851 - Wireless card will not complete initialization if card is present during cold boot, due to NDIS deadlock.
Component: NETBIOS
020620_Q324364 - Can't allow local names i.e. names that begin with _CERE.
Component: Platform Builder
020520_Q322683 - If both Windows CE.NET Platform Builder and the MSXML Security Update are installed on Windows 2000 or Windows XP, clicking the links on the Start Page inside Platform Builder may cause the IDE to freeze.
Component: RAPISRV, REPLLOG
020409_Q320428 - After connecting and setting up a partnership, the user cannot reconnect to the desktop PC for about 40 seconds. Without a partnership, reconnection always succeed in one second.
Component: SHDOCVW
020418_Q320737 - Windows Media Player does not handle mms:// (NetShow streaming) and instead displays an error message.
020426_Q320253 - When downloading a file from a Web Server the file gets downloaded to the IE 5.5 cache and then copied from the cache to the user selected destination folder. The downloaded file then gets deleted from the cache. During this process twice the file size of free storage memory is required. Moving the file from the cache instead of copying it would only occupy once the file size of free storage memory.
020517_Q321990 - IE5.5 may not respond when downloading a file if the file size is more than half of the free storage memory.
020628_Q324352 - DCR: Request for dialog noting a download failure after applying QFE 020517_Q321990.
Component: STOREMGR
020501_Q321278 - GetDOSPartitions call fails in mspart.dll on some XP formatted CF cards.
Component: WCELDCMD
020424_Q320854 - DCR: Request for WCELoad to have a headless version. This will remove dependencies on shell components that are not needed for a headless configuration.
Instructions for installation:
1. Install the QFE package. This will deliver the WCELDCMD.EXE components into the Platform Builder build environment.
2. Open the workspace for your platform
3. Select the menu Platform->Insert->User Feature...
4. Browse to \WinCE400\Public\DataSync\Oak\Target, then browse into the appropriate directory for your CPU and then to the Retail directory.
5. Change the "Files of Type" combo-box to include EXE files, then select the WCELDCMD.EXE file.
6. In the FeatureView tree, under User Features, select the WCELDCMD.EXE feature. Open the contect menu (right-click) and select Settings.
7. On the BIB Info tab, change the Image Name to "WCELOAD.EXE". The setting for Memory should be "NK" , and the BIB Section should be "MODULES". Make these changes for each build (see drop-down under "Settings For:") If you have multiple CPUs for your platform, make sure to edit the "BIB Contribution" path to pick up the file from the proper location.
8. Optionally, edit the "BIB contribution" path for the Debug build settings to pick up the WCELDCMD.EXE from the Debug branch under DATASYNC
9. Rebuild platform.
Troubleshooting.
If the Activesync component is already in the build, then a build error will occur during the image creation step due to a duplicate WCELOAD file. Platform Builder 4.0 will skip the file and build a BIN image, but report 1 error. To correct the problem, remove the Activesync components, or alter the BIB file to remove the original WCELOAD.
Component: WEBVIEW (pIE)
020402_Q320260 - Webview control shows nothing when codepage is unrecognized.
020422_Q320992 - When Pocket IE finishes downloading and saving a file, the webview control shows a dialog box which says "WebPage - A system shell must be present to support executing folder paths or shell extensions." This is not an issue when using the pIE shell included with Windows CE. However, when an OEM writes a custom shell, this error may occur. To resolve it, this QFE must be applied, and the following change needs to be added to the registry of the device.
The fix checks for a specific registry value:
[HKEY_CURRENT_USER\Software\Apps\PocketIE]
"ExecShellOnFileDownload"=dword:
If the value of "ExecShellOnFileDownload" is equal to '0', then the shell will not be invoked upon file download. For any other value, the shell will be invoked showing the folder containing the recently downloaded file.
The behavior in the absence of the key is that the shell WILL be invoked. The value "ExecShellOnFileDownload" is not present by default so the OEM will have to create it in order to stop shell invocation upon file download.
020510_Q321865 - When attempting to download a .PDF file, pIE tries to display the .pdf file as text instead of prompting the user to download it.
Component: Windows Media Player
020507_Q320990 - Windows Media Player fails to respond to rotation. On a display where the resolution is 240x320, a better way to display a movie clip is rotated 90 degrees in full screen. In full screen with rotation, if the clip is stopped/paused and then resumed again, the image that we get is partially clipped but rotated. Expected behavior is a non-clipped full rotated stream of images.
If you wish to redistribute a Windows Media Player SDK, the following public code changes are required. The following file needs to be updated to include the public code changes. Changes in BOLD should be added to the functions noted below.
To generate new libraries with the associated changes, follow these instructions.
1. In Platform Builder, choose menu option ''Build''-->''Open Build Release Directory''
2. change directory to winutil.cpp directory (e.g cd C:\WINCE400\public\directx\sdk\samples\dshow\BaseClasses
3. type ''build -c''
... strmbase.lib and strmbasehl.lib will be dropped in \public\directx\sdk\lib\...
--
FILE: public\directx\sdk\samples\dshow\BaseClasses\winutil.cpp
Change #1:
LRESULT CBaseWindow::OnReceiveMessage(HWND hwnd, // Window handle
UINT uMsg, // Message ID
WPARAM wParam, // First parameter
LPARAM lParam) // Other parameter
{
ASSERT(IsWindow(hwnd));
if (PossiblyEatMessage(uMsg, wParam, lParam))
return 0;
// This is sent by the IVideoWindow SetWindowForeground method. If the
// window is invisible we will show it and make it topmost without the
// foreground focus. If the window is visible it will also be made the
// topmost window without the foreground focus. If wParam is TRUE then
// for both cases the window will be forced into the foreground focus
#ifndef WINUTIL_STUB
if (uMsg == m_ShowStageMessage) {
BOOL bVisible = IsWindowVisible(hwnd);
SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW |
(bVisible ? SWP_NOACTIVATE : 0));
#ifdef BUGBUG
// Should we bring the window to the foreground
if (wParam == TRUE) {
SetForegroundWindow(hwnd);
}
#else
SetForegroundWindow(hwnd);
// Should we give the window focus
if (wParam == TRUE) {
SetFocus(hwnd);
}
#endif
return (LRESULT) 1;
}
// When we go fullscreen we have to add the WS_EX_TOPMOST style to the
// video window so that it comes out above any task bar (this is more
// relevant to WindowsNT than Windows95). However the SetWindowPos call
// must be on the same thread as that which created the window. The
// wParam parameter can be TRUE or FALSE to set and reset the topmost
if (uMsg == m_ShowStageTop) {
HWND HwndTop = (wParam == TRUE ? HWND_TOPMOST : HWND_NOTOPMOST);
BOOL bVisible = IsWindowVisible(hwnd);
SetWindowPos(hwnd, HwndTop, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE |
(wParam == TRUE ? SWP_SHOWWINDOW : 0) |
(bVisible ? SWP_NOACTIVATE : 0));
return (LRESULT) 1;
}
// New palette stuff
if (uMsg == m_RealizePalette) {
ASSERT(m_hwnd == hwnd);
return OnPaletteChange(m_hwnd,WM_QUERYNEWPALETTE);
}
#endif // WINUTIL_STUB
switch (uMsg) {
#ifndef WINUTIL_STUB
case WM_SETTINGCHANGE:
if (SETTINGCHANGE_RESET == wParam && 0 == lParam) {
DeleteDC(m_MemoryDC);
ReleaseDC(hwnd, m_hdc);
m_hdc = GetDC(hwnd);
m_MemoryDC = CreateCompatibleDC(m_hdc);
}
return (LRESULT) 0;
#endif // WINUTIL_STUB
// Repaint the window if the system colours change
case WM_SYSCOLORCHANGE:
InvalidateRect(hwnd,NULL,FALSE);
return (LRESULT) 1;
// Somebody has changed the palette
case WM_PALETTECHANGED:
OnPaletteChange((HWND)wParam,uMsg);
return (LRESULT) 0;
// We are about to receive the keyboard focus so we ask GDI to realise
// our logical palette again and hopefully it will be fully installed
// without any mapping having to be done during any picture rendering
case WM_QUERYNEWPALETTE:
ASSERT(m_hwnd == hwnd);
return OnPaletteChange(m_hwnd,uMsg);
// Store the width and height as useful base class members
case WM_SIZE:
OnSize(LOWORD(lParam), HIWORD(lParam));
return (LRESULT) 0;
// Intercept the WM_CLOSE messages to hide the window
case WM_CLOSE:
OnClose();
return (LRESULT) 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
Change #2:
BOOL CDrawImage::DrawImage(IMediaSample *pMediaSample)
{
#ifdef WINUTIL_STUB
STUBRET(FALSE);
#else
SetDrawContext();
ASSERT(m_hdc);
ASSERT(m_MemoryDC);
NotifyStartDraw();
// If the output pin used our allocator then the samples passed are in
// fact CVideoSample objects that contain CreateDIBSection data that we
// use to do faster image rendering, they may optionally also contain a
// DirectDraw surface pointer in which case we do not do the drawing
if (m_bUsingImageAllocator == FALSE) {
SlowRender(pMediaSample);
#ifndef UNDER_CE
EXECUTE_ASSERT(GdiFlush());
#endif // UNDER_CE
NotifyEndDraw();
return TRUE;
}
// This is a DIBSECTION buffer
FastRender(pMediaSample);
#ifndef UNDER_CE
EXECUTE_ASSERT(GdiFlush());
#endif // UNDER_CE
NotifyEndDraw();
return TRUE;
#endif // WINUTIL_STUB
}
Component: WININET
020617_Q322827 - If server stops responding before the file is downloaded the CE client aborts the connection too soon.
Component: WINMGR
020503_Q321672 - When a window is dragged and moved, it can be moved outside of the screen area. This may result in a window that the user cannot access because the window is completely outside the defined screen area.