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
|
#include <Python.h>
#include <Windows.h>
#include <Common/UefiBaseTypes.h>
/*
SaveFileToDisk(FilePath, Content)
*/
STATIC
PyObject*
SaveFileToDisk (
PyObject *Self,
PyObject *Args
)
{
CHAR8 *File;
UINT8 *Data;
UINTN DataLength;
UINTN WriteBytes;
UINTN Status;
HANDLE FileHandle;
PyObject *ReturnValue = Py_False;
Status = PyArg_ParseTuple(
Args,
"ss#",
&File,
&Data,
&DataLength
);
if (Status == 0) {
return NULL;
}
FileHandle = CreateFile(
File,
GENERIC_WRITE,
FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (FileHandle == INVALID_HANDLE_VALUE) {
PyErr_SetString(PyExc_Exception, "File creation failure");
return NULL;
}
while (WriteFile(FileHandle, Data, DataLength, &WriteBytes, NULL)) {
if (DataLength <= WriteBytes) {
DataLength = 0;
break;
}
Data += WriteBytes;
DataLength -= WriteBytes;
}
if (DataLength != 0) {
// file saved unsuccessfully
PyErr_SetString(PyExc_Exception, "File write failure");
goto Done;
}
//
// Flush buffer may slow down the whole build performance (average 10s slower)
//
//if (!FlushFileBuffers(FileHandle)) {
// PyErr_SetString(PyExc_Exception, "File flush failure");
// goto Done;
//}
// success!
ReturnValue = Py_True;
Done:
CloseHandle(FileHandle);
return ReturnValue;
}
STATIC INT8 SaveFileToDiskDocs[] = "SaveFileToDisk(): Make sure the file is saved to disk\n";
STATIC PyMethodDef PyUtility_Funcs[] = {
{"SaveFileToDisk", (PyCFunction)SaveFileToDisk, METH_VARARGS, SaveFileToDiskDocs},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
initPyUtility(VOID) {
Py_InitModule3("PyUtility", PyUtility_Funcs, "Utilties Module Implemented C Language");
}
|