Windows CE.NET 4.0 QFE 020630_2002Q2

 

© 2002 Microsoft Corporation. All rights reserved.

 

 

How to Install this QFE

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:

 

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

 

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

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 You See "These files were NOT installed"

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.

 

 

Fixes Made in this QFE:

 

By Component:

 

Component:  CEPLAYER

Component:  CONNMC

        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)
{
    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;

    }

 

Old function RasConnInfo::GetDevices():

 

DWORD RasConnInfo::GetDevices(LPRASDEVINFO * pRasDevInfo)
{
    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;
}

Component:  Drivers, Mouse

Component:  FATFS

Component:  FSMAIN

Component:  GWES

Component:  IE

Component:  Kernel

Component:  MSHTML

Component:  MSPART

Component:  MSTSC

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

 

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

Component:  MSHTML

Component:  Multimedia

Component:  NDIS

Component:  NETBIOS

Component:  Platform Builder

Component:  RAPISRV, REPLLOG

Component:  SHDOCVW

Component:  STOREMGR

Component:  WCELDCMD

 

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)

                    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.

Component:  Windows Media Player

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.