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