- Timestamp:
- Aug 5, 1999, 9:45:25 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/message.cpp
r157 r424 1 /* $Id: message.cpp,v 1. 5 1999-06-22 17:25:28phaller Exp $ */1 /* $Id: message.cpp,v 1.6 1999-08-05 19:45:25 phaller Exp $ */ 2 2 3 3 /* … … 24 24 #include <stdarg.h> 25 25 #include "unicode.h" 26 #include "heap.h" 27 #include "heapstring.h" 28 26 29 27 30 //****************************************************************************** … … 105 108 } 106 109 107 #if 1 110 108 111 /*********************************************************************** 109 112 * FormatMessage32A (KERNEL32.138) 110 113 * FIXME: missing wrap,FROM_SYSTEM message-loading, 111 114 */ 112 DWORD WIN32API FormatMessageA( 113 DWORD dwFlags, 114 LPCVOID lpSource, 115 DWORD dwMessageId, 116 DWORD dwLanguageId, 117 LPSTR lpBuffer, 118 DWORD nSize, 119 LPDWORD args /* va_list *args */ 120 ) { 121 LPSTR target,t; 122 DWORD talloced; 123 LPSTR from,f; 124 DWORD width = dwFlags & FORMAT_MESSAGE_MAX_WIDTH_MASK; 125 DWORD nolinefeed = 0; 126 127 dprintf(("KERNEL32: FormatMessageA (%08xh,%s,%08xh,%08xh,%08xh,%08xh,%08xh)\n", 128 dwFlags, 129 lpSource, 130 dwMessageId, 131 dwLanguageId, 132 lpBuffer, 133 nSize, 134 args)); 135 136 from = NULL; 137 138 if (dwFlags & FORMAT_MESSAGE_FROM_STRING) 115 DWORD WIN32API FormatMessageA(DWORD dwFlags, 116 LPCVOID lpSource, 117 DWORD dwMessageId, 118 DWORD dwLanguageId, 119 LPSTR lpBuffer, 120 DWORD nSize, 121 LPDWORD args /* va_list *args */) 122 { 123 /* This implementation is completely dependant on the format of the va_list on x86 CPUs */ 124 LPSTR target, 125 t; 126 DWORD talloced; 127 LPSTR from, 128 f; 129 DWORD width = dwFlags & FORMAT_MESSAGE_MAX_WIDTH_MASK; 130 DWORD nolinefeed = 0; 131 132 dprintf(("KERNEL32: FormatMessageA(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%08xh)\n", 133 dwFlags, 134 lpSource, 135 dwMessageId, 136 dwLanguageId, 137 lpBuffer, 138 nSize, 139 args)); 140 141 if (width) 142 dprintf(("KERNEL32: FormatMessageA - line wrapping not supported.\n")); 143 144 from = NULL; 145 if (dwFlags & FORMAT_MESSAGE_FROM_STRING) 146 from = HEAP_strdupA( GetProcessHeap(), 0, (LPSTR)lpSource); 147 148 if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) 149 { 150 from = (char*)HeapAlloc( GetProcessHeap(),0,200 ); 151 sprintf(from,"Systemmessage, messageid = 0x%08lx\n",dwMessageId); 152 } 153 154 if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE) 155 { 156 INT bufsize; 157 158 dwMessageId &= 0xFFFF; 159 bufsize=LoadMessageA((HMODULE)lpSource,dwMessageId,dwLanguageId,NULL,100); 160 if (bufsize) 161 { 162 from = (char*)HeapAlloc( GetProcessHeap(), 0, bufsize + 1 ); 163 LoadMessageA((HMODULE)lpSource,dwMessageId,dwLanguageId,from,bufsize+1); 164 } 165 } 166 167 target = (char*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 100); 168 t = target; 169 talloced= 100; 170 171 #define ADD_TO_T(c) \ 172 *t++=c;\ 173 if (t-target == talloced) {\ 174 target = (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,talloced*2);\ 175 t = target+talloced;\ 176 talloced*=2;\ 177 } 178 179 if (from) 180 { 181 f=from; 182 183 while (*f && !nolinefeed) 184 { 185 if (*f=='%') 186 { 187 int insertnr; 188 char *fmtstr, 189 *sprintfbuf, 190 *x, 191 *lastf; 192 DWORD *argliststart; 193 194 fmtstr = NULL; 195 lastf = f; 196 f++; 197 198 if (!*f) 199 { 200 ADD_TO_T('%'); 201 continue; 202 } 203 204 switch (*f) 205 { 206 case '1': case '2': case '3': case '4': case '5': 207 case '6': case '7': case '8': case '9': 208 insertnr=*f-'0'; 209 switch (f[1]) 210 { 211 case '0':case '1':case '2':case '3': 212 case '4':case '5':case '6':case '7': 213 case '8':case '9': 214 f++; 215 insertnr=insertnr*10+*f-'0'; 216 f++; 217 break; 218 219 default: 220 f++; 221 break; 222 } 223 224 if (*f=='!') 225 { 226 f++; 227 if (NULL!=(x=strchr(f,'!'))) 228 { 229 *x='\0'; 230 fmtstr = (char*)HeapAlloc(GetProcessHeap(),0,strlen(f)+2); 231 sprintf(fmtstr,"%%%s",f); 232 f=x+1; 233 } 234 else 235 { 236 fmtstr = (char*)HeapAlloc(GetProcessHeap(),0,strlen(f)); 237 sprintf(fmtstr,"%%%s",f); 238 f+=strlen(f); /*at \0*/ 239 } 240 } 241 else 242 if(!args) 243 break; 244 else 245 fmtstr=HEAP_strdupA(GetProcessHeap(),0,"%s"); 246 247 if (args) 248 { 249 if (dwFlags & FORMAT_MESSAGE_ARGUMENT_ARRAY) 250 argliststart=args+insertnr-1; 251 else 252 argliststart=(*(DWORD**)args)+insertnr-1; 253 254 if (fmtstr[strlen(fmtstr)-1]=='s') 255 sprintfbuf = (char*)HeapAlloc(GetProcessHeap(),0,strlen((LPSTR)argliststart[0])+1); 256 else 257 sprintfbuf = (char*)HeapAlloc(GetProcessHeap(),0,100); 258 259 /* CMF - This makes a BIG assumption about va_list */ 260 O32_wvsprintf(sprintfbuf, fmtstr, (va_list) argliststart); 261 x=sprintfbuf; 262 while (*x) 263 { 264 ADD_TO_T(*x++); 265 } 266 267 HeapFree(GetProcessHeap(),0,sprintfbuf); 268 } 269 else 270 { 271 /* NULL args - copy formatstr 272 * (probably wrong) 273 */ 274 while ((lastf<f)&&(*lastf)) 275 { 276 ADD_TO_T(*lastf++); 277 } 278 } 279 280 HeapFree(GetProcessHeap(),0,fmtstr); 281 break; 282 283 case 'n': 284 /* FIXME: perhaps add \r too? */ 285 ADD_TO_T('\n'); 286 f++; 287 break; 288 289 case '0': 290 nolinefeed=1; 291 f++; 292 break; 293 294 default:ADD_TO_T(*f++) 295 break; 296 } 297 } 298 else 299 { 300 ADD_TO_T(*f++) 301 } 302 } 303 *t='\0'; 304 } 305 306 if (!nolinefeed) 139 307 { 140 from = (char *)HeapAlloc(GetProcessHeap(), 141 0, 142 strlen((char*)lpSource) + 1); 143 strcpy (from, 144 (char*)lpSource); 308 /* add linefeed */ 309 if(t==target || t[-1]!='\n') 310 ADD_TO_T('\n'); /* FIXME: perhaps add \r too? */ 145 311 } 146 else147 if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM)148 {149 from = (char *)HeapAlloc(GetProcessHeap(), 0, 200 );150 sprintf(from,"Systemmessage, messageid = 0x%08lx\n",dwMessageId);151 }152 else153 if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE)154 {155 int bufsize;156 157 dwMessageId &= 0xFFFF;158 bufsize=LoadMessageA(0,dwMessageId,dwLanguageId,NULL,100);159 if (bufsize)160 {161 from = (char *)HeapAlloc(GetProcessHeap(), 0, bufsize + 1 );162 LoadMessageA(0,dwMessageId,dwLanguageId,from,bufsize+1);163 }164 }165 166 target = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 100);167 t = target;168 talloced= 100;169 170 #define ADD_TO_T(c) \171 *t++=c;\172 if (t-target == talloced) {\173 target = (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,talloced*2);\174 t = target+talloced;\175 talloced*=2;\176 }177 178 if (from) {179 f=from;180 while (*f) {181 if (*f=='%') {182 int insertnr;183 char *fmtstr,*sprintfbuf,*x,*lastf;184 DWORD *argliststart;185 186 fmtstr = NULL;187 lastf = f;188 f++;189 if (!*f) {190 ADD_TO_T('%');191 continue;192 }193 switch (*f) {194 case '1':case '2':case '3':case '4':case '5':195 case '6':case '7':case '8':case '9':196 insertnr=*f-'0';197 switch (f[1]) {198 case '0':case '1':case '2':case '3':199 case '4':case '5':case '6':case '7':200 case '8':case '9':201 f++;202 insertnr=insertnr*10+*f-'0';203 f++;204 break;205 default:206 f++;207 break;208 }209 if (*f=='!') {210 f++;211 if (NULL!=(x=strchr(f,'!'))) {212 *x='\0';213 fmtstr=(char *)HeapAlloc(GetProcessHeap(),0,strlen(f)+2);214 sprintf(fmtstr,"%%%s",f);215 f=x+1;216 } else {217 fmtstr=(char *)HeapAlloc(GetProcessHeap(),0,strlen(f));218 sprintf(fmtstr,"%%%s",f);219 f+=strlen(f); /*at \0*/220 }221 } else222 fmtstr=strdup("%s");223 if (args) {224 if (dwFlags & FORMAT_MESSAGE_ARGUMENT_ARRAY)225 argliststart=args+insertnr-1;226 else227 argliststart=(*(DWORD**)args)+insertnr-1;228 229 if (fmtstr[strlen(fmtstr)]=='s')230 sprintfbuf=(char *)HeapAlloc(GetProcessHeap(),0,strlen((LPSTR)argliststart[0])+1);231 else232 sprintfbuf=(char *)HeapAlloc(GetProcessHeap(),0,100);233 234 /* CMF - This makes a BIG assumption about va_list */235 vsprintf(sprintfbuf, fmtstr, (va_list) argliststart);236 x=sprintfbuf;237 while (*x) {238 ADD_TO_T(*x++);239 }240 HeapFree(GetProcessHeap(),0,sprintfbuf);241 } else {242 /* NULL args - copy formatstr243 * (probably wrong)244 */245 while (lastf<f) {246 ADD_TO_T(*lastf++);247 }248 }249 HeapFree(GetProcessHeap(),0,fmtstr);250 break;251 case 'n':252 /* FIXME: perhaps add \r too? */253 ADD_TO_T('\n');254 f++;255 break;256 case '0':257 nolinefeed=1;258 f++;259 break;260 default:ADD_TO_T(*f++)261 break;262 263 }264 } else {265 ADD_TO_T(*f++)266 }267 }268 *t='\0';269 }270 271 if (!nolinefeed && t[-1]!='\n')272 ADD_TO_T('\n');273 312 274 313 talloced = strlen(target)+1; … … 277 316 target = (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,nSize); 278 317 } 318 319 //TRACE("-- %s\n",debugstr_a(target)); 279 320 280 321 if (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) … … 288 329 289 330 HeapFree(GetProcessHeap(),0,target); 290 291 if (from) HeapFree(GetProcessHeap(),0,from); 292 293 dprintf(("KERNEL32: FormatMessageA returned %s\n", 294 (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ? 295 *(LPSTR*)lpBuffer: 296 lpBuffer)); 331 if (from) 332 HeapFree(GetProcessHeap(),0,from); 297 333 298 334 return (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ? 299 300 335 strlen(*(LPSTR*)lpBuffer): 336 strlen(lpBuffer); 301 337 } 302 338 #undef ADD_TO_T 339 303 340 304 341 /*********************************************************************** 305 342 * FormatMessage32W (KERNEL32.138) 306 343 */ 307 DWORD WIN32API FormatMessageW( 308 DWORD dwFlags, 309 LPCVOID lpSource, 310 DWORD dwMessageId, 311 DWORD dwLanguageId, 312 LPWSTR lpBuffer, 313 DWORD nSize, 314 LPDWORD args /* va_list *args */ 315 ) { 316 LPSTR target,t; 317 DWORD talloced; 318 LPSTR from,f; 319 DWORD width = dwFlags & FORMAT_MESSAGE_MAX_WIDTH_MASK; 320 DWORD nolinefeed = 0; 321 322 dprintf(("KERNEL32: FormatMessageW\n")); 323 324 from = NULL; 325 if (dwFlags & FORMAT_MESSAGE_FROM_STRING) { 326 from = (char *)HeapAlloc(GetProcessHeap(),0, UniStrlen((UniChar*)lpSource)+1); 327 UnicodeToAscii((LPWSTR)lpSource, from); 328 } 329 else 330 if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) { 331 /* gather information from system message tables ... */ 332 from = (char *)HeapAlloc( GetProcessHeap(),0,200 ); 333 sprintf(from,"Systemmessage, messageid = 0x%08lx\n",dwMessageId); 334 } 335 else 336 if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE) { 337 int bufsize; 338 339 dwMessageId &= 0xFFFF; 340 bufsize=LoadMessageW(0,dwMessageId,dwLanguageId,NULL,100); 341 if (bufsize) 342 { 343 from = (char *)HeapAlloc( GetProcessHeap(), 0, bufsize + 1 ); 344 LoadMessageW(0,dwMessageId,dwLanguageId,(LPWSTR)from,bufsize+1); 345 } 346 } 347 348 target = (char *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 100 ); 349 t = target; 350 talloced= 100; 344 DWORD WINAPI FormatMessageW(DWORD dwFlags, 345 LPCVOID lpSource, 346 DWORD dwMessageId, 347 DWORD dwLanguageId, 348 LPWSTR lpBuffer, 349 DWORD nSize, 350 LPDWORD args /* va_list *args */ ) 351 { 352 /* This implementation is completely dependant on the format of the va_list on x86 CPUs */ 353 LPSTR target,t; 354 DWORD talloced; 355 LPSTR from,f; 356 DWORD width = dwFlags & FORMAT_MESSAGE_MAX_WIDTH_MASK; 357 DWORD nolinefeed = 0; 358 359 dprintf(("KERNEL32: FormatMessageW(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%08xh)\n", 360 dwFlags, 361 lpSource, 362 dwMessageId, 363 dwLanguageId, 364 lpBuffer, 365 nSize, 366 args)); 367 368 if (width) 369 dprintf(("KERNEL32: FormatMessageW - line wrapping not supported.\n")); 370 371 from = NULL; 372 if (dwFlags & FORMAT_MESSAGE_FROM_STRING) 373 from = HEAP_strdupWtoA(GetProcessHeap(),0,(LPWSTR)lpSource); 374 375 if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) 376 { 377 /* gather information from system message tables ... */ 378 from = (char*)HeapAlloc( GetProcessHeap(),0,200 ); 379 sprintf(from,"Systemmessage, messageid = 0x%08lx\n",dwMessageId); 380 } 381 382 if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE) 383 { 384 INT bufsize; 385 386 dwMessageId &= 0xFFFF; 387 bufsize=LoadMessageA((HMODULE)lpSource,dwMessageId,dwLanguageId,NULL,100); 388 if (bufsize) 389 { 390 from = (char*)HeapAlloc( GetProcessHeap(), 0, bufsize + 1 ); 391 LoadMessageA((HMODULE)lpSource,dwMessageId,dwLanguageId,from,bufsize+1); 392 } 393 } 394 395 target = (char*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 100 ); 396 t = target; 397 talloced= 100; 351 398 352 399 #define ADD_TO_T(c) \ 353 354 355 target= (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,talloced*2);\356 t= target+talloced;\357 358 359 360 361 362 while (*f) {363 364 intinsertnr;365 char*fmtstr,*sprintfbuf,*x;366 DWORD*argliststart;367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 400 *t++=c;\ 401 if (t-target == talloced) {\ 402 target = (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,talloced*2);\ 403 t = target+talloced;\ 404 talloced*=2;\ 405 } 406 407 if (from) { 408 f=from; 409 while (*f && !nolinefeed) { 410 if (*f=='%') { 411 int insertnr; 412 char *fmtstr,*sprintfbuf,*x; 413 DWORD *argliststart; 414 415 fmtstr = NULL; 416 f++; 417 if (!*f) { 418 ADD_TO_T('%'); 419 continue; 420 } 421 switch (*f) { 422 case '1':case '2':case '3':case '4':case '5': 423 case '6':case '7':case '8':case '9': 424 insertnr=*f-'0'; 425 switch (f[1]) { 426 case '0':case '1':case '2':case '3': 427 case '4':case '5':case '6':case '7': 428 case '8':case '9': 429 f++; 430 insertnr=insertnr*10+*f-'0'; 431 f++; 432 break; 433 default: 434 f++; 435 break; 436 } 437 if (*f=='!') { 438 f++; 439 if (NULL!=(x=strchr(f,'!'))) 393 440 { 394 441 *x='\0'; 395 fmtstr=(char *)HeapAlloc( GetProcessHeap(), 0, strlen(f)+2); 396 sprintf(fmtstr,"%%%s",f); 397 f=x+1; 398 } else { 399 fmtstr=(char *)HeapAlloc(GetProcessHeap(),0,strlen(f)); 400 sprintf(fmtstr,"%%%s",f); 401 f+=strlen(f); /*at \0*/ 402 } 403 } else 404 fmtstr=strdup("%s"); 405 if (dwFlags & FORMAT_MESSAGE_ARGUMENT_ARRAY) 406 argliststart=args+insertnr-1; 407 else 408 argliststart=(*(DWORD**)args)+insertnr-1; 409 410 if (fmtstr[strlen(fmtstr)]=='s') { 411 DWORD xarr[3]; 412 413 xarr[0]=(DWORD)strdup((char *)(*(argliststart+0))); 414 /* possible invalid pointers */ 415 xarr[1]=*(argliststart+1); 416 xarr[2]=*(argliststart+2); 417 sprintfbuf = (char *)(char *)HeapAlloc(GetProcessHeap(),0,UniStrlen((UniChar*)argliststart[0])*2+1); 418 419 /* CMF - This makes a BIG assumption about va_list */ 420 vsprintf(sprintfbuf, fmtstr, (va_list) xarr); 421 } else { 422 sprintfbuf = (char *)HeapAlloc(GetProcessHeap(),0,100); 423 424 /* CMF - This makes a BIG assumption about va_list */ 425 vsprintf(sprintfbuf, fmtstr, (va_list) argliststart); 426 } 427 x=sprintfbuf; 428 while (*x) { 429 ADD_TO_T(*x++); 430 } 431 HeapFree(GetProcessHeap(),0,sprintfbuf); 432 HeapFree(GetProcessHeap(),0,fmtstr); 433 break; 434 case 'n': 435 /* FIXME: perhaps add \r too? */ 436 ADD_TO_T('\n'); 437 f++; 438 break; 439 case '0': 440 nolinefeed=1; 441 f++; 442 break; 443 default:ADD_TO_T(*f++) 444 break; 445 446 } 447 } else { 448 ADD_TO_T(*f++) 449 } 450 } 451 *t='\0'; 452 } 453 if (!nolinefeed && t[-1]!='\n') 454 ADD_TO_T('\n'); 455 talloced = strlen(target)+1; 456 if (nSize && talloced<nSize) 457 target = (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,nSize); 458 if (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) { 459 /* nSize is the MINIMUM size */ 460 *((LPVOID*)lpBuffer) = (LPVOID)LocalAlloc(GMEM_ZEROINIT,talloced*2+2); 461 AsciiToUnicode(target, *(LPWSTR*)lpBuffer); 462 } 463 else AsciiToUnicode(target, lpBuffer); 464 465 dprintf(("KERNEL32: FormatMessageW returned %s\n", target)); 466 467 HeapFree(GetProcessHeap(),0,target); 468 if (from) HeapFree(GetProcessHeap(),0,from); 469 return (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ? 470 UniStrlen((UniChar*)*lpBuffer): 471 UniStrlen((UniChar*)lpBuffer); 442 fmtstr=(char*)HeapAlloc( GetProcessHeap(), 0, strlen(f)+2); 443 sprintf(fmtstr,"%%%s",f); 444 f=x+1; 445 } else { 446 fmtstr=(char*)HeapAlloc(GetProcessHeap(),0,strlen(f)); 447 sprintf(fmtstr,"%%%s",f); 448 f+=strlen(f); /*at \0*/ 449 } 450 } else 451 if(!args) 452 break; 453 else 454 fmtstr=HEAP_strdupA( GetProcessHeap(),0,"%s"); 455 if (dwFlags & FORMAT_MESSAGE_ARGUMENT_ARRAY) 456 argliststart=args+insertnr-1; 457 else 458 argliststart=(*(DWORD**)args)+insertnr-1; 459 460 if (fmtstr[strlen(fmtstr)-1]=='s') { 461 DWORD xarr[3]; 462 463 xarr[0]=(DWORD)HEAP_strdupWtoA(GetProcessHeap(),0,(LPWSTR)(*(argliststart+0))); 464 /* possible invalid pointers */ 465 xarr[1]=*(argliststart+1); 466 xarr[2]=*(argliststart+2); 467 sprintfbuf=(char*)HeapAlloc(GetProcessHeap(),0,lstrlenW((LPWSTR)argliststart[0])*2+1); 468 469 /* CMF - This makes a BIG assumption about va_list */ 470 vsprintf(sprintfbuf, fmtstr, (va_list) xarr); 471 } else { 472 sprintfbuf=(char*)HeapAlloc(GetProcessHeap(),0,100); 473 474 /* CMF - This makes a BIG assumption about va_list */ 475 O32_wvsprintf(sprintfbuf, fmtstr, (va_list) argliststart); 476 } 477 x=sprintfbuf; 478 while (*x) { 479 ADD_TO_T(*x++); 480 } 481 HeapFree(GetProcessHeap(),0,sprintfbuf); 482 HeapFree(GetProcessHeap(),0,fmtstr); 483 break; 484 case 'n': 485 /* FIXME: perhaps add \r too? */ 486 ADD_TO_T('\n'); 487 f++; 488 break; 489 case '0': 490 nolinefeed=1; 491 f++; 492 break; 493 default:ADD_TO_T(*f++) 494 break; 495 496 } 497 } else { 498 ADD_TO_T(*f++) 499 } 500 } 501 *t='\0'; 502 } 503 if (!nolinefeed) { 504 /* add linefeed */ 505 if(t==target || t[-1]!='\n') 506 ADD_TO_T('\n'); /* FIXME: perhaps add \r too? */ 507 } 508 talloced = strlen(target)+1; 509 if (nSize && talloced<nSize) 510 target = (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,nSize); 511 if (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) { 512 /* nSize is the MINIMUM size */ 513 *((LPVOID*)lpBuffer) = (LPVOID)LocalAlloc(GMEM_ZEROINIT,talloced*2+2); 514 lstrcpynAtoW(*(LPWSTR*)lpBuffer,target,talloced); 515 } else 516 lstrcpynAtoW(lpBuffer,target,nSize); 517 HeapFree(GetProcessHeap(),0,target); 518 if (from) HeapFree(GetProcessHeap(),0,from); 519 return (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ? 520 lstrlenW(*(LPWSTR*)lpBuffer): 521 lstrlenW(lpBuffer); 472 522 } 473 #else 474 //****************************************************************************** 475 //DWORD dwFlags; /* source and processing options */ 476 //LPCVOID lpSource; /* address of message source */ 477 //DWORD dwMessageId; /* requested message identifier */ 478 //DWORD dwLanguageId; /* language identifier for requested message */ 479 //LPTSTR lpBuffer; /* address of message buffer */ 480 //DWORD nSize; /* maximum size of message buffer */ 481 //va_list * Arguments; /* address of array of message inserts */ 482 //****************************************************************************** 483 DWORD WIN32API FormatMessageA(DWORD dwFlags, LPCVOID lpSource, 484 DWORD dwMessageId, DWORD dwLanguageId, 485 LPTSTR lpBuffer, DWORD nSize, va_list *Arguments) 486 { 487 char *msgBuffer; 488 489 dprintf(("KERNEL32: FormatMessageA Not Implemented\n")); 490 491 if(dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) { 492 msgBuffer = (char *)LocalAlloc(LMEM_FIXED, nSize); 493 *(DWORD *)lpBuffer = (DWORD)msgBuffer; 494 } 495 else msgBuffer = lpBuffer; 496 497 if(nSize >= 40) { 498 //SvL: I always wanted to do this :) 499 strncpy(msgBuffer, "Windows Error 666: Reserved for future mistakes\n", 40); 500 } 501 else *msgBuffer = 0; 502 return(strlen(msgBuffer)); 503 } 504 //****************************************************************************** 505 //****************************************************************************** 506 DWORD WIN32API FormatMessageW(DWORD dwFlags, LPCVOID lpSource, 507 DWORD dwMessageId, DWORD dwLanguageId, 508 LPWSTR lpBuffer, DWORD nSize, va_list *Arguments) 509 { 510 WCHAR *msgBuffer; 511 512 dprintf(("KERNEL32: FormatMessageW Not Implemented\n")); 513 514 if(dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) { 515 msgBuffer = (WCHAR *)LocalAlloc(LMEM_FIXED, nSize*sizeof(USHORT)); 516 *(DWORD *)lpBuffer = (DWORD)msgBuffer; 517 } 518 else msgBuffer = lpBuffer; 519 520 if(nSize >= 40) { 521 //SvL: I always wanted to do this :) 522 AsciiToUnicode("Windows Error 666: Reserved for future mistakes\n", msgBuffer); 523 } 524 else *msgBuffer = 0; 525 return(UniStrlen((UniChar*)msgBuffer)); 526 } 527 //****************************************************************************** 528 //****************************************************************************** 529 #endif 523 #undef ADD_TO_T 524
Note:
See TracChangeset
for help on using the changeset viewer.