Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • wine/wine
  • rbernon/wine
  • stefan/wine
  • FireBurn/wine
  • alesliehughes/wine
  • zhiyi/wine
  • huw/wine
  • jsikorski/wine
  • hmc/wine
  • dadangnh/wine
  • epo/wine
  • dlesho/wine
  • DarkShadow44/wine
  • iamahuman/wine
  • jacek/wine
  • mstorsjo/wine
  • gofman/wine
  • alexhenrie/wine
  • giomasce/wine
  • tclem/wine
  • besentv/wine
  • dlehman25/wine
  • aeikum/wine
  • cdavis5e/wine
  • sbaars/wine
  • baskanov/wine
  • pperdigao/wine
  • DavidHusicka/wine
  • DadSchoorse/wine
  • gverm/wine
  • bshanks/wine
  • gonzoMD/wine
  • Mystral/wine
  • tmatthies/wine
  • zlice/wine
  • AndreRH/wine
  • madewokherd/wine
  • zfigura/wine
  • fgouget/wine
  • nsivov/wine
  • ElementalWarrior/wine
  • piotr/wine
  • timozuccarello/wine
  • DavidCurtiss/wine
  • cmcadams/wine
  • davidebeatrici/wine
  • hans/wine
  • insn/wine
  • danrm/wine
  • jklemann/wine
  • saedo/wine
  • sgwaki/wine
  • puetzk/wine
  • bernhardu/wine
  • ReDress/wine
  • jlucfarias/wine
  • sloper42/wine
  • ivyl/wine
  • zhui/wine
  • julliard/wine
  • ClearlyClaire/wine
  • Alexander-Wilms/wine
  • rndtrash/wine
  • redmcg/wine
  • jkfloris/wine
  • maljaf/wine
  • Tuupertunut/wine
  • bsjeon/wine
  • tati/wine
  • whydoubt/wine
  • doitsujin/wine
  • shaunren/wine
  • szanni/wine
  • tobi.goergens/wine-cabinet-patch
  • winspool/wine
  • olivierfrdierick/wine
  • linkmauve/wine
  • jin-king1/wine
  • yeyeshun/wine
  • sulix/wine
  • bgc/wine
  • fanwenjie/wine
  • IncubusRK/wine
  • js6pak/wine
  • AurimasF/wine
  • etaash.mathamsetty/wine
  • hverbeet/wine
  • Fox2Code/wine
  • jhol/wine
  • jrueger/wine
  • afrantzis/wine
  • lauri.kentta/wine
  • ehoover/wine
  • cdenton/wine
  • jkloetzke/wine
  • baryluk/wine
  • restet/wine-personal
  • orudge/wine
  • Gcenx/wine
  • mstefani/wine
  • hibbsncc1701/wine
  • jchw/wine
  • moceap/wine
  • Skryptonyte/wine
  • marzent/wine
  • msmeissn/wine
  • learn-more/wine
  • logos128/wine
  • xe/wine
  • florian-kuebler/wine
  • eason329/wine
  • gang65/wine
  • binarymaster/wine
  • nbosio1001/wine
  • sh.owais95/wine
  • yaoyuan.0553/wine
  • AnthonyLaurienti/wine
  • mivanchev/wine
  • Hi-Angel/wine
  • vt/wine
  • wyrquill/wine
  • waynus/wine
  • wuliande/wine
  • yao.yuan.wn/wine
  • K1K1/wine
  • lukehutch1027/wine
  • etang-cw/wine
  • Josueblanco/wine
  • jplotz/wine
  • j20001970/wine
  • jsm174/wine
  • aricstewart/wine
  • uncoveryoureyestheresnosun/wine
  • VitorRamos/wine
  • 0e4ef622/wine
  • tj4048750/wine
  • xantares/wine
  • maxfigura/wine
  • sanane/wine
  • juniorjr9345/wine
  • lucaspereira1234/wine
  • gerald/wine
  • lepemiguel32/wine
  • caibb2018/wine
  • CNB_Kevin/wine
  • thc13/wine
  • jaihysc/wine
  • youngsecurity/wine
  • chendeqiang1024/wine
  • rhendric/wine
  • databoose/wine
  • memory-thrasher/wine
  • salman.tajik22/wine
  • CowFroggers/wine
  • kbdharun/wine
  • dreamer/wine
  • babyjoey711/wine
  • ripxorip/wine
  • PSzczepanski1996/wine
  • steveshe006/wine
  • joshua/wine
  • cmccarthy/wine
  • tomjansen/wine
  • sonyps5201314/wine
  • katelynnking4281/wine
  • dhary686/wine
  • mathematician/wine
  • rhabacker/wine
  • steveschnepp/wine
  • nekotekina/wine
  • Aaron1011/wine
  • catsout/wine
  • kasper93/wine
  • beef331/wine
  • ESD/wine
  • sarosib/wine
  • ghurmcardash/wine
  • AMZN-hgoffin/wine
  • gtmikw/wine
  • Keming/wine
  • dpjh747-gl/wine
  • tzluo/wine
  • rfz/wine
  • illia.a.polishchuk/wine
  • new_kleth/wine
  • serkan-maker/wine
  • w-flo/wine
  • mikayahlevi/wine
  • nulleve/wine
  • pgruebele/wine
  • athiele/wine
  • paparaha4/wine
  • novenary/wine
  • Plavil/wine
  • longjunyu/wine
  • chrisli/wine
  • samkottler/wine
  • danielzgtg/wine
  • twcassel/wine
  • guo/wine
  • didier31/wine
  • Zhaoyi/wine
  • twhitehead/wine
  • svyatpro/wine
  • infyquest/wine-iq-devel
  • sebres/wine
  • endrift/wine
  • zhengbl/wine
  • joelikeyan/wine
  • IsaacMarovitz/wine
  • LouiseTheGoldenGoddess/wine
  • SergeGautherie/wine
  • Klittiklatsch/wine
  • ldhacker/wine
  • dk1006498/wine
  • ishitatsuyuki/wine
  • h3c/wine
  • wincenty.bandyta41/wine
  • ayhankus482/wine
  • q4a/wine
  • mjgarton/wine
  • agusev/wine
  • vovams/wine
  • shardulsb08/wine
  • lylythechosenone/wine
  • artemist/wine
  • dropbear/wine
  • Cherser-s/wine
  • smayr/wine
  • loveptong/wine
  • chendeqiang/wine
  • gaber139/wine
  • shytzedaka/wine
  • ghkmufc/wine
  • TornadoCookie/wine
  • klownwolfman/wine
  • bylaws/wine
  • vitorhnn/wine
  • mide1337/wine
  • mewinkler/wine
  • firelzrd/wine
  • Samsuper/wine
  • kkartaltepe/wine
  • petravion/wine
  • Maaka00524/jacob-wine
  • petrathekat/wine
  • dj/wine
  • liam-middlebrook/wine
  • padolkarlucky/wine
  • maarten/wine
  • yhd986/wine
  • linkmecry/wine
  • tehrantoday/wine
  • xuxin12345/wine
  • dmjc/wine
  • sedwards/wine
  • hanslehnert/wine
  • 3ts75/wine
  • EkaterinePapava/wine
  • lav/wine
  • lygstate/wine
  • mxkrsv/wine
  • xutaxkamay/wine
  • cbialorucki/wine
  • yshui/wine
  • baikaishiuc/wine
  • HuwCampbell/wine
  • llde/wine
  • rockdrilla/wine
  • aidanhs/wine
  • SwimmingTiger/wine
  • fvalasiad/wine
  • zsoltiv/wine
  • mailnew4ster/wine
  • ake.rehnman/wine
  • IDocin/wine
  • dmitry/wine
  • Cthuflu/wine
  • corngood/wine
  • whindsaks/wine
  • telans/wine
  • DmitrySokolov/wine
  • Pospelove/wine
  • ellingtonsantos/wine
  • roro/wine
  • wurenny/wine
  • KokoseiJ/wine
  • amurzeau/wine
  • spazzymoto/wine
  • searchingin/wine
  • marler8997/wine
  • Alcaro/wine
  • aunali1/wine
  • snaccslocc420/wine
  • ajkhoury/wine
  • qsniyg/wine
  • Matheus-TestUser1/wine
  • adamrehn/wine
  • brobston/wine
  • aalyaev/wine
  • thongthai/wine
  • j.bayer1988/wine
  • skitt/wine
  • benben/wine
  • ahmouse15/wine
  • achurch/wine
  • mfaqiri2/wine
  • yseo/wine
  • kingjinni/wine
  • userid0x0/wine
  • titan/wine
  • Komoszek/wine
  • GamzeeRakoon/wine
  • joanluc/wine
  • Alan/wine
  • meshine/wine
  • EBADF/wine
  • vibhavp/wine
  • quininer/wine
  • pawelulita/wine
  • muek2211/wine
  • chenhaoyang/wine
  • nishiyama/wine
  • silviuxgaming/wine
  • nell/wine
  • 29jm/wine
  • arilou/wine
  • Mini-Gaunt/wine
  • DodoGTA/wine
  • davispuh/wine
  • mzent/wine
  • arakmar/wine
  • number201724/wine
  • yhd986/wine-up
  • rpisl/wine
  • zp1/wine-zp-cs-464
  • h0tc0d3/wine
  • Snowiiii/wine
  • gabrielb/wine
  • PureBulb/wine
  • OO/wine
  • Clara/wine
  • Saancreed/wine
  • enolp/wine
  • arthunix/wine
  • halfline/wine
  • carlo-bramini/wine
  • jfmu/wine
  • russelltg/wine
  • ntay/wine
  • YellowOnion/wine
  • niversesu/wine
  • gilvbp/wine
  • tingling0072/wine
  • DandD1517/wine
  • rastos/add-GetAnycastIpAddressTable
  • gnif/wine
  • gibsonpil/wine
  • antenabr2/wine
  • kvashis/wine
  • CKolle/wine
  • kubni/wine
  • ten0s/wine
  • Yvonne8873/wine
  • kurikaesu/wine
  • minggr/wine
  • JohnSebastienNadeau/wine
  • karshnicholas/wine
  • SamB/wine
  • apgrc/wine
  • Samiklom/wine
  • llyyr/wine
  • nberner/wine
  • katharinechui/wine
  • kirill.zhumarin/wine
  • vaxerski/wine
  • infiniteloop/wine
  • K0bin/wine
  • arethusa/wine
  • mrdeathjr28/wine
  • dank_meme/wine
  • dh/wine
  • tuomasjjrasanen/wine
  • mmcdonnell/wine
  • mxnny00/wine-manjaro-arch-compatibility
  • Joan/wine
  • g.mo.alcauter/wine
  • zhenbo_li/wine
  • tsmx/wine
  • xaqumin/wine
  • peterjc123/wine
  • ruslangaripov/wine
  • blyss/wine
  • xanathar/wine
  • michael.bond/wine
  • Quix0r/wine
  • sinisa.susnjar/wine
  • Rapid/wine
  • theli.ua/wine
  • shaun.din/wine
  • zhaohongxin/wine
  • dylan.eskew/wine
  • humbertoperezs991/wine
  • vaevi/wine
  • Riesi/wine
  • francisdb/wine
  • 1480c1/wine
  • trcrsired/wine
  • npatt/wine
  • muhammmadalli/wine9.0
  • Czahrien/wine
  • nilsen.jonas/wine
  • underdogest/wine
  • djordjem/wine
  • frubin/wine
  • LucasChollet/wine
  • lipengfei-loongson/wine
  • JacobCzekalla/wine-fork-jacob
  • omar_elantil/wine
  • lumarel/wine
  • principeagustin/wine
  • gotzl/wine
  • OneTester250376/wine
  • austin987/wine
  • unknown62627/wine
  • navi/wine
  • somedevfox/wine
  • notaz/wine
  • fcasas/wine
  • Asteroz/wine
  • MariusSchiffer/wine
  • kevinrmartinez/wine-devel
  • St1gven/wine
  • maarten256/wine
  • rcstarr87/wine
  • tinozzo123/wine
  • GermanAizek/wine
  • spencerwallace/wine
  • schloegl/wine
  • giuppococco/wine
  • shayan7878/wine
  • N080DY12/wine
  • ralf.habacker/wine
  • oh-ok/wine
  • johnporter/wine
  • Low-power/wine
  • thelande/wine
  • riyu12383/wine
  • kubapet/wine
  • Ivan_83/wine
  • SmithGoll/wine
  • gmesmer/wine
  • akarisu.de/wine
  • jwffrey9046/wine
  • anders/wine
  • markbhasawut/wine
  • dy-tea/wine
  • Benjamin_Loison/wine
  • frmdstryr/wine
  • zzam/wine
  • haydenhestad/wine
  • Deppy04/wine
  • osbre/wine
  • CharlottePabst/wine
  • SunlitTango/wine
  • ritalat/wine
  • AlexeyLushnikov/wine
  • mickdermack/wine
  • s1UMBa/wine
  • huangqinjin/wine
  • caseyr297/wine
  • d1saster/wine
  • ayufdh222/wine
  • janstrakowski/wine
  • petur/wine
  • matheus.venturini/wine-fix-ohm-sign
  • rayrapetyan/wine
  • xiaotong/wine
  • ovarley1/wine
  • dos1/wine
  • BZZZZ/wine
  • joesoroka/wine
  • toadking/wine
  • JoshuaBrest/wine
  • elias/wine
  • michele.dionisio/wine
  • garlett/wine-send-arp
  • eugenemcardle/wine
  • hugwijst/wine
  • whrvt/wine
  • loisgomez/wine
  • ramleejo/wine
  • self/wine
  • fr33z00/wine
  • JoeS209/wine
  • JacKeTUs/wine
  • nak.ak2015/wine
  • morgwai/wine
  • funfunctor/wine
  • donnyjoe/wine
  • sitter/wine
  • atticf/wine
  • xipster/wine
  • sebastian/wine
  • AlexanderWillner/wine
  • yaoyongjie/wine
  • wayne/wine
  • AMark/wine
  • zamaudio/wine
  • TomaszPakula/wine
  • Freakness109/wine
  • amorozov/wine
  • HP/wine
  • danlm/wine
  • rariema/wine
  • Biswa96/wine
  • rlippmann/wine
  • yangkun/wine
  • greyghoster/wine
  • toxieainc/wine
520 results
Show changes
Showing
with 9873 additions and 4231 deletions
TESTDLL = advapi32.dll
IMPORTS = ole32 advapi32
IMPORTS = advapi32 user32
C_SRCS = \
SOURCES = \
cred.c \
crypt.c \
crypt_lmhash.c \
......@@ -10,6 +10,8 @@ C_SRCS = \
crypt_sha.c \
eventlog.c \
lsa.c \
perf.c \
registry.c \
rsrc.rc \
security.c \
service.c
......@@ -41,7 +41,7 @@ static BOOL (WINAPI *pCredIsMarshaledCredentialA)(LPCSTR);
#define TEST_TARGET_NAME "credtest.winehq.org"
#define TEST_TARGET_NAME2 "credtest2.winehq.org"
static const WCHAR TEST_PASSWORD[] = {'p','4','$','$','w','0','r','d','!',0};
static const WCHAR TEST_PASSWORD[] = L"p4$$w0rd!";
static void test_CredReadA(void)
{
......@@ -51,19 +51,19 @@ static void test_CredReadA(void)
SetLastError(0xdeadbeef);
ret = pCredReadA(TEST_TARGET_NAME, -1, 0, &cred);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
"CredReadA should have failed with ERROR_INVALID_PARAMETER instead of %d\n",
"CredReadA should have failed with ERROR_INVALID_PARAMETER instead of %ld\n",
GetLastError());
SetLastError(0xdeadbeef);
ret = pCredReadA(TEST_TARGET_NAME, CRED_TYPE_GENERIC, 0xdeadbeef, &cred);
ok(!ret && ( GetLastError() == ERROR_INVALID_FLAGS || GetLastError() == ERROR_INVALID_PARAMETER ),
"CredReadA should have failed with ERROR_INVALID_FLAGS or ERROR_INVALID_PARAMETER instead of %d\n",
"CredReadA should have failed with ERROR_INVALID_FLAGS or ERROR_INVALID_PARAMETER instead of %ld\n",
GetLastError());
SetLastError(0xdeadbeef);
ret = pCredReadA(NULL, CRED_TYPE_GENERIC, 0, &cred);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
"CredReadA should have failed with ERROR_INVALID_PARAMETER instead of %d\n",
"CredReadA should have failed with ERROR_INVALID_PARAMETER instead of %ld\n",
GetLastError());
}
......@@ -75,7 +75,7 @@ static void test_CredWriteA(void)
SetLastError(0xdeadbeef);
ret = pCredWriteA(NULL, 0);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
"CredWriteA should have failed with ERROR_INVALID_PARAMETER instead of %d\n",
"CredWriteA should have failed with ERROR_INVALID_PARAMETER instead of %ld\n",
GetLastError());
new_cred.Flags = 0;
......@@ -93,7 +93,7 @@ static void test_CredWriteA(void)
SetLastError(0xdeadbeef);
ret = pCredWriteA(&new_cred, 0);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
"CredWriteA should have failed with ERROR_INVALID_PARAMETER instead of %d\n",
"CredWriteA should have failed with ERROR_INVALID_PARAMETER instead of %ld\n",
GetLastError());
new_cred.TargetName = (char *)TEST_TARGET_NAME;
......@@ -105,63 +105,63 @@ static void test_CredWriteA(void)
{
ok(GetLastError() == ERROR_SUCCESS ||
GetLastError() == ERROR_IO_PENDING, /* Vista */
"Expected ERROR_IO_PENDING, got %d\n", GetLastError());
"Expected ERROR_IO_PENDING, got %ld\n", GetLastError());
}
else
{
ok(GetLastError() == ERROR_BAD_USERNAME ||
GetLastError() == ERROR_NO_SUCH_LOGON_SESSION, /* Vista */
"CredWrite with username without domain should return ERROR_BAD_USERNAME"
"or ERROR_NO_SUCH_LOGON_SESSION not %d\n", GetLastError());
"or ERROR_NO_SUCH_LOGON_SESSION not %ld\n", GetLastError());
}
new_cred.UserName = NULL;
SetLastError(0xdeadbeef);
ret = pCredWriteA(&new_cred, 0);
ok(!ret && GetLastError() == ERROR_BAD_USERNAME,
"CredWriteA with NULL username should have failed with ERROR_BAD_USERNAME instead of %d\n",
"CredWriteA with NULL username should have failed with ERROR_BAD_USERNAME instead of %ld\n",
GetLastError());
new_cred.UserName = (char *)"winetest";
new_cred.Persist = CRED_PERSIST_LOCAL_MACHINE;
SetLastError(0xdeadbeef);
ret = pCredWriteA(&new_cred, 0);
ok(ret || broken(!ret), "CredWriteA failed with error %u\n", GetLastError());
ok(ret || broken(!ret), "CredWriteA failed with error %lu\n", GetLastError());
if (ret)
{
ret = pCredDeleteA(TEST_TARGET_NAME, CRED_TYPE_DOMAIN_PASSWORD, 0);
ok(ret, "CredDeleteA failed with error %u\n", GetLastError());
ok(ret, "CredDeleteA failed with error %lu\n", GetLastError());
}
new_cred.Type = CRED_TYPE_GENERIC;
SetLastError(0xdeadbeef);
ret = pCredWriteA(&new_cred, 0);
ok(ret || broken(!ret), "CredWriteA failed with error %u\n", GetLastError());
ok(ret || broken(!ret), "CredWriteA failed with error %lu\n", GetLastError());
if (ret)
{
ret = pCredDeleteA(TEST_TARGET_NAME, CRED_TYPE_GENERIC, 0);
ok(ret, "CredDeleteA failed with error %u\n", GetLastError());
ok(ret, "CredDeleteA failed with error %lu\n", GetLastError());
}
new_cred.Persist = CRED_PERSIST_SESSION;
ret = pCredWriteA(&new_cred, 0);
ok(ret, "CredWriteA failed with error %u\n", GetLastError());
ok(ret, "CredWriteA failed with error %lu\n", GetLastError());
ret = pCredDeleteA(TEST_TARGET_NAME, CRED_TYPE_GENERIC, 0);
ok(ret, "CredDeleteA failed with error %u\n", GetLastError());
ok(ret, "CredDeleteA failed with error %lu\n", GetLastError());
new_cred.Type = CRED_TYPE_DOMAIN_PASSWORD;
SetLastError(0xdeadbeef);
ret = pCredWriteA(&new_cred, 0);
ok(ret || broken(!ret), "CredWriteA failed with error %u\n", GetLastError());
ok(ret || broken(!ret), "CredWriteA failed with error %lu\n", GetLastError());
if (ret)
{
ret = pCredDeleteA(TEST_TARGET_NAME, CRED_TYPE_DOMAIN_PASSWORD, 0);
ok(ret, "CredDeleteA failed with error %u\n", GetLastError());
ok(ret, "CredDeleteA failed with error %lu\n", GetLastError());
}
new_cred.UserName = NULL;
SetLastError(0xdeadbeef);
ret = pCredWriteA(&new_cred, 0);
ok(!ret, "CredWriteA succeeded\n");
ok(GetLastError() == ERROR_BAD_USERNAME, "got %u\n", GetLastError());
ok(GetLastError() == ERROR_BAD_USERNAME, "got %lu\n", GetLastError());
}
static void test_CredDeleteA(void)
......@@ -171,13 +171,13 @@ static void test_CredDeleteA(void)
SetLastError(0xdeadbeef);
ret = pCredDeleteA(TEST_TARGET_NAME, -1, 0);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
"CredDeleteA should have failed with ERROR_INVALID_PARAMETER instead of %d\n",
"CredDeleteA should have failed with ERROR_INVALID_PARAMETER instead of %ld\n",
GetLastError());
SetLastError(0xdeadbeef);
ret = pCredDeleteA(TEST_TARGET_NAME, CRED_TYPE_GENERIC, 0xdeadbeef);
ok(!ret && ( GetLastError() == ERROR_INVALID_FLAGS || GetLastError() == ERROR_INVALID_PARAMETER /* Vista */ ),
"CredDeleteA should have failed with ERROR_INVALID_FLAGS or ERROR_INVALID_PARAMETER instead of %d\n",
"CredDeleteA should have failed with ERROR_INVALID_FLAGS or ERROR_INVALID_PARAMETER instead of %ld\n",
GetLastError());
}
......@@ -208,7 +208,7 @@ if(0)
SetLastError(0xdeadbeef);
ret = pCredReadDomainCredentialsA(NULL, 0, &count, &creds);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
"CredReadDomainCredentialsA should have failed with ERROR_INVALID_PARAMETER instead of %d\n",
"CredReadDomainCredentialsA should have failed with ERROR_INVALID_PARAMETER instead of %ld\n",
GetLastError());
SetLastError(0xdeadbeef);
......@@ -216,7 +216,7 @@ if(0)
count = 2;
ret = pCredReadDomainCredentialsA(&info, 0, &count, &creds);
ok(!ret && GetLastError() == ERROR_NOT_FOUND,
"CredReadDomainCredentialsA should have failed with ERROR_NOT_FOUND instead of %d\n",
"CredReadDomainCredentialsA should have failed with ERROR_NOT_FOUND instead of %ld\n",
GetLastError());
ok(count ==0 && creds == NULL, "CredReadDomainCredentialsA must not return any result\n");
......@@ -227,7 +227,7 @@ if(0)
ok(!ret, "CredReadDomainCredentialsA should have failed\n");
ok(GetLastError() == ERROR_NOT_FOUND ||
GetLastError() == ERROR_INVALID_PARAMETER, /* Vista, W2K8 */
"Expected ERROR_NOT_FOUND or ERROR_INVALID_PARAMETER instead of %d\n",
"Expected ERROR_NOT_FOUND or ERROR_INVALID_PARAMETER instead of %ld\n",
GetLastError());
info.DnsServerName = NULL;
......@@ -237,7 +237,7 @@ if(0)
ok(!ret, "CredReadDomainCredentialsA should have failed\n");
ok(GetLastError() == ERROR_NOT_FOUND ||
GetLastError() == ERROR_INVALID_PARAMETER, /* Vista, W2K8 */
"Expected ERROR_NOT_FOUND or ERROR_INVALID_PARAMETER instead of %d\n",
"Expected ERROR_NOT_FOUND or ERROR_INVALID_PARAMETER instead of %ld\n",
GetLastError());
}
......@@ -246,14 +246,14 @@ static void check_blob(int line, DWORD cred_type, PCREDENTIALA cred)
if (cred_type == CRED_TYPE_DOMAIN_PASSWORD)
{
todo_wine
ok_(__FILE__, line)(cred->CredentialBlobSize == 0, "expected CredentialBlobSize of 0 but got %d\n", cred->CredentialBlobSize);
ok_(__FILE__, line)(cred->CredentialBlobSize == 0, "expected CredentialBlobSize of 0 but got %ld\n", cred->CredentialBlobSize);
todo_wine
ok_(__FILE__, line)(!cred->CredentialBlob, "expected NULL credentials but got %p\n", cred->CredentialBlob);
}
else
{
DWORD size=sizeof(TEST_PASSWORD);
ok_(__FILE__, line)(cred->CredentialBlobSize == size, "expected CredentialBlobSize of %u but got %u\n", size, cred->CredentialBlobSize);
ok_(__FILE__, line)(cred->CredentialBlobSize == size, "expected CredentialBlobSize of %lu but got %lu\n", size, cred->CredentialBlobSize);
ok_(__FILE__, line)(cred->CredentialBlob != NULL, "CredentialBlob should be present\n");
if (cred->CredentialBlob)
ok_(__FILE__, line)(!memcmp(cred->CredentialBlob, TEST_PASSWORD, size), "wrong CredentialBlob\n");
......@@ -283,7 +283,7 @@ static void test_generic(void)
ret = pCredWriteA(&new_cred, 0);
ok(ret || broken(GetLastError() == ERROR_NO_SUCH_LOGON_SESSION),
"CredWriteA failed with error %d\n", GetLastError());
"CredWriteA failed with error %ld\n", GetLastError());
if (!ret)
{
skip("couldn't write generic credentials, skipping tests\n");
......@@ -291,7 +291,7 @@ static void test_generic(void)
}
ret = pCredEnumerateA(NULL, 0, &count, &creds);
ok(ret, "CredEnumerateA failed with error %d\n", GetLastError());
ok(ret, "CredEnumerateA failed with error %ld\n", GetLastError());
for (i = 0; i < count; i++)
{
......@@ -299,12 +299,12 @@ static void test_generic(void)
{
ok(creds[i]->Type == CRED_TYPE_GENERIC ||
creds[i]->Type == CRED_TYPE_DOMAIN_PASSWORD, /* Vista */
"expected creds[%d]->Type CRED_TYPE_GENERIC or CRED_TYPE_DOMAIN_PASSWORD but got %d\n", i, creds[i]->Type);
ok(!creds[i]->Flags, "expected creds[%d]->Flags 0 but got 0x%x\n", i, creds[i]->Flags);
ok(!strcmp(creds[i]->Comment, "Comment"), "expected creds[%d]->Comment \"Comment\" but got \"%s\"\n", i, creds[i]->Comment);
"expected creds[%ld]->Type CRED_TYPE_GENERIC or CRED_TYPE_DOMAIN_PASSWORD but got %ld\n", i, creds[i]->Type);
ok(!creds[i]->Flags, "expected creds[%ld]->Flags 0 but got 0x%lx\n", i, creds[i]->Flags);
ok(!strcmp(creds[i]->Comment, "Comment"), "expected creds[%ld]->Comment \"Comment\" but got \"%s\"\n", i, creds[i]->Comment);
check_blob(__LINE__, creds[i]->Type, creds[i]);
ok(creds[i]->Persist, "expected creds[%d]->Persist CRED_PERSIST_ENTERPRISE but got %d\n", i, creds[i]->Persist);
ok(!strcmp(creds[i]->UserName, "winetest"), "expected creds[%d]->UserName \"winetest\" but got \"%s\"\n", i, creds[i]->UserName);
ok(creds[i]->Persist, "expected creds[%ld]->Persist CRED_PERSIST_ENTERPRISE but got %ld\n", i, creds[i]->Persist);
ok(!strcmp(creds[i]->UserName, "winetest"), "expected creds[%ld]->UserName \"winetest\" but got \"%s\"\n", i, creds[i]->UserName);
found = TRUE;
}
}
......@@ -312,11 +312,11 @@ static void test_generic(void)
ok(found, "credentials not found\n");
ret = pCredReadA(TEST_TARGET_NAME, CRED_TYPE_GENERIC, 0, &cred);
ok(ret, "CredReadA failed with error %d\n", GetLastError());
ok(ret, "CredReadA failed with error %ld\n", GetLastError());
pCredFree(cred);
ret = pCredDeleteA(TEST_TARGET_NAME, CRED_TYPE_GENERIC, 0);
ok(ret, "CredDeleteA failed with error %d\n", GetLastError());
ok(ret, "CredDeleteA failed with error %ld\n", GetLastError());
}
static void test_domain_password(DWORD cred_type)
......@@ -346,21 +346,21 @@ static void test_domain_password(DWORD cred_type)
"or are disabled. Skipping\n");
return;
}
ok(ret, "CredWriteA failed with error %d\n", GetLastError());
ok(ret, "CredWriteA failed with error %ld\n", GetLastError());
ret = pCredEnumerateA(NULL, 0, &count, &creds);
ok(ret, "CredEnumerateA failed with error %d\n", GetLastError());
ok(ret, "CredEnumerateA failed with error %ld\n", GetLastError());
for (i = 0; i < count; i++)
{
if (creds[i]->TargetName && !strcmp(creds[i]->TargetName, TEST_TARGET_NAME))
{
ok(creds[i]->Type == cred_type, "expected creds[%d]->Type CRED_TYPE_DOMAIN_PASSWORD but got %d\n", i, creds[i]->Type);
ok(!creds[i]->Flags, "expected creds[%d]->Flags 0 but got 0x%x\n", i, creds[i]->Flags);
ok(!strcmp(creds[i]->Comment, "Comment"), "expected creds[%d]->Comment \"Comment\" but got \"%s\"\n", i, creds[i]->Comment);
ok(creds[i]->Type == cred_type, "expected creds[%ld]->Type CRED_TYPE_DOMAIN_PASSWORD but got %ld\n", i, creds[i]->Type);
ok(!creds[i]->Flags, "expected creds[%ld]->Flags 0 but got 0x%lx\n", i, creds[i]->Flags);
ok(!strcmp(creds[i]->Comment, "Comment"), "expected creds[%ld]->Comment \"Comment\" but got \"%s\"\n", i, creds[i]->Comment);
check_blob(__LINE__, cred_type, creds[i]);
ok(creds[i]->Persist, "expected creds[%d]->Persist CRED_PERSIST_ENTERPRISE but got %d\n", i, creds[i]->Persist);
ok(!strcmp(creds[i]->UserName, "test\\winetest"), "expected creds[%d]->UserName \"winetest\" but got \"%s\"\n", i, creds[i]->UserName);
ok(creds[i]->Persist, "expected creds[%ld]->Persist CRED_PERSIST_ENTERPRISE but got %ld\n", i, creds[i]->Persist);
ok(!strcmp(creds[i]->UserName, "test\\winetest"), "expected creds[%ld]->UserName \"winetest\" but got \"%s\"\n", i, creds[i]->UserName);
found = TRUE;
}
}
......@@ -368,7 +368,7 @@ static void test_domain_password(DWORD cred_type)
ok(found, "credentials not found\n");
ret = pCredReadA(TEST_TARGET_NAME, cred_type, 0, &cred);
ok(ret, "CredReadA failed with error %d\n", GetLastError());
ok(ret, "CredReadA failed with error %ld\n", GetLastError());
if (ret) /* don't check the values of cred, if CredReadA failed. */
{
check_blob(__LINE__, cred_type, cred);
......@@ -376,17 +376,17 @@ static void test_domain_password(DWORD cred_type)
}
ret = pCredDeleteA(TEST_TARGET_NAME, cred_type, 0);
ok(ret, "CredDeleteA failed with error %d\n", GetLastError());
ok(ret, "CredDeleteA failed with error %ld\n", GetLastError());
}
static void test_CredMarshalCredentialA(void)
{
static WCHAR emptyW[] = {0};
static WCHAR tW[] = {'t',0};
static WCHAR teW[] = {'t','e',0};
static WCHAR tesW[] = {'t','e','s',0};
static WCHAR testW[] = {'t','e','s','t',0};
static WCHAR test1W[] = {'t','e','s','t','1',0};
static WCHAR emptyW[] = L"";
static WCHAR tW[] = L"t";
static WCHAR teW[] = L"te";
static WCHAR tesW[] = L"tes";
static WCHAR testW[] = L"test";
static WCHAR test1W[] = L"test1";
CERT_CREDENTIAL_INFO cert;
USERNAME_TARGET_CREDENTIAL_INFO username;
DWORD error;
......@@ -397,7 +397,7 @@ static void test_CredMarshalCredentialA(void)
ret = pCredMarshalCredentialA( 0, NULL, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
ok( error == ERROR_INVALID_PARAMETER, "got %lu\n", error );
memset( cert.rgbHashOfCert, 0, sizeof(cert.rgbHashOfCert) );
cert.cbSize = sizeof(cert);
......@@ -405,28 +405,28 @@ static void test_CredMarshalCredentialA(void)
ret = pCredMarshalCredentialA( 0, &cert, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
ok( error == ERROR_INVALID_PARAMETER, "got %lu\n", error );
str = (char *)0xdeadbeef;
SetLastError( 0xdeadbeef );
ret = pCredMarshalCredentialA( 0, &cert, &str );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
ok( error == ERROR_INVALID_PARAMETER, "got %lu\n", error );
ok( str == (char *)0xdeadbeef, "got %p\n", str );
SetLastError( 0xdeadbeef );
ret = pCredMarshalCredentialA( CertCredential, NULL, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
ok( error == ERROR_INVALID_PARAMETER, "got %lu\n", error );
if (0) { /* crash */
SetLastError( 0xdeadbeef );
ret = pCredMarshalCredentialA( CertCredential, &cert, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
ok( error == ERROR_INVALID_PARAMETER, "got %lu\n", error );
}
cert.cbSize = 0;
......@@ -435,13 +435,13 @@ static void test_CredMarshalCredentialA(void)
ret = pCredMarshalCredentialA( CertCredential, &cert, &str );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
ok( error == ERROR_INVALID_PARAMETER, "got %lu\n", error );
ok( str == (char *)0xdeadbeef, "got %p\n", str );
cert.cbSize = sizeof(cert) + 4;
str = NULL;
ret = pCredMarshalCredentialA( CertCredential, &cert, &str );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( ret, "unexpected failure %lu\n", GetLastError() );
ok( str != NULL, "str not set\n" );
ok( !lstrcmpA( str, "@@BAAAAAAAAAAAAAAAAAAAAAAAAAAA" ), "got %s\n", str );
pCredFree( str );
......@@ -450,7 +450,7 @@ static void test_CredMarshalCredentialA(void)
cert.rgbHashOfCert[0] = 2;
str = NULL;
ret = pCredMarshalCredentialA( CertCredential, &cert, &str );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( ret, "unexpected failure %lu\n", GetLastError() );
ok( str != NULL, "str not set\n" );
ok( !lstrcmpA( str, "@@BCAAAAAAAAAAAAAAAAAAAAAAAAAA" ), "got %s\n", str );
pCredFree( str );
......@@ -458,7 +458,7 @@ static void test_CredMarshalCredentialA(void)
cert.rgbHashOfCert[0] = 255;
str = NULL;
ret = pCredMarshalCredentialA( CertCredential, &cert, &str );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( ret, "unexpected failure %lu\n", GetLastError() );
ok( str != NULL, "str not set\n" );
ok( !lstrcmpA( str, "@@B-DAAAAAAAAAAAAAAAAAAAAAAAAA" ), "got %s\n", str );
pCredFree( str );
......@@ -467,7 +467,7 @@ static void test_CredMarshalCredentialA(void)
cert.rgbHashOfCert[1] = 1;
str = NULL;
ret = pCredMarshalCredentialA( CertCredential, &cert, &str );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( ret, "unexpected failure %lu\n", GetLastError() );
ok( str != NULL, "str not set\n" );
ok( !lstrcmpA( str, "@@BBEAAAAAAAAAAAAAAAAAAAAAAAAA" ), "got %s\n", str );
pCredFree( str );
......@@ -477,7 +477,7 @@ static void test_CredMarshalCredentialA(void)
cert.rgbHashOfCert[2] = 1;
str = NULL;
ret = pCredMarshalCredentialA( CertCredential, &cert, &str );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( ret, "unexpected failure %lu\n", GetLastError() );
ok( str != NULL, "str not set\n" );
ok( !lstrcmpA( str, "@@BBEQAAAAAAAAAAAAAAAAAAAAAAAA" ), "got %s\n", str );
pCredFree( str );
......@@ -489,7 +489,7 @@ static void test_CredMarshalCredentialA(void)
cert.rgbHashOfCert[3] = 'e';
str = NULL;
ret = pCredMarshalCredentialA( CertCredential, &cert, &str );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( ret, "unexpected failure %lu\n", GetLastError() );
ok( str != NULL, "str not set\n" );
ok( !lstrcmpA( str, "@@BXlmblBAAAAAAAAAAAAAAAAAAAAA" ), "got %s\n", str );
pCredFree( str );
......@@ -497,7 +497,7 @@ static void test_CredMarshalCredentialA(void)
memset( cert.rgbHashOfCert, 0xff, sizeof(cert.rgbHashOfCert) );
str = NULL;
ret = pCredMarshalCredentialA( CertCredential, &cert, &str );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( ret, "unexpected failure %lu\n", GetLastError() );
ok( str != NULL, "str not set\n" );
ok( !lstrcmpA( str, "@@B--------------------------P" ), "got %s\n", str );
pCredFree( str );
......@@ -508,7 +508,7 @@ static void test_CredMarshalCredentialA(void)
ret = pCredMarshalCredentialA( UsernameTargetCredential, &username, &str );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
ok( error == ERROR_INVALID_PARAMETER, "got %lu\n", error );
ok( str == (char *)0xdeadbeef, "got %p\n", str );
username.UserName = emptyW;
......@@ -517,13 +517,13 @@ static void test_CredMarshalCredentialA(void)
ret = pCredMarshalCredentialA( UsernameTargetCredential, &username, &str );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
ok( error == ERROR_INVALID_PARAMETER, "got %lu\n", error );
ok( str == (char *)0xdeadbeef, "got %p\n", str );
username.UserName = tW;
str = NULL;
ret = pCredMarshalCredentialA( UsernameTargetCredential, &username, &str );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( ret, "unexpected failure %lu\n", GetLastError() );
ok( str != NULL, "str not set\n" );
ok( !lstrcmpA( str, "@@CCAAAAA0BA" ), "got %s\n", str );
pCredFree( str );
......@@ -531,7 +531,7 @@ static void test_CredMarshalCredentialA(void)
username.UserName = teW;
str = NULL;
ret = pCredMarshalCredentialA( UsernameTargetCredential, &username, &str );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( ret, "unexpected failure %lu\n", GetLastError() );
ok( str != NULL, "str not set\n" );
ok( !lstrcmpA( str, "@@CEAAAAA0BQZAA" ), "got %s\n", str );
pCredFree( str );
......@@ -539,7 +539,7 @@ static void test_CredMarshalCredentialA(void)
username.UserName = tesW;
str = NULL;
ret = pCredMarshalCredentialA( UsernameTargetCredential, &username, &str );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( ret, "unexpected failure %lu\n", GetLastError() );
ok( str != NULL, "str not set\n" );
ok( !lstrcmpA( str, "@@CGAAAAA0BQZAMHA" ), "got %s\n", str );
pCredFree( str );
......@@ -547,7 +547,7 @@ static void test_CredMarshalCredentialA(void)
username.UserName = testW;
str = NULL;
ret = pCredMarshalCredentialA( UsernameTargetCredential, &username, &str );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( ret, "unexpected failure %lu\n", GetLastError() );
ok( str != NULL, "str not set\n" );
ok( !lstrcmpA( str, "@@CIAAAAA0BQZAMHA0BA" ), "got %s\n", str );
pCredFree( str );
......@@ -555,7 +555,7 @@ static void test_CredMarshalCredentialA(void)
username.UserName = test1W;
str = NULL;
ret = pCredMarshalCredentialA( UsernameTargetCredential, &username, &str );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( ret, "unexpected failure %lu\n", GetLastError() );
ok( str != NULL, "str not set\n" );
ok( !lstrcmpA( str, "@@CKAAAAA0BQZAMHA0BQMAA" ), "got %s\n", str );
pCredFree( str );
......@@ -565,10 +565,6 @@ static void test_CredUnmarshalCredentialA(void)
{
static const UCHAR cert_empty[CERT_HASH_LENGTH] = {0};
static const UCHAR cert_wine[CERT_HASH_LENGTH] = {'W','i','n','e',0};
static const WCHAR tW[] = {'t',0};
static const WCHAR teW[] = {'t','e',0};
static const WCHAR tesW[] = {'t','e','s',0};
static const WCHAR testW[] = {'t','e','s','t',0};
void *p;
CERT_CREDENTIAL_INFO *cert;
const UCHAR *hash;
......@@ -604,22 +600,22 @@ static void test_CredUnmarshalCredentialA(void)
{ "@@CAAAAAA", UsernameTargetCredential, NULL },
{ "@@CAAAAAA0B", UsernameTargetCredential, NULL },
{ "@@CAAAAAA0BA", UsernameTargetCredential, NULL },
{ "@@CCAAAAA0BA", UsernameTargetCredential, tW },
{ "@@CCAAAAA0BA", UsernameTargetCredential, L"t" },
{ "@@CEAAAAA0BA", UsernameTargetCredential, NULL },
{ "@@CEAAAAA0BAd", UsernameTargetCredential, NULL },
{ "@@CEAAAAA0BAdA", UsernameTargetCredential, NULL },
{ "@@CEAAAAA0BQZAA", UsernameTargetCredential, teW },
{ "@@CEAAAAA0BQZAQ", UsernameTargetCredential, teW },
{ "@@CEAAAAA0BQZAg", UsernameTargetCredential, teW },
{ "@@CEAAAAA0BQZAw", UsernameTargetCredential, teW },
{ "@@CEAAAAA0BQZAA", UsernameTargetCredential, L"te" },
{ "@@CEAAAAA0BQZAQ", UsernameTargetCredential, L"te" },
{ "@@CEAAAAA0BQZAg", UsernameTargetCredential, L"te" },
{ "@@CEAAAAA0BQZAw", UsernameTargetCredential, L"te" },
{ "@@CEAAAAA0BQZAAA", UsernameTargetCredential, NULL },
{ "@@CGAAAAA0BQZAMH", UsernameTargetCredential, NULL },
{ "@@CGAAAAA0BQZAMHA", UsernameTargetCredential, tesW },
{ "@@CGAAAAA0BQZAMHA", UsernameTargetCredential, L"tes" },
{ "@@CGAAAAA0BQZAMHAA", UsernameTargetCredential, NULL },
{ "@@CCAAAAA0BAA", UsernameTargetCredential, NULL },
{ "@@CBAAAAA0BAA", UsernameTargetCredential, NULL },
{ "@@CAgAAAA0BAA", UsernameTargetCredential, NULL },
{ "@@CIAAAAA0BQZAMHA0BA", UsernameTargetCredential, testW },
{ "@@CIAAAAA0BQZAMHA0BA", UsernameTargetCredential, L"test" },
{ "@@CA-----0BQZAMHA0BA", UsernameTargetCredential, NULL },
};
......@@ -627,14 +623,14 @@ static void test_CredUnmarshalCredentialA(void)
ret = pCredUnmarshalCredentialA( NULL, NULL, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
ok( error == ERROR_INVALID_PARAMETER, "got %lu\n", error );
cert = NULL;
SetLastError( 0xdeadbeef );
ret = pCredUnmarshalCredentialA( NULL, NULL, (void **)&cert );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
ok( error == ERROR_INVALID_PARAMETER, "got %lu\n", error );
type = 0;
cert = NULL;
......@@ -642,23 +638,23 @@ static void test_CredUnmarshalCredentialA(void)
ret = pCredUnmarshalCredentialA( NULL, &type, (void **)&cert );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
ok( error == ERROR_INVALID_PARAMETER, "got %lu\n", error );
if (0) { /* crash */
SetLastError( 0xdeadbeef );
ret = pCredUnmarshalCredentialA( "@@BAAAAAAAAAAAAAAAAAAAAAAAAAAA", &type, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
ok( error == ERROR_INVALID_PARAMETER, "got %lu\n", error );
SetLastError( 0xdeadbeef );
ret = pCredUnmarshalCredentialA( "@@BAAAAAAAAAAAAAAAAAAAAAAAAAAA", NULL, (void **)&cert );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
ok( error == ERROR_INVALID_PARAMETER, "got %lu\n", error );
}
for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
for (i = 0; i < ARRAY_SIZE(tests); i++)
{
SetLastError(0xdeadbeef);
type = 0;
......@@ -667,7 +663,7 @@ static void test_CredUnmarshalCredentialA(void)
error = GetLastError();
if (tests[i].unmarshaled)
{
ok(ret, "[%u] unexpected failure %u\n", i, error);
ok(ret, "[%u] unexpected failure %lu\n", i, error);
ok(type == tests[i].type, "[%u] got %u\n", i, type);
ok(p != NULL, "[%u] returned pointer is NULL\n", i);
if (tests[i].type == CertCredential)
......@@ -675,7 +671,7 @@ static void test_CredUnmarshalCredentialA(void)
cert = p;
hash = tests[i].unmarshaled;
ok(cert->cbSize == sizeof(*cert),
"[%u] wrong size %u\n", i, cert->cbSize);
"[%u] wrong size %lu\n", i, cert->cbSize);
for (j = 0; j < sizeof(cert->rgbHashOfCert); j++)
ok(cert->rgbHashOfCert[j] == hash[j], "[%u] wrong data\n", i);
}
......@@ -690,7 +686,7 @@ static void test_CredUnmarshalCredentialA(void)
else
{
ok(!ret, "[%u] unexpected success\n", i);
ok(error == ERROR_INVALID_PARAMETER, "[%u] got %u\n", i, error);
ok(error == ERROR_INVALID_PARAMETER, "[%u] got %lu\n", i, error);
ok(type == tests[i].type, "[%u] got %u\n", i, type);
ok(p == NULL, "[%u] returned pointer is not NULL\n", i);
}
......@@ -752,11 +748,11 @@ static void test_CredIsMarshaledCredentialA(void)
SetLastError(0xdeadbeef);
res = pCredIsMarshaledCredentialA(ptr[i]);
if (expected)
ok(res != FALSE, "%d: got %d and %u for %s (expected TRUE)\n", i, res, GetLastError(), ptr[i]);
ok(res != FALSE, "%d: got %d and %lu for %s (expected TRUE)\n", i, res, GetLastError(), ptr[i]);
else
{
/* Windows returns ERROR_INVALID_PARAMETER here, but that's not documented */
ok(!res, "%d: got %d and %u for %s (expected FALSE)\n", i, res, GetLastError(), ptr[i]);
ok(!res, "%d: got %d and %lu for %s (expected FALSE)\n", i, res, GetLastError(), ptr[i]);
}
}
}
......@@ -789,10 +785,10 @@ START_TEST(cred)
BOOL ret;
DWORD i;
ret = pCredGetSessionTypes(CRED_TYPE_MAXIMUM, persists);
ok(ret, "CredGetSessionTypes failed with error %d\n", GetLastError());
ok(persists[0] == CRED_PERSIST_NONE, "persists[0] = %u instead of CRED_PERSIST_NONE\n", persists[0]);
ok(ret, "CredGetSessionTypes failed with error %ld\n", GetLastError());
ok(persists[0] == CRED_PERSIST_NONE, "persists[0] = %lu instead of CRED_PERSIST_NONE\n", persists[0]);
for (i=0; i < CRED_TYPE_MAXIMUM; i++)
ok(persists[i] <= CRED_PERSIST_ENTERPRISE, "bad value for persists[%u]: %u\n", i, persists[i]);
ok(persists[i] <= CRED_PERSIST_ENTERPRISE, "bad value for persists[%lu]: %lu\n", i, persists[i]);
}
else
memset(persists, CRED_PERSIST_ENTERPRISE, sizeof(persists));
......@@ -809,7 +805,7 @@ START_TEST(cred)
else
test_generic();
trace("domain password:\n");
trace("domain password:\n");
if (persists[CRED_TYPE_DOMAIN_PASSWORD] == CRED_PERSIST_NONE)
skip("CRED_TYPE_DOMAIN_PASSWORD credentials are not supported or are disabled. Skipping\n");
else
......
......@@ -34,35 +34,14 @@ static const char szKeySet[] = "wine_test_keyset";
static const char szBadKeySet[] = "wine_test_bad_keyset";
#define NON_DEF_PROV_TYPE 999
static BOOL (WINAPI *pCryptAcquireContextA)(HCRYPTPROV*,LPCSTR,LPCSTR,DWORD,DWORD);
static BOOL (WINAPI *pCryptEnumProviderTypesA)(DWORD, DWORD*, DWORD, DWORD*, LPSTR, DWORD*);
static BOOL (WINAPI *pCryptEnumProvidersA)(DWORD, DWORD*, DWORD, DWORD*, LPSTR, DWORD*);
static BOOL (WINAPI *pCryptGetDefaultProviderA)(DWORD, DWORD*, DWORD, LPSTR, DWORD*);
static BOOL (WINAPI *pCryptReleaseContext)(HCRYPTPROV, DWORD);
static BOOL (WINAPI *pCryptSetProviderExA)(LPCSTR, DWORD, DWORD*, DWORD);
static BOOL (WINAPI *pCryptCreateHash)(HCRYPTPROV, ALG_ID, HCRYPTKEY, DWORD, HCRYPTHASH*);
static BOOL (WINAPI *pCryptDestroyHash)(HCRYPTHASH);
static BOOL (WINAPI *pCryptGenRandom)(HCRYPTPROV, DWORD, BYTE*);
static BOOL (WINAPI *pCryptContextAddRef)(HCRYPTPROV, DWORD*, DWORD dwFlags);
static BOOL (WINAPI *pCryptGenKey)(HCRYPTPROV, ALG_ID, DWORD, HCRYPTKEY*);
static BOOL (WINAPI *pCryptDestroyKey)(HCRYPTKEY);
static BOOL (WINAPI *pCryptDecrypt)(HCRYPTKEY, HCRYPTHASH, BOOL, DWORD, BYTE*, DWORD*);
static BOOL (WINAPI *pCryptDeriveKey)(HCRYPTPROV, ALG_ID, HCRYPTHASH, DWORD, HCRYPTKEY*);
static BOOL (WINAPI *pCryptDuplicateHash)(HCRYPTHASH, DWORD*, DWORD, HCRYPTHASH*);
static BOOL (WINAPI *pCryptDuplicateKey)(HCRYPTKEY, DWORD*, DWORD, HCRYPTKEY*);
static BOOL (WINAPI *pCryptEncrypt)(HCRYPTKEY, HCRYPTHASH, BOOL, DWORD, BYTE*, DWORD*, DWORD);
static BOOL (WINAPI *pCryptExportKey)(HCRYPTKEY, HCRYPTKEY, DWORD, DWORD, BYTE*, DWORD*);
static BOOL (WINAPI *pCryptGetHashParam)(HCRYPTHASH, DWORD, BYTE*, DWORD*, DWORD);
static BOOL (WINAPI *pCryptGetKeyParam)(HCRYPTKEY, DWORD, BYTE*, DWORD*, DWORD);
static BOOL (WINAPI *pCryptGetProvParam)(HCRYPTPROV, DWORD, BYTE*, DWORD*, DWORD);
static BOOL (WINAPI *pCryptGetUserKey)(HCRYPTPROV, DWORD, HCRYPTKEY*);
static BOOL (WINAPI *pCryptHashData)(HCRYPTHASH, BYTE*, DWORD, DWORD);
static BOOL (WINAPI *pCryptHashSessionKey)(HCRYPTHASH, HCRYPTKEY, DWORD);
static BOOL (WINAPI *pCryptImportKey)(HCRYPTPROV, BYTE*, DWORD, HCRYPTKEY, DWORD, HCRYPTKEY*);
static BOOL (WINAPI *pCryptSignHashW)(HCRYPTHASH, DWORD, LPCWSTR, DWORD, BYTE*, DWORD*);
static BOOL (WINAPI *pCryptSetHashParam)(HCRYPTKEY, DWORD, BYTE*, DWORD);
static BOOL (WINAPI *pCryptSetKeyParam)(HCRYPTKEY, DWORD, BYTE*, DWORD);
static BOOL (WINAPI *pCryptSetProvParam)(HCRYPTPROV, DWORD, BYTE*, DWORD);
static BOOL (WINAPI *pCryptVerifySignatureW)(HCRYPTHASH, BYTE*, DWORD, HCRYPTKEY, LPCWSTR, DWORD);
static BOOLEAN (WINAPI *pSystemFunction036)(PVOID, ULONG);
......@@ -70,89 +49,135 @@ static void init_function_pointers(void)
{
HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
pCryptAcquireContextA = (void*)GetProcAddress(hadvapi32, "CryptAcquireContextA");
pCryptEnumProviderTypesA = (void*)GetProcAddress(hadvapi32, "CryptEnumProviderTypesA");
pCryptEnumProvidersA = (void*)GetProcAddress(hadvapi32, "CryptEnumProvidersA");
pCryptGetDefaultProviderA = (void*)GetProcAddress(hadvapi32, "CryptGetDefaultProviderA");
pCryptReleaseContext = (void*)GetProcAddress(hadvapi32, "CryptReleaseContext");
pCryptSetProviderExA = (void*)GetProcAddress(hadvapi32, "CryptSetProviderExA");
pCryptCreateHash = (void*)GetProcAddress(hadvapi32, "CryptCreateHash");
pCryptDestroyHash = (void*)GetProcAddress(hadvapi32, "CryptDestroyHash");
pCryptGenRandom = (void*)GetProcAddress(hadvapi32, "CryptGenRandom");
pCryptContextAddRef = (void*)GetProcAddress(hadvapi32, "CryptContextAddRef");
pCryptGenKey = (void*)GetProcAddress(hadvapi32, "CryptGenKey");
pCryptDestroyKey = (void*)GetProcAddress(hadvapi32, "CryptDestroyKey");
pCryptDecrypt = (void*)GetProcAddress(hadvapi32, "CryptDecrypt");
pCryptDeriveKey = (void*)GetProcAddress(hadvapi32, "CryptDeriveKey");
pCryptDuplicateHash = (void*)GetProcAddress(hadvapi32, "CryptDuplicateHash");
pCryptDuplicateKey = (void*)GetProcAddress(hadvapi32, "CryptDuplicateKey");
pCryptEncrypt = (void*)GetProcAddress(hadvapi32, "CryptEncrypt");
pCryptExportKey = (void*)GetProcAddress(hadvapi32, "CryptExportKey");
pCryptGetHashParam = (void*)GetProcAddress(hadvapi32, "CryptGetHashParam");
pCryptGetKeyParam = (void*)GetProcAddress(hadvapi32, "CryptGetKeyParam");
pCryptGetProvParam = (void*)GetProcAddress(hadvapi32, "CryptGetProvParam");
pCryptGetUserKey = (void*)GetProcAddress(hadvapi32, "CryptGetUserKey");
pCryptHashData = (void*)GetProcAddress(hadvapi32, "CryptHashData");
pCryptHashSessionKey = (void*)GetProcAddress(hadvapi32, "CryptHashSessionKey");
pCryptImportKey = (void*)GetProcAddress(hadvapi32, "CryptImportKey");
pCryptSignHashW = (void*)GetProcAddress(hadvapi32, "CryptSignHashW");
pCryptSetHashParam = (void*)GetProcAddress(hadvapi32, "CryptSetHashParam");
pCryptSetKeyParam = (void*)GetProcAddress(hadvapi32, "CryptSetKeyParam");
pCryptSetProvParam = (void*)GetProcAddress(hadvapi32, "CryptSetProvParam");
pCryptVerifySignatureW = (void*)GetProcAddress(hadvapi32, "CryptVerifySignatureW");
pSystemFunction036 = (void*)GetProcAddress(hadvapi32, "SystemFunction036");
}
static void init_environment(void)
{
HCRYPTPROV hProv;
/* Ensure that container "wine_test_keyset" does exist */
if (!pCryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, 0))
{
pCryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, CRYPT_NEWKEYSET);
}
pCryptReleaseContext(hProv, 0);
HCRYPTPROV hProv;
BOOL ret;
/* Ensure that container "wine_test_keyset" does exist in default PROV_RSA_FULL type provider */
if (!pCryptAcquireContextA(&hProv, szKeySet, NULL, PROV_RSA_FULL, 0))
{
pCryptAcquireContextA(&hProv, szKeySet, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET);
}
pCryptReleaseContext(hProv, 0);
/* Ensure that container "wine_test_keyset" does exist */
if (!CryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, 0))
{
CryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, CRYPT_NEWKEYSET);
}
ret = CryptReleaseContext(hProv, 0);
ok(ret, "got %lu\n", GetLastError());
/* Ensure that container "wine_test_bad_keyset" does not exist. */
if (pCryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv, PROV_RSA_FULL, 0))
{
pCryptReleaseContext(hProv, 0);
pCryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
}
/* Ensure that container "wine_test_keyset" does exist in default PROV_RSA_FULL type provider */
if (!CryptAcquireContextA(&hProv, szKeySet, NULL, PROV_RSA_FULL, 0))
{
CryptAcquireContextA(&hProv, szKeySet, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET);
}
ret = CryptReleaseContext(hProv, 0);
ok(ret, "got %lu\n", GetLastError());
/* Ensure that container "wine_test_bad_keyset" does not exist. */
if (CryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv, PROV_RSA_FULL, 0))
{
ret = CryptReleaseContext(hProv, 0);
ok(ret, "got %lu\n", GetLastError());
CryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
}
}
static void clean_up_environment(void)
{
HCRYPTPROV hProv;
HCRYPTPROV hProv;
BOOL ret;
/* Remove container "wine_test_keyset" */
if (pCryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, 0))
{
pCryptReleaseContext(hProv, 0);
pCryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
}
/* Remove container "wine_test_keyset" */
if (CryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, 0))
{
ret = CryptReleaseContext(hProv, 0);
ok(ret, "got %lu\n", GetLastError());
/* Remove container "wine_test_keyset" from default PROV_RSA_FULL type provider */
if (pCryptAcquireContextA(&hProv, szKeySet, NULL, PROV_RSA_FULL, 0))
{
pCryptReleaseContext(hProv, 0);
pCryptAcquireContextA(&hProv, szKeySet, NULL, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
}
CryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
}
/* Remove container "wine_test_keyset" from default PROV_RSA_FULL type provider */
if (CryptAcquireContextA(&hProv, szKeySet, NULL, PROV_RSA_FULL, 0))
{
ret = CryptReleaseContext(hProv, 0);
ok(ret, "got %lu\n", GetLastError());
CryptAcquireContextA(&hProv, szKeySet, NULL, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
}
/* Remove container "wine_test_bad_keyset" */
if (CryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv, PROV_RSA_FULL, 0))
{
ret = CryptReleaseContext(hProv, 0);
ok(ret, "got %lu\n", GetLastError());
CryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
}
}
static void test_CryptReleaseContext(void)
{
BOOL ret;
HCRYPTPROV prov;
/* TODO: Add cases for ERROR_BUSY, ERROR_INVALID_HANDLE and NTE_BAD_UID */
/* NULL provider */
SetLastError(0xdeadbeef);
ret = CryptReleaseContext(0, 0);
ok(!ret, "CryptReleaseContext succeeded unexpectedly\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %lu\n", GetLastError());
SetLastError(0xdeadbeef);
ret = CryptReleaseContext(0, ~0);
ok(!ret, "CryptReleaseContext succeeded unexpectedly\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %lu\n", GetLastError());
/* Additional refcount */
ret = CryptAcquireContextA(&prov, szKeySet, szRsaBaseProv, PROV_RSA_FULL, 0);
ok(ret, "got %lu\n", GetLastError());
ret = CryptContextAddRef(prov, NULL, 0);
ok(ret, "got %lu\n", GetLastError());
ret = CryptContextAddRef(0, NULL, 0);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %lu\n", GetLastError());
ret = CryptContextAddRef(0xdeadbeef, NULL, 0);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %lu\n", GetLastError());
ret = CryptReleaseContext(prov, 0);
ok(ret, "got %lu\n", GetLastError());
/* Nonzero flags, which allow release nonetheless */
SetLastError(0xdeadbeef);
ret = CryptReleaseContext(prov, ~0);
ok(!ret, "CryptReleaseContext succeeded unexpectedly\n");
ok(GetLastError() == NTE_BAD_FLAGS, "got %lu\n", GetLastError());
/* Remove container "wine_test_bad_keyset" */
if (pCryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv, PROV_RSA_FULL, 0))
{
pCryptReleaseContext(hProv, 0);
pCryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
}
/* Obsolete provider */
SetLastError(0xdeadbeef);
ret = CryptReleaseContext(prov, 0);
ok(!ret, "CryptReleaseContext succeeded unexpectedly\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %lu\n", GetLastError());
SetLastError(0xdeadbeef);
ret = CryptReleaseContext(prov, ~0);
ok(!ret, "CryptReleaseContext succeeded unexpectedly\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %lu\n", GetLastError());
}
static void test_acquire_context(void)
......@@ -165,55 +190,64 @@ static void test_acquire_context(void)
* The order of the error tests seems to match Windows XP's rsaenh.dll CSP,
* but since this is likely to change between CSP versions, we don't check
* this. Please don't change the order of tests. */
result = pCryptAcquireContextA(&hProv, NULL, NULL, 0, 0);
ok(!result && GetLastError()==NTE_BAD_PROV_TYPE, "%d\n", GetLastError());
result = CryptAcquireContextA(&hProv, NULL, NULL, 0, 0);
ok(!result && GetLastError()==NTE_BAD_PROV_TYPE, "%ld\n", GetLastError());
result = pCryptAcquireContextA(&hProv, NULL, NULL, 1000, 0);
ok(!result && GetLastError()==NTE_BAD_PROV_TYPE, "%d\n", GetLastError());
result = CryptAcquireContextA(&hProv, NULL, NULL, 1000, 0);
ok(!result && GetLastError()==NTE_BAD_PROV_TYPE, "%ld\n", GetLastError());
result = pCryptAcquireContextA(&hProv, NULL, NULL, NON_DEF_PROV_TYPE, 0);
ok(!result && GetLastError()==NTE_PROV_TYPE_NOT_DEF, "%d\n", GetLastError());
result = CryptAcquireContextA(&hProv, NULL, NULL, NON_DEF_PROV_TYPE, 0);
ok(!result && GetLastError()==NTE_PROV_TYPE_NOT_DEF, "%ld\n", GetLastError());
result = pCryptAcquireContextA(&hProv, szKeySet, szNonExistentProv, PROV_RSA_FULL, 0);
ok(!result && GetLastError()==NTE_KEYSET_NOT_DEF, "%d\n", GetLastError());
result = CryptAcquireContextA(&hProv, szKeySet, szNonExistentProv, PROV_RSA_FULL, 0);
ok(!result && GetLastError()==NTE_KEYSET_NOT_DEF, "%ld\n", GetLastError());
result = pCryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, NON_DEF_PROV_TYPE, 0);
ok(!result && GetLastError()==NTE_PROV_TYPE_NO_MATCH, "%d\n", GetLastError());
result = CryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, NON_DEF_PROV_TYPE, 0);
ok(!result && GetLastError()==NTE_PROV_TYPE_NO_MATCH, "%ld\n", GetLastError());
if (0)
{
/* This test fails under Win2k SP4:
result = TRUE, GetLastError() == ERROR_INVALID_PARAMETER
result = TRUE, GetLastError() == ERROR_INVALID_PARAMETER */
SetLastError(0xdeadbeef);
result = pCryptAcquireContextA(NULL, szKeySet, szRsaBaseProv, PROV_RSA_FULL, 0);
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "%d/%d\n", result, GetLastError());
*/
result = CryptAcquireContextA(NULL, szKeySet, szRsaBaseProv, PROV_RSA_FULL, 0);
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "%d/%ld\n", result, GetLastError());
}
/* Last not least, try to really acquire a context. */
hProv = 0;
SetLastError(0xdeadbeef);
result = pCryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, 0);
result = CryptAcquireContextA(&hProv, szKeySet, szRsaBaseProv, PROV_RSA_FULL, 0);
GLE = GetLastError();
ok(result && (GLE == ERROR_ENVVAR_NOT_FOUND ||
GLE == ERROR_SUCCESS ||
GLE == ERROR_RING2_STACK_IN_USE ||
GLE == NTE_FAIL ||
GLE == ERROR_NOT_LOGGED_ON), "%d/%d\n", result, GLE);
GLE == ERROR_NOT_LOGGED_ON), "%d/%ld\n", result, GLE);
if (hProv)
pCryptReleaseContext(hProv, 0);
if (hProv)
{
result = CryptReleaseContext(hProv, 0);
ok(result, "got %lu\n", GetLastError());
}
/* Try again, witch an empty ("\0") szProvider parameter */
hProv = 0;
SetLastError(0xdeadbeef);
result = pCryptAcquireContextA(&hProv, szKeySet, "", PROV_RSA_FULL, 0);
result = CryptAcquireContextA(&hProv, szKeySet, "", PROV_RSA_FULL, 0);
GLE = GetLastError();
ok(result && (GLE == ERROR_ENVVAR_NOT_FOUND ||
GLE == ERROR_SUCCESS ||
GLE == ERROR_RING2_STACK_IN_USE ||
GLE == NTE_FAIL ||
GLE == ERROR_NOT_LOGGED_ON), "%d/%d\n", result, GetLastError());
GLE == ERROR_NOT_LOGGED_ON), "%d/%ld\n", result, GetLastError());
if (hProv)
pCryptReleaseContext(hProv, 0);
if (hProv)
{
result = CryptReleaseContext(hProv, 0);
ok(result, "got %lu\n", GetLastError());
}
}
static void test_incorrect_api_usage(void)
......@@ -235,143 +269,213 @@ static void test_incorrect_api_usage(void)
* robust here and returns an ERROR_INVALID_PARAMETER code.
*/
result = pCryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv,
result = CryptAcquireContextA(&hProv, szBadKeySet, szRsaBaseProv,
PROV_RSA_FULL, CRYPT_NEWKEYSET);
ok (result, "%08x\n", GetLastError());
ok (result, "%08lx\n", GetLastError());
if (!result) return;
result = pCryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash);
ok (result, "%d\n", GetLastError());
/* Looks like native handles are just pointers. */
ok(!!*(void **)hProv, "Got zero *(void **)hProv.\n");
result = CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash);
ok (result, "%ld\n", GetLastError());
if (!result) return;
pCryptDestroyHash(hHash);
result = pCryptCreateHash(0, CALG_SHA, 0, 0, &hHash);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptDeriveKey(0, CALG_RC4, hHash, 0, &hKey2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = CryptDeriveKey(hProv, CALG_RC4, 0, 0, &hKey2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptGenKey(0, CALG_RC4, 0, &hKey);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptHashData(0, &temp, 1, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptGenKey(hProv, CALG_RC4, 0, &hKey);
ok (result, "%d\n", GetLastError());
result = CryptGenKey(hProv, CALG_RC4, 0, &hKey);
ok (result, "%ld\n", GetLastError());
if (!result) return;
result = pCryptGenKey(hProv, CALG_RC4, 0, &hKey2);
ok (result, "%d\n", GetLastError());
result = pCryptHashSessionKey(hHash, 0, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptHashSessionKey(0, hKey, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = CryptDestroyHash(hHash);
ok (result, "%08lx\n", GetLastError());
result = CryptDestroyHash(0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = CryptCreateHash(0xdeadbeef, CALG_SHA, 0, 0, &hHash);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = CryptCreateHash(0, CALG_SHA, 0, 0, &hHash);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = CryptGenKey(0, CALG_RC4, 0, &hKey);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
dwLen = 0;
SetLastError(0xdeadbeef);
result = CryptDecrypt(hKey, 0, FALSE, 0, &temp, &dwLen);
ok (result, "%lx\n", GetLastError());
dwLen = 0;
SetLastError(0xdeadbeef);
result = CryptDecrypt(hKey, 0, TRUE, 0, &temp, &dwLen);
ok (!result && GetLastError() == NTE_BAD_LEN, "%lx\n", GetLastError());
dwLen = 1;
result = CryptDecrypt(hKey, 0, TRUE, 0, &temp, &dwLen);
ok (result, "%ld\n", GetLastError());
result = CryptDecrypt(hKey, 0xdeadbeef, TRUE, 0, &temp, &dwLen);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = CryptDecrypt(0, 0, TRUE, 0, &temp, &dwLen);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = CryptDecrypt(0xdeadbeef, 0, TRUE, 0, &temp, &dwLen);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = CryptEncrypt(hKey, 0, TRUE, 0, &temp, &dwLen, sizeof(temp));
ok (result, "%ld\n", GetLastError());
result = CryptEncrypt(hKey, 0xdeadbeef, TRUE, 0, &temp, &dwLen, sizeof(temp));
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = CryptEncrypt(0, 0, TRUE, 0, &temp, &dwLen, sizeof(temp));
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = CryptEncrypt(0xdeadbeef, 0, TRUE, 0, &temp, &dwLen, sizeof(temp));
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
dwLen = 1;
result = CryptExportKey(hKey, 0xdeadbeef, 0, 0, &temp, &dwLen);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = CryptDestroyKey(hKey);
ok (result, "%ld\n", GetLastError());
result = CryptGenKey(hProv, CALG_RC4, 0, &hKey2);
ok (result, "%ld\n", GetLastError());
if (!result) return;
result = pCryptDestroyKey(hKey2);
ok (result, "%d\n", GetLastError());
result = CryptDestroyKey(hKey2);
ok (result, "%ld\n", GetLastError());
result = CryptDestroyKey(0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
dwTemp = CRYPT_MODE_ECB;
result = pCryptSetKeyParam(hKey2, KP_MODE, (BYTE*)&dwTemp, sizeof(DWORD));
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = pCryptAcquireContextA(&hProv2, szBadKeySet, NULL, PROV_RSA_FULL,
result = CryptSetKeyParam(hKey2, KP_MODE, (BYTE*)&dwTemp, sizeof(DWORD));
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
hProv2 = 0xdeadbeef;
result = CryptAcquireContextA(&hProv2, szBadKeySet, NULL, PROV_RSA_FULL,
CRYPT_DELETEKEYSET);
ok (result, "%d\n", GetLastError());
ok (result, "%ld\n", GetLastError());
ok (hProv2 == 0, "%Id\n", hProv2);
if (!result) return;
result = pCryptReleaseContext(hProv, 0);
ok (result, "%d\n", GetLastError());
result = CryptReleaseContext(hProv, 0);
ok(result, "got %lu\n", GetLastError());
if (!result) return;
result = pCryptReleaseContext(hProv, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = pCryptGenRandom(0, 1, &temp);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptGenRandom(hProv, 1, &temp);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
#ifdef CRASHES_ON_NT40
result = pCryptContextAddRef(hProv, NULL, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
#endif
result = CryptContextAddRef(hProv, NULL, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
dwLen = 1;
result = pCryptDecrypt(hKey, 0, TRUE, 0, &temp, &dwLen);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptDecrypt(hKey, 0, TRUE, 0, &temp, &dwLen);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
dwLen = 1;
result = pCryptEncrypt(hKey, 0, TRUE, 0, &temp, &dwLen, 1);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptEncrypt(hKey, 0, TRUE, 0, &temp, &dwLen, 1);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptDeriveKey(hProv, CALG_RC4, hHash, 0, &hKey2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptDeriveKey(hProv, CALG_RC4, hHash, 0, &hKey2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
#ifdef CRASHES_ON_NT40
result = pCryptDuplicateHash(hHash, NULL, 0, &hHash2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptDuplicateKey(hKey, NULL, 0, &hKey2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
#endif
result = CryptDuplicateKey(hKey, NULL, 0, &hKey2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
dwLen = 1;
result = pCryptExportKey(hKey, 0, 0, 0, &temp, &dwLen);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptExportKey(hKey, 0, 0, 0, &temp, &dwLen);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptGenKey(hProv, CALG_RC4, 0, &hKey2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptGenKey(hProv, CALG_RC4, 0, &hKey2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
dwLen = 1;
result = pCryptGetHashParam(hHash, 0, &temp, &dwLen, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptGetHashParam(hHash, 0, &temp, &dwLen, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
dwLen = 1;
result = pCryptGetKeyParam(hKey, 0, &temp, &dwLen, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptGetKeyParam(hKey, 0, &temp, &dwLen, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
dwLen = 1;
result = pCryptGetProvParam(hProv, 0, &temp, &dwLen, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptGetProvParam(hProv, 0, &temp, &dwLen, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = CryptGetUserKey(0, 0, &hKey2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptGetUserKey(hProv, 0, &hKey2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptGetUserKey(hProv, 0, &hKey2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptHashData(hHash, &temp, 1, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptHashData(hHash, &temp, 1, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptHashSessionKey(hHash, hKey, 0);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptImportKey(hProv, &temp, 1, 0, 0, &hKey2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptImportKey(hProv, &temp, 1, 0, 0, &hKey2);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
if (pCryptSignHashW)
{
dwLen = 1;
result = pCryptSignHashW(hHash, 0, NULL, 0, &temp, &dwLen);
ok (!result && (GetLastError() == ERROR_INVALID_PARAMETER ||
GetLastError() == ERROR_CALL_NOT_IMPLEMENTED), "%d\n", GetLastError());
GetLastError() == ERROR_CALL_NOT_IMPLEMENTED), "%ld\n", GetLastError());
result = pCryptSignHashW(hHash, 0, NULL, 0, &temp, &dwLen);
ok (!result && (GetLastError() == ERROR_INVALID_PARAMETER ||
GetLastError() == ERROR_CALL_NOT_IMPLEMENTED), "%ld\n", GetLastError());
}
else
win_skip("CryptSignHashW is not available\n");
result = pCryptSetKeyParam(hKey, 0, &temp, 1);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptSetKeyParam(hKey, 0, &temp, 1);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptSetHashParam(hHash, 0, &temp, 1);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptSetHashParam(hHash, 0, &temp, 1);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptSetProvParam(hProv, 0, &temp, 1);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptSetProvParam(0, 0, &temp, 1);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = CryptSetProvParam(hProv, 0, &temp, 1);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
if (pCryptVerifySignatureW)
{
result = pCryptVerifySignatureW(hHash, &temp, 1, hKey, NULL, 0);
ok (!result && (GetLastError() == ERROR_INVALID_PARAMETER ||
GetLastError() == ERROR_CALL_NOT_IMPLEMENTED), "%d\n", GetLastError());
GetLastError() == ERROR_CALL_NOT_IMPLEMENTED), "%ld\n", GetLastError());
}
else
win_skip("CryptVerifySignatureW is not available\n");
result = pCryptDestroyHash(hHash);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptDestroyHash(hHash);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
result = pCryptDestroyKey(hKey);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
result = CryptDestroyKey(hKey);
ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
}
static const BYTE privKey[] = {
......@@ -422,49 +526,51 @@ static void test_verify_sig(void)
return;
}
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError());
ret = pCryptAcquireContextA(&prov, szKeySet, NULL, PROV_RSA_FULL,
"Expected ERROR_INVALID_PARAMETER, got %08lx\n", GetLastError());
ret = CryptAcquireContextA(&prov, szKeySet, NULL, PROV_RSA_FULL,
CRYPT_NEWKEYSET);
if (!ret && GetLastError() == NTE_EXISTS)
ret = pCryptAcquireContextA(&prov, szKeySet, NULL, PROV_RSA_FULL, 0);
ok(ret, "CryptAcquireContextA failed: %08x\n", GetLastError());
ret = pCryptImportKey(prov, (LPBYTE)privKey, sizeof(privKey), 0, 0, &key);
ok(ret, "CryptImportKey failed: %08x\n", GetLastError());
ret = pCryptCreateHash(prov, CALG_MD5, 0, 0, &hash);
ok(ret, "CryptCreateHash failed: %08x\n", GetLastError());
ret = CryptAcquireContextA(&prov, szKeySet, NULL, PROV_RSA_FULL, 0);
ok(ret, "CryptAcquireContextA failed: %08lx\n", GetLastError());
ret = CryptImportKey(prov, (LPBYTE)privKey, sizeof(privKey), 0, 0, &key);
ok(ret, "CryptImportKey failed: %08lx\n", GetLastError());
ret = CryptCreateHash(prov, CALG_MD5, 0, 0, &hash);
ok(ret, "CryptCreateHash failed: %08lx\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pCryptVerifySignatureW(hash, NULL, 0, 0, NULL, 0);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError());
"Expected ERROR_INVALID_PARAMETER, got %08lx\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pCryptVerifySignatureW(0, NULL, 0, key, NULL, 0);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError());
"Expected ERROR_INVALID_PARAMETER, got %08lx\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pCryptVerifySignatureW(hash, NULL, 0, key, NULL, 0);
ok(!ret && (GetLastError() == NTE_BAD_SIGNATURE ||
GetLastError() == ERROR_INVALID_PARAMETER),
"Expected NTE_BAD_SIGNATURE or ERROR_INVALID_PARAMETER, got %08x\n",
"Expected NTE_BAD_SIGNATURE or ERROR_INVALID_PARAMETER, got %08lx\n",
GetLastError());
SetLastError(0xdeadbeef);
ret = pCryptVerifySignatureW(hash, NULL, sizeof(bogus), key, NULL, 0);
ok(!ret && (GetLastError() == NTE_BAD_SIGNATURE ||
GetLastError() == ERROR_INVALID_PARAMETER),
"Expected NTE_BAD_SIGNATURE or ERROR_INVALID_PARAMETER, got %08x\n",
"Expected NTE_BAD_SIGNATURE or ERROR_INVALID_PARAMETER, got %08lx\n",
GetLastError());
SetLastError(0xdeadbeef);
ret = pCryptVerifySignatureW(hash, bogus, 0, key, NULL, 0);
ok(!ret && GetLastError() == NTE_BAD_SIGNATURE,
"Expected NTE_BAD_SIGNATURE, got %08x\n", GetLastError());
"Expected NTE_BAD_SIGNATURE, got %08lx\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pCryptVerifySignatureW(hash, bogus, sizeof(bogus), key, NULL, 0);
ok(!ret &&
(GetLastError() == NTE_BAD_SIGNATURE ||
broken(GetLastError() == NTE_BAD_HASH_STATE /* older NT4 */)),
"Expected NTE_BAD_SIGNATURE, got %08x\n", GetLastError());
pCryptDestroyKey(key);
pCryptDestroyHash(hash);
pCryptReleaseContext(prov, 0);
"Expected NTE_BAD_SIGNATURE, got %08lx\n", GetLastError());
CryptDestroyKey(key);
CryptDestroyHash(hash);
ret = CryptReleaseContext(prov, 0);
ok(ret, "got %lu\n", GetLastError());
}
static BOOL FindProvRegVals(DWORD dwIndex, DWORD *pdwProvType, LPSTR *pszProvName,
......@@ -528,11 +634,11 @@ static void test_enum_providers(void)
/* check pdwReserved flag for NULL */
result = pCryptEnumProvidersA(dwIndex, &notNull, 0, &type, NULL, &providerLen);
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "%d\n", GetLastError());
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "%ld\n", GetLastError());
/* check dwFlags == 0 */
result = pCryptEnumProvidersA(dwIndex, NULL, notZeroFlags, &type, NULL, &providerLen);
ok(!result && GetLastError()==NTE_BAD_FLAGS, "%d\n", GetLastError());
ok(!result && GetLastError()==NTE_BAD_FLAGS, "%ld\n", GetLastError());
/* alloc provider to half the size required
* cbName holds the size required */
......@@ -541,7 +647,7 @@ static void test_enum_providers(void)
return;
result = pCryptEnumProvidersA(dwIndex, NULL, 0, &type, provider, &providerLen);
ok(!result && GetLastError()==ERROR_MORE_DATA, "expected %i, got %d\n",
ok(!result && GetLastError()==ERROR_MORE_DATA, "expected %i, got %ld\n",
ERROR_MORE_DATA, GetLastError());
LocalFree(provider);
......@@ -559,7 +665,7 @@ static void test_enum_providers(void)
* ERROR_NO_MORE_ITEMS */
for (count = 0; count < provCount + 1; count++)
result = pCryptEnumProvidersA(count, NULL, 0, &type, NULL, &providerLen);
ok(!result && GetLastError()==ERROR_NO_MORE_ITEMS, "expected %i, got %d\n",
ok(!result && GetLastError()==ERROR_NO_MORE_ITEMS, "expected %i, got %ld\n",
ERROR_NO_MORE_ITEMS, GetLastError());
/* check expected versus actual values returned */
......@@ -570,20 +676,20 @@ static void test_enum_providers(void)
providerLen = -1;
result = pCryptEnumProvidersA(dwIndex, NULL, 0, &type, provider, &providerLen);
ok(result, "expected TRUE, got %d\n", result);
ok(type==dwType, "expected %d, got %d\n", dwType, type);
ok(result, "expected TRUE, got %ld\n", result);
ok(type==dwType, "expected %ld, got %ld\n", dwType, type);
if (pszProvName)
ok(!strcmp(pszProvName, provider), "expected %s, got %s\n", pszProvName, provider);
ok(cbName==providerLen, "expected %d, got %d\n", cbName, providerLen);
ok(cbName==providerLen, "expected %ld, got %ld\n", cbName, providerLen);
providerLen = -1000;
provider[0] = 0;
result = pCryptEnumProvidersA(dwIndex, NULL, 0, &type, provider, &providerLen);
ok(result, "expected TRUE, got %d\n", result);
ok(type==dwType, "expected %d, got %d\n", dwType, type);
ok(result, "expected TRUE, got %ld\n", result);
ok(type==dwType, "expected %ld, got %ld\n", dwType, type);
if (pszProvName)
ok(!strcmp(pszProvName, provider), "expected %s, got %s\n", pszProvName, provider);
ok(cbName==providerLen, "expected %d, got %d\n", cbName, providerLen);
ok(cbName==providerLen, "expected %ld, got %ld\n", cbName, providerLen);
LocalFree(pszProvName);
LocalFree(provider);
......@@ -681,12 +787,12 @@ static void test_enum_provider_types(void)
/* check pdwReserved for NULL */
result = pCryptEnumProviderTypesA(index, &notNull, 0, &provType, typeName, &typeNameSize);
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n",
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n",
GetLastError());
/* check dwFlags == zero */
result = pCryptEnumProviderTypesA(index, NULL, notZeroFlags, &provType, typeName, &typeNameSize);
ok(!result && GetLastError()==NTE_BAD_FLAGS, "expected ERROR_INVALID_PARAMETER, got %d\n",
ok(!result && GetLastError()==NTE_BAD_FLAGS, "expected ERROR_INVALID_PARAMETER, got %ld\n",
GetLastError());
/* This test fails under Win2k SP4:
......@@ -701,7 +807,7 @@ static void test_enum_provider_types(void)
SetLastError(0xdeadbeef);
result = pCryptEnumProviderTypesA(index, NULL, 0, &provType, typeName, &typeNameSize);
ok(!result && GetLastError()==ERROR_MORE_DATA, "expected 0/ERROR_MORE_DATA, got %d/%d\n",
ok(!result && GetLastError()==ERROR_MORE_DATA, "expected 0/ERROR_MORE_DATA, got %ld/%ld\n",
result, GetLastError());
LocalFree(typeName);
......@@ -714,28 +820,28 @@ static void test_enum_provider_types(void)
while(pCryptEnumProviderTypesA(typeCount++, NULL, 0, &provType, NULL, &typeNameSize))
;
typeCount--;
ok(typeCount==dwTypeCount, "expected %d, got %d\n", dwTypeCount, typeCount);
ok(typeCount==dwTypeCount, "expected %ld, got %ld\n", dwTypeCount, typeCount);
/* loop past the actual number of provider types to get the error
* ERROR_NO_MORE_ITEMS */
for (typeCount = 0; typeCount < dwTypeCount + 1; typeCount++)
result = pCryptEnumProviderTypesA(typeCount, NULL, 0, &provType, NULL, &typeNameSize);
ok(!result && GetLastError()==ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %d\n",
ok(!result && GetLastError()==ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %ld\n",
GetLastError());
/* check expected versus actual values returned */
result = pCryptEnumProviderTypesA(index, NULL, 0, &provType, NULL, &typeNameSize);
ok(result && typeNameSize==cbTypeName, "expected %d, got %d\n", cbTypeName, typeNameSize);
ok(result && typeNameSize==cbTypeName, "expected %ld, got %ld\n", cbTypeName, typeNameSize);
if (!(typeName = LocalAlloc(LMEM_ZEROINIT, typeNameSize)))
goto cleanup;
typeNameSize = 0xdeadbeef;
result = pCryptEnumProviderTypesA(index, NULL, 0, &provType, typeName, &typeNameSize);
ok(result, "expected TRUE, got %d\n", result);
ok(provType==dwProvType, "expected %d, got %d\n", dwProvType, provType);
ok(result, "expected TRUE, got %ld\n", result);
ok(provType==dwProvType, "expected %ld, got %ld\n", dwProvType, provType);
if (pszTypeName)
ok(!strcmp(pszTypeName, typeName), "expected %s, got %s\n", pszTypeName, typeName);
ok(typeNameSize==cbTypeName, "expected %d, got %d\n", cbTypeName, typeNameSize);
ok(typeNameSize==cbTypeName, "expected %ld, got %ld\n", cbTypeName, typeNameSize);
LocalFree(typeName);
cleanup:
......@@ -822,13 +928,13 @@ static void test_get_default_provider(void)
/* check pdwReserved for NULL */
result = pCryptGetDefaultProviderA(provType, &notNull, flags, provName, &provNameSize);
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "expected %i, got %d\n",
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "expected %i, got %ld\n",
ERROR_INVALID_PARAMETER, GetLastError());
/* check for invalid flag */
flags = 0xdeadbeef;
result = pCryptGetDefaultProviderA(provType, NULL, flags, provName, &provNameSize);
ok(!result && GetLastError()==NTE_BAD_FLAGS, "expected %d, got %d\n",
ok(!result && GetLastError()==NTE_BAD_FLAGS, "expected %ld, got %ld\n",
NTE_BAD_FLAGS, GetLastError());
flags = CRYPT_MACHINE_DEFAULT;
......@@ -837,7 +943,7 @@ static void test_get_default_provider(void)
result = pCryptGetDefaultProviderA(provType, NULL, flags, provName, &provNameSize);
ok(!result && (GetLastError() == NTE_BAD_PROV_TYPE ||
GetLastError() == ERROR_INVALID_PARAMETER),
"expected NTE_BAD_PROV_TYPE or ERROR_INVALID_PARAMETER, got %d/%d\n",
"expected NTE_BAD_PROV_TYPE or ERROR_INVALID_PARAMETER, got %ld/%ld\n",
result, GetLastError());
provType = PROV_RSA_FULL;
......@@ -850,14 +956,14 @@ static void test_get_default_provider(void)
return;
result = pCryptGetDefaultProviderA(provType, NULL, flags, provName, &provNameSize);
ok(!result && GetLastError()==ERROR_MORE_DATA, "expected %i, got %d\n",
ok(!result && GetLastError()==ERROR_MORE_DATA, "expected %i, got %ld\n",
ERROR_MORE_DATA, GetLastError());
LocalFree(provName);
/* check expected versus actual values returned */
result = pCryptGetDefaultProviderA(provType, NULL, flags, NULL, &provNameSize);
ok(result && provNameSize==cbProvName, "expected %d, got %d\n", cbProvName, provNameSize);
ok(result && provNameSize==cbProvName, "expected %ld, got %ld\n", cbProvName, provNameSize);
provNameSize = cbProvName;
if (!(provName = LocalAlloc(LMEM_ZEROINIT, provNameSize)))
......@@ -865,10 +971,10 @@ static void test_get_default_provider(void)
provNameSize = 0xdeadbeef;
result = pCryptGetDefaultProviderA(provType, NULL, flags, provName, &provNameSize);
ok(result, "expected TRUE, got %d\n", result);
ok(result, "expected TRUE, got %ld\n", result);
if(pszProvName)
ok(!strcmp(pszProvName, provName), "expected %s, got %s\n", pszProvName, provName);
ok(provNameSize==cbProvName, "expected %d, got %d\n", cbProvName, provNameSize);
ok(provNameSize==cbProvName, "expected %ld, got %ld\n", cbProvName, provNameSize);
LocalFree(pszProvName);
LocalFree(provName);
......@@ -896,11 +1002,11 @@ static void test_set_provider_ex(void)
if (!(curProvName = LocalAlloc(LMEM_ZEROINIT, curlen)))
return;
result = pCryptGetDefaultProviderA(PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT, curProvName, &curlen);
ok(result, "%d\n", GetLastError());
ok(result, "%ld\n", GetLastError());
/* check pdwReserved for NULL */
result = pCryptSetProviderExA(MS_DEF_PROV_A, PROV_RSA_FULL, &notNull, CRYPT_MACHINE_DEFAULT);
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "expected %i, got %d\n",
ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "expected %i, got %ld\n",
ERROR_INVALID_PARAMETER, GetLastError());
/* remove the default provider and then set it to MS_DEF_PROV/PROV_RSA_FULL */
......@@ -909,31 +1015,31 @@ static void test_set_provider_ex(void)
if (!result)
{
ok( GetLastError() == ERROR_ACCESS_DENIED || broken(GetLastError() == ERROR_INVALID_PARAMETER),
"wrong error %u\n", GetLastError() );
"wrong error %lu\n", GetLastError() );
skip("Not enough rights to remove the default provider\n");
LocalFree(curProvName);
return;
}
result = pCryptSetProviderExA(MS_DEF_PROV_A, PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT);
ok(result, "%d\n", GetLastError());
ok(result, "%ld\n", GetLastError());
/* call CryptGetDefaultProvider to see if they match */
result = pCryptGetDefaultProviderA(PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT, NULL, &cbProvName);
ok(result, "%d\n", GetLastError());
ok(result, "%ld\n", GetLastError());
if (!(pszProvName = LocalAlloc(LMEM_ZEROINIT, cbProvName)))
goto reset;
result = pCryptGetDefaultProviderA(PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT, pszProvName, &cbProvName);
ok(result && !strcmp(MS_DEF_PROV_A, pszProvName), "expected %s, got %s\n", MS_DEF_PROV_A, pszProvName);
ok(result && cbProvName==(strlen(MS_DEF_PROV_A) + 1), "expected %i, got %d\n", (lstrlenA(MS_DEF_PROV_A) + 1), cbProvName);
ok(result && cbProvName==(strlen(MS_DEF_PROV_A) + 1), "expected %i, got %ld\n", (lstrlenA(MS_DEF_PROV_A) + 1), cbProvName);
LocalFree(pszProvName);
reset:
/* Set the provider back to its original */
result = pCryptSetProviderExA(curProvName, PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT);
ok(result, "%d\n", GetLastError());
ok(result, "%ld\n", GetLastError());
LocalFree(curProvName);
}
......@@ -961,7 +1067,7 @@ static void test_machine_guid(void)
{
restoreGuid = TRUE;
r = RegDeleteValueA(key, "MachineGuid");
ok(!r || broken(r == ERROR_ACCESS_DENIED) /*win8*/, "RegDeleteValueA failed: %d\n", r);
ok(!r || broken(r == ERROR_ACCESS_DENIED) /*win8*/, "RegDeleteValueA failed: %ld\n", r);
if (r == ERROR_ACCESS_DENIED)
{
skip("broken virtualization on HKLM\\Software\\Microsoft\\Cryptography\n");
......@@ -970,13 +1076,14 @@ static void test_machine_guid(void)
}
}
else
ok(r == ERROR_FILE_NOT_FOUND, "expected ERROR_FILE_NOT_FOUND, got %d\n",
ok(r == ERROR_FILE_NOT_FOUND, "expected ERROR_FILE_NOT_FOUND, got %ld\n",
r);
/* Create and release a provider */
ret = pCryptAcquireContextA(&hCryptProv, szKeySet, NULL, PROV_RSA_FULL, 0);
ret = CryptAcquireContextA(&hCryptProv, szKeySet, NULL, PROV_RSA_FULL, 0);
ok(ret || broken(!ret && GetLastError() == NTE_KEYSET_ENTRY_BAD /* NT4 */),
"CryptAcquireContextA failed: %08x\n", GetLastError());
pCryptReleaseContext(hCryptProv, 0);
"CryptAcquireContextA failed: %08lx\n", GetLastError());
ret = CryptReleaseContext(hCryptProv, 0);
ok(ret, "got %lu\n", GetLastError());
if (restoreGuid)
RegSetValueExA(key, "MachineGuid", 0, REG_SZ, (const BYTE *)originalGuid,
......@@ -1004,9 +1111,9 @@ static void test_rc2_keylen(void)
BOOL ret;
SetLastError(0xdeadbeef);
ret = pCryptAcquireContextA(&provider, NULL, NULL,
ret = CryptAcquireContextA(&provider, NULL, NULL,
PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
ok(ret, "CryptAcquireContext error %u\n", GetLastError());
ok(ret, "CryptAcquireContext error %lu\n", GetLastError());
if (ret)
{
key_blob.header.bType = PLAINTEXTKEYBLOB;
......@@ -1018,71 +1125,68 @@ static void test_rc2_keylen(void)
/* Importing a 16-byte key works with the default provider. */
SetLastError(0xdeadbeef);
ret = pCryptImportKey(provider, (BYTE*)&key_blob,
sizeof(BLOBHEADER)+sizeof(DWORD)+key_blob.key_size,
0, CRYPT_IPSEC_HMAC_KEY, &hkey);
ret = CryptImportKey(provider, (BYTE *)&key_blob, sizeof(BLOBHEADER) + sizeof(DWORD) + key_blob.key_size,
0, CRYPT_IPSEC_HMAC_KEY, &hkey);
/* CRYPT_IPSEC_HMAC_KEY is not supported on W2K and lower */
ok(ret ||
broken(!ret && GetLastError() == NTE_BAD_FLAGS),
"CryptImportKey error %08x\n", GetLastError());
"CryptImportKey error %08lx\n", GetLastError());
if (ret)
pCryptDestroyKey(hkey);
pCryptReleaseContext(provider, 0);
CryptDestroyKey(hkey);
ret = CryptReleaseContext(provider, 0);
ok(ret, "got %lu\n", GetLastError());
}
SetLastError(0xdeadbeef);
ret = pCryptAcquireContextA(&provider, NULL, MS_DEF_PROV_A,
ret = CryptAcquireContextA(&provider, NULL, MS_DEF_PROV_A,
PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
ok(ret, "CryptAcquireContext error %08x\n", GetLastError());
ok(ret, "CryptAcquireContext error %08lx\n", GetLastError());
if (ret)
{
/* Importing a 16-byte key doesn't work with the base provider.. */
SetLastError(0xdeadbeef);
ret = pCryptImportKey(provider, (BYTE*)&key_blob,
sizeof(BLOBHEADER)+sizeof(DWORD)+key_blob.key_size,
0, 0, &hkey);
ret = CryptImportKey(provider, (BYTE *)&key_blob, sizeof(BLOBHEADER) + sizeof(DWORD) + key_blob.key_size,
0, 0, &hkey);
ok(!ret && (GetLastError() == NTE_BAD_DATA ||
GetLastError() == NTE_BAD_LEN || /* Win7 */
GetLastError() == NTE_BAD_TYPE || /* W2K */
GetLastError() == NTE_PERM), /* Win9x, WinMe and NT4 */
"unexpected error %08x\n", GetLastError());
"unexpected error %08lx\n", GetLastError());
/* but importing an 56-bit (7-byte) key does.. */
key_blob.key_size = 7;
SetLastError(0xdeadbeef);
ret = pCryptImportKey(provider, (BYTE*)&key_blob,
sizeof(BLOBHEADER)+sizeof(DWORD)+key_blob.key_size,
0, 0, &hkey);
ret = CryptImportKey(provider, (BYTE *)&key_blob, sizeof(BLOBHEADER) + sizeof(DWORD) + key_blob.key_size,
0, 0, &hkey);
ok(ret ||
broken(!ret && GetLastError() == NTE_BAD_TYPE) || /* W2K */
broken(!ret && GetLastError() == NTE_PERM), /* Win9x, WinMe and NT4 */
"CryptAcquireContext error %08x\n", GetLastError());
"CryptAcquireContext error %08lx\n", GetLastError());
if (ret)
pCryptDestroyKey(hkey);
CryptDestroyKey(hkey);
/* as does importing a 16-byte key with the base provider when
* CRYPT_IPSEC_HMAC_KEY is specified.
*/
key_blob.key_size = sizeof(key);
SetLastError(0xdeadbeef);
ret = pCryptImportKey(provider, (BYTE*)&key_blob,
sizeof(BLOBHEADER)+sizeof(DWORD)+key_blob.key_size,
0, CRYPT_IPSEC_HMAC_KEY, &hkey);
ret = CryptImportKey(provider, (BYTE *)&key_blob, sizeof(BLOBHEADER) + sizeof(DWORD) + key_blob.key_size,
0, CRYPT_IPSEC_HMAC_KEY, &hkey);
/* CRYPT_IPSEC_HMAC_KEY is not supported on W2K and lower */
ok(ret ||
broken(!ret && GetLastError() == NTE_BAD_FLAGS),
"CryptImportKey error %08x\n", GetLastError());
"CryptImportKey error %08lx\n", GetLastError());
if (ret)
pCryptDestroyKey(hkey);
CryptDestroyKey(hkey);
pCryptReleaseContext(provider, 0);
ret = CryptReleaseContext(provider, 0);
ok(ret, "got %lu\n", GetLastError());
}
key_blob.key_size = sizeof(key);
SetLastError(0xdeadbeef);
ret = pCryptAcquireContextA(&provider, NULL, NULL,
PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
ok(ret, "CryptAcquireContext error %08x\n", GetLastError());
ret = CryptAcquireContextA(&provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
ok(ret, "CryptAcquireContext error %08lx\n", GetLastError());
if (ret)
{
......@@ -1090,30 +1194,29 @@ static void test_rc2_keylen(void)
* CRYPT_IPSEC_HMAC_KEY is specified.
*/
SetLastError(0xdeadbeef);
ret = pCryptImportKey(provider, (BYTE*)&key_blob,
sizeof(BLOBHEADER)+sizeof(DWORD)+key_blob.key_size,
0, CRYPT_IPSEC_HMAC_KEY, &hkey);
ret = CryptImportKey(provider, (BYTE *)&key_blob, sizeof(BLOBHEADER) + sizeof(DWORD) + key_blob.key_size,
0, CRYPT_IPSEC_HMAC_KEY, &hkey);
ok(ret ||
broken(!ret && GetLastError() == NTE_BAD_FLAGS),
"CryptImportKey error %08x\n", GetLastError());
"CryptImportKey error %08lx\n", GetLastError());
if (ret)
pCryptDestroyKey(hkey);
CryptDestroyKey(hkey);
/* There is no apparent limit to the size of the input key when
* CRYPT_IPSEC_HMAC_KEY is specified.
*/
key_blob.key_size = sizeof(key_blob.key_data);
SetLastError(0xdeadbeef);
ret = pCryptImportKey(provider, (BYTE*)&key_blob,
sizeof(BLOBHEADER)+sizeof(DWORD)+key_blob.key_size,
0, CRYPT_IPSEC_HMAC_KEY, &hkey);
ret = CryptImportKey(provider, (BYTE *)&key_blob, sizeof(BLOBHEADER) + sizeof(DWORD) + key_blob.key_size,
0, CRYPT_IPSEC_HMAC_KEY, &hkey);
ok(ret ||
broken(!ret && GetLastError() == NTE_BAD_FLAGS),
"CryptImportKey error %08x\n", GetLastError());
"CryptImportKey error %08lx\n", GetLastError());
if (ret)
pCryptDestroyKey(hkey);
CryptDestroyKey(hkey);
pCryptReleaseContext(provider, 0);
ret = CryptReleaseContext(provider, 0);
ok(ret, "got %lu\n", GetLastError());
}
}
......@@ -1136,7 +1239,7 @@ static void test_SystemFunction036(void)
{
SetLastError(0xdeadbeef);
ret = pSystemFunction036(NULL, 5);
trace("ret = %d, GetLastError() = %d\n", ret, GetLastError());
trace("ret = %d, GetLastError() = %ld\n", ret, GetLastError());
}
ret = pSystemFunction036(&test, 0);
......@@ -1155,47 +1258,49 @@ static void test_container_sd(void)
ret = CryptAcquireContextA(&prov, "winetest", "Microsoft Enhanced Cryptographic Provider v1.0",
PROV_RSA_FULL, CRYPT_MACHINE_KEYSET|CRYPT_NEWKEYSET);
ok(ret, "got %u\n", GetLastError());
ok(ret, "got %lu\n", GetLastError());
len = 0;
SetLastError(0xdeadbeef);
ret = CryptGetProvParam(prov, PP_KEYSET_SEC_DESCR, NULL, &len, OWNER_SECURITY_INFORMATION);
err = GetLastError();
ok(ret, "got %u\n", err);
ok(err == ERROR_INSUFFICIENT_BUFFER || broken(err == ERROR_INVALID_PARAMETER), "got %u\n", err);
ok(ret, "got %lu\n", err);
ok(err == ERROR_INSUFFICIENT_BUFFER || broken(err == ERROR_INVALID_PARAMETER), "got %lu\n", err);
ok(len, "expected len > 0\n");
sd = HeapAlloc(GetProcessHeap(), 0, len);
sd = malloc(len);
ret = CryptGetProvParam(prov, PP_KEYSET_SEC_DESCR, (BYTE *)sd, &len, OWNER_SECURITY_INFORMATION);
ok(ret, "got %u\n", GetLastError());
HeapFree(GetProcessHeap(), 0, sd);
ok(ret, "got %lu\n", GetLastError());
free(sd);
ret = CryptReleaseContext(prov, 0);
ok(ret, "got %u\n", GetLastError());
ok(ret, "got %lu\n", GetLastError());
prov = 0xdeadbeef;
ret = CryptAcquireContextA(&prov, "winetest", "Microsoft Enhanced Cryptographic Provider v1.0",
PROV_RSA_FULL, CRYPT_MACHINE_KEYSET|CRYPT_DELETEKEYSET);
ok(ret, "got %u\n", GetLastError());
ok(ret, "got %lu\n", GetLastError());
ok(prov == 0, "got %Id\n", prov);
}
START_TEST(crypt)
{
init_function_pointers();
if (pCryptAcquireContextA && pCryptReleaseContext)
{
test_rc2_keylen();
init_environment();
test_acquire_context();
test_incorrect_api_usage();
test_verify_sig();
test_machine_guid();
test_container_sd();
clean_up_environment();
}
test_enum_providers();
test_enum_provider_types();
test_get_default_provider();
test_set_provider_ex();
test_SystemFunction036();
test_rc2_keylen();
init_environment();
test_CryptReleaseContext();
test_acquire_context();
test_incorrect_api_usage();
test_verify_sig();
test_machine_guid();
test_container_sd();
clean_up_environment();
test_enum_providers();
test_enum_provider_types();
test_get_default_provider();
test_set_provider_ex();
test_SystemFunction036();
}
......@@ -287,18 +287,18 @@ static void test_SystemFunction004(void)
r = pSystemFunction002(out.Buffer, key.Buffer, output);
ok(r == STATUS_SUCCESS, "function failed\n");
ok(((unsigned int*)output)[0] == in.Length, "crypted length wrong\n");
ok(((unsigned int*)output)[1] == 1, "crypted value wrong\n");
ok(((unsigned int*)output)[0] == in.Length, "encrypted length wrong\n");
ok(((unsigned int*)output)[1] == 1, "encrypted value wrong\n");
memset(output, 0, sizeof output);
r = pSystemFunction002(out.Buffer+8, key.Buffer, output);
ok(r == STATUS_SUCCESS, "function failed\n");
ok(!memcmp(output, inbuf, sizeof output), "crypted data wrong\n");
ok(!memcmp(output, inbuf, sizeof output), "encrypted data wrong\n");
memset(output, 0, sizeof output);
r = pSystemFunction002(out.Buffer+16, key.Buffer, output);
ok(r == STATUS_SUCCESS, "function failed\n");
ok(!memcmp(output, inbuf, sizeof output), "crypted data wrong\n");
ok(!memcmp(output, inbuf, sizeof output), "encrypted data wrong\n");
}
static void test_SystemFunction005(void)
......
......@@ -104,7 +104,7 @@ static void test_SystemFunction007(void)
BYTE output[0x10];
BYTE expected[0x10] = { 0x24, 0x0a, 0xf0, 0x9d, 0x84, 0x1c, 0xda, 0xcf,
0x56, 0xeb, 0x6b, 0x96, 0x55, 0xec, 0xcf, 0x0a };
WCHAR szFoo[] = {'f','o','o',0 };
WCHAR szFoo[] = L"foo";
if (0)
{
......
......@@ -20,17 +20,25 @@
#include <stdarg.h>
#include "initguid.h"
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "winnt.h"
#include "winreg.h"
#include "sddl.h"
#include "wmistr.h"
#include "evntprov.h"
#include "evntrace.h"
#include "netevent.h"
#include "wine/test.h"
static BOOL (WINAPI *pCreateWellKnownSid)(WELL_KNOWN_SID_TYPE,PSID,PSID,DWORD*);
static BOOL (WINAPI *pGetEventLogInformation)(HANDLE,DWORD,LPVOID,DWORD,LPDWORD);
static ULONG (WINAPI *pEventRegister)(const GUID *,PENABLECALLBACK,void *,REGHANDLE *);
static ULONG (WINAPI *pEventUnregister)(REGHANDLE);
static ULONG (WINAPI *pEventWriteString)(REGHANDLE,UCHAR,ULONGLONG,const WCHAR *);
static BOOL (WINAPI *pGetComputerNameExA)(COMPUTER_NAME_FORMAT,LPSTR,LPDWORD);
static BOOL (WINAPI *pWow64DisableWow64FsRedirection)(PVOID *);
......@@ -43,6 +51,9 @@ static void init_function_pointers(void)
pCreateWellKnownSid = (void*)GetProcAddress(hadvapi32, "CreateWellKnownSid");
pGetEventLogInformation = (void*)GetProcAddress(hadvapi32, "GetEventLogInformation");
pEventWriteString = (void*)GetProcAddress(hadvapi32, "EventWriteString");
pEventRegister = (void*)GetProcAddress(hadvapi32, "EventRegister");
pEventUnregister = (void*)GetProcAddress(hadvapi32, "EventUnregister");
pGetComputerNameExA = (void*)GetProcAddress(hkernel32, "GetComputerNameExA");
pWow64DisableWow64FsRedirection = (void*)GetProcAddress(hkernel32, "Wow64DisableWow64FsRedirection");
......@@ -54,8 +65,15 @@ static BOOL create_backup(const char *filename)
HANDLE handle;
DWORD rc, attribs;
DeleteFileA(filename);
handle = OpenEventLogA(NULL, "Application");
if (!handle && (GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == RPC_S_SERVER_UNAVAILABLE))
{
win_skip( "Can't open event log\n" );
return FALSE;
}
ok(handle != NULL, "OpenEventLogA(Application) failed : %ld\n", GetLastError());
DeleteFileA(filename);
rc = BackupEventLogA(handle, filename);
if (!rc && GetLastError() == ERROR_PRIVILEGE_NOT_HELD)
{
......@@ -63,12 +81,12 @@ static BOOL create_backup(const char *filename)
CloseEventLog(handle);
return FALSE;
}
ok(rc, "BackupEventLogA failed, le=%u\n", GetLastError());
ok(rc, "BackupEventLogA failed, le=%lu\n", GetLastError());
CloseEventLog(handle);
attribs = GetFileAttributesA(filename);
todo_wine
ok(attribs != INVALID_FILE_ATTRIBUTES, "Expected a backup file attribs=%#x le=%u\n", attribs, GetLastError());
ok(attribs != INVALID_FILE_ATTRIBUTES, "Expected a backup file attribs=%#lx le=%lu\n", attribs, GetLastError());
return TRUE;
}
......@@ -82,46 +100,46 @@ static void test_open_close(void)
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE ||
GetLastError() == ERROR_NOACCESS, /* W2K */
"Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
"Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
handle = OpenEventLogA(NULL, NULL);
ok(handle == NULL, "Didn't expect a handle\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(handle == NULL, "OpenEventLogA() succeeded\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
handle = OpenEventLogA("IDontExist", NULL);
ok(handle == NULL, "Didn't expect a handle\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(handle == NULL, "OpenEventLogA(IDontExist,) succeeded\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
handle = OpenEventLogA("IDontExist", "deadbeef");
ok(handle == NULL, "Didn't expect a handle\n");
ok(handle == NULL, "OpenEventLogA(IDontExist,deadbeef) succeeded\n");
ok(GetLastError() == RPC_S_SERVER_UNAVAILABLE ||
GetLastError() == RPC_S_INVALID_NET_ADDR, /* Some Vista and Win7 */
"Expected RPC_S_SERVER_UNAVAILABLE, got %d\n", GetLastError());
"Expected RPC_S_SERVER_UNAVAILABLE, got %ld\n", GetLastError());
/* This one opens the Application log */
handle = OpenEventLogA(NULL, "deadbeef");
ok(handle != NULL, "Expected a handle\n");
ok(handle != NULL, "OpenEventLogA(deadbeef) failed : %ld\n", GetLastError());
ret = CloseEventLog(handle);
ok(ret, "Expected success\n");
ok(ret, "Expected success : %ld\n", GetLastError());
/* Close a second time */
SetLastError(0xdeadbeef);
ret = CloseEventLog(handle);
todo_wine
{
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
}
/* Empty servername should be read as local server */
handle = OpenEventLogA("", "Application");
ok(handle != NULL, "Expected a handle\n");
ok(handle != NULL, "OpenEventLogA('',Application) failed : %ld\n", GetLastError());
CloseEventLog(handle);
handle = OpenEventLogA(NULL, "Application");
ok(handle != NULL, "Expected a handle\n");
ok(handle != NULL, "OpenEventLogA(Application) failed : %ld\n", GetLastError());
CloseEventLog(handle);
}
......@@ -142,46 +160,47 @@ static void test_info(void)
SetLastError(0xdeadbeef);
ret = pGetEventLogInformation(NULL, 1, NULL, 0, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_LEVEL, "Expected ERROR_INVALID_LEVEL, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_LEVEL, "Expected ERROR_INVALID_LEVEL, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pGetEventLogInformation(NULL, EVENTLOG_FULL_INFO, NULL, 0, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
handle = OpenEventLogA(NULL, "Application");
ok(handle != NULL, "OpenEventLogA(Application) failed : %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pGetEventLogInformation(handle, EVENTLOG_FULL_INFO, NULL, 0, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == RPC_X_NULL_REF_POINTER, "Expected RPC_X_NULL_REF_POINTER, got %d\n", GetLastError());
ok(GetLastError() == RPC_X_NULL_REF_POINTER, "Expected RPC_X_NULL_REF_POINTER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pGetEventLogInformation(handle, EVENTLOG_FULL_INFO, NULL, 0, &needed);
ok(!ret, "Expected failure\n");
ok(GetLastError() == RPC_X_NULL_REF_POINTER, "Expected RPC_X_NULL_REF_POINTER, got %d\n", GetLastError());
ok(GetLastError() == RPC_X_NULL_REF_POINTER, "Expected RPC_X_NULL_REF_POINTER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pGetEventLogInformation(handle, EVENTLOG_FULL_INFO, efi, 0, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == RPC_X_NULL_REF_POINTER, "Expected RPC_X_NULL_REF_POINTER, got %d\n", GetLastError());
ok(GetLastError() == RPC_X_NULL_REF_POINTER, "Expected RPC_X_NULL_REF_POINTER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
needed = 0xdeadbeef;
efi->dwFull = 0xdeadbeef;
ret = pGetEventLogInformation(handle, EVENTLOG_FULL_INFO, efi, 0, &needed);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
ok(needed == sizeof(EVENTLOG_FULL_INFORMATION), "Expected sizeof(EVENTLOG_FULL_INFORMATION), got %d\n", needed);
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
ok(needed == sizeof(EVENTLOG_FULL_INFORMATION), "Expected sizeof(EVENTLOG_FULL_INFORMATION), got %ld\n", needed);
ok(efi->dwFull == 0xdeadbeef, "Expected no change to the dwFull member\n");
/* Not that we care, but on success last error is set to ERROR_IO_PENDING */
efi->dwFull = 0xdeadbeef;
needed = sizeof(buffer);
ret = pGetEventLogInformation(handle, EVENTLOG_FULL_INFO, efi, needed, &needed);
ok(ret, "Expected success\n");
ok(needed == sizeof(EVENTLOG_FULL_INFORMATION), "Expected sizeof(EVENTLOG_FULL_INFORMATION), got %d\n", needed);
ok(efi->dwFull == 0 || efi->dwFull == 1, "Expected 0 (not full) or 1 (full), got %d\n", efi->dwFull);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(needed == sizeof(EVENTLOG_FULL_INFORMATION), "Expected sizeof(EVENTLOG_FULL_INFORMATION), got %ld\n", needed);
ok(efi->dwFull == 0 || efi->dwFull == 1, "Expected 0 (not full) or 1 (full), got %ld\n", efi->dwFull);
CloseEventLog(handle);
}
......@@ -196,25 +215,26 @@ static void test_count(void)
SetLastError(0xdeadbeef);
ret = GetNumberOfEventLogRecords(NULL, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
count = 0xdeadbeef;
ret = GetNumberOfEventLogRecords(NULL, &count);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
ok(count == 0xdeadbeef, "Expected count to stay unchanged\n");
handle = OpenEventLogA(NULL, "Application");
ok(handle != NULL, "OpenEventLogA(Application) failed : %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = GetNumberOfEventLogRecords(handle, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
count = 0xdeadbeef;
ret = GetNumberOfEventLogRecords(handle, &count);
ok(ret, "Expected success\n");
ok(ret, "Expected success : %ld\n", GetLastError());
ok(count != 0xdeadbeef, "Expected the number of records\n");
CloseEventLog(handle);
......@@ -224,14 +244,14 @@ static void test_count(void)
{
handle = OpenBackupEventLogA(NULL, backup);
todo_wine
ok(handle != NULL, "Expected a handle, le=%d\n", GetLastError());
ok(handle != NULL, "Expected a handle, le=%ld\n", GetLastError());
/* Does GetNumberOfEventLogRecords work with backup eventlogs? */
count = 0xdeadbeef;
ret = GetNumberOfEventLogRecords(handle, &count);
todo_wine
{
ok(ret, "Expected success\n");
ok(ret, "Expected success : %ld\n", GetLastError());
ok(count != 0xdeadbeef, "Expected the number of records\n");
}
......@@ -250,25 +270,31 @@ static void test_oldest(void)
SetLastError(0xdeadbeef);
ret = GetOldestEventLogRecord(NULL, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
oldest = 0xdeadbeef;
ret = GetOldestEventLogRecord(NULL, &oldest);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
ok(oldest == 0xdeadbeef, "Expected oldest to stay unchanged\n");
handle = OpenEventLogA(NULL, "Application");
if (!handle && (GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == RPC_S_SERVER_UNAVAILABLE))
{
win_skip( "Can't open event log\n" );
return;
}
ok(handle != NULL, "OpenEventLogA(Application) failed : %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = GetOldestEventLogRecord(handle, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
oldest = 0xdeadbeef;
ret = GetOldestEventLogRecord(handle, &oldest);
ok(ret, "Expected success\n");
ok(ret, "Expected success : %ld\n", GetLastError());
ok(oldest != 0xdeadbeef, "Expected the number of the oldest record\n");
CloseEventLog(handle);
......@@ -285,7 +311,7 @@ static void test_oldest(void)
ret = GetOldestEventLogRecord(handle, &oldest);
todo_wine
{
ok(ret, "Expected success\n");
ok(ret, "Expected success : %ld\n", GetLastError());
ok(oldest != 0xdeadbeef, "Expected the number of the oldest record\n");
}
......@@ -304,7 +330,7 @@ static void test_backup(void)
SetLastError(0xdeadbeef);
ret = BackupEventLogA(NULL, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = BackupEventLogA(NULL, backup);
......@@ -312,11 +338,17 @@ static void test_backup(void)
ok(GetFileAttributesA(backup) == INVALID_FILE_ATTRIBUTES, "Expected no backup file\n");
handle = OpenEventLogA(NULL, "Application");
if (!handle && (GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == RPC_S_SERVER_UNAVAILABLE))
{
win_skip( "Can't open event log\n" );
return;
}
ok(handle != NULL, "OpenEventLogA(Application) failed : %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = BackupEventLogA(handle, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
ret = BackupEventLogA(handle, backup);
if (!ret && GetLastError() == ERROR_PRIVILEGE_NOT_HELD)
......@@ -325,7 +357,7 @@ static void test_backup(void)
CloseEventLog(handle);
return;
}
ok(ret, "Expected success\n");
ok(ret, "Expected success : %ld\n", GetLastError());
todo_wine
ok(GetFileAttributesA(backup) != INVALID_FILE_ATTRIBUTES, "Expected a backup file\n");
......@@ -335,7 +367,7 @@ static void test_backup(void)
todo_wine
{
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_ALREADY_EXISTS, "Expected ERROR_ALREADY_EXISTS, got %d\n", GetLastError());
ok(GetLastError() == ERROR_ALREADY_EXISTS, "Expected ERROR_ALREADY_EXISTS, got %ld\n", GetLastError());
}
CloseEventLog(handle);
......@@ -348,7 +380,7 @@ static void test_backup(void)
ret = BackupEventLogA(handle, backup2);
todo_wine
{
ok(ret, "Expected success\n");
ok(ret, "Expected success : %ld\n", GetLastError());
ok(GetFileAttributesA(backup2) != INVALID_FILE_ATTRIBUTES, "Expected a backup file\n");
}
......@@ -368,7 +400,7 @@ static void test_read(void)
ret = ReadEventLogA(NULL, 0, 0, NULL, 0, NULL, NULL);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
read = 0xdeadbeef;
SetLastError(0xdeadbeef);
......@@ -376,7 +408,7 @@ static void test_read(void)
ok(!ret, "Expected failure\n");
ok(read == 0xdeadbeef, "Expected 'read' parameter to remain unchanged\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
needed = 0xdeadbeef;
SetLastError(0xdeadbeef);
......@@ -384,26 +416,26 @@ static void test_read(void)
ok(!ret, "Expected failure\n");
ok(needed == 0xdeadbeef, "Expected 'needed' parameter to remain unchanged\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* 'read' and 'needed' are only filled when the needed buffer size is passed back or when the call succeeds */
SetLastError(0xdeadbeef);
ret = ReadEventLogA(NULL, 0, 0, NULL, 0, &read, &needed);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = ReadEventLogA(NULL, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, NULL, 0, NULL, NULL);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = ReadEventLogA(NULL, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, NULL, 0, &read, &needed);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
buf = NULL;
SetLastError(0xdeadbeef);
......@@ -411,62 +443,68 @@ static void test_read(void)
0, buf, sizeof(EVENTLOGRECORD), &read, &needed);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
buf = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD));
buf = malloc(sizeof(EVENTLOGRECORD));
SetLastError(0xdeadbeef);
ret = ReadEventLogA(NULL, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ,
0, buf, sizeof(EVENTLOGRECORD), &read, &needed);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
HeapFree(GetProcessHeap(), 0, buf);
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
free(buf);
handle = OpenEventLogA(NULL, "Application");
if (!handle && (GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == RPC_S_SERVER_UNAVAILABLE))
{
win_skip( "Can't open event log\n" );
return;
}
ok(handle != NULL, "OpenEventLogA(Application) failed : %ld\n", GetLastError());
/* Show that we need the proper dwFlags with a (for the rest) proper call */
buf = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD));
buf = malloc(sizeof(EVENTLOGRECORD));
SetLastError(0xdeadbeef);
ret = ReadEventLogA(handle, 0, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = ReadEventLogA(handle, EVENTLOG_SEEK_READ, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ | EVENTLOG_BACKWARDS_READ,
0, buf, sizeof(EVENTLOGRECORD), &read, &needed);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = ReadEventLogA(handle, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ | EVENTLOG_BACKWARDS_READ,
0, buf, sizeof(EVENTLOGRECORD), &read, &needed);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = ReadEventLogA(handle, EVENTLOG_SEEK_READ | EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ,
0, buf, sizeof(EVENTLOGRECORD), &read, &needed);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
HeapFree(GetProcessHeap(), 0, buf);
free(buf);
/* First check if there are any records (in practice only on Wine: FIXME) */
count = 0;
......@@ -479,7 +517,7 @@ static void test_read(void)
}
/* Get the buffer size for the first record */
buf = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD));
buf = malloc(sizeof(EVENTLOGRECORD));
read = needed = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ,
......@@ -487,20 +525,20 @@ static void test_read(void)
ok(!ret, "Expected failure\n");
ok(read == 0, "Expected no bytes read\n");
ok(needed > sizeof(EVENTLOGRECORD), "Expected the needed buffersize to be bigger than sizeof(EVENTLOGRECORD)\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
/* Read the first record */
toread = needed;
buf = HeapReAlloc(GetProcessHeap(), 0, buf, toread);
buf = realloc(buf, toread);
read = needed = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, buf, toread, &read, &needed);
ok(ret, "Expected success\n");
ok(ret, "Expected success : %ld\n", GetLastError());
ok(read == toread ||
broken(read < toread), /* NT4 wants a buffer size way bigger than just 1 record */
"Expected the requested size to be read\n");
ok(needed == 0, "Expected no extra bytes to be read\n");
HeapFree(GetProcessHeap(), 0, buf);
free(buf);
CloseEventLog(handle);
}
......@@ -515,24 +553,27 @@ static void test_openbackup(void)
SetLastError(0xdeadbeef);
handle = OpenBackupEventLogA(NULL, NULL);
ok(handle == NULL, "Didn't expect a handle\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
handle = OpenBackupEventLogA(NULL, "idontexist.evt");
ok(handle == NULL, "Didn't expect a handle\n");
ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
ok(GetLastError() == ERROR_FILE_NOT_FOUND ||
GetLastError() == ERROR_ACCESS_DENIED ||
GetLastError() == RPC_S_SERVER_UNAVAILABLE,
"got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
handle = OpenBackupEventLogA("IDontExist", NULL);
ok(handle == NULL, "Didn't expect a handle\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
handle = OpenBackupEventLogA("IDontExist", "idontexist.evt");
ok(handle == NULL, "Didn't expect a handle\n");
ok(GetLastError() == RPC_S_SERVER_UNAVAILABLE ||
GetLastError() == RPC_S_INVALID_NET_ADDR, /* Some Vista and Win7 */
"Expected RPC_S_SERVER_UNAVAILABLE, got %d\n", GetLastError());
"Expected RPC_S_SERVER_UNAVAILABLE, got %ld\n", GetLastError());
/* Make a backup eventlog to work with */
if (create_backup(backup))
......@@ -549,7 +590,7 @@ static void test_openbackup(void)
ok(handle == NULL, "Didn't expect a handle\n");
ok(GetLastError() == RPC_S_SERVER_UNAVAILABLE ||
GetLastError() == RPC_S_INVALID_NET_ADDR, /* Some Vista and Win7 */
"Expected RPC_S_SERVER_UNAVAILABLE, got %d\n", GetLastError());
"Expected RPC_S_SERVER_UNAVAILABLE, got %ld\n", GetLastError());
/* Empty servername should be read as local server */
handle = OpenBackupEventLogA("", backup);
......@@ -576,8 +617,10 @@ static void test_openbackup(void)
handle = OpenBackupEventLogA(NULL, backup);
ok(handle == NULL, "Didn't expect a handle\n");
ok(GetLastError() == ERROR_NOT_ENOUGH_MEMORY ||
GetLastError() == ERROR_ACCESS_DENIED ||
GetLastError() == RPC_S_SERVER_UNAVAILABLE ||
GetLastError() == ERROR_EVENTLOG_FILE_CORRUPT, /* Vista and Win7 */
"Expected ERROR_NOT_ENOUGH_MEMORY, got %d\n", GetLastError());
"got %ld\n", GetLastError());
CloseEventLog(handle);
DeleteFileA(backup);
......@@ -587,7 +630,10 @@ static void test_openbackup(void)
SetLastError(0xdeadbeef);
handle = OpenBackupEventLogA(NULL, backup);
ok(handle == NULL, "Didn't expect a handle\n");
ok(GetLastError() == ERROR_EVENTLOG_FILE_CORRUPT, "Expected ERROR_EVENTLOG_FILE_CORRUPT, got %d\n", GetLastError());
ok(GetLastError() == ERROR_EVENTLOG_FILE_CORRUPT ||
GetLastError() == ERROR_ACCESS_DENIED ||
GetLastError() == RPC_S_SERVER_UNAVAILABLE,
"got %ld\n", GetLastError());
CloseEventLog(handle);
DeleteFileA(backup);
}
......@@ -602,7 +648,7 @@ static void test_clear(void)
SetLastError(0xdeadbeef);
ret = ClearEventLogA(NULL, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
/* Make a backup eventlog to work with */
if (!create_backup(backup))
......@@ -611,7 +657,7 @@ static void test_clear(void)
SetLastError(0xdeadbeef);
ret = ClearEventLogA(NULL, backup);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
handle = OpenBackupEventLogA(NULL, backup);
todo_wine
......@@ -626,19 +672,19 @@ static void test_clear(void)
*/
ok(GetLastError() == ERROR_INVALID_HANDLE ||
GetLastError() == ERROR_ACCESS_DENIED, /* Vista+ */
"Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
"Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
/* Show that ClearEventLog only works for real eventlogs. */
SetLastError(0xdeadbeef);
ret = ClearEventLogA(handle, backup2);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
ok(GetFileAttributesA(backup2) == INVALID_FILE_ATTRIBUTES, "Expected no backup file\n");
SetLastError(0xdeadbeef);
ret = ClearEventLogA(handle, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
CloseEventLog(handle);
todo_wine
......@@ -671,7 +717,7 @@ static BOOL create_new_eventlog(void)
}
/* Create some event sources, the registry value 'Sources' is updated automatically */
for (i = 0; i < sizeof(eventsources)/sizeof(eventsources[0]); i++)
for (i = 0; i < ARRAY_SIZE(eventsources); i++)
{
HKEY srckey;
......@@ -734,11 +780,12 @@ static void test_readwrite(void)
DWORD i;
char *localcomputer = NULL;
DWORD size;
void* buf;
if (pCreateWellKnownSid)
{
sidsize = SECURITY_MAX_SID_SIZE;
user = HeapAlloc(GetProcessHeap(), 0, sidsize);
user = malloc(sidsize);
SetLastError(0xdeadbeef);
pCreateWellKnownSid(WinInteractiveSid, NULL, user, &sidsize);
sidavailable = TRUE;
......@@ -771,6 +818,7 @@ static void test_readwrite(void)
Sleep(2000);
handle = OpenEventLogA(NULL, eventlogname);
ok(handle != NULL, "OpenEventLogA(%s) failed : %ld\n", eventlogname, GetLastError());
count = 0xdeadbeef;
GetNumberOfEventLogRecords(handle, &count);
if (count != 0)
......@@ -787,7 +835,7 @@ static void test_readwrite(void)
{
win_skip("Win7 fails when using incorrect event types\n");
ret = ReportEventA(handle, 0, 0, 0, NULL, 0, 0, NULL, NULL);
ok(ret, "Expected success : %d\n", GetLastError());
ok(ret, "Expected success : %ld\n", GetLastError());
}
else
{
......@@ -795,15 +843,15 @@ static void test_readwrite(void)
DWORD read, needed = 0;
EVENTLOGRECORD *record;
ok(ret, "Expected success : %d\n", GetLastError());
ok(ret, "Expected success : %ld\n", GetLastError());
/* Needed to catch earlier Vista (with no ServicePack for example) */
buf = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD));
buf = malloc(sizeof(EVENTLOGRECORD));
if (!(ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ,
0, buf, sizeof(EVENTLOGRECORD), &read, &needed)) &&
GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
buf = HeapReAlloc(GetProcessHeap(), 0, buf, needed);
buf = realloc(buf, needed);
ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ,
0, buf, needed, &read, &needed);
}
......@@ -817,7 +865,7 @@ static void test_readwrite(void)
if (record->EventType == EVENTLOG_SUCCESS)
on_vista = TRUE;
}
HeapFree(GetProcessHeap(), 0, buf);
free(buf);
}
/* This will clear the eventlog. The record numbering for new
......@@ -830,11 +878,13 @@ static void test_readwrite(void)
CloseEventLog(handle);
/* Write a bunch of events while using different event sources */
for (i = 0; i < sizeof(read_write)/sizeof(read_write[0]); i++)
for (i = 0; i < ARRAY_SIZE(read_write); i++)
{
DWORD oldest;
BOOL run_sidtests = read_write[i].evt_sid & sidavailable;
winetest_push_context("%lu:%s", i, read_write[i].evt_src);
/* We don't need to use RegisterEventSource to report events */
if (i % 2)
handle = OpenEventLogA(NULL, read_write[i].evt_src);
......@@ -846,22 +896,22 @@ static void test_readwrite(void)
ret = ReportEventA(handle, read_write[i].evt_type, read_write[i].evt_cat,
read_write[i].evt_id, run_sidtests ? user : NULL,
read_write[i].evt_numstrings, 0, read_write[i].evt_strings, NULL);
ok(ret, "Expected ReportEvent success : %d\n", GetLastError());
ok(ret, "Expected ReportEvent success : %ld\n", GetLastError());
count = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = GetNumberOfEventLogRecords(handle, &count);
ok(ret, "Expected GetNumberOfEventLogRecords success : %d\n", GetLastError());
ok(ret, "Expected GetNumberOfEventLogRecords success : %ld\n", GetLastError());
todo_wine
ok(count == (i + 1), "Expected %d records, got %d\n", i + 1, count);
ok(count == (i + 1), "Expected %ld records, got %ld\n", i + 1, count);
oldest = 0xdeadbeef;
ret = GetOldestEventLogRecord(handle, &oldest);
ok(ret, "Expected GetOldestEventLogRecord success : %d\n", GetLastError());
ok(ret, "Expected GetOldestEventLogRecord success : %ld\n", GetLastError());
todo_wine
ok(oldest == 1 ||
(oldest > 1 && oldest != 0xdeadbeef), /* Vista SP1+, W2K8 and Win7 */
"Expected oldest to be 1 or higher, got %d\n", oldest);
"Expected oldest to be 1 or higher, got %ld\n", oldest);
if (oldest > 1 && oldest != 0xdeadbeef)
on_vista = TRUE;
......@@ -870,15 +920,17 @@ static void test_readwrite(void)
ret = CloseEventLog(handle);
else
ret = DeregisterEventSource(handle);
ok(ret, "Expected success : %d\n", GetLastError());
ok(ret, "Expected success : %ld\n", GetLastError());
winetest_pop_context();
}
handle = OpenEventLogA(NULL, eventlogname);
ok(handle != NULL, "OpenEventLogA(%s) failed : %ld\n", eventlogname, GetLastError());
count = 0xdeadbeef;
ret = GetNumberOfEventLogRecords(handle, &count);
ok(ret, "Expected success\n");
ok(ret, "Expected success : %ld\n", GetLastError());
todo_wine
ok(count == i, "Expected %d records, got %d\n", i, count);
ok(count == i, "Expected %ld records, got %ld\n", i, count);
CloseEventLog(handle);
if (count == 0)
......@@ -897,22 +949,24 @@ static void test_readwrite(void)
size = 0;
SetLastError(0xdeadbeef);
pGetComputerNameExA(ComputerNameDnsFullyQualified, NULL, &size);
localcomputer = HeapAlloc(GetProcessHeap(), 0, size);
localcomputer = malloc(size);
pGetComputerNameExA(ComputerNameDnsFullyQualified, localcomputer, &size);
}
else
{
size = MAX_COMPUTERNAME_LENGTH + 1;
localcomputer = HeapAlloc(GetProcessHeap(), 0, size);
localcomputer = malloc(size);
GetComputerNameA(localcomputer, &size);
}
/* Read all events from our created eventlog, one by one */
handle = OpenEventLogA(NULL, eventlogname);
ok(handle != NULL, "OpenEventLogA(%s) failed : %ld\n", eventlogname, GetLastError());
i = 0;
size = sizeof(EVENTLOGRECORD) + 128;
buf = malloc(size);
for (;;)
{
void *buf;
DWORD read, needed;
EVENTLOGRECORD *record;
char *sourcename, *computername;
......@@ -920,35 +974,44 @@ static void test_readwrite(void)
char *ptr;
BOOL run_sidtests = read_write[i].evt_sid & sidavailable;
buf = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD));
winetest_push_context("%lu", i);
SetLastError(0xdeadbeef);
ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ,
0, buf, sizeof(EVENTLOGRECORD), &read, &needed);
if (!ret && GetLastError() == ERROR_HANDLE_EOF)
ok(!ret, "Expected failure\n");
if (!ret && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
{
HeapFree(GetProcessHeap(), 0, buf);
ok(GetLastError() == ERROR_HANDLE_EOF, "record %ld, got %ld\n", i, GetLastError());
winetest_pop_context();
break;
}
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected ERROR_INVALID_PARAMETER, got %d\n",GetLastError());
buf = HeapReAlloc(GetProcessHeap(), 0, buf, needed);
if (needed > size)
{
free(buf);
size = needed;
buf = malloc(size);
}
ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ,
0, buf, needed, &read, &needed);
ok(ret, "Expected success: %d\n", GetLastError());
ok(ret, "Expected success: %ld\n", GetLastError());
if (!ret)
{
winetest_pop_context();
break;
}
record = (EVENTLOGRECORD *)buf;
ok(record->Length == read,
"Expected %d, got %d\n", read, record->Length);
"Expected %ld, got %ld\n", read, record->Length);
ok(record->Reserved == 0x654c664c,
"Expected 0x654c664c, got %d\n", record->Reserved);
"Expected 0x654c664c, got %ld\n", record->Reserved);
ok(record->RecordNumber == i + 1 ||
(on_vista && (record->RecordNumber > i + 1)),
"Expected %d or higher, got %d\n", i + 1, record->RecordNumber);
"Expected %ld or higher, got %ld\n", i + 1, record->RecordNumber);
ok(record->EventID == read_write[i].evt_id,
"Expected %d, got %d\n", read_write[i].evt_id, record->EventID);
"Expected %ld, got %ld\n", read_write[i].evt_id, record->EventID);
ok(record->EventType == read_write[i].evt_type,
"Expected %d, got %d\n", read_write[i].evt_type, record->EventType);
ok(record->NumStrings == read_write[i].evt_numstrings,
......@@ -983,15 +1046,15 @@ static void test_readwrite(void)
if (run_sidtests)
{
ok(record->UserSidLength == sidsize, "Expected %d, got %d\n", sidsize, record->UserSidLength);
ok(record->UserSidLength == sidsize, "Expected %ld, got %ld\n", sidsize, record->UserSidLength);
}
else
{
ok(record->StringOffset == record->UserSidOffset, "Expected offsets to be the same\n");
ok(record->UserSidLength == 0, "Expected 0, got %d\n", record->UserSidLength);
ok(record->UserSidLength == 0, "Expected 0, got %ld\n", record->UserSidLength);
}
ok(record->DataLength == 0, "Expected 0, got %d\n", record->DataLength);
ok(record->DataLength == 0, "Expected 0, got %ld\n", record->DataLength);
ptr = (char *)((BYTE *)buf + record->StringOffset);
for (k = 0; k < record->NumStrings; k++)
......@@ -1003,28 +1066,30 @@ static void test_readwrite(void)
ok(record->Length == *(DWORD *)((BYTE *)buf + record->Length - sizeof(DWORD)),
"Expected the closing DWORD to contain the length of the record\n");
HeapFree(GetProcessHeap(), 0, buf);
winetest_pop_context();
i++;
}
free(buf);
CloseEventLog(handle);
/* Test clearing a real eventlog */
handle = OpenEventLogA(NULL, eventlogname);
ok(handle != NULL, "OpenEventLogA(%s) failed : %ld\n", eventlogname, GetLastError());
SetLastError(0xdeadbeef);
ret = ClearEventLogA(handle, NULL);
ok(ret, "Expected success\n");
ok(ret, "Expected success : %ld\n", GetLastError());
count = 0xdeadbeef;
ret = GetNumberOfEventLogRecords(handle, &count);
ok(ret, "Expected success\n");
ok(count == 0, "Expected an empty eventlog, got %d records\n", count);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(count == 0, "Expected an empty eventlog, got %ld records\n", count);
CloseEventLog(handle);
cleanup:
HeapFree(GetProcessHeap(), 0, localcomputer);
HeapFree(GetProcessHeap(), 0, user);
free(localcomputer);
free(user);
}
/* Before Vista:
......@@ -1065,12 +1130,12 @@ static void test_autocreation(void)
{
char sources_verify[sizeof(eventsources)];
ok(type == REG_MULTI_SZ, "Expected a REG_MULTI_SZ, got %d\n", type);
ok(type == REG_MULTI_SZ, "Expected a REG_MULTI_SZ, got %ld\n", type);
/* Build the expected string */
memset(sources_verify, 0, sizeof(sources_verify));
p = sources_verify;
for (i = sizeof(eventsources)/sizeof(eventsources[0]); i > 0; i--)
for (i = ARRAY_SIZE(eventsources); i > 0; i--)
{
lstrcpyA(p, eventsources[i - 1]);
p += (lstrlenA(eventsources[i - 1]) + 1);
......@@ -1078,7 +1143,7 @@ static void test_autocreation(void)
lstrcpyA(p, eventlogname);
ok(!memcmp(sources, sources_verify, size),
"Expected a correct 'Sources' value (size : %d)\n", size);
"Expected a correct 'Sources' value (size : %ld)\n", size);
}
RegCloseKey(eventkey);
......@@ -1091,24 +1156,10 @@ static void test_autocreation(void)
/* On Windows we also automatically get an eventlog file */
GetSystemDirectoryA(sysdir, sizeof(sysdir));
/* NT4 - W2K3 */
lstrcpyA(eventlogfile, sysdir);
lstrcatA(eventlogfile, "\\config\\");
lstrcatA(eventlogfile, "\\winevt\\Logs\\");
lstrcatA(eventlogfile, eventlogname);
lstrcatA(eventlogfile, ".evt");
if (GetFileAttributesA(eventlogfile) == INVALID_FILE_ATTRIBUTES)
{
/* Vista+ */
lstrcpyA(eventlogfile, sysdir);
lstrcatA(eventlogfile, "\\winevt\\Logs\\");
lstrcatA(eventlogfile, eventlogname);
lstrcatA(eventlogfile, ".evtx");
}
todo_wine
ok(GetFileAttributesA(eventlogfile) != INVALID_FILE_ATTRIBUTES,
"Expected an eventlog file\n");
lstrcatA(eventlogfile, ".evtx");
if (pWow64RevertWow64FsRedirection)
pWow64RevertWow64FsRedirection(redir);
......@@ -1128,18 +1179,477 @@ static void cleanup_eventlog(void)
lstrcatA(winesvc, eventlogname);
RegOpenKeyA(HKEY_LOCAL_MACHINE, winesvc, &key);
for (i = 0; i < sizeof(eventsources)/sizeof(eventsources[0]); i++)
for (i = 0; i < ARRAY_SIZE(eventsources); i++)
RegDeleteKeyA(key, eventsources[i]);
RegDeleteValueA(key, "Sources");
RegCloseKey(key);
lret = RegDeleteKeyA(HKEY_LOCAL_MACHINE, winesvc);
ok(lret == ERROR_SUCCESS, "Could not delete the registry tree : %d\n", lret);
ok(lret == ERROR_SUCCESS, "Could not delete the registry tree : %ld\n", lret);
/* A handle to the eventlog is locked by services.exe. We can only
* delete the eventlog file after reboot.
*/
bret = MoveFileExA(eventlogfile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
ok(bret, "Expected MoveFileEx to succeed: %d\n", GetLastError());
ok(bret, "Expected MoveFileEx to succeed: %ld\n", GetLastError());
}
static void test_trace_event_params(void)
{
static const WCHAR emptyW[] = {0};
static const GUID test_guid = {0x57696E65, 0x0000, 0x0000, {0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01}};
REGHANDLE reg_handle;
ULONG uret;
if (!pEventRegister)
{
win_skip("advapi32.EventRegister is missing, skipping trace event tests\n");
return;
}
uret = pEventRegister(NULL, NULL, NULL, &reg_handle);
todo_wine ok(uret == ERROR_INVALID_PARAMETER, "EventRegister gave wrong error: %#lx\n", uret);
uret = pEventRegister(&test_guid, NULL, NULL, NULL);
ok(uret == ERROR_INVALID_PARAMETER, "EventRegister gave wrong error: %#lx\n", uret);
uret = pEventRegister(&test_guid, NULL, NULL, &reg_handle);
ok(uret == ERROR_SUCCESS, "EventRegister gave wrong error: %#lx\n", uret);
uret = pEventWriteString(0, 0, 0, emptyW);
todo_wine ok(uret == ERROR_INVALID_HANDLE, "EventWriteString gave wrong error: %#lx\n", uret);
uret = pEventWriteString(reg_handle, 0, 0, NULL);
todo_wine ok(uret == ERROR_INVALID_PARAMETER, "EventWriteString gave wrong error: %#lx\n", uret);
uret = pEventUnregister(0);
todo_wine ok(uret == ERROR_INVALID_HANDLE, "EventUnregister gave wrong error: %#lx\n", uret);
uret = pEventUnregister(reg_handle);
ok(uret == ERROR_SUCCESS, "EventUnregister gave wrong error: %#lx\n", uret);
}
static void test_start_trace(void)
{
const char sessionname[] = "wine";
const char filepath[] = "wine.etl";
const char filepath2[] = "eniw.etl";
EVENT_TRACE_PROPERTIES *properties;
TRACEHANDLE handle;
LONG buffersize;
LONG ret;
buffersize = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(sessionname) + sizeof(filepath);
properties = calloc(1, buffersize);
properties->Wnode.BufferSize = buffersize;
properties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
properties->LogFileMode = EVENT_TRACE_FILE_MODE_NONE;
properties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
properties->LogFileNameOffset = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(sessionname);
strcpy((char *)properties + properties->LogFileNameOffset, filepath);
properties->Wnode.BufferSize = 0;
ret = StartTraceA(&handle, sessionname, properties);
todo_wine
ok(ret == ERROR_BAD_LENGTH ||
ret == ERROR_INVALID_PARAMETER, /* XP and 2k3 */
"Expected ERROR_BAD_LENGTH, got %ld\n", ret);
properties->Wnode.BufferSize = buffersize;
ret = StartTraceA(&handle, "this name is too long", properties);
todo_wine
ok(ret == ERROR_BAD_LENGTH, "Expected ERROR_BAD_LENGTH, got %ld\n", ret);
ret = StartTraceA(&handle, sessionname, NULL);
todo_wine
ok(ret == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", ret);
ret = StartTraceA(NULL, sessionname, properties);
todo_wine
ok(ret == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", ret);
properties->LogFileNameOffset = 1;
ret = StartTraceA(&handle, sessionname, properties);
todo_wine
ok(ret == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", ret);
properties->LogFileNameOffset = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(sessionname);
properties->LoggerNameOffset = 1;
ret = StartTraceA(&handle, sessionname, properties);
todo_wine
ok(ret == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", ret);
properties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
properties->LogFileMode = EVENT_TRACE_FILE_MODE_SEQUENTIAL | EVENT_TRACE_FILE_MODE_CIRCULAR;
ret = StartTraceA(&handle, sessionname, properties);
todo_wine
ok(ret == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", ret);
properties->LogFileMode = EVENT_TRACE_FILE_MODE_NONE;
/* XP creates a file we can't delete, so change the filepath to something else */
strcpy((char *)properties + properties->LogFileNameOffset, filepath2);
properties->Wnode.Guid = SystemTraceControlGuid;
ret = StartTraceA(&handle, sessionname, properties);
todo_wine
ok(ret == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", ret);
memset(&properties->Wnode.Guid, 0, sizeof(properties->Wnode.Guid));
properties->LogFileNameOffset = 0;
ret = StartTraceA(&handle, sessionname, properties);
todo_wine
ok(ret == ERROR_BAD_PATHNAME, "Expected ERROR_BAD_PATHNAME, got %ld\n", ret);
properties->LogFileNameOffset = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(sessionname);
ret = StartTraceA(&handle, sessionname, properties);
if (ret == ERROR_ACCESS_DENIED)
{
skip("need admin rights\n");
goto done;
}
ok(ret == ERROR_SUCCESS, "Expected success, got %ld\n", ret);
ret = StartTraceA(&handle, sessionname, properties);
todo_wine
ok(ret == ERROR_ALREADY_EXISTS ||
ret == ERROR_SHARING_VIOLATION, /* 2k3 */
"Expected ERROR_ALREADY_EXISTS, got %ld\n", ret);
/* clean up */
ControlTraceA(handle, sessionname, properties, EVENT_TRACE_CONTROL_STOP);
done:
free(properties);
DeleteFileA(filepath);
}
static BOOL read_record(HANDLE handle, DWORD flags, DWORD offset, EVENTLOGRECORD **record, DWORD *size)
{
DWORD read, needed;
BOOL ret;
SetLastError(0xdeadbeef);
memset(*record, 0, *size);
needed = 0;
if (!(ret = ReadEventLogW(handle, flags, offset, *record, *size, &read, &needed)) &&
GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
free(*record);
*record = malloc(needed);
SetLastError(0xdeadbeef);
memset(*record, 0, needed);
*size = needed;
ret = ReadEventLogW(handle, flags, offset, *record, *size, &read, &needed);
}
return ret;
}
static void test_eventlog_start(void)
{
BOOL ret, found;
HANDLE handle, handle2;
EVENTLOGRECORD *record, *record2;
DWORD size, size2, count, count2, read, needed;
WCHAR *sourcename, *computername, *localcomputer;
char *sourcenameA, *computernameA, *localcomputerA;
/* ReadEventLogW */
handle = OpenEventLogW(0, L"System");
if (!handle && (GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == RPC_S_SERVER_UNAVAILABLE))
{
win_skip( "Can't open System event log\n" );
return;
}
ok(handle != NULL, "OpenEventLogW(System) failed : %ld\n", GetLastError());
handle2 = OpenEventLogW(0, L"System");
todo_wine ok(handle != handle2, "Expected different handle\n");
CloseEventLog(handle2);
handle2 = OpenEventLogW(0, L"SYSTEM");
ok(!!handle2, "Expected valid handle\n");
CloseEventLog(handle2);
size = MAX_COMPUTERNAME_LENGTH + 1;
localcomputer = malloc(size * sizeof(WCHAR));
GetComputerNameW(localcomputer, &size);
ret = TRUE;
found = FALSE;
while (!found && ret)
{
read = needed = 0;
record = malloc(sizeof(EVENTLOGRECORD));
if (!(ret = ReadEventLogW(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ,
0, record, sizeof(EVENTLOGRECORD), &read, &needed)) &&
GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
record = realloc(record, needed);
ret = ReadEventLogW(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ,
0, record, needed, &read, &needed);
ok(needed == 0, "Expected 0, got %ld\n", needed);
}
if (ret && record->EventID == EVENT_EventlogStarted)
{
ok(record->Length == read, "Expected %ld, got %ld\n", read, record->Length);
ok(record->Reserved == 0x654c664c, "Expected 0x654c664c, got %ld\n", record->Reserved);
ok(record->RecordNumber > 0, "Expected 1 or higher, got %ld\n", record->RecordNumber);
ok(record->TimeGenerated == record->TimeWritten, "Expected time values to be the same\n");
ok(record->EventType == EVENTLOG_INFORMATION_TYPE,
"Expected %d, got %d\n", EVENTLOG_INFORMATION_TYPE, record->EventType);
ok(record->NumStrings == 0, "Expected 0, got %d\n", record->NumStrings);
ok(record->EventCategory == 0, "Expected 0, got %d\n", record->EventCategory);
ok(record->ReservedFlags == 0, "Expected 0, got %d\n", record->ReservedFlags);
ok(record->ClosingRecordNumber == 0, "Expected 0, got %ld\n", record->ClosingRecordNumber);
ok(record->StringOffset == record->UserSidOffset, "Expected offsets to be the same\n");
ok(record->UserSidLength == 0, "Expected 0, got %ld\n", record->UserSidLength);
ok(record->DataLength == 24, "Expected 24, got %ld\n", record->DataLength);
ok(record->DataOffset == record->UserSidOffset, "Expected offsets to be the same\n");
sourcename = (WCHAR *)(record + 1);
ok(!lstrcmpW(sourcename, L"EventLog"),
"Expected 'EventLog', got '%ls'\n", sourcename);
computername = sourcename + sizeof("EventLog");
ok(!lstrcmpiW(computername, localcomputer), "Expected '%ls', got '%ls'\n",
localcomputer, computername);
size = sizeof(EVENTLOGRECORD) + sizeof(L"EventLog") +
(lstrlenW(computername) + 1) * sizeof(WCHAR);
size = (size + 7) & ~7;
ok(record->DataOffset == size ||
broken(record->DataOffset == size - sizeof(WCHAR)), /* win8 */
"Expected %ld, got %ld\n", size, record->DataOffset);
found = TRUE;
}
free(record);
}
todo_wine ok(found, "EventlogStarted event not found\n");
CloseEventLog(handle);
free(localcomputer);
/* ReadEventLogA */
size = MAX_COMPUTERNAME_LENGTH + 1;
localcomputerA = malloc(size);
GetComputerNameA(localcomputerA, &size);
handle = OpenEventLogA(0, "System");
handle2 = OpenEventLogA(0, "SYSTEM");
todo_wine ok(handle != handle2, "Expected different handle\n");
CloseEventLog(handle2);
ret = TRUE;
found = FALSE;
while (!found && ret)
{
read = needed = 0;
record = malloc(sizeof(EVENTLOGRECORD));
if (!(ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ,
0, record, sizeof(EVENTLOGRECORD), &read, &needed)) &&
GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
record = realloc(record, needed);
ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ,
0, record, needed, &read, &needed);
ok(needed == 0, "Expected 0, got %ld\n", needed);
}
if (ret && record->EventID == EVENT_EventlogStarted)
{
ok(record->Length == read, "Expected %ld, got %ld\n", read, record->Length);
ok(record->Reserved == 0x654c664c, "Expected 0x654c664c, got %ld\n", record->Reserved);
ok(record->RecordNumber > 0, "Expected 1 or higher, got %ld\n", record->RecordNumber);
ok(record->TimeGenerated == record->TimeWritten, "Expected time values to be the same\n");
ok(record->EventType == EVENTLOG_INFORMATION_TYPE,
"Expected %d, got %d\n", EVENTLOG_INFORMATION_TYPE, record->EventType);
ok(record->NumStrings == 0, "Expected 0, got %d\n", record->NumStrings);
ok(record->EventCategory == 0, "Expected 0, got %d\n", record->EventCategory);
ok(record->ReservedFlags == 0, "Expected 0, got %d\n", record->ReservedFlags);
ok(record->ClosingRecordNumber == 0, "Expected 0, got %ld\n", record->ClosingRecordNumber);
ok(record->StringOffset == record->UserSidOffset, "Expected offsets to be the same\n");
ok(record->UserSidLength == 0, "Expected 0, got %ld\n", record->UserSidLength);
ok(record->DataLength == 24, "Expected 24, got %ld\n", record->DataLength);
ok(record->DataOffset == record->UserSidOffset, "Expected offsets to be the same\n");
sourcenameA = (char *)(record + 1);
ok(!strcmp(sourcenameA, "EventLog"),
"Expected 'EventLog', got '%s'\n", sourcenameA);
computernameA = sourcenameA + sizeof("EventLog");
ok(!_stricmp(computernameA, localcomputerA), "Expected '%s', got '%s'\n",
localcomputerA, computernameA);
size = sizeof(EVENTLOGRECORD) + sizeof("EventLog") + strlen(computernameA) + 1;
size = (size + 7) & ~7;
ok(record->DataOffset == size ||
broken(record->DataOffset == size - 1), /* win8 */
"Expected %ld, got %ld\n", size, record->DataOffset);
found = TRUE;
}
free(record);
}
todo_wine ok(found, "EventlogStarted event not found\n");
CloseEventLog(handle);
free(localcomputerA);
/* SEQUENTIAL | FORWARDS - dwRecordOffset is ignored */
handle = OpenEventLogW(0, L"System");
size = sizeof(EVENTLOGRECORD) + 128;
record = malloc(size);
todo_wine {
ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 100, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 1, "Expected 1, got %lu\n", record->RecordNumber);
ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 200, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 2, "Expected 2, got %lu\n", record->RecordNumber);
/* change direction sequentially */
ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ, 300, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 2, "Expected 2, got %lu\n", record->RecordNumber);
ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ, 400, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 1, "Expected 1, got %lu\n", record->RecordNumber);
}
/* changing how is an error */
SetLastError(0xdeadbeef);
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_BACKWARDS_READ, 0, &record, &size);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
CloseEventLog(handle);
/* SEQUENTIAL | BACKWARDS - dwRecordOffset is ignored */
handle = OpenEventLogW(0, L"System");
count = 0xdeadbeef;
ret = GetNumberOfEventLogRecords(handle, &count);
ok(ret, "Expected success : %ld\n", GetLastError());
todo_wine
ok(count, "Zero records in log\n");
ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ, 100, &record, &size);
todo_wine
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == count, "Expected %lu, got %lu\n", count, record->RecordNumber);
ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ, 100, &record, &size);
todo_wine {
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == count - 1, "Expected %lu, got %lu\n", count - 1, record->RecordNumber);
}
CloseEventLog(handle);
handle = OpenEventLogW(0, L"System");
/* SEEK | FORWARDS */
/* bogus offset */
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ, 0, &record, &size);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
count = 0xdeadbeef;
ret = GetNumberOfEventLogRecords(handle, &count);
ok(ret, "Expected success : %ld\n", GetLastError());
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ, count + 1, &record, &size);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
todo_wine {
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ, 2, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 2, "Expected 2, got %lu\n", record->RecordNumber);
/* skip one */
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ, 4, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 4, "Expected 4, got %lu\n", record->RecordNumber);
/* seek an earlier one */
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ, 3, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 3, "Expected 3, got %lu\n", record->RecordNumber);
/* change how */
ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 100, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 4 || broken(record->RecordNumber == 5) /* some win10 22h2 */,
"Expected 4, got %lu\n", record->RecordNumber);
/* change direction */
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_BACKWARDS_READ, 10, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 10, "Expected 10, got %lu\n", record->RecordNumber);
}
CloseEventLog(handle);
/* SEEK | BACKWARDS */
handle = OpenEventLogW(0, L"system");
/* bogus offset */
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_BACKWARDS_READ, 0, &record, &size);
ok(!ret, "Expected failure\n");
todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
todo_wine {
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_BACKWARDS_READ, 5, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 5, "Expected 5, got %lu\n", record->RecordNumber);
/* skip one */
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_BACKWARDS_READ, 3, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 3, "Expected 3, got %lu\n", record->RecordNumber);
/* seek a later one */
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_BACKWARDS_READ, 4, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 4, "Expected 4, got %lu\n", record->RecordNumber);
/* change how */
ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ, 100, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 3 || broken(record->RecordNumber == 2) /* some win10 22h2 */,
"Expected 3, got %lu\n", record->RecordNumber);
/* change direction */
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ, 10, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 10, "Expected 10, got %lu\n", record->RecordNumber);
}
CloseEventLog(handle);
/* reading same log with different handles */
handle = OpenEventLogW(0, L"System");
handle2 = OpenEventLogW(0, L"SYSTEM");
todo_wine {
ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 1, "Expected 1, got %lu\n", record->RecordNumber);
ret = read_record(handle2, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(record->RecordNumber == 1, "Expected 1, got %lu\n", record->RecordNumber);
}
CloseEventLog(handle2);
CloseEventLog(handle);
/* using source name */
size2 = size;
record2 = malloc(size2);
handle = OpenEventLogW(0, L"System");
handle2 = OpenEventLogW(0, L"EventLog");
todo_wine {
ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, &record, &size);
ok(ret, "Expected success : %ld\n", GetLastError());
ret = read_record(handle2, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, &record2, &size2);
ok(ret, "Expected success : %ld\n", GetLastError());
}
ok(size == size2, "Expected %lu, got %lu\n", size, size2);
ok(!memcmp(record, record2, min(size, size2)), "Records miscompare\n");
count = 0xdeadbeef;
count2 = 0xdeadbeef;
ret = GetNumberOfEventLogRecords(handle, &count);
ok(ret, "Expected success : %ld\n", GetLastError());
ret = GetNumberOfEventLogRecords(handle2, &count2);
ok(ret, "Expected success : %ld\n", GetLastError());
ok(count == count2, "Expected %lu, got %lu\n", count, count2);
CloseEventLog(handle2);
CloseEventLog(handle);
free(record2);
free(record);
}
START_TEST(eventlog)
......@@ -1163,6 +1673,7 @@ START_TEST(eventlog)
test_openbackup();
test_read();
test_clear();
test_trace_event_params();
/* Functional tests */
if (create_new_eventlog())
......@@ -1171,4 +1682,9 @@ START_TEST(eventlog)
test_autocreation();
cleanup_eventlog();
}
/* Trace tests */
test_start_trace();
test_eventlog_start();
}
......@@ -2,6 +2,7 @@
* Unit tests for lsa functions
*
* Copyright (c) 2006 Robert Reif
* Copyright (c) 2020 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
......@@ -32,37 +33,13 @@
#include "objbase.h"
#include "initguid.h"
#include "wine/test.h"
#include "winternl.h"
#include "ntlsa.h"
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
static HMODULE hadvapi32;
static NTSTATUS (WINAPI *pLsaClose)(LSA_HANDLE);
static NTSTATUS (WINAPI *pLsaEnumerateAccountRights)(LSA_HANDLE,PSID,PLSA_UNICODE_STRING*,PULONG);
static NTSTATUS (WINAPI *pLsaFreeMemory)(PVOID);
static NTSTATUS (WINAPI *pLsaOpenPolicy)(PLSA_UNICODE_STRING,PLSA_OBJECT_ATTRIBUTES,ACCESS_MASK,PLSA_HANDLE);
static NTSTATUS (WINAPI *pLsaQueryInformationPolicy)(LSA_HANDLE,POLICY_INFORMATION_CLASS,PVOID*);
static BOOL (WINAPI *pConvertSidToStringSidA)(PSID,LPSTR*);
static NTSTATUS (WINAPI *pLsaLookupNames2)(LSA_HANDLE,ULONG,ULONG,PLSA_UNICODE_STRING,PLSA_REFERENCED_DOMAIN_LIST*,PLSA_TRANSLATED_SID2*);
static NTSTATUS (WINAPI *pLsaLookupSids)(LSA_HANDLE,ULONG,PSID*,LSA_REFERENCED_DOMAIN_LIST**,LSA_TRANSLATED_NAME**);
static BOOL init(void)
{
hadvapi32 = GetModuleHandleA("advapi32.dll");
pLsaClose = (void*)GetProcAddress(hadvapi32, "LsaClose");
pLsaEnumerateAccountRights = (void*)GetProcAddress(hadvapi32, "LsaEnumerateAccountRights");
pLsaFreeMemory = (void*)GetProcAddress(hadvapi32, "LsaFreeMemory");
pLsaOpenPolicy = (void*)GetProcAddress(hadvapi32, "LsaOpenPolicy");
pLsaQueryInformationPolicy = (void*)GetProcAddress(hadvapi32, "LsaQueryInformationPolicy");
pConvertSidToStringSidA = (void*)GetProcAddress(hadvapi32, "ConvertSidToStringSidA");
pLsaLookupNames2 = (void*)GetProcAddress(hadvapi32, "LsaLookupNames2");
pLsaLookupSids = (void*)GetProcAddress(hadvapi32, "LsaLookupSids");
if (pLsaClose && pLsaEnumerateAccountRights && pLsaFreeMemory && pLsaOpenPolicy && pLsaQueryInformationPolicy && pConvertSidToStringSidA)
return TRUE;
return FALSE;
}
static BOOL (WINAPI *pGetSystemPreferredUILanguages)(DWORD, ULONG*, WCHAR*, ULONG*);
static NTSTATUS (WINAPI *pLsaGetUserName)(PUNICODE_STRING *user, PUNICODE_STRING *domain);
static void test_lsa(void)
{
......@@ -73,15 +50,15 @@ static void test_lsa(void)
ZeroMemory(&object_attributes, sizeof(object_attributes));
object_attributes.Length = sizeof(object_attributes);
status = pLsaOpenPolicy( NULL, &object_attributes, POLICY_ALL_ACCESS, &handle);
status = LsaOpenPolicy( NULL, &object_attributes, POLICY_ALL_ACCESS, &handle);
ok(status == STATUS_SUCCESS || status == STATUS_ACCESS_DENIED,
"LsaOpenPolicy(POLICY_ALL_ACCESS) returned 0x%08x\n", status);
"LsaOpenPolicy(POLICY_ALL_ACCESS) returned 0x%08lx\n", status);
/* try a more restricted access mask if necessary */
if (status == STATUS_ACCESS_DENIED) {
trace("LsaOpenPolicy(POLICY_ALL_ACCESS) failed, trying POLICY_VIEW_LOCAL_INFORMATION|POLICY_LOOKUP_NAMES\n");
status = pLsaOpenPolicy( NULL, &object_attributes, POLICY_VIEW_LOCAL_INFORMATION|POLICY_LOOKUP_NAMES, &handle);
ok(status == STATUS_SUCCESS, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION|POLICY_LOOKUP_NAMES) returned 0x%08x\n", status);
status = LsaOpenPolicy( NULL, &object_attributes, POLICY_VIEW_LOCAL_INFORMATION|POLICY_LOOKUP_NAMES, &handle);
ok(status == STATUS_SUCCESS, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION|POLICY_LOOKUP_NAMES) returned 0x%08lx\n", status);
}
if (status == STATUS_SUCCESS) {
......@@ -92,21 +69,20 @@ static void test_lsa(void)
HANDLE token;
BOOL ret;
status = pLsaQueryInformationPolicy(handle, PolicyAuditEventsInformation, (PVOID*)&audit_events_info);
status = LsaQueryInformationPolicy(handle, PolicyAuditEventsInformation, (void **)&audit_events_info);
if (status == STATUS_ACCESS_DENIED)
skip("Not enough rights to retrieve PolicyAuditEventsInformation\n");
else
ok(status == STATUS_SUCCESS, "LsaQueryInformationPolicy(PolicyAuditEventsInformation) failed, returned 0x%08x\n", status);
if (status == STATUS_SUCCESS) {
pLsaFreeMemory((LPVOID)audit_events_info);
}
ok(status == STATUS_SUCCESS, "LsaQueryInformationPolicy(PolicyAuditEventsInformation) failed, returned 0x%08lx\n", status);
if (status == STATUS_SUCCESS)
LsaFreeMemory(audit_events_info);
status = pLsaQueryInformationPolicy(handle, PolicyPrimaryDomainInformation, (PVOID*)&primary_domain_info);
ok(status == STATUS_SUCCESS, "LsaQueryInformationPolicy(PolicyPrimaryDomainInformation) failed, returned 0x%08x\n", status);
status = LsaQueryInformationPolicy(handle, PolicyPrimaryDomainInformation, (void **)&primary_domain_info);
ok(status == STATUS_SUCCESS, "LsaQueryInformationPolicy(PolicyPrimaryDomainInformation) failed, returned 0x%08lx\n", status);
if (status == STATUS_SUCCESS) {
if (primary_domain_info->Sid) {
LPSTR strsid;
if (pConvertSidToStringSidA(primary_domain_info->Sid, &strsid))
if (ConvertSidToStringSidA(primary_domain_info->Sid, &strsid))
{
if (primary_domain_info->Name.Buffer) {
LPSTR name = NULL;
......@@ -125,34 +101,26 @@ static void test_lsa(void)
}
else
trace("Running on a standalone system.\n");
pLsaFreeMemory((LPVOID)primary_domain_info);
LsaFreeMemory(primary_domain_info);
}
status = pLsaQueryInformationPolicy(handle, PolicyAccountDomainInformation, (PVOID*)&account_domain_info);
ok(status == STATUS_SUCCESS, "LsaQueryInformationPolicy(PolicyAccountDomainInformation) failed, returned 0x%08x\n", status);
if (status == STATUS_SUCCESS) {
pLsaFreeMemory((LPVOID)account_domain_info);
}
status = LsaQueryInformationPolicy(handle, PolicyAccountDomainInformation, (void **)&account_domain_info);
ok(status == STATUS_SUCCESS, "LsaQueryInformationPolicy(PolicyAccountDomainInformation) failed, returned 0x%08lx\n", status);
if (status == STATUS_SUCCESS)
LsaFreeMemory(account_domain_info);
/* This isn't supported in NT4 */
status = pLsaQueryInformationPolicy(handle, PolicyDnsDomainInformation, (PVOID*)&dns_domain_info);
status = LsaQueryInformationPolicy(handle, PolicyDnsDomainInformation, (void **)&dns_domain_info);
ok(status == STATUS_SUCCESS || status == STATUS_INVALID_PARAMETER,
"LsaQueryInformationPolicy(PolicyDnsDomainInformation) failed, returned 0x%08x\n", status);
"LsaQueryInformationPolicy(PolicyDnsDomainInformation) failed, returned 0x%08lx\n", status);
if (status == STATUS_SUCCESS) {
if (dns_domain_info->Sid || !IsEqualGUID(&dns_domain_info->DomainGuid, &GUID_NULL)) {
LPSTR strsid = NULL;
LPSTR name = NULL;
LPSTR domain = NULL;
LPSTR forest = NULL;
LPSTR guidstr = NULL;
WCHAR guidstrW[64];
UINT len;
guidstrW[0] = '\0';
pConvertSidToStringSidA(dns_domain_info->Sid, &strsid);
StringFromGUID2(&dns_domain_info->DomainGuid, guidstrW, sizeof(guidstrW)/sizeof(WCHAR));
len = WideCharToMultiByte( CP_ACP, 0, guidstrW, -1, NULL, 0, NULL, NULL );
guidstr = LocalAlloc( 0, len );
WideCharToMultiByte( CP_ACP, 0, guidstrW, -1, guidstr, len, NULL, NULL );
ConvertSidToStringSidA(dns_domain_info->Sid, &strsid);
if (dns_domain_info->Name.Buffer) {
len = WideCharToMultiByte( CP_ACP, 0, dns_domain_info->Name.Buffer, -1, NULL, 0, NULL, NULL );
name = LocalAlloc( 0, len );
......@@ -169,30 +137,29 @@ static void test_lsa(void)
WideCharToMultiByte( CP_ACP, 0, dns_domain_info->DnsForestName.Buffer, -1, forest, len, NULL, NULL );
}
trace(" name: %s domain: %s forest: %s guid: %s sid: %s\n",
name ? name : "NULL", domain ? domain : "NULL",
forest ? forest : "NULL", guidstr, strsid ? strsid : "NULL");
debugstr_a(name), debugstr_a(domain), debugstr_a(forest),
debugstr_guid(&dns_domain_info->DomainGuid), debugstr_a(strsid));
LocalFree( name );
LocalFree( forest );
LocalFree( domain );
LocalFree( guidstr );
LocalFree( strsid );
}
else
trace("Running on a standalone system.\n");
pLsaFreeMemory((LPVOID)dns_domain_info);
LsaFreeMemory(dns_domain_info);
}
/* We need a valid SID to pass to LsaEnumerateAccountRights */
ret = OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &token );
ok(ret, "Unable to obtain process token, error %u\n", GetLastError( ));
ok(ret, "Unable to obtain process token, error %lu\n", GetLastError( ));
if (ret) {
char buffer[64];
DWORD len;
TOKEN_USER *token_user = (TOKEN_USER *) buffer;
ret = GetTokenInformation( token, TokenUser, (LPVOID) token_user, sizeof(buffer), &len );
ok(ret || GetLastError( ) == ERROR_INSUFFICIENT_BUFFER, "Unable to obtain token information, error %u\n", GetLastError( ));
ok(ret || GetLastError( ) == ERROR_INSUFFICIENT_BUFFER, "Unable to obtain token information, error %lu\n", GetLastError( ));
if (! ret && GetLastError( ) == ERROR_INSUFFICIENT_BUFFER) {
trace("Resizing buffer to %u.\n", len);
trace("Resizing buffer to %lu.\n", len);
token_user = LocalAlloc( 0, len );
if (token_user != NULL)
ret = GetTokenInformation( token, TokenUser, (LPVOID) token_user, len, &len );
......@@ -203,10 +170,10 @@ static void test_lsa(void)
ULONG rights_count;
rights = (PLSA_UNICODE_STRING) 0xdeadbeaf;
rights_count = 0xcafecafe;
status = pLsaEnumerateAccountRights(handle, token_user->User.Sid, &rights, &rights_count);
ok(status == STATUS_SUCCESS || status == STATUS_OBJECT_NAME_NOT_FOUND, "Unexpected status 0x%x\n", status);
status = LsaEnumerateAccountRights(handle, token_user->User.Sid, &rights, &rights_count);
ok(status == STATUS_SUCCESS || status == STATUS_OBJECT_NAME_NOT_FOUND, "Unexpected status 0x%lx\n", status);
if (status == STATUS_SUCCESS)
pLsaFreeMemory( rights );
LsaFreeMemory( rights );
else
ok(rights == NULL && rights_count == 0, "Expected rights and rights_count to be set to 0 on failure\n");
}
......@@ -215,8 +182,8 @@ static void test_lsa(void)
CloseHandle( token );
}
status = pLsaClose(handle);
ok(status == STATUS_SUCCESS, "LsaClose() failed, returned 0x%08x\n", status);
status = LsaClose(handle);
ok(status == STATUS_SUCCESS, "LsaClose() failed, returned 0x%08lx\n", status);
}
}
......@@ -233,7 +200,7 @@ static void get_sid_info(PSID psid, LPSTR *user, LPSTR *dom)
user_size = dom_size = 257;
account[0] = domain[0] = 0;
ret = LookupAccountSidA(NULL, psid, account, &user_size, domain, &dom_size, &use);
ok(ret, "LookupAccountSidA failed %u\n", GetLastError());
ok(ret, "LookupAccountSidA failed %lu\n", GetLastError());
}
static void test_LsaLookupNames2(void)
......@@ -249,12 +216,6 @@ static void test_LsaLookupNames2(void)
LSA_UNICODE_STRING name[3];
LPSTR account, sid_dom;
if (!pLsaLookupNames2)
{
win_skip("LsaLookupNames2 not available\n");
return;
}
if ((PRIMARYLANGID(LANGIDFROMLCID(GetSystemDefaultLCID())) != LANG_ENGLISH) ||
(PRIMARYLANGID(LANGIDFROMLCID(GetThreadLocale())) != LANG_ENGLISH))
{
......@@ -265,16 +226,16 @@ static void test_LsaLookupNames2(void)
memset(&attrs, 0, sizeof(attrs));
attrs.Length = sizeof(attrs);
status = pLsaOpenPolicy(NULL, &attrs, POLICY_ALL_ACCESS, &handle);
status = LsaOpenPolicy(NULL, &attrs, POLICY_ALL_ACCESS, &handle);
ok(status == STATUS_SUCCESS || status == STATUS_ACCESS_DENIED,
"LsaOpenPolicy(POLICY_ALL_ACCESS) returned 0x%08x\n", status);
"LsaOpenPolicy(POLICY_ALL_ACCESS) returned 0x%08lx\n", status);
/* try a more restricted access mask if necessary */
if (status == STATUS_ACCESS_DENIED)
{
trace("LsaOpenPolicy(POLICY_ALL_ACCESS) failed, trying POLICY_VIEW_LOCAL_INFORMATION\n");
status = pLsaOpenPolicy(NULL, &attrs, POLICY_LOOKUP_NAMES, &handle);
ok(status == STATUS_SUCCESS, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION) returned 0x%08x\n", status);
status = LsaOpenPolicy(NULL, &attrs, POLICY_LOOKUP_NAMES, &handle);
ok(status == STATUS_SUCCESS, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION) returned 0x%08lx\n", status);
}
if (status != STATUS_SUCCESS)
{
......@@ -282,137 +243,275 @@ static void test_LsaLookupNames2(void)
return;
}
name[0].Buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(n1));
name[0].Buffer = malloc(sizeof(n1));
name[0].Length = name[0].MaximumLength = sizeof(n1);
memcpy(name[0].Buffer, n1, sizeof(n1));
name[1].Buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(n1));
name[1].Buffer = malloc(sizeof(n1));
name[1].Length = name[1].MaximumLength = sizeof(n1) - sizeof(WCHAR);
memcpy(name[1].Buffer, n1, sizeof(n1) - sizeof(WCHAR));
name[2].Buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(n2));
name[2].Buffer = malloc(sizeof(n2));
name[2].Length = name[2].MaximumLength = sizeof(n2);
memcpy(name[2].Buffer, n2, sizeof(n2));
/* account name only */
sids = NULL;
domains = NULL;
status = pLsaLookupNames2(handle, 0, 1, &name[0], &domains, &sids);
ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %x)\n", status);
status = LsaLookupNames2(handle, 0, 1, &name[0], &domains, &sids);
ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %lx)\n", status);
ok(sids[0].Use == SidTypeWellKnownGroup, "expected SidTypeWellKnownGroup, got %u\n", sids[0].Use);
ok(sids[0].Flags == 0, "expected 0, got 0x%08x\n", sids[0].Flags);
ok(domains->Entries == 1, "expected 1, got %u\n", domains->Entries);
ok(sids[0].Flags == 0, "expected 0, got 0x%08lx\n", sids[0].Flags);
ok(domains->Entries == 1, "expected 1, got %lu\n", domains->Entries);
get_sid_info(sids[0].Sid, &account, &sid_dom);
ok(!strcmp(account, "LOCAL SERVICE"), "expected \"LOCAL SERVICE\", got \"%s\"\n", account);
ok(!strcmp(sid_dom, "NT AUTHORITY"), "expected \"NT AUTHORITY\", got \"%s\"\n", sid_dom);
pLsaFreeMemory(sids);
pLsaFreeMemory(domains);
LsaFreeMemory(sids);
LsaFreeMemory(domains);
/* unknown account name */
sids = NULL;
domains = NULL;
status = pLsaLookupNames2(handle, 0, 1, &name[1], &domains, &sids);
ok(status == STATUS_NONE_MAPPED, "expected STATUS_NONE_MAPPED, got %x)\n", status);
status = LsaLookupNames2(handle, 0, 1, &name[1], &domains, &sids);
ok(status == STATUS_NONE_MAPPED, "expected STATUS_NONE_MAPPED, got %lx)\n", status);
ok(sids[0].Use == SidTypeUnknown, "expected SidTypeUnknown, got %u\n", sids[0].Use);
ok(sids[0].Flags == 0, "expected 0, got 0x%08x\n", sids[0].Flags);
ok(domains->Entries == 0, "expected 0, got %u\n", domains->Entries);
pLsaFreeMemory(sids);
pLsaFreeMemory(domains);
ok(sids[0].Flags == 0, "expected 0, got 0x%08lx\n", sids[0].Flags);
ok(domains->Entries == 0, "expected 0, got %lu\n", domains->Entries);
LsaFreeMemory(sids);
LsaFreeMemory(domains);
/* account + domain */
sids = NULL;
domains = NULL;
status = pLsaLookupNames2(handle, 0, 1, &name[2], &domains, &sids);
ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %x)\n", status);
status = LsaLookupNames2(handle, 0, 1, &name[2], &domains, &sids);
ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %lx)\n", status);
ok(sids[0].Use == SidTypeWellKnownGroup, "expected SidTypeWellKnownGroup, got %u\n", sids[0].Use);
ok(sids[0].Flags == 0, "expected 0, got 0x%08x\n", sids[0].Flags);
ok(domains->Entries == 1, "expected 1, got %u\n", domains->Entries);
ok(sids[0].Flags == 0, "expected 0, got 0x%08lx\n", sids[0].Flags);
ok(domains->Entries == 1, "expected 1, got %lu\n", domains->Entries);
get_sid_info(sids[0].Sid, &account, &sid_dom);
ok(!strcmp(account, "LOCAL SERVICE"), "expected \"LOCAL SERVICE\", got \"%s\"\n", account);
ok(!strcmp(sid_dom, "NT AUTHORITY"), "expected \"NT AUTHORITY\", got \"%s\"\n", sid_dom);
pLsaFreeMemory(sids);
pLsaFreeMemory(domains);
LsaFreeMemory(sids);
LsaFreeMemory(domains);
/* all three */
sids = NULL;
domains = NULL;
status = pLsaLookupNames2(handle, 0, 3, name, &domains, &sids);
ok(status == STATUS_SOME_NOT_MAPPED, "expected STATUS_SOME_NOT_MAPPED, got %x)\n", status);
status = LsaLookupNames2(handle, 0, 3, name, &domains, &sids);
ok(status == STATUS_SOME_NOT_MAPPED, "expected STATUS_SOME_NOT_MAPPED, got %lx)\n", status);
ok(sids[0].Use == SidTypeWellKnownGroup, "expected SidTypeWellKnownGroup, got %u\n", sids[0].Use);
ok(sids[1].Use == SidTypeUnknown, "expected SidTypeUnknown, got %u\n", sids[1].Use);
ok(sids[2].Use == SidTypeWellKnownGroup, "expected SidTypeWellKnownGroup, got %u\n", sids[2].Use);
ok(sids[0].DomainIndex == 0, "expected 0, got %u\n", sids[0].DomainIndex);
ok(domains->Entries == 1, "expected 1, got %u\n", domains->Entries);
pLsaFreeMemory(sids);
pLsaFreeMemory(domains);
ok(sids[0].DomainIndex == 0, "expected 0, got %lu\n", sids[0].DomainIndex);
ok(domains->Entries == 1, "expected 1, got %lu\n", domains->Entries);
LsaFreeMemory(sids);
LsaFreeMemory(domains);
HeapFree(GetProcessHeap(), 0, name[0].Buffer);
HeapFree(GetProcessHeap(), 0, name[1].Buffer);
HeapFree(GetProcessHeap(), 0, name[2].Buffer);
free(name[0].Buffer);
free(name[1].Buffer);
free(name[2].Buffer);
status = pLsaClose(handle);
ok(status == STATUS_SUCCESS, "LsaClose() failed, returned 0x%08x\n", status);
status = LsaClose(handle);
ok(status == STATUS_SUCCESS, "LsaClose() failed, returned 0x%08lx\n", status);
}
static void check_unicode_string_(int line, const LSA_UNICODE_STRING *string, const WCHAR *expect)
{
ok_(__FILE__, line)(string->Length == wcslen(string->Buffer) * sizeof(WCHAR),
"expected %Iu, got %u\n", wcslen(string->Buffer) * sizeof(WCHAR), string->Length);
ok_(__FILE__, line)(string->MaximumLength == string->Length + sizeof(WCHAR),
"expected %Iu, got %u\n", string->Length + sizeof(WCHAR), string->MaximumLength);
ok_(__FILE__, line)(!wcsicmp(string->Buffer, expect), "expected %s, got %s\n",
debugstr_w(expect), debugstr_w(string->Buffer));
}
#define check_unicode_string(a, b) check_unicode_string_(__LINE__, a, b)
static void test_LsaLookupSids(void)
{
WCHAR langW[32];
char user_buffer[64];
LSA_OBJECT_ATTRIBUTES attrs = {sizeof(attrs)};
TOKEN_USER *user = (TOKEN_USER *)user_buffer;
WCHAR computer_name[64], user_name[64];
LSA_REFERENCED_DOMAIN_LIST *list;
LSA_OBJECT_ATTRIBUTES attrs;
LSA_TRANSLATED_NAME *names;
LSA_HANDLE policy;
TOKEN_USER *user;
NTSTATUS status;
HANDLE token;
DWORD size;
DWORD num, size;
BOOL ret;
PSID sid;
memset(&attrs, 0, sizeof(attrs));
attrs.Length = sizeof(attrs);
status = pLsaOpenPolicy(NULL, &attrs, POLICY_LOOKUP_NAMES, &policy);
ok(status == STATUS_SUCCESS, "got 0x%08x\n", status);
status = LsaOpenPolicy(NULL, &attrs, POLICY_LOOKUP_NAMES, &policy);
ok(status == STATUS_SUCCESS, "got 0x%08lx\n", status);
ret = OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, &token);
ok(ret, "got %d\n", ret);
ok(ret, "OpenProcessToken() failed, error %lu\n", GetLastError());
ret = GetTokenInformation(token, TokenUser, NULL, 0, &size);
ok(!ret, "got %d\n", ret);
ret = GetTokenInformation(token, TokenUser, user, sizeof(user_buffer), &size);
ok(ret, "GetTokenInformation() failed, error %lu\n", GetLastError());
user = HeapAlloc(GetProcessHeap(), 0, size);
ret = GetTokenInformation(token, TokenUser, user, size, &size);
ok(ret, "got %d\n", ret);
size = ARRAY_SIZE(computer_name);
ret = GetComputerNameW(computer_name, &size);
ok(ret, "GetComputerName() failed, error %lu\n", GetLastError());
status = pLsaLookupSids(policy, 1, &user->User.Sid, &list, &names);
ok(status == STATUS_SUCCESS, "got 0x%08x\n", status);
size = ARRAY_SIZE(user_name);
ret = GetUserNameW(user_name, &size);
ok(ret, "GetUserName() failed, error %lu\n", GetLastError());
ok(list->Entries > 0, "got %d\n", list->Entries);
if (list->Entries)
{
ok((char*)list->Domains - (char*)list > 0, "%p, %p\n", list, list->Domains);
ok((char*)list->Domains[0].Sid - (char*)list->Domains > 0, "%p, %p\n", list->Domains, list->Domains[0].Sid);
ok(list->Domains[0].Name.MaximumLength > list->Domains[0].Name.Length, "got %d, %d\n", list->Domains[0].Name.MaximumLength,
list->Domains[0].Name.Length);
}
status = LsaLookupSids(policy, 1, &user->User.Sid, &list, &names);
ok(status == STATUS_SUCCESS, "got 0x%08lx\n", status);
pLsaFreeMemory(names);
pLsaFreeMemory(list);
ok(list->Entries == 1, "got %ld\n", list->Entries);
check_unicode_string(&list->Domains[0].Name, computer_name);
HeapFree(GetProcessHeap(), 0, user);
ok(names[0].Use == SidTypeUser, "got type %u\n", names[0].Use);
ok(!names[0].DomainIndex, "got index %lu\n", names[0].DomainIndex);
check_unicode_string(&names[0].Name, user_name);
LsaFreeMemory(names);
LsaFreeMemory(list);
CloseHandle(token);
status = pLsaClose(policy);
ok(status == STATUS_SUCCESS, "got 0x%08x\n", status);
ret = ConvertStringSidToSidA("S-1-1-0", &sid);
ok(ret, "ConvertStringSidToSidA() failed, error %lu\n", GetLastError());
status = LsaLookupSids(policy, 1, &sid, &list, &names);
ok(status == STATUS_SUCCESS, "got 0x%08lx\n", status);
ok(list->Entries == 1, "got %ld\n", list->Entries);
check_unicode_string(&list->Domains[0].Name, L"");
ok(names[0].Use == SidTypeWellKnownGroup, "got type %u\n", names[0].Use);
ok(!names[0].DomainIndex, "got index %lu\n", names[0].DomainIndex);
/* The group name gets translated... but not in all locales */
size = ARRAY_SIZE(langW);
if (!pGetSystemPreferredUILanguages ||
!pGetSystemPreferredUILanguages(MUI_LANGUAGE_ID, &num, langW, &size))
langW[0] = 0;
if (wcscmp(langW, L"0409") == 0 || wcscmp(langW, L"0411") == 0)
/* English and Japanese */
check_unicode_string(&names[0].Name, L"Everyone");
else if (wcscmp(langW, L"0407") == 0) /* German */
todo_wine ok(!wcsicmp(names[0].Name.Buffer, L"Jeder"), "missing translation %s\n",
debugstr_w(names[0].Name.Buffer));
else if (wcscmp(langW, L"040C") == 0) /* French */
todo_wine ok(!wcsicmp(names[0].Name.Buffer, L"Tout le monde"), "missing translation %s\n",
debugstr_w(names[0].Name.Buffer));
else
trace("<Everyone-group>.Name=%s\n", debugstr_w(names[0].Name.Buffer));
LsaFreeMemory(names);
LsaFreeMemory(list);
FreeSid(sid);
ret = ConvertStringSidToSidA("S-1-1234-5678-1234-5678", &sid);
ok(ret, "ConvertStringSidToSidA() failed, error %lu\n", GetLastError());
status = LsaLookupSids(policy, 1, &sid, &list, &names);
ok(status == STATUS_NONE_MAPPED, "got 0x%08lx\n", status);
ok(!list->Entries, "got %ld\n", list->Entries);
ok(names[0].Use == SidTypeUnknown, "got type %u\n", names[0].Use);
ok(names[0].DomainIndex == -1, "got index %lu\n", names[0].DomainIndex);
check_unicode_string(&names[0].Name, L"S-1-1234-5678-1234-5678");
LsaFreeMemory(names);
LsaFreeMemory(list);
FreeSid(sid);
status = LsaClose(policy);
ok(status == STATUS_SUCCESS, "got 0x%08lx\n", status);
}
START_TEST(lsa)
static void test_LsaLookupPrivilegeName(void)
{
LSA_OBJECT_ATTRIBUTES attrs;
LSA_UNICODE_STRING *name;
LSA_HANDLE policy;
NTSTATUS status;
LUID luid;
memset(&attrs, 0, sizeof(attrs));
attrs.Length = sizeof(attrs);
status = LsaOpenPolicy(NULL, &attrs, POLICY_LOOKUP_NAMES, &policy);
ok(status == STATUS_SUCCESS, "Failed to open policy, %#lx.\n", status);
name = (void *)0xdeadbeef;
status = LsaLookupPrivilegeName(policy, NULL, &name);
ok(status != STATUS_SUCCESS, "Unexpected status %#lx.\n", status);
ok(name == (void *)0xdeadbeef, "Unexpected name pointer.\n");
name = (void *)0xdeadbeef;
luid.HighPart = 1;
luid.LowPart = SE_CREATE_TOKEN_PRIVILEGE;
status = LsaLookupPrivilegeName(policy, &luid, &name);
ok(status == STATUS_NO_SUCH_PRIVILEGE, "Unexpected status %#lx.\n", status);
ok(name == NULL, "Unexpected name pointer.\n");
luid.HighPart = 0;
luid.LowPart = SE_CREATE_TOKEN_PRIVILEGE;
status = LsaLookupPrivilegeName(policy, &luid, &name);
ok(status == 0, "got %#lx.\n", status);
LsaFreeMemory(name);
}
static void test_LsaGetUserName(void)
{
if (!init()) {
win_skip("Needed functions are not available\n");
NTSTATUS status;
BOOL ret;
UNICODE_STRING *lsa_user, *lsa_domain;
WCHAR user[256], computer[256];
DWORD size;
if (!pLsaGetUserName)
{
skip("LsaGetUserName is not available on this platform\n");
return;
}
size = ARRAY_SIZE(user);
ret = GetUserNameW(user, &size);
ok(ret, "GetUserName error %lu\n", GetLastError());
size = ARRAY_SIZE(computer);
ret = GetComputerNameW(computer, &size);
ok(ret, "GetComputerName error %lu\n", GetLastError());
if (0) /* crashes under Windows */
status = pLsaGetUserName(NULL, NULL);
if (0) /* crashes under Windows */
status = pLsaGetUserName(NULL, &lsa_domain);
status = pLsaGetUserName(&lsa_user, NULL);
ok(!status, "got %#lx\n", status);
check_unicode_string(lsa_user, user);
LsaFreeMemory(lsa_user);
status = pLsaGetUserName(&lsa_user, &lsa_domain);
ok(!status, "got %#lx\n", status);
ok(!lstrcmpW(user, lsa_user->Buffer), "%s != %s\n", wine_dbgstr_w(user), wine_dbgstr_wn(lsa_user->Buffer, lsa_user->Length/sizeof(WCHAR)));
check_unicode_string(lsa_user, user);
check_unicode_string(lsa_domain, computer);
LsaFreeMemory(lsa_user);
LsaFreeMemory(lsa_domain);
}
START_TEST(lsa)
{
HMODULE hkernel32 = GetModuleHandleA("kernel32.dll");
HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
pGetSystemPreferredUILanguages = (void*)GetProcAddress(hkernel32, "GetSystemPreferredUILanguages");
pLsaGetUserName = (void *)GetProcAddress(hadvapi32, "LsaGetUserName");
test_lsa();
test_LsaLookupNames2();
test_LsaLookupSids();
test_LsaLookupPrivilegeName();
test_LsaGetUserName();
}
/*
* Unit tests for Perflib functions
*
* Copyright (c) 2021 Paul Gofman for CodeWeavers
*
* 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
*/
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "perflib.h"
#include "winperf.h"
#include "winternl.h"
#include "wine/test.h"
#include "initguid.h"
ULONG (WINAPI *pPerfCloseQueryHandle)(HANDLE);
ULONG (WINAPI *pPerfOpenQueryHandle)(const WCHAR*, HANDLE*);
ULONG (WINAPI *pPerfAddCounters)(HANDLE, PERF_COUNTER_IDENTIFIER*, DWORD);
ULONG (WINAPI *pPerfQueryCounterData)(HANDLE, PERF_DATA_HEADER*, DWORD, DWORD*);
static void init_functions(void)
{
HANDLE hadvapi = GetModuleHandleA("advapi32.dll");
#define GET_FUNCTION(name) p##name = (void *)GetProcAddress(hadvapi, #name)
GET_FUNCTION(PerfCloseQueryHandle);
GET_FUNCTION(PerfOpenQueryHandle);
GET_FUNCTION(PerfAddCounters);
GET_FUNCTION(PerfQueryCounterData);
#undef GET_FUNCTION
}
static ULONG WINAPI test_provider_callback(ULONG code, void *buffer, ULONG size)
{
ok(0, "Provider callback called.\n");
return ERROR_SUCCESS;
}
void test_provider_init(void)
{
static GUID test_set_guid = {0xdeadbeef, 0x0002, 0x0003, {0x0f, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00 ,0x0a}};
static GUID test_set_guid2 = {0xdeadbeef, 0x0003, 0x0003, {0x0f, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00 ,0x0a}};
static GUID test_guid = {0xdeadbeef, 0x0001, 0x0002, {0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00 ,0x0a}};
static struct
{
PERF_COUNTERSET_INFO counterset;
PERF_COUNTER_INFO counter[2];
}
pc_template =
{
{{0}},
{
{1, PERF_COUNTER_COUNTER, PERF_ATTRIB_BY_REFERENCE, sizeof(PERF_COUNTER_INFO),
PERF_DETAIL_NOVICE, 0, 0xdeadbeef},
{2, PERF_COUNTER_COUNTER, PERF_ATTRIB_BY_REFERENCE, sizeof(PERF_COUNTER_INFO),
PERF_DETAIL_NOVICE, 0, 0xdeadbeef},
},
};
PERF_COUNTERSET_INSTANCE *instance;
PERF_PROVIDER_CONTEXT prov_context;
UINT64 counter1, counter2;
HANDLE prov, prov2;
ULONG ret, size;
BOOL bret;
prov = (HANDLE)0xdeadbeef;
ret = PerfStartProvider(NULL, test_provider_callback, &prov);
ok(ret == ERROR_INVALID_PARAMETER, "Got unexpected ret %lu.\n", ret);
ok(prov == (HANDLE)0xdeadbeef, "Got unexpected prov %p.\n", prov);
prov = (HANDLE)0xdeadbeef;
ret = PerfStartProvider(&test_guid, test_provider_callback, NULL);
ok(ret == ERROR_INVALID_PARAMETER, "Got unexpected ret %lu.\n", ret);
ok(prov == (HANDLE)0xdeadbeef, "Got unexpected prov %p.\n", prov);
prov = (HANDLE)0xdeadbeef;
ret = PerfStartProvider(&test_guid, test_provider_callback, &prov);
ok(!ret, "Got unexpected ret %lu.\n", ret);
ok(prov != (HANDLE)0xdeadbeef, "Provider handle is not set.\n");
prov2 = prov;
ret = PerfStartProvider(&test_guid, test_provider_callback, &prov2);
ok(!ret, "Got unexpected ret %lu.\n", ret);
ok(prov2 != prov, "Got the same provider handle.\n");
ret = PerfStopProvider(prov2);
ok(!ret, "Got unexpected ret %lu.\n", ret);
if (0)
{
/* Access violation on Windows. */
PerfStopProvider(prov2);
}
/* Provider handle is a pointer and not a kernel object handle. */
bret = DuplicateHandle(GetCurrentProcess(), prov, GetCurrentProcess(), &prov2, 0, FALSE, DUPLICATE_SAME_ACCESS);
ok(!bret && GetLastError() == ERROR_INVALID_HANDLE, "Got unexpected bret %d, err %lu.\n", bret, GetLastError());
bret = IsBadWritePtr(prov, 8);
ok(!bret, "Handle does not point to the data.\n");
pc_template.counterset.CounterSetGuid = test_set_guid;
pc_template.counterset.ProviderGuid = test_guid;
pc_template.counterset.NumCounters = 0;
pc_template.counterset.InstanceType = PERF_COUNTERSET_SINGLE_INSTANCE;
ret = PerfSetCounterSetInfo(prov, &pc_template.counterset, sizeof(pc_template.counterset));
ok(ret == ERROR_INVALID_PARAMETER, "Got unexpected ret %lu.\n", ret);
pc_template.counterset.CounterSetGuid = test_set_guid;
pc_template.counterset.ProviderGuid = test_guid;
pc_template.counterset.NumCounters = 2;
pc_template.counterset.InstanceType = PERF_COUNTERSET_SINGLE_INSTANCE;
ret = PerfSetCounterSetInfo(prov, &pc_template.counterset, sizeof(pc_template));
ok(!ret, "Got unexpected ret %lu.\n", ret);
pc_template.counterset.CounterSetGuid = test_set_guid2;
/* Looks like ProviderGuid doesn't need to match provider. */
pc_template.counterset.ProviderGuid = test_set_guid;
pc_template.counterset.NumCounters = 1;
pc_template.counterset.InstanceType = PERF_COUNTERSET_SINGLE_INSTANCE;
ret = PerfSetCounterSetInfo(prov, &pc_template.counterset, sizeof(pc_template));
ok(!ret, "Got unexpected ret %lu.\n", ret);
ret = PerfSetCounterSetInfo(prov, &pc_template.counterset, sizeof(pc_template));
ok(ret == ERROR_ALREADY_EXISTS, "Got unexpected ret %lu.\n", ret);
SetLastError(0xdeadbeef);
instance = PerfCreateInstance(prov, NULL, L"1", 1);
ok(!instance, "Got unexpected instance %p.\n", instance);
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %lu.\n", GetLastError());
SetLastError(0xdeadbeef);
instance = PerfCreateInstance(prov, &test_guid, L"1", 1);
ok(!instance, "Got unexpected instance %p.\n", instance);
ok(GetLastError() == ERROR_NOT_FOUND, "Got unexpected error %lu.\n", GetLastError());
SetLastError(0xdeadbeef);
instance = PerfCreateInstance(prov, &test_guid, NULL, 1);
ok(!instance, "Got unexpected instance %p.\n", instance);
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %lu.\n", GetLastError());
SetLastError(0xdeadbeef);
instance = PerfCreateInstance(prov, &test_set_guid, L"11", 1);
ok(!!instance, "Got NULL instance.\n");
ok(GetLastError() == 0xdeadbeef, "Got unexpected error %lu.\n", GetLastError());
ok(instance->InstanceId == 1, "Got unexpected InstanceId %lu.\n", instance->InstanceId);
ok(instance->InstanceNameSize == 6, "Got unexpected InstanceNameSize %lu.\n", instance->InstanceNameSize);
ok(IsEqualGUID(&instance->CounterSetGuid, &test_set_guid), "Got unexpected guid %s.\n",
debugstr_guid(&instance->CounterSetGuid));
ok(instance->InstanceNameOffset == sizeof(*instance) + sizeof(UINT64) * 2,
"Got unexpected InstanceNameOffset %lu.\n", instance->InstanceNameOffset);
ok(!lstrcmpW((WCHAR *)((BYTE *)instance + instance->InstanceNameOffset), L"11"),
"Got unexpected instance name %s.\n",
debugstr_w((WCHAR *)((BYTE *)instance + instance->InstanceNameOffset)));
size = ((sizeof(*instance) + sizeof(UINT64) * 2 + instance->InstanceNameSize) + 7) & ~7;
ok(size == instance->dwSize, "Got unexpected size %lu, instance->dwSize %lu.\n", size, instance->dwSize);
ret = PerfSetCounterRefValue(prov, instance, 1, &counter1);
ok(!ret, "Got unexpected ret %lu.\n", ret);
ret = PerfSetCounterRefValue(prov, instance, 2, &counter2);
ok(!ret, "Got unexpected ret %lu.\n", ret);
ret = PerfSetCounterRefValue(prov, instance, 0, &counter2);
ok(ret == ERROR_NOT_FOUND, "Got unexpected ret %lu.\n", ret);
ok(*(void **)(instance + 1) == &counter1, "Got unexpected counter value %p.\n",
*(void **)(instance + 1));
ok(*(void **)((BYTE *)instance + sizeof(*instance) + sizeof(UINT64)) == &counter2,
"Got unexpected counter value %p.\n", *(void **)(instance + 1));
ret = PerfDeleteInstance(prov, instance);
ok(!ret, "Got unexpected ret %lu.\n", ret);
ret = PerfStopProvider(prov);
ok(!ret, "Got unexpected ret %lu.\n", ret);
memset( &prov_context, 0, sizeof(prov_context) );
prov = (HANDLE)0xdeadbeef;
ret = PerfStartProviderEx( &test_guid, &prov_context, &prov );
ok(ret == ERROR_INVALID_PARAMETER, "Got unexpected ret %lu.\n", ret);
ok(prov == (HANDLE)0xdeadbeef, "Got unexpected prov %p.\n", prov);
prov_context.ContextSize = sizeof(prov_context) + 1;
ret = PerfStartProviderEx( &test_guid, &prov_context, &prov );
ok(!ret, "Got unexpected ret %lu.\n", ret);
ok(prov != (HANDLE)0xdeadbeef, "Provider handle is not set.\n");
ret = PerfStopProvider(prov);
ok(!ret, "Got unexpected ret %lu.\n", ret);
}
DEFINE_GUID(TestCounterGUID, 0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x11, 0x11, 0x22, 0x22, 0x33, 0x33);
static ULONG64 trunc_nttime_ms(ULONG64 t)
{
return (t / 10000) * 10000;
}
static void test_perf_counters(void)
{
LARGE_INTEGER freq, qpc1, qpc2, nttime1, nttime2, systime;
char buffer[sizeof(PERF_COUNTER_IDENTIFIER) + 8];
PERF_COUNTER_IDENTIFIER *counter_id;
PERF_DATA_HEADER dh;
HANDLE query;
DWORD size;
ULONG ret;
if (!pPerfOpenQueryHandle)
{
win_skip("PerfOpenQueryHandle not found.\n");
return;
}
ret = pPerfOpenQueryHandle(NULL, NULL);
ok(ret == ERROR_INVALID_PARAMETER, "got ret %lu.\n", ret);
ret = pPerfOpenQueryHandle(NULL, &query);
ok(!ret, "got ret %lu.\n", ret);
counter_id = (PERF_COUNTER_IDENTIFIER *)buffer;
memset(buffer, 0, sizeof(buffer));
counter_id->CounterSetGuid = TestCounterGUID;
counter_id->CounterId = PERF_WILDCARD_COUNTER;
counter_id->InstanceId = PERF_WILDCARD_COUNTER;
ret = pPerfAddCounters(query, counter_id, sizeof(*counter_id));
ok(ret == ERROR_INVALID_PARAMETER, "got ret %lu.\n", ret);
counter_id->Size = sizeof(*counter_id);
ret = pPerfAddCounters(query, counter_id, 8);
ok(ret == ERROR_INVALID_PARAMETER, "got ret %lu.\n", ret);
ret = pPerfAddCounters(query, counter_id, sizeof(*counter_id));
ok(!ret, "got ret %lu.\n", ret);
ok(counter_id->Status == ERROR_WMI_GUID_NOT_FOUND, "got Status %#lx.\n", counter_id->Status);
ret = pPerfQueryCounterData(query, NULL, 0, NULL);
ok(ret == ERROR_INVALID_PARAMETER, "got ret %lu.\n", ret);
size = 0xdeadbeef;
ret = pPerfQueryCounterData(query, NULL, 0, &size);
ok(ret == ERROR_NOT_ENOUGH_MEMORY, "got ret %lu.\n", ret);
ok(size == sizeof(dh), "got size %lu.\n", size);
ret = pPerfQueryCounterData(query, &dh, sizeof(dh), NULL);
ok(ret == ERROR_INVALID_PARAMETER, "got ret %lu.\n", ret);
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&qpc1);
NtQuerySystemTime(&nttime1);
size = 0xdeadbeef;
ret = pPerfQueryCounterData(query, &dh, sizeof(dh), &size);
QueryPerformanceCounter(&qpc2);
NtQuerySystemTime(&nttime2);
SystemTimeToFileTime(&dh.SystemTime, (FILETIME *)&systime);
ok(!ret, "got ret %lu.\n", ret);
ok(size == sizeof(dh), "got size %lu.\n", size);
ok(dh.dwTotalSize == sizeof(dh), "got dwTotalSize %lu.\n", dh.dwTotalSize);
ok(!dh.dwNumCounters, "got dwNumCounters %lu.\n", dh.dwNumCounters);
ok(dh.PerfFreq == freq.QuadPart, "got PerfFreq %I64u.\n", dh.PerfFreq);
ok(dh.PerfTimeStamp >= qpc1.QuadPart && dh.PerfTimeStamp <= qpc2.QuadPart,
"got PerfTimeStamp %I64u, qpc1 %I64u, qpc2 %I64u.\n",
dh.PerfTimeStamp, qpc1.QuadPart, qpc2.QuadPart);
ok(dh.PerfTime100NSec >= nttime1.QuadPart && dh.PerfTime100NSec <= nttime2.QuadPart,
"got PerfTime100NSec %I64u, nttime1 %I64u, nttime2 %I64u.\n",
dh.PerfTime100NSec, nttime1.QuadPart, nttime2.QuadPart);
ok(systime.QuadPart >= trunc_nttime_ms(nttime1.QuadPart) && systime.QuadPart <= trunc_nttime_ms(nttime2.QuadPart),
"got systime %I64u, nttime1 %I64u, nttime2 %I64u, %d.\n",
systime.QuadPart, nttime1.QuadPart, nttime2.QuadPart, dh.SystemTime.wMilliseconds);
ret = pPerfCloseQueryHandle(query);
ok(!ret, "got ret %lu.\n", ret);
}
START_TEST(perf)
{
init_functions();
test_provider_init();
test_perf_counters();
}
Source diff could not be displayed: it is too large. Options to address this: view the blob.
/*
* Copyright 2019 Akihiro Sagawa
*
* 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
*/
STRINGTABLE
{
1 "dummy"
}
Source diff could not be displayed: it is too large. Options to address this: view the blob.
......@@ -35,15 +35,16 @@
static const CHAR spooler[] = "Spooler"; /* Should be available on all platforms */
static CHAR selfname[MAX_PATH];
static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
static BOOL (WINAPI *pChangeServiceConfig2A)(SC_HANDLE,DWORD,LPVOID);
static BOOL (WINAPI *pChangeServiceConfig2W)(SC_HANDLE,DWORD,LPVOID);
static BOOL (WINAPI *pEnumServicesStatusExA)(SC_HANDLE, SC_ENUM_TYPE, DWORD,
DWORD, LPBYTE, DWORD, LPDWORD,
LPDWORD, LPDWORD, LPCSTR);
static BOOL (WINAPI *pEnumServicesStatusExW)(SC_HANDLE, SC_ENUM_TYPE, DWORD,
DWORD, LPBYTE, DWORD, LPDWORD,
LPDWORD, LPDWORD, LPCWSTR);
static DWORD (WINAPI *pGetSecurityInfo)(HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION,
PSID*, PSID*, PACL*, PACL*, PSECURITY_DESCRIPTOR*);
static BOOL (WINAPI *pQueryServiceConfig2A)(SC_HANDLE,DWORD,LPBYTE,DWORD,LPDWORD);
static BOOL (WINAPI *pQueryServiceConfig2W)(SC_HANDLE,DWORD,LPBYTE,DWORD,LPDWORD);
static BOOL (WINAPI *pQueryServiceStatusEx)(SC_HANDLE, SC_STATUS_TYPE, LPBYTE,
......@@ -57,14 +58,16 @@ static void init_function_pointers(void)
HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
pChangeServiceConfig2A = (void*)GetProcAddress(hadvapi32, "ChangeServiceConfig2A");
pChangeServiceConfig2W = (void*)GetProcAddress(hadvapi32, "ChangeServiceConfig2W");
pEnumServicesStatusExA= (void*)GetProcAddress(hadvapi32, "EnumServicesStatusExA");
pEnumServicesStatusExW= (void*)GetProcAddress(hadvapi32, "EnumServicesStatusExW");
pGetSecurityInfo = (void *)GetProcAddress(hadvapi32, "GetSecurityInfo");
pQueryServiceConfig2A= (void*)GetProcAddress(hadvapi32, "QueryServiceConfig2A");
pQueryServiceConfig2W= (void*)GetProcAddress(hadvapi32, "QueryServiceConfig2W");
pQueryServiceStatusEx= (void*)GetProcAddress(hadvapi32, "QueryServiceStatusEx");
pQueryServiceObjectSecurity = (void*)GetProcAddress(hadvapi32, "QueryServiceObjectSecurity");
pNotifyServiceStatusChangeW = (void*)GetProcAddress(hadvapi32, "NotifyServiceStatusChangeW");
pIsWow64Process = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsWow64Process");
}
static void test_open_scm(void)
......@@ -74,21 +77,21 @@ static void test_open_scm(void)
/* No access rights */
SetLastError(0xdeadbeef);
scm_handle = OpenSCManagerA(NULL, NULL, 0);
ok(scm_handle != NULL, "Expected success, got error %u\n", GetLastError());
ok(scm_handle != NULL, "Expected success, got error %lu\n", GetLastError());
CloseServiceHandle(scm_handle);
/* Unknown database name */
SetLastError(0xdeadbeef);
scm_handle = OpenSCManagerA(NULL, "DoesNotExist", SC_MANAGER_CONNECT);
ok(!scm_handle, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_NAME, "Expected ERROR_INVALID_NAME, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_NAME, "Expected ERROR_INVALID_NAME, got %ld\n", GetLastError());
CloseServiceHandle(scm_handle); /* Just in case */
/* MSDN says only ServiceActive is allowed, or NULL */
SetLastError(0xdeadbeef);
scm_handle = OpenSCManagerA(NULL, SERVICES_FAILED_DATABASEA, SC_MANAGER_CONNECT);
ok(!scm_handle, "Expected failure\n");
ok(GetLastError() == ERROR_DATABASE_DOES_NOT_EXIST, "Expected ERROR_DATABASE_DOES_NOT_EXIST, got %d\n", GetLastError());
ok(GetLastError() == ERROR_DATABASE_DOES_NOT_EXIST, "Expected ERROR_DATABASE_DOES_NOT_EXIST, got %ld\n", GetLastError());
CloseServiceHandle(scm_handle); /* Just in case */
/* Remote unknown host */
......@@ -98,21 +101,21 @@ static void test_open_scm(void)
{
ok(!scm_handle, "Expected failure\n");
ok(GetLastError() == RPC_S_SERVER_UNAVAILABLE || GetLastError() == RPC_S_INVALID_NET_ADDR /* w2k8 */,
"Expected RPC_S_SERVER_UNAVAILABLE or RPC_S_INVALID_NET_ADDR, got %d\n", GetLastError());
"Expected RPC_S_SERVER_UNAVAILABLE or RPC_S_INVALID_NET_ADDR, got %ld\n", GetLastError());
}
CloseServiceHandle(scm_handle); /* Just in case */
/* Proper call with an empty hostname */
scm_handle = OpenSCManagerA("", SERVICES_ACTIVE_DATABASEA, SC_MANAGER_CONNECT);
ok(scm_handle != NULL, "Expected success, got error %u\n", GetLastError());
ok(scm_handle != NULL, "Expected success, got error %lu\n", GetLastError());
CloseServiceHandle(scm_handle);
/* Again a correct one */
SetLastError(0xdeadbeef);
scm_handle = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == ERROR_IO_PENDING) /* win2k */,
"Expected ERROR_SUCCESS, got %u\n", GetLastError());
ok(scm_handle != NULL, "Expected success, got error %u\n", GetLastError());
"Expected ERROR_SUCCESS, got %lu\n", GetLastError());
ok(scm_handle != NULL, "Expected success, got error %lu\n", GetLastError());
CloseServiceHandle(scm_handle);
}
......@@ -126,7 +129,7 @@ static void test_open_svc(void)
SetLastError(0xdeadbeef);
svc_handle = OpenServiceA(NULL, NULL, 0);
ok(!svc_handle, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
/* TODO: Add some tests with invalid handles. These produce errors on Windows but crash on Wine */
......@@ -137,7 +140,7 @@ static void test_open_svc(void)
ok(!svc_handle, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS /* W2K, XP, W2K3, Vista */ ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
CloseServiceHandle(scm_handle);
/* Nonexistent service */
......@@ -145,7 +148,7 @@ static void test_open_svc(void)
SetLastError(0xdeadbeef);
svc_handle = OpenServiceA(scm_handle, "deadbeef", GENERIC_READ);
ok(!svc_handle, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
CloseServiceHandle(scm_handle);
/* Proper SCM handle but different access rights */
......@@ -156,7 +159,7 @@ static void test_open_svc(void)
skip("Not enough rights to get a handle to the service\n");
else
{
ok(svc_handle != NULL, "Expected success, got error %u\n", GetLastError());
ok(svc_handle != NULL, "Expected success, got error %lu\n", GetLastError());
CloseServiceHandle(svc_handle);
}
......@@ -180,7 +183,7 @@ static void test_open_svc(void)
SetLastError(0xdeadbeef);
svc_handle = OpenServiceA(scm_handle, displayname, GENERIC_READ);
ok(!svc_handle, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
/* Just in case */
CloseServiceHandle(svc_handle);
......@@ -192,15 +195,14 @@ static void test_create_delete_svc(void)
SC_HANDLE scm_handle, svc_handle1, svc_handle2;
CHAR username[UNLEN + 1], domain[MAX_PATH];
DWORD user_size = UNLEN + 1;
CHAR account[UNLEN + 3];
static const CHAR servicename [] = "Winetest";
CHAR account[MAX_PATH + UNLEN + 1];
static const CHAR servicename [] = "winetest_create_delete";
static const CHAR pathname [] = "we_dont_care.exe";
static const CHAR empty [] = "";
static const CHAR password [] = "secret";
BOOL spooler_exists = FALSE;
char buffer[200];
DWORD size;
BOOL ret;
CHAR display[4096];
DWORD display_size = sizeof(display);
/* Get the username and turn it into an account to be used in some tests */
GetUserNameA(username, &user_size);
......@@ -214,7 +216,7 @@ static void test_create_delete_svc(void)
SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
scm_handle = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
......@@ -224,7 +226,7 @@ static void test_create_delete_svc(void)
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS /* W2K, W2K3, XP, Vista */ ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* Now with a servicename */
SetLastError(0xdeadbeef);
......@@ -232,7 +234,7 @@ static void test_create_delete_svc(void)
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS /* W2K, W2K3, XP, Vista */ ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* Or just a binary name */
SetLastError(0xdeadbeef);
......@@ -240,24 +242,24 @@ static void test_create_delete_svc(void)
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS /* W2K, W2K3, XP, Vista */ ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* Both servicename and binary name (We only have connect rights) */
SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, 0, 0, 0, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_ACCESS_DENIED, "Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
ok(GetLastError() == ERROR_ACCESS_DENIED, "Expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
/* They can even be empty at this stage of parameter checking */
SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(scm_handle, empty, NULL, 0, 0, 0, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_ACCESS_DENIED, "Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
ok(GetLastError() == ERROR_ACCESS_DENIED, "Expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, 0, 0, 0, 0, empty, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_ACCESS_DENIED, "Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
ok(GetLastError() == ERROR_ACCESS_DENIED, "Expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
/* Open the Service Control Manager with minimal rights for creation
* (Verified with 'SC_MANAGER_ALL_ACCESS &~ SC_MANAGER_CREATE_SERVICE')
......@@ -277,17 +279,17 @@ static void test_create_delete_svc(void)
SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(scm_handle, empty, NULL, 0, 0, 0, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_NAME, "Expected ERROR_INVALID_NAME, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_NAME, "Expected ERROR_INVALID_NAME, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, 0, 0, 0, 0, empty, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(scm_handle, empty, NULL, 0, 0, 0, 0, empty, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_NAME, "Expected ERROR_INVALID_NAME, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_NAME, "Expected ERROR_INVALID_NAME, got %ld\n", GetLastError());
/* Valid call (as we will see later) except for the empty binary name (to proof it's indeed
* an ERROR_INVALID_PARAMETER)
......@@ -296,7 +298,7 @@ static void test_create_delete_svc(void)
svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, 0, SERVICE_WIN32_OWN_PROCESS,
SERVICE_DISABLED, 0, empty, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* Windows checks if the 'service type', 'access type' and the combination of them are valid, so let's test that */
......@@ -307,14 +309,14 @@ static void test_create_delete_svc(void)
svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, GENERIC_ALL, SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS,
SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* Illegal (SERVICE_INTERACTIVE_PROCESS is only allowed with SERVICE_WIN32_OWN_PROCESS or SERVICE_WIN32_SHARE_PROCESS) */
SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, GENERIC_ALL, SERVICE_FILE_SYSTEM_DRIVER | SERVICE_INTERACTIVE_PROCESS,
SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* Illegal (this combination is only allowed when the LocalSystem account (ServiceStartName) is used)
* Not having a correct account would have resulted in an ERROR_INVALID_SERVICE_ACCOUNT.
......@@ -324,7 +326,7 @@ static void test_create_delete_svc(void)
SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, account, password);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_INVALID_SERVICE_ACCOUNT,
"Expected ERROR_INVALID_PARAMETER or ERROR_INVALID_SERVICE_ACCOUNT, got %d\n", GetLastError());
"Expected ERROR_INVALID_PARAMETER or ERROR_INVALID_SERVICE_ACCOUNT, got %ld\n", GetLastError());
/* Illegal (start-type is not a mask and should only be one of the possibilities)
* Remark : 'OR'-ing them could result in a valid possibility (but doesn't make sense as
......@@ -334,58 +336,61 @@ static void test_create_delete_svc(void)
svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, GENERIC_ALL, SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START | SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* Illegal (SERVICE_BOOT_START and SERVICE_SYSTEM_START are only allowed for driver services) */
SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, 0, SERVICE_WIN32_OWN_PROCESS,
SERVICE_BOOT_START, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* Test if ServiceType can be a combined one for drivers */
SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, 0, SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER,
SERVICE_BOOT_START, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
/* The service already exists (check first, just in case) */
svc_handle1 = OpenServiceA(scm_handle, spooler, GENERIC_READ);
if (svc_handle1)
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* Test duplicate service names */
svc_handle1 = CreateServiceA(scm_handle, "winetest_dupname", "winetest_display", DELETE,
SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(!!svc_handle1, "Failed to create service, error %lu\n", GetLastError());
svc_handle2 = CreateServiceA(scm_handle, "winetest_dupname", NULL, 0,
SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle2, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_EXISTS, "Got wrong error %lu\n", GetLastError());
svc_handle2 = CreateServiceA(scm_handle, "winetest_dupname2", "winetest_dupname", DELETE,
SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, 0, pathname, NULL, NULL, NULL, NULL, NULL);
todo_wine ok(!svc_handle2, "Expected failure\n");
todo_wine ok(GetLastError() == ERROR_DUPLICATE_SERVICE_NAME, "Got wrong error %lu\n", GetLastError());
if (svc_handle2)
{
spooler_exists = TRUE;
CloseServiceHandle(svc_handle1);
SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(scm_handle, spooler, NULL, 0, SERVICE_WIN32_OWN_PROCESS,
SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_EXISTS, "Expected ERROR_SERVICE_EXISTS, got %d\n", GetLastError());
DeleteService(svc_handle2);
CloseServiceHandle(svc_handle2);
}
else
skip("Spooler service doesn't exist\n");
/* To find an existing displayname we check the 'Spooler' service. Although the registry
* doesn't show DisplayName on NT4, this call will return a displayname which is equal
* to the servicename and can't be used as well for a new displayname.
*/
if (spooler_exists)
svc_handle2 = CreateServiceA(scm_handle, "winetest_dupname2", "winetest_display", DELETE,
SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, 0, pathname, NULL, NULL, NULL, NULL, NULL);
if (svc_handle2) /* Win10 1709+ */
{
ret = GetServiceDisplayNameA(scm_handle, spooler, display, &display_size);
if (!ret)
skip("Could not retrieve a displayname for the Spooler service\n");
else
{
svc_handle1 = CreateServiceA(scm_handle, servicename, display, 0, SERVICE_WIN32_OWN_PROCESS,
SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle1, "Expected failure\n");
ok(GetLastError() == ERROR_DUPLICATE_SERVICE_NAME,
"Expected ERROR_DUPLICATE_SERVICE_NAME, got %d\n", GetLastError());
}
size = sizeof(buffer);
ret = GetServiceKeyNameA(scm_handle, "winetest_display", buffer, &size);
ok(ret, "Failed to get key name, error %lu\n", GetLastError());
ok(!strcmp(buffer, "winetest_dupname"), "Got wrong name \"%s\"\n", buffer);
ret = DeleteService(svc_handle2);
ok(ret, "Failed to delete service, error %lu\n", GetLastError());
CloseServiceHandle(svc_handle2);
}
else
skip("Could not retrieve a displayname (Spooler service doesn't exist)\n");
ok(GetLastError() == ERROR_DUPLICATE_SERVICE_NAME, "Got wrong error %lu\n", GetLastError());
ret = DeleteService(svc_handle1);
ok(ret, "Failed to delete service, error %lu\n", GetLastError());
CloseServiceHandle(svc_handle1);
/* Windows doesn't care about the access rights for creation (which makes
* sense as there is no service yet) as long as there are sufficient
......@@ -394,14 +399,14 @@ static void test_create_delete_svc(void)
SetLastError(0xdeadbeef);
svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, 0, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(svc_handle1 != NULL, "Could not create the service : %d\n", GetLastError());
ok(svc_handle1 != NULL, "Could not create the service : %ld\n", GetLastError());
/* DeleteService however must have proper rights */
SetLastError(0xdeadbeef);
ret = DeleteService(svc_handle1);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_ACCESS_DENIED,
"Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
"Expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
/* Open the service with minimal rights for deletion.
* (Verified with 'SERVICE_ALL_ACCESS &~ DELETE')
......@@ -412,28 +417,22 @@ static void test_create_delete_svc(void)
/* Now that we have the proper rights, we should be able to delete */
SetLastError(0xdeadbeef);
ret = DeleteService(svc_handle1);
ok(ret, "Expected success, got error %u\n", GetLastError());
ok(ret, "Expected success, got error %lu\n", GetLastError());
/* Service is marked for delete, but handle is still open. Try to open service again. */
svc_handle2 = OpenServiceA(scm_handle, servicename, GENERIC_READ);
ok(svc_handle2 != NULL, "got %p, error %u\n", svc_handle2, GetLastError());
ok(svc_handle2 != NULL, "got %p, error %lu\n", svc_handle2, GetLastError());
CloseServiceHandle(svc_handle2);
CloseServiceHandle(svc_handle1);
CloseServiceHandle(scm_handle);
/* Wait a while. One of the following tests also does a CreateService for the
* same servicename and this would result in an ERROR_SERVICE_MARKED_FOR_DELETE
* error if we do this too quickly. Vista seems more picky than the others.
*/
Sleep(1000);
/* And a final NULL check */
SetLastError(0xdeadbeef);
ret = DeleteService(NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE,
"Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
"Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
}
static void test_get_displayname(void)
......@@ -443,11 +442,7 @@ static void test_get_displayname(void)
CHAR displayname[4096];
WCHAR displaynameW[2048];
DWORD displaysize, tempsize, tempsizeW;
static const CHAR deadbeef[] = "Deadbeef";
static const WCHAR spoolerW[] = {'S','p','o','o','l','e','r',0};
static const WCHAR deadbeefW[] = {'D','e','a','d','b','e','e','f',0};
static const WCHAR abcW[] = {'A','B','C',0};
static const CHAR servicename[] = "Winetest";
static const CHAR servicename[] = "winetest_displayname";
static const CHAR pathname[] = "we_dont_care.exe";
/* Having NULL for the size of the buffer will crash on W2K3 */
......@@ -456,7 +451,7 @@ static void test_get_displayname(void)
ret = GetServiceDisplayNameA(NULL, NULL, NULL, &displaysize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE,
"Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
"Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
scm_handle = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
......@@ -465,7 +460,7 @@ static void test_get_displayname(void)
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS /* W2K, XP, W2K3, Vista */ ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
displaysize = sizeof(displayname);
......@@ -473,93 +468,93 @@ static void test_get_displayname(void)
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS /* W2K, XP, W2K3, Vista */ ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* Test for nonexistent service */
SetLastError(0xdeadbeef);
displaysize = -1;
ret = GetServiceDisplayNameA(scm_handle, deadbeef, NULL, &displaysize);
ret = GetServiceDisplayNameA(scm_handle, "Deadbeef", NULL, &displaysize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = GetServiceDisplayNameA(scm_handle, deadbeef, NULL, &displaysize);
ret = GetServiceDisplayNameA(scm_handle, "Deadbeef", NULL, &displaysize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
todo_wine ok(displaysize == 1, "Service size expected 1, got %d\n", displaysize);
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
todo_wine ok(displaysize == 1, "Service size expected 1, got %ld\n", displaysize);
displaysize = 15;
strcpy(displayname, "ABC");
ret = GetServiceDisplayNameA(scm_handle, deadbeef, displayname, &displaysize);
ret = GetServiceDisplayNameA(scm_handle, "Deadbeef", displayname, &displaysize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
todo_wine ok(displaysize == 15, "Service size expected 15, got %d\n", displaysize);
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
todo_wine ok(displaysize == 15, "Service size expected 15, got %ld\n", displaysize);
ok(displayname[0] == 0, "Service name not empty\n");
displaysize = 15;
lstrcpyW( displaynameW, abcW );
ret = GetServiceDisplayNameW(scm_handle, deadbeefW, displaynameW, &displaysize);
wcscpy(displaynameW, L"ABC");
ret = GetServiceDisplayNameW(scm_handle, L"Deadbeef", displaynameW, &displaysize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
ok(displaysize == 15, "Service size expected 15, got %d\n", displaysize);
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
ok(displaysize == 15, "Service size expected 15, got %ld\n", displaysize);
ok(displaynameW[0] == 0, "Service name not empty\n");
displaysize = 0;
strcpy(displayname, "ABC");
ret = GetServiceDisplayNameA(scm_handle, deadbeef, displayname, &displaysize);
ret = GetServiceDisplayNameA(scm_handle, "Deadbeef", displayname, &displaysize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
todo_wine ok(displaysize == 1, "Service size expected 1, got %d\n", displaysize);
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
todo_wine ok(displaysize == 1, "Service size expected 1, got %ld\n", displaysize);
ok(displayname[0] == 'A', "Service name changed\n");
displaysize = 0;
lstrcpyW( displaynameW, abcW );
ret = GetServiceDisplayNameW(scm_handle, deadbeefW, displaynameW, &displaysize);
wcscpy(displaynameW, L"ABC");
ret = GetServiceDisplayNameW(scm_handle, L"Deadbeef", displaynameW, &displaysize);
ok(!ret, "Expected failure\n");
ok(displaysize == 2, "Service size expected 2, got %d\n", displaysize);
ok(displaysize == 2, "Service size expected 2, got %ld\n", displaysize);
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
ok(displaynameW[0] == 'A', "Service name changed\n");
displaysize = 1;
strcpy(displayname, "ABC");
ret = GetServiceDisplayNameA(scm_handle, deadbeef, displayname, &displaysize);
ret = GetServiceDisplayNameA(scm_handle, "Deadbeef", displayname, &displaysize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
todo_wine ok(displaysize == 1, "Service size expected 1, got %d\n", displaysize);
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
todo_wine ok(displaysize == 1, "Service size expected 1, got %ld\n", displaysize);
ok(displayname[0] == 0, "Service name not empty\n");
displaysize = 1;
lstrcpyW( displaynameW, abcW );
ret = GetServiceDisplayNameW(scm_handle, deadbeefW, displaynameW, &displaysize);
wcscpy(displaynameW, L"ABC");
ret = GetServiceDisplayNameW(scm_handle, L"Deadbeef", displaynameW, &displaysize);
ok(!ret, "Expected failure\n");
ok(displaysize == 2, "Service size expected 2, got %d\n", displaysize);
ok(displaysize == 2, "Service size expected 2, got %ld\n", displaysize);
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
ok(displaynameW[0] == 'A', "Service name changed\n");
displaysize = 2;
strcpy(displayname, "ABC");
ret = GetServiceDisplayNameA(scm_handle, deadbeef, displayname, &displaysize);
ret = GetServiceDisplayNameA(scm_handle, "Deadbeef", displayname, &displaysize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
todo_wine ok(displaysize == 2, "Service size expected 2, got %d\n", displaysize);
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
todo_wine ok(displaysize == 2, "Service size expected 2, got %ld\n", displaysize);
ok(displayname[0] == 0, "Service name not empty\n");
displaysize = 2;
lstrcpyW( displaynameW, abcW );
ret = GetServiceDisplayNameW(scm_handle, deadbeefW, displaynameW, &displaysize);
wcscpy(displaynameW, L"ABC");
ret = GetServiceDisplayNameW(scm_handle, L"Deadbeef", displaynameW, &displaysize);
ok(!ret, "Expected failure\n");
ok(displaysize == 2, "Service size expected 2, got %d\n", displaysize);
ok(displaysize == 2, "Service size expected 2, got %ld\n", displaysize);
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
ok(displaynameW[0] == 0, "Service name not empty\n");
/* Check if 'Spooler' exists */
......@@ -578,15 +573,15 @@ static void test_get_displayname(void)
ret = GetServiceDisplayNameA(scm_handle, spooler, NULL, &displaysize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
"Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
tempsize = displaysize;
displaysize = 0;
ret = GetServiceDisplayNameA(scm_handle, spooler, NULL, &displaysize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
ok(displaysize == tempsize, "Buffer size mismatch (%d vs %d)\n", tempsize, displaysize);
"Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
ok(displaysize == tempsize, "Buffer size mismatch (%ld vs %ld)\n", tempsize, displaysize);
/* Buffer is too small */
SetLastError(0xdeadbeef);
......@@ -595,7 +590,7 @@ static void test_get_displayname(void)
ok(!ret, "Expected failure\n");
ok(displaysize == tempsize, "Expected the needed buffersize\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
"Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
/* First try with a buffer that should be big enough to hold
* the ANSI string (and terminating character). This succeeds on Windows
......@@ -604,21 +599,21 @@ static void test_get_displayname(void)
SetLastError(0xdeadbeef);
displaysize = (tempsize / 2) + 1;
ret = GetServiceDisplayNameA(scm_handle, spooler, displayname, &displaysize);
ok(ret, "Expected success, got error %u\n", GetLastError());
ok(ret, "Expected success, got error %lu\n", GetLastError());
ok(displaysize == ((tempsize / 2) + 1), "Expected no change for the needed buffer size\n");
/* Now with the original returned size */
SetLastError(0xdeadbeef);
displaysize = tempsize;
ret = GetServiceDisplayNameA(scm_handle, spooler, displayname, &displaysize);
ok(ret, "Expected success, got error %u\n", GetLastError());
ok(ret, "Expected success, got error %lu\n", GetLastError());
ok(displaysize == tempsize, "Expected no change for the needed buffer size\n");
/* And with a bigger than needed buffer */
SetLastError(0xdeadbeef);
displaysize = tempsize * 2;
ret = GetServiceDisplayNameA(scm_handle, spooler, displayname, &displaysize);
ok(ret, "Expected success, got error %u\n", GetLastError());
ok(ret, "Expected success, got error %lu\n", GetLastError());
/* Test that shows that if the buffersize is enough, it's not changed */
ok(displaysize == tempsize * 2, "Expected no change for the needed buffer size\n");
ok(strlen(displayname) == tempsize/2,
......@@ -627,35 +622,35 @@ static void test_get_displayname(void)
/* Do the buffer(size) tests also for GetServiceDisplayNameW */
SetLastError(0xdeadbeef);
displaysize = -1;
ret = GetServiceDisplayNameW(scm_handle, spoolerW, NULL, &displaysize);
ret = GetServiceDisplayNameW(scm_handle, L"Spooler", NULL, &displaysize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
"Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
/* Buffer is too small */
SetLastError(0xdeadbeef);
tempsizeW = displaysize;
displaysize = tempsizeW / 2;
ret = GetServiceDisplayNameW(scm_handle, spoolerW, displaynameW, &displaysize);
ret = GetServiceDisplayNameW(scm_handle, L"Spooler", displaynameW, &displaysize);
ok(!ret, "Expected failure\n");
ok(displaysize == tempsizeW, "Expected the needed buffersize\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
"Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
/* Now with the original returned size */
SetLastError(0xdeadbeef);
displaysize = tempsizeW;
ret = GetServiceDisplayNameW(scm_handle, spoolerW, displaynameW, &displaysize);
ret = GetServiceDisplayNameW(scm_handle, L"Spooler", displaynameW, &displaysize);
ok(!ret, "Expected failure\n");
ok(displaysize == tempsizeW, "Expected the needed buffersize\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
"Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
/* And with a bigger than needed buffer */
SetLastError(0xdeadbeef);
displaysize = tempsizeW + 1; /* This caters for the null terminating character */
ret = GetServiceDisplayNameW(scm_handle, spoolerW, displaynameW, &displaysize);
ok(ret, "Expected success, got error %u\n", GetLastError());
ret = GetServiceDisplayNameW(scm_handle, L"Spooler", displaynameW, &displaysize);
ok(ret, "Expected success, got error %lu\n", GetLastError());
ok(displaysize == tempsizeW, "Expected the needed buffersize\n");
ok(lstrlenW(displaynameW) == displaysize,
"Expected the buffer to be the length of the string\n") ;
......@@ -679,7 +674,7 @@ static void test_get_displayname(void)
svc_handle = CreateServiceA(scm_handle, servicename, NULL, DELETE,
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(svc_handle != NULL, "Could not create the service : %d\n", GetLastError());
ok(svc_handle != NULL, "Could not create the service : %ld\n", GetLastError());
if (!svc_handle)
{
CloseServiceHandle(scm_handle);
......@@ -694,7 +689,7 @@ static void test_get_displayname(void)
ok(displaysize == strlen(servicename) * 2,
"Expected the displaysize to be twice the size of the servicename\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
"Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
/* Buffer is too small */
SetLastError(0xdeadbeef);
......@@ -704,24 +699,21 @@ static void test_get_displayname(void)
ok(!ret, "Expected failure\n");
ok(displaysize == tempsize, "Expected the needed buffersize\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
"Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
/* Get the displayname */
SetLastError(0xdeadbeef);
ret = GetServiceDisplayNameA(scm_handle, servicename, displayname, &displaysize);
ok(ret, "Expected success, got error %u\n", GetLastError());
ok(ret, "Expected success, got error %lu\n", GetLastError());
ok(!lstrcmpiA(displayname, servicename),
"Expected displayname to be %s, got %s\n", servicename, displayname);
/* Delete the service */
ret = DeleteService(svc_handle);
ok(ret, "Expected success (err=%d)\n", GetLastError());
ok(ret, "Expected success (err=%ld)\n", GetLastError());
CloseServiceHandle(svc_handle);
CloseServiceHandle(scm_handle);
/* Wait a while. Just in case one of the following tests does a CreateService again */
Sleep(1000);
}
static void test_get_servicekeyname(void)
......@@ -733,9 +725,6 @@ static void test_get_servicekeyname(void)
WCHAR displaynameW[4096];
DWORD servicesize, displaysize, tempsize;
BOOL ret;
static const CHAR deadbeef[] = "Deadbeef";
static const WCHAR deadbeefW[] = {'D','e','a','d','b','e','e','f',0};
static const WCHAR abcW[] = {'A','B','C',0};
/* Having NULL for the size of the buffer will crash on W2K3 */
......@@ -743,7 +732,7 @@ static void test_get_servicekeyname(void)
ret = GetServiceKeyNameA(NULL, NULL, NULL, &servicesize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE,
"Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
"Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
scm_handle = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
......@@ -753,8 +742,8 @@ static void test_get_servicekeyname(void)
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS /* W2K, XP, W2K3, Vista */ ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
todo_wine ok(servicesize == 1, "Service size expected 1, got %d\n", servicesize);
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
todo_wine ok(servicesize == 1, "Service size expected 1, got %ld\n", servicesize);
/* Valid handle and buffer but no displayname */
servicesize = 200;
......@@ -763,87 +752,87 @@ static void test_get_servicekeyname(void)
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS /* W2K, XP, W2K3, Vista */ ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
todo_wine ok(servicesize == 200, "Service size expected 1, got %d\n", servicesize);
"Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
todo_wine ok(servicesize == 200, "Service size expected 1, got %ld\n", servicesize);
/* Test for nonexistent displayname */
SetLastError(0xdeadbeef);
ret = GetServiceKeyNameA(scm_handle, deadbeef, NULL, &servicesize);
ret = GetServiceKeyNameA(scm_handle, "Deadbeef", NULL, &servicesize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
todo_wine ok(servicesize == 1, "Service size expected 1, got %d\n", servicesize);
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
todo_wine ok(servicesize == 1, "Service size expected 1, got %ld\n", servicesize);
servicesize = 15;
strcpy(servicename, "ABC");
ret = GetServiceKeyNameA(scm_handle, deadbeef, servicename, &servicesize);
ret = GetServiceKeyNameA(scm_handle, "Deadbeef", servicename, &servicesize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
todo_wine ok(servicesize == 15, "Service size expected 15, got %d\n", servicesize);
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
todo_wine ok(servicesize == 15, "Service size expected 15, got %ld\n", servicesize);
ok(servicename[0] == 0, "Service name not empty\n");
servicesize = 15;
lstrcpyW( servicenameW, abcW );
ret = GetServiceKeyNameW(scm_handle, deadbeefW, servicenameW, &servicesize);
wcscpy(servicenameW, L"ABC");
ret = GetServiceKeyNameW(scm_handle, L"Deadbeef", servicenameW, &servicesize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
ok(servicesize == 15, "Service size expected 15, got %d\n", servicesize);
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
ok(servicesize == 15, "Service size expected 15, got %ld\n", servicesize);
ok(servicenameW[0] == 0, "Service name not empty\n");
servicesize = 0;
strcpy(servicename, "ABC");
ret = GetServiceKeyNameA(scm_handle, deadbeef, servicename, &servicesize);
ret = GetServiceKeyNameA(scm_handle, "Deadbeef", servicename, &servicesize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
todo_wine ok(servicesize == 1, "Service size expected 1, got %d\n", servicesize);
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
todo_wine ok(servicesize == 1, "Service size expected 1, got %ld\n", servicesize);
ok(servicename[0] == 'A', "Service name changed\n");
servicesize = 0;
lstrcpyW( servicenameW, abcW );
ret = GetServiceKeyNameW(scm_handle, deadbeefW, servicenameW, &servicesize);
wcscpy(servicenameW, L"ABC");
ret = GetServiceKeyNameW(scm_handle, L"Deadbeef", servicenameW, &servicesize);
ok(!ret, "Expected failure\n");
ok(servicesize == 2, "Service size expected 2, got %d\n", servicesize);
ok(servicesize == 2, "Service size expected 2, got %ld\n", servicesize);
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
ok(servicenameW[0] == 'A', "Service name changed\n");
servicesize = 1;
strcpy(servicename, "ABC");
ret = GetServiceKeyNameA(scm_handle, deadbeef, servicename, &servicesize);
ret = GetServiceKeyNameA(scm_handle, "Deadbeef", servicename, &servicesize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
todo_wine ok(servicesize == 1, "Service size expected 1, got %d\n", servicesize);
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
todo_wine ok(servicesize == 1, "Service size expected 1, got %ld\n", servicesize);
ok(servicename[0] == 0, "Service name not empty\n");
servicesize = 1;
lstrcpyW( servicenameW, abcW );
ret = GetServiceKeyNameW(scm_handle, deadbeefW, servicenameW, &servicesize);
wcscpy(servicenameW, L"ABC");
ret = GetServiceKeyNameW(scm_handle, L"Deadbeef", servicenameW, &servicesize);
ok(!ret, "Expected failure\n");
ok(servicesize == 2, "Service size expected 2, got %d\n", servicesize);
ok(servicesize == 2, "Service size expected 2, got %ld\n", servicesize);
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
ok(servicenameW[0] == 'A', "Service name changed\n");
servicesize = 2;
strcpy(servicename, "ABC");
ret = GetServiceKeyNameA(scm_handle, deadbeef, servicename, &servicesize);
ret = GetServiceKeyNameA(scm_handle, "Deadbeef", servicename, &servicesize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
todo_wine ok(servicesize == 2, "Service size expected 2, got %d\n", servicesize);
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
todo_wine ok(servicesize == 2, "Service size expected 2, got %ld\n", servicesize);
ok(servicename[0] == 0, "Service name not empty\n");
servicesize = 2;
lstrcpyW( servicenameW, abcW );
ret = GetServiceKeyNameW(scm_handle, deadbeefW, servicenameW, &servicesize);
wcscpy(servicenameW, L"ABC");
ret = GetServiceKeyNameW(scm_handle, L"Deadbeef", servicenameW, &servicesize);
ok(!ret, "Expected failure\n");
ok(servicesize == 2, "Service size expected 2, got %d\n", servicesize);
ok(servicesize == 2, "Service size expected 2, got %ld\n", servicesize);
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
ok(servicenameW[0] == 0, "Service name not empty\n");
/* Check if 'Spooler' exists */
......@@ -865,15 +854,23 @@ static void test_get_servicekeyname(void)
servicesize = 0;
ret = GetServiceKeyNameA(scm_handle, displayname, NULL, &servicesize);
ok(!ret, "Expected failure\n");
if (strcmp(displayname, "Print Spooler") != 0 &&
GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST)
{
win_skip("GetServiceKeyName() does not support localized display names: %s\n", displayname); /* Windows 7 */
CloseServiceHandle(scm_handle);
return; /* All the tests that follow will fail too */
}
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
"Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
/* Valid call with the correct buffersize */
SetLastError(0xdeadbeef);
tempsize = servicesize;
servicesize *= 2;
ret = GetServiceKeyNameA(scm_handle, displayname, servicename, &servicesize);
ok(ret, "Expected success, got error %u\n", GetLastError());
ok(ret, "Expected success, got error %lu\n", GetLastError());
if (ret)
{
ok(strlen(servicename) == tempsize/2,
......@@ -887,7 +884,7 @@ static void test_get_servicekeyname(void)
SetLastError(0xdeadbeef);
servicesize *= 2;
ret = GetServiceKeyNameW(scm_handle, displaynameW, servicenameW, &servicesize);
ok(ret, "Expected success, got error %u\n", GetLastError());
ok(ret, "Expected success, got error %lu\n", GetLastError());
if (ret)
{
ok(strlen(servicename) == tempsize/2,
......@@ -901,7 +898,7 @@ static void test_get_servicekeyname(void)
ret = GetServiceKeyNameW(scm_handle, displaynameW, servicenameW, &servicesize);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
"Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
ok(servicenameW[0] == 0, "Buffer not empty\n");
CloseServiceHandle(scm_handle);
......@@ -920,7 +917,7 @@ static void test_query_svc(void)
ret = QueryServiceStatus(NULL, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE,
"Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
"Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
scm_handle = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
......@@ -940,13 +937,13 @@ static void test_query_svc(void)
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Unexpected last error %d\n", GetLastError());
"Unexpected last error %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = QueryServiceStatus(svc_handle, &status);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_ACCESS_DENIED,
"Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
"Expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
/* Open the service with just enough rights.
* (Verified with 'SERVICE_ALL_ACCESS &~ SERVICE_QUERY_STATUS')
......@@ -956,7 +953,7 @@ static void test_query_svc(void)
SetLastError(0xdeadbeef);
ret = QueryServiceStatus(svc_handle, &status);
ok(ret, "Expected success, got error %u\n", GetLastError());
ok(ret, "Expected success, got error %lu\n", GetLastError());
CloseServiceHandle(svc_handle);
......@@ -976,7 +973,7 @@ static void test_query_svc(void)
ret = pQueryServiceStatusEx(NULL, 1, NULL, 0, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_LEVEL,
"Expected ERROR_INVALID_LEVEL, got %d\n", GetLastError());
"Expected ERROR_INVALID_LEVEL, got %ld\n", GetLastError());
/* Passing a NULL parameter for the needed buffer size
* will crash on anything but NT4.
......@@ -990,20 +987,20 @@ static void test_query_svc(void)
{
ok(!ret, "Expected failure\n");
ok(needed == sizeof(SERVICE_STATUS_PROCESS),
"Needed buffersize is wrong : %d\n", needed);
"Needed buffersize is wrong : %ld\n", needed);
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
"Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
}
/* Pass a correct buffer and buffersize but a NULL handle */
statusproc = HeapAlloc(GetProcessHeap(), 0, sizeof(SERVICE_STATUS_PROCESS));
statusproc = malloc(sizeof(SERVICE_STATUS_PROCESS));
bufsize = needed;
SetLastError(0xdeadbeef);
ret = pQueryServiceStatusEx(NULL, SC_STATUS_PROCESS_INFO, (BYTE*)statusproc, bufsize, &needed);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE,
"Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
HeapFree(GetProcessHeap(), 0, statusproc);
"Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
free(statusproc);
/* Correct handle and info level */
SetLastError(0xdeadbeef);
......@@ -1013,31 +1010,31 @@ static void test_query_svc(void)
{
ok(!ret, "Expected failure\n");
ok(needed == sizeof(SERVICE_STATUS_PROCESS),
"Needed buffersize is wrong : %d\n", needed);
"Needed buffersize is wrong : %ld\n", needed);
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
"Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
}
/* All parameters are OK but we don't have enough rights */
statusproc = HeapAlloc(GetProcessHeap(), 0, sizeof(SERVICE_STATUS_PROCESS));
statusproc = malloc(sizeof(SERVICE_STATUS_PROCESS));
bufsize = sizeof(SERVICE_STATUS_PROCESS);
SetLastError(0xdeadbeef);
ret = pQueryServiceStatusEx(svc_handle, SC_STATUS_PROCESS_INFO, (BYTE*)statusproc, bufsize, &needed);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_ACCESS_DENIED,
"Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
HeapFree(GetProcessHeap(), 0, statusproc);
"Expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
free(statusproc);
/* Open the service with just enough rights. */
CloseServiceHandle(svc_handle);
svc_handle = OpenServiceA(scm_handle, spooler, SERVICE_QUERY_STATUS);
/* Everything should be fine now. */
statusproc = HeapAlloc(GetProcessHeap(), 0, sizeof(SERVICE_STATUS_PROCESS));
statusproc = malloc(sizeof(SERVICE_STATUS_PROCESS));
bufsize = sizeof(SERVICE_STATUS_PROCESS);
SetLastError(0xdeadbeef);
ret = pQueryServiceStatusEx(svc_handle, SC_STATUS_PROCESS_INFO, (BYTE*)statusproc, bufsize, &needed);
ok(ret, "Expected success, got error %u\n", GetLastError());
ok(ret, "Expected success, got error %lu\n", GetLastError());
if (statusproc->dwCurrentState == SERVICE_RUNNING)
ok(statusproc->dwProcessId != 0,
"Expect a process id for this running service\n");
......@@ -1050,25 +1047,24 @@ static void test_query_svc(void)
ret = pQueryServiceStatusEx(svc_handle, SC_STATUS_PROCESS_INFO, (BYTE*)statusproc, bufsize, NULL);
ok(!ret, "Expected failure\n");
ok(broken(GetLastError() == ERROR_INVALID_PARAMETER) /* NT4 */ ||
GetLastError() == ERROR_INVALID_ADDRESS, "got %d\n", GetLastError());
GetLastError() == ERROR_INVALID_ADDRESS, "got %ld\n", GetLastError());
HeapFree(GetProcessHeap(), 0, statusproc);
free(statusproc);
CloseServiceHandle(svc_handle);
CloseServiceHandle(scm_handle);
}
static void test_enum_svc(void)
static BOOL test_enum_svc(int attempt)
{
SC_HANDLE scm_handle;
BOOL ret;
BOOL ret, alldone = FALSE;
DWORD bufsize, needed, returned, resume;
DWORD neededW, returnedW;
DWORD neededA, returnedA;
DWORD tempneeded, tempreturned, missing;
DWORD servicecountactive, servicecountinactive;
ENUM_SERVICE_STATUSA *services;
ENUM_SERVICE_STATUSW *servicesW;
ENUM_SERVICE_STATUS_PROCESSA *exservices;
ENUM_SERVICE_STATUSA *servicesA;
ENUM_SERVICE_STATUSW *services;
UINT i;
/* All NULL or wrong */
......@@ -1076,13 +1072,13 @@ static void test_enum_svc(void)
ret = EnumServicesStatusA(NULL, 1, 0, NULL, 0, NULL, NULL, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE,
"Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
"Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = EnumServicesStatusW(NULL, 1, 0, NULL, 0, NULL, NULL, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE,
"Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
"Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
/* Open the service control manager with not enough rights at first */
scm_handle = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
......@@ -1093,14 +1089,14 @@ static void test_enum_svc(void)
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Unexpected last error %d\n", GetLastError());
"Unexpected last error %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = EnumServicesStatusW(scm_handle, 1, 0, NULL, 0, NULL, NULL, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Unexpected last error %d\n", GetLastError());
"Unexpected last error %ld\n", GetLastError());
/* Don't specify the two required pointers */
returned = 0xdeadbeef;
......@@ -1110,7 +1106,7 @@ static void test_enum_svc(void)
ok(returned == 0xdeadbeef, "Expected no change to the number of services variable\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Unexpected last error %d\n", GetLastError());
"Unexpected last error %ld\n", GetLastError());
returned = 0xdeadbeef;
SetLastError(0xdeadbeef);
......@@ -1119,7 +1115,7 @@ static void test_enum_svc(void)
ok(returned == 0xdeadbeef, "Expected no change to the number of services variable\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Unexpected last error %d\n", GetLastError());
"Unexpected last error %ld\n", GetLastError());
/* Don't specify the two required pointers */
needed = 0xdeadbeef;
......@@ -1130,7 +1126,7 @@ static void test_enum_svc(void)
"Expected no change to the needed buffer variable\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Unexpected last error %d\n", GetLastError());
"Unexpected last error %ld\n", GetLastError());
needed = 0xdeadbeef;
SetLastError(0xdeadbeef);
......@@ -1140,7 +1136,7 @@ static void test_enum_svc(void)
"Expected no change to the needed buffer variable\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Unexpected last error %d\n", GetLastError());
"Unexpected last error %ld\n", GetLastError());
/* No valid servicetype and servicestate */
needed = 0xdeadbeef;
......@@ -1149,10 +1145,10 @@ static void test_enum_svc(void)
ret = EnumServicesStatusA(scm_handle, 0, 0, NULL, 0, &needed, &returned, NULL);
ok(!ret, "Expected failure\n");
ok(needed == 0 || broken(needed != 0), /* nt4 */
"Expected needed buffer size to be set to 0, got %d\n", needed);
ok(returned == 0, "Expected number of services to be set to 0, got %d\n", returned);
"Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(returned == 0, "Expected number of services to be set to 0, got %ld\n", returned);
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
needed = 0xdeadbeef;
returned = 0xdeadbeef;
......@@ -1160,11 +1156,11 @@ static void test_enum_svc(void)
ret = EnumServicesStatusW(scm_handle, 0, 0, NULL, 0, &needed, &returned, NULL);
ok(!ret, "Expected failure\n");
ok(needed == 0 || broken(needed != 0), /* nt4 */
"Expected needed buffer size to be set to 0, got %d\n", needed);
"Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(returned == 0 || broken(returned != 0), /* nt4 */
"Expected number of services to be set to 0, got %d\n", returned);
"Expected number of services to be set to 0, got %ld\n", returned);
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* No valid servicestate */
needed = 0xdeadbeef;
......@@ -1173,10 +1169,10 @@ static void test_enum_svc(void)
ret = EnumServicesStatusA(scm_handle, SERVICE_WIN32, 0, NULL, 0, &needed, &returned, NULL);
ok(!ret, "Expected failure\n");
ok(needed == 0 || broken(needed != 0), /* nt4 */
"Expected needed buffer size to be set to 0, got %d\n", needed);
ok(returned == 0, "Expected number of services to be set to 0, got %d\n", returned);
"Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(returned == 0, "Expected number of services to be set to 0, got %ld\n", returned);
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
needed = 0xdeadbeef;
returned = 0xdeadbeef;
......@@ -1184,11 +1180,11 @@ static void test_enum_svc(void)
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, 0, NULL, 0, &needed, &returned, NULL);
ok(!ret, "Expected failure\n");
ok(needed == 0 || broken(needed != 0), /* nt4 */
"Expected needed buffer size to be set to 0, got %d\n", needed);
"Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(returned == 0 || broken(returned != 0), /* nt4 */
"Expected number of services to be set to 0, got %d\n", returned);
"Expected number of services to be set to 0, got %ld\n", returned);
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* No valid servicetype */
needed = 0xdeadbeef;
......@@ -1197,10 +1193,10 @@ static void test_enum_svc(void)
ret = EnumServicesStatusA(scm_handle, 0, SERVICE_STATE_ALL, NULL, 0, &needed, &returned, NULL);
ok(!ret, "Expected failure\n");
ok(needed == 0 || broken(needed != 0), /* nt4 */
"Expected needed buffer size to be set to 0, got %d\n", needed);
ok(returned == 0, "Expected number of services to be set to 0, got %d\n", returned);
"Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(returned == 0, "Expected number of services to be set to 0, got %ld\n", returned);
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
needed = 0xdeadbeef;
returned = 0xdeadbeef;
......@@ -1208,11 +1204,11 @@ static void test_enum_svc(void)
ret = EnumServicesStatusW(scm_handle, 0, SERVICE_STATE_ALL, NULL, 0, &needed, &returned, NULL);
ok(!ret, "Expected failure\n");
ok(needed == 0 || broken(needed != 0), /* nt4 */
"Expected needed buffer size to be set to 0, got %d\n", needed);
"Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(returned == 0 || broken(returned != 0), /* nt4 */
"Expected number of services to be set to 0, got %d\n", returned);
"Expected number of services to be set to 0, got %ld\n", returned);
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* All parameters are correct but our access rights are wrong */
needed = 0xdeadbeef;
......@@ -1221,22 +1217,22 @@ static void test_enum_svc(void)
ret = EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL, NULL, 0, &needed, &returned, NULL);
ok(!ret, "Expected failure\n");
ok(needed == 0 || broken(needed != 0), /* nt4 */
"Expected needed buffer size to be set to 0, got %d\n", needed);
ok(returned == 0, "Expected number of services to be set to 0, got %d\n", returned);
"Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(returned == 0, "Expected number of services to be set to 0, got %ld\n", returned);
ok(GetLastError() == ERROR_ACCESS_DENIED,
"Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
"Expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
needed = 0xdeadbeef;
returned = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL, NULL, 0, &needed, &returned, NULL);
ret = EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL, NULL, 0, &needed, &returned, NULL);
ok(!ret, "Expected failure\n");
ok(needed == 0 || broken(needed != 0), /* nt4 */
"Expected needed buffer size to be set to 0, got %d\n", needed);
"Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(returned == 0 || broken(returned != 0), /* nt4 */
"Expected number of services to be set to 0, got %d\n", returned);
"Expected number of services to be set to 0, got %ld\n", returned);
ok(GetLastError() == ERROR_ACCESS_DENIED,
"Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
"Expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
/* Open the service control manager with the needed rights */
CloseServiceHandle(scm_handle);
......@@ -1246,84 +1242,113 @@ static void test_enum_svc(void)
needed = 0xdeadbeef;
returned = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL, NULL, 0, &needed, &returned, NULL);
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL, NULL, 0, &needed, &returned, NULL);
ok(!ret, "Expected failure\n");
ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size for this one service\n");
ok(returned == 0, "Expected no service returned, got %d\n", returned);
ok(returned == 0, "Expected no service returned, got %ld\n", returned);
ok(GetLastError() == ERROR_MORE_DATA,
"Expected ERROR_MORE_DATA, got %d\n", GetLastError());
"Expected ERROR_MORE_DATA, got %ld\n", GetLastError());
/* Test to show we get the same needed buffer size for the W-call */
neededW = 0xdeadbeef;
returnedW = 0xdeadbeef;
/* Test to show we get the same needed buffer size for the A-call */
neededA = 0xdeadbeef;
returnedA = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL, NULL, 0, &neededW, &returnedW, NULL);
ret = EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL, NULL, 0, &neededA, &returnedA, NULL);
ok(!ret, "Expected failure\n");
ok(neededW != 0xdeadbeef && neededW > 0, "Expected the needed buffer size for this one service\n");
ok(neededW == needed, "Expected needed buffersize to be the same for A- and W-calls\n");
ok(returnedW == 0, "Expected no service returned, got %d\n", returnedW);
ok(GetLastError() == ERROR_MORE_DATA,
"Expected ERROR_MORE_DATA, got %d\n", GetLastError());
"Expected ERROR_MORE_DATA, got %ld\n", GetLastError());
ok(neededA != 0xdeadbeef && neededA > 0, "Expected the needed buffer size for this one service\n");
ok(returnedA == 0, "Expected no service returned, got %ld\n", returnedA);
if (neededA != needed && attempt)
goto retry; /* service start|stop race condition */
ok(neededA == needed, "Expected needed buffersize to be the same for A- and W-calls\n");
/* Store the needed bytes */
tempneeded = needed;
/* Allocate the correct needed bytes */
services = HeapAlloc(GetProcessHeap(), 0, needed);
services = malloc(needed);
bufsize = needed;
needed = 0xdeadbeef;
returned = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
services, bufsize, &needed, &returned, NULL);
ok(ret, "Expected success, got error %u\n", GetLastError());
free(services);
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
goto retry; /* service start race condition */
ok(ret, "Expected success, got error %lu\n", GetLastError());
ok(needed == 0, "Expected needed buffer to be 0 as we are done\n");
ok(returned != 0xdeadbeef && returned > 0, "Expected some returned services\n");
HeapFree(GetProcessHeap(), 0, services);
/* Store the number of returned services */
tempreturned = returned;
servicesW = HeapAlloc(GetProcessHeap(), 0, neededW);
bufsize = neededW;
neededW = 0xdeadbeef;
returnedW = 0xdeadbeef;
servicesA = malloc(neededA);
bufsize = neededA;
neededA = 0xdeadbeef;
returnedA = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
servicesW, bufsize, &neededW, &returnedW, NULL);
ok(ret, "Expected success, got error %u\n", GetLastError());
ok(neededW == 0, "Expected needed buffer to be 0 as we are done\n");
ok(returnedW != 0xdeadbeef && returnedW > 0, "Expected some returned services\n");
HeapFree(GetProcessHeap(), 0, servicesW);
/* Allocate less than the needed bytes and don't specify a resume handle */
services = HeapAlloc(GetProcessHeap(), 0, tempneeded);
bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUSA);
ret = EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
servicesA, bufsize, &neededA, &returnedA, NULL);
free(servicesA);
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
goto retry; /* service start race condition */
if (!ret && GetLastError() == ERROR_NOT_ENOUGH_MEMORY && GetACP() == CP_UTF8)
win_skip("Skipping some tests due to EnumServicesStatusA()'s broken UTF-8 support\n");
else
{
ok(ret, "Expected success, got error %lu\n", GetLastError());
ok(neededA == 0, "Expected needed buffer to be 0 as we are done\n");
ok(returnedA != 0xdeadbeef && returnedA > 0, "Expected some returned services\n");
}
/* Allocate less than the needed bytes and don't specify a resume handle.
* More than one service will be missing because of the space needed for
* the strings.
*/
services = malloc(tempneeded);
bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUSW);
needed = 0xdeadbeef;
returned = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
services, bufsize, &needed, &returned, NULL);
if (ret && needed == 0 && attempt)
{
free(services);
goto retry; /* service stop race condition */
}
ok(!ret, "Expected failure\n");
ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size for this one service\n");
ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size\n");
todo_wine ok(needed < tempneeded, "Expected a smaller needed buffer size for the missing services\n");
/* Experiments show bufsize + needed < tempneeded which proves the needed
* buffer size is an approximation. So it's best not to probe more.
*/
ok(returned < tempreturned, "Expected fewer services to be returned\n");
ok(GetLastError() == ERROR_MORE_DATA,
"Expected ERROR_MORE_DATA, got %d\n", GetLastError());
"Expected ERROR_MORE_DATA, got %ld\n", GetLastError());
/* Allocate less than the needed bytes, this time with a correct resume handle */
bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUSA);
bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUSW);
needed = 0xdeadbeef;
returned = 0xdeadbeef;
resume = 0;
SetLastError(0xdeadbeef);
ret = EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
services, bufsize, &needed, &returned, &resume);
if (ret && needed == 0 && attempt)
{
free(services);
goto retry; /* service stop race condition */
}
ok(!ret, "Expected failure\n");
ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size for this one service\n");
ok(returned < tempreturned, "Expected fewer services to be returned\n");
ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size for the missing services, got %lx\n", needed);
todo_wine ok(needed < tempneeded, "Expected < %lu bytes needed for the remaining services, got %lu\n", tempneeded, needed);
ok(returned < tempreturned, "Expected < %lu remaining services, got %lu\n", tempreturned, returned);
todo_wine ok(resume, "Expected a resume handle\n");
ok(GetLastError() == ERROR_MORE_DATA,
"Expected ERROR_MORE_DATA, got %d\n", GetLastError());
"Expected ERROR_MORE_DATA, got %ld\n", GetLastError());
/* Fetch the missing services but pass a bigger buffer size */
missing = tempreturned - returned;
......@@ -1331,13 +1356,17 @@ static void test_enum_svc(void)
needed = 0xdeadbeef;
returned = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
services, bufsize, &needed, &returned, &resume);
ok(ret, "Expected success, got error %u\n", GetLastError());
ok(needed == 0, "Expected needed buffer to be 0 as we are done\n");
ok(returned == missing, "Expected %u services to be returned\n", missing);
free(services);
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
goto retry; /* service start race condition */
ok(ret, "Expected success, got error %lu\n", GetLastError());
ok(needed == 0, "Expected 0 needed bytes as we are done, got %lu\n", needed);
if (returned < missing && strcmp(winetest_platform, "wine") && attempt)
goto retry; /* service stop race condition */
todo_wine ok(returned == missing, "Expected %lu remaining services, got %lu\n", missing, returned);
ok(resume == 0, "Expected the resume handle to be 0\n");
HeapFree(GetProcessHeap(), 0, services);
/* See if things add up */
......@@ -1352,47 +1381,59 @@ static void test_enum_svc(void)
*/
/* Get the number of active win32 services */
EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_ACTIVE, NULL, 0,
EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_ACTIVE, NULL, 0,
&needed, &returned, NULL);
services = HeapAlloc(GetProcessHeap(), 0, needed);
EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_ACTIVE, services,
needed, &needed, &returned, NULL);
HeapFree(GetProcessHeap(), 0, services);
services = malloc(needed);
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_ACTIVE,
services, needed, &needed, &returned, NULL);
free(services);
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
goto retry; /* service start race condition */
servicecountactive = returned;
/* Get the number of inactive win32 services */
EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_INACTIVE, NULL, 0,
EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_INACTIVE, NULL, 0,
&needed, &returned, NULL);
services = HeapAlloc(GetProcessHeap(), 0, needed);
EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_INACTIVE, services,
needed, &needed, &returned, NULL);
HeapFree(GetProcessHeap(), 0, services);
services = malloc(needed);
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_INACTIVE,
services, needed, &needed, &returned, NULL);
free(services);
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
goto retry; /* service start race condition */
servicecountinactive = returned;
/* Get the number of win32 services */
EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL, NULL, 0,
EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL, NULL, 0,
&needed, &returned, NULL);
services = HeapAlloc(GetProcessHeap(), 0, needed);
EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL, services,
needed, &needed, &returned, NULL);
HeapFree(GetProcessHeap(), 0, services);
services = malloc(needed);
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
services, needed, &needed, &returned, NULL);
free(services);
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
goto retry; /* service start race condition */
/* Check if total is the same as active and inactive win32 services */
ok(returned == (servicecountactive + servicecountinactive),
"Something wrong in the calculation\n");
if (returned != servicecountactive + servicecountinactive && attempt)
goto retry; /* service start|stop race condition */
ok(returned == servicecountactive + servicecountinactive,
"Expected service count %ld == %ld + %ld\n",
returned, servicecountactive, servicecountinactive);
/* Get all drivers and services
*
* Fetch the status of the last call as failing could make the following tests crash
* on Wine (we don't return anything yet).
*/
EnumServicesStatusA(scm_handle, SERVICE_DRIVER | SERVICE_WIN32, SERVICE_STATE_ALL,
EnumServicesStatusW(scm_handle, SERVICE_DRIVER | SERVICE_WIN32, SERVICE_STATE_ALL,
NULL, 0, &needed, &returned, NULL);
services = HeapAlloc(GetProcessHeap(), 0, needed);
ret = EnumServicesStatusA(scm_handle, SERVICE_DRIVER | SERVICE_WIN32, SERVICE_STATE_ALL,
services = malloc(needed);
ret = EnumServicesStatusW(scm_handle, SERVICE_DRIVER | SERVICE_WIN32, SERVICE_STATE_ALL,
services, needed, &needed, &returned, NULL);
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
goto retry; /* service start race condition */
ok(ret, "Expected success %lu\n", GetLastError());
/* Loop through all those returned drivers and services */
for (i = 0; ret && i < returned; i++)
......@@ -1401,31 +1442,70 @@ static void test_enum_svc(void)
/* lpServiceName and lpDisplayName should always be filled */
ok(services[i].lpServiceName[0], "Expected a service name\n");
ok(services[i].lpDisplayName[0], "Expected a display name\n");
ok(services[i].lpDisplayName && services[i].lpDisplayName[0], "Expected a display name\n");
/* Decrement the counters to see if the functions calls return the same
* numbers as the contents of these structures.
*/
if (status.dwServiceType & (SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS))
{
if (status.dwCurrentState == SERVICE_STOPPED)
servicecountinactive--;
else
switch (status.dwCurrentState)
{
case SERVICE_START_PENDING:
case SERVICE_STOP_PENDING:
case SERVICE_PAUSE_PENDING:
case SERVICE_PAUSED:
case SERVICE_CONTINUE_PENDING:
trace("Got state %lx for service %s\n", status.dwCurrentState,
wine_dbgstr_w(services[i].lpServiceName));
/* fall through */
case SERVICE_RUNNING:
servicecountactive--;
break;
case SERVICE_STOPPED:
servicecountinactive--;
break;
default:
ok(0, "Got unknown state %lx for service %s\n",
status.dwCurrentState, wine_dbgstr_w(services[i].lpServiceName));
break;
}
}
}
HeapFree(GetProcessHeap(), 0, services);
free(services);
ok(servicecountactive == 0, "Active services mismatch %u\n", servicecountactive);
ok(servicecountinactive == 0, "Inactive services mismatch %u\n", servicecountinactive);
if ((servicecountactive || servicecountinactive) && attempt)
goto retry; /* service start|stop race condition */
ok(servicecountactive == 0, "Active services mismatch %lu\n", servicecountactive);
ok(servicecountinactive == 0, "Inactive services mismatch %lu\n", servicecountinactive);
alldone = TRUE;
retry:
CloseServiceHandle(scm_handle);
return alldone;
}
static BOOL test_enum_svc_ex(int attempt)
{
SC_HANDLE scm_handle;
BOOL ret, alldone = FALSE;
DWORD bufsize, needed, returned, resume;
DWORD neededA, returnedA;
DWORD tempneeded, tempreturned, missing;
DWORD servicecountactive, servicecountinactive;
ENUM_SERVICE_STATUSW *services;
ENUM_SERVICE_STATUS_PROCESSW *exservices;
UINT i;
/* More or less the same for EnumServicesStatusExA */
if (!pEnumServicesStatusExA)
{
win_skip( "EnumServicesStatusExA not available\n" );
return;
return TRUE;
}
/* All NULL or wrong */
......@@ -1433,14 +1513,14 @@ static void test_enum_svc(void)
ret = pEnumServicesStatusExA(NULL, 1, 0, 0, NULL, 0, NULL, NULL, NULL, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_LEVEL,
"Expected ERROR_INVALID_LEVEL, got %d\n", GetLastError());
"Expected ERROR_INVALID_LEVEL, got %ld\n", GetLastError());
/* All NULL or wrong, just the info level is correct */
SetLastError(0xdeadbeef);
ret = pEnumServicesStatusExA(NULL, 0, 0, 0, NULL, 0, NULL, NULL, NULL, NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE,
"Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
"Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
/* Open the service control manager with not enough rights at first */
scm_handle = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
......@@ -1451,7 +1531,7 @@ static void test_enum_svc(void)
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Unexpected last error %d\n", GetLastError());
"Unexpected last error %ld\n", GetLastError());
/* Don't specify the two required pointers */
needed = 0xdeadbeef;
......@@ -1462,7 +1542,7 @@ static void test_enum_svc(void)
"Expected no change to the needed buffer variable\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Unexpected last error %d\n", GetLastError());
"Unexpected last error %ld\n", GetLastError());
/* Don't specify the two required pointers */
returned = 0xdeadbeef;
......@@ -1472,7 +1552,7 @@ static void test_enum_svc(void)
ok(returned == 0xdeadbeef, "Expected no change to the number of services variable\n");
ok(GetLastError() == ERROR_INVALID_ADDRESS ||
GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */,
"Unexpected last error %d\n", GetLastError());
"Unexpected last error %ld\n", GetLastError());
/* No valid servicetype and servicestate */
needed = 0xdeadbeef;
......@@ -1480,11 +1560,11 @@ static void test_enum_svc(void)
SetLastError(0xdeadbeef);
ret = pEnumServicesStatusExA(scm_handle, 0, 0, 0, NULL, 0, &needed, &returned, NULL, NULL);
ok(!ret, "Expected failure\n");
ok(returned == 0, "Expected number of service to be set to 0, got %d\n", returned);
ok(returned == 0, "Expected number of service to be set to 0, got %ld\n", returned);
ok(needed == 0 || broken(needed != 0), /* nt4 */
"Expected needed buffer size to be set to 0, got %d\n", needed);
"Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* No valid servicestate */
needed = 0xdeadbeef;
......@@ -1493,11 +1573,11 @@ static void test_enum_svc(void)
ret = pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, 0, NULL, 0,
&needed, &returned, NULL, NULL);
ok(!ret, "Expected failure\n");
ok(returned == 0, "Expected number of service to be set to 0, got %d\n", returned);
ok(returned == 0, "Expected number of service to be set to 0, got %ld\n", returned);
ok(needed == 0 || broken(needed != 0), /* nt4 */
"Expected needed buffer size to be set to 0, got %d\n", needed);
"Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* No valid servicetype */
needed = 0xdeadbeef;
......@@ -1506,11 +1586,11 @@ static void test_enum_svc(void)
ret = pEnumServicesStatusExA(scm_handle, 0, 0, SERVICE_STATE_ALL, NULL, 0,
&needed, &returned, NULL, NULL);
ok(!ret, "Expected failure\n");
ok(returned == 0, "Expected number of service to be set to 0, got %d\n", returned);
ok(returned == 0, "Expected number of service to be set to 0, got %ld\n", returned);
ok(needed == 0 || broken(needed != 0), /* nt4 */
"Expected needed buffer size to be set to 0, got %d\n", needed);
"Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* No valid servicetype and servicestate and unknown service group */
needed = 0xdeadbeef;
......@@ -1519,11 +1599,11 @@ static void test_enum_svc(void)
ret = pEnumServicesStatusExA(scm_handle, 0, 0, 0, NULL, 0, &needed,
&returned, NULL, "deadbeef_group");
ok(!ret, "Expected failure\n");
ok(returned == 0, "Expected number of service to be set to 0, got %d\n", returned);
ok(returned == 0, "Expected number of service to be set to 0, got %ld\n", returned);
ok(needed == 0 || broken(needed != 0), /* nt4 */
"Expected needed buffer size to be set to 0, got %d\n", needed);
"Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
"Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
/* All parameters are correct but our access rights are wrong */
needed = 0xdeadbeef;
......@@ -1533,10 +1613,10 @@ static void test_enum_svc(void)
NULL, 0, &needed, &returned, NULL, NULL);
ok(!ret, "Expected failure\n");
ok(needed == 0 || broken(needed != 0), /* nt4 */
"Expected needed buffer size to be set to 0, got %d\n", needed);
ok(returned == 0, "Expected number of service to be set to 0, got %d\n", returned);
"Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(returned == 0, "Expected number of service to be set to 0, got %ld\n", returned);
ok(GetLastError() == ERROR_ACCESS_DENIED,
"Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
"Expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
/* All parameters are correct, access rights are wrong but the
* group name won't be checked yet.
......@@ -1548,10 +1628,10 @@ static void test_enum_svc(void)
NULL, 0, &needed, &returned, NULL, "deadbeef_group");
ok(!ret, "Expected failure\n");
ok(needed == 0 || broken(needed != 0), /* nt4 */
"Expected needed buffer size to be set to 0, got %d\n", needed);
ok(returned == 0, "Expected number of service to be set to 0, got %d\n", returned);
"Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(returned == 0, "Expected number of service to be set to 0, got %ld\n", returned);
ok(GetLastError() == ERROR_ACCESS_DENIED,
"Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
"Expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
/* Open the service control manager with the needed rights */
CloseServiceHandle(scm_handle);
......@@ -1561,13 +1641,13 @@ static void test_enum_svc(void)
needed = 0xdeadbeef;
returned = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
NULL, 0, &needed, &returned, NULL, "deadbeef_group");
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
NULL, 0, &needed, &returned, NULL, L"deadbeef_group");
ok(!ret, "Expected failure\n");
ok(returned == 0, "Expected number of service to be set to 0, got %d\n", returned);
ok(needed == 0, "Expected needed buffer size to be set to 0, got %d\n", needed);
ok(returned == 0, "Expected number of service to be set to 0, got %ld\n", returned);
ok(needed == 0, "Expected needed buffer size to be set to 0, got %ld\n", needed);
ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST,
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
"Expected ERROR_SERVICE_DOES_NOT_EXIST, got %ld\n", GetLastError());
/* TODO: Create a test that makes sure we enumerate all services that don't
* belong to a group. (specifying "").
......@@ -1577,125 +1657,185 @@ static void test_enum_svc(void)
needed = 0xdeadbeef;
returned = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
NULL, 0, &needed, &returned, NULL, NULL);
ok(!ret, "Expected failure\n");
ok(returned == 0, "Expected no service returned, got %d\n", returned);
ok(returned == 0, "Expected no service returned, got %ld\n", returned);
ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size\n");
ok(GetLastError() == ERROR_MORE_DATA,
"Expected ERROR_MORE_DATA, got %d\n", GetLastError());
"Expected ERROR_MORE_DATA, got %ld\n", GetLastError());
/* Test to show we get the same needed buffer size for the W-call */
neededW = 0xdeadbeef;
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
NULL, 0, &neededW, &returnedW, NULL, NULL);
/* Test to show we get the same needed buffer size for the A-call */
neededA = 0xdeadbeef;
returnedA = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
NULL, 0, &neededA, &returnedA, NULL, NULL);
ok(!ret, "Expected failure\n");
ok(neededW == needed, "Expected needed buffersize to be the same for A- and W-calls\n");
ok(GetLastError() == ERROR_MORE_DATA,
"Expected ERROR_MORE_DATA, got %ld\n", GetLastError());
ok(neededA != 0xdeadbeef && neededA > 0, "Expected the needed buffer size for this one service\n");
ok(returnedA == 0, "Expected no service returned, got %ld\n", returnedA);
if (neededA != needed && attempt)
goto retry; /* service start|stop race condition */
ok(neededA == needed, "Expected needed buffersize to be the same for A- and W-calls\n");
ok(GetLastError() == ERROR_MORE_DATA,
"Expected ERROR_MORE_DATA, got %ld\n", GetLastError());
/* Store the needed bytes */
tempneeded = needed;
/* Show the Ex call returns the same service count as the regular enum */
EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
NULL, 0, &needed, &returned, NULL);
services = malloc(needed);
returned = 0xdeadbeef;
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
services, needed, &needed, &returned, NULL);
free(services);
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
goto retry; /* service start race condition */
ok(ret, "Expected success, got error %lu\n", GetLastError());
ok(needed == 0, "Expected needed buffer to be 0 as we are done\n");
ok(returned != 0xdeadbeef && returned > 0, "Expected some returned services\n");
/* Store the number of returned services */
tempreturned = returned;
/* Allocate the correct needed bytes */
exservices = HeapAlloc(GetProcessHeap(), 0, needed);
bufsize = needed;
exservices = malloc(tempneeded);
bufsize = tempneeded;
needed = 0xdeadbeef;
returned = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
(BYTE*)exservices, bufsize, &needed, &returned, NULL, NULL);
ok(ret, "Expected success, got error %u\n", GetLastError());
free(exservices);
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
goto retry; /* service start race condition */
ok(ret, "Expected success, got error %lu\n", GetLastError());
ok(needed == 0, "Expected needed buffer to be 0 as we are done\n");
ok(returned == tempreturned, "Expected the same number of service from this function\n");
HeapFree(GetProcessHeap(), 0, exservices);
/* Store the number of returned services */
tempreturned = returned;
/* Allocate less than the needed bytes and don't specify a resume handle */
exservices = HeapAlloc(GetProcessHeap(), 0, tempneeded);
bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUSA);
/* Allocate less than the needed bytes and don't specify a resume handle.
* More than one service will be missing because of the space needed for
* the strings.
*/
exservices = malloc(tempneeded);
bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUSW);
needed = 0xdeadbeef;
returned = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
(BYTE*)exservices, bufsize, &needed, &returned, NULL, NULL);
if (ret && needed == 0 && attempt)
{
free(exservices);
goto retry; /* service stop race condition */
}
ok(!ret, "Expected failure\n");
ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size\n");
ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size for the missing services\n");
todo_wine ok(needed < tempneeded, "Expected a smaller needed buffer size for the missing services\n");
/* Experiments show bufsize + needed < tempneeded which proves the needed
* buffer size is an approximation. So it's best not to probe more.
*/
ok(returned < tempreturned, "Expected fewer services to be returned\n");
ok(GetLastError() == ERROR_MORE_DATA,
"Expected ERROR_MORE_DATA, got %d\n", GetLastError());
"Expected ERROR_MORE_DATA, got %ld\n", GetLastError());
/* Allocate less than the needed bytes, this time with a correct resume handle */
bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUSA);
bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUSW);
needed = 0xdeadbeef;
returned = 0xdeadbeef;
resume = 0;
SetLastError(0xdeadbeef);
ret = pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
(BYTE*)exservices, bufsize, &needed, &returned, &resume, NULL);
if (ret && needed == 0 && attempt)
{
free(exservices);
goto retry; /* service stop race condition */
}
ok(!ret, "Expected failure\n");
ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size\n");
ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size for the missing services\n");
todo_wine ok(needed < tempneeded, "Expected a smaller needed buffer size for the missing services\n");
ok(returned < tempreturned, "Expected fewer services to be returned\n");
todo_wine ok(resume, "Expected a resume handle\n");
ok(GetLastError() == ERROR_MORE_DATA,
"Expected ERROR_MORE_DATA, got %d\n", GetLastError());
"Expected ERROR_MORE_DATA, got %ld\n", GetLastError());
/* Fetch that last service but pass a bigger buffer size */
/* Fetch the missing services but pass a bigger buffer size */
missing = tempreturned - returned;
bufsize = tempneeded;
needed = 0xdeadbeef;
returned = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
(BYTE*)exservices, bufsize, &needed, &returned, &resume, NULL);
ok(ret, "Expected success, got error %u\n", GetLastError());
free(exservices);
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
goto retry; /* service start race condition */
ok(ret, "Expected success, got error %lu\n", GetLastError());
ok(needed == 0, "Expected needed buffer to be 0 as we are done\n");
ok(returned == missing, "Expected %u services to be returned\n", missing);
ok(returned == missing, "Expected %lu services to be returned\n", missing);
ok(resume == 0, "Expected the resume handle to be 0\n");
HeapFree(GetProcessHeap(), 0, exservices);
/* See if things add up */
/* Get the number of active win32 services */
pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_ACTIVE,
pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_ACTIVE,
NULL, 0, &needed, &returned, NULL, NULL);
exservices = HeapAlloc(GetProcessHeap(), 0, needed);
pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_ACTIVE,
(BYTE*)exservices, needed, &needed, &returned, NULL, NULL);
HeapFree(GetProcessHeap(), 0, exservices);
exservices = malloc(needed);
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_ACTIVE,
(BYTE*)exservices, needed, &needed, &returned, NULL, NULL);
free(exservices);
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
goto retry; /* service start race condition */
servicecountactive = returned;
/* Get the number of inactive win32 services */
pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_INACTIVE,
pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_INACTIVE,
NULL, 0, &needed, &returned, NULL, NULL);
exservices = HeapAlloc(GetProcessHeap(), 0, needed);
pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_INACTIVE,
(BYTE*)exservices, needed, &needed, &returned, NULL, NULL);
HeapFree(GetProcessHeap(), 0, exservices);
exservices = malloc(needed);
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_INACTIVE,
(BYTE*)exservices, needed, &needed, &returned, NULL, NULL);
free(exservices);
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
goto retry; /* service start race condition */
servicecountinactive = returned;
/* Get the number of win32 services */
pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
NULL, 0, &needed, &returned, NULL, NULL);
exservices = HeapAlloc(GetProcessHeap(), 0, needed);
pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
(BYTE*)exservices, needed, &needed, &returned, NULL, NULL);
HeapFree(GetProcessHeap(), 0, exservices);
exservices = malloc(needed);
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
(BYTE*)exservices, needed, &needed, &returned, NULL, NULL);
free(exservices);
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
goto retry; /* service start race condition */
/* Check if total is the same as active and inactive win32 services */
ok(returned == (servicecountactive + servicecountinactive),
"Something wrong in the calculation\n");
if (returned != servicecountactive + servicecountinactive && attempt)
goto retry; /* service start|stop race condition */
ok(returned == servicecountactive + servicecountinactive,
"Expected service count %ld == %ld + %ld\n",
returned, servicecountactive, servicecountinactive);
/* Get all drivers and services */
ret = pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32 | SERVICE_DRIVER,
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32 | SERVICE_DRIVER,
SERVICE_STATE_ALL, NULL, 0, &needed, &returned, NULL, NULL);
ok(!ret, "Expected failure\n");
exservices = HeapAlloc(GetProcessHeap(), 0, needed);
ret = pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32 | SERVICE_DRIVER,
exservices = malloc(needed);
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32 | SERVICE_DRIVER,
SERVICE_STATE_ALL, (BYTE*)exservices, needed, &needed, &returned, NULL, NULL);
ok(ret, "Expected success %u\n", GetLastError());
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
goto retry; /* service start race condition */
ok(ret, "Expected success %lu\n", GetLastError());
/* Loop through all those returned drivers and services */
for (i = 0; i < returned; i++)
......@@ -1704,7 +1844,7 @@ static void test_enum_svc(void)
/* lpServiceName and lpDisplayName should always be filled */
ok(exservices[i].lpServiceName[0], "Expected a service name\n");
ok(exservices[i].lpDisplayName[0], "Expected a display name\n");
ok(exservices[i].lpDisplayName && exservices[i].lpDisplayName[0], "Expected a display name\n");
/* Decrement the counters to see if the functions calls return the
* same numbers as the contents of these structures.
......@@ -1719,30 +1859,60 @@ static void test_enum_svc(void)
if (status.dwServiceType & (SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS))
{
if (status.dwCurrentState != SERVICE_STOPPED)
switch (status.dwCurrentState)
{
case SERVICE_START_PENDING:
case SERVICE_STOP_PENDING:
trace("Got state %lx (pid=%04lx) for service %s\n",
status.dwCurrentState, status.dwProcessId,
wine_dbgstr_w(exservices[i].lpServiceName));
/* There may or may not be a process id */
servicecountactive--;
break;
case SERVICE_PAUSE_PENDING:
case SERVICE_PAUSED:
case SERVICE_CONTINUE_PENDING:
trace("Got state %lx (pid=%04lx) for service %s\n",
status.dwCurrentState, status.dwProcessId,
wine_dbgstr_w(exservices[i].lpServiceName));
/* fall through */
case SERVICE_RUNNING:
/* We expect a process id for every running service */
ok(status.dwProcessId > 0, "Expected a process id for this running service (%s)\n",
exservices[i].lpServiceName);
wine_dbgstr_w(exservices[i].lpServiceName));
servicecountactive--;
}
else
{
break;
case SERVICE_STOPPED:
/* We shouldn't have a process id for inactive services */
ok(status.dwProcessId == 0, "Service %s state %u shouldn't have an associated process id\n",
exservices[i].lpServiceName, status.dwCurrentState);
ok(status.dwProcessId == 0, "Service %s state %lu shouldn't have an associated process id\n",
wine_dbgstr_w(exservices[i].lpServiceName), status.dwCurrentState);
servicecountinactive--;
break;
default:
ok(0, "Got unknown state %lx (pid=%04lx) for service %s\n",
status.dwCurrentState, status.dwProcessId,
wine_dbgstr_w(exservices[i].lpServiceName));
break;
}
}
}
HeapFree(GetProcessHeap(), 0, exservices);
free(exservices);
ok(servicecountactive == 0, "Active services mismatch %u\n", servicecountactive);
ok(servicecountinactive == 0, "Inactive services mismatch %u\n", servicecountinactive);
if ((servicecountactive || servicecountinactive) && attempt)
goto retry; /* service start|stop race condition */
ok(servicecountactive == 0, "Active services mismatch %lu\n", servicecountactive);
ok(servicecountinactive == 0, "Inactive services mismatch %lu\n", servicecountinactive);
alldone = TRUE;
retry:
CloseServiceHandle(scm_handle);
return alldone;
}
static void test_close(void)
......@@ -1754,7 +1924,7 @@ static void test_close(void)
SetLastError(0xdeadbeef);
ret = CloseServiceHandle(NULL);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
/* TODO: Add some tests with invalid handles. These produce errors on Windows but crash on Wine */
......@@ -1762,7 +1932,91 @@ static void test_close(void)
handle = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
SetLastError(0xdeadbeef);
ret = CloseServiceHandle(handle);
ok(ret, "Expected success got error %u\n", GetLastError());
ok(ret, "Expected success got error %lu\n", GetLastError());
}
static void test_wow64(void)
{
SC_HANDLE manager, service;
BOOL wow64, ret;
HANDLE file;
if (!pIsWow64Process || !pIsWow64Process(GetCurrentProcess(), &wow64) || !wow64)
{
skip("Not running under WoW64.\n");
return;
}
if (!(manager = OpenSCManagerA(NULL, NULL, SC_MANAGER_CREATE_SERVICE)))
{
skip("Not enough permissions to create a service.\n");
return;
}
file = CreateFileA("C:\\windows\\syswow64\\winetestsvc.exe", GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, 0, NULL);
CloseHandle(file);
service = CreateServiceA(manager, "winetestsvc", "winetestsvc",
SERVICE_START | SERVICE_STOP | SERVICE_QUERY_STATUS | DELETE,
SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
"C:\\windows\\system32\\winetestsvc.exe service serve", NULL, NULL, NULL, NULL, NULL);
ok(!!service, "Failed to create service, error %lu.\n", GetLastError());
ret = StartServiceA(service, 0, NULL);
ok(!ret, "Expected failure.\n");
ok(GetLastError() == ERROR_BAD_EXE_FORMAT, "Got error %lu.\n", GetLastError());
ret = DeleteService(service);
ok(ret, "Failed to delete service, error %lu.\n", GetLastError());
CloseServiceHandle(service);
service = CreateServiceA(manager, "winetestsvc2", "winetestsvc2", SERVICE_START | DELETE,
SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
"C:\\windows\\system32\\winetestsvc.exe", NULL, NULL, NULL, NULL, NULL);
ok(!!service, "Failed to create service, error %lu.\n", GetLastError());
ret = StartServiceA(service, 0, NULL);
ok(!ret, "Expected failure.\n");
todo_wine ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Got error %lu.\n", GetLastError());
ret = DeleteService(service);
ok(ret, "Failed to delete service, error %lu.\n", GetLastError());
CloseServiceHandle(service);
ret = DeleteFileA("C:\\windows\\syswow64\\winetestsvc.exe");
ok(ret, "Failed to delete file, error %lu.\n", GetLastError());
file = CreateFileA("C:\\windows\\sysnative\\winetestsvc.exe", GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, 0, NULL);
CloseHandle(file);
service = CreateServiceA(manager, "winetestsvc3", "winetestsvc3", SERVICE_START | DELETE,
SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
"C:\\windows\\system32\\winetestsvc.exe service serve", NULL, NULL, NULL, NULL, NULL);
ok(!!service, "Failed to create service, error %lu.\n", GetLastError());
ret = StartServiceA(service, 0, NULL);
ok(!ret, "Expected failure.\n");
ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Got error %lu.\n", GetLastError());
ret = DeleteService(service);
ok(ret, "Failed to delete service, error %lu.\n", GetLastError());
CloseServiceHandle(service);
service = CreateServiceA(manager, "winetestsvc4", "winetestsvc4", SERVICE_START | DELETE,
SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
"C:\\windows\\system32\\winetestsvc.exe", NULL, NULL, NULL, NULL, NULL);
ok(!!service, "Failed to create service, error %lu.\n", GetLastError());
ret = StartServiceA(service, 0, NULL);
ok(!ret, "Expected failure.\n");
todo_wine ok(GetLastError() == ERROR_BAD_EXE_FORMAT, "Got error %lu.\n", GetLastError());
ret = DeleteService(service);
ok(ret, "Failed to delete service, error %lu.\n", GetLastError());
CloseServiceHandle(service);
ret = DeleteFileA("C:\\windows\\sysnative\\winetestsvc.exe");
ok(ret, "Failed to delete file, error %lu.\n", GetLastError());
CloseServiceHandle(manager);
}
static void test_sequence(void)
......@@ -1771,7 +2025,7 @@ static void test_sequence(void)
BOOL ret, is_nt4;
QUERY_SERVICE_CONFIGA *config;
DWORD given, needed;
static const CHAR servicename [] = "Winetest";
static const CHAR servicename [] = "winetest_sequence";
static const CHAR displayname [] = "Winetest dummy service";
static const CHAR displayname2[] = "Winetest dummy service (2)";
static const CHAR pathname [] = "we_dont_care.exe";
......@@ -1789,7 +2043,7 @@ static void test_sequence(void)
return;
}
else
ok(scm_handle != NULL, "Could not get a handle to the manager: %d\n", GetLastError());
ok(scm_handle != NULL, "Could not get a handle to the manager: %ld\n", GetLastError());
if (!scm_handle) return;
svc_handle = OpenServiceA(scm_handle, NULL, GENERIC_READ);
......@@ -1816,7 +2070,7 @@ static void test_sequence(void)
CloseServiceHandle(scm_handle);
return;
}
ok(svc_handle != NULL, "Could not open the service : %d\n", GetLastError());
ok(svc_handle != NULL, "Could not open the service : %ld\n", GetLastError());
}
else if (!svc_handle && (GetLastError() == ERROR_ACCESS_DENIED))
{
......@@ -1826,8 +2080,8 @@ static void test_sequence(void)
}
else
{
ok(svc_handle != NULL, "Could not create the service : %d\n", GetLastError());
if ((svc_handle != NULL) && (pGetSecurityInfo != NULL))
ok(svc_handle != NULL, "Could not create the service : %ld\n", GetLastError());
if (svc_handle != NULL)
{
PSID sidOwner, sidGroup;
PACL dacl, sacl;
......@@ -1837,26 +2091,26 @@ static void test_sequence(void)
BOOL bret;
/* Test using GetSecurityInfo to obtain security information */
retval = pGetSecurityInfo(svc_handle, SE_SERVICE, DACL_SECURITY_INFORMATION, &sidOwner,
retval = GetSecurityInfo(svc_handle, SE_SERVICE, DACL_SECURITY_INFORMATION, &sidOwner,
&sidGroup, &dacl, &sacl, &pSD);
LocalFree(pSD);
ok(retval == ERROR_SUCCESS, "Expected GetSecurityInfo to succeed: result %d\n", retval);
retval = pGetSecurityInfo(svc_handle, SE_SERVICE, DACL_SECURITY_INFORMATION, NULL,
ok(retval == ERROR_SUCCESS, "Expected GetSecurityInfo to succeed: result %ld\n", retval);
retval = GetSecurityInfo(svc_handle, SE_SERVICE, DACL_SECURITY_INFORMATION, NULL,
NULL, NULL, NULL, &pSD);
LocalFree(pSD);
ok(retval == ERROR_SUCCESS, "Expected GetSecurityInfo to succeed: result %d\n", retval);
ok(retval == ERROR_SUCCESS, "Expected GetSecurityInfo to succeed: result %ld\n", retval);
if (!is_nt4)
{
retval = pGetSecurityInfo(svc_handle, SE_SERVICE, DACL_SECURITY_INFORMATION, NULL,
retval = GetSecurityInfo(svc_handle, SE_SERVICE, DACL_SECURITY_INFORMATION, NULL,
NULL, &dacl, NULL, &pSD);
ok(retval == ERROR_SUCCESS, "Expected GetSecurityInfo to succeed: result %d\n", retval);
ok(retval == ERROR_SUCCESS, "Expected GetSecurityInfo to succeed: result %ld\n", retval);
LocalFree(pSD);
SetLastError(0xdeadbeef);
retval = pGetSecurityInfo(svc_handle, SE_SERVICE, DACL_SECURITY_INFORMATION, NULL,
retval = GetSecurityInfo(svc_handle, SE_SERVICE, DACL_SECURITY_INFORMATION, NULL,
NULL, NULL, NULL, NULL);
error = GetLastError();
ok(retval == ERROR_INVALID_PARAMETER, "Expected GetSecurityInfo to fail: result %d\n", retval);
ok(error == 0xdeadbeef, "Unexpected last error %d\n", error);
ok(retval == ERROR_INVALID_PARAMETER, "Expected GetSecurityInfo to fail: result %ld\n", retval);
ok(error == 0xdeadbeef, "Unexpected last error %ld\n", error);
}
else
win_skip("A NULL security descriptor in GetSecurityInfo results in an exception on NT4.\n");
......@@ -1868,7 +2122,7 @@ static void test_sequence(void)
ok(!bret, "Expected QueryServiceObjectSecurity to fail: result %d\n", bret);
ok(error == ERROR_INSUFFICIENT_BUFFER ||
broken(error == ERROR_INVALID_ADDRESS) || broken(error == ERROR_INVALID_PARAMETER),
"Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", error);
"Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", error);
if (error != ERROR_INSUFFICIENT_BUFFER) n1 = 1024;
pSD = LocalAlloc(0, n1);
bret = pQueryServiceObjectSecurity(svc_handle, DACL_SECURITY_INFORMATION, pSD, n1, &n2);
......@@ -1891,23 +2145,23 @@ static void test_sequence(void)
SetLastError(0xdeadbeef);
ret = QueryServiceConfigA(svc_handle, NULL, 0, &needed);
ok(!ret, "Expected failure\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
config = HeapAlloc(GetProcessHeap(), 0, needed);
config = malloc(needed);
given = needed;
SetLastError(0xdeadbeef);
ret = QueryServiceConfigA(svc_handle, config, given, &needed);
ok(ret, "Expected success, got error %u\n", GetLastError());
ok(ret, "Expected success, got error %lu\n", GetLastError());
ok(config->lpBinaryPathName && config->lpLoadOrderGroup && config->lpDependencies && config->lpServiceStartName &&
config->lpDisplayName, "Expected all string struct members to be non-NULL\n");
ok(config->dwServiceType == (SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS),
"Expected SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS, got %d\n", config->dwServiceType);
ok(config->dwStartType == SERVICE_DISABLED, "Expected SERVICE_DISABLED, got %d\n", config->dwStartType);
ok(config->dwErrorControl == SERVICE_ERROR_IGNORE, "Expected SERVICE_ERROR_IGNORE, got %d\n", config->dwErrorControl);
"Expected SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS, got %ld\n", config->dwServiceType);
ok(config->dwStartType == SERVICE_DISABLED, "Expected SERVICE_DISABLED, got %ld\n", config->dwStartType);
ok(config->dwErrorControl == SERVICE_ERROR_IGNORE, "Expected SERVICE_ERROR_IGNORE, got %ld\n", config->dwErrorControl);
ok(!strcmp(config->lpBinaryPathName, pathname), "Expected '%s', got '%s'\n", pathname, config->lpBinaryPathName);
ok(!strcmp(config->lpLoadOrderGroup, empty), "Expected an empty string, got '%s'\n", config->lpLoadOrderGroup);
ok(config->dwTagId == 0, "Expected 0, got %d\n", config->dwTagId);
ok(config->dwTagId == 0, "Expected 0, got %ld\n", config->dwTagId);
/* TODO: Show the double 0 terminated string */
todo_wine
{
......@@ -1918,33 +2172,29 @@ static void test_sequence(void)
ret = ChangeServiceConfigA(svc_handle, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, SERVICE_ERROR_NORMAL, NULL, "TestGroup2",
NULL, NULL, NULL, NULL, displayname2);
ok(ret, "ChangeServiceConfig failed (err=%d)\n", GetLastError());
ok(ret, "ChangeServiceConfig failed (err=%ld)\n", GetLastError());
QueryServiceConfigA(svc_handle, NULL, 0, &needed);
config = HeapReAlloc(GetProcessHeap(), 0, config, needed);
config = realloc(config, needed);
ok(QueryServiceConfigA(svc_handle, config, needed, &needed), "QueryServiceConfig failed\n");
ok(config->lpBinaryPathName && config->lpLoadOrderGroup && config->lpDependencies && config->lpServiceStartName &&
config->lpDisplayName, "Expected all string struct members to be non-NULL\n");
ok(config->dwServiceType == (SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS),
"Expected SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS, got %d\n", config->dwServiceType);
ok(config->dwStartType == SERVICE_DISABLED, "Expected SERVICE_DISABLED, got %d\n", config->dwStartType);
ok(config->dwErrorControl == SERVICE_ERROR_NORMAL, "Expected SERVICE_ERROR_NORMAL, got %d\n", config->dwErrorControl);
"Expected SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS, got %ld\n", config->dwServiceType);
ok(config->dwStartType == SERVICE_DISABLED, "Expected SERVICE_DISABLED, got %ld\n", config->dwStartType);
ok(config->dwErrorControl == SERVICE_ERROR_NORMAL, "Expected SERVICE_ERROR_NORMAL, got %ld\n", config->dwErrorControl);
ok(!strcmp(config->lpBinaryPathName, pathname), "Expected '%s', got '%s'\n", pathname, config->lpBinaryPathName);
ok(!strcmp(config->lpLoadOrderGroup, "TestGroup2"), "Expected 'TestGroup2', got '%s'\n", config->lpLoadOrderGroup);
ok(config->dwTagId == 0, "Expected 0, got %d\n", config->dwTagId);
ok(config->dwTagId == 0, "Expected 0, got %ld\n", config->dwTagId);
ok(!strcmp(config->lpServiceStartName, localsystem), "Expected 'LocalSystem', got '%s'\n", config->lpServiceStartName);
ok(!strcmp(config->lpDisplayName, displayname2), "Expected '%s', got '%s'\n", displayname2, config->lpDisplayName);
SetLastError(0xdeadbeef);
ret = DeleteService(svc_handle);
ok(ret, "Expected success, got error %u\n", GetLastError());
ok(ret, "Expected success, got error %lu\n", GetLastError());
CloseServiceHandle(svc_handle);
/* Wait a while. The following test does a CreateService again */
Sleep(1000);
CloseServiceHandle(scm_handle);
HeapFree(GetProcessHeap(), 0, config);
free(config);
}
static void test_queryconfig2(void)
......@@ -1954,13 +2204,16 @@ static void test_queryconfig2(void)
DWORD expected, needed;
BYTE buffer[MAX_PATH];
LPSERVICE_DESCRIPTIONA pConfig = (LPSERVICE_DESCRIPTIONA)buffer;
LPSERVICE_DESCRIPTIONW pConfigW = (LPSERVICE_DESCRIPTIONW)buffer;
SERVICE_PRESHUTDOWN_INFO preshutdown_info;
static const CHAR servicename [] = "Winetest";
SERVICE_DELAYED_AUTO_START_INFO auto_start_info;
static const CHAR servicename [] = "winetest_query_config2";
static const CHAR displayname [] = "Winetest dummy service";
static const CHAR pathname [] = "we_dont_care.exe";
static const CHAR dependencies[] = "Master1\0Master2\0+MasterGroup1\0";
static const CHAR password [] = "";
static const CHAR description [] = "Description";
static const WCHAR descriptionW [] = L"DescriptionW";
if(!pQueryServiceConfig2A)
{
......@@ -1976,7 +2229,7 @@ static void test_queryconfig2(void)
if(GetLastError() == ERROR_ACCESS_DENIED)
skip("Not enough rights to get a handle to the manager\n");
else
ok(FALSE, "Could not get a handle to the manager: %d\n", GetLastError());
ok(FALSE, "Could not get a handle to the manager: %ld\n", GetLastError());
return;
}
......@@ -2001,7 +2254,7 @@ static void test_queryconfig2(void)
if(GetLastError() == ERROR_ACCESS_DENIED)
skip("Not enough rights to open the service\n");
else
ok(FALSE, "Could not open the service : %d\n", GetLastError());
ok(FALSE, "Could not open the service : %ld\n", GetLastError());
CloseServiceHandle(scm_handle);
return;
}
......@@ -2012,7 +2265,7 @@ static void test_queryconfig2(void)
CloseServiceHandle(scm_handle);
return;
}
ok(svc_handle != NULL, "Could not create the service : %d\n", GetLastError());
ok(svc_handle != NULL, "Could not create the service : %ld\n", GetLastError());
if (!svc_handle)
{
CloseServiceHandle(scm_handle);
......@@ -2022,49 +2275,49 @@ static void test_queryconfig2(void)
SetLastError(0xdeadbeef);
ret = pQueryServiceConfig2A(svc_handle,0xfff0,buffer,sizeof(SERVICE_DESCRIPTIONA),&needed);
ok(!ret, "expected QueryServiceConfig2A to fail\n");
ok(ERROR_INVALID_LEVEL == GetLastError(), "expected error ERROR_INVALID_LEVEL, got %d\n", GetLastError());
ok(ERROR_INVALID_LEVEL == GetLastError(), "expected error ERROR_INVALID_LEVEL, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pQueryServiceConfig2A(svc_handle,0xfff0,buffer,sizeof(SERVICE_DESCRIPTIONA),NULL);
ok(!ret, "expected QueryServiceConfig2A to fail\n");
ok(ERROR_INVALID_LEVEL == GetLastError(), "expected error ERROR_INVALID_LEVEL, got %d\n", GetLastError());
ok(ERROR_INVALID_LEVEL == GetLastError(), "expected error ERROR_INVALID_LEVEL, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pQueryServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION,buffer,sizeof(SERVICE_DESCRIPTIONA),NULL);
ok(!ret, "expected QueryServiceConfig2A to fail\n");
ok(ERROR_INVALID_ADDRESS == GetLastError(), "expected error ERROR_INVALID_ADDRESS, got %d\n", GetLastError());
ok(ERROR_INVALID_ADDRESS == GetLastError(), "expected error ERROR_INVALID_ADDRESS, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pQueryServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION,NULL,sizeof(SERVICE_DESCRIPTIONA),&needed);
ok(!ret, "expected QueryServiceConfig2A to fail\n");
ok((ERROR_INVALID_ADDRESS == GetLastError()) || (ERROR_INSUFFICIENT_BUFFER == GetLastError()),
"expected error ERROR_INVALID_ADDRESS or ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
"expected error ERROR_INVALID_ADDRESS or ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pQueryServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION,NULL,sizeof(SERVICE_DESCRIPTIONA),NULL);
ok(!ret, "expected QueryServiceConfig2A to fail\n");
ok(ERROR_INVALID_ADDRESS == GetLastError(), "expected error ERROR_INVALID_ADDRESS, got %d\n", GetLastError());
ok(ERROR_INVALID_ADDRESS == GetLastError(), "expected error ERROR_INVALID_ADDRESS, got %ld\n", GetLastError());
needed = 0;
SetLastError(0xdeadbeef);
ret = pQueryServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION,buffer,sizeof(SERVICE_DESCRIPTIONA)-1,&needed);
ok(!ret, "expected QueryServiceConfig2A to fail\n");
ok(ERROR_INSUFFICIENT_BUFFER == GetLastError(), "expected error ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
ok(needed == sizeof(SERVICE_DESCRIPTIONA), "got %d\n", needed);
ok(ERROR_INSUFFICIENT_BUFFER == GetLastError(), "expected error ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
ok(needed == sizeof(SERVICE_DESCRIPTIONA), "got %ld\n", needed);
needed = 0;
pConfig->lpDescription = (LPSTR)0xdeadbeef;
ret = pQueryServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION,buffer,sizeof(SERVICE_DESCRIPTIONA),&needed);
ok(ret, "expected QueryServiceConfig2A to succeed\n");
ok(needed == sizeof(SERVICE_DESCRIPTIONA), "got %d\n", needed);
ok(needed == sizeof(SERVICE_DESCRIPTIONA), "got %ld\n", needed);
ok(!pConfig->lpDescription, "expected lpDescription to be NULL, got %p\n", pConfig->lpDescription);
SetLastError(0xdeadbeef);
needed = 0;
ret = pQueryServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION,NULL,0,&needed);
ok(!ret, "expected QueryServiceConfig2A to fail\n");
ok(ERROR_INSUFFICIENT_BUFFER == GetLastError(), "expected error ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
ok(needed == sizeof(SERVICE_DESCRIPTIONA), "got %d\n", needed);
ok(ERROR_INSUFFICIENT_BUFFER == GetLastError(), "expected error ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
ok(needed == sizeof(SERVICE_DESCRIPTIONA), "got %ld\n", needed);
if(!pChangeServiceConfig2A)
{
......@@ -2084,13 +2337,13 @@ static void test_queryconfig2(void)
expected = sizeof(SERVICE_DESCRIPTIONA) + sizeof(description) * sizeof(WCHAR); /* !! */
ret = pQueryServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION,buffer,sizeof(SERVICE_DESCRIPTIONA),&needed);
ok(!ret, "expected QueryServiceConfig2A to fail\n");
ok(ERROR_INSUFFICIENT_BUFFER == GetLastError(), "expected error ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
ok(needed == expected, "expected needed to be %d, got %d\n", expected, needed);
ok(ERROR_INSUFFICIENT_BUFFER == GetLastError(), "expected error ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
ok(needed == expected, "expected needed to be %ld, got %ld\n", expected, needed);
SetLastError(0xdeadbeef);
ret = pQueryServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION,buffer,needed-1,&needed);
ok(!ret, "expected QueryServiceConfig2A to fail\n");
ok(ERROR_INSUFFICIENT_BUFFER == GetLastError(), "expected error ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
ok(ERROR_INSUFFICIENT_BUFFER == GetLastError(), "expected error ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pQueryServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION,buffer,needed,&needed);
......@@ -2114,14 +2367,75 @@ static void test_queryconfig2(void)
expected = sizeof(SERVICE_DESCRIPTIONW) + sizeof(WCHAR) * sizeof(description);
ret = pQueryServiceConfig2W(svc_handle, SERVICE_CONFIG_DESCRIPTION,NULL,0,&needed);
ok(!ret, "expected QueryServiceConfig2W to fail\n");
ok(ERROR_INSUFFICIENT_BUFFER == GetLastError(), "expected error ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
ok(needed == expected, "expected needed to be %d, got %d\n", expected, needed);
ok(ERROR_INSUFFICIENT_BUFFER == GetLastError(), "expected error ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
ok(needed == expected, "expected needed to be %ld, got %ld\n", expected, needed);
SetLastError(0xdeadbeef);
ret = pQueryServiceConfig2W(svc_handle, SERVICE_CONFIG_DESCRIPTION,buffer, needed,&needed);
ok(ret, "expected QueryServiceConfig2W to succeed\n");
pConfig->lpDescription = (LPSTR)description;
ret = pChangeServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION, &buffer);
ok(ret, "expected ChangeServiceConfig2A to succeed\n");
pConfig->lpDescription = NULL;
ret = pQueryServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION, buffer, sizeof(buffer), &needed);
ok(ret, "expected QueryServiceConfig2A to succeed\n");
ok(pConfig->lpDescription && !strcmp(description, pConfig->lpDescription),
"expected lpDescription to be %s, got %s\n", description, pConfig->lpDescription);
pConfig->lpDescription = NULL;
ret = pChangeServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION, &buffer);
ok(ret, "expected ChangeServiceConfig2A to succeed\n");
pConfig->lpDescription = NULL;
ret = pQueryServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION, buffer, sizeof(buffer), &needed);
ok(ret, "expected QueryServiceConfig2A to succeed\n");
ok(pConfig->lpDescription && !strcmp(description, pConfig->lpDescription),
"expected lpDescription to be %s, got %s\n", description, pConfig->lpDescription);
pConfig->lpDescription = (char*)"";
ret = pChangeServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION, &buffer);
ok(ret, "expected ChangeServiceConfig2A to succeed\n");
pConfig->lpDescription = (void*)0xdeadbeef;
ret = pQueryServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION, buffer, sizeof(buffer), &needed);
ok(ret, "expected QueryServiceConfig2A to succeed\n");
ok(!pConfig->lpDescription,
"expected lpDescription to be null, got %s\n", pConfig->lpDescription);
pConfigW->lpDescription = (LPWSTR)descriptionW;
ret = pChangeServiceConfig2W(svc_handle, SERVICE_CONFIG_DESCRIPTION, &buffer);
ok(ret, "expected ChangeServiceConfig2W to succeed\n");
pConfigW->lpDescription = NULL;
ret = pQueryServiceConfig2W(svc_handle, SERVICE_CONFIG_DESCRIPTION, buffer, sizeof(buffer), &needed);
ok(ret, "expected QueryServiceConfig2A to succeed\n");
ok(pConfigW->lpDescription && !lstrcmpW(descriptionW, pConfigW->lpDescription),
"expected lpDescription to be %s, got %s\n", wine_dbgstr_w(descriptionW), wine_dbgstr_w(pConfigW->lpDescription));
pConfigW->lpDescription = NULL;
ret = pChangeServiceConfig2W(svc_handle, SERVICE_CONFIG_DESCRIPTION, &buffer);
ok(ret, "expected ChangeServiceConfig2W to succeed\n");
pConfigW->lpDescription = NULL;
ret = pQueryServiceConfig2W(svc_handle, SERVICE_CONFIG_DESCRIPTION, buffer, sizeof(buffer), &needed);
ok(ret, "expected QueryServiceConfig2A to succeed\n");
ok(pConfigW->lpDescription && !lstrcmpW(descriptionW, pConfigW->lpDescription),
"expected lpDescription to be %s, got %s\n", wine_dbgstr_w(descriptionW), wine_dbgstr_w(pConfigW->lpDescription));
pConfigW->lpDescription = (WCHAR*)L"";
ret = pChangeServiceConfig2W(svc_handle, SERVICE_CONFIG_DESCRIPTION, &buffer);
ok(ret, "expected ChangeServiceConfig2W to succeed\n");
pConfigW->lpDescription = (void*)0xdeadbeef;
ret = pQueryServiceConfig2W(svc_handle, SERVICE_CONFIG_DESCRIPTION, buffer, sizeof(buffer), &needed);
ok(ret, "expected QueryServiceConfig2A to succeed\n");
ok(!pConfigW->lpDescription,
"expected lpDescription to be null, got %s\n", wine_dbgstr_w(pConfigW->lpDescription));
SetLastError(0xdeadbeef);
needed = 0;
ret = pQueryServiceConfig2W(svc_handle, SERVICE_CONFIG_PRESHUTDOWN_INFO,
(LPBYTE)&preshutdown_info, sizeof(preshutdown_info), &needed);
if(!ret && GetLastError()==ERROR_INVALID_LEVEL)
......@@ -2130,32 +2444,59 @@ static void test_queryconfig2(void)
win_skip("SERVICE_CONFIG_PRESHUTDOWN_INFO not supported\n");
goto cleanup;
}
ok(ret, "expected QueryServiceConfig2W to succeed (%d)\n", GetLastError());
ok(needed == sizeof(preshutdown_info), "needed = %d\n", needed);
ok(preshutdown_info.dwPreshutdownTimeout == 180000, "Default PreshutdownTimeout = %d\n",
preshutdown_info.dwPreshutdownTimeout);
ok(ret, "expected QueryServiceConfig2W to succeed (%ld)\n", GetLastError());
ok(needed == sizeof(preshutdown_info), "needed = %ld\n", needed);
ok(preshutdown_info.dwPreshutdownTimeout == 180000
|| preshutdown_info.dwPreshutdownTimeout == 10000 /* Win10 1709+ */,
"Default PreshutdownTimeout = %ld\n", preshutdown_info.dwPreshutdownTimeout);
SetLastError(0xdeadbeef);
preshutdown_info.dwPreshutdownTimeout = -1;
ret = pChangeServiceConfig2A(svc_handle, SERVICE_CONFIG_PRESHUTDOWN_INFO,
(LPVOID)&preshutdown_info);
ok(ret, "expected ChangeServiceConfig2A to succeed (%d)\n", GetLastError());
ok(ret, "expected ChangeServiceConfig2A to succeed (%ld)\n", GetLastError());
ret = pQueryServiceConfig2W(svc_handle, SERVICE_CONFIG_PRESHUTDOWN_INFO,
(LPBYTE)&preshutdown_info, sizeof(preshutdown_info), &needed);
ok(ret, "expected QueryServiceConfig2W to succeed (%d)\n", GetLastError());
ok(needed == sizeof(preshutdown_info), "needed = %d\n", needed);
ok(preshutdown_info.dwPreshutdownTimeout == -1, "New PreshutdownTimeout = %d\n",
ok(ret, "expected QueryServiceConfig2W to succeed (%ld)\n", GetLastError());
ok(needed == sizeof(preshutdown_info), "needed = %ld\n", needed);
ok(preshutdown_info.dwPreshutdownTimeout == -1, "New PreshutdownTimeout = %ld\n",
preshutdown_info.dwPreshutdownTimeout);
cleanup:
DeleteService(svc_handle);
SetLastError(0xdeadbeef);
needed = 0;
auto_start_info.fDelayedAutostart = 0xdeadbeef;
ret = pQueryServiceConfig2W(svc_handle, SERVICE_CONFIG_DELAYED_AUTO_START_INFO,
(LPBYTE)&auto_start_info, sizeof(auto_start_info), &needed);
ok(ret, "expected QueryServiceConfig2W to succeed (%ld)\n", GetLastError());
ok(needed == sizeof(auto_start_info), "needed = %ld\n", needed);
ok(auto_start_info.fDelayedAutostart == 0, "fDelayedAutostart = %d\n", auto_start_info.fDelayedAutostart);
CloseServiceHandle(svc_handle);
SetLastError(0xdeadbeef);
auto_start_info.fDelayedAutostart = 3;
ret = pChangeServiceConfig2A(svc_handle, SERVICE_CONFIG_DELAYED_AUTO_START_INFO,
(LPBYTE)&auto_start_info);
ok(!ret, "expected ChangeServiceConfig2A to fail\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %ld\n", GetLastError());
/* Wait a while. The following test does a CreateService again */
Sleep(1000);
SetLastError(0xdeadbeef);
auto_start_info.fDelayedAutostart = 1;
ret = pChangeServiceConfig2A(svc_handle, SERVICE_CONFIG_DELAYED_AUTO_START_INFO,
(LPBYTE)&auto_start_info);
ok(ret, "expected ChangeServiceConfig2A to succeed (%ld)\n", GetLastError());
SetLastError(0xdeadbeef);
needed = 0;
auto_start_info.fDelayedAutostart = 0xdeadbeef;
ret = pQueryServiceConfig2W(svc_handle, SERVICE_CONFIG_DELAYED_AUTO_START_INFO,
(LPBYTE)&auto_start_info, sizeof(auto_start_info), &needed);
ok(ret, "expected QueryServiceConfig2W to succeed (%ld)\n", GetLastError());
ok(needed == sizeof(auto_start_info), "needed = %ld\n", needed);
ok(auto_start_info.fDelayedAutostart == 1, "fDelayedAutostart = %d\n", auto_start_info.fDelayedAutostart);
cleanup:
DeleteService(svc_handle);
CloseServiceHandle(svc_handle);
CloseServiceHandle(scm_handle);
}
......@@ -2175,95 +2516,189 @@ static DWORD try_start_stop(SC_HANDLE svc_handle, const char* name, DWORD is_nt4
SERVICE_STATUS_PROCESS statusproc;
ret = pQueryServiceStatusEx(svc_handle, SC_STATUS_PROCESS_INFO, (BYTE*)&statusproc, sizeof(statusproc), &needed);
ok(ret, "%s: QueryServiceStatusEx() failed le=%u\n", name, GetLastError());
ok(statusproc.dwCurrentState == SERVICE_STOPPED, "%s: should be stopped state=%x\n", name, statusproc.dwCurrentState);
ok(statusproc.dwProcessId == 0, "%s: ProcessId should be 0 instead of %x\n", name, statusproc.dwProcessId);
ok(ret, "%s: QueryServiceStatusEx() failed le=%lu\n", name, GetLastError());
ok(statusproc.dwCurrentState == SERVICE_STOPPED, "%s: should be stopped state=%lx\n", name, statusproc.dwCurrentState);
ok(statusproc.dwProcessId == 0, "%s: ProcessId should be 0 instead of %lx\n", name, statusproc.dwProcessId);
}
ret = StartServiceA(svc_handle, 0, NULL);
le2 = GetLastError();
ok(!ret, "%s: StartServiceA() should have failed\n", name);
ok(le2 == le1, "%s: the second try should yield the same error: %u != %u\n", name, le1, le2);
ok(le2 == le1, "%s: the second try should yield the same error: %lu != %lu\n", name, le1, le2);
status.dwCurrentState = 0xdeadbeef;
ret = ControlService(svc_handle, SERVICE_CONTROL_STOP, &status);
le2 = GetLastError();
ok(!ret, "%s: ControlService() should have failed\n", name);
ok(le2 == ERROR_SERVICE_NOT_ACTIVE, "%s: %d != ERROR_SERVICE_NOT_ACTIVE\n", name, le2);
ok(le2 == ERROR_SERVICE_NOT_ACTIVE, "%s: %ld != ERROR_SERVICE_NOT_ACTIVE\n", name, le2);
ok(status.dwCurrentState == SERVICE_STOPPED ||
broken(is_nt4), /* NT4 returns a random value */
"%s: should be stopped state=%x\n", name, status.dwCurrentState);
"%s: should be stopped state=%lx\n", name, status.dwCurrentState);
return le1;
}
#define PHASE_STOPPED 1
#define PHASE_RUNNING 2
struct notify_data {
SERVICE_NOTIFYW notify;
SC_HANDLE svc;
BOOL was_called;
DWORD phase;
};
static void CALLBACK cb_stopped(void *user)
static void CALLBACK notify_cb(void *user)
{
struct notify_data *data = user;
BOOL br;
switch (data->phase)
{
case PHASE_STOPPED:
ok(data->notify.dwNotificationStatus == ERROR_SUCCESS,
"Got wrong notification status: %lu\n", data->notify.dwNotificationStatus);
ok(data->notify.ServiceStatus.dwCurrentState == SERVICE_STOPPED,
"Got wrong service state: 0x%lx\n", data->notify.ServiceStatus.dwCurrentState);
ok(data->notify.dwNotificationTriggered == SERVICE_NOTIFY_STOPPED,
"Got wrong notification triggered: 0x%lx\n", data->notify.dwNotificationTriggered);
break;
ok(data->notify.dwNotificationStatus == ERROR_SUCCESS,
"Got wrong notification status: %u\n", data->notify.dwNotificationStatus);
ok(data->notify.ServiceStatus.dwCurrentState == SERVICE_STOPPED,
"Got wrong service state: 0x%x\n", data->notify.ServiceStatus.dwCurrentState);
ok(data->notify.dwNotificationTriggered == SERVICE_NOTIFY_STOPPED,
"Got wrong notification triggered: 0x%x\n", data->notify.dwNotificationTriggered);
case PHASE_RUNNING:
ok(data->notify.dwNotificationStatus == ERROR_SUCCESS,
"Got wrong notification status: %lu\n", data->notify.dwNotificationStatus);
ok(data->notify.ServiceStatus.dwCurrentState == SERVICE_RUNNING,
"Got wrong service state: 0x%lx\n", data->notify.ServiceStatus.dwCurrentState);
ok(data->notify.dwNotificationTriggered == SERVICE_NOTIFY_RUNNING,
"Got wrong notification triggered: 0x%lx\n", data->notify.dwNotificationTriggered);
break;
}
br = StartServiceA(data->svc, 0, NULL);
ok(br, "StartService failed: %u\n", GetLastError());
data->was_called = TRUE;
}
static void CALLBACK cb_running(void *user)
static void test_servicenotify(SC_HANDLE scm_handle, const char *servicename)
{
struct notify_data *data = user;
DWORD dr, dr2;
struct notify_data data;
struct notify_data data2;
BOOL br;
SERVICE_STATUS status;
ok(data->notify.dwNotificationStatus == ERROR_SUCCESS,
"Got wrong notification status: %u\n", data->notify.dwNotificationStatus);
ok(data->notify.ServiceStatus.dwCurrentState == SERVICE_RUNNING,
"Got wrong service state: 0x%x\n", data->notify.ServiceStatus.dwCurrentState);
ok(data->notify.dwNotificationTriggered == SERVICE_NOTIFY_RUNNING,
"Got wrong notification triggered: 0x%x\n", data->notify.dwNotificationTriggered);
br = ControlService(data->svc, SERVICE_CONTROL_STOP, &status);
ok(br, "ControlService failed: %u\n", GetLastError());
}
static void test_servicenotify(SC_HANDLE svc)
{
DWORD dr;
struct notify_data data;
HANDLE svc, svc2;
if(!pNotifyServiceStatusChangeW){
win_skip("No NotifyServiceStatusChangeW\n");
return;
}
svc = OpenServiceA(scm_handle, servicename, GENERIC_ALL);
svc2 = OpenServiceA(scm_handle, servicename, GENERIC_ALL);
ok(svc != NULL && svc2 != NULL, "Failed to open service\n");
if(!svc || !svc2)
return;
/* receive stopped notification, then start service */
memset(&data.notify, 0, sizeof(data.notify));
data.notify.dwVersion = SERVICE_NOTIFY_STATUS_CHANGE;
data.notify.pfnNotifyCallback = &cb_stopped;
data.notify.pfnNotifyCallback = &notify_cb;
data.notify.pContext = &data;
data.svc = svc;
data.phase = PHASE_STOPPED;
data.was_called = FALSE;
dr = pNotifyServiceStatusChangeW(svc, SERVICE_NOTIFY_STOPPED | SERVICE_NOTIFY_RUNNING, &data.notify);
ok(dr == ERROR_SUCCESS, "NotifyServiceStatusChangeW failed: %u\n", dr);
ok(dr == ERROR_SUCCESS, "NotifyServiceStatusChangeW failed: %lu\n", dr);
dr = SleepEx(100, TRUE);
ok(dr == WAIT_IO_COMPLETION, "APC wasn't called\n");
ok(dr == WAIT_IO_COMPLETION, "Got wrong SleepEx result: %lu\n", dr);
ok(data.was_called == TRUE, "APC wasn't called\n");
br = StartServiceA(svc, 0, NULL);
ok(br, "StartService failed: %lu\n", GetLastError());
data.notify.pfnNotifyCallback = &cb_running;
/* receive running notification */
data.phase = PHASE_RUNNING;
data.was_called = FALSE;
dr = pNotifyServiceStatusChangeW(svc, SERVICE_NOTIFY_STOPPED | SERVICE_NOTIFY_RUNNING, &data.notify);
ok(dr == ERROR_SUCCESS, "NotifyServiceStatusChangeW failed: %u\n", dr);
ok(dr == ERROR_SUCCESS, "NotifyServiceStatusChangeW failed: %lu\n", dr);
dr = SleepEx(100, TRUE);
ok(dr == WAIT_IO_COMPLETION, "APC wasn't called\n");
ok(dr == WAIT_IO_COMPLETION, "Got wrong SleepEx result: %lu\n", dr);
ok(data.was_called == TRUE, "APC wasn't called\n");
/* cannot register two notifications on the same handle */
data.phase = PHASE_STOPPED;
data.was_called = FALSE;
dr = pNotifyServiceStatusChangeW(svc, SERVICE_NOTIFY_STOPPED | SERVICE_NOTIFY_RUNNING, &data.notify);
ok(dr == ERROR_SUCCESS, "NotifyServiceStatusChangeW failed: %lu\n", dr);
memset(&data2.notify, 0, sizeof(data2.notify));
data2.notify.dwVersion = SERVICE_NOTIFY_STATUS_CHANGE;
data2.notify.pfnNotifyCallback = &notify_cb;
data2.notify.pContext = &data2;
data2.phase = PHASE_RUNNING;
data2.was_called = FALSE;
dr = pNotifyServiceStatusChangeW(svc, SERVICE_NOTIFY_STOPPED | SERVICE_NOTIFY_RUNNING, &data2.notify);
ok(dr == ERROR_ALREADY_REGISTERED || !dr /* Win8+ */, "wrong error %lu\n", dr);
if (!dr)
{
dr = SleepEx(100, TRUE);
ok(dr == WAIT_IO_COMPLETION, "got %lu\n", dr);
ok(data2.was_called, "APC was not called\n");
}
else
{
dr = SleepEx(100, TRUE);
ok(!dr, "got %lu\n", dr);
ok(!data2.was_called, "APC should not have been called\n");
}
ok(data.was_called == FALSE, "APC should not have been called\n");
memset(&data2.notify, 0, sizeof(data2.notify));
data2.notify.dwVersion = SERVICE_NOTIFY_STATUS_CHANGE;
data2.notify.pfnNotifyCallback = &notify_cb;
data2.notify.pContext = &data;
data2.svc = svc2;
data2.phase = PHASE_STOPPED;
data2.was_called = FALSE;
/* it's possible to have multiple notifications using different service handles */
dr = pNotifyServiceStatusChangeW(svc2, SERVICE_NOTIFY_STOPPED, &data2.notify);
ok(dr == ERROR_SUCCESS, "NotifyServiceStatusChangeW gave wrong result: %lu\n", dr);
/* stop service and receive notifiction */
br = ControlService(svc, SERVICE_CONTROL_STOP, &status);
ok(br, "ControlService failed: %lu\n", GetLastError());
dr = SleepEx(100, TRUE);
dr2 = SleepEx(100, TRUE);
ok(dr == WAIT_IO_COMPLETION || dr2 == WAIT_IO_COMPLETION, "Got wrong SleepEx result: %lu\n", dr);
ok(data.was_called == TRUE, "APC wasn't called\n");
ok(data2.was_called == TRUE, "APC wasn't called\n");
/* test cancelation: create notify on svc that will block until service
* start; close svc; start service on svc2; verify that notification does
* not happen */
data.phase = PHASE_RUNNING;
data.was_called = FALSE;
dr = pNotifyServiceStatusChangeW(svc, SERVICE_NOTIFY_STOPPED | SERVICE_NOTIFY_RUNNING, &data.notify);
ok(dr == ERROR_SUCCESS, "NotifyServiceStatusChangeW failed: %lu\n", dr);
CloseServiceHandle(svc);
br = StartServiceA(svc2, 0, NULL);
ok(br, "StartService failed: %lu\n", GetLastError());
dr = SleepEx(100, TRUE);
ok(dr == 0, "Got wrong SleepEx result: %lu\n", dr);
ok(data.was_called == FALSE, "APC should not have been called\n");
br = ControlService(svc2, SERVICE_CONTROL_STOP, &status);
ok(br, "ControlService failed: %lu\n", GetLastError());
CloseServiceHandle(svc2);
}
static void test_start_stop(void)
......@@ -2271,7 +2706,7 @@ static void test_start_stop(void)
BOOL ret;
SC_HANDLE scm_handle, svc_handle;
DWORD le, is_nt4;
static const char servicename[] = "Winetest";
static const char servicename[] = "winetest_start_stop";
char cmd[MAX_PATH+20];
const char* displayname;
......@@ -2282,7 +2717,7 @@ static void test_start_stop(void)
if(GetLastError() == ERROR_ACCESS_DENIED)
skip("Not enough rights to get a handle to the manager\n");
else
ok(FALSE, "Could not get a handle to the manager: %d\n", GetLastError());
ok(FALSE, "Could not get a handle to the manager: %ld\n", GetLastError());
return;
}
......@@ -2310,16 +2745,16 @@ static void test_start_stop(void)
if(GetLastError() == ERROR_ACCESS_DENIED)
skip("Not enough rights to create the service\n");
else
ok(FALSE, "Could not create the service: %d\n", GetLastError());
ok(FALSE, "Could not create the service: %ld\n", GetLastError());
goto cleanup;
}
le = try_start_stop(svc_handle, displayname, is_nt4);
ok(le == ERROR_SERVICE_DISABLED, "%d != ERROR_SERVICE_DISABLED\n", le);
ok(le == ERROR_SERVICE_DISABLED, "%ld != ERROR_SERVICE_DISABLED\n", le);
/* Then one with a bad path */
displayname = "Winetest Bad Path";
ret = ChangeServiceConfigA(svc_handle, SERVICE_NO_CHANGE, SERVICE_DEMAND_START, SERVICE_NO_CHANGE, "c:\\no_such_file.exe", NULL, NULL, NULL, NULL, NULL, displayname);
ok(ret, "ChangeServiceConfig() failed le=%u\n", GetLastError());
ok(ret, "ChangeServiceConfig() failed le=%lu\n", GetLastError());
try_start_stop(svc_handle, displayname, is_nt4);
if (is_nt4)
......@@ -2334,16 +2769,16 @@ static void test_start_stop(void)
/* Again with a process that exits right away */
displayname = "Winetest Exit Service";
ret = ChangeServiceConfigA(svc_handle, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, cmd, NULL, NULL, NULL, NULL, NULL, displayname);
ok(ret, "ChangeServiceConfig() failed le=%u\n", GetLastError());
ok(ret, "ChangeServiceConfig() failed le=%lu\n", GetLastError());
le = try_start_stop(svc_handle, displayname, is_nt4);
ok(le == ERROR_SERVICE_REQUEST_TIMEOUT, "%d != ERROR_SERVICE_REQUEST_TIMEOUT\n", le);
ok(le == ERROR_SERVICE_REQUEST_TIMEOUT, "%ld != ERROR_SERVICE_REQUEST_TIMEOUT\n", le);
/* create a real service and test notifications */
sprintf(cmd, "%s service serve", selfname);
displayname = "Winetest Service";
ret = ChangeServiceConfigA(svc_handle, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, cmd, NULL, NULL, NULL, NULL, NULL, displayname);
ok(ret, "ChangeServiceConfig() failed le=%u\n", GetLastError());
test_servicenotify(svc_handle);
ok(ret, "ChangeServiceConfig() failed le=%lu\n", GetLastError());
test_servicenotify(scm_handle, servicename);
cleanup:
if (svc_handle)
......@@ -2351,17 +2786,13 @@ cleanup:
DeleteService(svc_handle);
CloseServiceHandle(svc_handle);
}
/* Wait a while. The following test does a CreateService again */
Sleep(1000);
CloseServiceHandle(scm_handle);
}
static void test_refcount(void)
{
SC_HANDLE scm_handle, svc_handle1, svc_handle2, svc_handle3, svc_handle4, svc_handle5;
static const CHAR servicename [] = "Winetest";
static const CHAR servicename [] = "winetest_refcount";
static const CHAR pathname [] = "we_dont_care.exe";
BOOL ret;
......@@ -2378,31 +2809,31 @@ static void test_refcount(void)
svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, GENERIC_ALL,
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(svc_handle1 != NULL, "Expected success, got error %u\n", GetLastError());
ok(svc_handle1 != NULL, "Expected success, got error %lu\n", GetLastError());
/* Get a handle to this new service */
svc_handle2 = OpenServiceA(scm_handle, servicename, GENERIC_READ);
ok(svc_handle2 != NULL, "Expected success, got error %u\n", GetLastError());
ok(svc_handle2 != NULL, "Expected success, got error %lu\n", GetLastError());
/* Get another handle to this new service */
svc_handle3 = OpenServiceA(scm_handle, servicename, GENERIC_READ);
ok(svc_handle3 != NULL, "Expected success, got error %u\n", GetLastError());
ok(svc_handle3 != NULL, "Expected success, got error %lu\n", GetLastError());
/* Check if we can close the handle to the Service Control Manager */
ret = CloseServiceHandle(scm_handle);
ok(ret, "Expected success (err=%d)\n", GetLastError());
ok(ret, "Expected success (err=%ld)\n", GetLastError());
/* Get a new handle to the Service Control Manager */
scm_handle = OpenSCManagerA(NULL, NULL, GENERIC_ALL);
ok(scm_handle != NULL, "Expected success, got error %u\n", GetLastError());
ok(scm_handle != NULL, "Expected success, got error %lu\n", GetLastError());
/* Get a handle to this new service */
svc_handle4 = OpenServiceA(scm_handle, servicename, GENERIC_ALL);
ok(svc_handle4 != NULL, "Expected success, got error %u\n", GetLastError());
ok(svc_handle4 != NULL, "Expected success, got error %lu\n", GetLastError());
/* Delete the service */
ret = DeleteService(svc_handle4);
ok(ret, "Expected success (err=%d)\n", GetLastError());
ok(ret, "Expected success (err=%ld)\n", GetLastError());
/* We cannot create the same service again as it's still marked as 'being deleted'.
* The reason is that we still have 4 open handles to this service even though we
......@@ -2414,17 +2845,17 @@ static void test_refcount(void)
SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(!svc_handle5, "Expected failure\n");
ok(GetLastError() == ERROR_SERVICE_MARKED_FOR_DELETE,
"Expected ERROR_SERVICE_MARKED_FOR_DELETE, got %d\n", GetLastError());
"Expected ERROR_SERVICE_MARKED_FOR_DELETE, got %ld\n", GetLastError());
/* Close all the handles to the service and try again */
ret = CloseServiceHandle(svc_handle4);
ok(ret, "Expected success (err=%d)\n", GetLastError());
ok(ret, "Expected success (err=%ld)\n", GetLastError());
ret = CloseServiceHandle(svc_handle3);
ok(ret, "Expected success (err=%d)\n", GetLastError());
ok(ret, "Expected success (err=%ld)\n", GetLastError());
ret = CloseServiceHandle(svc_handle2);
ok(ret, "Expected success (err=%d)\n", GetLastError());
ok(ret, "Expected success (err=%ld)\n", GetLastError());
ret = CloseServiceHandle(svc_handle1);
ok(ret, "Expected success (err=%d)\n", GetLastError());
ok(ret, "Expected success (err=%ld)\n", GetLastError());
/* Wait a while. Doing a CreateService too soon will result again
* in an ERROR_SERVICE_MARKED_FOR_DELETE error.
......@@ -2435,16 +2866,105 @@ static void test_refcount(void)
svc_handle5 = CreateServiceA(scm_handle, servicename, NULL, GENERIC_ALL,
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, NULL, NULL);
ok(svc_handle5 != NULL, "Expected success, got error %u\n", GetLastError());
ok(svc_handle5 != NULL, "Expected success, got error %lu\n", GetLastError());
/* Delete the service */
ret = DeleteService(svc_handle5);
ok(ret, "Expected success (err=%d)\n", GetLastError());
ok(ret, "Expected success (err=%ld)\n", GetLastError());
CloseServiceHandle(svc_handle5);
CloseServiceHandle(scm_handle);
}
/* Wait a while. Just in case one of the following tests does a CreateService again */
Sleep(1000);
static BOOL is_lang_english(void)
{
static HMODULE hkernel32 = NULL;
static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL;
static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL;
CloseServiceHandle(svc_handle5);
if (!hkernel32)
{
hkernel32 = GetModuleHandleA("kernel32.dll");
pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage");
pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
}
if (pGetThreadUILanguage)
return PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH;
if (pGetUserDefaultUILanguage)
return PRIMARYLANGID(pGetUserDefaultUILanguage()) == LANG_ENGLISH;
return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
}
static void test_EventLog(void)
{
SC_HANDLE scm_handle, svc_handle;
DWORD size;
BOOL ret;
QUERY_SERVICE_CONFIGA *config;
SERVICE_STATUS_PROCESS status;
scm_handle = OpenSCManagerA(NULL, NULL, GENERIC_READ);
ok(scm_handle != NULL, "OpenSCManager error %lu\n", GetLastError());
svc_handle = OpenServiceA(scm_handle, "EventLog", GENERIC_READ);
ok(svc_handle != NULL, "OpenService error %lu\n", GetLastError());
SetLastError(0xdeadbeef);
ret = QueryServiceConfigA(svc_handle, NULL, 0, &size);
ok(!ret, "QueryServiceConfig should fail\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %lu\n", GetLastError());
config = malloc(size);
ret = QueryServiceConfigA(svc_handle, config, size, &size);
ok(ret, "QueryServiceConfig error %lu\n", GetLastError());
ok(config->dwServiceType == SERVICE_WIN32_SHARE_PROCESS, "got %#lx\n", config->dwServiceType);
ok(config->dwStartType == SERVICE_AUTO_START, "got %lu\n", config->dwStartType);
ok(config->dwErrorControl == SERVICE_ERROR_NORMAL, "got %lu\n", config->dwErrorControl);
ok(!strcmpi(config->lpBinaryPathName, "C:\\windows\\system32\\services.exe") /* XP */ ||
!strcmpi(config->lpBinaryPathName, "C:\\windows\\system32\\svchost.exe -k LocalServiceNetworkRestricted") /* Vista+ */ ||
!strcmpi(config->lpBinaryPathName, "C:\\windows\\system32\\svchost.exe -k LocalServiceNetworkRestricted -p") /* Win10 */,
"got %s\n", config->lpBinaryPathName);
todo_wine
ok(!strcmpi(config->lpLoadOrderGroup, "Event Log"), "got %s\n", config->lpLoadOrderGroup);
ok(config->dwTagId == 0, "Expected 0, got %ld\n", config->dwTagId);
ok(!config->lpDependencies[0], "lpDependencies is not empty\n");
ok(!strcmp(config->lpServiceStartName, "LocalSystem") /* XP */ ||
!strcmp(config->lpServiceStartName, "NT AUTHORITY\\LocalService"),
"got %s\n", config->lpServiceStartName);
ok(!is_lang_english() || /* DisplayName is often translated */
!strcmp(config->lpDisplayName, "Event Log") /* XP */ ||
!strcmp(config->lpDisplayName, "Windows Event Log") /* Vista+ */, "got %s\n", config->lpDisplayName);
free(config);
memset(&status, 0, sizeof(status));
size = sizeof(status);
ret = QueryServiceStatusEx(svc_handle, SC_STATUS_PROCESS_INFO, (BYTE *)&status, size, &size);
ok(ret, "QueryServiceStatusEx error %lu\n", GetLastError());
ok(status.dwServiceType == SERVICE_WIN32_SHARE_PROCESS ||
status.dwServiceType == (SERVICE_WIN32_SHARE_PROCESS | SERVICE_WIN32_OWN_PROCESS) /* Win10 */,
"got %#lx\n", status.dwServiceType);
ok(status.dwServiceSpecificExitCode == 0, "got %#lx\n", status.dwServiceSpecificExitCode);
ok(status.dwCheckPoint == 0, "got %#lx\n", status.dwCheckPoint);
ok(status.dwWaitHint == 0, "got %#lx\n", status.dwWaitHint);
ok(status.dwServiceFlags == 0 || status.dwServiceFlags == SERVICE_RUNS_IN_SYSTEM_PROCESS /* XP */,
"got %#lx\n", status.dwServiceFlags);
if (status.dwCurrentState == SERVICE_STOPPED &&
status.dwWin32ExitCode == ERROR_PROCESS_ABORTED)
win_skip("EventLog crashed!\n");
else
{
ok(status.dwCurrentState == SERVICE_RUNNING, "got %#lx\n", status.dwCurrentState);
ok(status.dwControlsAccepted == SERVICE_ACCEPT_SHUTDOWN /* XP */ ||
status.dwControlsAccepted == (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN) /* 2008 */ ||
status.dwControlsAccepted == (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_TIMECHANGE | SERVICE_ACCEPT_SHUTDOWN),
"got %#lx\n", status.dwControlsAccepted);
ok(status.dwWin32ExitCode == 0, "got %#lx\n", status.dwWin32ExitCode);
ok(status.dwProcessId != 0, "got %#lx\n", status.dwProcessId);
}
CloseServiceHandle(svc_handle);
CloseServiceHandle(scm_handle);
}
......@@ -2504,6 +3024,7 @@ START_TEST(service)
SC_HANDLE scm_handle;
int myARGC;
char** myARGV;
int attempt;
myARGC = winetest_get_mainargs(&myARGV);
GetFullPathNameA(myARGV[0], sizeof(selfname), selfname, NULL);
......@@ -2534,8 +3055,17 @@ START_TEST(service)
test_get_displayname();
test_get_servicekeyname();
test_query_svc();
test_enum_svc();
/* Services may start or stop between enumeration calls, leading to
* inconsistencies and failures. So we may need a couple attempts.
*/
for (attempt = 2; attempt >= 0; attempt--)
if (test_enum_svc(attempt)) break;
for (attempt = 2; attempt >= 0; attempt--)
if (test_enum_svc_ex(attempt)) break;
test_close();
test_wow64();
/* Test the creation, querying and deletion of a service */
test_sequence();
test_queryconfig2();
......@@ -2544,4 +3074,5 @@ START_TEST(service)
* and what the rules are
*/
test_refcount();
test_EventLog();
}
......@@ -18,9 +18,9 @@
#define WINE_FILEDESCRIPTION_STR "Wine advapi32 dll"
#define WINE_FILENAME_STR "advapi32.dll"
#define WINE_FILEVERSION 5,1,2600,2180
#define WINE_FILEVERSION_STR "5.1.2600.2180"
#define WINE_PRODUCTVERSION 5,1,2600,2180
#define WINE_PRODUCTVERSION_STR "5.1.2600.2180"
#define WINE_FILEVERSION 10,0,10240,16384
#define WINE_FILEVERSION_STR "10.0.10240.16384"
#define WINE_PRODUCTVERSION 10,0,10240,16384
#define WINE_PRODUCTVERSION_STR "10.0.10240.16384"
#include "wine/wine_common_ver.rc"
/*
* Win32 advapi/wmi functions
*
* Copyright 2016 Austin English
*
* 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
*/
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "winternl.h"
#include "wmistr.h"
#define _WMI_SOURCE_
#include "wmium.h"
#include "wine/debug.h"
#include "advapi32_misc.h"
WINE_DEFAULT_DEBUG_CHANNEL(wmi);
/******************************************************************************
* WmiExecuteMethodA [ADVAPI32.@]
*/
ULONG WMIAPI WmiExecuteMethodA(WMIHANDLE handle, const char *name, ULONG method, ULONG inputsize,
void *inputbuffer, ULONG *outputsize, void *outputbuffer)
{
FIXME(" %p %s %lu %lu %p %p %p: stub\n", handle, debugstr_a(name), method, inputsize, inputbuffer,
outputsize, outputbuffer);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/******************************************************************************
* WmiExecuteMethodW [ADVAPI32.@]
*/
ULONG WMIAPI WmiExecuteMethodW(WMIHANDLE handle, const WCHAR *name, ULONG method, ULONG inputsize,
void *inputbuffer, ULONG *outputsize, void *outputbuffer)
{
FIXME("%p %s %lu %lu %p %p %p: stub\n", handle, debugstr_w(name), method, inputsize, inputbuffer,
outputsize, outputbuffer);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/******************************************************************************
* WmiFreeBuffer [ADVAPI32.@]
*/
void WMIAPI WmiFreeBuffer(void *buffer)
{
FIXME("%p: stub\n", buffer);
}
/******************************************************************************
* WmiMofEnumerateResourcesA [ADVAPI32.@]
*/
ULONG WMIAPI WmiMofEnumerateResourcesA(MOFHANDLE handle, ULONG *count, MOFRESOURCEINFOA **resource)
{
FIXME("%p %p %p: stub\n", handle, count, resource);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/******************************************************************************
* WmiMofEnumerateResourcesW [ADVAPI32.@]
*/
ULONG WMIAPI WmiMofEnumerateResourcesW(MOFHANDLE handle, ULONG *count, MOFRESOURCEINFOW **resource)
{
FIXME("%p %p %p: stub\n", handle, count, resource);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/******************************************************************************
* WmiNotificationRegistrationA [ADVAPI32.@]
*/
ULONG WMIAPI WmiNotificationRegistrationA(GUID *guid, BOOLEAN enable, void *info,
ULONG_PTR context, ULONG flags)
{
FIXME("%s %u %p 0x%Ix 0x%08lx: stub\n", debugstr_guid(guid), enable, info, context, flags);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/******************************************************************************
* WmiNotificationRegistrationW [ADVAPI32.@]
*/
ULONG WMIAPI WmiNotificationRegistrationW(GUID *guid, BOOLEAN enable, void *info,
ULONG_PTR context, ULONG flags)
{
FIXME("%s %u %p 0x%Ix 0x%08lx: stub\n", debugstr_guid(guid), enable, info, context, flags);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/******************************************************************************
* WmiOpenBlock [ADVAPI32.@]
*/
ULONG WINAPI WmiOpenBlock(GUID *guid, ULONG access, WMIHANDLE *handle)
{
FIXME("%s %lu %p: stub\n", debugstr_guid(guid), access, handle);
return ERROR_SUCCESS;
}
/******************************************************************************
* WmiQueryAllDataA [ADVAPI32.@]
*/
ULONG WMIAPI WmiQueryAllDataA(WMIHANDLE handle, ULONG *size, void *buffer)
{
FIXME("%p %p %p: stub\n", handle, size, buffer);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/******************************************************************************
* WmiQueryAllDataW [ADVAPI32.@]
*/
ULONG WMIAPI WmiQueryAllDataW(WMIHANDLE handle, ULONG *size, void *buffer)
{
FIXME("%p %p %p: stub\n", handle, size, buffer);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/******************************************************************************
* WmiQueryGuidInformation [ADVAPI32.@]
*/
ULONG WMIAPI WmiQueryGuidInformation(WMIHANDLE handle, WMIGUIDINFORMATION *info)
{
FIXME("%p %p: stub\n", handle, info);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/******************************************************************************
* WmiSetSingleInstanceA [ADVAPI32.@]
*/
ULONG WMIAPI WmiSetSingleInstanceA(WMIHANDLE handle, const char *name, ULONG reserved,
ULONG size, void *buffer)
{
FIXME("%p %s %lu %lu %p: stub\n", handle, debugstr_a(name), reserved, size, buffer);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/******************************************************************************
* WmiSetSingleInstanceW [ADVAPI32.@]
*/
ULONG WMIAPI WmiSetSingleInstanceW(WMIHANDLE handle, const WCHAR *name, ULONG reserved,
ULONG size, void *buffer)
{
FIXME("%p %s %lu %lu %p: stub\n", handle, debugstr_w(name), reserved, size, buffer);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/******************************************************************************
* WmiSetSingleItemA [ADVAPI32.@]
*/
ULONG WMIAPI WmiSetSingleItemA(WMIHANDLE handle, const char *name, ULONG id, ULONG reserved,
ULONG size, void *buffer)
{
FIXME("%p %s %lu %lu %lu %p: stub\n", handle, debugstr_a(name), id, reserved, size, buffer);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/******************************************************************************
* WmiSetSingleItemW [ADVAPI32.@]
*/
ULONG WMIAPI WmiSetSingleItemW(WMIHANDLE handle, const WCHAR *name, ULONG id, ULONG reserved,
ULONG size, void *buffer)
{
FIXME("%p %s %lu %lu %lu %p: stub\n", handle, debugstr_w(name), id, reserved, size, buffer);
return ERROR_CALL_NOT_IMPLEMENTED;
}
......@@ -2,7 +2,7 @@ MODULE = advpack.dll
IMPORTLIB = advpack
IMPORTS = ole32 setupapi version advapi32
C_SRCS = \
SOURCES = \
advpack.c \
files.c \
install.c \
......
......@@ -20,6 +20,7 @@
*/
#include <stdarg.h>
#include <stdlib.h>
#include "windef.h"
#include "winbase.h"
......@@ -29,7 +30,6 @@
#include "winnls.h"
#include "setupapi.h"
#include "advpub.h"
#include "wine/unicode.h"
#include "wine/debug.h"
#include "advpack_private.h"
......@@ -41,13 +41,7 @@ typedef HRESULT (WINAPI *DLLREGISTER) (void);
#define PREFIX_LEN 5
/* registry path of the Installed Components key for per-user stubs */
static const WCHAR setup_key[] = {
'S','O','F','T','W','A','R','E','\\',
'M','i','c','r','o','s','o','f','t','\\',
'A','c','t','i','v','e',' ','S','e','t','u','p','\\',
'I','n','s','t','a','l','l','e','d',' ',
'C','o','m','p','o','n','e','n','t','s',0
};
static const WCHAR setup_key[] = L"SOFTWARE\\Microsoft\\Active Setup\\Installed Components";
/* Strip single quotes from a token - note size includes NULL */
static void strip_quotes(WCHAR *buffer, DWORD *size)
......@@ -73,9 +67,6 @@ static void get_dest_dir(HINF hInf, PCWSTR pszSection, PWSTR pszBuffer, DWORD dw
HKEY root, subkey = 0;
DWORD size;
static const WCHAR hklm[] = {'H','K','L','M',0};
static const WCHAR hkcu[] = {'H','K','C','U',0};
/* load the destination parameters */
SetupFindFirstLineW(hInf, pszSection, NULL, &context);
SetupGetStringFieldW(&context, 1, prefix, PREFIX_LEN + 2, &size);
......@@ -85,9 +76,9 @@ static void get_dest_dir(HINF hInf, PCWSTR pszSection, PWSTR pszBuffer, DWORD dw
SetupGetStringFieldW(&context, 3, value, MAX_PATH + 2, &size);
strip_quotes(value, &size);
if (!lstrcmpW(prefix, hklm))
if (!lstrcmpW(prefix, L"HKLM"))
root = HKEY_LOCAL_MACHINE;
else if (!lstrcmpW(prefix, hkcu))
else if (!lstrcmpW(prefix, L"HKCU"))
root = HKEY_CURRENT_USER;
else
root = NULL;
......@@ -115,13 +106,7 @@ void set_ldids(HINF hInf, LPCWSTR pszInstallSection, LPCWSTR pszWorkingDir)
DWORD size;
int ldid;
static const WCHAR source_dir[] = {'S','o','u','r','c','e','D','i','r',0};
static const WCHAR custDestW[] = {
'C','u','s','t','o','m','D','e','s','t','i','n','a','t','i','o','n',0
};
if (!SetupGetLineTextW(NULL, hInf, pszInstallSection, custDestW,
if (!SetupGetLineTextW(NULL, hInf, pszInstallSection, L"CustomDestination",
field, MAX_FIELD_LENGTH, &size))
return;
......@@ -139,10 +124,10 @@ void set_ldids(HINF hInf, LPCWSTR pszInstallSection, LPCWSTR pszWorkingDir)
/* SetupGetLineTextW returns the value if there is only one key, but
* returns the whole line if there is more than one key
*/
if (!(value = strchrW(line, '=')))
if (!(value = wcschr(line, '=')))
{
SetupGetStringFieldW(&context, 0, NULL, 0, &size);
key = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));
key = malloc(size * sizeof(WCHAR));
key_copy = key;
SetupGetStringFieldW(&context, 0, key, size, &size);
value = line;
......@@ -158,14 +143,14 @@ void set_ldids(HINF hInf, LPCWSTR pszInstallSection, LPCWSTR pszWorkingDir)
value++;
/* Extract the flags */
ptr = strchrW(value, ',');
ptr = wcschr(value, ',');
if (ptr) {
*ptr = '\0';
flags = atolW(ptr+1);
flags = wcstol(ptr+1, NULL, 10);
}
/* set dest to pszWorkingDir if key is SourceDir */
if (pszWorkingDir && !lstrcmpiW(value, source_dir))
if (pszWorkingDir && !lstrcmpiW(value, L"SourceDir"))
lstrcpynW(dest, pszWorkingDir, MAX_PATH);
else
get_dest_dir(hInf, value, dest, MAX_PATH);
......@@ -177,10 +162,10 @@ void set_ldids(HINF hInf, LPCWSTR pszInstallSection, LPCWSTR pszWorkingDir)
/* set all ldids to dest */
while ((ptr = get_parameter(&key, ',', FALSE)))
{
ldid = atolW(ptr);
ldid = wcstol(ptr, NULL, 10);
SetupSetDirectoryIdW(hInf, ldid, dest);
}
HeapFree(GetProcessHeap(), 0, key_copy);
free(key_copy);
} while (SetupFindNextLine(&context, &context));
}
......@@ -228,7 +213,7 @@ BOOL WINAPI IsNTAdmin(DWORD reserved, LPDWORD pReserved)
HANDLE hToken;
PSID pSid;
TRACE("(%d, %p)\n", reserved, pReserved);
TRACE("(%ld, %p)\n", reserved, pReserved);
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
return FALSE;
......@@ -242,7 +227,7 @@ BOOL WINAPI IsNTAdmin(DWORD reserved, LPDWORD pReserved)
}
}
pTokenGroups = HeapAlloc(GetProcessHeap(), 0, dwSize);
pTokenGroups = malloc(dwSize);
if (!pTokenGroups)
{
CloseHandle(hToken);
......@@ -251,7 +236,7 @@ BOOL WINAPI IsNTAdmin(DWORD reserved, LPDWORD pReserved)
if (!GetTokenInformation(hToken, TokenGroups, pTokenGroups, dwSize, &dwSize))
{
HeapFree(GetProcessHeap(), 0, pTokenGroups);
free(pTokenGroups);
CloseHandle(hToken);
return FALSE;
}
......@@ -261,7 +246,7 @@ BOOL WINAPI IsNTAdmin(DWORD reserved, LPDWORD pReserved)
if (!AllocateAndInitializeSid(&SidAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pSid))
{
HeapFree(GetProcessHeap(), 0, pTokenGroups);
free(pTokenGroups);
return FALSE;
}
......@@ -274,7 +259,7 @@ BOOL WINAPI IsNTAdmin(DWORD reserved, LPDWORD pReserved)
}
}
HeapFree(GetProcessHeap(), 0, pTokenGroups);
free(pTokenGroups);
FreeSid(pSid);
return bSidFound;
......@@ -310,7 +295,7 @@ DWORD WINAPI NeedRebootInit(VOID)
*/
BOOL WINAPI NeedReboot(DWORD dwRebootCheck)
{
FIXME("(%d): stub\n", dwRebootCheck);
FIXME("(%ld): stub\n", dwRebootCheck);
return FALSE;
}
......@@ -325,7 +310,7 @@ HRESULT WINAPI OpenINFEngineA(LPCSTR pszInfFilename, LPCSTR pszInstallSection,
UNICODE_STRING filenameW, installW;
HRESULT res;
TRACE("(%s, %s, %d, %p, %p)\n", debugstr_a(pszInfFilename),
TRACE("(%s, %s, %ld, %p, %p)\n", debugstr_a(pszInfFilename),
debugstr_a(pszInstallSection), dwFlags, phInf, pvReserved);
if (!pszInfFilename || !phInf)
......@@ -363,7 +348,7 @@ HRESULT WINAPI OpenINFEngineA(LPCSTR pszInfFilename, LPCSTR pszInstallSection,
HRESULT WINAPI OpenINFEngineW(LPCWSTR pszInfFilename, LPCWSTR pszInstallSection,
DWORD dwFlags, HINF *phInf, PVOID pvReserved)
{
TRACE("(%s, %s, %d, %p, %p)\n", debugstr_w(pszInfFilename),
TRACE("(%s, %s, %ld, %p, %p)\n", debugstr_w(pszInfFilename),
debugstr_w(pszInstallSection), dwFlags, phInf, pvReserved);
if (!pszInfFilename || !phInf)
......@@ -389,7 +374,7 @@ HRESULT WINAPI RebootCheckOnInstallA(HWND hWnd, LPCSTR pszINF,
UNICODE_STRING infW, secW;
HRESULT res;
TRACE("(%p, %s, %s, %d)\n", hWnd, debugstr_a(pszINF),
TRACE("(%p, %s, %s, %ld)\n", hWnd, debugstr_a(pszINF),
debugstr_a(pszSec), dwReserved);
if (!pszINF || !pszSec)
......@@ -432,7 +417,7 @@ HRESULT WINAPI RebootCheckOnInstallA(HWND hWnd, LPCSTR pszINF,
HRESULT WINAPI RebootCheckOnInstallW(HWND hWnd, LPCWSTR pszINF,
LPCWSTR pszSec, DWORD dwReserved)
{
FIXME("(%p, %s, %s, %d): stub\n", hWnd, debugstr_w(pszINF),
FIXME("(%p, %s, %s, %ld): stub\n", hWnd, debugstr_w(pszINF),
debugstr_w(pszSec), dwReserved);
return E_FAIL;
......@@ -484,16 +469,13 @@ HRESULT WINAPI RegisterOCX(HWND hWnd, HINSTANCE hInst, LPCSTR cmdline, INT show)
UNICODE_STRING cmdlineW;
HRESULT hr = E_FAIL;
HMODULE hm = NULL;
DWORD size;
TRACE("(%s)\n", debugstr_a(cmdline));
RtlCreateUnicodeStringFromAsciiz(&cmdlineW, cmdline);
size = (lstrlenW(cmdlineW.Buffer) + 1) * sizeof(WCHAR);
cmdline_copy = HeapAlloc(GetProcessHeap(), 0, size);
cmdline_copy = wcsdup(cmdlineW.Buffer);
cmdline_ptr = cmdline_copy;
lstrcpyW(cmdline_copy, cmdlineW.Buffer);
ocx_filename = get_parameter(&cmdline_ptr, ',', TRUE);
if (!ocx_filename || !*ocx_filename)
......@@ -510,7 +492,7 @@ HRESULT WINAPI RegisterOCX(HWND hWnd, HINSTANCE hInst, LPCSTR cmdline, INT show)
done:
FreeLibrary(hm);
HeapFree(GetProcessHeap(), 0, cmdline_copy);
free(cmdline_copy);
RtlFreeUnicodeString(&cmdlineW);
return hr;
......@@ -530,18 +512,12 @@ HRESULT WINAPI SetPerUserSecValuesA(PERUSERSECTIONA* pPerUser)
if (!pPerUser)
return E_INVALIDARG;
MultiByteToWideChar(CP_ACP, 0, pPerUser->szGUID, -1, perUserW.szGUID,
sizeof(perUserW.szGUID) / sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, pPerUser->szDispName, -1, perUserW.szDispName,
sizeof(perUserW.szDispName) / sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, pPerUser->szLocale, -1, perUserW.szLocale,
sizeof(perUserW.szLocale) / sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, pPerUser->szStub, -1, perUserW.szStub,
sizeof(perUserW.szStub) / sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, pPerUser->szVersion, -1, perUserW.szVersion,
sizeof(perUserW.szVersion) / sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, pPerUser->szCompID, -1, perUserW.szCompID,
sizeof(perUserW.szCompID) / sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, pPerUser->szGUID, -1, perUserW.szGUID, ARRAY_SIZE(perUserW.szGUID));
MultiByteToWideChar(CP_ACP, 0, pPerUser->szDispName, -1, perUserW.szDispName, ARRAY_SIZE(perUserW.szDispName));
MultiByteToWideChar(CP_ACP, 0, pPerUser->szLocale, -1, perUserW.szLocale, ARRAY_SIZE(perUserW.szLocale));
MultiByteToWideChar(CP_ACP, 0, pPerUser->szStub, -1, perUserW.szStub, ARRAY_SIZE(perUserW.szStub));
MultiByteToWideChar(CP_ACP, 0, pPerUser->szVersion, -1, perUserW.szVersion, ARRAY_SIZE(perUserW.szVersion));
MultiByteToWideChar(CP_ACP, 0, pPerUser->szCompID, -1, perUserW.szCompID, ARRAY_SIZE(perUserW.szCompID));
perUserW.dwIsInstalled = pPerUser->dwIsInstalled;
perUserW.bRollback = pPerUser->bRollback;
......@@ -565,12 +541,6 @@ HRESULT WINAPI SetPerUserSecValuesW(PERUSERSECTIONW* pPerUser)
{
HKEY setup, guid;
static const WCHAR stub_path[] = {'S','t','u','b','P','a','t','h',0};
static const WCHAR version[] = {'V','e','r','s','i','o','n',0};
static const WCHAR locale[] = {'L','o','c','a','l','e',0};
static const WCHAR compid[] = {'C','o','m','p','o','n','e','n','t','I','D',0};
static const WCHAR isinstalled[] = {'I','s','I','n','s','t','a','l','l','e','d',0};
TRACE("(%p)\n", pPerUser);
if (!pPerUser || !*pPerUser->szGUID)
......@@ -591,25 +561,25 @@ HRESULT WINAPI SetPerUserSecValuesW(PERUSERSECTIONW* pPerUser)
if (*pPerUser->szStub)
{
RegSetValueExW(guid, stub_path, 0, REG_SZ, (LPBYTE)pPerUser->szStub,
RegSetValueExW(guid, L"StubPath", 0, REG_SZ, (BYTE *)pPerUser->szStub,
(lstrlenW(pPerUser->szStub) + 1) * sizeof(WCHAR));
}
if (*pPerUser->szVersion)
{
RegSetValueExW(guid, version, 0, REG_SZ, (LPBYTE)pPerUser->szVersion,
RegSetValueExW(guid, L"Version", 0, REG_SZ, (BYTE *)pPerUser->szVersion,
(lstrlenW(pPerUser->szVersion) + 1) * sizeof(WCHAR));
}
if (*pPerUser->szLocale)
{
RegSetValueExW(guid, locale, 0, REG_SZ, (LPBYTE)pPerUser->szLocale,
RegSetValueExW(guid, L"Locale", 0, REG_SZ, (BYTE *)pPerUser->szLocale,
(lstrlenW(pPerUser->szLocale) + 1) * sizeof(WCHAR));
}
if (*pPerUser->szCompID)
{
RegSetValueExW(guid, compid, 0, REG_SZ, (LPBYTE)pPerUser->szCompID,
RegSetValueExW(guid, L"ComponentID", 0, REG_SZ, (BYTE *)pPerUser->szCompID,
(lstrlenW(pPerUser->szCompID) + 1) * sizeof(WCHAR));
}
......@@ -619,7 +589,7 @@ HRESULT WINAPI SetPerUserSecValuesW(PERUSERSECTIONW* pPerUser)
(lstrlenW(pPerUser->szDispName) + 1) * sizeof(WCHAR));
}
RegSetValueExW(guid, isinstalled, 0, REG_DWORD,
RegSetValueExW(guid, L"IsInstalled", 0, REG_DWORD,
(LPBYTE)&pPerUser->dwIsInstalled, sizeof(DWORD));
RegCloseKey(guid);
......@@ -643,7 +613,7 @@ HRESULT WINAPI TranslateInfStringA(LPCSTR pszInfFilename, LPCSTR pszInstallSecti
HRESULT res;
DWORD len = 0;
TRACE("(%s, %s, %s, %s, %p, %d, %p, %p)\n",
TRACE("(%s, %s, %s, %s, %p, %ld, %p, %p)\n",
debugstr_a(pszInfFilename), debugstr_a(pszInstallSection),
debugstr_a(pszTranslateSection), debugstr_a(pszTranslateKey),
pszBuffer, dwBufferSize,pdwRequiredSize, pvReserved);
......@@ -663,7 +633,7 @@ HRESULT WINAPI TranslateInfStringA(LPCSTR pszInfFilename, LPCSTR pszInstallSecti
if (res == S_OK)
{
bufferW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
bufferW = malloc(len * sizeof(WCHAR));
res = TranslateInfStringW(filenameW.Buffer, installW.Buffer,
translateW.Buffer, keyW.Buffer, bufferW,
......@@ -681,8 +651,8 @@ HRESULT WINAPI TranslateInfStringA(LPCSTR pszInfFilename, LPCSTR pszInstallSecti
else
res = E_NOT_SUFFICIENT_BUFFER;
}
HeapFree(GetProcessHeap(), 0, bufferW);
free(bufferW);
}
RtlFreeUnicodeString(&filenameW);
......@@ -720,7 +690,7 @@ HRESULT WINAPI TranslateInfStringW(LPCWSTR pszInfFilename, LPCWSTR pszInstallSec
HINF hInf;
HRESULT hret = S_OK;
TRACE("(%s, %s, %s, %s, %p, %d, %p, %p)\n",
TRACE("(%s, %s, %s, %s, %p, %ld, %p, %p)\n",
debugstr_w(pszInfFilename), debugstr_w(pszInstallSection),
debugstr_w(pszTranslateSection), debugstr_w(pszTranslateKey),
pszBuffer, dwBufferSize,pdwRequiredSize, pvReserved);
......@@ -763,9 +733,9 @@ HRESULT WINAPI TranslateInfStringExA(HINF hInf, LPCSTR pszInfFilename,
HRESULT res;
DWORD len = 0;
TRACE("(%p, %s, %s, %s, %s, %d, %p, %p)\n", hInf, debugstr_a(pszInfFilename),
TRACE("(%p, %s, %s, %s, %p, %ld, %p, %p)\n", hInf, debugstr_a(pszInfFilename),
debugstr_a(pszTranslateSection), debugstr_a(pszTranslateKey),
debugstr_a(pszBuffer), dwBufferSize, pdwRequiredSize, pvReserved);
pszBuffer, dwBufferSize, pdwRequiredSize, pvReserved);
if (!pszInfFilename || !pszTranslateSection ||
!pszTranslateKey || !pdwRequiredSize)
......@@ -780,7 +750,7 @@ HRESULT WINAPI TranslateInfStringExA(HINF hInf, LPCSTR pszInfFilename,
if (res == S_OK)
{
bufferW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
bufferW = malloc(len * sizeof(WCHAR));
res = TranslateInfStringExW(hInf, filenameW.Buffer, sectionW.Buffer,
keyW.Buffer, bufferW, len, &len, NULL);
......@@ -798,8 +768,8 @@ HRESULT WINAPI TranslateInfStringExA(HINF hInf, LPCSTR pszInfFilename,
else
res = E_NOT_SUFFICIENT_BUFFER;
}
HeapFree(GetProcessHeap(), 0, bufferW);
free(bufferW);
}
RtlFreeUnicodeString(&filenameW);
......@@ -843,9 +813,9 @@ HRESULT WINAPI TranslateInfStringExW(HINF hInf, LPCWSTR pszInfFilename,
LPWSTR pszBuffer, DWORD dwBufferSize,
PDWORD pdwRequiredSize, PVOID pvReserved)
{
TRACE("(%p, %s, %s, %s, %s, %d, %p, %p)\n", hInf, debugstr_w(pszInfFilename),
TRACE("(%p, %s, %s, %s, %p, %ld, %p, %p)\n", hInf, debugstr_w(pszInfFilename),
debugstr_w(pszTranslateSection), debugstr_w(pszTranslateKey),
debugstr_w(pszBuffer), dwBufferSize, pdwRequiredSize, pvReserved);
pszBuffer, dwBufferSize, pdwRequiredSize, pvReserved);
if (!hInf || !pszInfFilename || !pszTranslateSection || !pszTranslateKey)
return E_INVALIDARG;
......@@ -913,14 +883,10 @@ HRESULT WINAPI UserInstStubWrapperW(HWND hWnd, HINSTANCE hInstance,
{
HKEY setup, guid;
WCHAR stub[MAX_PATH];
DWORD size = MAX_PATH;
DWORD size = sizeof(stub);
HRESULT hr = S_OK;
BOOL res;
static const WCHAR real_stub_path[] = {
'R','e','a','l','S','t','u','b','P','a','t','h',0
};
TRACE("(%p, %p, %s, %i)\n", hWnd, hInstance, debugstr_w(pszParms), nShow);
if (!pszParms || !*pszParms)
......@@ -937,7 +903,7 @@ HRESULT WINAPI UserInstStubWrapperW(HWND hWnd, HINSTANCE hInstance,
return E_FAIL;
}
res = RegQueryValueExW(guid, real_stub_path, NULL, NULL, (LPBYTE)stub, &size);
res = RegQueryValueExW(guid, L"RealStubPath", NULL, NULL, (BYTE *)stub, &size);
if (res || !*stub)
goto done;
......
@ stdcall AddDelBackupEntry(str str str long) AddDelBackupEntryA
@ stdcall AddDelBackupEntryA(str str str long)
@ stdcall AddDelBackupEntryW(wstr wstr wstr long)
@ stdcall AddDelBackupEntry(str str str long) AddDelBackupEntryA
@ stdcall AdvInstallFile(long str str str str long long) AdvInstallFileA
@ stdcall AdvInstallFileA(long str str str str long long)
@ stdcall AdvInstallFileW(long wstr wstr wstr wstr long long)
@ stdcall AdvInstallFile(long str str str str long long) AdvInstallFileA
@ stdcall CloseINFEngine(long)
@ stdcall DelNodeA(str long)
@ stdcall DelNodeW(wstr long)
@ stdcall DelNode(str long) DelNodeA
@ stdcall DelNodeA(str long)
@ stdcall DelNodeRunDLL32(ptr ptr str long) DelNodeRunDLL32A
@ stdcall DelNodeRunDLL32A(ptr ptr str long)
@ stdcall DelNodeRunDLL32W(ptr ptr wstr long)
@ stdcall DelNodeRunDLL32(ptr ptr str long) DelNodeRunDLL32A
@ stdcall -private DllMain(long long ptr)
@ stdcall DelNodeW(wstr long)
@ stdcall DoInfInstall(ptr)
@ stdcall ExecuteCab(ptr ptr ptr) ExecuteCabA
@ stdcall ExecuteCabA(ptr ptr ptr)
@ stdcall ExecuteCabW(ptr ptr ptr)
@ stdcall ExecuteCab(ptr ptr ptr) ExecuteCabA
@ stdcall ExtractFilesA(str str long ptr ptr long)
@ stdcall ExtractFilesW(wstr wstr long ptr ptr long)
@ stdcall ExtractFiles(str str long ptr ptr long) ExtractFilesA
@ stdcall ExtractFiles(str str long str ptr long) ExtractFilesA
@ stdcall ExtractFilesA(str str long str ptr long)
@ stdcall ExtractFilesW(wstr wstr long wstr ptr long)
@ stdcall FileSaveMarkNotExist(str str str) FileSaveMarkNotExistA
@ stdcall FileSaveMarkNotExistA(str str str)
@ stdcall FileSaveMarkNotExistW(wstr wstr wstr)
@ stdcall FileSaveMarkNotExist(str str str) FileSaveMarkNotExistA
@ stdcall FileSaveRestoreA(ptr str str str long)
@ stdcall FileSaveRestoreW(ptr wstr wstr wstr long)
@ stdcall FileSaveRestore(ptr str str str long) FileSaveRestoreA
@ stdcall FileSaveRestoreA(ptr str str str long)
@ stdcall FileSaveRestoreOnINF(ptr str str str str str long) FileSaveRestoreOnINFA
@ stdcall FileSaveRestoreOnINFA(ptr str str str str str long)
@ stdcall FileSaveRestoreOnINFW(ptr wstr wstr wstr wstr wstr long)
@ stdcall FileSaveRestoreOnINF(ptr str str str str str long) FileSaveRestoreOnINFA
@ stdcall GetVersionFromFileA(str ptr ptr long)
@ stdcall GetVersionFromFileW(wstr ptr ptr long)
@ stdcall FileSaveRestoreW(ptr wstr wstr wstr long)
@ stdcall GetVersionFromFile(str ptr ptr long) GetVersionFromFileA
@ stdcall GetVersionFromFileA(str ptr ptr long)
@ stdcall GetVersionFromFileEx(str ptr ptr long) GetVersionFromFileExA
@ stdcall GetVersionFromFileExA(str ptr ptr long)
@ stdcall GetVersionFromFileExW(wstr ptr ptr long)
@ stdcall GetVersionFromFileEx(str ptr ptr long) GetVersionFromFileExA
@ stdcall GetVersionFromFileW(wstr ptr ptr long)
@ stdcall IsNTAdmin(long ptr)
@ stdcall LaunchINFSectionA(ptr ptr str long)
@ stdcall LaunchINFSectionW(ptr ptr wstr long)
@ stdcall LaunchINFSection(ptr ptr str long) LaunchINFSectionA
@ stdcall LaunchINFSectionA(ptr ptr str long)
@ stdcall LaunchINFSectionEx(ptr ptr str long) LaunchINFSectionExA
@ stdcall LaunchINFSectionExA(ptr ptr str long)
@ stdcall LaunchINFSectionExW(ptr ptr wstr long)
@ stdcall LaunchINFSectionEx(ptr ptr str long) LaunchINFSectionExA
@ stdcall LaunchINFSectionW(ptr ptr wstr long)
@ stdcall NeedReboot(long)
@ stdcall NeedRebootInit()
@ stdcall OpenINFEngine(str str long ptr ptr) OpenINFEngineA
@ stdcall OpenINFEngineA(str str long ptr ptr)
@ stdcall OpenINFEngineW(wstr wstr long ptr ptr)
@ stdcall OpenINFEngine(str str long ptr ptr) OpenINFEngineA
@ stdcall RebootCheckOnInstall(long str str long) RebootCheckOnInstallA
@ stdcall RebootCheckOnInstallA(long str str long)
@ stdcall RebootCheckOnInstallW(long wstr wstr long)
@ stdcall RebootCheckOnInstall(long str str long) RebootCheckOnInstallA
@ stdcall RegInstall(ptr str ptr) RegInstallA
@ stdcall RegInstallA(ptr str ptr)
@ stdcall RegInstallW(ptr wstr ptr)
@ stdcall RegInstall(ptr str ptr) RegInstallA
@ stdcall RegRestoreAll(ptr str long) RegRestoreAllA
@ stdcall RegRestoreAllA(ptr str long)
@ stdcall RegRestoreAllW(ptr wstr long)
@ stdcall RegRestoreAll(ptr str long) RegRestoreAllA
@ stdcall RegSaveRestoreA(ptr str long str str str long)
@ stdcall RegSaveRestoreW(ptr wstr long wstr wstr wstr long)
@ stdcall RegSaveRestore(ptr str long str str str long) RegSaveRestoreA
@ stdcall RegSaveRestoreA(ptr str long str str str long)
@ stdcall RegSaveRestoreOnINF(ptr str str str long long long) RegSaveRestoreOnINFA
@ stdcall RegSaveRestoreOnINFA(ptr str str str long long long)
@ stdcall RegSaveRestoreOnINFW(ptr wstr wstr wstr long long long)
@ stdcall RegSaveRestoreOnINF(ptr str str str long long long) RegSaveRestoreOnINFA
@ stdcall RegSaveRestoreW(ptr wstr long wstr wstr wstr long)
@ stdcall RegisterOCX(ptr ptr str long)
@ stdcall RunSetupCommand(long str str str str ptr long ptr) RunSetupCommandA
@ stdcall RunSetupCommandA(long str str str str ptr long ptr)
@ stdcall RunSetupCommandW(long wstr wstr wstr wstr ptr long ptr)
@ stdcall RunSetupCommand(long str str str str ptr long ptr) RunSetupCommandA
@ stdcall SetPerUserSecValues(ptr) SetPerUserSecValuesA
@ stdcall SetPerUserSecValuesA(ptr)
@ stdcall SetPerUserSecValuesW(ptr)
@ stdcall SetPerUserSecValues(ptr) SetPerUserSecValuesA
@ stdcall TranslateInfStringA(str str str str ptr long ptr ptr)
@ stdcall TranslateInfStringW(wstr wstr wstr wstr ptr long ptr ptr)
@ stdcall TranslateInfString(str str str str ptr long ptr ptr) TranslateInfStringA
@ stdcall TranslateInfStringA(str str str str ptr long ptr ptr)
@ stdcall TranslateInfStringEx(long str str str str long ptr ptr) TranslateInfStringExA
@ stdcall TranslateInfStringExA(long str str str str long ptr ptr)
@ stdcall TranslateInfStringExW(long wstr wstr wstr wstr long ptr ptr)
@ stdcall TranslateInfStringEx(long str str str str long ptr ptr) TranslateInfStringExA
@ stdcall TranslateInfStringW(wstr wstr wstr wstr ptr long ptr ptr)
@ stdcall UserInstStubWrapper(long long str long) UserInstStubWrapperA
@ stdcall UserInstStubWrapperA(long long str long)
@ stdcall UserInstStubWrapperW(long long wstr long)
@ stdcall UserInstStubWrapper(long long str long) UserInstStubWrapperA
@ stdcall UserUnInstStubWrapper(long long str long) UserUnInstStubWrapperA
@ stdcall UserUnInstStubWrapperA(long long str long)
@ stdcall UserUnInstStubWrapperW(long long wstr long)
@ stdcall UserUnInstStubWrapper(long long str long) UserUnInstStubWrapperA
......@@ -21,29 +21,19 @@
#ifndef __ADVPACK_PRIVATE_H
#define __ADVPACK_PRIVATE_H
HRESULT do_ocx_reg(HMODULE hocx, BOOL do_reg, const WCHAR *flags, const WCHAR *param) DECLSPEC_HIDDEN;
LPWSTR get_parameter(LPWSTR *params, WCHAR separator, BOOL quoted) DECLSPEC_HIDDEN;
void set_ldids(HINF hInf, LPCWSTR pszInstallSection, LPCWSTR pszWorkingDir) DECLSPEC_HIDDEN;
HRESULT do_ocx_reg(HMODULE hocx, BOOL do_reg, const WCHAR *flags, const WCHAR *param);
LPWSTR get_parameter(LPWSTR *params, WCHAR separator, BOOL quoted);
void set_ldids(HINF hInf, LPCWSTR pszInstallSection, LPCWSTR pszWorkingDir);
HRESULT launch_exe(LPCWSTR cmd, LPCWSTR dir, HANDLE *phEXE) DECLSPEC_HIDDEN;
HRESULT launch_exe(LPCWSTR cmd, LPCWSTR dir, HANDLE *phEXE);
static inline void *heap_alloc(size_t len)
{
return HeapAlloc(GetProcessHeap(), 0, len);
}
static inline BOOL heap_free(void *mem)
{
return HeapFree(GetProcessHeap(), 0, mem);
}
static inline char *heap_strdupWtoA(const WCHAR *str)
static inline char *strdupWtoA(const WCHAR *str)
{
char *ret = NULL;
if(str) {
size_t size = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
ret = heap_alloc(size);
ret = malloc(size);
if(ret)
WideCharToMultiByte(CP_ACP, 0, str, -1, ret, size, NULL, NULL);
}
......
......@@ -25,13 +25,13 @@
#include "winbase.h"
#include "winuser.h"
#include "winreg.h"
#include "winnls.h"
#include "winver.h"
#include "winternl.h"
#include "setupapi.h"
#include "advpub.h"
#include "fdi.h"
#include "wine/debug.h"
#include "wine/unicode.h"
#include "advpack_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(advpack);
......@@ -46,7 +46,7 @@ static LPWSTR ansi_to_unicode_list(LPCSTR ansi_list)
while (*ptr) ptr += lstrlenA(ptr) + 1;
len = ptr + 1 - ansi_list;
wlen = MultiByteToWideChar(CP_ACP, 0, ansi_list, len, NULL, 0);
list = HeapAlloc(GetProcessHeap(), 0, wlen * sizeof(WCHAR));
list = malloc(wlen * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, ansi_list, len, list, wlen);
return list;
}
......@@ -64,7 +64,7 @@ HRESULT WINAPI AddDelBackupEntryA(LPCSTR lpcszFileList, LPCSTR lpcszBackupDir,
LPCWSTR backup;
HRESULT res;
TRACE("(%s, %s, %s, %d)\n", debugstr_a(lpcszFileList),
TRACE("(%s, %s, %s, %ld)\n", debugstr_a(lpcszFileList),
debugstr_a(lpcszBackupDir), debugstr_a(lpcszBaseName), dwFlags);
if (lpcszFileList)
......@@ -82,7 +82,7 @@ HRESULT WINAPI AddDelBackupEntryA(LPCSTR lpcszFileList, LPCSTR lpcszBackupDir,
res = AddDelBackupEntryW(filelist, backup, basename.Buffer, dwFlags);
HeapFree(GetProcessHeap(), 0, filelist);
free(filelist);
RtlFreeUnicodeString(&backupdir);
RtlFreeUnicodeString(&basename);
......@@ -120,15 +120,7 @@ HRESULT WINAPI AddDelBackupEntryW(LPCWSTR lpcszFileList, LPCWSTR lpcszBackupDir,
WCHAR szIniPath[MAX_PATH];
LPCWSTR szString = NULL;
static const WCHAR szBackupEntry[] = {
'-','1',',','0',',','0',',','0',',','0',',','0',',','-','1',0
};
static const WCHAR backslash[] = {'\\',0};
static const WCHAR ini[] = {'.','i','n','i',0};
static const WCHAR backup[] = {'b','a','c','k','u','p',0};
TRACE("(%s, %s, %s, %d)\n", debugstr_w(lpcszFileList),
TRACE("(%s, %s, %s, %ld)\n", debugstr_w(lpcszFileList),
debugstr_w(lpcszBackupDir), debugstr_w(lpcszBaseName), dwFlags);
if (!lpcszFileList || !*lpcszFileList)
......@@ -139,21 +131,21 @@ HRESULT WINAPI AddDelBackupEntryW(LPCWSTR lpcszFileList, LPCWSTR lpcszBackupDir,
else
GetWindowsDirectoryW(szIniPath, MAX_PATH);
lstrcatW(szIniPath, backslash);
lstrcatW(szIniPath, L"\\");
lstrcatW(szIniPath, lpcszBaseName);
lstrcatW(szIniPath, ini);
lstrcatW(szIniPath, L".ini");
SetFileAttributesW(szIniPath, FILE_ATTRIBUTE_NORMAL);
if (dwFlags & AADBE_ADD_ENTRY)
szString = szBackupEntry;
szString = L"-1,0,0,0,0,0,-1";
else if (dwFlags & AADBE_DEL_ENTRY)
szString = NULL;
/* add or delete the INI entries */
while (*lpcszFileList)
{
WritePrivateProfileStringW(backup, lpcszFileList, szString, szIniPath);
WritePrivateProfileStringW(L"backup", lpcszFileList, szString, szIniPath);
lpcszFileList += lstrlenW(lpcszFileList) + 1;
}
......@@ -201,7 +193,7 @@ HRESULT WINAPI AdvInstallFileA(HWND hwnd, LPCSTR lpszSourceDir, LPCSTR lpszSourc
UNICODE_STRING destdir, destfile;
HRESULT res;
TRACE("(%p, %s, %s, %s, %s, %d, %d)\n", hwnd, debugstr_a(lpszSourceDir),
TRACE("(%p, %s, %s, %s, %s, %ld, %ld)\n", hwnd, debugstr_a(lpszSourceDir),
debugstr_a(lpszSourceFile), debugstr_a(lpszDestDir),
debugstr_a(lpszDestFile), dwFlags, dwReserved);
......@@ -254,11 +246,11 @@ HRESULT WINAPI AdvInstallFileW(HWND hwnd, LPCWSTR lpszSourceDir, LPCWSTR lpszSou
LPWSTR szDestFilename;
LPCWSTR szPath;
WCHAR szRootPath[ROOT_LENGTH];
DWORD dwLen, dwLastError;
DWORD dwLastError;
HSPFILEQ fileQueue;
PVOID pContext;
TRACE("(%p, %s, %s, %s, %s, %d, %d)\n", hwnd, debugstr_w(lpszSourceDir),
TRACE("(%p, %s, %s, %s, %s, %ld, %ld)\n", hwnd, debugstr_w(lpszSourceDir),
debugstr_w(lpszSourceFile), debugstr_w(lpszDestDir),
debugstr_w(lpszDestFile), dwFlags, dwReserved);
......@@ -276,18 +268,7 @@ HRESULT WINAPI AdvInstallFileW(HWND hwnd, LPCWSTR lpszSourceDir, LPCWSTR lpszSou
szPath = lpszSourceDir + ROOT_LENGTH;
/* use lpszSourceFile as destination filename if lpszDestFile is NULL */
if (lpszDestFile)
{
dwLen = lstrlenW(lpszDestFile);
szDestFilename = HeapAlloc(GetProcessHeap(), 0, (dwLen+1) * sizeof(WCHAR));
lstrcpyW(szDestFilename, lpszDestFile);
}
else
{
dwLen = lstrlenW(lpszSourceFile);
szDestFilename = HeapAlloc(GetProcessHeap(), 0, (dwLen+1) * sizeof(WCHAR));
lstrcpyW(szDestFilename, lpszSourceFile);
}
szDestFilename = wcsdup(lpszDestFile ? lpszDestFile : lpszSourceFile);
/* add the file copy operation to the setup queue */
if (!SetupQueueCopyW(fileQueue, szRootPath, szPath, lpszSourceFile, NULL,
......@@ -321,9 +302,9 @@ HRESULT WINAPI AdvInstallFileW(HWND hwnd, LPCWSTR lpszSourceDir, LPCWSTR lpszSou
done:
SetupTermDefaultQueueCallback(pContext);
SetupCloseFileQueue(fileQueue);
HeapFree(GetProcessHeap(), 0, szDestFilename);
free(szDestFilename);
return HRESULT_FROM_WIN32(dwLastError);
}
......@@ -332,10 +313,6 @@ static HRESULT DELNODE_recurse_dirtree(LPWSTR fname, DWORD flags)
DWORD fattrs = GetFileAttributesW(fname);
HRESULT ret = E_FAIL;
static const WCHAR asterisk[] = {'*',0};
static const WCHAR dot[] = {'.',0};
static const WCHAR dotdot[] = {'.','.',0};
if (fattrs & FILE_ATTRIBUTE_DIRECTORY)
{
HANDLE hFindFile;
......@@ -345,7 +322,7 @@ static HRESULT DELNODE_recurse_dirtree(LPWSTR fname, DWORD flags)
/* Generate a path with wildcard suitable for iterating */
if (fname_len && fname[fname_len-1] != '\\') fname[fname_len++] = '\\';
lstrcpyW(fname + fname_len, asterisk);
lstrcpyW(fname + fname_len, L"*");
if ((hFindFile = FindFirstFileW(fname, &w32fd)) != INVALID_HANDLE_VALUE)
{
......@@ -353,8 +330,7 @@ static HRESULT DELNODE_recurse_dirtree(LPWSTR fname, DWORD flags)
for (done = FALSE; !done; done = !FindNextFileW(hFindFile, &w32fd))
{
TRACE("%s\n", debugstr_w(w32fd.cFileName));
if (lstrcmpW(dot, w32fd.cFileName) != 0 &&
lstrcmpW(dotdot, w32fd.cFileName) != 0)
if (lstrcmpW(L".", w32fd.cFileName) != 0 && lstrcmpW(L"..", w32fd.cFileName) != 0)
{
lstrcpyW(fname + fname_len, w32fd.cFileName);
if (DELNODE_recurse_dirtree(fname, flags) != S_OK)
......@@ -400,7 +376,7 @@ HRESULT WINAPI DelNodeA(LPCSTR pszFileOrDirName, DWORD dwFlags)
UNICODE_STRING fileordirname;
HRESULT res;
TRACE("(%s, %d)\n", debugstr_a(pszFileOrDirName), dwFlags);
TRACE("(%s, %ld)\n", debugstr_a(pszFileOrDirName), dwFlags);
RtlCreateUnicodeStringFromAsciiz(&fileordirname, pszFileOrDirName);
......@@ -434,7 +410,7 @@ HRESULT WINAPI DelNodeW(LPCWSTR pszFileOrDirName, DWORD dwFlags)
WCHAR fname[MAX_PATH];
HRESULT ret = E_FAIL;
TRACE("(%s, %d)\n", debugstr_w(pszFileOrDirName), dwFlags);
TRACE("(%s, %ld)\n", debugstr_w(pszFileOrDirName), dwFlags);
if (dwFlags)
FIXME("Flags ignored!\n");
......@@ -496,20 +472,19 @@ HRESULT WINAPI DelNodeRunDLL32W(HWND hWnd, HINSTANCE hInst, LPWSTR cmdline, INT
TRACE("(%p, %p, %s, %i)\n", hWnd, hInst, debugstr_w(cmdline), show);
cmdline_copy = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(cmdline) + 1) * sizeof(WCHAR));
cmdline_copy = wcsdup(cmdline);
cmdline_ptr = cmdline_copy;
lstrcpyW(cmdline_copy, cmdline);
/* get the parameters at indexes 0 and 1 respectively */
szFilename = get_parameter(&cmdline_ptr, ',', TRUE);
szFlags = get_parameter(&cmdline_ptr, ',', TRUE);
if (szFlags)
dwFlags = atolW(szFlags);
dwFlags = wcstol(szFlags, NULL, 10);
res = DelNodeW(szFilename, dwFlags);
HeapFree(GetProcessHeap(), 0, cmdline_copy);
free(cmdline_copy);
return res;
}
......@@ -562,14 +537,14 @@ static LPSTR convert_file_list(LPCSTR FileList, DWORD *dwNumFiles)
return NULL;
dwLen = last - first + 3; /* room for double-null termination */
szConvertedList = HeapAlloc(GetProcessHeap(), 0, dwLen);
szConvertedList = malloc(dwLen);
lstrcpynA(szConvertedList, first, dwLen - 1);
szConvertedList[dwLen - 1] = '\0';
/* empty list */
if (!szConvertedList[0])
{
HeapFree(GetProcessHeap(), 0, szConvertedList);
free(szConvertedList);
return NULL;
}
......@@ -593,8 +568,8 @@ static LPSTR convert_file_list(LPCSTR FileList, DWORD *dwNumFiles)
static void free_file_node(struct FILELIST *pNode)
{
HeapFree(GetProcessHeap(), 0, pNode->FileName);
HeapFree(GetProcessHeap(), 0, pNode);
free(pNode->FileName);
free(pNode);
}
/* determines whether szFile is in the NULL-separated szFileList */
......@@ -695,7 +670,7 @@ HRESULT WINAPI ExtractFilesA(LPCSTR CabName, LPCSTR ExpandDir, DWORD Flags,
DWORD dwFilesFound = 0;
LPSTR szConvertedList = NULL;
TRACE("(%s, %s, %d, %s, %p, %d)\n", debugstr_a(CabName), debugstr_a(ExpandDir),
TRACE("(%s, %s, %ld, %s, %p, %ld)\n", debugstr_a(CabName), debugstr_a(ExpandDir),
Flags, debugstr_a(FileList), LReserved, Reserved);
if (!CabName || !ExpandDir)
......@@ -744,7 +719,7 @@ HRESULT WINAPI ExtractFilesA(LPCSTR CabName, LPCSTR ExpandDir, DWORD Flags,
done:
free_file_list(&session);
FreeLibrary(hCabinet);
HeapFree(GetProcessHeap(), 0, szConvertedList);
free(szConvertedList);
return res;
}
......@@ -783,23 +758,23 @@ HRESULT WINAPI ExtractFilesW(LPCWSTR CabName, LPCWSTR ExpandDir, DWORD Flags,
char *cab_name = NULL, *expand_dir = NULL, *file_list = NULL;
HRESULT hres = S_OK;
TRACE("(%s, %s, %d, %s, %p, %d)\n", debugstr_w(CabName), debugstr_w(ExpandDir),
TRACE("(%s, %s, %ld, %s, %p, %ld)\n", debugstr_w(CabName), debugstr_w(ExpandDir),
Flags, debugstr_w(FileList), LReserved, Reserved);
if(CabName) {
cab_name = heap_strdupWtoA(CabName);
cab_name = strdupWtoA(CabName);
if(!cab_name)
return E_OUTOFMEMORY;
}
if(ExpandDir) {
expand_dir = heap_strdupWtoA(ExpandDir);
expand_dir = strdupWtoA(ExpandDir);
if(!expand_dir)
hres = E_OUTOFMEMORY;
}
if(SUCCEEDED(hres) && FileList) {
file_list = heap_strdupWtoA(FileList);
file_list = strdupWtoA(FileList);
if(!file_list)
hres = E_OUTOFMEMORY;
}
......@@ -809,9 +784,9 @@ HRESULT WINAPI ExtractFilesW(LPCWSTR CabName, LPCWSTR ExpandDir, DWORD Flags,
if(SUCCEEDED(hres))
hres = ExtractFilesA(cab_name, expand_dir, Flags, file_list, LReserved, Reserved);
heap_free(cab_name);
heap_free(expand_dir);
heap_free(file_list);
free(cab_name);
free(expand_dir);
free(file_list);
return hres;
}
......@@ -862,7 +837,7 @@ HRESULT WINAPI FileSaveRestoreA(HWND hDlg, LPSTR pszFileList, LPSTR pszDir,
UNICODE_STRING filelist, dir, basename;
HRESULT hr;
TRACE("(%p, %s, %s, %s, %d)\n", hDlg, debugstr_a(pszFileList),
TRACE("(%p, %s, %s, %s, %ld)\n", hDlg, debugstr_a(pszFileList),
debugstr_a(pszDir), debugstr_a(pszBaseName), dwFlags);
RtlCreateUnicodeStringFromAsciiz(&filelist, pszFileList);
......@@ -904,7 +879,7 @@ HRESULT WINAPI FileSaveRestoreA(HWND hDlg, LPSTR pszFileList, LPSTR pszDir,
HRESULT WINAPI FileSaveRestoreW(HWND hDlg, LPWSTR pszFileList, LPWSTR pszDir,
LPWSTR pszBaseName, DWORD dwFlags)
{
FIXME("(%p, %s, %s, %s, %d) stub\n", hDlg, debugstr_w(pszFileList),
FIXME("(%p, %s, %s, %s, %ld) stub\n", hDlg, debugstr_w(pszFileList),
debugstr_w(pszDir), debugstr_w(pszBaseName), dwFlags);
return E_FAIL;
......@@ -923,7 +898,7 @@ HRESULT WINAPI FileSaveRestoreOnINFA(HWND hWnd, LPCSTR pszTitle, LPCSTR pszINF,
UNICODE_STRING backupdir, backupfile;
HRESULT hr;
TRACE("(%p, %s, %s, %s, %s, %s, %d)\n", hWnd, debugstr_a(pszTitle),
TRACE("(%p, %s, %s, %s, %s, %s, %ld)\n", hWnd, debugstr_a(pszTitle),
debugstr_a(pszINF), debugstr_a(pszSection), debugstr_a(pszBackupDir),
debugstr_a(pszBaseBackupFile), dwFlags);
......@@ -972,7 +947,7 @@ HRESULT WINAPI FileSaveRestoreOnINFW(HWND hWnd, LPCWSTR pszTitle, LPCWSTR pszINF
LPCWSTR pszSection, LPCWSTR pszBackupDir,
LPCWSTR pszBaseBackupFile, DWORD dwFlags)
{
FIXME("(%p, %s, %s, %s, %s, %s, %d): stub\n", hWnd, debugstr_w(pszTitle),
FIXME("(%p, %s, %s, %s, %s, %s, %ld): stub\n", hWnd, debugstr_w(pszTitle),
debugstr_w(pszINF), debugstr_w(pszSection), debugstr_w(pszBackupDir),
debugstr_w(pszBaseBackupFile), dwFlags);
......@@ -1063,12 +1038,6 @@ HRESULT WINAPI GetVersionFromFileExW(LPCWSTR lpszFilename, LPDWORD pdwMSVer,
BOOL bFileCopied = FALSE;
UINT uValueLen;
static const WCHAR backslash[] = {'\\',0};
static const WCHAR translation[] = {
'\\','V','a','r','F','i','l','e','I','n','f','o',
'\\','T','r','a','n','s','l','a','t','i','o','n',0
};
TRACE("(%s, %p, %p, %d)\n", debugstr_w(lpszFilename),
pdwMSVer, pdwLSVer, bVersion);
......@@ -1097,7 +1066,7 @@ HRESULT WINAPI GetVersionFromFileExW(LPCWSTR lpszFilename, LPDWORD pdwMSVer,
goto done;
}
pVersionInfo = HeapAlloc(GetProcessHeap(), 0, dwInfoSize);
pVersionInfo = malloc(dwInfoSize);
if (!pVersionInfo)
goto done;
......@@ -1106,8 +1075,7 @@ HRESULT WINAPI GetVersionFromFileExW(LPCWSTR lpszFilename, LPDWORD pdwMSVer,
if (bVersion)
{
if (!VerQueryValueW(pVersionInfo, backslash,
(LPVOID *)&pFixedVersionInfo, &uValueLen))
if (!VerQueryValueW(pVersionInfo, L"\\", (void **)&pFixedVersionInfo, &uValueLen))
goto done;
if (!uValueLen)
......@@ -1118,7 +1086,7 @@ HRESULT WINAPI GetVersionFromFileExW(LPCWSTR lpszFilename, LPDWORD pdwMSVer,
}
else
{
if (!VerQueryValueW(pVersionInfo, translation,
if (!VerQueryValueW(pVersionInfo, L"\\VarFileInfo\\Translation",
(LPVOID *)&pLangAndCodePage, &uValueLen))
goto done;
......@@ -1130,7 +1098,7 @@ HRESULT WINAPI GetVersionFromFileExW(LPCWSTR lpszFilename, LPDWORD pdwMSVer,
}
done:
HeapFree(GetProcessHeap(), 0, pVersionInfo);
free(pVersionInfo);
if (bFileCopied)
DeleteFileW(szFile);
......
......@@ -31,7 +31,6 @@
#include "advpub.h"
#include "ole2.h"
#include "wine/debug.h"
#include "wine/unicode.h"
#include "advpack_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(advpack);
......@@ -60,20 +59,6 @@ typedef struct _ADVInfo
typedef HRESULT (*iterate_fields_func)(HINF hinf, PCWSTR field, const void *arg);
/* Advanced INF commands */
static const WCHAR CheckAdminRights[] = {
'C','h','e','c','k','A','d','m','i','n','R','i','g','h','t','s',0
};
static const WCHAR DelDirs[] = {'D','e','l','D','i','r','s',0};
static const WCHAR PerUserInstall[] = {'P','e','r','U','s','e','r','I','n','s','t','a','l','l',0};
static const WCHAR RegisterOCXs[] = {'R','e','g','i','s','t','e','r','O','C','X','s',0};
static const WCHAR RunPreSetupCommands[] = {
'R','u','n','P','r','e','S','e','t','u','p','C','o','m','m','a','n','d','s',0
};
static const WCHAR RunPostSetupCommands[] = {
'R','u','n','P','o','s','t','S','e','t','u','p','C','o','m','m','a','n','d','s',0
};
/* Advanced INF callbacks */
static HRESULT del_dirs_callback(HINF hinf, PCWSTR field, const void *arg)
{
......@@ -104,39 +89,25 @@ static HRESULT per_user_install_callback(HINF hinf, PCWSTR field, const void *ar
INFCONTEXT context;
DWORD size;
static const WCHAR disp_name[] = {'D','i','s','p','l','a','y','N','a','m','e',0};
static const WCHAR version[] = {'V','e','r','s','i','o','n',0};
static const WCHAR is_installed[] = {'I','s','I','n','s','t','a','l','l','e','d',0};
static const WCHAR comp_id[] = {'C','o','m','p','o','n','e','n','t','I','D',0};
static const WCHAR guid[] = {'G','U','I','D',0};
static const WCHAR locale[] = {'L','o','c','a','l','e',0};
static const WCHAR stub_path[] = {'S','t','u','b','P','a','t','h',0};
per_user.bRollback = FALSE;
per_user.dwIsInstalled = 0;
SetupGetLineTextW(NULL, hinf, field, disp_name, per_user.szDispName,
sizeof(per_user.szDispName) / sizeof(WCHAR), &size);
SetupGetLineTextW(NULL, hinf, field, L"DisplayName", per_user.szDispName, ARRAY_SIZE(per_user.szDispName), &size);
SetupGetLineTextW(NULL, hinf, field, version, per_user.szVersion,
sizeof(per_user.szVersion) / sizeof(WCHAR), &size);
SetupGetLineTextW(NULL, hinf, field, L"Version", per_user.szVersion, ARRAY_SIZE(per_user.szVersion), &size);
if (SetupFindFirstLineW(hinf, field, is_installed, &context))
if (SetupFindFirstLineW(hinf, field, L"IsInstalled", &context))
{
SetupGetIntField(&context, 1, (PINT)&per_user.dwIsInstalled);
}
SetupGetLineTextW(NULL, hinf, field, comp_id, per_user.szCompID,
sizeof(per_user.szCompID) / sizeof(WCHAR), &size);
SetupGetLineTextW(NULL, hinf, field, L"ComponentID", per_user.szCompID, ARRAY_SIZE(per_user.szCompID), &size);
SetupGetLineTextW(NULL, hinf, field, guid, per_user.szGUID,
sizeof(per_user.szGUID) / sizeof(WCHAR), &size);
SetupGetLineTextW(NULL, hinf, field, L"GUID", per_user.szGUID, ARRAY_SIZE(per_user.szGUID), &size);
SetupGetLineTextW(NULL, hinf, field, locale, per_user.szLocale,
sizeof(per_user.szLocale) / sizeof(WCHAR), &size);
SetupGetLineTextW(NULL, hinf, field, L"Locale", per_user.szLocale, ARRAY_SIZE(per_user.szLocale), &size);
SetupGetLineTextW(NULL, hinf, field, stub_path, per_user.szStub,
sizeof(per_user.szStub) / sizeof(WCHAR), &size);
SetupGetLineTextW(NULL, hinf, field, L"StubPath", per_user.szStub, ARRAY_SIZE(per_user.szStub), &size);
return SetPerUserSecValuesW(&per_user);
}
......@@ -154,8 +125,7 @@ static HRESULT register_ocxs_callback(HINF hinf, PCWSTR field, const void *arg)
WCHAR buffer[MAX_INF_STRING_LENGTH];
/* get OCX filename */
if (!SetupGetStringFieldW(&context, 1, buffer,
sizeof(buffer) / sizeof(WCHAR), NULL))
if (!SetupGetStringFieldW(&context, 1, buffer, ARRAY_SIZE(buffer), NULL))
continue;
hm = LoadLibraryExW(buffer, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
......@@ -214,7 +184,7 @@ LPWSTR get_parameter(LPWSTR *params, WCHAR separator, BOOL quoted)
if (quoted && *token == '"')
{
WCHAR *end = strchrW(token + 1, '"');
WCHAR *end = wcschr(token + 1, '"');
if (end)
{
*end = 0;
......@@ -223,7 +193,7 @@ LPWSTR get_parameter(LPWSTR *params, WCHAR separator, BOOL quoted)
}
}
*params = strchrW(*params, separator);
*params = wcschr(*params, separator);
if (*params)
*(*params)++ = '\0';
......@@ -257,13 +227,13 @@ static WCHAR *get_field_string(INFCONTEXT *context, DWORD index, WCHAR *buffer,
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
/* now grow the buffer */
if (buffer != static_buffer) HeapFree(GetProcessHeap(), 0, buffer);
if (!(buffer = HeapAlloc(GetProcessHeap(), 0, required*sizeof(WCHAR)))) return NULL;
if (buffer != static_buffer) free(buffer);
if (!(buffer = malloc(required*sizeof(WCHAR)))) return NULL;
*size = required;
if (SetupGetStringFieldW(context, index, buffer, *size, &required)) return buffer;
}
if (buffer != static_buffer) HeapFree(GetProcessHeap(), 0, buffer);
if (buffer != static_buffer) free(buffer);
return NULL;
}
......@@ -273,7 +243,7 @@ static HRESULT iterate_section_fields(HINF hinf, PCWSTR section, PCWSTR key,
{
WCHAR static_buffer[200];
WCHAR *buffer = static_buffer;
DWORD size = sizeof(static_buffer) / sizeof(WCHAR);
DWORD size = ARRAY_SIZE(static_buffer);
INFCONTEXT context;
HRESULT hr = E_FAIL;
......@@ -297,7 +267,7 @@ static HRESULT iterate_section_fields(HINF hinf, PCWSTR section, PCWSTR key,
hr = S_OK;
done:
if (buffer != static_buffer) HeapFree(GetProcessHeap(), 0, buffer);
if (buffer != static_buffer) free(buffer);
return hr;
}
......@@ -307,8 +277,7 @@ static HRESULT check_admin_rights(const ADVInfo *info)
INFCONTEXT context;
HRESULT hr = S_OK;
if (!SetupFindFirstLineW(info->hinf, info->install_sec,
CheckAdminRights, &context))
if (!SetupFindFirstLineW(info->hinf, info->install_sec, L"CheckAdminRights", &context))
return S_OK;
if (!SetupGetIntField(&context, 1, &check))
......@@ -364,30 +333,29 @@ static HRESULT adv_install(ADVInfo *info)
if (hr != S_OK)
return hr;
hr = iterate_section_fields(info->hinf, info->install_sec, RunPreSetupCommands,
hr = iterate_section_fields(info->hinf, info->install_sec, L"RunPreSetupCommands",
run_setup_commands_callback, info);
if (hr != S_OK)
return hr;
OleInitialize(NULL);
hr = iterate_section_fields(info->hinf, info->install_sec,
RegisterOCXs, register_ocxs_callback, NULL);
L"RegisterOCXs", register_ocxs_callback, NULL);
OleUninitialize();
if (hr != S_OK)
return hr;
hr = iterate_section_fields(info->hinf, info->install_sec,
PerUserInstall, per_user_install_callback, info);
L"PerUserInstall", per_user_install_callback, info);
if (hr != S_OK)
return hr;
hr = iterate_section_fields(info->hinf, info->install_sec, RunPostSetupCommands,
hr = iterate_section_fields(info->hinf, info->install_sec, L"RunPostSetupCommands",
run_setup_commands_callback, info);
if (hr != S_OK)
return hr;
hr = iterate_section_fields(info->hinf, info->install_sec,
DelDirs, del_dirs_callback, info);
hr = iterate_section_fields(info->hinf, info->install_sec, L"DelDirs", del_dirs_callback, info);
if (hr != S_OK)
return hr;
......@@ -401,10 +369,7 @@ static HRESULT get_working_dir(ADVInfo *info, LPCWSTR inf_filename, LPCWSTR work
LPCWSTR ptr;
DWORD len;
static const WCHAR backslash[] = {'\\',0};
static const WCHAR inf_dir[] = {'\\','I','N','F',0};
if ((ptr = strrchrW(inf_filename, '\\')))
if ((ptr = wcsrchr(inf_filename, '\\')))
{
len = ptr - inf_filename + 1;
ptr = inf_filename;
......@@ -417,7 +382,7 @@ static HRESULT get_working_dir(ADVInfo *info, LPCWSTR inf_filename, LPCWSTR work
else
{
GetCurrentDirectoryW(MAX_PATH, path);
lstrcatW(path, backslash);
lstrcatW(path, L"\\");
lstrcatW(path, inf_filename);
/* check if the INF file is in the current directory */
......@@ -429,14 +394,14 @@ static HRESULT get_working_dir(ADVInfo *info, LPCWSTR inf_filename, LPCWSTR work
{
/* default to the windows\inf directory if all else fails */
GetWindowsDirectoryW(path, MAX_PATH);
lstrcatW(path, inf_dir);
lstrcatW(path, L"\\INF");
}
len = lstrlenW(path) + 1;
ptr = path;
}
info->working_dir = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
info->working_dir = malloc(len * sizeof(WCHAR));
if (!info->working_dir)
return E_OUTOFMEMORY;
......@@ -453,54 +418,32 @@ static HRESULT install_init(LPCWSTR inf_filename, LPCWSTR install_sec,
HRESULT hr;
LPCWSTR ptr, path;
static const WCHAR backslash[] = {'\\',0};
static const WCHAR default_install[] = {
'D','e','f','a','u','l','t','I','n','s','t','a','l','l',0
};
if (!(ptr = strrchrW(inf_filename, '\\')))
if (!(ptr = wcsrchr(inf_filename, '\\')))
ptr = inf_filename;
len = lstrlenW(ptr);
info->inf_filename = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
info->inf_filename = wcsdup(ptr);
if (!info->inf_filename)
return E_OUTOFMEMORY;
lstrcpyW(info->inf_filename, ptr);
/* FIXME: determine the proper platform to install (NTx86, etc) */
if (!install_sec || !*install_sec)
{
len = sizeof(default_install) - 1;
ptr = default_install;
}
else
{
len = lstrlenW(install_sec);
ptr = install_sec;
}
info->install_sec = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
info->install_sec = wcsdup(install_sec && *install_sec ? install_sec : L"DefaultInstall");
if (!info->install_sec)
return E_OUTOFMEMORY;
lstrcpyW(info->install_sec, ptr);
hr = get_working_dir(info, inf_filename, working_dir);
if (FAILED(hr))
return hr;
len = lstrlenW(info->working_dir) + lstrlenW(info->inf_filename) + 2;
info->inf_path = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
info->inf_path = malloc(len * sizeof(WCHAR));
if (!info->inf_path)
return E_OUTOFMEMORY;
lstrcpyW(info->inf_path, info->working_dir);
lstrcatW(info->inf_path, backslash);
lstrcatW(info->inf_path, L"\\");
lstrcatW(info->inf_path, info->inf_filename);
/* RunSetupCommand opens unmodifed filename parameter */
/* RunSetupCommand opens unmodified filename parameter */
if (flags & RSC_FLAG_INF)
path = inf_filename;
else
......@@ -525,10 +468,10 @@ static void install_release(const ADVInfo *info)
{
SetupCloseInfFile(info->hinf);
HeapFree(GetProcessHeap(), 0, info->inf_path);
HeapFree(GetProcessHeap(), 0, info->inf_filename);
HeapFree(GetProcessHeap(), 0, info->install_sec);
HeapFree(GetProcessHeap(), 0, info->working_dir);
free(info->inf_path);
free(info->inf_filename);
free(info->install_sec);
free(info->working_dir);
}
/* this structure very closely resembles parameters of RunSetupCommand() */
......@@ -573,7 +516,7 @@ static HRESULT DoInfInstallW(const SETUPCOMMAND_PARAMSW *setup)
done:
install_release(&info);
return S_OK;
return hr;
}
/***********************************************************************
......@@ -645,8 +588,7 @@ HRESULT WINAPI ExecuteCabA(HWND hwnd, CABINFOA* pCab, LPVOID pReserved)
RtlCreateUnicodeStringFromAsciiz(&inf, pCab->pszInf);
RtlCreateUnicodeStringFromAsciiz(&section, pCab->pszSection);
MultiByteToWideChar(CP_ACP, 0, pCab->szSrcPath, -1, cabinfo.szSrcPath,
sizeof(cabinfo.szSrcPath) / sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, pCab->szSrcPath, -1, cabinfo.szSrcPath, ARRAY_SIZE(cabinfo.szSrcPath));
cabinfo.pszInf = inf.Buffer;
cabinfo.pszSection = section.Buffer;
......@@ -686,8 +628,15 @@ HRESULT WINAPI ExecuteCabW(HWND hwnd, CABINFOW* pCab, LPVOID pReserved)
ZeroMemory(&info, sizeof(ADVInfo));
if (pCab->pszCab && *pCab->pszCab)
FIXME("Cab archive not extracted!\n");
if ((pCab->pszCab && *pCab->pszCab) && (pCab->pszInf && *pCab->pszInf) && *pCab->szSrcPath)
{
TRACE("pszCab: %s, pszInf: %s, szSrcPath: %s\n", debugstr_w(pCab->pszCab), debugstr_w(pCab->pszInf),
debugstr_w(pCab->szSrcPath));
hr = ExtractFilesW(pCab->pszCab, pCab->szSrcPath, 0, pCab->pszInf, NULL, 0);
if (FAILED(hr))
ERR("Failed to extract .inf file!\n");
}
hr = install_init(pCab->pszInf, pCab->pszSection, pCab->szSrcPath, pCab->dwFlags, &info);
if (hr != S_OK)
......@@ -767,9 +716,8 @@ INT WINAPI LaunchINFSectionW(HWND hWnd, HINSTANCE hInst, LPWSTR cmdline, INT sho
if (!cmdline)
return ADV_FAILURE;
cmdline_copy = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(cmdline) + 1) * sizeof(WCHAR));
cmdline_copy = wcsdup(cmdline);
cmdline_ptr = cmdline_copy;
lstrcpyW(cmdline_copy, cmdline);
inf_filename = get_parameter(&cmdline_ptr, ',', TRUE);
install_sec = get_parameter(&cmdline_ptr, ',', TRUE);
......@@ -777,7 +725,7 @@ INT WINAPI LaunchINFSectionW(HWND hWnd, HINSTANCE hInst, LPWSTR cmdline, INT sho
str_flags = get_parameter(&cmdline_ptr, ',', TRUE);
if (str_flags)
{
DWORD inf_flags = atolW(str_flags);
DWORD inf_flags = wcstol(str_flags, NULL, 10);
if (inf_flags & LIS_QUIET) flags |= RSC_FLAG_QUIET;
if (inf_flags & LIS_NOGRPCONV) flags |= RSC_FLAG_NGCONV;
}
......@@ -796,7 +744,7 @@ INT WINAPI LaunchINFSectionW(HWND hWnd, HINSTANCE hInst, LPWSTR cmdline, INT sho
done:
install_release(&info);
HeapFree(GetProcessHeap(), 0, cmdline_copy);
free(cmdline_copy);
return SUCCEEDED(hr) ? ADV_SUCCESS : ADV_FAILURE;
}
......@@ -864,9 +812,8 @@ HRESULT WINAPI LaunchINFSectionExW(HWND hWnd, HINSTANCE hInst, LPWSTR cmdline, I
if (!cmdline)
return ADV_FAILURE;
cmdline_copy = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(cmdline) + 1) * sizeof(WCHAR));
cmdline_copy = wcsdup(cmdline);
cmdline_ptr = cmdline_copy;
lstrcpyW(cmdline_copy, cmdline);
cabinfo.pszInf = get_parameter(&cmdline_ptr, ',', TRUE);
cabinfo.pszSection = get_parameter(&cmdline_ptr, ',', TRUE);
......@@ -875,11 +822,11 @@ HRESULT WINAPI LaunchINFSectionExW(HWND hWnd, HINSTANCE hInst, LPWSTR cmdline, I
flags = get_parameter(&cmdline_ptr, ',', TRUE);
if (flags)
cabinfo.dwFlags = atolW(flags);
cabinfo.dwFlags = wcstol(flags, NULL, 10);
if (!is_full_path(cabinfo.pszCab) && !is_full_path(cabinfo.pszInf))
{
HeapFree(GetProcessHeap(), 0, cmdline_copy);
free(cmdline_copy);
return E_INVALIDARG;
}
......@@ -891,12 +838,12 @@ HRESULT WINAPI LaunchINFSectionExW(HWND hWnd, HINSTANCE hInst, LPWSTR cmdline, I
else
lstrcpyW(cabinfo.szSrcPath, cabinfo.pszCab);
ptr = strrchrW(cabinfo.szSrcPath, '\\');
ptr = wcsrchr(cabinfo.szSrcPath, '\\');
*(++ptr) = '\0';
}
hr = ExecuteCabW(hWnd, &cabinfo, NULL);
HeapFree(GetProcessHeap(), 0, cmdline_copy);
free(cmdline_copy);
return SUCCEEDED(hr) ? ADV_SUCCESS : ADV_FAILURE;
}
......@@ -947,7 +894,7 @@ HRESULT WINAPI RunSetupCommandA(HWND hWnd, LPCSTR szCmdName,
UNICODE_STRING dir, title;
HRESULT hr;
TRACE("(%p, %s, %s, %s, %s, %p, %d, %p)\n",
TRACE("(%p, %s, %s, %s, %s, %p, %ld, %p)\n",
hWnd, debugstr_a(szCmdName), debugstr_a(szInfSection),
debugstr_a(szDir), debugstr_a(lpszTitle),
phEXE, dwFlags, pvReserved);
......@@ -1004,7 +951,7 @@ HRESULT WINAPI RunSetupCommandW(HWND hWnd, LPCWSTR szCmdName,
ADVInfo info;
HRESULT hr;
TRACE("(%p, %s, %s, %s, %s, %p, %d, %p)\n",
TRACE("(%p, %s, %s, %s, %s, %p, %ld, %p)\n",
hWnd, debugstr_w(szCmdName), debugstr_w(szInfSection),
debugstr_w(szDir), debugstr_w(lpszTitle),
phEXE, dwFlags, pvReserved);
......