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