Changeset 6712 for trunk/src/setupapi/setupx_main.c
- Timestamp:
- Sep 15, 2001, 11:47:44 AM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/setupapi/setupx_main.c
r6649 r6712 1 /* $Id: setupx_main.c,v 1.2 2001-09-05 13:38:23 bird Exp $ */2 1 /* 3 2 * SETUPX library … … 27 26 * 28 27 * SETUPX consists of several parts with the following acronyms/prefixes: 29 * Di 30 * Gen 31 * Ip 32 * LDD 33 * LDID logical device ID28 * Di device installer (devinst.c ?) 29 * Gen generic installer (geninst.c ?) 30 * Ip .INF parsing (infparse.c) 31 * LDD logical device descriptor (ldd.c ?) 32 * LDID logical device ID 34 33 * SU setup (setup.c ?) 35 * Tp 36 * Vcp 34 * Tp text processing (textproc.c ?) 35 * Vcp virtual copy module (vcp.c ?) 37 36 * ... 38 37 * … … 56 55 57 56 /*********************************************************************** 58 * 57 * SURegOpenKey 59 58 */ 60 59 DWORD WINAPI SURegOpenKey( HKEY hkey, LPCSTR lpszSubKey, LPHKEY retkey ) … … 65 64 66 65 /*********************************************************************** 67 * 66 * SURegQueryValueEx 68 67 */ 69 68 DWORD WINAPI SURegQueryValueEx( HKEY hkey, LPSTR lpszValueName, … … 95 94 while (1) 96 95 { 97 98 99 100 101 102 103 &&(*q != ' ') && (*q != '\t') && (*q != '"')104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 } 126 96 /* find beginning of real substring */ 97 while ( (*p == ' ') || (*p == '\t') || (*p == '"') ) p++; 98 99 /* find end of real substring */ 100 q = p; 101 while ( (*q) 102 && (*q != ' ') && (*q != '\t') && (*q != '"') 103 && (*q != ';') && (*q != delimiter) ) q++; 104 if (q == p) 105 break; 106 len = (int)q - (int)p; 107 108 /* alloc entry for new substring in steps of 32 units and copy over */ 109 if (count % 32 == 0) 110 { /* 1 for count field + current count + 32 */ 111 res = HeapReAlloc(GetProcessHeap(), 0, res, (1+count+32)*sizeof(LPSTR)); 112 } 113 *(res+1+count) = HeapAlloc(GetProcessHeap(), 0, len+1); 114 strncpy(*(res+1+count), p, len); 115 (*(res+1+count))[len] = '\0'; 116 count++; 117 118 /* we are still within last substring (before delimiter), 119 * so get out of it */ 120 while ((*q) && (*q != ';') && (*q != delimiter)) q++; 121 if ((!*q) || (*q == ';')) 122 break; 123 p = q+1; 124 } 125 127 126 /* put number of entries at beginning of list */ 128 127 *(DWORD *)res = count; … … 137 136 138 137 for (n=0; n < count; n++) 139 138 HeapFree(GetProcessHeap(), 0, *pStrings++); 140 139 141 140 HeapFree(GetProcessHeap(), 0, substr); … … 164 163 * Hmm, but on the other hand SETUPX_GetSubStrings() will probably 165 164 * soon be replaced by InitSubstrData() etc. anyway. 166 * 165 * 167 166 */ 168 167 static BOOL SETUPX_LookupRegistryString(LPSTR regstr, LPSTR buffer, DWORD buflen) … … 182 181 for (n=0; n < 5; n++) 183 182 { 184 185 186 187 188 189 190 191 192 193 183 q = strchr(p, ','); 184 if (!q) 185 { 186 if (n == 4) 187 q = p+strlen(p); 188 else 189 return FALSE; 190 } 191 next = q+1; 192 if (q < regstr) 194 193 return FALSE; 195 194 SETUPX_IsolateSubString(&p, &q); … … 198 197 strncpy(items[n], p, len); 199 198 items[n][len] = '\0'; 200 199 p = next; 201 200 } 202 201 TRACE("got '%s','%s','%s','%s','%s'\n", 203 204 202 items[0], items[1], items[2], items[3], items[4]); 203 205 204 /* check root key */ 206 205 if (!strcasecmp(items[0], "HKCR")) 207 206 hkey = HKEY_CLASSES_ROOT; 208 207 else 209 208 if (!strcasecmp(items[0], "HKCU")) 210 209 hkey = HKEY_CURRENT_USER; 211 210 else 212 211 if (!strcasecmp(items[0], "HKLM")) 213 212 hkey = HKEY_LOCAL_MACHINE; 214 213 else 215 214 if (!strcasecmp(items[0], "HKU")) 216 215 hkey = HKEY_USERS; 217 216 else 218 217 { /* HKR ? -> relative to key passed to GenInstallEx */ 219 218 FIXME("unsupported regkey '%s'\n", items[0]); 220 219 goto regfailed; 221 220 } … … 225 224 226 225 if (RegQueryValueExA(hsubkey, items[2], NULL, &dwType, buffer, &buflen) 227 226 != ERROR_SUCCESS) 228 227 goto regfailed; 229 228 goto done; … … 235 234 HeapFree(heap, 0, items[n]); 236 235 if (buffer) 237 236 TRACE("return '%s'\n", buffer); 238 237 return TRUE; 239 238 } … … 245 244 246 245 do { 247 248 249 246 buf = HeapReAlloc(GetProcessHeap(), 0, buf, len); 247 res = GetPrivateProfileStringA(NULL, NULL, NULL, buf, len, filename); 248 len *= 2; 250 249 } while ((!res) && (len < 1048576)); 251 250 if (!res) 252 251 { 253 254 252 HeapFree(GetProcessHeap(), 0, buf); 253 return NULL; 255 254 } 256 255 return buf; … … 263 262 264 263 do { 265 266 267 264 buf = HeapReAlloc(GetProcessHeap(), 0, buf, len); 265 res = GetPrivateProfileSectionA(section, buf, len, filename); 266 len *= 2; 268 267 } while ((!res) && (len < 1048576)); 269 268 if (!res) 270 269 { 271 272 270 HeapFree(GetProcessHeap(), 0, buf); 271 return NULL; 273 272 } 274 273 return buf; … … 277 276 278 277 /*********************************************************************** 279 * 278 * InstallHinfSection 280 279 * 281 280 * hwnd = parent window … … 284 283 * Here "DefaultInstall" is the .inf file section to be installed (optional). 285 284 * The 132 value is made of the HOW_xxx flags and sometimes 128 (-> setupx16.h). 286 * 285 * 287 286 * nCmdShow = nCmdShow of CreateProcess 288 287 */ … … 298 297 HMODULE hMod; 299 298 MSGBOX_PROC pMessageBoxA; 300 299 301 300 TRACE("(%04x, %04x, %s, %d);\n", hwnd, hinst, lpszCmdLine, nCmdShow); 302 301 303 302 pSub = SETUPX_GetSubStrings((LPSTR)lpszCmdLine, ' '); 304 303 305 304 count = *(DWORD *)pSub; 306 305 if (count < 2) /* invalid number of arguments ? */ 307 306 goto end; 308 307 if (IpOpen16(*(pSub+count), &hInf) != OK) 309 308 { 310 311 309 res = ERROR_FILE_NOT_FOUND; /* yes, correct */ 310 goto end; 312 311 } 313 312 if (GenInstall16(hInf, *(pSub+count-2), GENINSTALL_DO_ALL) != OK) 314 313 goto end; 315 314 wFlags = atoi(*(pSub+count-1)) & ~128; 316 315 switch (wFlags) 317 316 { 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 } 338 317 case HOW_ALWAYS_SILENT_REBOOT: 318 case HOW_SILENT_REBOOT: 319 reboot = TRUE; 320 break; 321 case HOW_ALWAYS_PROMPT_REBOOT: 322 case HOW_PROMPT_REBOOT: 323 if ((hMod = GetModuleHandleA("user32.dll"))) 324 { 325 if ((pMessageBoxA = (MSGBOX_PROC)GetProcAddress( hMod, "MessageBoxA" ))) 326 { 327 328 if (pMessageBoxA(hwnd, "You must restart Wine before the new settings will take effect.\n\nDo you want to exit Wine now ?", "Systems Settings Change", MB_YESNO|MB_ICONQUESTION) == IDYES) 329 reboot = TRUE; 330 } 331 } 332 break; 333 default: 334 ERR("invalid flags %d !\n", wFlags); 335 goto end; 336 } 337 339 338 res = OK; 340 339 end: … … 343 342 if (reboot) 344 343 { 345 346 347 344 /* FIXME: we should have a means of terminating all wine + wineserver */ 345 MESSAGE("Program or user told me to restart. Exiting Wine...\n"); 346 ExitProcess(1); 348 347 } 349 348 … … 360 359 { 361 360 { /* 0 (LDID_NULL) -- not defined */ 362 363 361 NULL, 362 NULL 364 363 }, 365 364 { /* 1 (LDID_SRCPATH) = source of installation. hmm, what to do here ? */ 366 367 365 "SourcePath", /* hmm, does SETUPX have to care about updating it ?? */ 366 NULL 368 367 }, 369 368 { /* 2 (LDID_SETUPTEMP) = setup temp dir */ 370 371 369 "SetupTempDir", 370 NULL 372 371 }, 373 372 { /* 3 (LDID_UNINSTALL) = uninstall backup dir */ 374 375 373 "UninstallDir", 374 NULL 376 375 }, 377 376 { /* 4 (LDID_BACKUP) = backup dir */ 378 379 377 "BackupDir", 378 NULL 380 379 }, 381 380 { /* 5 (LDID_SETUPSCRATCH) = setup scratch dir */ 382 383 381 "SetupScratchDir", 382 NULL 384 383 }, 385 384 { /* 6 -- not defined */ 386 387 385 NULL, 386 NULL 388 387 }, 389 388 { /* 7 -- not defined */ 390 391 389 NULL, 390 NULL 392 391 }, 393 392 { /* 8 -- not defined */ 394 395 393 NULL, 394 NULL 396 395 }, 397 396 { /* 9 -- not defined */ 398 399 397 NULL, 398 NULL 400 399 }, 401 400 { /* 10 (LDID_WIN) = windows dir */ 402 401 "WinDir", 403 402 "" 404 403 }, 405 404 { /* 11 (LDID_SYS) = system dir */ 406 407 405 "SysDir", 406 NULL /* call GetSystemDirectory() instead */ 408 407 }, 409 408 { /* 12 (LDID_IOS) = IOSubSys dir */ 410 409 NULL, /* FIXME: registry string ? */ 411 410 "SYSTEM\\IOSUBSYS" 412 411 }, 413 412 { /* 13 (LDID_CMD) = COMMAND dir */ 414 415 413 NULL, /* FIXME: registry string ? */ 414 "COMMAND" 416 415 }, 417 416 { /* 14 (LDID_CPL) = control panel dir */ 418 419 417 NULL, 418 "" 420 419 }, 421 420 { /* 15 (LDID_PRINT) = windows printer dir */ 422 423 421 NULL, 422 "SYSTEM" /* correct ?? */ 424 423 }, 425 424 { /* 16 (LDID_MAIL) = destination mail dir */ 426 427 425 NULL, 426 "" 428 427 }, 429 428 { /* 17 (LDID_INF) = INF dir */ 430 431 429 "SetupScratchDir", /* correct ? */ 430 "INF" 432 431 }, 433 432 { /* 18 (LDID_HELP) = HELP dir */ 434 435 433 NULL, /* ??? */ 434 "HELP" 436 435 }, 437 436 { /* 19 (LDID_WINADMIN) = Admin dir */ 438 439 437 "WinAdminDir", 438 "" 440 439 }, 441 440 { /* 20 (LDID_FONTS) = Fonts dir */ 442 443 441 NULL, /* ??? */ 442 "FONTS" 444 443 }, 445 444 { /* 21 (LDID_VIEWERS) = Viewers */ 446 447 445 NULL, /* ??? */ 446 "SYSTEM\\VIEWERS" 448 447 }, 449 448 { /* 22 (LDID_VMM32) = VMM32 dir */ 450 451 449 NULL, /* ??? */ 450 "SYSTEM\\VMM32" 452 451 }, 453 452 { /* 23 (LDID_COLOR) = ICM dir */ 454 455 453 "ICMPath", 454 "SYSTEM\\COLOR" 456 455 }, 457 456 { /* 24 (LDID_APPS) = root of boot drive ? */ 458 459 457 "AppsDir", 458 "C:\\" 460 459 }, 461 460 { /* 25 (LDID_SHARED) = shared dir */ 462 463 461 "SharedDir", 462 "" 464 463 }, 465 464 { /* 26 (LDID_WINBOOT) = Windows boot dir */ 466 467 465 "WinBootDir", 466 "" 468 467 }, 469 468 { /* 27 (LDID_MACHINE) = machine specific files */ 470 471 469 "MachineDir", 470 NULL 472 471 }, 473 472 { /* 28 (LDID_HOST_WINBOOT) = Host Windows boot dir */ 474 475 473 "HostWinBootDir", 474 NULL 476 475 }, 477 476 { /* 29 -- not defined */ 478 479 477 NULL, 478 NULL 480 479 }, 481 480 { /* 30 (LDID_BOOT) = Root of boot drive */ 482 483 481 "BootDir", 482 NULL 484 483 }, 485 484 { /* 31 (LDID_BOOT_HOST) = Root of boot drive host */ 486 487 485 "BootHost", 486 NULL 488 487 }, 489 488 { /* 32 (LDID_OLD_WINBOOT) = subdir of root */ 490 491 489 "OldWinBootDir", 490 NULL 492 491 }, 493 492 { /* 33 (LDID_OLD_WIN) = old win dir */ 494 495 493 "OldWinDir", 494 NULL 496 495 } 497 496 /* the rest (34-38) isn't too interesting, so I'll forget about it */ 498 497 }; 499 498 500 /* 499 /* 501 500 * LDD == Logical Device Descriptor 502 501 * LDID == Logical Device ID … … 528 527 for (n=0; n < sizeof(LDID_Data)/sizeof(LDID_DATA); n++) 529 528 { 530 531 532 533 534 535 536 537 538 539 540 529 buffer[0] = '\0'; 530 531 len = MAX_PATH; 532 if ( (hKey) && (LDID_Data[n].RegValName) 533 && (RegQueryValueExA(hKey, LDID_Data[n].RegValName, 534 NULL, &type, buffer, &len) == ERROR_SUCCESS) 535 && (type == REG_SZ) ) 536 { 537 TRACE("found value '%s' for LDID %d\n", buffer, n); 538 } 539 else 541 540 switch(n) 542 { 543 case LDID_SRCPATH: 544 FIXME("LDID_SRCPATH: what exactly do we have to do here ?\n"); 545 strcpy(buffer, "X:\\FIXME"); 546 break; 547 case LDID_SYS: 548 GetSystemDirectoryA(buffer, MAX_PATH); 549 break; 550 case LDID_APPS: 551 case LDID_MACHINE: 552 case LDID_HOST_WINBOOT: 553 case LDID_BOOT: 554 case LDID_BOOT_HOST: 555 strcpy(buffer, "C:\\"); 556 break; 557 default: 558 if (LDID_Data[n].StdString) 559 { 560 DWORD len = GetWindowsDirectoryA(buffer, MAX_PATH); 561 LPSTR p; 562 p = buffer + len; 563 *p++ = '\\'; 564 strcpy(p, LDID_Data[n].StdString); 541 { 542 case LDID_SRCPATH: 543 FIXME("LDID_SRCPATH: what exactly do we have to do here ?\n"); 544 strcpy(buffer, "X:\\FIXME"); 545 break; 546 case LDID_SYS: 547 GetSystemDirectoryA(buffer, MAX_PATH); 548 break; 549 case LDID_APPS: 550 case LDID_MACHINE: 551 case LDID_HOST_WINBOOT: 552 case LDID_BOOT: 553 case LDID_BOOT_HOST: 554 strcpy(buffer, "C:\\"); 555 break; 556 default: 557 if (LDID_Data[n].StdString) 558 { 559 DWORD len = GetWindowsDirectoryA(buffer, MAX_PATH); 560 LPSTR p; 561 p = buffer + len; 562 *p++ = '\\'; 563 strcpy(p, LDID_Data[n].StdString); 564 } 565 break; 565 566 } 566 break; 567 } 568 if (buffer[0]) 569 { 570 INIT_LDD(ldd, n); 571 ldd.pszPath = buffer; 572 TRACE("LDID %d -> '%s'\n", ldd.ldid, ldd.pszPath); 573 CtlSetLdd16(&ldd); 574 } 567 if (buffer[0]) 568 { 569 INIT_LDD(ldd, n); 570 ldd.pszPath = buffer; 571 TRACE("LDID %d -> '%s'\n", ldd.ldid, ldd.pszPath); 572 CtlSetLdd16(&ldd); 573 } 575 574 } 576 575 if (hKey) RegCloseKey(hKey); 577 576 } 578 579 /*********************************************************************** 580 * CtlDelLdd 577 578 /*********************************************************************** 579 * CtlDelLdd (SETUPX.37) 581 580 * 582 581 * RETURN … … 590 589 591 590 if (!std_LDDs_done) 592 591 SETUPX_CreateStandardLDDs(); 593 592 594 593 if (ldid < LDID_ASSIGN_START) 595 594 return ERR_VCP_LDDINVALID; 596 595 597 596 pCurr = pFirstLDD; … … 599 598 while ((pCurr != NULL) && (ldid > pCurr->pldd->ldid)) 600 599 { 601 602 600 pPrev = pCurr; 601 pCurr = pCurr->next; 603 602 } 604 603 if ( (pCurr == NULL) /* hit end of list */ 605 604 || (ldid != pCurr->pldd->ldid) ) 606 605 return ERR_VCP_LDDFIND; /* correct ? */ 607 606 608 607 /* ok, found our victim: eliminate it */ 609 608 610 609 if (pPrev) 611 610 pPrev->next = pCurr->next; 612 611 613 612 if (pCurr == pFirstLDD) 614 613 pFirstLDD = NULL; 615 614 HeapFree(GetProcessHeap(), 0, pCurr); 616 615 617 616 return OK; 618 617 } 619 618 620 619 /*********************************************************************** 621 * 620 * CtlDelLdd (SETUPX.37) 622 621 */ 623 622 RETERR16 WINAPI CtlDelLdd16(LOGDISKID16 ldid) … … 628 627 629 628 /*********************************************************************** 630 * CtlFindLdd 629 * CtlFindLdd (SETUPX.35) 631 630 * 632 631 * doesn't check pldd ptr validity: crash (W98SE) … … 635 634 * ERR_VCP_LDDINVALID if pldd->cbSize != structsize 636 635 * 1 in all other cases ?? 637 * 636 * 638 637 */ 639 638 RETERR16 WINAPI CtlFindLdd16(LPLOGDISKDESC pldd) … … 642 641 643 642 TRACE("(%p)\n", pldd); 644 643 645 644 if (!std_LDDs_done) 646 645 SETUPX_CreateStandardLDDs(); 647 646 648 647 if (pldd->cbSize != sizeof(LOGDISKDESC_S)) … … 653 652 while ((pCurr != NULL) && (pldd->ldid > pCurr->pldd->ldid)) 654 653 { 655 656 654 pPrev = pCurr; 655 pCurr = pCurr->next; 657 656 } 658 657 if ( (pCurr == NULL) /* hit end of list */ 659 658 || (pldd->ldid != pCurr->pldd->ldid) ) 660 659 return ERR_VCP_LDDFIND; /* correct ? */ 661 660 662 661 memcpy(pldd, pCurr->pldd, pldd->cbSize); 663 662 /* hmm, we probably ought to strcpy() the string ptrs here */ 664 663 665 664 return 1; /* what is this ?? */ 666 665 } 667 666 668 667 /*********************************************************************** 669 * CtlSetLdd 668 * CtlSetLdd (SETUPX.33) 670 669 * 671 670 * Set an LDD entry. … … 685 684 686 685 if (!std_LDDs_done) 687 686 SETUPX_CreateStandardLDDs(); 688 687 689 688 if (pldd->cbSize != sizeof(LOGDISKDESC_S)) 690 689 return ERR_VCP_LDDINVALID; 691 690 692 691 heap = GetProcessHeap(); … … 695 694 while ((pCurr != NULL) && (pldd->ldid > pCurr->pldd->ldid)) 696 695 { 697 698 696 pPrev = pCurr; 697 pCurr = pCurr->next; 699 698 } 700 699 if (pCurr == NULL) /* hit end of list */ 701 700 { 702 701 is_new = TRUE; 703 702 pCurr = HeapAlloc(heap, 0, sizeof(LDD_LIST)); 704 703 pCurr->pldd = HeapAlloc(heap, 0, sizeof(LOGDISKDESC_S)); … … 709 708 { 710 709 pCurrLDD = pCurr->pldd; 711 if (pCurrLDD->pszPath)HeapFree(heap, 0, pCurrLDD->pszPath);712 if (pCurrLDD->pszVolLabel)HeapFree(heap, 0, pCurrLDD->pszVolLabel);713 if (pCurrLDD->pszDiskName)HeapFree(heap, 0, pCurrLDD->pszDiskName);710 if (pCurrLDD->pszPath) HeapFree(heap, 0, pCurrLDD->pszPath); 711 if (pCurrLDD->pszVolLabel) HeapFree(heap, 0, pCurrLDD->pszVolLabel); 712 if (pCurrLDD->pszDiskName) HeapFree(heap, 0, pCurrLDD->pszDiskName); 714 713 } 715 714 … … 717 716 718 717 if (pldd->pszPath) 719 pCurrLDD->pszPath 718 pCurrLDD->pszPath = HEAP_strdupA(heap, 0, pldd->pszPath); 720 719 if (pldd->pszVolLabel) 721 pCurrLDD->pszVolLabel= HEAP_strdupA(heap, 0, pldd->pszVolLabel);720 pCurrLDD->pszVolLabel = HEAP_strdupA(heap, 0, pldd->pszVolLabel); 722 721 if (pldd->pszDiskName) 723 pCurrLDD->pszDiskName= HEAP_strdupA(heap, 0, pldd->pszDiskName);722 pCurrLDD->pszDiskName = HEAP_strdupA(heap, 0, pldd->pszDiskName); 724 723 725 724 if (is_new) /* link into list */ 726 725 { 727 726 if (pPrev) 728 729 727 { 728 pCurr->next = pPrev->next; 730 729 pPrev->next = pCurr; 731 732 733 734 } 735 730 } 731 if (!pFirstLDD) 732 pFirstLDD = pCurr; 733 } 734 736 735 return OK; 737 736 } … … 739 738 740 739 /*********************************************************************** 741 * CtlAddLdd 740 * CtlAddLdd (SETUPX.36) 742 741 * 743 742 * doesn't check pldd ptr validity: crash (W98SE) … … 752 751 753 752 /*********************************************************************** 754 * CtlGetLdd 753 * CtlGetLdd (SETUPX.34) 755 754 * 756 755 * doesn't check pldd ptr validity: crash (W98SE) … … 759 758 * RETURN 760 759 * ERR_VCP_LDDINVALID if pldd->cbSize != structsize 761 * 760 * 762 761 */ 763 762 static RETERR16 SETUPX_GetLdd(LPLOGDISKDESC pldd) … … 766 765 767 766 if (!std_LDDs_done) 768 767 SETUPX_CreateStandardLDDs(); 769 768 770 769 if (pldd->cbSize != sizeof(LOGDISKDESC_S)) … … 775 774 while ((pCurr != NULL) && (pldd->ldid > pCurr->pldd->ldid)) 776 775 { 777 778 776 pPrev = pCurr; 777 pCurr = pCurr->next; 779 778 } 780 779 if (pCurr == NULL) /* hit end of list */ 781 780 return ERR_VCP_LDDFIND; /* correct ? */ 782 781 783 782 memcpy(pldd, pCurr->pldd, pldd->cbSize); … … 796 795 797 796 /*********************************************************************** 798 * CtlGetLddPath(SETUPX.38)797 * CtlGetLddPath (SETUPX.38) 799 798 * 800 799 * Gets the path of an LDD. … … 810 809 if (szPath) 811 810 { 812 813 814 815 816 811 LOGDISKDESC_S ldd; 812 INIT_LDD(ldd, ldid); 813 if (CtlFindLdd16(&ldd) == ERR_VCP_LDDFIND) 814 return ERR_VCP_LDDUNINIT; 815 SETUPX_GetLdd(&ldd); 817 816 strcpy(szPath, ldd.pszPath); 818 817 TRACE("ret '%s' for LDID %d\n", szPath, ldid); 819 818 } 820 819 return OK; … … 822 821 823 822 /*********************************************************************** 824 * CtlSetLddPath(SETUPX.508)823 * CtlSetLddPath (SETUPX.508) 825 824 * 826 825 * Sets the path of an LDD. … … 831 830 LOGDISKDESC_S ldd; 832 831 TRACE("(%d, '%s');\n", ldid, szPath); 833 832 834 833 INIT_LDD(ldd, ldid); 835 834 ldd.pszPath = szPath; … … 848 847 * -- registry lookup --> 849 848 * C:\Program Files (or C:\ if not found in registry) 850 * 849 * 851 850 * FIXME: 852 851 * - maybe we ought to add a caching array for speed ? - I don't care :) … … 854 853 * LDIDs for both install and removal sections. 855 854 * - probably the whole function can be removed as installers add that on their 856 * own 855 * own 857 856 */ 858 857 static BOOL SETUPX_AddCustomLDID(int ldid, INT16 hInf) … … 870 869 if (!(sectionbuf = SETUPX_GetSections(filename))) 871 870 { 872 873 871 ERR("couldn't get sections !\n"); 872 return FALSE; 874 873 } 875 874 for (pSec=sectionbuf; *pSec; pSec += strlen(pSec)+1) 876 875 { 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 876 if (!(entrybuf = SETUPX_GetSectionEntries(filename, pSec))) 877 { 878 ERR("couldn't get section entries !\n"); 879 goto end; 880 } 881 for (pEnt=entrybuf; *pEnt; pEnt += strlen(pEnt)+1) 882 { 883 if (strstr(pEnt, ldidstr)) 884 { 885 pEqual = strchr(pEnt, '='); 886 if (!pEqual) /* crippled entry ?? */ 887 continue; 888 889 /* make sure we found the LDID on left side of the equation */ 890 if (pEnt+strlen(ldidstr) <= pEqual) 891 { /* found */ 892 893 /* but we don't want entries in the strings section */ 894 if (!strcasecmp(pSec, "Strings")) 895 goto next_section; 896 p = pEqual+1; 897 goto found; 898 } 899 } 900 } 902 901 next_section: 903 902 } … … 908 907 if (*(DWORD *)pSub > 2) 909 908 { 910 911 909 ERR("malformed entry '%s' ?\n", p); 910 goto end; 912 911 } 913 912 TRACE("found section '%s'\n", *(pSub+1)); … … 917 916 if (!(regsectionbuf = SETUPX_GetSectionEntries(filename, *(pSub+1)))) 918 917 { 919 920 918 ERR("couldn't get registry section entries !\n"); 919 goto end; 921 920 } 922 921 /* sectionbuf is > 1024 bytes anyway, so use it */ … … 929 928 end: 930 929 SETUPX_FreeSubStrings(pSub); 931 if (sectionbuf) 932 if (entrybuf) 933 if (regsectionbuf) 930 if (sectionbuf) HeapFree(GetProcessHeap(), 0, sectionbuf); 931 if (entrybuf) HeapFree(GetProcessHeap(), 0, entrybuf); 932 if (regsectionbuf) HeapFree(GetProcessHeap(), 0, regsectionbuf); 934 933 return ret; 935 934 } … … 948 947 if (CtlFindLdd16(&ldd) == ERR_VCP_LDDFIND) 949 948 { 950 951 952 953 954 955 949 /* hmm, it seems the installers already do the work for us 950 * (by calling CtlSetLddPath) that SETUPX_AddCustomLDID 951 * is supposed to do. Grmbl ;-) 952 * Well, I'll leave it here anyway, but print error... */ 953 ERR("hmm, LDID %d not registered yet !?\n", ldid); 954 handled = SETUPX_AddCustomLDID(ldid, hInf); 956 955 } 957 956 else 958 959 957 handled = TRUE; 958 960 959 SETUPX_GetLdd(&ldd); 961 960 962 961 if (!handled) 963 962 { 964 963 FIXME("What is LDID %d ??\n", ldid); 965 964 *p = "LDID_FIXME"; 966 965 } 967 966 else 968 967 *p = ldd.pszPath; 969 968 970 969 return handled; … … 972 971 973 972 /*********************************************************************** 974 * 973 * GenFormStrWithoutPlaceHolders 975 974 * 976 975 * ought to be pretty much implemented, I guess... … … 981 980 LPSTR pDst = szDst, p, pPHBegin; 982 981 int count; 983 982 984 983 TRACE("(%p, '%s', %04x);\n", szDst, szSrc, hInf); 985 984 while (pSrc < pSrcEnd) 986 985 { 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 986 p = strchr(pSrc, '%'); 987 if (p) 988 { 989 count = (int)p - (int)pSrc; 990 strncpy(pDst, pSrc, count); 991 pSrc += count; 992 pDst += count; 993 pPHBegin = p+1; 994 p = strchr(pPHBegin, '%'); 995 if (p) 996 { 997 char placeholder[80]; /* that really ought to be enough ;) */ 998 int ldid; 999 BOOL done = TRUE; 1000 count = (int)p - (int)pPHBegin; 1001 strncpy(placeholder, pPHBegin, count); 1002 placeholder[count] = '\0'; 1003 ldid = atoi(placeholder); 1004 if (ldid) 1005 { 1006 LPSTR p; 1007 done = SETUPX_IP_TranslateLDID(ldid, &p, hInf); 1008 strcpy(pDst, p); 1009 if (done) 1010 pDst += strlen(pDst); 1011 } 1012 else 1013 { /* hmm, string placeholder. Need to look up 1014 in the [strings] section of the hInf */ 1015 DWORD ret; 1016 char buf[256]; /* long enough ? */ 1017 1018 ret = GetPrivateProfileStringA("strings", placeholder, "", 1019 buf, 256, IP_GetFileName(hInf)); 1020 if (ret) 1021 { 1022 strcpy(pDst, buf); 1023 pDst += strlen(buf); 1024 } 1025 else 1026 { 1027 ERR("placeholder string '%s' not found !\n", placeholder); 1028 done = FALSE; 1029 } 1030 } 1031 if (!done) 1032 { /* copy raw placeholder string over */ 1033 count = (int)p - (int)pPHBegin + 2; 1034 strncpy(pDst, pPHBegin-1, count); 1035 pDst += count; 1036 1037 } 1038 pSrc = p+1; 1039 continue; 1040 } 1041 } 1042 1043 /* copy the remaining source string over */ 1044 strncpy(pDst, pSrc, (int)pSrcEnd - (int)pSrc + 1); 1045 break; 1047 1046 } 1048 1047 TRACE("ret '%s'\n", szDst); … … 1050 1049 1051 1050 /*********************************************************************** 1052 * 1051 * VcpOpen 1053 1052 * 1054 1053 * No idea what to do here. … … 1061 1060 1062 1061 /*********************************************************************** 1063 * 1062 * VcpClose 1064 1063 * 1065 1064 * Is fl related to VCPDISKINFO.fl ? … … 1092 1091 for (n=0; n < *(DWORD *)pSub; n++) 1093 1092 { 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1093 pCopyEntry = *(pSub+1+n); 1094 if (*pCopyEntry == '@') 1095 { 1096 ERR("single file not handled yet !\n"); 1097 continue; 1098 } 1099 1100 /* get source directory for that entry */ 1101 INIT_LDD(ldd, LDID_SRCPATH); 1102 SETUPX_GetLdd(&ldd); 1103 pSrcDir = ldd.pszPath; 1104 1106 1105 /* get destination directory for that entry */ 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1106 if (!(GetPrivateProfileStringA("DestinationDirs", pCopyEntry, "", 1107 pDestStr, sizeof(pDestStr), filename))) 1108 continue; 1109 1110 /* translate destination dir if given as LDID */ 1111 ldid = atoi(pDestStr); 1112 if (ldid) 1113 { 1114 if (!(SETUPX_IP_TranslateLDID(ldid, &pDstDir, hInf))) 1115 continue; 1116 } 1117 else 1118 pDstDir = pDestStr; 1119 1120 /* now that we have the destination dir, iterate over files to copy */ 1121 pFileEntries = SETUPX_GetSectionEntries(filename, pCopyEntry); 1123 1122 for (p=pFileEntries; *p; p +=strlen(p)+1) 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 } 1145 1123 { 1124 pSubFile = SETUPX_GetSubStrings(p, ','); 1125 pSrcFile = *(pSubFile+1); 1126 pDstFile = (*(DWORD *)pSubFile > 1) ? *(pSubFile+2) : pSrcFile; 1127 TRACE("copying file '%s\\%s' to '%s\\%s'\n", pSrcDir, pSrcFile, pDstDir, pDstFile); 1128 if (*(DWORD *)pSubFile > 2) 1129 { 1130 WORD flag; 1131 if ((flag = atoi(*(pSubFile+3)))) /* ah, flag */ 1132 { 1133 if (flag & 0x2c) 1134 FIXME("VNLP_xxx flag %d not handled yet.\n", flag); 1135 } 1136 else 1137 FIXME("temp file name '%s' given. Need to register in wininit.ini !\n", *(pSubFile+3)); /* strong guess that this is VcpQueueCopy() */ 1138 } 1139 SETUPX_FreeSubStrings(pSubFile); 1140 /* we don't copy ANYTHING yet ! (I'm too lazy and want to verify 1141 * this first before destroying whole partitions ;-) */ 1142 } 1143 } 1144 1146 1145 return res; 1147 1146 } 1148 1147 1149 1148 /*********************************************************************** 1150 * 1149 * GenInstall 1151 1150 * 1152 1151 * general install function for .INF file sections 1153 1152 * 1154 1153 * This is not perfect - patch whenever you can ! 1155 * 1154 * 1156 1155 * wFlags == GENINSTALL_DO_xxx 1157 1156 * e.g. NetMeeting: … … 1170 1169 if (!pEntries) 1171 1170 { 1172 1173 1171 ERR("couldn't find entries for section '%s' !\n", szInstallSection); 1172 return ERR_IP_SECT_NOT_FOUND; 1174 1173 } 1175 1174 for (p=pEntries; *p; p +=strlen(p)+1) 1176 1175 { 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1176 pEnd = strchr(p, '='); 1177 if (!pEnd) continue; 1178 pSub = SETUPX_GetSubStrings(pEnd+1, ','); /* split entries after the '=' */ 1179 SETUPX_IsolateSubString(&p, &pEnd); 1180 len = (int)pEnd - (int)p; 1181 1182 if (wFlags & GENINSTALL_DO_FILES) 1183 { 1184 if (!strncasecmp(p, "CopyFiles", len)) 1185 { 1186 SETUPX_CopyFiles(pSub, hInfFile); 1187 continue; 1188 } 1190 1189 #if IMPLEMENT_THAT 1191 1192 1193 1194 1195 1196 1190 else 1191 if (!strncasecmp(p, "DelFiles", len)) 1192 { 1193 SETUPX_DelFiles(filename, szInstallSection, pSub); 1194 continue; 1195 } 1197 1196 #endif 1198 1199 1200 1197 } 1198 if (wFlags & GENINSTALL_DO_INI) 1199 { 1201 1200 #if IMPLEMENT_THAT 1202 1203 1204 1205 1206 1201 if (!strncasecmp(p, "UpdateInis", len)) 1202 { 1203 SETUPX_UpdateInis(filename, szInstallSection, pSub); 1204 continue; 1205 } 1207 1206 #endif 1208 1209 1210 1207 } 1208 if (wFlags & GENINSTALL_DO_REG) 1209 { 1211 1210 #if IMPLEMENT_THAT 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1211 /* probably use SUReg*() functions here */ 1212 if (!strncasecmp(p, "AddReg", len)) 1213 { 1214 SETUPX_AddReg(filename, szInstallSection, pSub); 1215 continue; 1216 } 1217 else 1218 if (!strncasecmp(p, "DelReg", len)) 1219 { 1220 SETUPX_DelReg(filename, szInstallSection, pSub); 1221 continue; 1222 } 1224 1223 #endif 1225 1226 1227 1224 } 1225 1226 SETUPX_FreeSubStrings(pSub); 1228 1227 } 1229 1228 HeapFree(GetProcessHeap(), 0, pEntries);
Note:
See TracChangeset
for help on using the changeset viewer.