zmc
2023-10-12 ed135d79df12a2466b52dae1a82326941211dcc9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#
# (C) Copyright 2015 Enthought, Inc., Austin, TX
# All right reserved.
#
# This file is open source software distributed according to the terms in
# LICENSE.txt
#
from __future__ import absolute_import
 
 
from win32ctypes.core.compat import text_type
from ._util import (
    ffi, check_null, check_zero, check_false, HMODULE,
    PVOID, RESOURCE, resource, dlls)
 
 
ffi.cdef("""
 
typedef int WINBOOL;
typedef WINBOOL (__stdcall *ENUMRESTYPEPROC) (HANDLE, LPTSTR, LONG_PTR);
typedef WINBOOL (__stdcall *ENUMRESNAMEPROC) (HANDLE, LPCTSTR, LPTSTR, LONG_PTR);
typedef WINBOOL (__stdcall *ENUMRESLANGPROC) (HANDLE, LPCTSTR, LPCTSTR, WORD, LONG_PTR);
 
BOOL WINAPI EnumResourceTypesW(
    HMODULE hModule, ENUMRESTYPEPROC lpEnumFunc, LONG_PTR lParam);
BOOL WINAPI EnumResourceNamesW(
    HMODULE hModule, LPCTSTR lpszType,
    ENUMRESNAMEPROC lpEnumFunc, LONG_PTR lParam);
BOOL WINAPI EnumResourceLanguagesW(
    HMODULE hModule, LPCTSTR lpType,
    LPCTSTR lpName, ENUMRESLANGPROC lpEnumFunc, LONG_PTR lParam);
HRSRC WINAPI FindResourceExW(
    HMODULE hModule, LPCTSTR lpType, LPCTSTR lpName, WORD wLanguage);
DWORD WINAPI SizeofResource(HMODULE hModule, HRSRC hResInfo);
HGLOBAL WINAPI LoadResource(HMODULE hModule, HRSRC hResInfo);
LPVOID WINAPI LockResource(HGLOBAL hResData);
 
HANDLE WINAPI BeginUpdateResourceW(LPCTSTR pFileName, BOOL bDeleteExistingResources);
BOOL WINAPI EndUpdateResourceW(HANDLE hUpdate, BOOL fDiscard);
BOOL WINAPI UpdateResourceW(HANDLE hUpdate, LPCTSTR lpType, LPCTSTR lpName, WORD wLanguage, LPVOID lpData, DWORD cbData);
 
""")
 
 
def ENUMRESTYPEPROC(callback):
    def wrapped(hModule, lpszType, lParam):
        return callback(hModule, resource(lpszType), lParam)
    return wrapped
 
 
def ENUMRESNAMEPROC(callback):
    def wrapped(hModule, lpszType, lpszName, lParam):
        return callback(
            hModule, resource(lpszType), resource(lpszName), lParam)
    return wrapped
 
 
def ENUMRESLANGPROC(callback):
    def wrapped(hModule, lpszType, lpszName, wIDLanguage, lParam):
        return callback(
            hModule, resource(lpszType), resource(lpszName),
            wIDLanguage, lParam)
    return wrapped
 
 
def _EnumResourceTypes(hModule, lpEnumFunc, lParam):
    callback = ffi.callback('ENUMRESTYPEPROC', lpEnumFunc)
    check_false(
        dlls.kernel32.EnumResourceTypesW(PVOID(hModule), callback, lParam),
        function_name='EnumResourceTypes')
 
 
def _EnumResourceNames(hModule, lpszType, lpEnumFunc, lParam):
    callback = ffi.callback('ENUMRESNAMEPROC', lpEnumFunc)
    check_false(
        dlls.kernel32.EnumResourceNamesW(
            PVOID(hModule), RESOURCE(lpszType), callback, lParam),
        function_name='EnumResourceNames')
 
 
def _EnumResourceLanguages(hModule, lpType, lpName, lpEnumFunc, lParam):
    callback = ffi.callback('ENUMRESLANGPROC', lpEnumFunc)
    check_false(
        dlls.kernel32.EnumResourceLanguagesW(
            PVOID(hModule), RESOURCE(lpType),
            RESOURCE(lpName), callback, lParam),
        function_name='EnumResourceLanguages')
 
 
def _FindResourceEx(hModule, lpType, lpName, wLanguage):
    return check_null(
        dlls.kernel32.FindResourceExW(
            PVOID(hModule), RESOURCE(lpType), RESOURCE(lpName), wLanguage),
        function_name='FindResourceEx')
 
 
def _SizeofResource(hModule, hResInfo):
    return check_zero(
        dlls.kernel32.SizeofResource(PVOID(hModule), hResInfo),
        function_name='SizeofResource')
 
 
def _LoadResource(hModule, hResInfo):
    return check_null(
        dlls.kernel32.LoadResource(PVOID(hModule), hResInfo),
        function_name='LoadResource')
 
 
def _LockResource(hResData):
    return check_null(
        dlls.kernel32.LockResource(hResData),
        function_name='LockResource')
 
 
def _BeginUpdateResource(pFileName, bDeleteExistingResources):
    result = check_null(
        dlls.kernel32.BeginUpdateResourceW(
            text_type(pFileName), bDeleteExistingResources))
    return HMODULE(result)
 
 
def _EndUpdateResource(hUpdate, fDiscard):
    check_false(
        dlls.kernel32.EndUpdateResourceW(PVOID(hUpdate), fDiscard),
        function_name='EndUpdateResource')
 
 
def _UpdateResource(hUpdate, lpType, lpName, wLanguage, cData, cbData):
    lpData = ffi.from_buffer(cData)
    check_false(
        dlls.kernel32.UpdateResourceW(
            PVOID(hUpdate), RESOURCE(lpType), RESOURCE(lpName),
            wLanguage, PVOID(lpData), cbData),
        function_name='UpdateResource')