-
Notifications
You must be signed in to change notification settings - Fork 2
/
peripheral.h
180 lines (134 loc) · 3.41 KB
/
peripheral.h
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
peripheral.h
Abstract:
This module contains the function definitions for
interaction with the SPB API.
Environment:
kernel-mode only
Revision History:
--*/
#ifndef _PERIPHERAL_H_
#define _PERIPHERAL_H_
EVT_WDF_REQUEST_COMPLETION_ROUTINE SpbPeripheralOnCompletion;
EVT_WDF_REQUEST_CANCEL SpbPeripheralOnCancel;
EVT_WDF_REQUEST_CANCEL SpbPeripheralOnWaitOnInterruptCancel;
NTSTATUS
SpbPeripheralOpen(
_In_ PPBC_DEVICE pDevice);
NTSTATUS
SpbPeripheralClose(
_In_ PPBC_DEVICE pDevice);
VOID
SpbPeripheralLock(
_In_ PPBC_DEVICE pDevice,
_In_ SPBREQUEST spbRequest);
VOID
SpbPeripheralUnlock(
_In_ PPBC_DEVICE pDevice,
_In_ SPBREQUEST spbRequest);
VOID
SpbPeripheralLockConnection(
_In_ PPBC_DEVICE pDevice,
_In_ SPBREQUEST spbRequest);
VOID
SpbPeripheralUnlockConnection(
_In_ PPBC_DEVICE pDevice,
_In_ SPBREQUEST spbRequest);
VOID
SpbPeripheralRead(
_In_ PPBC_DEVICE pDevice,
_In_ SPBREQUEST spbRequest,
_In_ BOOLEAN FullDuplex);
VOID
SpbPeripheralWrite(
_In_ PPBC_DEVICE pDevice,
_In_ SPBREQUEST spbRequest,
_In_ BOOLEAN FullDuplex);
VOID
SpbPeripheralFullDuplex(
_In_ PPBC_DEVICE pDevice,
_In_ SPBREQUEST spbRequest);
VOID
SpbPeripheralSequence(
_In_ PPBC_DEVICE pDevice,
_In_ SPBREQUEST spbRequest,
_In_ ULONG TransferCount);
NTSTATUS
SpbPeripheralSequence1(
_In_ PPBC_DEVICE pDevice,
_In_ SPBREQUEST spbRequest);
NTSTATUS
SpbPeripheralSequence2(
_In_ PPBC_DEVICE pDevice,
_In_ SPBREQUEST spbRequest);
NTSTATUS
SpbPeripheralSendRequest(
_In_ PPBC_DEVICE pDevice,
_In_ WDFREQUEST SpbRequest,
_In_ WDFREQUEST ClientRequest);
VOID
SpbPeripheralCompleteRequestPair(
_In_ PPBC_DEVICE pDevice,
_In_ NTSTATUS status,
_In_ ULONG_PTR bytesCompleted);
NTSTATUS
FORCEINLINE
RequestGetByte(
_In_ PMDL mdl,
_In_ size_t mdlLength,
_In_ size_t Index,
_Out_ UCHAR* pByte
)
/*++
Routine Description:
This is a helper routine used to retrieve the
specified byte of the current transfer descriptor buffer.
Arguments:
pRequest - a pointer to the PBC request context
Index - index of desired byte in current transfer descriptor buffer
pByte - pointer to the location for the specified byte
Return Value:
STATUS_INFO_LENGTH_MISMATCH if invalid index,
otherwise STATUS_SUCCESS
--*/
{
size_t mdlByteCount;
size_t currentOffset = Index;
PUCHAR pBuffer;
NTSTATUS status = STATUS_INFO_LENGTH_MISMATCH;
//
// Check for out-of-bounds index
//
if (Index < mdlLength)
{
while (mdl != NULL)
{
mdlByteCount = MmGetMdlByteCount(mdl);
if (currentOffset < mdlByteCount)
{
pBuffer = (PUCHAR)MmGetSystemAddressForMdlSafe(
mdl,
NormalPagePriority | MdlMappingNoExecute);
if (pBuffer != NULL)
{
//
// Byte found, mark successful
//
*pByte = pBuffer[currentOffset];
status = STATUS_SUCCESS;
}
break;
}
currentOffset -= mdlByteCount;
mdl = mdl->Next;
}
//
// If after walking the MDL the byte hasn't been found,
// status will still be STATUS_INFO_LENGTH_MISMATCH
//
}
return status;
}
#endif // _PERIPHERAL_H_