1 /*
2  * PROJECT:         ReactOS API tests
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * PURPOSE:         Test for NtGdiAddFontResourceW
5  * PROGRAMMERS:     Víctor Martínez Calvo ( victor.martinez@reactos.org )
6  */
7 
8 #include "precomp.h"
9 
10 #include <ndk/rtlfuncs.h>
11 
12 INT
13 APIENTRY
14 NtGdiAddFontResourceW(
15     _In_reads_(cwc) WCHAR *pwszFiles,
16     _In_ ULONG cwc,
17     _In_ ULONG cFiles,
18     _In_ FLONG f,
19     _In_ DWORD dwPidTid,
20     _In_opt_ DESIGNVECTOR *pdv);
21 
22 void Test_NtGdiAddFontResourceW()
23 {
24     WCHAR lpszFontPath[MAX_PATH];
25     WCHAR lpszFontSearch[MAX_PATH];
26 
27     INT ret;
28     UNICODE_STRING NtAbsPath;
29     WIN32_FIND_DATAW FindFileData;
30     HANDLE hFind;
31     ULONG cwc;
32 
33     // Create "Font" folder Path
34     GetWindowsDirectoryW(lpszFontPath, MAX_PATH);
35     StringCbCatW(lpszFontPath, sizeof(lpszFontPath), L"\\Fonts\\");
36 
37     // Search first .ttf file in Fonts Path
38     StringCbCopyW(lpszFontSearch, sizeof(lpszFontSearch), lpszFontPath);
39     StringCbCatW(lpszFontSearch, sizeof(lpszFontSearch), L"*.ttf");
40 
41     hFind = FindFirstFileW(lpszFontSearch, &FindFileData);
42 
43     if (hFind == INVALID_HANDLE_VALUE)
44     {
45         skip("Unable to find fonts in Font directory!\n");
46         return;
47     }
48 
49     // File found. Create FontPath to File.
50     StringCbCatW(lpszFontPath, sizeof(lpszFontPath), FindFileData.cFileName);
51 
52     // Fail due "cwc" being zero.
53     SetLastError(0xdeaddead);
54     RtlInitUnicodeString(&NtAbsPath, NULL);
55     RtlDosPathNameToNtPathName_U(lpszFontPath, &NtAbsPath, NULL, NULL);
56     cwc = 0;
57     ret =  NtGdiAddFontResourceW(NtAbsPath.Buffer, cwc, 1, 0, 0, 0);
58 
59     ok(ret == 0, "Expected 0 files added. Added: %d\n", ret);
60     ok(GetLastError() == 0xdeaddead, "Expected 0xdeaddead. Obtained: 0x%lx\n", GetLastError());
61 
62     RtlFreeUnicodeString(&NtAbsPath);
63 
64     // "cwc" must count the null terminator. Otherwise fails.
65     SetLastError(0xdeaddead);
66     RtlInitUnicodeString(&NtAbsPath, NULL);
67     RtlDosPathNameToNtPathName_U(lpszFontPath, &NtAbsPath, NULL, NULL);
68     cwc = NtAbsPath.Length / sizeof(WCHAR);
69     ret =  NtGdiAddFontResourceW(NtAbsPath.Buffer, cwc, 1, 0, 0, 0);
70 
71     ok(ret == 0, "Expected 0 files added. Added: %d\n", ret);
72     ok(GetLastError() == 0xdeaddead, "Expected 0xdeaddead. Obtained: 0x%lx\n", GetLastError());
73 
74     RtlFreeUnicodeString(&NtAbsPath);
75 
76     // Correct "cwc" value.
77     SetLastError(0xdeaddead);
78     RtlInitUnicodeString(&NtAbsPath, NULL);
79     RtlDosPathNameToNtPathName_U(lpszFontPath, &NtAbsPath, NULL, NULL);
80     cwc = NtAbsPath.Length / sizeof(WCHAR) + 1;
81     ret =  NtGdiAddFontResourceW(NtAbsPath.Buffer, cwc, 1, 0, 0, 0);
82 
83     ok(ret == 1, "Expected 1 files added. Added: %d\n", ret);
84     ok(GetLastError() == 0xdeaddead, "Expected 0xdeaddead. Obtained: 0x%lx\n", GetLastError());
85 
86     RtlFreeUnicodeString(&NtAbsPath);
87 
88     // Test an invalid pointer.
89     SetLastError(0xdeadbeef);
90     ret =  NtGdiAddFontResourceW((PVOID)-4, 123, 1, 0, 0, NULL);
91 
92     ok(ret == 0, "Expected 0 files added. Added: %d\n", ret);
93     ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef. Obtained: 0x%lx\n", GetLastError());
94 }
95 
96 START_TEST(NtGdiAddFontResource)
97 {
98     Test_NtGdiAddFontResourceW();
99 }
100