Changeset 9963 for trunk/src


Ignore:
Timestamp:
Mar 31, 2003, 1:54:29 PM (22 years ago)
Author:
sandervl
Message:

PF: Added vsnprintfW/snprintfW funcs for syncing with latest wine NTDLL + KDO: Made Pe2Lx dlls work again

Location:
trunk/src/kernel32
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/KERNEL32.DEF

    r9889 r9963  
    1 ; $Id: KERNEL32.DEF,v 1.153 2003-03-03 16:37:26 sandervl Exp $
     1; $Id: KERNEL32.DEF,v 1.154 2003-03-31 11:54:27 sandervl Exp $
    22
    33;Basis is Windows95 KERNEL32
     
    12081208
    12091209    OSLibDosDevIOCtl                                              @2026 NONAME
     1210   
     1211    vsnprintfW                                                    @2030 NONAME
     1212    snprintfW                                                     @2031 NONAME
    12101213
    12111214; custom dll hook installer
  • trunk/src/kernel32/kernel32dbg.def

    r9889 r9963  
    1 ; $Id: kernel32dbg.def,v 1.28 2003-03-03 16:37:27 sandervl Exp $
     1; $Id: kernel32dbg.def,v 1.29 2003-03-31 11:54:28 sandervl Exp $
    22
    33;Basis is Windows95 KERNEL32
     
    12091209    OSLibDosDevIOCtl                                              @2026 NONAME
    12101210
     1211    vsnprintfW                                                    @2030 NONAME
     1212    snprintfW                                                     @2031 NONAME
     1213
    12111214; custom dll hook installer
    12121215    _ODIN_SetDllLoadCallback@4                                    @2100 NONAME
  • trunk/src/kernel32/unicode/string.c

    r8666 r9963  
    77#include <windows.h>
    88#include <limits.h>
     9#include <stdio.h>
     10#include <ctype.h>
    911
    1012#include "wine/unicode.h"
     
    273275  return 0L;
    274276}
     277
     278int vsnprintfW(WCHAR *str, unsigned int len, const WCHAR *format, va_list valist)
     279{
     280    unsigned int written = 0;
     281    const WCHAR *iter = format;
     282    char bufa[256], fmtbufa[64], *fmta;
     283
     284    while (*iter)
     285    {
     286        while (*iter && *iter != '%')
     287        {
     288            if (written++ >= len)
     289                return -1;
     290            *str++ = *iter++;
     291        }
     292        if (*iter == '%')
     293        {
     294            fmta = fmtbufa;
     295            *fmta++ = *iter++;
     296            while (*iter == '0' ||
     297                   *iter == '+' ||
     298                   *iter == '-' ||
     299                   *iter == ' ' ||
     300                   *iter == '0' ||
     301                   *iter == '*' ||
     302                   *iter == '#')
     303            {
     304                if (*iter == '*')
     305                {
     306                    char *buffiter = bufa;
     307                    int fieldlen = va_arg(valist, int);
     308                    sprintf(buffiter, "%d", fieldlen);
     309                    while (*buffiter)
     310                        *fmta++ = *buffiter++;
     311                }
     312                else
     313                    *fmta++ = *iter;
     314                iter++;
     315            }
     316
     317            while (isdigit(*iter))
     318                *fmta++ = *iter++;
     319
     320            if (*iter == '.')
     321            {
     322                *fmta++ = *iter++;
     323                if (*iter == '*')
     324                {
     325                    char *buffiter = bufa;
     326                    int fieldlen = va_arg(valist, int);
     327                    sprintf(buffiter, "%d", fieldlen);
     328                    while (*buffiter)
     329                        *fmta++ = *buffiter++;
     330                }
     331                else
     332                    while (isdigit(*iter))
     333                        *fmta++ = *iter++;
     334            }
     335            if (*iter == 'h' || *iter == 'l')
     336                *fmta++ = *iter++;
     337
     338            switch (*iter)
     339            {
     340            case 's':
     341            {
     342                static const WCHAR none[] = { '(','n','u','l','l',')',0 };
     343                const WCHAR *wstr = va_arg(valist, const WCHAR *);
     344                const WCHAR *striter = wstr ? wstr : none;
     345                while (*striter)
     346                {
     347                    if (written++ >= len)
     348                        return -1;
     349                    *str++ = *striter++;
     350                }
     351                iter++;
     352                break;
     353            }
     354
     355            case 'c':
     356                if (written++ >= len)
     357                    return -1;
     358                *str++ = (WCHAR)va_arg(valist, int);
     359                iter++;
     360                break;
     361
     362            default:
     363            {
     364                /* For non wc types, use system sprintf and append to wide char output */
     365                /* FIXME: for unrecognised types, should ignore % when printing */
     366                char *bufaiter = bufa;
     367                if (*iter == 'p')
     368                    sprintf(bufaiter, "%08lX", va_arg(valist, long));
     369                else
     370                {
     371                    *fmta++ = *iter;
     372                    *fmta = '\0';
     373                    if (*iter == 'f')
     374                        sprintf(bufaiter, fmtbufa, va_arg(valist, double));
     375                    else
     376                        sprintf(bufaiter, fmtbufa, va_arg(valist, void *));
     377                }
     378                while (*bufaiter)
     379                {
     380                    if (written++ >= len)
     381                        return -1;
     382                    *str++ = *bufaiter++;
     383                }
     384                iter++;
     385                break;
     386            }
     387            }
     388        }
     389    }
     390    if (written >= len)
     391        return -1;
     392    *str++ = 0;
     393    return (int)written;
     394}
     395
     396
     397int snprintfW(WCHAR *str, unsigned int len, const WCHAR *format, ...)
     398{
     399    int retval;
     400    va_list valist;
     401    va_start(valist, format);
     402    retval = vsnprintfW(str, len, format, valist);
     403    va_end(valist);
     404    return retval;
     405}
  • trunk/src/kernel32/windllpe2lx.cpp

    r9540 r9963  
    1 /* $Id: windllpe2lx.cpp,v 1.13 2002-12-20 12:40:43 sandervl Exp $ */
     1/* $Id: windllpe2lx.cpp,v 1.14 2003-03-31 11:54:28 sandervl Exp $ */
    22
    33/*
     
    167167 * Init object.
    168168 * Must be called immedeately after objecte construction.
    169  * @returns   Success indicator. (TRUE == success)
    170  * @sketch    call init method of the parten class.
    171  *            set dllEntryPoint
    172  * @status    completely implemented.
    173  * @author    knut st. osmundsen
    174  */
    175 BOOL Win32Pe2LxDll::init()
    176 {
    177     if (Win32Pe2LxImage::init())
     169 * @returns LDRERROR_SUCCESS on success.
     170 * @returns Apporpriate LDRERROR_* on failure.
     171 * @sketch  call init method of the parten class.
     172 *          set dllEntryPoint
     173 * @status  completely implemented.
     174 * @author  knut st. osmundsen
     175 */
     176DWORD Win32Pe2LxDll::init()
     177{
     178    DWORD rc = Win32Pe2LxImage::init();
     179    if (rc == LDRERROR_SUCCESS)
    178180    {
    179181        /* set entry point. */
    180182        dllEntryPoint = (WIN32DLLENTRY)entryPoint;
    181183    }
    182     else
    183         return FALSE;
    184     return TRUE;
     184    return rc;
    185185}
    186186
  • trunk/src/kernel32/windllpe2lx.h

    r6015 r9963  
    1 /* $Id: windllpe2lx.h,v 1.2 2001-06-15 09:42:48 bird Exp $ */
     1/* $Id: windllpe2lx.h,v 1.3 2003-03-31 11:54:28 sandervl Exp $ */
    22
    33/*
     
    2727    Win32Pe2LxDll(HINSTANCE hinstance, BOOL fWin32k) throw(ULONG);
    2828    virtual     ~Win32Pe2LxDll();
    29     BOOL        init();
     29    DWORD       init();
    3030
    3131    /** @cat Query */
  • trunk/src/kernel32/winimagepeldr.cpp

    r9826 r9963  
    1 /* $Id: winimagepeldr.cpp,v 1.105 2003-02-18 18:58:47 sandervl Exp $ */
     1/* $Id: winimagepeldr.cpp,v 1.106 2003-03-31 11:54:28 sandervl Exp $ */
    22
    33/*
     
    186186
    187187    hFile = OSLibDosOpen(szFileName, OSLIB_ACCESS_READONLY|OSLIB_ACCESS_SHAREDENYNONE);
    188  
     188
    189189    dprintf((LOG, "KERNEL32-PELDR: Opening PE-image (%s) returned handle %08xh.\n",
    190190             szFileName,
     
    198198        }
    199199    }
    200  
     200
    201201    //default error:
    202202    strcpy(szErrorModule, OSLibStripPath(szFileName));
     
    702702            return rc;
    703703        }
    704      
     704
    705705      // PH 2001-11-15
    706706      // For corrupt or misinterpreted PE headers,
     
    15971597        char   szModuleFailure[CCHMAXPATH] = "";
    15981598        ULONG  hInstanceNewDll;
    1599         Win32LxDll *lxdll;
    16001599
    16011600        char *dot = strchr(modname, '.');
     
    16101609            return NULL;
    16111610        }
    1612         lxdll = Win32LxDll::findModuleByOS2Handle(hInstanceNewDll);
    1613         if(lxdll == NULL) {//shouldn't happen!
     1611        /* bird 2003-03-30: search pe2lx dlls too! */
     1612        WinDll = Win32DllBase::findModuleByOS2Handle(hInstanceNewDll);
     1613        if (WinDll == NULL) {//shouldn't happen!
    16141614            dprintf((LOG, "Just loaded the dll, but can't find it anywhere?!!?"));
    16151615            errorState = ERROR_INTERNAL;
    16161616            return NULL;
    16171617        }
    1618         lxdll->setDllHandleOS2(hInstanceNewDll);
    1619         if(lxdll->AddRef() == -1) {//-1 -> load failed (attachProcess)
    1620             dprintf((LOG, "Dll %s refused to be loaded; aborting", modname));
    1621             delete lxdll;
    1622             errorState = ERROR_INTERNAL;
    1623             return NULL;
    1624         }
    1625         WinDll = (Win32DllBase*)lxdll;
     1618        if (WinDll->isLxDll())
     1619        {
     1620            Win32LxDll *lxdll = (Win32LxDll *)WinDll;
     1621            lxdll->setDllHandleOS2(hInstanceNewDll);
     1622            if(lxdll->AddRef() == -1) {//-1 -> load failed (attachProcess)
     1623                dprintf((LOG, "Dll %s refused to be loaded; aborting", modname));
     1624                delete lxdll;
     1625                errorState = ERROR_INTERNAL;
     1626                return NULL;
     1627            }
     1628            WinDll = (Win32DllBase*)lxdll;
     1629        }
    16261630    }
    16271631    else {
     
    21132117    //Name exports also contain an ordinal, so check this
    21142118    nexport = nameexports;
    2115     for(int i=0;i<nrNameExports;i++) 
     2119    for(int i=0;i<nrNameExports;i++)
    21162120    {
    21172121        if(nexport->ordinal == ordinal) {
Note: See TracChangeset for help on using the changeset viewer.