Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225/* * Tests for MSI Source functions * * Copyright (C) 2006 James Hawkins * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
#define _WIN32_MSI 300
#include <stdio.h>
#include <windows.h>#include <msiquery.h>#include <msidefs.h>#include <msi.h>#include <sddl.h>#include <secext.h>#include <objbase.h>
#include "wine/test.h"#include "utils.h"
static BOOL is_wow64;
/* copied from dlls/msi/registry.c */static BOOL squash_guid(LPCWSTR in, LPWSTR out){ DWORD i,n=1; GUID guid;
if (FAILED(CLSIDFromString((LPCOLESTR)in, &guid))) return FALSE;
for(i=0; i<8; i++) out[7-i] = in[n++]; n++; for(i=0; i<4; i++) out[11-i] = in[n++]; n++; for(i=0; i<4; i++) out[15-i] = in[n++]; n++; for(i=0; i<2; i++) { out[17+i*2] = in[n++]; out[16+i*2] = in[n++]; } n++; for( ; i<8; i++) { out[17+i*2] = in[n++]; out[16+i*2] = in[n++]; } out[32]=0; return TRUE;}
static void create_test_guid(LPSTR prodcode, LPSTR squashed){ WCHAR guidW[MAX_PATH]; WCHAR squashedW[MAX_PATH]; GUID guid; HRESULT hr; int size;
hr = CoCreateGuid(&guid); ok(hr == S_OK, "Expected S_OK, got %#lx\n", hr);
size = StringFromGUID2(&guid, guidW, MAX_PATH); ok(size == 39, "Expected 39, got %#lx\n", hr);
WideCharToMultiByte(CP_ACP, 0, guidW, size, prodcode, MAX_PATH, NULL, NULL); squash_guid(guidW, squashedW); WideCharToMultiByte(CP_ACP, 0, squashedW, -1, squashed, MAX_PATH, NULL, NULL);}
static char *get_user_sid(void){ HANDLE token; DWORD size = 0; TOKEN_USER *user; char *usersid = NULL;
OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token); GetTokenInformation(token, TokenUser, NULL, size, &size);
user = malloc(size); GetTokenInformation(token, TokenUser, user, size, &size); ConvertSidToStringSidA(user->User.Sid, &usersid); free(user);
CloseHandle(token); return usersid;}
static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase, DWORD line){ char val[MAX_PATH]; DWORD size, type; LONG res;
size = MAX_PATH; val[0] = '\0'; res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)val, &size);
if (res != ERROR_SUCCESS || (type != REG_SZ && type != REG_EXPAND_SZ)) { ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n"); return; }
if (!expected) ok_(__FILE__, line)(!val[0], "Expected empty string, got %s\n", val); else { if (bcase) ok_(__FILE__, line)(!lstrcmpA(val, expected), "Expected %s, got %s\n", expected, val); else ok_(__FILE__, line)(!lstrcmpiA(val, expected), "Expected %s, got %s\n", expected, val); }}
#define CHECK_REG_STR(prodkey, name, expected) \ check_reg_str(prodkey, name, expected, TRUE, __LINE__);
static inline WCHAR *strdupAW( const char *str ){ int len; WCHAR *ret; len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 ); if (!(ret = malloc( len * sizeof(WCHAR) ))) return NULL; MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len ); return ret;}
static void test_MsiSourceListGetInfo(void){ char prodcode[MAX_PATH], prod_squashed[MAX_PATH], keypath[MAX_PATH * 2], value[MAX_PATH], *usersid; WCHAR valueW[MAX_PATH], *usersidW, *prodcodeW; const char *data; LONG res; UINT r; HKEY userkey, hkey, media; DWORD size;
create_test_guid(prodcode, prod_squashed); if (!(usersid = get_user_sid())) { skip("User SID not available -> skipping MsiSourceListGetInfoA tests\n"); return; }
/* NULL szProductCodeOrPatchCode */ r = MsiSourceListGetInfoA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, NULL, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* empty szProductCodeOrPatchCode */ r = MsiSourceListGetInfoA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, NULL, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* garbage szProductCodeOrPatchCode */ r = MsiSourceListGetInfoA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, NULL, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* guid without brackets */ r = MsiSourceListGetInfoA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, NULL, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* guid with brackets */ r = MsiSourceListGetInfoA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, NULL, NULL); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
/* same length as guid, but random */ r = MsiSourceListGetInfoA("ADKD-2KSDFF2-DKK1KNFJASD9GLKWME-1I3KAD", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, NULL, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* invalid context */ r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_NONE, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, NULL, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* another invalid context */ r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_ALLUSERMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, NULL, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* yet another invalid context */ r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_ALL, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, NULL, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* mix two valid contexts */ r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED | MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, NULL, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* invalid option */ r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, 4, INSTALLPROPERTY_PACKAGENAMEA, NULL, NULL); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
/* NULL property */ r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, NULL, NULL, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* empty property */ r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, "", NULL, NULL); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
/* value is non-NULL while size is NULL */ r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, value, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* size is non-NULL while value is NULL */ size = MAX_PATH; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, NULL, &size); ok(r == ERROR_UNKNOWN_PRODUCT || r == ERROR_INVALID_PARAMETER, "Expected ERROR_UNKNOWN_PRODUCT or ERROR_INVALID_PARAMETER, got %d\n", r);
lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* user product key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, value, &size); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
res = RegCreateKeyA(userkey, "SourceList", &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(size == 0, "Expected 0, got %lu\n", size); ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value);
data = "msitest.msi"; res = RegSetValueExA(hkey, "PackageName", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* PackageName value exists */ size = 0xdeadbeef; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, NULL, &size); ok(r == ERROR_SUCCESS || r == ERROR_INVALID_PARAMETER, "Expected ERROR_SUCCESS or ERROR_INVALID_PARAMETER, got %d\n", r); ok(size == 11 || r != ERROR_SUCCESS, "Expected 11, got %lu\n", size);
/* read the value, don't change size */ size = 11; lstrcpyA(value, "aaa"); r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, value, &size); ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected 'aaa', got %s\n", value); ok(size == 11, "Expected 11, got %lu\n", size);
/* read the value, fix size */ size++; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "msitest.msi"), "Expected 'msitest.msi', got %s\n", value); ok(size == 11, "Expected 11, got %lu\n", size);
/* empty property now that product key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, "", value, &size); ok(r == ERROR_UNKNOWN_PROPERTY, "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r); ok(size == MAX_PATH, "Expected %d, got %lu\n", MAX_PATH, size); ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
/* nonexistent property now that product key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, "nonexistent", value, &size); ok(r == ERROR_UNKNOWN_PROPERTY, "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r); ok(size == MAX_PATH, "Expected %d, got %lu\n", MAX_PATH, size); ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
data = "tester"; res = RegSetValueExA(hkey, "nonexistent", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* nonexistent property now that nonexistent value exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, "nonexistent", value, &size); ok(r == ERROR_UNKNOWN_PROPERTY, "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r); ok(size == MAX_PATH, "Expected %d, got %lu\n", MAX_PATH, size); ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
/* invalid option now that product key exists */ size = MAX_PATH; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, 4, INSTALLPROPERTY_PACKAGENAMEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(size == 11, "Expected 11, got %lu\n", size);
/* INSTALLPROPERTY_MEDIAPACKAGEPATH, media key does not exist */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATHA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value); ok(size == 0, "Expected 0, got %lu\n", size);
res = RegCreateKeyA(hkey, "Media", &media); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
data = "path"; res = RegSetValueExA(media, "MediaPackage", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* INSTALLPROPERTY_MEDIAPACKAGEPATH */ size = MAX_PATH; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATHA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "path"), "Expected \"path\", got \"%s\"\n", value); ok(size == 4, "Expected 4, got %lu\n", size);
/* INSTALLPROPERTY_DISKPROMPT */ data = "prompt"; res = RegSetValueExA(media, "DiskPrompt", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
size = MAX_PATH; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_DISKPROMPTA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "prompt"), "Expected \"prompt\", got \"%s\"\n", value); ok(size == 6, "Expected 6, got %lu\n", size);
/* LastUsedSource value doesn't exist */ RegDeleteValueA(hkey, "LastUsedSource"); size = MAX_PATH; memset(value, 0x55, sizeof(value)); r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value); ok(size == 0, "Expected 0, got %lu\n", size);
size = MAX_PATH; usersidW = strdupAW(usersid); prodcodeW = strdupAW(prodcode); memset(valueW, 0x55, sizeof(valueW)); r = MsiSourceListGetInfoW(prodcodeW, usersidW, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEW, valueW, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(!valueW[0], "Expected \"\""); ok(size == 0, "Expected 0, got %lu\n", size); free(usersidW); free(prodcodeW);
data = ""; res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* INSTALLPROPERTY_LASTUSEDSOURCE, source is empty */ size = MAX_PATH; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value); ok(size == 0, "Expected 0, got %lu\n", size);
data = "source"; res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* INSTALLPROPERTY_LASTUSEDSOURCE */ size = MAX_PATH; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "source"), "Expected \"source\", got \"%s\"\n", value); ok(size == 6, "Expected 6, got %lu\n", size);
/* INSTALLPROPERTY_LASTUSEDSOURCE, size is too short */ size = 4; lstrcpyA(value, "aaa"); r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEA, value, &size); ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got \"%s\"\n", value); ok(size == 6, "Expected 6, got %lu\n", size);
/* INSTALLPROPERTY_LASTUSEDSOURCE, size is exactly 6 */ size = 6; lstrcpyA(value, "aaa"); r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEA, value, &size); ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got \"%s\"\n", value); ok(size == 6, "Expected 6, got %lu\n", size);
data = "a;source"; res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* INSTALLPROPERTY_LASTUSEDSOURCE, one semi-colon */ size = MAX_PATH; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "source"), "Expected \"source\", got \"%s\"\n", value); ok(size == 6, "Expected 6, got %lu\n", size);
data = "a:source"; res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* INSTALLPROPERTY_LASTUSEDSOURCE, one colon */ size = MAX_PATH; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "a:source"), "Expected \"a:source\", got \"%s\"\n", value); ok(size == 8, "Expected 8, got %lu\n", size);
/* INSTALLPROPERTY_LASTUSEDTYPE, invalid source format */ size = MAX_PATH; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDTYPEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value); ok(size == 0, "Expected 0, got %lu\n", size);
data = "x;y;z"; res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* INSTALLPROPERTY_LASTUSEDTYPE, invalid source format */ size = MAX_PATH; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDTYPEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value); ok(size == 0, "Expected 0, got %lu\n", size);
data = "n;y;z"; res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* INSTALLPROPERTY_LASTUSEDTYPE */ size = MAX_PATH; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDTYPEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "n"), "Expected \"n\", got \"%s\"\n", value); ok(size == 1, "Expected 1, got %lu\n", size);
data = "negatory"; res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* INSTALLPROPERTY_LASTUSEDTYPE */ size = MAX_PATH; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDTYPEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "n"), "Expected \"n\", got \"%s\"\n", value); ok(size == 1, "Expected 1, got %lu\n", size);
data = "megatron"; res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* INSTALLPROPERTY_LASTUSEDTYPE */ size = MAX_PATH; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDTYPEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "m"), "Expected \"m\", got \"%s\"\n", value); ok(size == 1, "Expected 1, got %lu\n", size);
data = "useless"; res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ, (const BYTE *)data, lstrlenA(data) + 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* INSTALLPROPERTY_LASTUSEDTYPE */ size = MAX_PATH; r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDTYPEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "u"), "Expected \"u\", got \"%s\"\n", value); ok(size == 1, "Expected 1, got %lu\n", size);
RegDeleteValueA(media, "MediaPackage"); RegDeleteValueA(media, "DiskPrompt"); RegDeleteKeyA(media, ""); RegDeleteValueA(hkey, "LastUsedSource"); RegDeleteValueA(hkey, "nonexistent"); RegDeleteValueA(hkey, "PackageName"); RegDeleteKeyA(hkey, ""); RegDeleteKeyA(userkey, ""); RegCloseKey(hkey); RegCloseKey(userkey);
/* try a patch */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PATCH, INSTALLPROPERTY_PACKAGENAMEA, value, &size); ok(r == ERROR_UNKNOWN_PATCH, "Expected ERROR_UNKNOWN_PATCH, got %d\n", r); ok(size == MAX_PATH, "Expected %d, got %lu\n", MAX_PATH, size); ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Patches\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* patch key exists * NOTE: using prodcode guid, but it really doesn't matter */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PATCH, INSTALLPROPERTY_PACKAGENAMEA, value, &size); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); ok(size == MAX_PATH, "Expected %d, got %lu\n", MAX_PATH, size); ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value);
res = RegCreateKeyA(userkey, "SourceList", &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PATCH, INSTALLPROPERTY_PACKAGENAMEA, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value); ok(size == 0, "Expected 0, got %lu\n", size);
RegDeleteKeyA(hkey, ""); RegDeleteKeyA(userkey, ""); RegCloseKey(hkey); RegCloseKey(userkey); LocalFree(usersid);}
static void test_MsiSourceListAddSourceEx(void){ CHAR prodcode[MAX_PATH]; CHAR prod_squashed[MAX_PATH]; CHAR keypath[MAX_PATH*2]; CHAR value[MAX_PATH]; LPSTR usersid; LONG res; UINT r; HKEY prodkey, userkey, hkey, url, net; DWORD size; REGSAM access = KEY_ALL_ACCESS;
if (!is_process_elevated()) { skip("process is limited\n"); return; }
create_test_guid(prodcode, prod_squashed); if (!(usersid = get_user_sid())) { skip("User SID not available -> skipping MsiSourceListAddSourceExA tests\n"); return; }
if (is_wow64) access |= KEY_WOW64_64KEY;
/* GetLastError is not set by the function */
/* NULL szProductCodeOrPatchCode */ r = MsiSourceListAddSourceExA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* empty szProductCodeOrPatchCode */ r = MsiSourceListAddSourceExA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* garbage szProductCodeOrPatchCode */ r = MsiSourceListAddSourceExA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* guid without brackets */ r = MsiSourceListAddSourceExA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* guid with brackets */ r = MsiSourceListAddSourceExA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
/* MSIINSTALLCONTEXT_USERUNMANAGED */
r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* user product key exists */ r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyA(userkey, "SourceList", &url); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); RegCloseKey(url);
/* SourceList key exists */ r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
res = RegOpenKeyA(userkey, "SourceList\\URL", &url); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
size = MAX_PATH; res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value); ok(size == 11, "Expected 11, got %lu\n", size);
/* add another source, index 0 */ r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "another", 0); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
size = MAX_PATH; res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value); ok(size == 11, "Expected 11, got %lu\n", size);
size = MAX_PATH; res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value); ok(size == 9, "Expected 9, got %lu\n", size);
/* add another source, index 1 */ r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "third/", 1); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
size = MAX_PATH; res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "third/"), "Expected 'third/', got %s\n", value); ok(size == 7, "Expected 7, got %lu\n", size);
size = MAX_PATH; res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value); ok(size == 11, "Expected 11, got %lu\n", size);
size = MAX_PATH; res = RegQueryValueExA(url, "3", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value); ok(size == 9, "Expected 9, got %lu\n", size);
/* add another source, index > N */ r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "last/", 5); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
size = MAX_PATH; res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "third/"), "Expected 'third/', got %s\n", value); ok(size == 7, "Expected 7, got %lu\n", size);
size = MAX_PATH; res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value); ok(size == 11, "Expected 11, got %lu\n", size);
size = MAX_PATH; res = RegQueryValueExA(url, "3", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value); ok(size == 9, "Expected 9, got %lu\n", size);
size = MAX_PATH; res = RegQueryValueExA(url, "4", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "last/"), "Expected 'last/', got %s\n", value); ok(size == 6, "Expected 6, got %lu\n", size);
/* just MSISOURCETYPE_NETWORK */ r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSISOURCETYPE_NETWORK, "source", 0); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
res = RegOpenKeyA(userkey, "SourceList\\Net", &net); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
size = MAX_PATH; res = RegQueryValueExA(net, "1", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "source\\"), "Expected 'source\\', got %s\n", value); ok(size == 8, "Expected 8, got %lu\n", size);
/* just MSISOURCETYPE_URL */ r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSISOURCETYPE_URL, "source", 0); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
size = MAX_PATH; res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "third/"), "Expected 'third/', got %s\n", value); ok(size == 7, "Expected 7, got %lu\n", size);
size = MAX_PATH; res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value); ok(size == 11, "Expected 11, got %lu\n", size);
size = MAX_PATH; res = RegQueryValueExA(url, "3", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value); ok(size == 9, "Expected 9, got %lu\n", size);
size = MAX_PATH; res = RegQueryValueExA(url, "4", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "last/"), "Expected 'last/', got %s\n", value); ok(size == 6, "Expected 6, got %lu\n", size);
size = MAX_PATH; res = RegQueryValueExA(url, "5", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "source/"), "Expected 'source/', got %s\n", value); ok(size == 8, "Expected 8, got %lu\n", size);
/* NULL szUserSid */ r = MsiSourceListAddSourceExA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSISOURCETYPE_NETWORK, "nousersid", 0); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
size = MAX_PATH; res = RegQueryValueExA(net, "1", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "source\\"), "Expected 'source\\', got %s\n", value); ok(size == 8, "Expected 8, got %lu\n", size);
size = MAX_PATH; res = RegQueryValueExA(net, "2", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "nousersid\\"), "Expected 'nousersid\\', got %s\n", value); ok(size == 11, "Expected 11, got %lu\n", size);
/* invalid options, must have source type */ r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, "source", 0); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PATCH, "source", 0); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* NULL szSource */ r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSISOURCETYPE_URL, NULL, 1); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* empty szSource */ r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSISOURCETYPE_URL, "", 1); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* MSIINSTALLCONTEXT_USERMANAGED, non-NULL szUserSid */
r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\"); lstrcatA(keypath, usersid); lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); if (res != ERROR_SUCCESS) { skip("Product key creation failed with error code %ld\n", res); goto machine_tests; }
/* product key exists */ r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &hkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); RegCloseKey(hkey);
/* SourceList exists */ r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
res = RegOpenKeyExA(prodkey, "SourceList\\URL", 0, access, &url); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
size = MAX_PATH; res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value); ok(size == 11, "Expected 11, got %lu\n", size);
RegCloseKey(url);
/* MSIINSTALLCONTEXT_USERMANAGED, NULL szUserSid */
r = MsiSourceListAddSourceExA(prodcode, NULL, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, "another", 0); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
res = RegOpenKeyExA(prodkey, "SourceList\\URL", 0, access, &url); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
size = MAX_PATH; res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value); ok(size == 11, "Expected 11, got %lu\n", size);
size = MAX_PATH; res = RegQueryValueExA(url, "2", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "another/"), "Expected 'another/', got %s\n", value); ok(size == 9, "Expected 9, got %lu\n", size);
RegCloseKey(url); RegCloseKey(prodkey);
/* MSIINSTALLCONTEXT_MACHINE */
machine_tests: /* szUserSid must be NULL for MSIINSTALLCONTEXT_MACHINE */ r = MsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
r = MsiSourceListAddSourceExA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); if (res != ERROR_SUCCESS) { skip("Product key creation failed with error code %ld\n", res); LocalFree(usersid); return; }
/* product key exists */ r = MsiSourceListAddSourceExA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &hkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); RegCloseKey(hkey);
/* SourceList exists */ r = MsiSourceListAddSourceExA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); if (r == ERROR_ACCESS_DENIED) skip("MsiSourceListAddSourceEx (insufficient privileges)\n"); else { ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
res = RegOpenKeyExA(prodkey, "SourceList\\URL", 0, access, &url); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
size = MAX_PATH; res = RegQueryValueExA(url, "1", NULL, NULL, (LPBYTE)value, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); ok(!lstrcmpA(value, "C:\\source/"), "Expected 'C:\\source/', got %s\n", value); ok(size == 11, "Expected 11, got %lu\n", size);
RegCloseKey(url); RegCloseKey(prodkey); } LocalFree(usersid);}
static void test_MsiSourceListEnumSources(void){ CHAR prodcode[MAX_PATH]; CHAR prod_squashed[MAX_PATH]; CHAR keypath[MAX_PATH*2]; CHAR value[MAX_PATH]; LPSTR usersid; LONG res; UINT r; HKEY prodkey, userkey; HKEY url, net, source; DWORD size; REGSAM access = KEY_ALL_ACCESS;
create_test_guid(prodcode, prod_squashed); if (!(usersid = get_user_sid())) { skip("User SID not available -> skipping MsiSourceListEnumSourcesA tests\n"); return; }
if (is_wow64) access |= KEY_WOW64_64KEY;
/* GetLastError is not set by the function */
/* NULL szProductCodeOrPatchCode */ size = 0xdeadbeef; r = MsiSourceListEnumSourcesA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", size);
/* empty szProductCodeOrPatchCode */ size = 0xdeadbeef; r = MsiSourceListEnumSourcesA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", size);
/* garbage szProductCodeOrPatchCode */ size = 0xdeadbeef; r = MsiSourceListEnumSourcesA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", size);
/* guid without brackets */ size = 0xdeadbeef; r = MsiSourceListEnumSourcesA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", size);
/* guid with brackets */ size = 0xdeadbeef; r = MsiSourceListEnumSourcesA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); ok(size == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", size);
/* MSIINSTALLCONTEXT_USERUNMANAGED */
size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* user product key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegCreateKeyA(userkey, "SourceList", &source); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegCreateKeyA(source, "URL", &url); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* URL key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegSetValueExA(url, "1", 0, REG_SZ, (LPBYTE)"first", 6); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
res = RegSetValueExA(url, "2", 0, REG_SZ, (LPBYTE)"second", 7); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
res = RegSetValueExA(url, "4", 0, REG_SZ, (LPBYTE)"fourth", 7); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* sources exist */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value); ok(size == 5, "Expected 5, got %lu\n", size);
/* try index 0 again */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value); ok(size == 5, "Expected 5, got %lu\n", size);
/* both szSource and pcchSource are NULL, index 0 */ r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, NULL, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* both szSource and pcchSource are NULL, index 1 */ r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 1, NULL, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* size is exactly 5 */ size = 5; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got %s\n", value); ok(size == 5, "Expected 5, got %lu\n", size);
/* szSource is non-NULL while pcchSource is NULL */ lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got %s\n", value);
/* try index 1 after failure */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 1, value, &size); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
/* reset the enumeration */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value); ok(size == 5, "Expected 5, got %lu\n", size);
/* try index 1 */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 1, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "second"), "Expected \"second\", got %s\n", value); ok(size == 6, "Expected 6, got %lu\n", size);
/* try index 1 again */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 1, value, &size); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
/* try index 2 */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 2, value, &size); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
/* try index < 0 */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, -1, value, &size); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
/* NULL szUserSid */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value); ok(size == 5, "Expected 5, got %lu\n", size);
/* invalid dwOptions, must be one of MSICODE_ and MSISOURCETYPE_ */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, value, &size); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
/* invalid dwOptions, must be one of MSICODE_ and MSISOURCETYPE_ */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PATCH, 0, value, &size); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
/* invalid dwOptions, must be one of MSICODE_ and MSISOURCETYPE_ */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSICODE_PATCH | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_UNKNOWN_PATCH, "Expected ERROR_UNKNOWN_PATCH, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
/* invalid dwOptions, must be one of MSICODE_ and MSISOURCETYPE_ */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
RegDeleteValueA(url, "1"); RegDeleteValueA(url, "2"); RegDeleteValueA(url, "4"); RegDeleteKeyA(url, ""); RegCloseKey(url);
/* SourceList key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegCreateKeyA(source, "Net", &net); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* Net key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegSetValueExA(net, "1", 0, REG_SZ, (LPBYTE)"first", 6); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* sources exist */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value); ok(size == 5, "Expected 5, got %lu\n", size);
RegDeleteValueA(net, "1"); RegDeleteKeyA(net, ""); RegCloseKey(net); RegDeleteKeyA(source, ""); RegCloseKey(source); RegDeleteKeyA(userkey, ""); RegCloseKey(userkey);
/* MSIINSTALLCONTEXT_USERMANAGED */
size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\"); lstrcatA(keypath, usersid); lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); if (res != ERROR_SUCCESS) { skip("Product key creation failed with error code %ld\n", res); goto machine_tests; }
/* user product key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegCreateKeyExA(userkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegCreateKeyExA(source, "URL", 0, NULL, 0, access, NULL, &url, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* URL key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegSetValueExA(url, "1", 0, REG_SZ, (LPBYTE)"first", 6); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* sources exist */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value); ok(size == 5, "Expected 5, got %lu\n", size);
/* NULL szUserSid */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value); ok(size == 5, "Expected 5, got %lu\n", size);
RegDeleteValueA(url, "1"); RegDeleteKeyExA(url, "", access, 0); RegCloseKey(url);
/* SourceList key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegCreateKeyExA(source, "Net", 0, NULL, 0, access, NULL, &net, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* Net key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegSetValueExA(net, "1", 0, REG_SZ, (LPBYTE)"first", 6); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* sources exist */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value); ok(size == 5, "Expected 5, got %lu\n", size);
RegDeleteValueA(net, "1"); RegDeleteKeyExA(net, "", access, 0); RegCloseKey(net); RegDeleteKeyExA(source, "", access, 0); RegCloseKey(source); RegDeleteKeyExA(userkey, "", access, 0); RegCloseKey(userkey);
/* MSIINSTALLCONTEXT_MACHINE */
machine_tests: /* szUserSid is non-NULL */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, usersid, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
/* szUserSid is NULL */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); if (res != ERROR_SUCCESS) { skip("Product key creation failed with error code %ld\n", res); LocalFree(usersid); return; }
/* user product key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegCreateKeyExA(source, "URL", 0, NULL, 0, access, NULL, &url, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* URL key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegSetValueExA(url, "1", 0, REG_SZ, (LPBYTE)"first", 6); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* sources exist */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value); ok(size == 5, "Expected 5, got %lu\n", size);
/* NULL szUserSid */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value); ok(size == 5, "Expected 5, got %lu\n", size);
RegDeleteValueA(url, "1"); RegDeleteKeyExA(url, "", access, 0); RegCloseKey(url);
/* SourceList key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegCreateKeyExA(source, "Net", 0, NULL, 0, access, NULL, &net, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* Net key exists */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %lu\n", size);
res = RegSetValueExA(net, "1", 0, REG_SZ, (LPBYTE)"first", 6); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* sources exist */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = MsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(value, "first"), "Expected \"first\", got %s\n", value); ok(size == 5, "Expected 5, got %lu\n", size);
RegDeleteValueA(net, "1"); RegDeleteKeyExA(net, "", access, 0); RegCloseKey(net); RegDeleteKeyExA(source, "", access, 0); RegCloseKey(source); RegDeleteKeyExA(prodkey, "", access, 0); RegCloseKey(prodkey); LocalFree(usersid);}
static void test_MsiSourceListSetInfo(void){ CHAR prodcode[MAX_PATH]; CHAR prod_squashed[MAX_PATH]; CHAR keypath[MAX_PATH*2]; HKEY prodkey, userkey; HKEY net, url, media, source; LPSTR usersid; LONG res; UINT r; REGSAM access = KEY_ALL_ACCESS;
if (!is_process_elevated()) { skip("process is limited\n"); return; }
create_test_guid(prodcode, prod_squashed); if (!(usersid = get_user_sid())) { skip("User SID not available -> skipping MsiSourceListSetInfoA tests\n"); return; }
if (is_wow64) access |= KEY_WOW64_64KEY;
/* GetLastError is not set by the function */
/* NULL szProductCodeOrPatchCode */ r = MsiSourceListSetInfoA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* empty szProductCodeOrPatchCode */ r = MsiSourceListSetInfoA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* garbage szProductCodeOrPatchCode */ r = MsiSourceListSetInfoA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* guid without brackets */ r = MsiSourceListSetInfoA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* guid with brackets */ r = MsiSourceListSetInfoA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
/* dwOptions is MSICODE_PRODUCT */ r = MsiSourceListSetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
/* dwOptions is MSICODE_PATCH */ r = MsiSourceListSetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PATCH, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_UNKNOWN_PATCH, "Expected ERROR_UNKNOWN_PATCH, got %d\n", r);
/* dwOptions is both MSICODE_PRODUCT and MSICODE_PATCH */ r = MsiSourceListSetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSICODE_PATCH | MSISOURCETYPE_URL, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_UNKNOWN_PATCH, "Expected ERROR_UNKNOWN_PATCH, got %d\n", r);
/* dwOptions has both MSISOURCETYPE_NETWORK and MSISOURCETYPE_URL */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK | MSISOURCETYPE_URL, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
/* LastUsedSource and dwOptions has both * MSISOURCETYPE_NETWORK and MSISOURCETYPE_URL */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK | MSISOURCETYPE_URL, INSTALLPROPERTY_LASTUSEDSOURCEA, "path"); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
/* LastUsedSource and dwOptions has no source type */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEA, "path"); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
/* MSIINSTALLCONTEXT_USERUNMANAGED */
lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* user product key exists */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyA(userkey, "SourceList", &source); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists, no source type */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* Media key is created by MsiSourceListSetInfo */ res = RegOpenKeyA(source, "Media", &media); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); CHECK_REG_STR(media, "MediaPackage", "path");
/* set the info again */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path2"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); CHECK_REG_STR(media, "MediaPackage", "path2");
/* NULL szProperty */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, NULL, "path"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* empty szProperty */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, "", "path"); ok(r == ERROR_UNKNOWN_PROPERTY, "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
/* NULL szValue */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATHA, NULL); ok(r == ERROR_UNKNOWN_PROPERTY, "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
/* empty szValue */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATHA, ""); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); CHECK_REG_STR(media, "MediaPackage", "");
/* INSTALLPROPERTY_MEDIAPACKAGEPATH, MSISOURCETYPE_NETWORK */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* INSTALLPROPERTY_MEDIAPACKAGEPATH, MSISOURCETYPE_URL */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* INSTALLPROPERTY_DISKPROMPT */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_DISKPROMPTA, "prompt"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); CHECK_REG_STR(media, "DiskPrompt", "prompt");
/* INSTALLPROPERTY_DISKPROMPT, MSISOURCETYPE_NETWORK */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, INSTALLPROPERTY_DISKPROMPTA, "prompt"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* INSTALLPROPERTY_DISKPROMPT, MSISOURCETYPE_URL */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, INSTALLPROPERTY_DISKPROMPTA, "prompt"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* INSTALLPROPERTY_LASTUSEDSOURCE */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEA, "source"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* INSTALLPROPERTY_LASTUSEDSOURCE, MSISOURCETYPE_NETWORK */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, INSTALLPROPERTY_LASTUSEDSOURCEA, "source"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* Net key is created by MsiSourceListSetInfo */ res = RegOpenKeyA(source, "Net", &net); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); CHECK_REG_STR(net, "1", "source\\") CHECK_REG_STR(source, "LastUsedSource", "n;1;source");
/* source has forward slash */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, INSTALLPROPERTY_LASTUSEDSOURCEA, "source/"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); CHECK_REG_STR(net, "1", "source\\"); CHECK_REG_STR(net, "2", "source/\\"); CHECK_REG_STR(source, "LastUsedSource", "n;2;source/");
/* INSTALLPROPERTY_LASTUSEDSOURCE, MSISOURCETYPE_URL */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, INSTALLPROPERTY_LASTUSEDSOURCEA, "source"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* URL key is created by MsiSourceListSetInfo */ res = RegOpenKeyA(source, "URL", &url); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); CHECK_REG_STR(url, "1", "source/"); CHECK_REG_STR(source, "LastUsedSource", "u;1;source");
/* source has backslash */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, INSTALLPROPERTY_LASTUSEDSOURCEA, "source\\"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); CHECK_REG_STR(url, "1", "source/"); CHECK_REG_STR(url, "2", "source\\/"); CHECK_REG_STR(source, "LastUsedSource", "u;2;source\\");
/* INSTALLPROPERTY_LASTUSEDSOURCE, MSISOURCETYPE_MEDIA */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_MEDIA, INSTALLPROPERTY_LASTUSEDSOURCEA, "source"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* INSTALLPROPERTY_PACKAGENAME */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEA, "name"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); CHECK_REG_STR(source, "PackageName", "name");
/* INSTALLPROPERTY_PACKAGENAME, MSISOURCETYPE_NETWORK */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, INSTALLPROPERTY_PACKAGENAMEA, "name"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* INSTALLPROPERTY_PACKAGENAME, MSISOURCETYPE_URL */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, INSTALLPROPERTY_PACKAGENAMEA, "name"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* INSTALLPROPERTY_LASTUSEDTYPE */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDTYPEA, "type"); ok(r == ERROR_UNKNOWN_PROPERTY, "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
/* definitely unknown property */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, "unknown", "val"); ok(r == ERROR_UNKNOWN_PROPERTY, "Expected ERROR_UNKNOWN_PROPERTY, got %d\n", r);
RegDeleteValueA(net, "1"); RegDeleteKeyA(net, ""); RegCloseKey(net); RegDeleteValueA(url, "1"); RegDeleteKeyA(url, ""); RegCloseKey(url); RegDeleteValueA(media, "MediaPackage"); RegDeleteValueA(media, "DiskPrompt"); RegDeleteKeyA(media, ""); RegCloseKey(media); RegDeleteValueA(source, "PackageName"); RegDeleteKeyA(source, ""); RegCloseKey(source); RegDeleteKeyA(userkey, ""); RegCloseKey(userkey);
/* MSIINSTALLCONTEXT_USERMANAGED */
lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\"); lstrcatA(keypath, usersid); lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); if (res != ERROR_SUCCESS) { skip("Product key creation failed with error code %ld\n", res); goto machine_tests; }
/* user product key exists */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyExA(userkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists, no source type */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* Media key is created by MsiSourceListSetInfo */ res = RegOpenKeyExA(source, "Media", 0, access, &media); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); CHECK_REG_STR(media, "MediaPackage", "path");
RegDeleteValueA(media, "MediaPackage"); RegDeleteKeyExA(media, "", access, 0); RegCloseKey(media); RegDeleteKeyExA(source, "", access, 0); RegCloseKey(source); RegDeleteKeyExA(userkey, "", access, 0); RegCloseKey(userkey);
/* MSIINSTALLCONTEXT_MACHINE */
machine_tests: lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); if (res != ERROR_SUCCESS) { skip("Product key creation failed with error code %ld\n", res); LocalFree(usersid); return; }
/* user product key exists */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists, no source type */ r = MsiSourceListSetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); if (r == ERROR_ACCESS_DENIED) { skip("MsiSourceListSetInfo (insufficient privileges)\n"); goto done; } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* Media key is created by MsiSourceListSetInfo */ res = RegOpenKeyExA(source, "Media", 0, access, &media); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res); CHECK_REG_STR(media, "MediaPackage", "path");
/* szUserSid is non-NULL */ r = MsiSourceListSetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATHA, "path"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); RegDeleteValueA(media, "MediaPackage"); RegDeleteKeyExA(media, "", access, 0); RegCloseKey(media);
done: RegDeleteKeyExA(source, "", access, 0); RegCloseKey(source); RegDeleteKeyExA(prodkey, "", access, 0); RegCloseKey(prodkey); LocalFree(usersid);}
static void test_MsiSourceListAddMediaDisk(void){ CHAR prodcode[MAX_PATH]; CHAR prod_squashed[MAX_PATH]; CHAR keypath[MAX_PATH*2]; HKEY prodkey, userkey; HKEY media, source; LPSTR usersid; LONG res; UINT r; REGSAM access = KEY_ALL_ACCESS;
if (!is_process_elevated()) { skip("process is limited\n"); return; }
create_test_guid(prodcode, prod_squashed); if (!(usersid = get_user_sid())) { skip("User SID not available -> skipping MsiSourceListAddMediaDiskA tests\n"); return; }
if (is_wow64) access |= KEY_WOW64_64KEY;
/* GetLastError is not set by the function */
/* NULL szProductCodeOrPatchCode */ r = MsiSourceListAddMediaDiskA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, "label", "prompt"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* empty szProductCodeOrPatchCode */ r = MsiSourceListAddMediaDiskA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, "label", "prompt"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* garbage szProductCodeOrPatchCode */ r = MsiSourceListAddMediaDiskA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, "label", "prompt"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* guid without brackets */ r = MsiSourceListAddMediaDiskA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, "label", "prompt"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* guid with brackets */ r = MsiSourceListAddMediaDiskA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, "label", "prompt"); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
/* dwOptions has MSISOURCETYPE_NETWORK */ r = MsiSourceListAddMediaDiskA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 1, "label", "prompt"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* dwOptions has MSISOURCETYPE_URL */ r = MsiSourceListAddMediaDiskA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 1, "label", "prompt"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* dwOptions has MSISOURCETYPE_MEDIA */ r = MsiSourceListAddMediaDiskA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_MEDIA, 1, "label", "prompt"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* MSIINSTALLCONTEXT_USERUNMANAGED */
lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* user product key exists */ r = MsiSourceListAddMediaDiskA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, "label", "prompt"); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyA(userkey, "SourceList", &source); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists */ r = MsiSourceListAddMediaDiskA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, "label", "prompt"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* Media subkey is created by MsiSourceListAddMediaDisk */ res = RegOpenKeyA(source, "Media", &media); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
CHECK_REG_STR(media, "1", "label;prompt");
/* dwDiskId is random */ r = MsiSourceListAddMediaDiskA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 42, "label42", "prompt42"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
CHECK_REG_STR(media, "1", "label;prompt"); CHECK_REG_STR(media, "42", "label42;prompt42");
/* dwDiskId is 0 */ r = MsiSourceListAddMediaDiskA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, "label0", "prompt0"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
CHECK_REG_STR(media, "0", "label0;prompt0"); CHECK_REG_STR(media, "1", "label;prompt"); CHECK_REG_STR(media, "42", "label42;prompt42");
/* dwDiskId is < 0 */ r = MsiSourceListAddMediaDiskA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, -1, "label-1", "prompt-1"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
CHECK_REG_STR(media, "-1", "label-1;prompt-1"); CHECK_REG_STR(media, "0", "label0;prompt0"); CHECK_REG_STR(media, "1", "label;prompt"); CHECK_REG_STR(media, "42", "label42;prompt42");
/* update dwDiskId 1 */ r = MsiSourceListAddMediaDiskA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, "newlabel", "newprompt"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
CHECK_REG_STR(media, "-1", "label-1;prompt-1"); CHECK_REG_STR(media, "0", "label0;prompt0"); CHECK_REG_STR(media, "1", "newlabel;newprompt"); CHECK_REG_STR(media, "42", "label42;prompt42");
/* update dwDiskId 1, szPrompt is NULL */ r = MsiSourceListAddMediaDiskA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, "etiqueta", NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
CHECK_REG_STR(media, "-1", "label-1;prompt-1"); CHECK_REG_STR(media, "0", "label0;prompt0"); CHECK_REG_STR(media, "1", "etiqueta;"); CHECK_REG_STR(media, "42", "label42;prompt42");
/* update dwDiskId 1, szPrompt is empty */ r = MsiSourceListAddMediaDiskA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, "etikett", ""); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* update dwDiskId 1, szVolumeLabel is NULL */ r = MsiSourceListAddMediaDiskA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, NULL, "provocar"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
CHECK_REG_STR(media, "-1", "label-1;prompt-1"); CHECK_REG_STR(media, "0", "label0;prompt0"); CHECK_REG_STR(media, "1", ";provocar"); CHECK_REG_STR(media, "42", "label42;prompt42");
/* update dwDiskId 1, szVolumeLabel is empty */ r = MsiSourceListAddMediaDiskA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, "", "provoquer"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* szUserSid is NULL */ r = MsiSourceListAddMediaDiskA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, NULL, "provoquer"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
CHECK_REG_STR(media, "-1", "label-1;prompt-1"); CHECK_REG_STR(media, "0", "label0;prompt0"); CHECK_REG_STR(media, "1", ";provoquer"); CHECK_REG_STR(media, "42", "label42;prompt42");
RegDeleteValueA(media, "-1"); RegDeleteValueA(media, "0"); RegDeleteValueA(media, "1"); RegDeleteValueA(media, "42"); RegDeleteKeyA(media, ""); RegCloseKey(media); RegDeleteKeyA(source, ""); RegCloseKey(source); RegDeleteKeyA(userkey, ""); RegCloseKey(userkey);
/* MSIINSTALLCONTEXT_USERMANAGED */
lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\"); lstrcatA(keypath, usersid); lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); if (res != ERROR_SUCCESS) { skip("Product key creation failed with error code %ld\n", res); goto machine_tests; }
/* user product key exists */ r = MsiSourceListAddMediaDiskA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, 1, "label", "prompt"); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyExA(userkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists */ r = MsiSourceListAddMediaDiskA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, 1, "label", "prompt"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* Media subkey is created by MsiSourceListAddMediaDisk */ res = RegOpenKeyExA(source, "Media", 0, access, &media); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
CHECK_REG_STR(media, "1", "label;prompt");
RegDeleteValueA(media, "1"); RegDeleteKeyExA(media, "", access, 0); RegCloseKey(media); RegDeleteKeyExA(source, "", access, 0); RegCloseKey(source); RegDeleteKeyExA(userkey, "", access, 0); RegCloseKey(userkey);
/* MSIINSTALLCONTEXT_MACHINE */
machine_tests: lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); if (res != ERROR_SUCCESS) { skip("Product key creation failed with error code %ld\n", res); LocalFree(usersid); return; }
/* machine product key exists */ r = MsiSourceListAddMediaDiskA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT, 1, "label", "prompt"); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists */ r = MsiSourceListAddMediaDiskA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT, 1, "label", "prompt"); if (r == ERROR_ACCESS_DENIED) { skip("MsiSourceListAddMediaDisk (insufficient privileges)\n"); goto done; } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* Media subkey is created by MsiSourceListAddMediaDisk */ res = RegOpenKeyExA(source, "Media", 0, access, &media); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
CHECK_REG_STR(media, "1", "label;prompt");
/* szUserSid is non-NULL */ r = MsiSourceListAddMediaDiskA(prodcode, usersid, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT, 1, "label", "prompt"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); RegDeleteValueA(media, "1"); RegDeleteKeyExA(media, "", access, 0); RegCloseKey(media);
done: RegDeleteKeyExA(source, "", access, 0); RegCloseKey(source); RegDeleteKeyExA(prodkey, "", access, 0); RegCloseKey(prodkey); LocalFree(usersid);}
static void test_MsiSourceListEnumMediaDisks(void){ CHAR prodcode[MAX_PATH]; CHAR prod_squashed[MAX_PATH]; CHAR keypath[MAX_PATH*2]; CHAR label[MAX_PATH]; CHAR prompt[MAX_PATH]; HKEY prodkey, userkey, media, source; DWORD labelsz, promptsz, val, id; LPSTR usersid; LONG res; UINT r; REGSAM access = KEY_ALL_ACCESS;
create_test_guid(prodcode, prod_squashed); if (!(usersid = get_user_sid())) { skip("User SID not available -> skipping MsiSourceListEnumMediaDisksA tests\n"); return; }
if (is_wow64) access |= KEY_WOW64_64KEY;
/* GetLastError is not set by the function */
/* NULL szProductCodeOrPatchCode */ labelsz = sizeof(label); promptsz = sizeof(prompt); r = MsiSourceListEnumMediaDisksA(NULL, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* empty szProductCodeOrPatchCode */ labelsz = sizeof(label); promptsz = sizeof(prompt); r = MsiSourceListEnumMediaDisksA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* garbage szProductCodeOrPatchCode */ labelsz = sizeof(label); promptsz = sizeof(prompt); r = MsiSourceListEnumMediaDisksA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* guid without brackets */ labelsz = sizeof(label); promptsz = sizeof(prompt); r = MsiSourceListEnumMediaDisksA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* guid with brackets */ labelsz = sizeof(label); promptsz = sizeof(prompt); r = MsiSourceListEnumMediaDisksA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
/* dwOptions has MSISOURCETYPE_NETWORK */ labelsz = sizeof(label); promptsz = sizeof(prompt); r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* dwOptions has MSISOURCETYPE_URL */ labelsz = sizeof(label); promptsz = sizeof(prompt); r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* dwIndex is non-zero */ labelsz = sizeof(label); promptsz = sizeof(prompt); r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* MSIINSTALLCONTEXT_USERUNMANAGED */
lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* user product key exists */ labelsz = sizeof(label); promptsz = sizeof(prompt); r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyA(userkey, "SourceList", &source); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists */ id = 0xbeef; lstrcpyA(label, "aaa"); labelsz = 0xdeadbeef; lstrcpyA(prompt, "bbb"); promptsz = 0xdeadbeef; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(id == 0xbeef, "Expected 0xbeef, got %lu\n", id); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(labelsz == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", promptsz);
res = RegCreateKeyA(source, "Media", &media); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* Media key exists */ id = 0xbeef; lstrcpyA(label, "aaa"); labelsz = 0xdeadbeef; lstrcpyA(prompt, "bbb"); promptsz = 0xdeadbeef; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(id == 0xbeef, "Expected 0xbeef, got %lu\n", id); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(labelsz == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", promptsz);
res = RegSetValueExA(media, "1", 0, REG_SZ, (LPBYTE)"label;prompt", 13); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* disk exists */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 1, "Expected 1, got %lu\n", id); ok(!lstrcmpA(label, "label"), "Expected \"label\", got \"%s\"\n", label); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "prompt"), "Expected \"prompt\", got \"%s\"\n", prompt); ok(promptsz == 6, "Expected 6, got %lu\n", promptsz);
res = RegSetValueExA(media, "2", 0, REG_SZ, (LPBYTE)"one;two", 8); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* now disk 2 exists, get the sizes */ id = 0; labelsz = MAX_PATH; promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, &id, NULL, &labelsz, NULL, &promptsz); ok(r == ERROR_SUCCESS || r == ERROR_INVALID_PARAMETER, "Expected ERROR_SUCCESS or ERROR_INVALID_PARAMETER, got %d\n", r); if (r == ERROR_SUCCESS) { ok(id == 2, "Expected 2, got %lu\n", id); ok(labelsz == 3, "Expected 3, got %lu\n", labelsz); ok(promptsz == 3, "Expected 3, got %lu\n", promptsz); }
/* now fill in the values */ id = 0xbeef; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS || r == ERROR_INVALID_PARAMETER, "Expected ERROR_SUCCESS or ERROR_INVALID_PARAMETER, got %d\n", r); if (r == ERROR_SUCCESS) { ok(id == 2, "Expected 2, got %lu\n", id); ok(!lstrcmpA(label, "one"), "Expected \"one\", got \"%s\"\n", label); ok(labelsz == 3, "Expected 3, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "two"), "Expected \"two\", got \"%s\"\n", prompt); ok(promptsz == 3, "Expected 3, got %lu\n", promptsz); } else if (r == ERROR_INVALID_PARAMETER) { ok(id == 0xbeef, "Expected 0xbeef, got %lu\n", id); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(labelsz == MAX_PATH, "Expected MAX_PATH, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == MAX_PATH, "Expected MAX_PATH, got %lu\n", promptsz); }
res = RegSetValueExA(media, "4", 0, REG_SZ, (LPBYTE)"three;four", 11); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* disks 1, 2, 4 exist, reset the enumeration */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 1, "Expected 1, got %lu\n", id); ok(!lstrcmpA(label, "label"), "Expected \"label\", got \"%s\"\n", label); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "prompt"), "Expected \"prompt\", got \"%s\"\n", prompt); ok(promptsz == 6, "Expected 6, got %lu\n", promptsz);
/* disks 1, 2, 4 exist, index 1 */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 2, "Expected 2, got %lu\n", id); ok(!lstrcmpA(label, "one"), "Expected \"one\", got \"%s\"\n", label); ok(labelsz == 3, "Expected 3, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "two"), "Expected \"two\", got \"%s\"\n", prompt); ok(promptsz == 3, "Expected 3, got %lu\n", promptsz);
/* disks 1, 2, 4 exist, index 2 */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 2, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 4, "Expected 4, got %lu\n", id); ok(!lstrcmpA(label, "three"), "Expected \"three\", got \"%s\"\n", label); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "four"), "Expected \"four\", got \"%s\"\n", prompt); ok(promptsz == 4, "Expected 4, got %lu\n", promptsz);
/* disks 1, 2, 4 exist, index 3, invalid */ id = 0xbeef; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 3, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(id == 0xbeef, "Expected 0xbeef, got %lu\n", id); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(labelsz == MAX_PATH, "Expected MAX_PATH, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == MAX_PATH, "Expected MAX_PATH, got %lu\n", promptsz);
/* disks 1, 2, 4 exist, reset the enumeration */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 1, "Expected 1, got %lu\n", id); ok(!lstrcmpA(label, "label"), "Expected \"label\", got \"%s\"\n", label); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "prompt"), "Expected \"prompt\", got \"%s\"\n", prompt); ok(promptsz == 6, "Expected 6, got %lu\n", promptsz);
/* try index 0 again */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 1, "Expected 1, got %lu\n", id); ok(!lstrcmpA(label, "label"), "Expected \"label\", got \"%s\"\n", label); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "prompt"), "Expected \"prompt\", got \"%s\"\n", prompt); ok(promptsz == 6, "Expected 6, got %lu\n", promptsz);
/* jump to index 2 */ id = 0xbeef; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 2, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(id == 0xbeef, "Expected 0xbeef, got %lu\n", id); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(labelsz == MAX_PATH, "Expected MAX_PATH, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == MAX_PATH, "Expected MAX_PATH, got %lu\n", promptsz);
/* after error, try index 1 */ id = 0xbeef; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 2, "Expected 2, got %lu\n", id); ok(!lstrcmpA(label, "one"), "Expected \"one\", got \"%s\"\n", label); ok(labelsz == 3, "Expected 3, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "two"), "Expected \"two\", got \"%s\"\n", prompt); ok(promptsz == 3, "Expected 3, got %lu\n", promptsz);
/* try index 1 again */ id = 0xbeef; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 1, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(id == 0xbeef, "Expected 0xbeef, got %lu\n", id); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(labelsz == MAX_PATH, "Expected MAX_PATH, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == MAX_PATH, "Expected MAX_PATH, got %lu\n", promptsz);
/* NULL pdwDiskId */ lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, NULL, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(label, "label"), "Expected \"label\", got \"%s\"\n", label); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "prompt"), "Expected \"prompt\", got \"%s\"\n", prompt); ok(promptsz == 6, "Expected 6, got %lu\n", promptsz);
/* szVolumeLabel is NULL */ id = 0; labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, NULL, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS || r == ERROR_INVALID_PARAMETER, "Expected ERROR_SUCCESS or ERROR_INVALID_PARAMETER, got %d\n", r); if (r == ERROR_SUCCESS) { ok(id == 1, "Expected 1, got %lu\n", id); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "prompt"), "Expected \"prompt\", got \"%s\"\n", prompt); ok(promptsz == 6, "Expected 6, got %lu\n", promptsz); }
/* szVolumeLabel and pcchVolumeLabel are NULL */ id = 0; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, NULL, NULL, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 1, "Expected 1, got %lu\n", id); ok(!lstrcmpA(prompt, "prompt"), "Expected \"prompt\", got \"%s\"\n", prompt); ok(promptsz == 6, "Expected 6, got %lu\n", promptsz);
/* szVolumeLabel is non-NULL while pcchVolumeLabel is NULL */ id = 0xbeef; lstrcpyA(label, "aaa"); lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, NULL, prompt, &promptsz); ok(r == ERROR_SUCCESS || r == ERROR_INVALID_PARAMETER, "Expected ERROR_SUCCESS or ERROR_INVALID_PARAMETER, got %d\n", r); if (r == ERROR_SUCCESS) { ok(id == 1, "Expected 1, got %lu\n", id); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(!lstrcmpA(prompt, "prompt"), "Expected \"prompt\", got \"%s\"\n", prompt); ok(promptsz == 6, "Expected 6, got %lu\n", promptsz); }
/* szDiskPrompt is NULL */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, NULL, &promptsz); ok(r == ERROR_SUCCESS || r == ERROR_INVALID_PARAMETER, "Expected ERROR_SUCCESS, got %d\n", r); if (r == ERROR_SUCCESS) { ok(id == 1, "Expected 1, got %lu\n", id); ok(!lstrcmpA(label, "label"), "Expected \"label\", got \"%s\"\n", label); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz); ok(promptsz == 6, "Expected 6, got %lu\n", promptsz); }
/* szDiskPrompt and pcchDiskPrompt are NULL */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, NULL, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 1, "Expected 1, got %lu\n", id); ok(!lstrcmpA(label, "label"), "Expected \"label\", got \"%s\"\n", label); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz);
/* szDiskPrompt is non-NULL while pcchDiskPrompt is NULL */ id = 0xbeef; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(id == 0xbeef, "Expected 0xbeef, got %lu\n", id); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(labelsz == MAX_PATH, "Expected MAX_PATH, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt);
/* pcchVolumeLabel, szDiskPrompt and pcchDiskPrompt are NULL */ id = 0; lstrcpyA(label, "aaa"); r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, NULL, NULL, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(id == 1, "Expected 1, got %lu\n", id);
/* szVolumeLabel, pcchVolumeLabel, szDiskPrompt and pcchDiskPrompt are NULL */ id = 0; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, NULL, NULL, NULL, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 1, "Expected 1, got %lu\n", id);
/* pcchVolumeLabel is exactly 5 */ lstrcpyA(label, "aaa"); labelsz = 5; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, NULL, label, &labelsz, prompt, &promptsz); ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == 6, "Expected 6, got %lu\n", promptsz);
/* pcchDiskPrompt is exactly 6 */ lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = 6; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, NULL, label, &labelsz, prompt, &promptsz); ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == 6, "Expected 6, got %lu\n", promptsz);
res = RegSetValueExA(media, "1", 0, REG_SZ, (LPBYTE)"label", 13); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* no semicolon */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 1, "Expected 1, got %lu\n", id); ok(!lstrcmpA(label, "label"), "Expected \"label\", got \"%s\"\n", label); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "label"), "Expected \"label\", got \"%s\"\n", prompt); ok(promptsz == 5, "Expected 5, got %lu\n", promptsz);
res = RegSetValueExA(media, "1", 0, REG_SZ, (LPBYTE)"label;", 13); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* semicolon, no disk prompt */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 1, "Expected 1, got %lu\n", id); ok(!lstrcmpA(label, "label"), "Expected \"label\", got \"%s\"\n", label); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz); ok(!lstrcmpA(prompt, ""), "Expected \"\", got \"%s\"\n", prompt); ok(promptsz == 0, "Expected 0, got %lu\n", promptsz);
res = RegSetValueExA(media, "1", 0, REG_SZ, (LPBYTE)";prompt", 13); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* semicolon, label doesn't exist */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 1, "Expected 1, got %lu\n", id); ok(!lstrcmpA(label, ""), "Expected \"\", got \"%s\"\n", label); ok(labelsz == 0, "Expected 0, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "prompt"), "Expected \"prompt\", got \"%s\"\n", prompt); ok(promptsz == 6, "Expected 6, got %lu\n", promptsz);
res = RegSetValueExA(media, "1", 0, REG_SZ, (LPBYTE)";", 13); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* semicolon, neither label nor disk prompt exist */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 1, "Expected 1, got %lu\n", id); ok(!lstrcmpA(label, ""), "Expected \"\", got \"%s\"\n", label); ok(labelsz == 0, "Expected 0, got %lu\n", labelsz); ok(!lstrcmpA(prompt, ""), "Expected \"\", got \"%s\"\n", prompt); ok(promptsz == 0, "Expected 0, got %lu\n", promptsz);
val = 42; res = RegSetValueExA(media, "1", 0, REG_DWORD, (LPBYTE)&val, sizeof(DWORD)); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* type is REG_DWORD */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 1, "Expected 1, got %lu\n", id); ok(!lstrcmpA(label, "#42"), "Expected \"#42\", got \"%s\"\n", label); ok(labelsz == 3, "Expected 3, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "#42"), "Expected \"#42\", got \"%s\"\n", prompt); ok(promptsz == 3, "Expected 3, got %lu\n", promptsz);
RegDeleteValueA(media, "1"); RegDeleteValueA(media, "2"); RegDeleteValueA(media, "4"); RegDeleteKeyA(media, ""); RegCloseKey(media); RegDeleteKeyA(source, ""); RegCloseKey(source); RegDeleteKeyA(userkey, ""); RegCloseKey(userkey);
/* MSIINSTALLCONTEXT_USERMANAGED */
lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\"); lstrcatA(keypath, usersid); lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); if (res != ERROR_SUCCESS) { skip("Product key creation failed with error code %ld\n", res); goto machine_tests; }
/* user product key exists */ r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyExA(userkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists */ id = 0xbeef; lstrcpyA(label, "aaa"); labelsz = 0xdeadbeef; lstrcpyA(prompt, "bbb"); promptsz = 0xdeadbeef; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(id == 0xbeef, "Expected 0xbeef, got %lu\n", id); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(labelsz == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", promptsz);
res = RegCreateKeyExA(source, "Media", 0, NULL, 0, access, NULL, &media, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* Media key exists */ id = 0xbeef; lstrcpyA(label, "aaa"); labelsz = 0xdeadbeef; lstrcpyA(prompt, "bbb"); promptsz = 0xdeadbeef; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(id == 0xbeef, "Expected 0xbeef, got %lu\n", id); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(labelsz == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", promptsz);
res = RegSetValueExA(media, "2", 0, REG_SZ, (LPBYTE)"label;prompt", 13); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* disk exists, but no id 1 */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 2, "Expected 2, got %lu\n", id); ok(!lstrcmpA(label, "label"), "Expected \"label\", got \"%s\"\n", label); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "prompt"), "Expected \"prompt\", got \"%s\"\n", prompt); ok(promptsz == 6, "Expected 6, got %lu\n", promptsz);
RegDeleteValueA(media, "2"); RegDeleteKeyExA(media, "", access, 0); RegCloseKey(media); RegDeleteKeyExA(source, "", access, 0); RegCloseKey(source); RegDeleteKeyExA(userkey, "", access, 0); RegCloseKey(userkey);
/* MSIINSTALLCONTEXT_MACHINE */
machine_tests: lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); if (res != ERROR_SUCCESS) { skip("Product key creation failed with error code %ld\n", res); LocalFree(usersid); return; }
/* machine product key exists */ r = MsiSourceListEnumMediaDisksA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists */ id = 0xbeef; lstrcpyA(label, "aaa"); labelsz = 0xdeadbeef; lstrcpyA(prompt, "bbb"); promptsz = 0xdeadbeef; r = MsiSourceListEnumMediaDisksA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(id == 0xbeef, "Expected 0xbeef, got %lu\n", id); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(labelsz == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", promptsz);
res = RegCreateKeyExA(source, "Media", 0, NULL, 0, access, NULL, &media, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* Media key exists */ id = 0xbeef; lstrcpyA(label, "aaa"); labelsz = 0xdeadbeef; lstrcpyA(prompt, "bbb"); promptsz = 0xdeadbeef; r = MsiSourceListEnumMediaDisksA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(id == 0xbeef, "Expected 0xbeef, got %lu\n", id); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(labelsz == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == 0xdeadbeef, "Expected 0xdeadbeef, got %lu\n", promptsz);
res = RegSetValueExA(media, "2", 0, REG_SZ, (LPBYTE)"label;prompt", 13); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* disk exists, but no id 1 */ id = 0; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 2, "Expected 2, got %lu\n", id); ok(!lstrcmpA(label, "label"), "Expected \"label\", got \"%s\"\n", label); ok(labelsz == 5, "Expected 5, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "prompt"), "Expected \"prompt\", got \"%s\"\n", prompt); ok(promptsz == 6, "Expected 6, got %lu\n", promptsz);
/* szUserSid is non-NULL */ id = 0xbeef; lstrcpyA(label, "aaa"); labelsz = MAX_PATH; lstrcpyA(prompt, "bbb"); promptsz = MAX_PATH; r = MsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_MACHINE, MSICODE_PRODUCT, 0, &id, label, &labelsz, prompt, &promptsz); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(id == 0xbeef, "Expected 0xbeef, got %lu\n", id); ok(!lstrcmpA(label, "aaa"), "Expected \"aaa\", got \"%s\"\n", label); ok(labelsz == MAX_PATH, "Expected MAX_PATH, got %lu\n", labelsz); ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == MAX_PATH, "Expected MAX_PATH, got %lu\n", promptsz);
RegDeleteValueA(media, "2"); RegDeleteKeyExA(media, "", access, 0); RegCloseKey(media); RegDeleteKeyExA(source, "", access, 0); RegCloseKey(source); RegDeleteKeyExA(prodkey, "", access, 0); RegCloseKey(prodkey); LocalFree(usersid);}
static void test_MsiSourceListAddSource(void){ CHAR prodcode[MAX_PATH]; CHAR prod_squashed[MAX_PATH]; CHAR keypath[MAX_PATH*2]; CHAR username[MAX_PATH]; LPSTR usersid; LONG res; UINT r; HKEY prodkey, userkey, net, source; DWORD size; REGSAM access = KEY_ALL_ACCESS;
if (!is_process_elevated()) { skip("process is limited\n"); return; }
create_test_guid(prodcode, prod_squashed); if (!(usersid = get_user_sid())) { skip("User SID not available -> skipping MsiSourceListAddSourceA tests\n"); return; }
/* MACHINENAME\username */ size = MAX_PATH; GetUserNameExA(NameSamCompatible, username, &size); trace("username: %s\n", username);
if (is_wow64) access |= KEY_WOW64_64KEY;
/* GetLastError is not set by the function */
/* NULL szProduct */ r = MsiSourceListAddSourceA(NULL, username, 0, "source"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* empty szProduct */ r = MsiSourceListAddSourceA("", username, 0, "source"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* garbage szProduct */ r = MsiSourceListAddSourceA("garbage", username, 0, "source"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* guid without brackets */ r = MsiSourceListAddSourceA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA", username, 0, "source"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* guid with brackets */ r = MsiSourceListAddSourceA("{51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA}", username, 0, "source"); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
/* dwReserved is not 0 */ r = MsiSourceListAddSourceA(prodcode, username, 42, "source"); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* szSource is NULL */ r = MsiSourceListAddSourceA(prodcode, username, 0, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* szSource is empty */ r = MsiSourceListAddSourceA(prodcode, username, 0, ""); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
/* MSIINSTALLCONTEXT_USERMANAGED */
r = MsiSourceListAddSourceA(prodcode, username, 0, "source"); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\"); lstrcatA(keypath, usersid); lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); if (res != ERROR_SUCCESS) { skip("Product key creation failed with error code %ld\n", res); goto userunmanaged_tests; }
/* user product key exists */ r = MsiSourceListAddSourceA(prodcode, username, 0, "source"); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyExA(userkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists */ r = MsiSourceListAddSourceA(prodcode, username, 0, "source"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* Net key is created */ res = RegOpenKeyExA(source, "Net", 0, access, &net); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* LastUsedSource does not exist and it is not created */ res = RegQueryValueExA(source, "LastUsedSource", 0, NULL, NULL, NULL); ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", res);
CHECK_REG_STR(net, "1", "source\\");
RegDeleteValueA(net, "1"); RegDeleteKeyExA(net, "", access, 0); RegCloseKey(net);
res = RegSetValueExA(source, "LastUsedSource", 0, REG_SZ, (LPBYTE)"blah", 5); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* LastUsedSource value exists */ r = MsiSourceListAddSourceA(prodcode, username, 0, "source"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* Net key is created */ res = RegOpenKeyExA(source, "Net", 0, access, &net); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
CHECK_REG_STR(source, "LastUsedSource", "blah"); CHECK_REG_STR(net, "1", "source\\");
RegDeleteValueA(net, "1"); RegDeleteKeyExA(net, "", access, 0); RegCloseKey(net);
res = RegSetValueExA(source, "LastUsedSource", 0, REG_SZ, (LPBYTE)"5", 2); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* LastUsedSource is an integer */ r = MsiSourceListAddSourceA(prodcode, username, 0, "source"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* Net key is created */ res = RegOpenKeyExA(source, "Net", 0, access, &net); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
CHECK_REG_STR(source, "LastUsedSource", "5"); CHECK_REG_STR(net, "1", "source\\");
/* Add a second source, has trailing backslash */ r = MsiSourceListAddSourceA(prodcode, username, 0, "another\\"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
CHECK_REG_STR(source, "LastUsedSource", "5"); CHECK_REG_STR(net, "1", "source\\"); CHECK_REG_STR(net, "2", "another\\");
res = RegSetValueExA(source, "LastUsedSource", 0, REG_SZ, (LPBYTE)"2", 2); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* LastUsedSource is in the source list */ r = MsiSourceListAddSourceA(prodcode, username, 0, "third/"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
CHECK_REG_STR(source, "LastUsedSource", "2"); CHECK_REG_STR(net, "1", "source\\"); CHECK_REG_STR(net, "2", "another\\"); CHECK_REG_STR(net, "3", "third/\\");
RegDeleteValueA(net, "1"); RegDeleteValueA(net, "2"); RegDeleteValueA(net, "3"); RegDeleteKeyExA(net, "", access, 0); RegCloseKey(net); RegDeleteKeyExA(source, "", access, 0); RegCloseKey(source); RegDeleteKeyExA(userkey, "", access, 0); RegCloseKey(userkey);
/* MSIINSTALLCONTEXT_USERUNMANAGED */
userunmanaged_tests: r = MsiSourceListAddSourceA(prodcode, username, 0, "source"); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey); if (res != ERROR_SUCCESS) { skip("Product key creation failed with error code %ld\n", res); goto machine_tests; }
/* user product key exists */ r = MsiSourceListAddSourceA(prodcode, username, 0, "source"); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyA(userkey, "SourceList", &source); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists */ r = MsiSourceListAddSourceA(prodcode, username, 0, "source"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* Net key is created */ res = RegOpenKeyA(source, "Net", &net); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
CHECK_REG_STR(net, "1", "source\\");
RegDeleteValueA(net, "1"); RegDeleteKeyA(net, ""); RegCloseKey(net); RegDeleteKeyA(source, ""); RegCloseKey(source); RegDeleteKeyA(userkey, ""); RegCloseKey(userkey);
/* MSIINSTALLCONTEXT_MACHINE */
machine_tests: r = MsiSourceListAddSourceA(prodcode, NULL, 0, "source"); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r);
lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed);
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); if (res != ERROR_SUCCESS) { skip("Product key creation failed with error code %ld\n", res); LocalFree(usersid); return; }
/* machine product key exists */ r = MsiSourceListAddSourceA(prodcode, NULL, 0, "source"); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r);
res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
/* SourceList key exists */ r = MsiSourceListAddSourceA(prodcode, NULL, 0, "source"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
/* Net key is created */ res = RegOpenKeyExA(source, "Net", 0, access, &net); if (res == ERROR_ACCESS_DENIED) { skip("MsiSourceListAddSource (insufficient privileges)\n"); goto done; } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", res);
CHECK_REG_STR(net, "1", "source\\");
/* empty szUserName */ r = MsiSourceListAddSourceA(prodcode, "", 0, "another"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
CHECK_REG_STR(net, "1", "source\\"); CHECK_REG_STR(net, "2", "another\\");
RegDeleteValueA(net, "2"); RegDeleteValueA(net, "1"); RegDeleteKeyExA(net, "", access, 0); RegCloseKey(net);
done: RegDeleteKeyExA(source, "", access, 0); RegCloseKey(source); RegDeleteKeyExA(prodkey, "", access, 0); RegCloseKey(prodkey); LocalFree(usersid);}
START_TEST(source){ if (!is_process_elevated()) restart_as_admin_elevated();
IsWow64Process(GetCurrentProcess(), &is_wow64);
test_MsiSourceListGetInfo(); test_MsiSourceListAddSourceEx(); test_MsiSourceListEnumSources(); test_MsiSourceListSetInfo(); test_MsiSourceListAddMediaDisk(); test_MsiSourceListEnumMediaDisks(); test_MsiSourceListAddSource();}