mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-03 12:23:25 +00:00
Sync with trunk (r48545)
svn path=/branches/reactos-yarotows/; revision=48547
This commit is contained in:
@@ -38,7 +38,6 @@ HWND hApplicationPageSwitchToButton; /* Application Switch To button
|
||||
HWND hApplicationPageNewTaskButton; /* Application New Task button */
|
||||
static int nApplicationPageWidth;
|
||||
static int nApplicationPageHeight;
|
||||
static HANDLE hApplicationPageEvent = NULL; /* When this event becomes signaled then we refresh the app list */
|
||||
static BOOL bSortAscending = TRUE;
|
||||
DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter);
|
||||
BOOL noApps;
|
||||
@@ -51,6 +50,11 @@ void ApplicationPageShowContextMenu2(void);
|
||||
int CALLBACK ApplicationPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
|
||||
int ProcGetIndexByProcessId(DWORD dwProcessId);
|
||||
|
||||
#ifdef RUN_APPS_PAGE
|
||||
static HANDLE hApplicationThread = NULL;
|
||||
static DWORD dwApplicationThread;
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
void SwitchToThisWindow (
|
||||
HWND hWnd, /* Handle to the window that should be activated */
|
||||
@@ -92,7 +96,6 @@ ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
LV_COLUMN column;
|
||||
WCHAR szTemp[256];
|
||||
int cx, cy;
|
||||
HANDLE hRefreshThread = NULL;
|
||||
|
||||
switch (message) {
|
||||
case WM_INITDIALOG:
|
||||
@@ -132,15 +135,16 @@ ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
UpdateApplicationListControlViewSetting();
|
||||
|
||||
/* Start our refresh thread */
|
||||
hRefreshThread = CreateThread(NULL, 0, ApplicationPageRefreshThread, NULL, 0, NULL);
|
||||
|
||||
#ifdef RUN_APPS_PAGE
|
||||
hApplicationThread = CreateThread(NULL, 0, ApplicationPageRefreshThread, NULL, 0, &dwApplicationThread);
|
||||
#endif
|
||||
return TRUE;
|
||||
|
||||
case WM_DESTROY:
|
||||
/* Close the event handle, this will make the */
|
||||
/* refresh thread exit when the wait fails */
|
||||
CloseHandle(hApplicationPageEvent);
|
||||
CloseHandle(hRefreshThread);
|
||||
/* Close refresh thread */
|
||||
#ifdef RUN_APPS_PAGE
|
||||
EndLocalThread(&hApplicationThread, dwApplicationThread);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
@@ -213,9 +217,11 @@ ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
void RefreshApplicationPage(void)
|
||||
{
|
||||
#ifdef RUN_APPS_PAGE
|
||||
/* Signal the event so that our refresh thread */
|
||||
/* will wake up and refresh the application page */
|
||||
SetEvent(hApplicationPageEvent);
|
||||
PostThreadMessage(dwApplicationThread, WM_TIMER, 0, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
void UpdateApplicationListControlViewSetting(void)
|
||||
@@ -236,6 +242,7 @@ void UpdateApplicationListControlViewSetting(void)
|
||||
|
||||
DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter)
|
||||
{
|
||||
MSG msg;
|
||||
INT i;
|
||||
BOOL bItemRemoved = FALSE;
|
||||
LV_ITEM item;
|
||||
@@ -243,30 +250,15 @@ DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter)
|
||||
HIMAGELIST hImageListLarge;
|
||||
HIMAGELIST hImageListSmall;
|
||||
|
||||
/* Create the event */
|
||||
hApplicationPageEvent = CreateEventW(NULL, TRUE, TRUE, NULL);
|
||||
|
||||
/* If we couldn't create the event then exit the thread */
|
||||
if (!hApplicationPageEvent)
|
||||
return 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
DWORD dwWaitVal;
|
||||
|
||||
/* Wait on the event */
|
||||
dwWaitVal = WaitForSingleObject(hApplicationPageEvent, INFINITE);
|
||||
|
||||
/* If the wait failed then the event object must have been */
|
||||
/* closed and the task manager is exiting so exit this thread */
|
||||
if (dwWaitVal == WAIT_FAILED)
|
||||
/* Wait for an the event or application close */
|
||||
if (GetMessage(&msg, NULL, 0, 0) <= 0)
|
||||
return 0;
|
||||
|
||||
if (dwWaitVal == WAIT_OBJECT_0)
|
||||
if (msg.message == WM_TIMER)
|
||||
{
|
||||
/* Reset our event */
|
||||
ResetEvent(hApplicationPageEvent);
|
||||
|
||||
/*
|
||||
* FIXME:
|
||||
*
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ReactOS Task Manager
|
||||
*
|
||||
* debug.cpp
|
||||
* debug.c
|
||||
*
|
||||
* Copyright (C) 1999 - 2001 Brian Palmer <[email protected]>
|
||||
* 2005 Klemens Friedl <[email protected]>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ReactOS Task Manager
|
||||
*
|
||||
* endproc.cpp
|
||||
* endproc.c
|
||||
*
|
||||
* Copyright (C) 1999 - 2001 Brian Palmer <[email protected]>
|
||||
* 2005 Klemens Friedl <[email protected]>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ReactOS Task Manager
|
||||
*
|
||||
* graph.cpp
|
||||
* graph.c
|
||||
*
|
||||
* Copyright (C) 1999 - 2001 Brian Palmer <[email protected]>
|
||||
*
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ReactOS Task Manager
|
||||
*
|
||||
* GraphCtrl.cpp
|
||||
* graphctl.c
|
||||
*
|
||||
* Copyright (C) 2002 Robert Dickenson <[email protected]>
|
||||
*
|
||||
@@ -425,7 +425,7 @@ void GraphCtrl_DrawPoint(TGraphCtrl* this)
|
||||
* note: the m_dcPlot covers the entire client
|
||||
* but we only shift bitmap that is the size
|
||||
* of the plot rectangle
|
||||
* grab the right side of the plot (exluding m_nShiftPixels on the left)
|
||||
* grab the right side of the plot (excluding m_nShiftPixels on the left)
|
||||
* move this grabbed bitmap to the left by m_nShiftPixels
|
||||
*/
|
||||
BitBlt(this->m_dcPlot, this->m_rectPlot.left, this->m_rectPlot.top+1,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ReactOS Task Manager
|
||||
*
|
||||
* GraphCtrl.h
|
||||
* graphctl.h
|
||||
*
|
||||
* Copyright (C) 2002 Robert Dickenson <[email protected]>
|
||||
*
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ReactOS Task Manager
|
||||
*
|
||||
* optnmenu.cpp
|
||||
* optnmenu.c
|
||||
*
|
||||
* Copyright (C) 1999 - 2001 Brian Palmer <[email protected]>
|
||||
*
|
||||
@@ -110,7 +110,7 @@ void TaskManager_OnOptionsShow16BitTasks(void)
|
||||
|
||||
/*
|
||||
* FIXME: Currently this is useless because the
|
||||
* current implemetation doesn't list the 16-bit
|
||||
* current implementation doesn't list the 16-bit
|
||||
* processes. I believe that would require querying
|
||||
* each ntvdm.exe process for it's children.
|
||||
*/
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ReactOS Task Manager
|
||||
*
|
||||
* perfdata.cpp
|
||||
* perfdata.c
|
||||
*
|
||||
* Copyright (C) 1999 - 2001 Brian Palmer <[email protected]>
|
||||
*
|
||||
|
||||
@@ -51,11 +51,14 @@ HWND hPerformancePageTotalsHandleCountEdit; /* Total Handles Edit Con
|
||||
HWND hPerformancePageTotalsProcessCountEdit; /* Total Processes Edit Control */
|
||||
HWND hPerformancePageTotalsThreadCountEdit; /* Total Threads Edit Control */
|
||||
|
||||
#ifdef RUN_PERF_PAGE
|
||||
static HANDLE hPerformanceThread = NULL;
|
||||
static DWORD dwPerformanceThread;
|
||||
#endif
|
||||
|
||||
static int nPerformancePageWidth;
|
||||
static int nPerformancePageHeight;
|
||||
static int lastX, lastY;
|
||||
static HANDLE hPerformancePageEvent = NULL; /* When this event becomes signaled then we refresh the performance page */
|
||||
DWORD WINAPI PerformancePageRefreshThread(void *lpParameter);
|
||||
|
||||
void AdjustFrameSize(HWND hCntrl, HWND hDlg, int nXDifference, int nYDifference, int pos)
|
||||
@@ -94,12 +97,12 @@ void AdjustFrameSize(HWND hCntrl, HWND hDlg, int nXDifference, int nYDifference,
|
||||
InvalidateRect(hCntrl, NULL, TRUE);
|
||||
}
|
||||
|
||||
void AdjustControlPostion(HWND hCntrl, HWND hDlg, int nXDifference, int nYDifference)
|
||||
static void AdjustControlPostion(HWND hCntrl, HWND hDlg, int nXDifference, int nYDifference)
|
||||
{
|
||||
AdjustFrameSize(hCntrl, hDlg, nXDifference, nYDifference, 0);
|
||||
}
|
||||
|
||||
void AdjustCntrlPos(int ctrl_id, HWND hDlg, int nXDifference, int nYDifference)
|
||||
static void AdjustCntrlPos(int ctrl_id, HWND hDlg, int nXDifference, int nYDifference)
|
||||
{
|
||||
AdjustFrameSize(GetDlgItem(hDlg, ctrl_id), hDlg, nXDifference, nYDifference, 0);
|
||||
}
|
||||
@@ -110,9 +113,6 @@ PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
RECT rc;
|
||||
int nXDifference;
|
||||
int nYDifference;
|
||||
#ifdef RUN_PERF_PAGE
|
||||
HANDLE hRefreshThread = NULL;
|
||||
#endif
|
||||
/* HDC hdc; */
|
||||
/* PAINTSTRUCT ps; */
|
||||
|
||||
@@ -121,7 +121,7 @@ PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
GraphCtrl_Dispose(&PerformancePageCpuUsageHistoryGraph);
|
||||
GraphCtrl_Dispose(&PerformancePageMemUsageHistoryGraph);
|
||||
#ifdef RUN_PERF_PAGE
|
||||
CloseHandle(hRefreshThread);
|
||||
EndLocalThread(&hPerformanceThread, dwPerformanceThread);
|
||||
#endif
|
||||
break;
|
||||
|
||||
@@ -192,7 +192,7 @@ PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
GraphCtrl_SetPlotColor(&PerformancePageMemUsageHistoryGraph, 0, RGB(255, 255, 0)) ;
|
||||
/* Start our refresh thread */
|
||||
#ifdef RUN_PERF_PAGE
|
||||
hRefreshThread = CreateThread(NULL, 0, PerformancePageRefreshThread, NULL, 0, NULL);
|
||||
hPerformanceThread = CreateThread(NULL, 0, PerformancePageRefreshThread, NULL, 0, &dwPerformanceThread);
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -303,9 +303,11 @@ PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
void RefreshPerformancePage(void)
|
||||
{
|
||||
#ifdef RUN_PERF_PAGE
|
||||
/* Signal the event so that our refresh thread */
|
||||
/* will wake up and refresh the performance page */
|
||||
SetEvent(hPerformancePageEvent);
|
||||
PostThreadMessage(dwPerformanceThread, WM_TIMER, 0, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
DWORD WINAPI PerformancePageRefreshThread(void *lpParameter)
|
||||
@@ -332,35 +334,21 @@ DWORD WINAPI PerformancePageRefreshThread(void *lpParameter)
|
||||
WCHAR Text[260];
|
||||
WCHAR szMemUsage[256];
|
||||
|
||||
/* Create the event */
|
||||
hPerformancePageEvent = CreateEventW(NULL, TRUE, TRUE, NULL);
|
||||
|
||||
/* If we couldn't create the event then exit the thread */
|
||||
if (!hPerformancePageEvent)
|
||||
return 0;
|
||||
MSG msg;
|
||||
|
||||
LoadStringW(hInst, IDS_STATUS_MEMUSAGE, szMemUsage, 256);
|
||||
|
||||
while (1)
|
||||
{
|
||||
DWORD dwWaitVal;
|
||||
|
||||
int nBarsUsed1;
|
||||
int nBarsUsed2;
|
||||
|
||||
/* Wait on the event */
|
||||
dwWaitVal = WaitForSingleObject(hPerformancePageEvent, INFINITE);
|
||||
|
||||
/* If the wait failed then the event object must have been */
|
||||
/* closed and the task manager is exiting so exit this thread */
|
||||
if (dwWaitVal == WAIT_FAILED)
|
||||
/* Wait for an the event or application close */
|
||||
if (GetMessage(&msg, NULL, 0, 0) <= 0)
|
||||
return 0;
|
||||
|
||||
if (dwWaitVal == WAIT_OBJECT_0)
|
||||
if (msg.message == WM_TIMER)
|
||||
{
|
||||
/* Reset our event */
|
||||
ResetEvent(hPerformancePageEvent);
|
||||
|
||||
/*
|
||||
* Update the commit charge info
|
||||
*/
|
||||
@@ -449,8 +437,6 @@ DWORD WINAPI PerformancePageRefreshThread(void *lpParameter)
|
||||
PhysicalMemoryAvailable = PerfDataGetPhysicalMemoryAvailableK();
|
||||
nBarsUsed2 = PhysicalMemoryTotal ? ((PhysicalMemoryAvailable * 100) / PhysicalMemoryTotal) : 0;
|
||||
|
||||
|
||||
|
||||
GraphCtrl_AppendPoint(&PerformancePageCpuUsageHistoryGraph, CpuUsage, CpuKernelUsage, 0.0, 0.0);
|
||||
GraphCtrl_AppendPoint(&PerformancePageMemUsageHistoryGraph, nBarsUsed1, nBarsUsed2, 0.0, 0.0);
|
||||
/* PerformancePageMemUsageHistoryGraph.SetRange(0.0, 100.0, 10) ; */
|
||||
@@ -458,7 +444,7 @@ DWORD WINAPI PerformancePageRefreshThread(void *lpParameter)
|
||||
InvalidateRect(hPerformancePageCpuUsageHistoryGraph, NULL, FALSE);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void PerformancePage_OnViewShowKernelTimes(void)
|
||||
|
||||
@@ -40,7 +40,10 @@ HWND hProcessPageShowAllProcessesButton;/* Process Show All Processes checkbox *
|
||||
|
||||
static int nProcessPageWidth;
|
||||
static int nProcessPageHeight;
|
||||
static HANDLE hProcessPageEvent = NULL; /* When this event becomes signaled then we refresh the process list */
|
||||
#ifdef RUN_PROC_PAGE
|
||||
static HANDLE hProcessThread = NULL;
|
||||
static DWORD dwProcessThread;
|
||||
#endif
|
||||
|
||||
int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
|
||||
void AddProcess(ULONG Index);
|
||||
@@ -104,7 +107,6 @@ ProcessPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
int nXDifference;
|
||||
int nYDifference;
|
||||
int cx, cy;
|
||||
HANDLE hRefreshThread = NULL;
|
||||
|
||||
switch (message) {
|
||||
case WM_INITDIALOG:
|
||||
@@ -139,19 +141,19 @@ ProcessPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
*/
|
||||
OldProcessListWndProc = (WNDPROC)(LONG_PTR) SetWindowLongPtrW(hProcessPageListCtrl, GWL_WNDPROC, (LONG_PTR)ProcessListWndProc);
|
||||
|
||||
#ifdef RUN_PROC_PAGE
|
||||
/* Start our refresh thread */
|
||||
hRefreshThread = CreateThread(NULL, 0, ProcessPageRefreshThread, NULL, 0, NULL);
|
||||
|
||||
hProcessThread = CreateThread(NULL, 0, ProcessPageRefreshThread, NULL, 0, &dwProcessThread);
|
||||
#endif
|
||||
return TRUE;
|
||||
|
||||
case WM_DESTROY:
|
||||
/* Close the event handle, this will make the */
|
||||
/* refresh thread exit when the wait fails */
|
||||
CloseHandle(hProcessPageEvent);
|
||||
CloseHandle(hRefreshThread);
|
||||
|
||||
#ifdef RUN_PROC_PAGE
|
||||
EndLocalThread(&hProcessThread, dwProcessThread);
|
||||
#endif
|
||||
SaveColumnSettings();
|
||||
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
@@ -194,11 +196,9 @@ ProcessPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
cy = rc.top + nYDifference;
|
||||
SetWindowPos(hProcessPageShowAllProcessesButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
|
||||
InvalidateRect(hProcessPageShowAllProcessesButton, NULL, TRUE);
|
||||
|
||||
break;
|
||||
|
||||
case WM_NOTIFY:
|
||||
|
||||
ProcessPageOnNotify(wParam, lParam);
|
||||
break;
|
||||
}
|
||||
@@ -372,9 +372,11 @@ void ProcessPageShowContextMenu(DWORD dwProcessId)
|
||||
|
||||
void RefreshProcessPage(void)
|
||||
{
|
||||
#ifdef RUN_PROC_PAGE
|
||||
/* Signal the event so that our refresh thread */
|
||||
/* will wake up and refresh the process page */
|
||||
SetEvent(hProcessPageEvent);
|
||||
PostThreadMessage(dwProcessThread, WM_TIMER, 0, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
DWORD WINAPI ProcessPageRefreshThread(void *lpParameter)
|
||||
@@ -382,34 +384,19 @@ DWORD WINAPI ProcessPageRefreshThread(void *lpParameter)
|
||||
ULONG OldProcessorUsage = 0;
|
||||
ULONG OldProcessCount = 0;
|
||||
WCHAR szCpuUsage[256], szProcesses[256];
|
||||
|
||||
/* Create the event */
|
||||
hProcessPageEvent = CreateEventW(NULL, TRUE, TRUE, NULL);
|
||||
|
||||
/* If we couldn't create the event then exit the thread */
|
||||
if (!hProcessPageEvent)
|
||||
return 0;
|
||||
MSG msg;
|
||||
|
||||
LoadStringW(hInst, IDS_STATUS_CPUUSAGE, szCpuUsage, 256);
|
||||
LoadStringW(hInst, IDS_STATUS_PROCESSES, szProcesses, 256);
|
||||
|
||||
while (1) {
|
||||
DWORD dwWaitVal;
|
||||
|
||||
/* Wait on the event */
|
||||
dwWaitVal = WaitForSingleObject(hProcessPageEvent, INFINITE);
|
||||
|
||||
/* If the wait failed then the event object must have been */
|
||||
/* closed and the task manager is exiting so exit this thread */
|
||||
if (dwWaitVal == WAIT_FAILED)
|
||||
/* Wait for an the event or application close */
|
||||
if (GetMessage(&msg, NULL, 0, 0) <= 0)
|
||||
return 0;
|
||||
|
||||
if (dwWaitVal == WAIT_OBJECT_0) {
|
||||
if (msg.message == WM_TIMER) {
|
||||
WCHAR text[260];
|
||||
|
||||
/* Reset our event */
|
||||
ResetEvent(hProcessPageEvent);
|
||||
|
||||
UpdateProcesses();
|
||||
|
||||
if (IsWindowVisible(hProcessPage))
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ReactOS Task Manager
|
||||
*
|
||||
* TaskMgr.c : Defines the entry point for the application.
|
||||
* taskmgr.c : Defines the entry point for the application.
|
||||
*
|
||||
* Copyright (C) 1999 - 2001 Brian Palmer <[email protected]>
|
||||
* 2005 Klemens Friedl <[email protected]>
|
||||
@@ -856,11 +856,6 @@ void TaskManager_OnViewUpdateSpeed(DWORD dwSpeed)
|
||||
SetUpdateSpeed(hMainWnd);
|
||||
}
|
||||
|
||||
void TaskManager_OnViewRefresh(void)
|
||||
{
|
||||
PostMessageW(hMainWnd, WM_TIMER, 0, 0);
|
||||
}
|
||||
|
||||
void TaskManager_OnTabWndSelChange(void)
|
||||
{
|
||||
int i;
|
||||
@@ -1012,3 +1007,27 @@ LPWSTR GetLastErrorText(LPWSTR lpszBuf, DWORD dwSize)
|
||||
}
|
||||
return lpszBuf;
|
||||
}
|
||||
|
||||
DWORD EndLocalThread(HANDLE *hThread, DWORD dwThread)
|
||||
{
|
||||
DWORD dwExitCodeThread = 0;
|
||||
|
||||
if (*hThread != NULL) {
|
||||
PostThreadMessage(dwThread,WM_QUIT,0,0);
|
||||
for (;;) {
|
||||
MSG msg;
|
||||
|
||||
if (WAIT_OBJECT_0 == WaitForSingleObject(*hThread, 500))
|
||||
break;
|
||||
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
}
|
||||
GetExitCodeThread(*hThread, &dwExitCodeThread);
|
||||
CloseHandle(*hThread);
|
||||
*hThread = NULL;
|
||||
}
|
||||
return dwExitCodeThread;
|
||||
}
|
||||
|
||||
|
||||
@@ -116,9 +116,9 @@ void TaskManager_OnEnterMenuLoop(HWND hWnd);
|
||||
void TaskManager_OnExitMenuLoop(HWND hWnd);
|
||||
void TaskManager_OnMenuSelect(HWND hWnd, UINT nItemID, UINT nFlags, HMENU hSysMenu);
|
||||
void TaskManager_OnViewUpdateSpeed(DWORD);
|
||||
void TaskManager_OnViewRefresh(void);
|
||||
void TaskManager_OnTabWndSelChange(void);
|
||||
LPTSTR GetLastErrorText( LPTSTR lpszBuf, DWORD dwSize );
|
||||
DWORD EndLocalThread(HANDLE *hThread, DWORD dwThread);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -415,7 +415,7 @@ WinMain(
|
||||
|
||||
/* Tell kernel that CurrentControlSet is good (needed
|
||||
* to support Last good known configuration boot) */
|
||||
NtInitializeRegistry(CM_BOOT_FLAG_ACCEPTED);
|
||||
NtInitializeRegistry(CM_BOOT_FLAG_ACCEPTED | 1);
|
||||
|
||||
/* Message loop for the SAS window */
|
||||
while (GetMessageW(&Msg, WLSession->SASWindow, 0, 0))
|
||||
|
||||
@@ -209,7 +209,7 @@ DWORD WINAPI AdapterDiscoveryThread(LPVOID Context) {
|
||||
PDHCP_ADAPTER Adapter = NULL;
|
||||
HANDLE AdapterStateChangedEvent = (HANDLE)Context;
|
||||
struct interface_info *ifi = NULL;
|
||||
int i, AdapterCount = 0;
|
||||
int i, AdapterCount = 0, Broadcast;
|
||||
|
||||
/* FIXME: Kill this thread when the service is stopped */
|
||||
|
||||
@@ -285,6 +285,15 @@ DWORD WINAPI AdapterDiscoveryThread(LPVOID Context) {
|
||||
socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
|
||||
|
||||
if (DhcpSocket != INVALID_SOCKET) {
|
||||
|
||||
/* Allow broadcast on this socket */
|
||||
Broadcast = 1;
|
||||
setsockopt(DhcpSocket,
|
||||
SOL_SOCKET,
|
||||
SO_BROADCAST,
|
||||
(const char *)&Broadcast,
|
||||
sizeof(Broadcast));
|
||||
|
||||
Adapter->ListenAddr.sin_family = AF_INET;
|
||||
Adapter->ListenAddr.sin_port = htons(LOCAL_PORT);
|
||||
Adapter->BindStatus =
|
||||
|
||||
@@ -2291,6 +2291,7 @@ PIP_ADAPTER_ORDER_MAP WINAPI GetAdapterOrderMap(VOID)
|
||||
*/
|
||||
DWORD WINAPI GetAdaptersAddresses(ULONG Family,ULONG Flags,PVOID Reserved,PIP_ADAPTER_ADDRESSES pAdapterAddresses,PULONG pOutBufLen)
|
||||
{
|
||||
#if 0
|
||||
InterfaceIndexTable *indexTable;
|
||||
IFInfo ifInfo;
|
||||
int i;
|
||||
@@ -2477,6 +2478,15 @@ DWORD WINAPI GetAdaptersAddresses(ULONG Family,ULONG Flags,PVOID Reserved,PIP_AD
|
||||
free(indexTable);
|
||||
|
||||
return NO_ERROR;
|
||||
#else
|
||||
if (!pOutBufLen) return ERROR_INVALID_PARAMETER;
|
||||
if (!pAdapterAddresses || *pOutBufLen == 0)
|
||||
return ERROR_BUFFER_OVERFLOW;
|
||||
if (Reserved) return ERROR_INVALID_PARAMETER;
|
||||
|
||||
FIXME(":stub\n");
|
||||
return ERROR_NO_DATA;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
#include "wine/debug.h"
|
||||
|
||||
//#include "ntddndis.h"
|
||||
#include "ddk/tdiinfo.h"
|
||||
#include "tdiinfo.h"
|
||||
#include "tcpioctl.h"
|
||||
|
||||
#include "tdilib.h"
|
||||
|
||||
@@ -11,9 +11,8 @@
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
|
||||
@@ -13,9 +13,10 @@
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
|
||||
@@ -10,9 +10,8 @@
|
||||
*/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
/* INCLUDES ****************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
|
||||
@@ -15,9 +15,9 @@
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
#define SYMLINK_FLAG_RELATIVE 1
|
||||
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
/* INCLUDES ******************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
/* GLOBAL VARIABLES **********************************************************/
|
||||
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
/* INCLUDES ****************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <reactos/debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
/* INCLUDES *******************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
/* INCLUDES ******************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
UNICODE_STRING DllDirectory = {0, 0, NULL};
|
||||
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
/* INCLUDES ******************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
/* GLOBALS ******************************************************************/
|
||||
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
/* TYPES ********************************************************************/
|
||||
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
|
||||
@@ -10,14 +10,13 @@
|
||||
*/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
#define NANOS_TO_100NS(nanos) (((LONGLONG)(nanos)) / 100)
|
||||
#define MICROS_TO_100NS(micros) (((LONGLONG)(micros)) * NANOS_TO_100NS(1000))
|
||||
#define MILLIS_TO_100NS(milli) (((LONGLONG)(milli)) * MICROS_TO_100NS(1000))
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
|
||||
@@ -10,9 +10,8 @@
|
||||
*/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
|
||||
@@ -14,9 +14,9 @@
|
||||
/* INCLUDES ****************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
|
||||
#include <k32.h>
|
||||
#include <malloc.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
/* GLOBALS *****************************************************************/
|
||||
|
||||
|
||||
@@ -10,9 +10,9 @@
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
//#define USING_PROPER_NPFS_WAIT_SEMANTICS
|
||||
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
/* GLOBALS ******************************************************************/
|
||||
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
/* INCLUDES ****************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
|
||||
@@ -12,9 +12,8 @@
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
|
||||
@@ -20,9 +20,9 @@
|
||||
*/
|
||||
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32file;
|
||||
|
||||
#define MAX_DOS_DRIVES 26
|
||||
|
||||
|
||||
@@ -1,5 +1,25 @@
|
||||
#pragma once
|
||||
|
||||
//
|
||||
// Kernel32 Filter IDs
|
||||
//
|
||||
#define kernel32file 200
|
||||
#define kernel32ver 201
|
||||
#define actctx 202
|
||||
#define resource 203
|
||||
#define kernel32session 204
|
||||
|
||||
#define TRACE(fmt, ...) TRACE__(gDebugChannel, fmt, ##__VA_ARGS__)
|
||||
#define WARN(fmt, ...) WARN__(gDebugChannel, fmt, ##__VA_ARGS__)
|
||||
#define FIXME(fmt, ...) WARN__(gDebugChannel, fmt,## __VA_ARGS__)
|
||||
#define ERR(fmt, ...) ERR__(gDebugChannel, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define debugstr_a
|
||||
#define debugstr_w
|
||||
#define wine_dbgstr_w
|
||||
#define debugstr_guid
|
||||
|
||||
#include "wine/unicode.h"
|
||||
#include "baseheap.h"
|
||||
|
||||
#define BINARY_UNKNOWN (0)
|
||||
@@ -40,8 +60,9 @@
|
||||
/* Undocumented CreateProcess flag */
|
||||
#define STARTF_SHELLPRIVATE 0x400
|
||||
|
||||
#define SetLastErrorByStatus(__S__) \
|
||||
((void)SetLastError(RtlNtStatusToDosError(__S__)))
|
||||
#define SetLastErrorByStatus(x) RtlSetLastWin32ErrorAndNtStatusFromNtStatus((x))
|
||||
#define GetLastError() NtCurrentTeb()->LastErrorValue
|
||||
#define SetLastError(x) NtCurrentTeb()->LastErrorValue = (x)
|
||||
|
||||
typedef struct _CODEPAGE_ENTRY
|
||||
{
|
||||
@@ -100,6 +121,7 @@ DWORD FilenameU2A_FitOrFail(LPSTR DestA, INT destLen, PUNICODE_STRING SourceU);
|
||||
#define HeapAlloc RtlAllocateHeap
|
||||
#define HeapReAlloc RtlReAllocateHeap
|
||||
#define HeapFree RtlFreeHeap
|
||||
#define _lread (_readfun)_hread
|
||||
|
||||
POBJECT_ATTRIBUTES
|
||||
WINAPI
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -578,16 +578,16 @@
|
||||
@ stdcall GetNativeSystemInfo(ptr)
|
||||
;@ stdcall -arch=x86_64 GetNextUmsListItem
|
||||
@ stdcall GetNextVDMCommand(long)
|
||||
@ stdcall GetNlsSectionName(long long double str str double) ; missing in Win 7
|
||||
@ stdcall GetNumaAvailableMemory(ptr double ptr) ; missing in Win 7
|
||||
@ stdcall GetNumaAvailableMemoryNode(double ptr)
|
||||
@ stdcall GetNlsSectionName(long long long str str long) ; missing in Win 7
|
||||
@ stdcall GetNumaAvailableMemory(ptr long ptr) ; missing in Win 7
|
||||
@ stdcall GetNumaAvailableMemoryNode(long ptr)
|
||||
;@ stdcall GetNumaAvailableMemoryNodeEx ; Win 7
|
||||
@ stdcall GetNumaHighestNodeNumber(ptr)
|
||||
;@ stdcall GetNumaNodeNumberFromHandle ; Win 7
|
||||
@ stdcall GetNumaNodeProcessorMask(double ptr)
|
||||
@ stdcall GetNumaNodeProcessorMask(long ptr)
|
||||
;@ stdcall GetNumaNodeProcessorMaskEx ; Win 7
|
||||
@ stdcall GetNumaProcessorMap(ptr double ptr) ; missing in Win 7
|
||||
@ stdcall GetNumaProcessorNode(double ptr)
|
||||
@ stdcall GetNumaProcessorMap(ptr long ptr) ; missing in Win 7
|
||||
@ stdcall GetNumaProcessorNode(long ptr)
|
||||
;@ stdcall GetNumaProcessorNodeEx ; Win 7
|
||||
;@ stdcall GetNumaProximityNode ; Win 7
|
||||
;@ stdcall GetNumaProximityNodeEx ; Win 7
|
||||
@@ -613,7 +613,7 @@
|
||||
@ stdcall GetPrivateProfileStructW(wstr wstr ptr long wstr)
|
||||
@ stdcall GetProcAddress(long str)
|
||||
@ stdcall GetProcessAffinityMask(long ptr ptr)
|
||||
@ stdcall GetProcessFlags(long)
|
||||
//@ stdcall GetProcessFlags(long)
|
||||
;@ stdcall GetProcessDEPPolicy ; Win 7
|
||||
;@ stdcall GetProcessGroupAffinity ; Win 7
|
||||
@ stdcall GetProcessHandleCount(long ptr)
|
||||
@@ -630,7 +630,7 @@
|
||||
@ stdcall GetProcessWorkingSetSize(long ptr ptr)
|
||||
;@ stdcall GetProcessWorkingSetSizeEx ; Win 7
|
||||
;@ stdcall GetProcessorSystemCycleTime ; Win 7
|
||||
@ stdcall GetProductInfo(long long long long ptr)
|
||||
;@ stdcall GetProductInfo(long long long long ptr) ; Win 7
|
||||
@ stub GetProductName
|
||||
@ stdcall GetProfileIntA(str str long)
|
||||
@ stdcall GetProfileIntW(wstr wstr long)
|
||||
@@ -681,7 +681,7 @@
|
||||
@ stdcall GetTempPathA(long ptr)
|
||||
@ stdcall GetTempPathW(long ptr)
|
||||
@ stdcall GetThreadContext(long ptr)
|
||||
@ stdcall GetThreadErrorMode()
|
||||
;@ stdcall GetThreadErrorMode() ; Win 7
|
||||
;@ stdcall GetThreadGroupAffinity ; Win 7
|
||||
@ stdcall GetThreadIOPendingFlag(long ptr)
|
||||
@ stdcall GetThreadId(ptr)
|
||||
@@ -896,8 +896,7 @@
|
||||
@ stdcall LockFile(long long long long long)
|
||||
@ stdcall LockFileEx(long long long long long ptr)
|
||||
@ stdcall LockResource(long)
|
||||
@ stdcall MakeCriticalSectionGlobal(ptr)
|
||||
|
||||
;@ stdcall MakeCriticalSectionGlobal(ptr) // ???
|
||||
@ stdcall MapUserPhysicalPages(ptr long ptr)
|
||||
@ stdcall MapUserPhysicalPagesScatter(ptr long ptr)
|
||||
@ stdcall MapViewOfFile(long long long long long)
|
||||
@@ -920,7 +919,7 @@
|
||||
@ stdcall NeedCurrentDirectoryForExePathA(str)
|
||||
@ stdcall NeedCurrentDirectoryForExePathW(wstr)
|
||||
;@ stdcall NlsCheckPolicy ; Win 7
|
||||
@ stdcall NlsConvertIntegerToString(double double double wstr double) ; missing in Win 7
|
||||
@ stdcall NlsConvertIntegerToString(long long long wstr long) ; missing in Win 7
|
||||
;@ stdcall NlsEventDataDescCreate ; Win 7
|
||||
@ stdcall NlsGetCacheUpdateCount()
|
||||
@ stub NlsResetProcessLocale ; missing in XP SP3 and Win 7
|
||||
@@ -1074,7 +1073,7 @@
|
||||
@ stdcall RegisterWaitForSingleObjectEx(long ptr ptr long long)
|
||||
@ stdcall RegisterWowBaseHandlers(long)
|
||||
@ stdcall RegisterWowExec(long)
|
||||
@ stdcall ReinitializeCriticalSection(ptr)
|
||||
;@ stdcall ReinitializeCriticalSection(ptr) ; ???
|
||||
@ stdcall ReleaseActCtx(ptr)
|
||||
@ stdcall ReleaseMutex(long)
|
||||
;@ stdcall ReleaseMutexWhenCallbackReturns ntdll.TpCallbackReleaseMutexOnCompletion ; Win 7
|
||||
@@ -1218,7 +1217,7 @@
|
||||
@ stdcall SetLocaleInfoA(long long str)
|
||||
@ stdcall SetLocaleInfoW(long long wstr)
|
||||
@ stdcall SetMailslotInfo(long long)
|
||||
@ stdcall SetMessageWaitingIndicator(long double)
|
||||
@ stdcall SetMessageWaitingIndicator(ptr long)
|
||||
;@ stdcall SetNamedPipeAttribute ; Win 7
|
||||
@ stdcall SetNamedPipeHandleState(long ptr ptr ptr)
|
||||
@ stdcall SetPriorityClass(long long)
|
||||
@@ -1242,7 +1241,7 @@
|
||||
@ stdcall SetTermsrvAppInstallMode(long)
|
||||
@ stdcall SetThreadAffinityMask(long long)
|
||||
@ stdcall SetThreadContext(long ptr)
|
||||
@ stdcall SetThreadErrorMode(long ptr)
|
||||
;@ stdcall SetThreadErrorMode(long ptr) ; Win 7
|
||||
@ stdcall SetThreadExecutionState(long)
|
||||
;@ stdcall SetThreadGroupAffinity ; Win 7
|
||||
@ stdcall SetThreadIdealProcessor(long long)
|
||||
@@ -1313,7 +1312,7 @@
|
||||
@ stdcall UTUnRegister(long)
|
||||
;@ stdcall -arch=x86_64 UmsThreadYield
|
||||
@ stdcall UnhandledExceptionFilter(ptr)
|
||||
@ stdcall UninitializeCriticalSection(ptr)
|
||||
;@ stdcall UninitializeCriticalSection(ptr) ; ???
|
||||
@ stdcall UnlockFile(long long long long long)
|
||||
@ stdcall UnlockFileEx(long long long long ptr)
|
||||
@ stdcall UnmapViewOfFile(ptr)
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
<include base="kernel32" root="intermediate">.</include>
|
||||
<include base="kernel32">include</include>
|
||||
<include base="ReactOS">include/reactos/subsys</include>
|
||||
<library>wine</library>
|
||||
<library>pseh</library>
|
||||
<library>normalize</library>
|
||||
<library>ntdll</library>
|
||||
|
||||
@@ -13,10 +13,9 @@
|
||||
/* synched with wine 1.1.26 */
|
||||
|
||||
#include <k32.h>
|
||||
|
||||
#include "wine/debug.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(actctx);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = actctx;
|
||||
|
||||
#define ACTCTX_FAKE_HANDLE ((HANDLE) 0xf00baa)
|
||||
|
||||
|
||||
@@ -1371,20 +1371,6 @@ SetConsolePalette(DWORD Unknown0,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented (Undocumented)
|
||||
*/
|
||||
BOOL
|
||||
WINAPI
|
||||
SetLastConsoleEventActive(VOID)
|
||||
{
|
||||
DPRINT1("SetLastConsoleEventActive() UNIMPLEMENTED!\n");
|
||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented (Undocumented)
|
||||
*/
|
||||
|
||||
@@ -20,12 +20,9 @@
|
||||
*/
|
||||
|
||||
#include <k32.h>
|
||||
|
||||
|
||||
#include "wine/unicode.h"
|
||||
#include "wine/debug.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(resource);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = resource;
|
||||
|
||||
struct format_args
|
||||
{
|
||||
|
||||
@@ -30,12 +30,9 @@
|
||||
*/
|
||||
|
||||
#include <k32.h>
|
||||
|
||||
#include "wine/config.h"
|
||||
#include "wine/unicode.h"
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(nls);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = resource;
|
||||
|
||||
#define DATE_DATEVARSONLY 0x0100 /* only date stuff: yMdg */
|
||||
#define TIME_TIMEVARSONLY 0x0200 /* only time stuff: hHmst */
|
||||
@@ -1047,8 +1044,10 @@ INT WINAPI GetNumberFormatW(LCID lcid, DWORD dwFlags,
|
||||
TRACE("(0x%04x,0x%08x,%s,%p,%p,%d)\n", lcid, dwFlags, debugstr_w(lpszValue),
|
||||
lpFormat, lpNumberStr, cchOut);
|
||||
|
||||
lcid = ConvertDefaultLocale(lcid);
|
||||
|
||||
if (!lpszValue || cchOut < 0 || (cchOut > 0 && !lpNumberStr) ||
|
||||
!IsValidLocale(lcid, 0) ||
|
||||
!IsValidLocale(lcid, LCID_INSTALLED) ||
|
||||
(lpFormat && (dwFlags || !lpFormat->lpDecimalSep || !lpFormat->lpThousandSep)))
|
||||
{
|
||||
goto error;
|
||||
@@ -1418,8 +1417,10 @@ INT WINAPI GetCurrencyFormatW(LCID lcid, DWORD dwFlags,
|
||||
TRACE("(0x%04x,0x%08x,%s,%p,%p,%d)\n", lcid, dwFlags, debugstr_w(lpszValue),
|
||||
lpFormat, lpCurrencyStr, cchOut);
|
||||
|
||||
lcid = ConvertDefaultLocale(lcid);
|
||||
|
||||
if (!lpszValue || cchOut < 0 || (cchOut > 0 && !lpCurrencyStr) ||
|
||||
!IsValidLocale(lcid, 0) ||
|
||||
!IsValidLocale(lcid, LCID_INSTALLED) ||
|
||||
(lpFormat && (dwFlags || !lpFormat->lpDecimalSep || !lpFormat->lpThousandSep ||
|
||||
!lpFormat->lpCurrencySymbol || lpFormat->NegativeOrder > 15 ||
|
||||
lpFormat->PositiveOrder > 3)))
|
||||
|
||||
@@ -84,25 +84,6 @@ static RTL_CRITICAL_SECTION PROFILE_CritSect = { &critsect_debug, -1, 0, 0, 0, 0
|
||||
static const char hex[16] = "0123456789ABCDEF";
|
||||
|
||||
|
||||
static __inline WCHAR *memchrW( const WCHAR *ptr, WCHAR ch, size_t n )
|
||||
{
|
||||
const WCHAR *end;
|
||||
for (end = ptr + n; ptr < end; ptr++)
|
||||
if (*ptr == ch)
|
||||
return (WCHAR *)(ULONG_PTR)ptr;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static __inline WCHAR *memrchrW( const WCHAR *ptr, WCHAR ch, size_t n )
|
||||
{
|
||||
const WCHAR *end;
|
||||
WCHAR *ret = NULL;
|
||||
for (end = ptr + n; ptr < end; ptr++)
|
||||
if (*ptr == ch)
|
||||
ret = (WCHAR *)(ULONG_PTR)ptr;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* PROFILE_CopyEntry
|
||||
*
|
||||
|
||||
+131
-11
@@ -958,17 +958,6 @@ SetThreadStackGuarantee(IN OUT PULONG StackSizeInBytes)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
HANDLE
|
||||
WINAPI
|
||||
ReOpenFile(IN HANDLE hOriginalFile,
|
||||
IN DWORD dwDesiredAccess,
|
||||
IN DWORD dwShareMode,
|
||||
IN DWORD dwFlags)
|
||||
{
|
||||
STUB;
|
||||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
WINAPI
|
||||
SetProcessWorkingSetSizeEx(IN HANDLE hProcess,
|
||||
@@ -1259,3 +1248,134 @@ UnregisterConsoleIME(VOID)
|
||||
STUB;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
BOOL
|
||||
WINAPI
|
||||
BaseCheckRunApp(IN DWORD Unknown1,
|
||||
IN DWORD Unknown2,
|
||||
IN DWORD Unknown3,
|
||||
IN DWORD Unknown4,
|
||||
IN DWORD Unknown5,
|
||||
IN DWORD Unknown6,
|
||||
IN DWORD Unknown7,
|
||||
IN DWORD Unknown8,
|
||||
IN DWORD Unknown9,
|
||||
IN DWORD Unknown10)
|
||||
{
|
||||
STUB;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
BOOL
|
||||
WINAPI
|
||||
BasepCheckWinSaferRestrictions(IN DWORD Unknown1,
|
||||
IN DWORD Unknown2,
|
||||
IN DWORD Unknown3,
|
||||
IN DWORD Unknown4,
|
||||
IN DWORD Unknown5,
|
||||
IN DWORD Unknown6)
|
||||
{
|
||||
STUB;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
BOOL
|
||||
WINAPI
|
||||
NumaVirtualQueryNode(IN DWORD Unknown1,
|
||||
IN DWORD Unknown2,
|
||||
IN DWORD Unknown3,
|
||||
IN DWORD Unknown4)
|
||||
{
|
||||
STUB;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
HANDLE
|
||||
WINAPI
|
||||
ReOpenFile(IN HANDLE hOriginalFile,
|
||||
IN DWORD dwDesiredAccess,
|
||||
IN DWORD dwShareMode,
|
||||
IN DWORD dwFlags)
|
||||
{
|
||||
STUB;
|
||||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
BOOL
|
||||
WINAPI
|
||||
SetLastConsoleEventActive(VOID)
|
||||
{
|
||||
STUB;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
BOOL
|
||||
WINAPI
|
||||
SetConsoleCommandHistoryMode(IN DWORD dwMode)
|
||||
{
|
||||
STUB;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
BOOL
|
||||
WINAPI
|
||||
SetLocalPrimaryComputerNameA(IN DWORD Unknown1,
|
||||
IN DWORD Unknown2)
|
||||
{
|
||||
STUB;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
BOOL
|
||||
WINAPI
|
||||
SetLocalPrimaryComputerNameW(IN DWORD Unknown1,
|
||||
IN DWORD Unknown2)
|
||||
{
|
||||
STUB;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
VOID
|
||||
WINAPI
|
||||
SetTermsrvAppInstallMode(IN BOOL bInstallMode)
|
||||
{
|
||||
STUB;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
BOOL
|
||||
WINAPI
|
||||
TermsrvAppInstallMode(VOID)
|
||||
{
|
||||
STUB;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -9,10 +9,9 @@
|
||||
|
||||
#include <k32.h>
|
||||
#include <reactos/buildno.h>
|
||||
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32Ver);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
static ULONG gDebugChannel = kernel32ver;
|
||||
|
||||
#define UNICODIZE1(x) L##x
|
||||
#define UNICODIZE(x) UNICODIZE1(x)
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
* 2001-12-07 created
|
||||
*/
|
||||
#include <k32.h>
|
||||
#include <wine/debug.h>
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(kernel32session);
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
//static ULONG gDebugChannel = kernel32session; not actually used
|
||||
|
||||
DWORD ActiveConsoleSessionId = 0;
|
||||
|
||||
|
||||
@@ -1910,6 +1910,7 @@ WSPIoctl(IN SOCKET Handle,
|
||||
OUT LPINT lpErrno)
|
||||
{
|
||||
PSOCKET_INFORMATION Socket = NULL;
|
||||
BOOLEAN NeedsCompletion;
|
||||
|
||||
/* Get the Socket Structure associate to this Socket*/
|
||||
Socket = GetSocketStructure(Handle);
|
||||
@@ -1918,6 +1919,8 @@ WSPIoctl(IN SOCKET Handle,
|
||||
*lpErrno = WSAENOTSOCK;
|
||||
return SOCKET_ERROR;
|
||||
}
|
||||
|
||||
*lpcbBytesReturned = 0;
|
||||
|
||||
switch( dwIoControlCode )
|
||||
{
|
||||
@@ -1928,17 +1931,44 @@ WSPIoctl(IN SOCKET Handle,
|
||||
return SOCKET_ERROR;
|
||||
}
|
||||
Socket->SharedData.NonBlocking = *((PULONG)lpvInBuffer) ? 1 : 0;
|
||||
return SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, (PULONG)lpvInBuffer, NULL);
|
||||
*lpErrno = SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, (PULONG)lpvInBuffer, NULL);
|
||||
if (*lpErrno != NO_ERROR)
|
||||
return SOCKET_ERROR;
|
||||
else
|
||||
return NO_ERROR;
|
||||
case FIONREAD:
|
||||
if( cbOutBuffer < sizeof(INT) || IS_INTRESOURCE(lpvOutBuffer) )
|
||||
{
|
||||
*lpErrno = WSAEFAULT;
|
||||
return SOCKET_ERROR;
|
||||
}
|
||||
return GetSocketInformation(Socket, AFD_INFO_RECEIVE_CONTENT_SIZE, (PULONG)lpvOutBuffer, NULL);
|
||||
*lpErrno = GetSocketInformation(Socket, AFD_INFO_RECEIVE_CONTENT_SIZE, (PULONG)lpvOutBuffer, NULL);
|
||||
if (*lpErrno != NO_ERROR)
|
||||
return SOCKET_ERROR;
|
||||
else
|
||||
{
|
||||
*lpcbBytesReturned = sizeof(ULONG);
|
||||
return NO_ERROR;
|
||||
}
|
||||
default:
|
||||
*lpErrno = WSAEINVAL;
|
||||
return SOCKET_ERROR;
|
||||
*lpErrno = Socket->HelperData->WSHIoctl(Socket->HelperContext,
|
||||
Handle,
|
||||
Socket->TdiAddressHandle,
|
||||
Socket->TdiConnectionHandle,
|
||||
dwIoControlCode,
|
||||
lpvInBuffer,
|
||||
cbInBuffer,
|
||||
lpvOutBuffer,
|
||||
cbOutBuffer,
|
||||
lpcbBytesReturned,
|
||||
lpOverlapped,
|
||||
lpCompletionRoutine,
|
||||
(LPBOOL)&NeedsCompletion);
|
||||
|
||||
if (*lpErrno != NO_ERROR)
|
||||
return SOCKET_ERROR;
|
||||
else
|
||||
return NO_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -126,9 +126,9 @@
|
||||
@ cdecl __RTDynamicCast(ptr long ptr ptr long) MSVCRT___RTDynamicCast
|
||||
@ cdecl __RTtypeid(ptr) MSVCRT___RTtypeid
|
||||
@ cdecl __STRINGTOLD(ptr ptr str long)
|
||||
# @ cdecl ___lc_codepage_func()
|
||||
@ cdecl ___lc_codepage_func()
|
||||
# @ cdecl ___lc_collate_cp_func()
|
||||
# @ cdecl ___lc_handle_func()
|
||||
@ cdecl ___lc_handle_func()
|
||||
# @ cdecl ___mb_cur_max_func() MSVCRT___mb_cur_max_func
|
||||
@ cdecl ___setlc_active_func()
|
||||
@ cdecl ___unguarded_readlc_active_add_func()
|
||||
@@ -151,10 +151,10 @@
|
||||
@ cdecl __isascii(long) __isascii
|
||||
@ cdecl __iscsym(long) __iscsym
|
||||
@ cdecl __iscsymf(long) __iscsymf
|
||||
@ extern __lc_codepage __lc_codepage
|
||||
@ extern __lc_codepage MSVCRT___lc_codepage
|
||||
@ stub __lc_collate
|
||||
@ extern __lc_collate_cp __lc_collate_cp
|
||||
@ extern __lc_handle __lc_handle
|
||||
@ extern __lc_collate_cp MSVCRT___lc_collate_cp
|
||||
@ extern __lc_handle MSVCRT___lc_handle
|
||||
@ cdecl __lconv_init()
|
||||
# stub __libm_sse2_acos
|
||||
# stub __libm_sse2_acosf
|
||||
|
||||
@@ -175,37 +175,16 @@ static HICON SIC_OverlayShortcutImage(HICON SourceIcon, BOOL large)
|
||||
if (! BitBlt(TargetDC, 0, 0, SourceBitmapInfo.bmWidth, SourceBitmapInfo.bmHeight,
|
||||
SourceDC, 0, 0, SRCCOPY)) goto fail;
|
||||
|
||||
/* Check if we can use alpha blending */
|
||||
if (ShortcutBitmapInfo.bmBitsPixel == 32)
|
||||
{
|
||||
/* Use alpha blending to make sure the target alpha channel stays valid */
|
||||
if (NULL == SelectObject(ShortcutDC, ShortcutIconInfo.hbmColor)) goto fail;
|
||||
if (!GdiAlphaBlend(TargetDC, 0, SourceBitmapInfo.bmHeight - ShortcutBitmapInfo.bmHeight,
|
||||
ShortcutBitmapInfo.bmWidth, ShortcutBitmapInfo.bmHeight,
|
||||
ShortcutDC, 0, 0, ShortcutBitmapInfo.bmWidth, ShortcutBitmapInfo.bmHeight,
|
||||
(BLENDFUNCTION){AC_SRC_OVER, 0, 255, AC_SRC_ALPHA})) goto fail;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Copy the source xor bitmap to the target and clear out part of it by using
|
||||
the shortcut mask */
|
||||
if (! BitBlt(TargetDC, 0, SourceBitmapInfo.bmHeight - ShortcutBitmapInfo.bmHeight,
|
||||
ShortcutBitmapInfo.bmWidth, ShortcutBitmapInfo.bmHeight,
|
||||
ShortcutDC, 0, 0, SRCAND))
|
||||
{
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (NULL == SelectObject(ShortcutDC, ShortcutIconInfo.hbmColor)) goto fail;
|
||||
|
||||
/* Now put in the shortcut xor mask */
|
||||
if (! BitBlt(TargetDC, 0, SourceBitmapInfo.bmHeight - ShortcutBitmapInfo.bmHeight,
|
||||
ShortcutBitmapInfo.bmWidth, ShortcutBitmapInfo.bmHeight,
|
||||
ShortcutDC, 0, 0, SRCINVERT))
|
||||
{
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
/* Copy the source xor bitmap to the target and clear out part of it by using
|
||||
the shortcut mask */
|
||||
if (NULL == SelectObject(ShortcutDC, ShortcutIconInfo.hbmColor)) goto fail;
|
||||
if (!MaskBlt(TargetDC, 0, SourceBitmapInfo.bmHeight - ShortcutBitmapInfo.bmHeight,
|
||||
ShortcutBitmapInfo.bmWidth, ShortcutBitmapInfo.bmHeight,
|
||||
ShortcutDC, 0, 0, ShortcutIconInfo.hbmMask, 0, 0,
|
||||
MAKEROP4(SRCCOPY, 0xAA0000)))
|
||||
{
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Clean up, we're not goto'ing to 'fail' after this so we can be lazy and not set
|
||||
handles to NULL */
|
||||
|
||||
@@ -91,7 +91,7 @@ static void FillNumberFmt(NUMBERFMTW *fmt, LPWSTR decimal_buffer, int decimal_bu
|
||||
* Format an integer according to the current locale
|
||||
*
|
||||
* RETURNS
|
||||
* The number of bytes written on success or 0 on failure
|
||||
* The number of characters written on success or 0 on failure
|
||||
*/
|
||||
static int FormatInt(LONGLONG qdwValue, LPWSTR pszBuf, int cchBuf)
|
||||
{
|
||||
@@ -124,7 +124,7 @@ static int FormatInt(LONGLONG qdwValue, LPWSTR pszBuf, int cchBuf)
|
||||
* after the decimal point
|
||||
*
|
||||
* RETURNS
|
||||
* The number of bytes written on success or 0 on failure
|
||||
* The number of characters written on success or 0 on failure
|
||||
*/
|
||||
static int FormatDouble(double value, int decimals, LPWSTR pszBuf, int cchBuf)
|
||||
{
|
||||
|
||||
@@ -459,7 +459,7 @@ select(IN INT nfds,
|
||||
|
||||
DereferenceProviderByPointer(Provider);
|
||||
|
||||
if (Errno != NO_ERROR)
|
||||
if (Count == SOCKET_ERROR)
|
||||
{
|
||||
WSASetLastError(Errno);
|
||||
return SOCKET_ERROR;
|
||||
@@ -586,13 +586,15 @@ ioctlsocket(IN SOCKET s,
|
||||
IN LONG cmd,
|
||||
IN OUT ULONG FAR* argp)
|
||||
{
|
||||
ULONG tmp;
|
||||
|
||||
return WSAIoctl(s,
|
||||
cmd,
|
||||
argp,
|
||||
sizeof(ULONG),
|
||||
argp,
|
||||
sizeof(ULONG),
|
||||
argp,
|
||||
&tmp,
|
||||
0,
|
||||
0);
|
||||
}
|
||||
@@ -642,7 +644,7 @@ WSAAccept(IN SOCKET s,
|
||||
if (Socket == INVALID_SOCKET)
|
||||
WSASetLastError(Errno);
|
||||
|
||||
if ( addr )
|
||||
if ( addr && addrlen )
|
||||
{
|
||||
#if DBG
|
||||
LPSOCKADDR_IN sa = (LPSOCKADDR_IN)addr;
|
||||
|
||||
+217
-8
@@ -20,32 +20,238 @@ VOID
|
||||
NTAPI
|
||||
Device_SaveCurrentSettings(IN PPCI_CONFIGURATOR_CONTEXT Context)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
while (TRUE);
|
||||
PPCI_COMMON_HEADER PciData;
|
||||
PIO_RESOURCE_DESCRIPTOR IoDescriptor;
|
||||
PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor;
|
||||
PPCI_FUNCTION_RESOURCES Resources;
|
||||
PULONG BarArray;
|
||||
ULONG Bar, BarMask, i;
|
||||
|
||||
/* Get variables from context */
|
||||
PciData = Context->Current;
|
||||
Resources = Context->PdoExtension->Resources;
|
||||
|
||||
/* Loop all the PCI BARs */
|
||||
BarArray = PciData->u.type0.BaseAddresses;
|
||||
for (i = 0; i <= PCI_TYPE0_ADDRESSES; i++)
|
||||
{
|
||||
/* Get the resource descriptor and limit descriptor for this BAR */
|
||||
CmDescriptor = &Resources->Current[i];
|
||||
IoDescriptor = &Resources->Limit[i];
|
||||
|
||||
/* Build the resource descriptor based on the limit descriptor */
|
||||
CmDescriptor->Type = IoDescriptor->Type;
|
||||
if (CmDescriptor->Type == CmResourceTypeNull) continue;
|
||||
CmDescriptor->Flags = IoDescriptor->Flags;
|
||||
CmDescriptor->ShareDisposition = IoDescriptor->ShareDisposition;
|
||||
CmDescriptor->u.Generic.Start.HighPart = 0;
|
||||
CmDescriptor->u.Generic.Length = IoDescriptor->u.Generic.Length;
|
||||
|
||||
/* Read the actual BAR value */
|
||||
Bar = BarArray[i];
|
||||
|
||||
/* Check which BAR is being processed now */
|
||||
if (i != PCI_TYPE0_ADDRESSES)
|
||||
{
|
||||
/* Check if this is an I/O BAR */
|
||||
if (Bar & PCI_ADDRESS_IO_SPACE)
|
||||
{
|
||||
/* Use the right mask to get the I/O port base address */
|
||||
ASSERT(CmDescriptor->Type == CmResourceTypePort);
|
||||
BarMask = PCI_ADDRESS_IO_ADDRESS_MASK;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* It's a RAM BAR, use the right mask to get the base address */
|
||||
ASSERT(CmDescriptor->Type == CmResourceTypeMemory);
|
||||
BarMask = PCI_ADDRESS_MEMORY_ADDRESS_MASK;
|
||||
|
||||
/* Check if it's a 64-bit BAR */
|
||||
if ((Bar & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_64BIT)
|
||||
{
|
||||
/* The next BAR value is actually the high 32-bits */
|
||||
CmDescriptor->u.Memory.Start.HighPart = BarArray[i + 1];
|
||||
}
|
||||
else if ((Bar & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_20BIT)
|
||||
{
|
||||
/* Legacy BAR, don't read more than 20 bits of the address */
|
||||
BarMask = 0xFFFF0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Actually a ROM BAR, so read the correct register */
|
||||
Bar = PciData->u.type0.ROMBaseAddress;
|
||||
|
||||
/* Apply the correct mask for ROM BARs */
|
||||
BarMask = PCI_ADDRESS_ROM_ADDRESS_MASK;
|
||||
|
||||
/* Make sure it's enabled */
|
||||
if (!(Bar & PCI_ROMADDRESS_ENABLED))
|
||||
{
|
||||
/* If it isn't, then a descriptor won't be built for it */
|
||||
CmDescriptor->Type = CmResourceTypeNull;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Now we have the right mask, read the actual address from the BAR */
|
||||
Bar &= BarMask;
|
||||
CmDescriptor->u.Memory.Start.LowPart = Bar;
|
||||
|
||||
/* And check for invalid BAR addresses */
|
||||
if (!(CmDescriptor->u.Memory.Start.HighPart | Bar))
|
||||
{
|
||||
/* Skip these descriptors */
|
||||
CmDescriptor->Type = CmResourceTypeNull;
|
||||
DPRINT1("Invalid BAR\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Also save the sub-IDs that came directly from the PCI header */
|
||||
Context->PdoExtension->SubsystemVendorId = PciData->u.type0.SubVendorID;
|
||||
Context->PdoExtension->SubsystemId = PciData->u.type0.SubSystemID;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
Device_SaveLimits(IN PPCI_CONFIGURATOR_CONTEXT Context)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
while (TRUE);
|
||||
PPCI_COMMON_HEADER Current, PciData;
|
||||
PPCI_PDO_EXTENSION PdoExtension;
|
||||
PULONG BarArray;
|
||||
PIO_RESOURCE_DESCRIPTOR Limit;
|
||||
ULONG i;
|
||||
|
||||
/* Get pointers from the context */
|
||||
PdoExtension = Context->PdoExtension;
|
||||
Current = Context->Current;
|
||||
PciData = Context->PciData;
|
||||
|
||||
/* And get the array of bARs */
|
||||
BarArray = PciData->u.type0.BaseAddresses;
|
||||
|
||||
/* First, check for IDE controllers that are not in native mode */
|
||||
if ((PdoExtension->BaseClass == PCI_CLASS_MASS_STORAGE_CTLR) &&
|
||||
(PdoExtension->SubClass == PCI_SUBCLASS_MSC_IDE_CTLR) &&
|
||||
(PdoExtension->ProgIf & 5) != 5)
|
||||
{
|
||||
/* They should not be using any non-legacy resources */
|
||||
BarArray[0] = 0;
|
||||
BarArray[1] = 0;
|
||||
BarArray[2] = 0;
|
||||
BarArray[3] = 0;
|
||||
}
|
||||
else if ((PdoExtension->VendorId == 0x5333) &&
|
||||
((PdoExtension->DeviceId == 0x88F0) ||
|
||||
(PdoExtension->DeviceId == 0x8880)))
|
||||
{
|
||||
/*
|
||||
* The problem is caused by the S3 Vision 968/868 video controller which
|
||||
* is used on the Diamond Stealth 64 Video 3000 series, Number Nine 9FX
|
||||
* motion 771, and other popular video cards, all containing a memory bug.
|
||||
* The 968/868 claims to require 32 MB of memory, but it actually decodes
|
||||
* 64 MB of memory.
|
||||
*/
|
||||
for (i = 0; i < PCI_TYPE0_ADDRESSES; i++)
|
||||
{
|
||||
/* Find its 32MB RAM BAR */
|
||||
if (BarArray[i] == 0xFE000000)
|
||||
{
|
||||
/* Increase it to 64MB to make sure nobody touches the buffer */
|
||||
BarArray[i] = 0xFC000000;
|
||||
DPRINT1("PCI - Adjusted broken S3 requirement from 32MB to 64MB\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Check for Cirrus Logic GD5430/5440 cards */
|
||||
if ((PdoExtension->VendorId == 0x1013) && (PdoExtension->DeviceId == 0xA0))
|
||||
{
|
||||
/* Check for the I/O port requirement */
|
||||
if (BarArray[1] == 0xFC01)
|
||||
{
|
||||
/* Check for completely bogus BAR */
|
||||
if (Current->u.type0.BaseAddresses[1] == 1)
|
||||
{
|
||||
/* Ignore it */
|
||||
BarArray[1] = 0;
|
||||
DPRINT1("PCI - Ignored Cirrus GD54xx broken IO requirement (400 ports)\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Otherwise, this BAR seems okay */
|
||||
DPRINT1("PCI - Cirrus GD54xx 400 port IO requirement has a valid setting (%08x)\n",
|
||||
Current->u.type0.BaseAddresses[1]);
|
||||
}
|
||||
}
|
||||
else if (BarArray[1])
|
||||
{
|
||||
/* Strange, the I/O BAR was not found as expected (or at all) */
|
||||
DPRINT1("PCI - Warning Cirrus Adapter 101300a0 has unexpected resource requirement (%08x)\n",
|
||||
BarArray[1]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Finally, process all the limit descriptors */
|
||||
Limit = PdoExtension->Resources->Limit;
|
||||
for (i = 0; i < PCI_TYPE0_ADDRESSES; i++)
|
||||
{
|
||||
/* And build them based on the BARs */
|
||||
if (PciCreateIoDescriptorFromBarLimit(&Limit[i], &BarArray[i], FALSE))
|
||||
{
|
||||
/* This function returns TRUE if the BAR was 64-bit, handle this */
|
||||
ASSERT((i + 1) < PCI_TYPE0_ADDRESSES);
|
||||
i++;
|
||||
(&Limit[i])->Type == CmResourceTypeNull;
|
||||
}
|
||||
}
|
||||
|
||||
/* Create the last descriptor based on the ROM address */
|
||||
PciCreateIoDescriptorFromBarLimit(&Limit[i],
|
||||
&PciData->u.type0.ROMBaseAddress,
|
||||
TRUE);
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
Device_MassageHeaderForLimitsDetermination(IN PPCI_CONFIGURATOR_CONTEXT Context)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
while (TRUE);
|
||||
PPCI_COMMON_HEADER PciData;
|
||||
PPCI_PDO_EXTENSION PdoExtension;
|
||||
PULONG BarArray;
|
||||
ULONG i = 0;
|
||||
|
||||
/* Get pointers from context data */
|
||||
PdoExtension = Context->PdoExtension;
|
||||
PciData = Context->PciData;
|
||||
|
||||
/* Get the array of BARs */
|
||||
BarArray = PciData->u.type0.BaseAddresses;
|
||||
|
||||
/* Check for IDE controllers that are not in native mode */
|
||||
if ((PdoExtension->BaseClass == PCI_CLASS_MASS_STORAGE_CTLR) &&
|
||||
(PdoExtension->SubClass == PCI_SUBCLASS_MSC_IDE_CTLR) &&
|
||||
(PdoExtension->ProgIf & 5) != 5)
|
||||
{
|
||||
/* These controllers only use legacy resources */
|
||||
i = 4;
|
||||
}
|
||||
|
||||
/* Set all the bits on, which will allow us to recover the limit data */
|
||||
for (i = 0; i < PCI_TYPE0_ADDRESSES; i++) BarArray[i] = 0xFFFFFFFF;
|
||||
|
||||
/* Do the same for the PCI ROM BAR */
|
||||
PciData->u.type0.ROMBaseAddress = PCI_ADDRESS_ROM_ADDRESS_MASK;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
Device_RestoreCurrent(IN PPCI_CONFIGURATOR_CONTEXT Context)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
while (TRUE);
|
||||
/* Nothing to do for devices */
|
||||
return;
|
||||
}
|
||||
|
||||
VOID
|
||||
@@ -54,6 +260,7 @@ Device_GetAdditionalResourceDescriptors(IN PPCI_CONFIGURATOR_CONTEXT Context,
|
||||
IN PPCI_COMMON_HEADER PciData,
|
||||
IN PIO_RESOURCE_DESCRIPTOR IoDescriptor)
|
||||
{
|
||||
/* Not yet implemented */
|
||||
UNIMPLEMENTED;
|
||||
while (TRUE);
|
||||
}
|
||||
@@ -62,6 +269,7 @@ VOID
|
||||
NTAPI
|
||||
Device_ResetDevice(IN PPCI_CONFIGURATOR_CONTEXT Context)
|
||||
{
|
||||
/* Not yet implemented */
|
||||
UNIMPLEMENTED;
|
||||
while (TRUE);
|
||||
}
|
||||
@@ -70,6 +278,7 @@ VOID
|
||||
NTAPI
|
||||
Device_ChangeResourceSettings(IN PPCI_CONFIGURATOR_CONTEXT Context)
|
||||
{
|
||||
/* Not yet implemented */
|
||||
UNIMPLEMENTED;
|
||||
while (TRUE);
|
||||
}
|
||||
|
||||
+63
-6
@@ -32,7 +32,7 @@ PCI_CONFIGURATOR PciConfigurators[] =
|
||||
PPBridge_SaveCurrentSettings,
|
||||
PPBridge_ChangeResourceSettings,
|
||||
PPBridge_GetAdditionalResourceDescriptors,
|
||||
PPBridge_ResetDevice
|
||||
PPBridge_ResetDevice
|
||||
},
|
||||
{
|
||||
Cardbus_MassageHeaderForLimitsDetermination,
|
||||
@@ -44,7 +44,7 @@ PCI_CONFIGURATOR PciConfigurators[] =
|
||||
Cardbus_ResetDevice
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
||||
/*
|
||||
@@ -715,10 +715,10 @@ PciWriteLimitsAndRestoreCurrent(IN PVOID Reserved,
|
||||
|
||||
/* Write the limit discovery header */
|
||||
PciWriteDeviceConfig(PdoExtension, PciData, 0, PCI_COMMON_HDR_LENGTH);
|
||||
|
||||
|
||||
/* Now read what the device indicated the limits are */
|
||||
PciReadDeviceConfig(PdoExtension, PciData, 0, PCI_COMMON_HDR_LENGTH);
|
||||
|
||||
|
||||
/* Then write back the original configuration header */
|
||||
PciWriteDeviceConfig(PdoExtension, Current, 0, PCI_COMMON_HDR_LENGTH);
|
||||
|
||||
@@ -735,7 +735,7 @@ PciWriteLimitsAndRestoreCurrent(IN PVOID Reserved,
|
||||
|
||||
/* Copy back the original status that was saved as well */
|
||||
Current->Status = Context->Status;
|
||||
|
||||
|
||||
/* Call the configurator to restore any other data that might've changed */
|
||||
Context->Configurator->RestoreCurrent(Context);
|
||||
}
|
||||
@@ -917,6 +917,62 @@ PciGetFunctionLimits(IN PPCI_PDO_EXTENSION PdoExtension,
|
||||
return Status;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
PciProcessBus(IN PPCI_FDO_EXTENSION DeviceExtension)
|
||||
{
|
||||
PPCI_PDO_EXTENSION PdoExtension;
|
||||
PDEVICE_OBJECT PhysicalDeviceObject;
|
||||
PAGED_CODE();
|
||||
|
||||
/* Get the PDO Extension */
|
||||
PhysicalDeviceObject = DeviceExtension->PhysicalDeviceObject;
|
||||
PdoExtension = (PPCI_PDO_EXTENSION)PhysicalDeviceObject->DeviceExtension;
|
||||
|
||||
/* Cheeck if this is the root bus */
|
||||
if (!PCI_IS_ROOT_FDO(DeviceExtension))
|
||||
{
|
||||
/* Not really handling this year */
|
||||
UNIMPLEMENTED;
|
||||
while (TRUE);
|
||||
|
||||
/* Check for PCI bridges with the ISA bit set, or required */
|
||||
if ((PdoExtension) &&
|
||||
(PciClassifyDeviceType(PdoExtension) == PciTypePciBridge) &&
|
||||
((PdoExtension->Dependent.type1.IsaBitRequired) ||
|
||||
(PdoExtension->Dependent.type1.IsaBitSet)))
|
||||
{
|
||||
/* We'll need to do some legacy support */
|
||||
UNIMPLEMENTED;
|
||||
while (TRUE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Scan all of the root bus' children bridges */
|
||||
for (PdoExtension = DeviceExtension->ChildBridgePdoList;
|
||||
PdoExtension;
|
||||
PdoExtension = PdoExtension->NextBridge)
|
||||
{
|
||||
/* Find any that have the VGA decode bit on */
|
||||
if (PdoExtension->Dependent.type1.VgaBitSet)
|
||||
{
|
||||
/* Again, some more legacy support we'll have to do */
|
||||
UNIMPLEMENTED;
|
||||
while (TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Check for ACPI systems where the OS assigns bus numbers */
|
||||
if (PciAssignBusNumbers)
|
||||
{
|
||||
/* Not yet supported */
|
||||
UNIMPLEMENTED;
|
||||
while (TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PciScanBus(IN PPCI_FDO_EXTENSION DeviceExtension)
|
||||
@@ -1363,7 +1419,8 @@ PciScanBus(IN PPCI_FDO_EXTENSION DeviceExtension)
|
||||
}
|
||||
}
|
||||
|
||||
/* Enumeration is completed */
|
||||
/* Enumeration completed, do a final pass now that all devices are found */
|
||||
if (ProcessFlag) PciProcessBus(DeviceExtension);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -102,6 +102,18 @@ typedef enum _PCI_SIGNATURE
|
||||
PciInterface_Location = 'icP?'
|
||||
} PCI_SIGNATURE, *PPCI_SIGNATURE;
|
||||
|
||||
//
|
||||
// Driver-handled PCI Device Types
|
||||
//
|
||||
typedef enum _PCI_DEVICE_TYPES
|
||||
{
|
||||
PciTypeInvalid,
|
||||
PciTypeHostBridge,
|
||||
PciTypePciBridge,
|
||||
PciTypeCardbusBridge,
|
||||
PciTypeDevice
|
||||
} PCI_DEVICE_TYPES;
|
||||
|
||||
//
|
||||
// Device Extension Logic States
|
||||
//
|
||||
@@ -1064,6 +1076,12 @@ PciCanDisableDecodes(
|
||||
IN BOOLEAN ForPowerDown
|
||||
);
|
||||
|
||||
PCI_DEVICE_TYPES
|
||||
NTAPI
|
||||
PciClassifyDeviceType(
|
||||
IN PPCI_PDO_EXTENSION PdoExtension
|
||||
);
|
||||
|
||||
ULONG_PTR
|
||||
NTAPI
|
||||
PciExecuteCriticalSystemRoutine(
|
||||
@@ -1607,6 +1625,7 @@ extern PCI_INTERFACE TranslatorInterfaceInterrupt;
|
||||
extern PDRIVER_OBJECT PciDriverObject;
|
||||
extern PWATCHDOG_TABLE WdTable;
|
||||
extern PPCI_HACK_ENTRY PciHackTable;
|
||||
extern BOOLEAN PciAssignBusNumbers;
|
||||
extern BOOLEAN PciEnableNativeModeATA;
|
||||
|
||||
/* Exported by NTOS, should this go in the NDK? */
|
||||
|
||||
@@ -1041,6 +1041,24 @@ PciCanDisableDecodes(IN PPCI_PDO_EXTENSION DeviceExtension,
|
||||
return !(HackFlags & PCI_HACK_NO_PM_CAPS);
|
||||
}
|
||||
|
||||
PCI_DEVICE_TYPES
|
||||
NTAPI
|
||||
PciClassifyDeviceType(IN PPCI_PDO_EXTENSION PdoExtension)
|
||||
{
|
||||
ASSERT(PdoExtension->ExtensionType == PciPdoExtensionType);
|
||||
|
||||
/* Differenriate between devices and bridges */
|
||||
if (PdoExtension->BaseClass != PCI_CLASS_BRIDGE_DEV) return PciTypeDevice;
|
||||
|
||||
/* The PCI Bus driver handles only CardBus and PCI bridges (plus host) */
|
||||
if (PdoExtension->SubClass == PCI_SUBCLASS_BR_HOST) return PciTypeHostBridge;
|
||||
if (PdoExtension->SubClass == PCI_SUBCLASS_BR_PCI_TO_PCI) return PciTypePciBridge;
|
||||
if (PdoExtension->SubClass == PCI_SUBCLASS_BR_CARDBUS) return PciTypeCardbusBridge;
|
||||
|
||||
/* Any other kind of bridge is treated like a device */
|
||||
return PciTypeDevice;
|
||||
}
|
||||
|
||||
ULONG_PTR
|
||||
NTAPI
|
||||
PciExecuteCriticalSystemRoutine(IN ULONG_PTR IpiContext)
|
||||
|
||||
@@ -73,7 +73,7 @@ CdfsGetPVDData(PUCHAR Buffer,
|
||||
/* Extract the volume label */
|
||||
pc = Pvd->VolumeId;
|
||||
pw = CdInfo->VolumeLabel;
|
||||
for (i = 0; i < MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR); i++)
|
||||
for (i = 0; i < (MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)) - 1; i++)
|
||||
{
|
||||
*pw++ = (WCHAR)*pc++;
|
||||
}
|
||||
|
||||
@@ -95,6 +95,46 @@ CdfsFileFlagsToAttributes(PFCB Fcb,
|
||||
((Fcb->Entry.FileFlags & FILE_FLAG_READONLY) ? FILE_ATTRIBUTE_READONLY : 0);
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
CdfsIsNameLegalDOS8Dot3(IN UNICODE_STRING FileName
|
||||
)
|
||||
{
|
||||
ULONG i;
|
||||
STRING DbcsName;
|
||||
CHAR DbcsNameBuffer[12];
|
||||
|
||||
/* 8dot3 filename is max 12 length */
|
||||
if (FileName.Length / sizeof(WCHAR) > 12)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
for (i = 0; i < FileName.Length / sizeof(WCHAR) ; i++)
|
||||
{
|
||||
/* Don't allow spaces in FileName */
|
||||
if (FileName.Buffer[i] == L' ')
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* If FileName is finishing with a dot, remove it */
|
||||
if (FileName.Buffer[FileName.Length / sizeof(WCHAR) - 1] == '.')
|
||||
{
|
||||
FileName.Length -= sizeof(WCHAR);
|
||||
}
|
||||
|
||||
/* Finally, convert the string to call the FsRtl function */
|
||||
DbcsName.MaximumLength = 12;
|
||||
DbcsName.Buffer = DbcsNameBuffer;
|
||||
if (!NT_SUCCESS(RtlUnicodeStringToCountedOemString(&DbcsName,
|
||||
&FileName,
|
||||
FALSE )))
|
||||
{
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
return FsRtlIsFatDbcsLegal(DbcsName, FALSE, FALSE, FALSE);
|
||||
}
|
||||
|
||||
VOID
|
||||
CdfsShortNameCacheGet
|
||||
(PFCB DirectoryFcb,
|
||||
@@ -102,7 +142,6 @@ CdfsShortNameCacheGet
|
||||
PUNICODE_STRING LongName,
|
||||
PUNICODE_STRING ShortName)
|
||||
{
|
||||
BOOLEAN HasSpaces;
|
||||
PLIST_ENTRY Entry;
|
||||
PCDFS_SHORT_NAME ShortNameEntry;
|
||||
GENERATE_NAME_CONTEXT Context = { 0 };
|
||||
@@ -132,8 +171,7 @@ CdfsShortNameCacheGet
|
||||
}
|
||||
|
||||
/* Cache miss */
|
||||
if ((RtlIsNameLegalDOS8Dot3(LongName, NULL, &HasSpaces) == FALSE) ||
|
||||
(HasSpaces == TRUE))
|
||||
if (!CdfsIsNameLegalDOS8Dot3(*LongName))
|
||||
{
|
||||
RtlGenerate8dot3Name(LongName, FALSE, &Context, ShortName);
|
||||
}
|
||||
|
||||
@@ -466,7 +466,7 @@ VfatCreateFile ( PDEVICE_OBJECT DeviceObject, PIRP Irp )
|
||||
|
||||
/* This a open operation for the volume itself */
|
||||
if (FileObject->FileName.Length == 0 &&
|
||||
FileObject->RelatedFileObject == NULL)
|
||||
(FileObject->RelatedFileObject == NULL || FileObject->RelatedFileObject->FsContext2 != NULL))
|
||||
{
|
||||
if (RequestedDisposition == FILE_CREATE ||
|
||||
RequestedDisposition == FILE_OVERWRITE_IF ||
|
||||
@@ -474,10 +474,13 @@ VfatCreateFile ( PDEVICE_OBJECT DeviceObject, PIRP Irp )
|
||||
{
|
||||
return(STATUS_ACCESS_DENIED);
|
||||
}
|
||||
#if 0
|
||||
/* In spite of what is shown in WDK, it seems that Windows FAT driver doesn't perform that test */
|
||||
if (RequestedOptions & FILE_DIRECTORY_FILE)
|
||||
{
|
||||
return(STATUS_NOT_A_DIRECTORY);
|
||||
}
|
||||
#endif
|
||||
pFcb = DeviceExt->VolumeFcb;
|
||||
pCcb = ExAllocateFromNPagedLookasideList(&VfatGlobalData->CcbLookasideList);
|
||||
if (pCcb == NULL)
|
||||
|
||||
@@ -13,13 +13,430 @@
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
/* Last handle to a file object is closed */
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatiCleanup(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
|
||||
{
|
||||
PIO_STACK_LOCATION IrpSp;
|
||||
PFILE_OBJECT FileObject;
|
||||
TYPE_OF_OPEN TypeOfOpen;
|
||||
PSHARE_ACCESS ShareAccess;
|
||||
BOOLEAN SendUnlockNotification = FALSE;
|
||||
PLARGE_INTEGER TruncateSize = NULL;
|
||||
//LARGE_INTEGER LocalTruncateSize;
|
||||
BOOLEAN AcquiredVcb = FALSE, AcquiredFcb = FALSE;
|
||||
NTSTATUS Status;
|
||||
PVCB Vcb;
|
||||
PFCB Fcb;
|
||||
PCCB Ccb;
|
||||
|
||||
IrpSp = IoGetCurrentIrpStackLocation( Irp );
|
||||
|
||||
DPRINT("FatiCleanup\n");
|
||||
DPRINT("\tIrp = %p\n", Irp);
|
||||
DPRINT("\t->FileObject = %p\n", IrpSp->FileObject);
|
||||
|
||||
FileObject = IrpSp->FileObject;
|
||||
TypeOfOpen = FatDecodeFileObject(FileObject, &Vcb, &Fcb, &Ccb);
|
||||
|
||||
if (TypeOfOpen == UnopenedFileObject)
|
||||
{
|
||||
DPRINT1("Unopened File Object\n");
|
||||
|
||||
FatCompleteRequest(IrpContext, Irp, STATUS_SUCCESS);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
if (FlagOn( FileObject->Flags, FO_CLEANUP_COMPLETE ))
|
||||
{
|
||||
/* Just flush the file */
|
||||
|
||||
if (FlagOn(Vcb->State, VCB_STATE_FLAG_DEFERRED_FLUSH) &&
|
||||
FlagOn(FileObject->Flags, FO_FILE_MODIFIED) &&
|
||||
!FlagOn(Vcb->State, VCB_STATE_FLAG_WRITE_PROTECTED) &&
|
||||
(TypeOfOpen == UserFileOpen))
|
||||
{
|
||||
//Status = FatFlushFile(IrpContext, Fcb, Flush);
|
||||
//if (!NT_SUCCESS(Status)) FatNormalizeAndRaiseStatus(IrpContext, Status);
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
FatCompleteRequest(IrpContext, Irp, STATUS_SUCCESS);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
if (TypeOfOpen == UserFileOpen ||
|
||||
TypeOfOpen == UserDirectoryOpen)
|
||||
{
|
||||
ASSERT(Fcb != NULL);
|
||||
|
||||
(VOID)FatAcquireExclusiveFcb(IrpContext, Fcb);
|
||||
|
||||
AcquiredFcb = TRUE;
|
||||
|
||||
/* Set FCB flags according to DELETE_ON_CLOSE */
|
||||
if (FlagOn(Ccb->Flags, CCB_DELETE_ON_CLOSE))
|
||||
{
|
||||
ASSERT(FatNodeType(Fcb) != FAT_NTC_ROOT_DCB);
|
||||
|
||||
SetFlag(Fcb->State, FCB_STATE_DELETE_ON_CLOSE);
|
||||
|
||||
/* Issue a notification */
|
||||
if (TypeOfOpen == UserDirectoryOpen)
|
||||
{
|
||||
FsRtlNotifyFullChangeDirectory(Vcb->NotifySync,
|
||||
&Vcb->NotifyList,
|
||||
FileObject->FsContext,
|
||||
NULL,
|
||||
FALSE,
|
||||
FALSE,
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* If file should be deleted, acquire locks */
|
||||
if ((Fcb->UncleanCount == 1) &&
|
||||
FlagOn(Fcb->State, FCB_STATE_DELETE_ON_CLOSE) &&
|
||||
(Fcb->Condition != FcbBad) &&
|
||||
!FlagOn(Vcb->State, VCB_STATE_FLAG_WRITE_PROTECTED))
|
||||
{
|
||||
FatReleaseFcb(IrpContext, Fcb);
|
||||
AcquiredFcb = FALSE;
|
||||
|
||||
(VOID)FatAcquireExclusiveVcb(IrpContext, Vcb);
|
||||
AcquiredVcb = TRUE;
|
||||
|
||||
(VOID)FatAcquireExclusiveFcb(IrpContext, Fcb);
|
||||
AcquiredFcb = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Acquire VCB lock if it was a volume open */
|
||||
if (TypeOfOpen == UserVolumeOpen)
|
||||
{
|
||||
(VOID)FatAcquireExclusiveVcb(IrpContext, Vcb);
|
||||
AcquiredVcb = TRUE;
|
||||
}
|
||||
|
||||
/* Cleanup all notifications */
|
||||
if (TypeOfOpen == UserDirectoryOpen)
|
||||
{
|
||||
FsRtlNotifyCleanup(Vcb->NotifySync,
|
||||
&Vcb->NotifyList,
|
||||
Ccb);
|
||||
}
|
||||
|
||||
if (Fcb)
|
||||
{
|
||||
//TODO: FatVerifyFcb
|
||||
}
|
||||
|
||||
switch (TypeOfOpen)
|
||||
{
|
||||
case DirectoryFile:
|
||||
case VirtualVolumeFile:
|
||||
DPRINT1("Cleanup VirtualVolumeFile/DirectoryFile\n");
|
||||
ShareAccess = NULL;
|
||||
break;
|
||||
|
||||
case UserVolumeOpen:
|
||||
DPRINT("Cleanup UserVolumeOpen\n");
|
||||
|
||||
if (FlagOn(Ccb->Flags, CCB_COMPLETE_DISMOUNT))
|
||||
{
|
||||
FatCheckForDismount( IrpContext, Vcb, TRUE );
|
||||
} else if (FileObject->WriteAccess &&
|
||||
FlagOn(FileObject->Flags, FO_FILE_MODIFIED))
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/* Release the volume and send notification */
|
||||
if (FlagOn(Vcb->State, VCB_STATE_FLAG_LOCKED) &&
|
||||
(Vcb->FileObjectWithVcbLocked == FileObject))
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
SendUnlockNotification = TRUE;
|
||||
}
|
||||
|
||||
ShareAccess = &Vcb->ShareAccess;
|
||||
break;
|
||||
|
||||
case EaFile:
|
||||
DPRINT1("Cleanup EaFileObject\n");
|
||||
ShareAccess = NULL;
|
||||
break;
|
||||
|
||||
case UserDirectoryOpen:
|
||||
DPRINT("Cleanup UserDirectoryOpen\n");
|
||||
|
||||
ShareAccess = &Fcb->ShareAccess;
|
||||
|
||||
/* Should it be a delayed close? */
|
||||
if ((Fcb->UncleanCount == 1) &&
|
||||
(Fcb->OpenCount == 1) &&
|
||||
(Fcb->Dcb.DirectoryFileOpenCount == 0) &&
|
||||
!FlagOn(Fcb->State, FCB_STATE_DELETE_ON_CLOSE) &&
|
||||
Fcb->Condition == FcbGood)
|
||||
{
|
||||
/* Yes, a delayed one */
|
||||
SetFlag(Fcb->State, FCB_STATE_DELAY_CLOSE);
|
||||
}
|
||||
|
||||
if (VcbGood == Vcb->Condition)
|
||||
{
|
||||
//FatUpdateDirentFromFcb( IrpContext, FileObject, Fcb, Ccb );
|
||||
//TODO: Actually update dirent
|
||||
}
|
||||
|
||||
if ((Fcb->UncleanCount == 1) &&
|
||||
(FatNodeType(Fcb) == FAT_NTC_DCB) &&
|
||||
(FlagOn(Fcb->State, FCB_STATE_DELETE_ON_CLOSE)) &&
|
||||
(Fcb->Condition != FcbBad) &&
|
||||
!FlagOn(Vcb->State, VCB_STATE_FLAG_WRITE_PROTECTED))
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/* Decrement unclean counter */
|
||||
ASSERT(Fcb->UncleanCount != 0);
|
||||
Fcb->UncleanCount--;
|
||||
break;
|
||||
|
||||
case UserFileOpen:
|
||||
DPRINT("Cleanup UserFileOpen\n");
|
||||
|
||||
ShareAccess = &Fcb->ShareAccess;
|
||||
|
||||
/* Should it be a delayed close? */
|
||||
if ((FileObject->SectionObjectPointer->DataSectionObject == NULL) &&
|
||||
(FileObject->SectionObjectPointer->ImageSectionObject == NULL) &&
|
||||
(Fcb->UncleanCount == 1) &&
|
||||
(Fcb->OpenCount == 1) &&
|
||||
!FlagOn(Fcb->State, FCB_STATE_DELETE_ON_CLOSE) &&
|
||||
Fcb->Condition == FcbGood)
|
||||
{
|
||||
/* Yes, a delayed one */
|
||||
SetFlag(Fcb->State, FCB_STATE_DELAY_CLOSE);
|
||||
}
|
||||
|
||||
/* Unlock all file locks */
|
||||
FsRtlFastUnlockAll(&Fcb->Fcb.Lock,
|
||||
FileObject,
|
||||
IoGetRequestorProcess(Irp),
|
||||
NULL);
|
||||
|
||||
if (Vcb->Condition == VcbGood)
|
||||
{
|
||||
if (Fcb->Condition != FcbBad)
|
||||
{
|
||||
//FatUpdateDirentFromFcb( IrpContext, FileObject, Fcb, Ccb );
|
||||
// TODO: Update on-disk structures
|
||||
}
|
||||
|
||||
if (Fcb->UncleanCount == 1 &&
|
||||
Fcb->Condition != FcbBad)
|
||||
{
|
||||
//DELETE_CONTEXT DeleteContext;
|
||||
|
||||
/* Should this file be deleted on close? */
|
||||
if (FlagOn(Fcb->State, FCB_STATE_DELETE_ON_CLOSE) &&
|
||||
!FlagOn(Vcb->State, VCB_STATE_FLAG_WRITE_PROTECTED))
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!FlagOn(Fcb->State, FCB_STATE_PAGEFILE) &&
|
||||
(Fcb->Header.ValidDataLength.LowPart < Fcb->Header.FileSize.LowPart))
|
||||
{
|
||||
#if 0
|
||||
ULONG ValidDataLength;
|
||||
|
||||
ValidDataLength = Fcb->Header.ValidDataLength.LowPart;
|
||||
|
||||
if (ValidDataLength < Fcb->ValidDataToDisk) {
|
||||
ValidDataLength = Fcb->ValidDataToDisk;
|
||||
}
|
||||
|
||||
if (ValidDataLength < Fcb->Header.FileSize.LowPart)
|
||||
{
|
||||
FatZeroData( IrpContext,
|
||||
Vcb,
|
||||
FileObject,
|
||||
ValidDataLength,
|
||||
Fcb->Header.FileSize.LowPart -
|
||||
ValidDataLength );
|
||||
|
||||
Fcb->ValidDataToDisk =
|
||||
Fcb->Header.ValidDataLength.LowPart =
|
||||
Fcb->Header.FileSize.LowPart;
|
||||
|
||||
if (CcIsFileCached(FileObject))
|
||||
{
|
||||
CcSetFileSizes(FileObject, (PCC_FILE_SIZES)&Fcb->Header.AllocationSize);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
DPRINT1("Zeroing out data is not implemented\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Should the file be truncated on close? */
|
||||
if (FlagOn(Fcb->State, FCB_STATE_TRUNCATE_ON_CLOSE))
|
||||
{
|
||||
if (Vcb->Condition == VcbGood)
|
||||
{
|
||||
// TODO: Actually truncate the file allocation
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/* Remove truncation flag */
|
||||
Fcb->State &= ~FCB_STATE_TRUNCATE_ON_CLOSE;
|
||||
}
|
||||
|
||||
/* Check again if it should be deleted */
|
||||
if (FlagOn(Fcb->State, FCB_STATE_DELETE_ON_CLOSE) &&
|
||||
Fcb->Header.AllocationSize.LowPart == 0)
|
||||
{
|
||||
FatNotifyReportChange(IrpContext,
|
||||
Vcb,
|
||||
Fcb,
|
||||
FILE_NOTIFY_CHANGE_FILE_NAME,
|
||||
FILE_ACTION_REMOVED);
|
||||
}
|
||||
|
||||
/* Remove the entry from the splay table if the file was deleted */
|
||||
if (FlagOn(Fcb->State, FCB_STATE_DELETE_ON_CLOSE))
|
||||
{
|
||||
FatRemoveNames(IrpContext, Fcb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ASSERT(Fcb->UncleanCount != 0);
|
||||
Fcb->UncleanCount--;
|
||||
if (!FlagOn(FileObject->Flags, FO_CACHE_SUPPORTED))
|
||||
{
|
||||
ASSERT(Fcb->NonCachedUncleanCount != 0);
|
||||
Fcb->NonCachedUncleanCount--;
|
||||
}
|
||||
|
||||
if (FlagOn(FileObject->Flags, FO_CACHE_SUPPORTED) &&
|
||||
(Fcb->NonCachedUncleanCount != 0) &&
|
||||
(Fcb->NonCachedUncleanCount == Fcb->UncleanCount) &&
|
||||
(Fcb->SectionObjectPointers.DataSectionObject != NULL))
|
||||
{
|
||||
CcFlushCache(&Fcb->SectionObjectPointers, NULL, 0, NULL);
|
||||
|
||||
/* Acquire and release PagingIo to get in sync with lazy writer */
|
||||
ExAcquireResourceExclusiveLite(Fcb->Header.PagingIoResource, TRUE);
|
||||
ExReleaseResourceLite(Fcb->Header.PagingIoResource);
|
||||
|
||||
CcPurgeCacheSection(&Fcb->SectionObjectPointers,
|
||||
NULL,
|
||||
0,
|
||||
FALSE);
|
||||
}
|
||||
|
||||
if (Fcb->Condition == FcbBad)
|
||||
{
|
||||
//TruncateSize = &FatLargeZero;
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/* Cleanup the cache map */
|
||||
CcUninitializeCacheMap(FileObject, TruncateSize, NULL);
|
||||
break;
|
||||
|
||||
default:
|
||||
KeBugCheckEx(FAT_FILE_SYSTEM, __LINE__, (ULONG_PTR)TypeOfOpen, 0, 0);
|
||||
}
|
||||
|
||||
/* Cleanup the share access */
|
||||
|
||||
if (ShareAccess)
|
||||
{
|
||||
DPRINT("Cleaning up the share access\n");
|
||||
IoRemoveShareAccess(FileObject, ShareAccess);
|
||||
}
|
||||
|
||||
if (TypeOfOpen == UserFileOpen)
|
||||
{
|
||||
/* Update oplocks */
|
||||
FsRtlCheckOplock(&Fcb->Fcb.Oplock,
|
||||
Irp,
|
||||
IrpContext,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
Fcb->Header.IsFastIoPossible = FatIsFastIoPossible(Fcb);
|
||||
}
|
||||
|
||||
/* Set the FO_CLEANUP_COMPLETE flag */
|
||||
SetFlag(FileObject->Flags, FO_CLEANUP_COMPLETE);
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
|
||||
// TODO: Unpin repinned BCBs
|
||||
//FatUnpinRepinnedBcbs(IrpContext);
|
||||
|
||||
/* Flush the volume if necessary */
|
||||
if (FlagOn(Vcb->State, VCB_STATE_FLAG_DEFERRED_FLUSH) &&
|
||||
!FlagOn(Vcb->State, VCB_STATE_FLAG_WRITE_PROTECTED))
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/* Cleanup */
|
||||
if (AcquiredFcb) FatReleaseFcb(IrpContext, Fcb);
|
||||
if (AcquiredVcb) FatReleaseVcb(IrpContext, Vcb);
|
||||
|
||||
/* Send volume notification */
|
||||
if (SendUnlockNotification)
|
||||
FsRtlNotifyVolumeEvent(FileObject, FSRTL_VOLUME_UNLOCK);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatCleanup(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||
{
|
||||
DPRINT1("FatCleanup(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
|
||||
PFAT_IRP_CONTEXT IrpContext;
|
||||
NTSTATUS Status;
|
||||
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
DPRINT("FatCleanup(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
|
||||
|
||||
/* FatCleanup works only with a volume device object */
|
||||
if (DeviceObject == FatGlobalData.DiskDeviceObject)
|
||||
{
|
||||
/* Complete the request and return success */
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
Irp->IoStatus.Information = FILE_OPENED;
|
||||
|
||||
IoCompleteRequest(Irp, IO_DISK_INCREMENT);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* Enter FsRtl critical region */
|
||||
FsRtlEnterFileSystem();
|
||||
|
||||
/* Build an irp context */
|
||||
IrpContext = FatBuildIrpContext(Irp, TRUE);
|
||||
|
||||
/* Call internal function */
|
||||
Status = FatiCleanup(IrpContext, Irp);
|
||||
|
||||
/* Leave FsRtl critical region */
|
||||
FsRtlExitFileSystem();
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
||||
@@ -11,15 +11,641 @@
|
||||
#define NDEBUG
|
||||
#include "fastfat.h"
|
||||
|
||||
VOID NTAPI
|
||||
FatQueueClose(IN PCLOSE_CONTEXT CloseContext,
|
||||
IN BOOLEAN DelayClose);
|
||||
|
||||
PCLOSE_CONTEXT NTAPI
|
||||
FatRemoveClose(PVCB Vcb OPTIONAL,
|
||||
PVCB LastVcbHint OPTIONAL);
|
||||
|
||||
const ULONG FatMaxDelayedCloseCount = 16;
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatiCommonClose(IN PVCB Vcb,
|
||||
IN PFCB Fcb,
|
||||
IN PCCB Ccb,
|
||||
IN TYPE_OF_OPEN TypeOfOpen,
|
||||
IN BOOLEAN Wait,
|
||||
OUT PBOOLEAN VcbDeleted)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PFCB ParentDcb;
|
||||
BOOLEAN RecursiveClose, VcbDeletedLv = FALSE;
|
||||
FAT_IRP_CONTEXT IrpContext;
|
||||
|
||||
if (VcbDeleted) *VcbDeleted = FALSE;
|
||||
|
||||
if (TypeOfOpen == UnopenedFileObject)
|
||||
{
|
||||
DPRINT1("Closing unopened file object\n");
|
||||
Status = STATUS_SUCCESS;
|
||||
return Status;
|
||||
}
|
||||
|
||||
RtlZeroMemory(&IrpContext, sizeof(FAT_IRP_CONTEXT));
|
||||
|
||||
IrpContext.NodeTypeCode = FAT_NTC_IRP_CONTEXT;
|
||||
IrpContext.NodeByteSize = sizeof(IrpContext);
|
||||
IrpContext.MajorFunction = IRP_MJ_CLOSE;
|
||||
|
||||
if (Wait) SetFlag(IrpContext.Flags, IRPCONTEXT_CANWAIT);
|
||||
|
||||
if (!ExAcquireResourceExclusiveLite(&Vcb->Resource, Wait)) return STATUS_PENDING;
|
||||
|
||||
if (Vcb->State & VCB_STATE_FLAG_CLOSE_IN_PROGRESS)
|
||||
{
|
||||
RecursiveClose = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetFlag(Vcb->State, VCB_STATE_FLAG_CLOSE_IN_PROGRESS);
|
||||
RecursiveClose = FALSE;
|
||||
|
||||
Vcb->OpenFileCount++;
|
||||
}
|
||||
|
||||
/* Update on-disk structures */
|
||||
switch (TypeOfOpen)
|
||||
{
|
||||
case VirtualVolumeFile:
|
||||
DPRINT1("Close VirtualVolumeFile\n");
|
||||
|
||||
InterlockedDecrement((PLONG)&(Vcb->InternalOpenCount));
|
||||
InterlockedDecrement((PLONG)&(Vcb->ResidualOpenCount));
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
goto close_done;
|
||||
break;
|
||||
|
||||
case UserVolumeOpen:
|
||||
DPRINT1("Close UserVolumeOpen\n");
|
||||
|
||||
Vcb->DirectAccessOpenCount--;
|
||||
Vcb->OpenFileCount--;
|
||||
if (FlagOn(Ccb->Flags, CCB_READ_ONLY)) Vcb->ReadOnlyCount--;
|
||||
|
||||
FatDeleteCcb(&IrpContext, Ccb);
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
goto close_done;
|
||||
break;
|
||||
|
||||
case EaFile:
|
||||
UNIMPLEMENTED;
|
||||
break;
|
||||
|
||||
case DirectoryFile:
|
||||
DPRINT1("Close DirectoryFile\n");
|
||||
|
||||
InterlockedDecrement((PLONG)&(Fcb->Dcb.DirectoryFileOpenCount));
|
||||
InterlockedDecrement((PLONG)&(Vcb->InternalOpenCount));
|
||||
|
||||
if (FatNodeType(Fcb) == FAT_NTC_ROOT_DCB)
|
||||
{
|
||||
InterlockedDecrement((PLONG)&(Vcb->ResidualOpenCount));
|
||||
}
|
||||
|
||||
if (RecursiveClose)
|
||||
{
|
||||
Status = STATUS_SUCCESS;
|
||||
goto close_done;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case UserDirectoryOpen:
|
||||
case UserFileOpen:
|
||||
DPRINT("Close UserFileOpen/UserDirectoryOpen\n");
|
||||
|
||||
if ((FatNodeType(Fcb) == FAT_NTC_DCB) &&
|
||||
IsListEmpty(&Fcb->Dcb.ParentDcbList) &&
|
||||
(Fcb->OpenCount == 1) &&
|
||||
(Fcb->Dcb.DirectoryFile != NULL))
|
||||
{
|
||||
PFILE_OBJECT DirectoryFileObject = Fcb->Dcb.DirectoryFile;
|
||||
|
||||
DPRINT1("Uninitialize the stream file object\n");
|
||||
|
||||
CcUninitializeCacheMap(DirectoryFileObject, NULL, NULL);
|
||||
|
||||
Fcb->Dcb.DirectoryFile = NULL;
|
||||
ObDereferenceObject(DirectoryFileObject);
|
||||
}
|
||||
|
||||
Fcb->OpenCount--;
|
||||
Vcb->OpenFileCount--;
|
||||
if (FlagOn(Ccb->Flags, CCB_READ_ONLY)) Vcb->ReadOnlyCount --;
|
||||
|
||||
FatDeleteCcb(&IrpContext, Ccb);
|
||||
break;
|
||||
|
||||
default:
|
||||
KeBugCheckEx(FAT_FILE_SYSTEM, __LINE__, (ULONG_PTR)TypeOfOpen, 0, 0);
|
||||
}
|
||||
|
||||
/* Update in-memory structures */
|
||||
if (((FatNodeType(Fcb) == FAT_NTC_FCB) &&
|
||||
(Fcb->OpenCount == 0))
|
||||
||
|
||||
((FatNodeType(Fcb) == FAT_NTC_DCB) &&
|
||||
(IsListEmpty(&Fcb->Dcb.ParentDcbList)) &&
|
||||
(Fcb->OpenCount == 0) &&
|
||||
(Fcb->Dcb.DirectoryFileOpenCount == 0)))
|
||||
{
|
||||
ParentDcb = Fcb->ParentFcb;
|
||||
|
||||
SetFlag(Vcb->State, VCB_STATE_FLAG_DELETED_FCB);
|
||||
|
||||
FatDeleteFcb(&IrpContext, Fcb);
|
||||
|
||||
while ((FatNodeType(ParentDcb) == FAT_NTC_DCB) &&
|
||||
IsListEmpty(&ParentDcb->Dcb.ParentDcbList) &&
|
||||
(ParentDcb->OpenCount == 0) &&
|
||||
(ParentDcb->Dcb.DirectoryFile != NULL))
|
||||
{
|
||||
PFILE_OBJECT DirectoryFileObject;
|
||||
|
||||
DirectoryFileObject = ParentDcb->Dcb.DirectoryFile;
|
||||
|
||||
DPRINT1("Uninitialize parent Stream Cache Map\n");
|
||||
|
||||
CcUninitializeCacheMap(DirectoryFileObject, NULL, NULL);
|
||||
|
||||
ParentDcb->Dcb.DirectoryFile = NULL;
|
||||
|
||||
ObDereferenceObject(DirectoryFileObject);
|
||||
|
||||
if (ParentDcb->Dcb.DirectoryFileOpenCount == 0)
|
||||
{
|
||||
PFCB CurrentDcb;
|
||||
|
||||
CurrentDcb = ParentDcb;
|
||||
ParentDcb = CurrentDcb->ParentFcb;
|
||||
|
||||
SetFlag(Vcb->State, VCB_STATE_FLAG_DELETED_FCB);
|
||||
|
||||
FatDeleteFcb(&IrpContext, CurrentDcb);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
|
||||
close_done:
|
||||
/* Closing is done, check if VCB could be closed too */
|
||||
if (!RecursiveClose)
|
||||
{
|
||||
/* One open left - yes, VCB can go away */
|
||||
if (Vcb->OpenFileCount == 1 &&
|
||||
!FlagOn(Vcb->State, VCB_STATE_FLAG_DISMOUNT_IN_PROGRESS)
|
||||
&& VcbDeleted)
|
||||
{
|
||||
FatReleaseVcb(&IrpContext, Vcb );
|
||||
|
||||
SetFlag(IrpContext.Flags, IRPCONTEXT_CANWAIT);
|
||||
|
||||
FatAcquireExclusiveGlobal(&IrpContext);
|
||||
|
||||
FatAcquireExclusiveVcb(&IrpContext, Vcb);
|
||||
|
||||
Vcb->OpenFileCount--;
|
||||
|
||||
VcbDeletedLv = FatCheckForDismount(&IrpContext, Vcb, FALSE);
|
||||
|
||||
FatReleaseGlobal(&IrpContext);
|
||||
|
||||
if (VcbDeleted) *VcbDeleted = VcbDeletedLv;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Remove extra referenec */
|
||||
Vcb->OpenFileCount --;
|
||||
}
|
||||
|
||||
/* Clear recursion flag if necessary */
|
||||
if (!VcbDeletedLv)
|
||||
{
|
||||
ClearFlag(Vcb->State, VCB_STATE_FLAG_CLOSE_IN_PROGRESS);
|
||||
}
|
||||
}
|
||||
|
||||
/* Release VCB if it wasn't deleted */
|
||||
if (!VcbDeletedLv)
|
||||
FatReleaseVcb(&IrpContext, Vcb);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatiClose(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
PIO_STACK_LOCATION IrpSp;
|
||||
TYPE_OF_OPEN TypeOfOpen;
|
||||
PVCB Vcb;
|
||||
PFCB Fcb;
|
||||
PCCB Ccb;
|
||||
BOOLEAN TopLevel, Wait, VcbDeleted = FALSE, DelayedClose = FALSE;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
PCLOSE_CONTEXT CloseContext = NULL;
|
||||
|
||||
TopLevel = FatIsTopLevelIrp(Irp);
|
||||
|
||||
/* Get current IRP stack location */
|
||||
IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
/* Decode incoming file object */
|
||||
TypeOfOpen = FatDecodeFileObject(IrpSp->FileObject, &Vcb, &Fcb, &Ccb);
|
||||
|
||||
/* Set CCB read only flag */
|
||||
if (Ccb && IsFileObjectReadOnly(IrpSp->FileObject))
|
||||
SetFlag(Ccb->Flags, CCB_READ_ONLY);
|
||||
|
||||
/* It's possible to wait only if we are top level or not a system process */
|
||||
Wait = TopLevel && (PsGetCurrentProcess() != FatGlobalData.SystemProcess);
|
||||
|
||||
/* Determine if it's a delayed close, by flags first */
|
||||
if ((TypeOfOpen == UserFileOpen || TypeOfOpen == UserDirectoryOpen) &&
|
||||
(Fcb->State & FCB_STATE_DELAY_CLOSE) &&
|
||||
!FatGlobalData.ShutdownStarted)
|
||||
{
|
||||
DelayedClose = TRUE;
|
||||
}
|
||||
|
||||
/* If close is not delayed, try to perform the close operation */
|
||||
if (!DelayedClose)
|
||||
Status = FatiCommonClose(Vcb, Fcb, Ccb, TypeOfOpen, Wait, &VcbDeleted);
|
||||
|
||||
/* We have to delay close if either it's defined by a flag or it was not possible
|
||||
to perform it synchronously */
|
||||
if (DelayedClose || Status == STATUS_PENDING)
|
||||
{
|
||||
DPRINT1("Queuing a pending close, Vcb %p, Fcb %p, Ccb %p\n", Vcb, Fcb, Ccb);
|
||||
|
||||
/* Check if a close context should be allocated */
|
||||
if (TypeOfOpen == VirtualVolumeFile)
|
||||
{
|
||||
ASSERT(Vcb->CloseContext != NULL);
|
||||
CloseContext = Vcb->CloseContext;
|
||||
Vcb->CloseContext = NULL;
|
||||
CloseContext->Free = TRUE;
|
||||
}
|
||||
else if (TypeOfOpen == DirectoryFile ||
|
||||
TypeOfOpen == EaFile)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
//CloseContext = FatAllocateCloseContext(Vcb);
|
||||
//ASSERT(CloseContext != NULL);
|
||||
CloseContext->Free = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
//TODO: FatDeallocateCcbStrings( Ccb );
|
||||
|
||||
/* Set CloseContext to a buffer inside Ccb */
|
||||
CloseContext = &Ccb->CloseContext;
|
||||
CloseContext->Free = FALSE;
|
||||
SetFlag(Ccb->Flags, CCB_CLOSE_CONTEXT);
|
||||
}
|
||||
|
||||
/* Save all info in the close context */
|
||||
CloseContext->Vcb = Vcb;
|
||||
CloseContext->Fcb = Fcb;
|
||||
CloseContext->TypeOfOpen = TypeOfOpen;
|
||||
|
||||
/* Queue the close */
|
||||
FatQueueClose(CloseContext, (BOOLEAN)(Fcb && FlagOn(Fcb->State, FCB_STATE_DELAY_CLOSE)));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Close finished right away */
|
||||
if (TypeOfOpen == VirtualVolumeFile ||
|
||||
TypeOfOpen == DirectoryFile ||
|
||||
TypeOfOpen == EaFile)
|
||||
{
|
||||
if (TypeOfOpen == VirtualVolumeFile)
|
||||
{
|
||||
/* Free close context for the not deleted VCB */
|
||||
if (!VcbDeleted)
|
||||
{
|
||||
CloseContext = Vcb->CloseContext;
|
||||
Vcb->CloseContext = NULL;
|
||||
|
||||
ASSERT(CloseContext != NULL);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//CloseContext = FatAllocateCloseContext(Vcb);
|
||||
DPRINT1("TODO: Allocate close context!\n");
|
||||
ASSERT(CloseContext != NULL);
|
||||
}
|
||||
|
||||
/* Free close context */
|
||||
if (CloseContext) ExFreePool(CloseContext);
|
||||
}
|
||||
}
|
||||
|
||||
/* Complete the request */
|
||||
FatCompleteRequest(NULL, Irp, Status);
|
||||
|
||||
/* Reset the top level IRP if necessary */
|
||||
if (TopLevel) IoSetTopLevelIrp(NULL);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatClose(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||
{
|
||||
DPRINT1("FatClose(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
|
||||
PFAT_IRP_CONTEXT IrpContext;
|
||||
NTSTATUS Status;
|
||||
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
DPRINT("FatClose(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
|
||||
|
||||
/* FatClose works only with a volume device object */
|
||||
if (DeviceObject == FatGlobalData.DiskDeviceObject)
|
||||
{
|
||||
/* Complete the request and return success */
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
Irp->IoStatus.Information = FILE_OPENED;
|
||||
|
||||
IoCompleteRequest(Irp, IO_DISK_INCREMENT);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* Enter FsRtl critical region */
|
||||
FsRtlEnterFileSystem();
|
||||
|
||||
/* Build an irp context */
|
||||
IrpContext = FatBuildIrpContext(Irp, TRUE);
|
||||
|
||||
/* Call internal function */
|
||||
Status = FatiClose(IrpContext, Irp);
|
||||
|
||||
/* Leave FsRtl critical region */
|
||||
FsRtlExitFileSystem();
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
FatPendingClose(IN PVCB Vcb OPTIONAL)
|
||||
{
|
||||
PCLOSE_CONTEXT CloseContext;
|
||||
PVCB CurrentVcb = NULL;
|
||||
PVCB LastVcb = NULL;
|
||||
BOOLEAN FreeContext;
|
||||
ULONG Loops = 0;
|
||||
|
||||
/* Do the top-level IRP trick */
|
||||
if (!Vcb) IoSetTopLevelIrp((PIRP)FSRTL_FSP_TOP_LEVEL_IRP);
|
||||
|
||||
while ((CloseContext = FatRemoveClose(Vcb, LastVcb)))
|
||||
{
|
||||
if (!Vcb)
|
||||
{
|
||||
if (!FatGlobalData.ShutdownStarted)
|
||||
{
|
||||
if (CloseContext->Vcb != CurrentVcb)
|
||||
{
|
||||
Loops = 0;
|
||||
|
||||
/* Release previous VCB */
|
||||
if (CurrentVcb)
|
||||
ExReleaseResourceLite(&CurrentVcb->Resource);
|
||||
|
||||
/* Lock the new VCB */
|
||||
CurrentVcb = CloseContext->Vcb;
|
||||
(VOID)ExAcquireResourceExclusiveLite(&CurrentVcb->Resource, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Try to lock */
|
||||
if (++Loops >= 20)
|
||||
{
|
||||
if (ExGetSharedWaiterCount(&CurrentVcb->Resource) +
|
||||
ExGetExclusiveWaiterCount(&CurrentVcb->Resource))
|
||||
{
|
||||
ExReleaseResourceLite(&CurrentVcb->Resource);
|
||||
(VOID)ExAcquireResourceExclusiveLite(&CurrentVcb->Resource, TRUE);
|
||||
}
|
||||
|
||||
Loops = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check open count */
|
||||
if (CurrentVcb->OpenFileCount <= 1)
|
||||
{
|
||||
ExReleaseResourceLite(&CurrentVcb->Resource);
|
||||
CurrentVcb = NULL;
|
||||
}
|
||||
}
|
||||
else if (CurrentVcb)
|
||||
{
|
||||
ExReleaseResourceLite(&CurrentVcb->Resource);
|
||||
CurrentVcb = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
LastVcb = CurrentVcb;
|
||||
|
||||
/* Remember if we should free the context */
|
||||
FreeContext = CloseContext->Free;
|
||||
|
||||
FatiCommonClose(CloseContext->Vcb,
|
||||
CloseContext->Fcb,
|
||||
(FreeContext ? NULL : CONTAINING_RECORD(CloseContext, CCB, CloseContext)),
|
||||
CloseContext->TypeOfOpen,
|
||||
TRUE,
|
||||
NULL);
|
||||
|
||||
/* Free context if necessary */
|
||||
if (FreeContext) ExFreePool(CloseContext);
|
||||
}
|
||||
|
||||
/* Release VCB if necessary */
|
||||
if (CurrentVcb) ExReleaseResourceLite(&CurrentVcb->Resource);
|
||||
|
||||
/* Reset top level IRP */
|
||||
if (!Vcb) IoSetTopLevelIrp( NULL );
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
FatCloseWorker(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PVOID Context)
|
||||
{
|
||||
FsRtlEnterFileSystem();
|
||||
|
||||
FatPendingClose((PVCB)Context);
|
||||
|
||||
FsRtlExitFileSystem();
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
FatQueueClose(IN PCLOSE_CONTEXT CloseContext,
|
||||
IN BOOLEAN DelayClose)
|
||||
{
|
||||
BOOLEAN RunWorker = FALSE;
|
||||
|
||||
/* Acquire the close lists mutex */
|
||||
ExAcquireFastMutexUnsafe(&FatCloseQueueMutex);
|
||||
|
||||
/* Add it to the desired list */
|
||||
if (DelayClose)
|
||||
{
|
||||
InsertTailList(&FatGlobalData.DelayedCloseList,
|
||||
&CloseContext->GlobalLinks);
|
||||
InsertTailList(&CloseContext->Vcb->DelayedCloseList,
|
||||
&CloseContext->VcbLinks);
|
||||
|
||||
FatGlobalData.DelayedCloseCount++;
|
||||
|
||||
if (FatGlobalData.DelayedCloseCount > FatMaxDelayedCloseCount &&
|
||||
!FatGlobalData.AsyncCloseActive)
|
||||
{
|
||||
FatGlobalData.AsyncCloseActive = TRUE;
|
||||
RunWorker = TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
InsertTailList(&FatGlobalData.AsyncCloseList,
|
||||
&CloseContext->GlobalLinks);
|
||||
InsertTailList(&CloseContext->Vcb->AsyncCloseList,
|
||||
&CloseContext->VcbLinks);
|
||||
|
||||
FatGlobalData.AsyncCloseCount++;
|
||||
|
||||
if (!FatGlobalData.AsyncCloseActive)
|
||||
{
|
||||
FatGlobalData.AsyncCloseActive = TRUE;
|
||||
RunWorker = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Release the close lists mutex */
|
||||
ExReleaseFastMutexUnsafe(&FatCloseQueueMutex);
|
||||
|
||||
if (RunWorker)
|
||||
IoQueueWorkItem(FatGlobalData.FatCloseItem, FatCloseWorker, CriticalWorkQueue, NULL);
|
||||
}
|
||||
|
||||
PCLOSE_CONTEXT
|
||||
NTAPI
|
||||
FatRemoveClose(PVCB Vcb OPTIONAL,
|
||||
PVCB LastVcbHint OPTIONAL)
|
||||
{
|
||||
PLIST_ENTRY Entry;
|
||||
PCLOSE_CONTEXT CloseContext;
|
||||
BOOLEAN IsWorker = FALSE;
|
||||
|
||||
/* Acquire the close lists mutex */
|
||||
ExAcquireFastMutexUnsafe(&FatCloseQueueMutex);
|
||||
|
||||
if (!Vcb) IsWorker = TRUE;
|
||||
|
||||
if (Vcb == NULL && LastVcbHint != NULL)
|
||||
{
|
||||
// TODO: A very special case of overflowing the queue
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/* Usual processing from a worker thread */
|
||||
if (!Vcb)
|
||||
{
|
||||
TryToCloseAgain:
|
||||
|
||||
/* Is there anything in the async close list */
|
||||
if (!IsListEmpty(&FatGlobalData.AsyncCloseList))
|
||||
{
|
||||
Entry = RemoveHeadList(&FatGlobalData.AsyncCloseList);
|
||||
FatGlobalData.AsyncCloseCount--;
|
||||
|
||||
CloseContext = CONTAINING_RECORD(Entry,
|
||||
CLOSE_CONTEXT,
|
||||
GlobalLinks);
|
||||
|
||||
RemoveEntryList(&CloseContext->VcbLinks);
|
||||
} else if (!IsListEmpty(&FatGlobalData.DelayedCloseList) &&
|
||||
(FatGlobalData.DelayedCloseCount > FatMaxDelayedCloseCount/2 ||
|
||||
FatGlobalData.ShutdownStarted))
|
||||
{
|
||||
/* In case of a shutdown or when delayed queue is filled at half - perform closing */
|
||||
Entry = RemoveHeadList(&FatGlobalData.DelayedCloseList);
|
||||
FatGlobalData.DelayedCloseCount--;
|
||||
|
||||
CloseContext = CONTAINING_RECORD(Entry,
|
||||
CLOSE_CONTEXT,
|
||||
GlobalLinks);
|
||||
RemoveEntryList(&CloseContext->VcbLinks);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Nothing to close */
|
||||
CloseContext = NULL;
|
||||
if (IsWorker) FatGlobalData.AsyncCloseActive = FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!IsListEmpty(&Vcb->AsyncCloseList))
|
||||
{
|
||||
/* Is there anything in the async close list */
|
||||
Entry = RemoveHeadList(&Vcb->AsyncCloseList);
|
||||
FatGlobalData.AsyncCloseCount--;
|
||||
|
||||
CloseContext = CONTAINING_RECORD(Entry,
|
||||
CLOSE_CONTEXT,
|
||||
VcbLinks);
|
||||
|
||||
RemoveEntryList(&CloseContext->GlobalLinks);
|
||||
}
|
||||
else if (!IsListEmpty(&Vcb->DelayedCloseList))
|
||||
{
|
||||
/* Process delayed close list */
|
||||
Entry = RemoveHeadList(&Vcb->DelayedCloseList);
|
||||
FatGlobalData.DelayedCloseCount--;
|
||||
|
||||
CloseContext = CONTAINING_RECORD(Entry,
|
||||
CLOSE_CONTEXT,
|
||||
VcbLinks);
|
||||
|
||||
RemoveEntryList(&CloseContext->GlobalLinks);
|
||||
}
|
||||
else if (LastVcbHint)
|
||||
{
|
||||
/* Try again */
|
||||
goto TryToCloseAgain;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Nothing to close */
|
||||
CloseContext = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Release the close lists mutex */
|
||||
ExReleaseFastMutexUnsafe(&FatCloseQueueMutex);
|
||||
|
||||
return CloseContext;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
||||
@@ -72,7 +72,9 @@ FatiOpenRootDcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
|
||||
/* Increment counters */
|
||||
Dcb->OpenCount++;
|
||||
Dcb->UncleanCount++;
|
||||
Vcb->OpenFileCount++;
|
||||
if (IsFileObjectReadOnly(FileObject)) Vcb->ReadOnlyCount++;
|
||||
|
||||
/* Set success statuses */
|
||||
Iosb.Status = STATUS_SUCCESS;
|
||||
@@ -186,7 +188,7 @@ FatiOverwriteFile(PFAT_IRP_CONTEXT IrpContext,
|
||||
CcSetFileSizes(FileObject, (PCC_FILE_SIZES)&Fcb->Header.AllocationSize);
|
||||
|
||||
// TODO: Actually truncate the file
|
||||
DPRINT1("TODO: Actually truncate the file with a fullfat handle %x\n", Fcb->FatHandle);
|
||||
DPRINT1("TODO: Actually truncate file '%wZ' with a fullfat handle %x\n", &Fcb->FullFileName, Fcb->FatHandle);
|
||||
|
||||
/* Release the paging resource */
|
||||
ExReleaseResourceLite(Fcb->Header.PagingIoResource);
|
||||
@@ -288,6 +290,12 @@ FatiOpenExistingDir(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
Fcb,
|
||||
FatCreateCcb());
|
||||
|
||||
/* Increase counters */
|
||||
Fcb->UncleanCount++;
|
||||
Fcb->OpenCount++;
|
||||
Vcb->OpenFileCount++;
|
||||
if (IsFileObjectReadOnly(FileObject)) Vcb->ReadOnlyCount++;
|
||||
|
||||
Iosb.Status = STATUS_SUCCESS;
|
||||
Iosb.Information = FILE_OPENED;
|
||||
|
||||
@@ -319,6 +327,7 @@ FatiOpenExistingFile(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
PFCB Fcb;
|
||||
NTSTATUS Status;
|
||||
FF_FILE *FileHandle;
|
||||
FF_ERROR FfError;
|
||||
|
||||
/* Check for create file option and fail */
|
||||
if (CreateDisposition == FILE_CREATE)
|
||||
@@ -341,20 +350,22 @@ FatiOpenExistingFile(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
}
|
||||
|
||||
/* Open the file with FullFAT */
|
||||
FileHandle = FF_Open(Vcb->Ioman, AnsiName.Buffer, FF_MODE_READ, NULL);
|
||||
FileHandle = FF_Open(Vcb->Ioman, AnsiName.Buffer, FF_MODE_READ, &FfError);
|
||||
|
||||
if (!FileHandle)
|
||||
{
|
||||
DPRINT1("Failed to open file '%s', error %ld\n", AnsiName.Buffer, FfError);
|
||||
Iosb.Status = STATUS_OBJECT_NAME_NOT_FOUND; // FIXME: A shortcut for now
|
||||
return Iosb;
|
||||
}
|
||||
DPRINT1("Succeeded opening file '%s'\n", AnsiName.Buffer);
|
||||
|
||||
/* Create a new FCB for this file */
|
||||
Fcb = FatCreateFcb(IrpContext, Vcb, ParentDcb, FileHandle);
|
||||
|
||||
// TODO: Check if overwrite is needed
|
||||
|
||||
// This is usual file open branch, without overwriting!
|
||||
// TODO: This is usual file open branch, without overwriting!
|
||||
/* Set context and section object pointers */
|
||||
FatSetFileObject(FileObject,
|
||||
UserFileOpen,
|
||||
@@ -365,6 +376,13 @@ FatiOpenExistingFile(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
Iosb.Status = STATUS_SUCCESS;
|
||||
Iosb.Information = FILE_OPENED;
|
||||
|
||||
|
||||
/* Increase counters */
|
||||
Fcb->UncleanCount++;
|
||||
Fcb->OpenCount++;
|
||||
if (FlagOn(FileObject->Flags, FO_NO_INTERMEDIATE_BUFFERING)) Fcb->NonCachedUncleanCount++;
|
||||
if (IsFileObjectReadOnly(FileObject)) Vcb->ReadOnlyCount++;
|
||||
|
||||
return Iosb;
|
||||
}
|
||||
|
||||
@@ -397,7 +415,7 @@ FatiOpenVolume(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
// and opened handles count is not 0
|
||||
//if (!FlagOn(ShareAccess, FILE_SHARE_READ)
|
||||
|
||||
DPRINT1("Exclusive voume open\n");
|
||||
DPRINT1("Exclusive volume open\n");
|
||||
|
||||
// TODO: Flush the volume
|
||||
VolumeFlushed = TRUE;
|
||||
@@ -450,6 +468,7 @@ FatiOpenVolume(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
/* Increase direct open count */
|
||||
Vcb->DirectOpenCount++;
|
||||
Vcb->OpenFileCount++;
|
||||
if (IsFileObjectReadOnly(FileObject)) Vcb->ReadOnlyCount++;
|
||||
|
||||
/* Set no buffering flag */
|
||||
FileObject->Flags |= FO_NO_INTERMEDIATE_BUFFERING;
|
||||
@@ -720,7 +739,7 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
/* Set parent DCB */
|
||||
ParentDcb = RelatedDcb;
|
||||
|
||||
DPRINT1("Opening file '%wZ' relatively to '%wZ'\n", &FileName, &ParentDcb->FullFileName);
|
||||
DPRINT("Opening file '%wZ' relatively to '%wZ'\n", &FileName, &ParentDcb->FullFileName);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1137,6 +1156,12 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
DeleteOnClose,
|
||||
OpenedAsDos);
|
||||
|
||||
/* In case of success set cache supported flag */
|
||||
if (NT_SUCCESS(Iosb.Status) && !NoIntermediateBuffering)
|
||||
{
|
||||
SetFlag(FileObject->Flags, FO_CACHE_SUPPORTED);
|
||||
}
|
||||
|
||||
Irp->IoStatus.Information = Iosb.Information;
|
||||
|
||||
/* Unlock VCB */
|
||||
|
||||
@@ -82,9 +82,6 @@ FatCreateRootDcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
ExInitializeFastMutex(&Dcb->HeaderMutex);
|
||||
FsRtlSetupAdvancedHeader(&Dcb->Header, &Dcb->HeaderMutex);
|
||||
|
||||
/* Initialize MCB */
|
||||
FsRtlInitializeLargeMcb(&Dcb->Mcb, NonPagedPool);
|
||||
|
||||
/* Set up first cluster field depending on FAT type */
|
||||
if (TRUE/*FatIsFat32(Vcb)*/)
|
||||
{
|
||||
@@ -114,13 +111,6 @@ FatCreateRootDcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
#endif
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/* Initialize free dirent bitmap */
|
||||
RtlInitializeBitMap(&Dcb->Dcb.FreeBitmap, NULL, 0);
|
||||
|
||||
/* Fill the dirent bitmap */
|
||||
DPRINT1("Filling the free dirent bitmap is missing\n");
|
||||
//FatCheckFreeDirentBitmap( IrpContext, Dcb );
|
||||
}
|
||||
|
||||
PFCB
|
||||
@@ -191,9 +181,98 @@ FatiOpenExistingDcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
IN BOOLEAN DeleteOnClose)
|
||||
{
|
||||
IO_STATUS_BLOCK Iosb = {{0}};
|
||||
PCCB Ccb;
|
||||
|
||||
Iosb.Status = STATUS_NOT_IMPLEMENTED;
|
||||
UNIMPLEMENTED;
|
||||
/* Exclusively lock this FCB */
|
||||
FatAcquireExclusiveFcb(IrpContext, Dcb);
|
||||
|
||||
/* Check if it's a delete-on-close of a root DCB */
|
||||
if (FatNodeType(Dcb) == FAT_NTC_ROOT_DCB && DeleteOnClose)
|
||||
{
|
||||
Iosb.Status = STATUS_CANNOT_DELETE;
|
||||
|
||||
/* Release the lock and return */
|
||||
FatReleaseFcb(IrpContext, Dcb);
|
||||
return Iosb;
|
||||
}
|
||||
|
||||
/*if (NoEaKnowledge && NodeType(Dcb) != FAT_NTC_ROOT_DCB &&
|
||||
!FatIsFat32(Vcb))
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}*/
|
||||
|
||||
/* Check the create disposition and desired access */
|
||||
if ((CreateDisposition != FILE_OPEN) &&
|
||||
(CreateDisposition != FILE_OPEN_IF))
|
||||
{
|
||||
Iosb.Status = STATUS_OBJECT_NAME_COLLISION;
|
||||
|
||||
/* Release the lock and return */
|
||||
FatReleaseFcb(IrpContext, Dcb);
|
||||
return Iosb;
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (!FatCheckFileAccess(IrpContext,
|
||||
Dcb->DirentFatFlags,
|
||||
DesiredAccess))
|
||||
{
|
||||
Iosb.Status = STATUS_ACCESS_DENIED;
|
||||
try_return( Iosb );
|
||||
}
|
||||
#endif
|
||||
|
||||
/* If it's already opened - check share access */
|
||||
if (Dcb->OpenCount > 0)
|
||||
{
|
||||
Iosb.Status = IoCheckShareAccess(*DesiredAccess,
|
||||
ShareAccess,
|
||||
FileObject,
|
||||
&Dcb->ShareAccess,
|
||||
TRUE);
|
||||
|
||||
if (!NT_SUCCESS(Iosb.Status))
|
||||
{
|
||||
/* Release the lock and return */
|
||||
FatReleaseFcb(IrpContext, Dcb);
|
||||
return Iosb;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
IoSetShareAccess(*DesiredAccess,
|
||||
ShareAccess,
|
||||
FileObject,
|
||||
&Dcb->ShareAccess);
|
||||
}
|
||||
|
||||
/* Set the file object */
|
||||
Ccb = FatCreateCcb(IrpContext);
|
||||
FatSetFileObject(FileObject,
|
||||
UserDirectoryOpen,
|
||||
Dcb,
|
||||
Ccb);
|
||||
|
||||
/* Increase counters */
|
||||
Dcb->UncleanCount++;
|
||||
Dcb->OpenCount++;
|
||||
Vcb->OpenFileCount++;
|
||||
if (IsFileObjectReadOnly(FileObject)) Vcb->ReadOnlyCount++;
|
||||
|
||||
/* Set delete on close */
|
||||
if (DeleteOnClose)
|
||||
SetFlag(Ccb->Flags, CCB_DELETE_ON_CLOSE);
|
||||
|
||||
/* Clear delay close flag */
|
||||
ClearFlag(Dcb->State, FCB_STATE_DELAY_CLOSE);
|
||||
|
||||
/* That's it */
|
||||
Iosb.Status = STATUS_SUCCESS;
|
||||
Iosb.Information = FILE_OPENED;
|
||||
|
||||
/* Release the lock */
|
||||
FatReleaseFcb(IrpContext, Dcb);
|
||||
|
||||
return Iosb;
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
/* GLOBALS ******************************************************************/
|
||||
|
||||
FAT_GLOBAL_DATA FatGlobalData;
|
||||
FAST_MUTEX FatCloseQueueMutex;
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
@@ -42,6 +43,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
|
||||
RtlZeroMemory(&FatGlobalData, sizeof(FAT_GLOBAL_DATA));
|
||||
FatGlobalData.DriverObject = DriverObject;
|
||||
FatGlobalData.DiskDeviceObject = DeviceObject;
|
||||
FatGlobalData.SystemProcess = PsGetCurrentProcess();
|
||||
|
||||
/* Fill major function handlers */
|
||||
DriverObject->MajorFunction[IRP_MJ_CLOSE] = FatClose;
|
||||
@@ -108,6 +110,12 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
|
||||
/* Initialize synchronization resource for the global data */
|
||||
ExInitializeResourceLite(&FatGlobalData.Resource);
|
||||
|
||||
/* Initialize queued close stuff */
|
||||
InitializeListHead(&FatGlobalData.AsyncCloseList);
|
||||
InitializeListHead(&FatGlobalData.DelayedCloseList);
|
||||
FatGlobalData.FatCloseItem = IoAllocateWorkItem(DeviceObject);
|
||||
ExInitializeFastMutex(&FatCloseQueueMutex);
|
||||
|
||||
/* Initialize global VCB list */
|
||||
InitializeListHead(&FatGlobalData.VcbListHead);
|
||||
|
||||
@@ -317,7 +325,7 @@ FatDecodeFileObject(IN PFILE_OBJECT FileObject,
|
||||
|
||||
TypeOfOpen = (*Ccb == NULL ? DirectoryFile : UserDirectoryOpen);
|
||||
|
||||
DPRINT1("Referencing a directory: %wZ\n", &(*FcbOrDcb)->FullFileName);
|
||||
DPRINT("Referencing a directory: %wZ\n", &(*FcbOrDcb)->FullFileName);
|
||||
break;
|
||||
|
||||
/* File */
|
||||
@@ -510,4 +518,45 @@ FatMapUserBuffer(PIRP Irp)
|
||||
return MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
FatIsTopLevelIrp(IN PIRP Irp)
|
||||
{
|
||||
if (!IoGetTopLevelIrp())
|
||||
{
|
||||
IoSetTopLevelIrp(Irp);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
FatNotifyReportChange(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
IN PVCB Vcb,
|
||||
IN PFCB Fcb,
|
||||
IN ULONG Filter,
|
||||
IN ULONG Action)
|
||||
{
|
||||
if (Fcb->FullFileName.Buffer == NULL)
|
||||
FatSetFullFileNameInFcb(IrpContext, Fcb);
|
||||
|
||||
ASSERT(Fcb->FullFileName.Length != 0 );
|
||||
ASSERT(Fcb->FileNameLength != 0 );
|
||||
ASSERT(Fcb->FullFileName.Length > Fcb->FileNameLength );
|
||||
ASSERT(Fcb->FullFileName.Buffer[(Fcb->FullFileName.Length - Fcb->FileNameLength)/sizeof(WCHAR) - 1] == L'\\' );
|
||||
|
||||
FsRtlNotifyFullReportChange(Vcb->NotifySync,
|
||||
&Vcb->NotifyList,
|
||||
(PSTRING)&Fcb->FullFileName,
|
||||
(USHORT)(Fcb->FullFileName.Length -
|
||||
Fcb->FileNameLength),
|
||||
NULL,
|
||||
NULL,
|
||||
Filter,
|
||||
Action,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#define TAG_FCB 'BCFV'
|
||||
#define TAG_IRP 'PRIV'
|
||||
#define TAG_VFAT 'TAFV'
|
||||
#define TAG_FSD_CLOSE_CONTEXT 'CLCV'
|
||||
|
||||
|
||||
/* Global resource acquire/release */
|
||||
@@ -36,6 +37,34 @@
|
||||
ExReleaseResourceLite(&(FatGlobalData.Resource)); \
|
||||
}
|
||||
|
||||
#define FatIsFastIoPossible(FCB) ((BOOLEAN) \
|
||||
(((FCB)->Condition != FcbGood || !FsRtlOplockIsFastIoPossible(&(FCB)->Fcb.Oplock)) ? \
|
||||
FastIoIsNotPossible \
|
||||
: \
|
||||
(!FsRtlAreThereCurrentFileLocks(&(FCB)->Fcb.Lock) && \
|
||||
((FCB)->OutstandingAsyncWrites == 0) && \
|
||||
!FlagOn((FCB)->Vcb->State, VCB_STATE_FLAG_WRITE_PROTECTED) ? \
|
||||
FastIoIsPossible \
|
||||
: \
|
||||
FastIoIsQuestionable \
|
||||
) \
|
||||
) \
|
||||
)
|
||||
|
||||
#define IsFileObjectReadOnly(FO) (!((FO)->WriteAccess | (FO)->DeleteAccess))
|
||||
#define IsFileDeleted(FCB) (FlagOn((FCB)->State, FCB_STATE_DELETE_ON_CLOSE) && ((FCB)->UncleanCount == 0))
|
||||
|
||||
BOOLEAN
|
||||
FORCEINLINE
|
||||
FatIsIoRangeValid(IN LARGE_INTEGER Start, IN ULONG Length)
|
||||
{
|
||||
/* Check if it's more than 32bits, or if the length causes 32bit overflow.
|
||||
FAT-specific! */
|
||||
|
||||
return !(Start.HighPart || Start.LowPart + Length < Start.LowPart);
|
||||
}
|
||||
|
||||
|
||||
NTSYSAPI
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
@@ -67,6 +96,12 @@ FatReadStreamFile(PVCB Vcb,
|
||||
PBCB *Bcb,
|
||||
PVOID *Buffer);
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
FatCheckForDismount(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
PVCB Vcb,
|
||||
IN BOOLEAN Force);
|
||||
|
||||
/* ----------------------------------------------------------- dir.c */
|
||||
|
||||
NTSTATUS NTAPI
|
||||
@@ -149,6 +184,8 @@ FatNoopRelease(IN PVOID Context);
|
||||
|
||||
/* --------------------------------------------------------- fastfat.c */
|
||||
|
||||
extern FAST_MUTEX FatCloseQueueMutex;
|
||||
|
||||
PFAT_IRP_CONTEXT NTAPI
|
||||
FatBuildIrpContext(PIRP Irp, BOOLEAN CanWait);
|
||||
|
||||
@@ -205,6 +242,16 @@ FatSetFileObject(PFILE_OBJECT FileObject,
|
||||
PVOID FASTCALL
|
||||
FatMapUserBuffer(PIRP Irp);
|
||||
|
||||
BOOLEAN NTAPI
|
||||
FatIsTopLevelIrp(IN PIRP Irp);
|
||||
|
||||
VOID NTAPI
|
||||
FatNotifyReportChange(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
IN PVCB Vcb,
|
||||
IN PFCB Fcb,
|
||||
IN ULONG Filter,
|
||||
IN ULONG Action);
|
||||
|
||||
/* --------------------------------------------------------- fullfat.c */
|
||||
|
||||
FF_T_SINT32
|
||||
@@ -284,6 +331,10 @@ FatCreateFcb(
|
||||
IN PFCB ParentDcb,
|
||||
IN FF_FILE *FileHandle);
|
||||
|
||||
VOID NTAPI
|
||||
FatDeleteFcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
IN PFCB Fcb);
|
||||
|
||||
IO_STATUS_BLOCK NTAPI
|
||||
FatiOpenExistingFcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
IN PFILE_OBJECT FileObject,
|
||||
@@ -319,6 +370,10 @@ FatRemoveNames(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
PCCB NTAPI
|
||||
FatCreateCcb();
|
||||
|
||||
VOID NTAPI
|
||||
FatDeleteCcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
IN PCCB Ccb);
|
||||
|
||||
VOID NTAPI
|
||||
FatSetFullNameInFcb(PFCB Fcb,
|
||||
PUNICODE_STRING Name);
|
||||
|
||||
@@ -163,6 +163,10 @@ FatInitializeVcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
/* Initialize VCB's resource */
|
||||
ExInitializeResourceLite(&Vcb->Resource);
|
||||
|
||||
/* Initialize close queue lists */
|
||||
InitializeListHead(&Vcb->AsyncCloseList);
|
||||
InitializeListHead(&Vcb->DelayedCloseList);
|
||||
|
||||
/* Initialize CC */
|
||||
CcInitializeCacheMap(Vcb->StreamFileObject,
|
||||
(PCC_FILE_SIZES)&Vcb->Header.AllocationSize,
|
||||
@@ -201,6 +205,10 @@ FatInitializeVcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
goto FatInitializeVcbCleanup;
|
||||
}
|
||||
|
||||
/* Increase internal / residual open counter */
|
||||
InterlockedIncrement((PLONG)&(Vcb->InternalOpenCount));
|
||||
InterlockedIncrement((PLONG)&(Vcb->ResidualOpenCount));
|
||||
|
||||
/* Set up notifications */
|
||||
FsRtlNotifyInitializeSync(&Vcb->NotifySync);
|
||||
InitializeListHead(&Vcb->NotifyList);
|
||||
@@ -239,6 +247,9 @@ FatUninitializeVcb(IN PVCB Vcb)
|
||||
Vcb->StreamFileObject = NULL;
|
||||
}
|
||||
|
||||
/* Free ContextClose if it's not freed up already */
|
||||
if (Vcb->CloseContext) ExFreePool(Vcb->CloseContext);
|
||||
|
||||
/* Free notifications stuff */
|
||||
FsRtlNotifyUninitializeSync(&Vcb->NotifySync);
|
||||
|
||||
|
||||
@@ -14,15 +14,17 @@ typedef FAT_NODE_TYPE *PFAT_NODE_TYPE;
|
||||
#define FatNodeType(Ptr) (*((PFAT_NODE_TYPE)(Ptr)))
|
||||
|
||||
/* Node type codes */
|
||||
#define FAT_NTC_VCB (CSHORT) '00VF'
|
||||
#define FAT_NTC_FCB (CSHORT) 'CF'
|
||||
#define FAT_NTC_DCB (CSHORT) 'DF'
|
||||
#define FAT_NTC_ROOT_DCB (CSHORT) 'RFD'
|
||||
#define FAT_NTC_CCB (CSHORT) 'BCC'
|
||||
#define FAT_NTC_VCB (CSHORT) '00VF'
|
||||
#define FAT_NTC_FCB (CSHORT) 'CF'
|
||||
#define FAT_NTC_DCB (CSHORT) 'DF'
|
||||
#define FAT_NTC_ROOT_DCB (CSHORT) 'RFD'
|
||||
#define FAT_NTC_CCB (CSHORT) 'BCC'
|
||||
#define FAT_NTC_IRP_CONTEXT (CSHORT) 'PRI'
|
||||
|
||||
typedef struct _FAT_GLOBAL_DATA
|
||||
{
|
||||
ERESOURCE Resource;
|
||||
PEPROCESS SystemProcess;
|
||||
PDRIVER_OBJECT DriverObject;
|
||||
PDEVICE_OBJECT DiskDeviceObject;
|
||||
LIST_ENTRY VcbListHead;
|
||||
@@ -33,9 +35,20 @@ typedef struct _FAT_GLOBAL_DATA
|
||||
CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
|
||||
CACHE_MANAGER_CALLBACKS CacheMgrNoopCallbacks;
|
||||
BOOLEAN Win31FileSystem;
|
||||
BOOLEAN ShutdownStarted;
|
||||
/* Jan 1, 1980 System Time */
|
||||
LARGE_INTEGER DefaultFileTime;
|
||||
|
||||
/* Queued close */
|
||||
ULONG AsyncCloseCount;
|
||||
ULONG DelayedCloseCount;
|
||||
LIST_ENTRY AsyncCloseList;
|
||||
LIST_ENTRY DelayedCloseList;
|
||||
PIO_WORKITEM FatCloseItem;
|
||||
|
||||
/* Various flags */
|
||||
BOOLEAN AsyncCloseActive;
|
||||
|
||||
/* FullFAT integration */
|
||||
FF_IOMAN *Ioman;
|
||||
FF_ERROR FF_Error;
|
||||
@@ -82,6 +95,10 @@ typedef struct _FAT_PAGE_CONTEXT
|
||||
|
||||
typedef struct _FAT_IRP_CONTEXT
|
||||
{
|
||||
/* Type and size of this record (must be FAT_NTC_IRP_CONTEXT) */
|
||||
FAT_NODE_TYPE NodeTypeCode;
|
||||
CSHORT NodeByteSize;
|
||||
|
||||
PIRP Irp;
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
UCHAR MajorFunction;
|
||||
@@ -132,10 +149,15 @@ typedef struct _FAT_METHODS {
|
||||
PFAT_SETFAT_VALUE_RUN_ROUTINE SetValueRun;
|
||||
} FAT_METHODS, *PFAT_METHODS;
|
||||
|
||||
#define VCB_STATE_FLAG_LOCKED 0x01
|
||||
#define VCB_STATE_FLAG_DIRTY 0x02
|
||||
#define VCB_STATE_MOUNTED_DIRTY 0x04
|
||||
#define VCB_STATE_CREATE_IN_PROGRESS 0x08
|
||||
#define VCB_STATE_FLAG_LOCKED 0x001
|
||||
#define VCB_STATE_FLAG_DIRTY 0x002
|
||||
#define VCB_STATE_MOUNTED_DIRTY 0x004
|
||||
#define VCB_STATE_CREATE_IN_PROGRESS 0x008
|
||||
#define VCB_STATE_FLAG_CLOSE_IN_PROGRESS 0x010
|
||||
#define VCB_STATE_FLAG_DELETED_FCB 0x020
|
||||
#define VCB_STATE_FLAG_DISMOUNT_IN_PROGRESS 0x040
|
||||
#define VCB_STATE_FLAG_DEFERRED_FLUSH 0x080
|
||||
#define VCB_STATE_FLAG_WRITE_PROTECTED 0x100
|
||||
|
||||
typedef enum _VCB_CONDITION
|
||||
{
|
||||
@@ -158,10 +180,13 @@ typedef struct _VCB
|
||||
ULONG State;
|
||||
VCB_CONDITION Condition;
|
||||
ERESOURCE Resource;
|
||||
struct _CLOSE_CONTEXT *CloseContext;
|
||||
LIST_ENTRY AsyncCloseList;
|
||||
LIST_ENTRY DelayedCloseList;
|
||||
|
||||
/* Direct volume access */
|
||||
ULONG DirectOpenCount;
|
||||
SHARE_ACCESS ShareAccess;
|
||||
PFILE_OBJECT FileObjectWithVcbLocked;
|
||||
|
||||
/* Notifications support */
|
||||
PNOTIFY_SYNC NotifySync;
|
||||
@@ -186,8 +211,13 @@ typedef struct _VCB
|
||||
struct _FCB *RootDcb;
|
||||
|
||||
/* Counters */
|
||||
ULONG MediaChangeCount;
|
||||
ULONG DirectOpenCount;
|
||||
ULONG OpenFileCount;
|
||||
ULONG ReadOnlyCount;
|
||||
ULONG InternalOpenCount;
|
||||
ULONG ResidualOpenCount;
|
||||
ULONG DirectAccessOpenCount;
|
||||
ULONG MediaChangeCount;
|
||||
|
||||
/* FullFAT integration */
|
||||
FF_IOMAN *Ioman;
|
||||
@@ -221,6 +251,18 @@ typedef struct _VOLUME_DEVICE_OBJECT
|
||||
VCB Vcb; /* Must be the last entry! */
|
||||
};
|
||||
} VOLUME_DEVICE_OBJECT, *PVOLUME_DEVICE_OBJECT;
|
||||
|
||||
typedef enum _TYPE_OF_OPEN
|
||||
{
|
||||
UnopenedFileObject,
|
||||
UserFileOpen,
|
||||
UserDirectoryOpen,
|
||||
UserVolumeOpen,
|
||||
VirtualVolumeFile,
|
||||
DirectoryFile,
|
||||
EaFile
|
||||
} TYPE_OF_OPEN;
|
||||
|
||||
//
|
||||
// Short name always exists in FAT
|
||||
//
|
||||
@@ -252,6 +294,7 @@ typedef enum _FCB_CONDITION
|
||||
#define FCB_STATE_PAGEFILE 0x04
|
||||
#define FCB_STATE_DELAY_CLOSE 0x08
|
||||
#define FCB_STATE_TRUNCATE_ON_CLOSE 0x10
|
||||
#define FCB_STATE_DELETE_ON_CLOSE 0x20
|
||||
|
||||
typedef struct _FCB
|
||||
{
|
||||
@@ -281,8 +324,6 @@ typedef struct _FCB
|
||||
FCB_CONDITION Condition;
|
||||
/* Share access */
|
||||
SHARE_ACCESS ShareAccess;
|
||||
/* Mcb mapping Vbo->Lbo */
|
||||
LARGE_MCB Mcb;
|
||||
ULONG FirstCluster;
|
||||
/* Links into FCB Tree */
|
||||
FCB_NAME_LINK ShortName;
|
||||
@@ -307,6 +348,8 @@ typedef struct _FCB
|
||||
PKEVENT OutstandingAsyncEvent;
|
||||
/* Counters */
|
||||
ULONG OpenCount;
|
||||
ULONG UncleanCount;
|
||||
ULONG NonCachedUncleanCount;
|
||||
union
|
||||
{
|
||||
struct
|
||||
@@ -318,12 +361,11 @@ typedef struct _FCB
|
||||
|
||||
struct
|
||||
{
|
||||
/* A list of all FCBs/DCBs opened under this DCB */
|
||||
LIST_ENTRY ParentDcbList;
|
||||
LIST_ENTRY ParentDcbList; /* A list of all FCBs/DCBs opened under this DCB */
|
||||
ULONG DirectoryFileOpenCount; /* Sector-based access to the dir */
|
||||
PFILE_OBJECT DirectoryFile;
|
||||
/* Directory data stream (just handy to have it). */
|
||||
PFILE_OBJECT StreamFileObject;
|
||||
/* Bitmap to search for free dirents. */
|
||||
RTL_BITMAP FreeBitmap;
|
||||
//PFILE_OBJECT StreamFileObject;
|
||||
/* Names */
|
||||
PRTL_SPLAY_LINKS SplayLinksAnsi;
|
||||
PRTL_SPLAY_LINKS SplayLinksUnicode;
|
||||
@@ -368,6 +410,17 @@ typedef struct _FAT_FIND_DIRENT_CONTEXT
|
||||
BOOLEAN Valid8dot3Name;
|
||||
} FAT_FIND_DIRENT_CONTEXT, *PFAT_FIND_DIRENT_CONTEXT;
|
||||
|
||||
typedef struct _CLOSE_CONTEXT
|
||||
{
|
||||
LIST_ENTRY GlobalLinks;
|
||||
LIST_ENTRY VcbLinks;
|
||||
|
||||
PVCB Vcb;
|
||||
PFCB Fcb;
|
||||
TYPE_OF_OPEN TypeOfOpen;
|
||||
BOOLEAN Free;
|
||||
} CLOSE_CONTEXT, *PCLOSE_CONTEXT;
|
||||
|
||||
typedef struct _CCB
|
||||
{
|
||||
CSHORT NodeTypeCode;
|
||||
@@ -377,19 +430,9 @@ typedef struct _CCB
|
||||
ULONG Entry;
|
||||
UNICODE_STRING SearchPattern;
|
||||
UCHAR Flags;
|
||||
CLOSE_CONTEXT CloseContext;
|
||||
} CCB, *PCCB;
|
||||
|
||||
typedef enum _TYPE_OF_OPEN
|
||||
{
|
||||
UnopenedFileObject,
|
||||
UserFileOpen,
|
||||
UserDirectoryOpen,
|
||||
UserVolumeOpen,
|
||||
VirtualVolumeFile,
|
||||
DirectoryFile,
|
||||
EaFile
|
||||
} TYPE_OF_OPEN;
|
||||
|
||||
typedef enum _FILE_TIME_INDEX
|
||||
{
|
||||
FileCreationTime = 0,
|
||||
@@ -401,5 +444,10 @@ typedef enum _FILE_TIME_INDEX
|
||||
#define CCB_SEARCH_RETURN_SINGLE_ENTRY 0x01
|
||||
#define CCB_SEARCH_PATTERN_LEGAL_8DOT3 0x02
|
||||
#define CCB_SEARCH_PATTERN_HAS_WILD_CARD 0x04
|
||||
#define CCB_DASD_IO 0x10
|
||||
#define CCB_DASD_IO 0x08
|
||||
#define CCB_READ_ONLY 0x10
|
||||
#define CCB_DELETE_ON_CLOSE 0x20
|
||||
#define CCB_COMPLETE_DISMOUNT 0x40
|
||||
#define CCB_CLOSE_CONTEXT 0x80
|
||||
|
||||
extern FAT_GLOBAL_DATA FatGlobalData;
|
||||
|
||||
@@ -149,12 +149,74 @@ FatCreateFcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
Fcb->Header.ValidDataLength.LowPart = FileHandle->Filesize;
|
||||
Fcb->FatHandle = FileHandle;
|
||||
|
||||
/* Initialize locks */
|
||||
FsRtlInitializeFileLock(&Fcb->Fcb.Lock, NULL, NULL);
|
||||
FsRtlInitializeOplock(&Fcb->Fcb.Oplock);
|
||||
|
||||
/* Set names */
|
||||
FatSetFcbNames(IrpContext, Fcb);
|
||||
|
||||
return Fcb;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
FatDeleteFcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
IN PFCB Fcb)
|
||||
{
|
||||
DPRINT("FatDeleteFcb %p\n", Fcb);
|
||||
|
||||
if (Fcb->OpenCount != 0)
|
||||
{
|
||||
DPRINT1("Trying to delete FCB with OpenCount %d\n", Fcb->OpenCount);
|
||||
ASSERT(FALSE);
|
||||
}
|
||||
|
||||
if ((Fcb->Header.NodeTypeCode == FAT_NTC_DCB) ||
|
||||
(Fcb->Header.NodeTypeCode == FAT_NTC_ROOT_DCB))
|
||||
{
|
||||
/* Make sure it's a valid deletion */
|
||||
ASSERT(Fcb->Dcb.DirectoryFileOpenCount == 0);
|
||||
ASSERT(IsListEmpty(&Fcb->Dcb.ParentDcbList));
|
||||
ASSERT(Fcb->Dcb.DirectoryFile == NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Free locks */
|
||||
FsRtlUninitializeFileLock(&Fcb->Fcb.Lock);
|
||||
FsRtlUninitializeOplock(&Fcb->Fcb.Oplock);
|
||||
}
|
||||
|
||||
/* Release any possible filter contexts */
|
||||
FsRtlTeardownPerStreamContexts(&Fcb->Header);
|
||||
|
||||
/* Remove from parents queue */
|
||||
if (Fcb->Header.NodeTypeCode != FAT_NTC_ROOT_DCB)
|
||||
{
|
||||
RemoveEntryList(&(Fcb->ParentDcbLinks));
|
||||
}
|
||||
|
||||
/* Free FullFAT handle */
|
||||
if (Fcb->FatHandle) FF_Close(Fcb->FatHandle);
|
||||
|
||||
/* Remove from the splay table */
|
||||
if (FlagOn(Fcb->State, FCB_STATE_HAS_NAMES))
|
||||
FatRemoveNames(IrpContext, Fcb);
|
||||
|
||||
/* Free file name buffers */
|
||||
if (Fcb->Header.NodeTypeCode != FAT_NTC_ROOT_DCB)
|
||||
{
|
||||
if (Fcb->FullFileName.Buffer)
|
||||
ExFreePool(Fcb->FullFileName.Buffer);
|
||||
}
|
||||
|
||||
if (Fcb->ExactCaseLongName.Buffer)
|
||||
ExFreePool(Fcb->ExactCaseLongName.Buffer);
|
||||
|
||||
/* Free this FCB, finally */
|
||||
ExFreePool(Fcb);
|
||||
}
|
||||
|
||||
PCCB
|
||||
NTAPI
|
||||
FatCreateCcb()
|
||||
@@ -172,6 +234,17 @@ FatCreateCcb()
|
||||
return Ccb;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
FatDeleteCcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
IN PCCB Ccb)
|
||||
{
|
||||
// TODO: Deallocate CCB strings, if any
|
||||
|
||||
/* Free the CCB */
|
||||
ExFreePool(Ccb);
|
||||
}
|
||||
|
||||
IO_STATUS_BLOCK
|
||||
NTAPI
|
||||
FatiOpenExistingFcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
@@ -443,8 +516,11 @@ SuccComplete:
|
||||
ClearFlag(Fcb->State, FCB_STATE_DELAY_CLOSE);
|
||||
|
||||
/* Increase counters */
|
||||
Fcb->UncleanCount++;
|
||||
Fcb->OpenCount++;
|
||||
Vcb->OpenFileCount++;
|
||||
if (IsFileObjectReadOnly(FileObject)) Vcb->ReadOnlyCount++;
|
||||
if (FlagOn(FileObject->Flags, FO_NO_INTERMEDIATE_BUFFERING)) Fcb->NonCachedUncleanCount++;
|
||||
|
||||
// TODO: Handle DeleteOnClose and OpenedAsDos by storing those flags in CCB
|
||||
}
|
||||
|
||||
@@ -263,11 +263,7 @@ FatQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||
FsRtlEnterFileSystem();
|
||||
|
||||
/* Set Top Level IRP if not set */
|
||||
if (IoGetTopLevelIrp() == NULL)
|
||||
{
|
||||
IoSetTopLevelIrp(Irp);
|
||||
TopLevel = TRUE;
|
||||
}
|
||||
TopLevel = FatIsTopLevelIrp(Irp);
|
||||
|
||||
/* Build an irp context */
|
||||
IrpContext = FatBuildIrpContext(Irp, CanWait);
|
||||
@@ -284,12 +280,394 @@ FatQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatSetEndOfFileInfo(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
IN PIRP Irp,
|
||||
IN PFILE_OBJECT FileObject,
|
||||
IN PVCB Vcb,
|
||||
IN PFCB Fcb)
|
||||
{
|
||||
PFILE_END_OF_FILE_INFORMATION Buffer;
|
||||
ULONG NewFileSize;
|
||||
ULONG InitialFileSize;
|
||||
ULONG InitialValidDataLength;
|
||||
//ULONG InitialValidDataToDisk;
|
||||
BOOLEAN CacheMapInitialized = FALSE;
|
||||
BOOLEAN ResourceAcquired = FALSE;
|
||||
NTSTATUS Status;
|
||||
|
||||
Buffer = Irp->AssociatedIrp.SystemBuffer;
|
||||
|
||||
if (FatNodeType(Fcb) != FAT_NTC_FCB)
|
||||
{
|
||||
/* Trying to change size of a dir */
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Validate new size */
|
||||
if (!FatIsIoRangeValid(Buffer->EndOfFile, 0))
|
||||
{
|
||||
Status = STATUS_DISK_FULL;
|
||||
return Status;
|
||||
}
|
||||
|
||||
NewFileSize = Buffer->EndOfFile.LowPart;
|
||||
|
||||
/* Lookup allocation size if needed */
|
||||
if (Fcb->Header.AllocationSize.QuadPart == (LONGLONG)-1)
|
||||
UNIMPLEMENTED;//FatLookupFileAllocationSize(IrpContext, Fcb);
|
||||
|
||||
/* Cache the file if there is a data section */
|
||||
if (FileObject->SectionObjectPointer->DataSectionObject &&
|
||||
(FileObject->SectionObjectPointer->SharedCacheMap == NULL) &&
|
||||
!FlagOn(Irp->Flags, IRP_PAGING_IO))
|
||||
{
|
||||
if (FlagOn(FileObject->Flags, FO_CLEANUP_COMPLETE))
|
||||
{
|
||||
/* This is a really weird condition */
|
||||
UNIMPLEMENTED;
|
||||
//Raise(STATUS_FILE_CLOSED);
|
||||
}
|
||||
|
||||
/* Initialize the cache map */
|
||||
CcInitializeCacheMap(FileObject,
|
||||
(PCC_FILE_SIZES)&Fcb->Header.AllocationSize,
|
||||
FALSE,
|
||||
&FatGlobalData.CacheMgrCallbacks,
|
||||
Fcb);
|
||||
|
||||
CacheMapInitialized = TRUE;
|
||||
}
|
||||
|
||||
/* Lazy write case */
|
||||
if (IoGetCurrentIrpStackLocation(Irp)->Parameters.SetFile.AdvanceOnly)
|
||||
{
|
||||
if (!IsFileDeleted(Fcb) &&
|
||||
(Fcb->Condition == FcbGood))
|
||||
{
|
||||
/* Clamp the new file size */
|
||||
if (NewFileSize >= Fcb->Header.FileSize.LowPart)
|
||||
NewFileSize = Fcb->Header.FileSize.LowPart;
|
||||
|
||||
ASSERT(NewFileSize <= Fcb->Header.AllocationSize.LowPart);
|
||||
|
||||
/* Never reduce the file size here! */
|
||||
|
||||
// TODO: Actually change file size
|
||||
DPRINT1("Actually changing file size is missing\n");
|
||||
|
||||
/* Notify about file size change */
|
||||
FatNotifyReportChange(IrpContext,
|
||||
Vcb,
|
||||
Fcb,
|
||||
FILE_NOTIFY_CHANGE_SIZE,
|
||||
FILE_ACTION_MODIFIED);
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT1("Cannot set size on deleted file\n");
|
||||
}
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
return Status;
|
||||
}
|
||||
|
||||
if ( NewFileSize > Fcb->Header.AllocationSize.LowPart )
|
||||
{
|
||||
// TODO: Increase file size
|
||||
DPRINT1("Actually changing file size is missing\n");
|
||||
}
|
||||
|
||||
if (Fcb->Header.FileSize.LowPart != NewFileSize)
|
||||
{
|
||||
if (NewFileSize < Fcb->Header.FileSize.LowPart)
|
||||
{
|
||||
if (!MmCanFileBeTruncated(FileObject->SectionObjectPointer,
|
||||
&Buffer->EndOfFile))
|
||||
{
|
||||
Status = STATUS_USER_MAPPED_FILE;
|
||||
|
||||
/* Free up resources if necessary */
|
||||
if (CacheMapInitialized)
|
||||
CcUninitializeCacheMap(FileObject, NULL, NULL);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
ResourceAcquired = ExAcquireResourceExclusiveLite(Fcb->Header.PagingIoResource, TRUE);
|
||||
}
|
||||
|
||||
/* Set new file sizes */
|
||||
InitialFileSize = Fcb->Header.FileSize.LowPart;
|
||||
InitialValidDataLength = Fcb->Header.ValidDataLength.LowPart;
|
||||
//InitialValidDataToDisk = Fcb->ValidDataToDisk;
|
||||
|
||||
Fcb->Header.FileSize.LowPart = NewFileSize;
|
||||
|
||||
/* Adjust valid data length if new size is less than that */
|
||||
if (Fcb->Header.ValidDataLength.LowPart > NewFileSize)
|
||||
Fcb->Header.ValidDataLength.LowPart = NewFileSize;
|
||||
|
||||
//if (Fcb->ValidDataToDisk > NewFileSize)
|
||||
// Fcb->ValidDataToDisk = NewFileSize;
|
||||
|
||||
DPRINT1("New file size is 0x%08lx\n", NewFileSize);
|
||||
|
||||
/* Update cache mapping */
|
||||
CcSetFileSizes(FileObject,
|
||||
(PCC_FILE_SIZES)&Fcb->Header.AllocationSize);
|
||||
|
||||
/* Notify about size change */
|
||||
FatNotifyReportChange(IrpContext,
|
||||
Vcb,
|
||||
Fcb,
|
||||
FILE_NOTIFY_CHANGE_SIZE,
|
||||
FILE_ACTION_MODIFIED);
|
||||
|
||||
/* Set truncate on close flag */
|
||||
SetFlag(Fcb->State, FCB_STATE_TRUNCATE_ON_CLOSE);
|
||||
}
|
||||
|
||||
/* Set modified flag */
|
||||
FileObject->Flags |= FO_FILE_MODIFIED;
|
||||
|
||||
/* Free up resources if necessary */
|
||||
if (CacheMapInitialized)
|
||||
CcUninitializeCacheMap(FileObject, NULL, NULL);
|
||||
|
||||
if (ResourceAcquired)
|
||||
ExReleaseResourceLite(Fcb->Header.PagingIoResource);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatiSetInformation(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
PFILE_OBJECT FileObject;
|
||||
PIO_STACK_LOCATION IrpSp;
|
||||
FILE_INFORMATION_CLASS InfoClass;
|
||||
TYPE_OF_OPEN TypeOfOpen;
|
||||
PVCB Vcb;
|
||||
PFCB Fcb;
|
||||
PCCB Ccb;
|
||||
LONG Length;
|
||||
PVOID Buffer;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
BOOLEAN VcbAcquired = FALSE, FcbAcquired = FALSE;
|
||||
|
||||
/* Get IRP stack location */
|
||||
IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
/* Get the file object */
|
||||
FileObject = IrpSp->FileObject;
|
||||
|
||||
/* Copy variables to something with shorter names */
|
||||
InfoClass = IrpSp->Parameters.SetFile.FileInformationClass;
|
||||
Length = IrpSp->Parameters.SetFile.Length;
|
||||
Buffer = Irp->AssociatedIrp.SystemBuffer;
|
||||
|
||||
DPRINT("FatiSetInformation\n", 0);
|
||||
DPRINT("\tIrp = %08lx\n", Irp);
|
||||
DPRINT("\tLength = %08lx\n", Length);
|
||||
DPRINT("\tFileInformationClass = %08lx\n", InfoClass);
|
||||
DPRINT("\tFileObject = %08lx\n", IrpSp->Parameters.SetFile.FileObject);
|
||||
DPRINT("\tBuffer = %08lx\n", Buffer);
|
||||
|
||||
TypeOfOpen = FatDecodeFileObject(FileObject, &Vcb, &Fcb, &Ccb);
|
||||
|
||||
DPRINT("Vcb %p, Fcb %p, Ccb %p, open type %d\n", Vcb, Fcb, Ccb, TypeOfOpen);
|
||||
|
||||
switch (TypeOfOpen)
|
||||
{
|
||||
case UserVolumeOpen:
|
||||
Status = STATUS_INVALID_PARAMETER;
|
||||
/* Complete request and return status */
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
return Status;
|
||||
case UserFileOpen:
|
||||
/* Check oplocks */
|
||||
if (!FlagOn(Fcb->State, FCB_STATE_PAGEFILE) &&
|
||||
((InfoClass == FileEndOfFileInformation) ||
|
||||
(InfoClass == FileAllocationInformation)))
|
||||
{
|
||||
Status = FsRtlCheckOplock(&Fcb->Fcb.Oplock,
|
||||
Irp,
|
||||
IrpContext,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* Complete request and return status */
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Update Fast IO flag */
|
||||
Fcb->Header.IsFastIoPossible = FatIsFastIoPossible(Fcb);
|
||||
}
|
||||
break;
|
||||
|
||||
case UserDirectoryOpen:
|
||||
break;
|
||||
|
||||
default:
|
||||
Status = STATUS_INVALID_PARAMETER;
|
||||
/* Complete request and return status */
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* If it's a root DCB - fail */
|
||||
if (FatNodeType(Fcb) == FAT_NTC_ROOT_DCB)
|
||||
{
|
||||
if (InfoClass == FileDispositionInformation)
|
||||
Status = STATUS_CANNOT_DELETE;
|
||||
else
|
||||
Status = STATUS_INVALID_PARAMETER;
|
||||
|
||||
/* Complete request and return status */
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Acquire the volume lock if needed */
|
||||
if (InfoClass == FileDispositionInformation ||
|
||||
InfoClass == FileRenameInformation)
|
||||
{
|
||||
if (!FatAcquireExclusiveVcb(IrpContext, Vcb))
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
VcbAcquired = TRUE;
|
||||
}
|
||||
|
||||
/* Acquire FCB lock */
|
||||
if (!FlagOn(Fcb->State, FCB_STATE_PAGEFILE))
|
||||
{
|
||||
if (!FatAcquireExclusiveFcb(IrpContext, Fcb))
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
FcbAcquired = TRUE;
|
||||
}
|
||||
|
||||
// TODO: VerifyFcb
|
||||
|
||||
switch (InfoClass)
|
||||
{
|
||||
case FileBasicInformation:
|
||||
//Status = FatSetBasicInfo(IrpContext, Irp, Fcb, Ccb);
|
||||
DPRINT1("FileBasicInformation\n");
|
||||
break;
|
||||
|
||||
case FileDispositionInformation:
|
||||
if (FlagOn(Vcb->State, VCB_STATE_FLAG_DEFERRED_FLUSH) &&
|
||||
!FlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT))
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
//Status = FatSetDispositionInfo(IrpContext, Irp, FileObject, Fcb);
|
||||
DPRINT1("FileDispositionInformation\n");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case FileRenameInformation:
|
||||
if (!FlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT))
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
//Status = FatSetRenameInfo(IrpContext, Irp, Vcb, Fcb, Ccb);
|
||||
DPRINT1("FileRenameInformation\n");
|
||||
|
||||
/* NOTE: Request must not be completed here!
|
||||
That's why Irp/IrpContext are set to NULL */
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
Irp = NULL;
|
||||
IrpContext = NULL;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case FilePositionInformation:
|
||||
//Status = FatSetPositionInfo(IrpContext, Irp, FileObject);
|
||||
DPRINT1("FilePositionInformation\n");
|
||||
break;
|
||||
|
||||
case FileLinkInformation:
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
break;
|
||||
|
||||
case FileAllocationInformation:
|
||||
//Status = FatSetAllocationInfo(IrpContext, Irp, Fcb, FileObject);
|
||||
DPRINT1("FileAllocationInformation\n");
|
||||
break;
|
||||
|
||||
case FileEndOfFileInformation:
|
||||
Status = FatSetEndOfFileInfo(IrpContext, Irp, FileObject, Vcb, Fcb);
|
||||
break;
|
||||
|
||||
default:
|
||||
Status = STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* Release locks */
|
||||
if (FcbAcquired) FatReleaseFcb(IrpContext, Fcb);
|
||||
if (VcbAcquired) FatReleaseVcb(IrpContext, Vcb);
|
||||
|
||||
/* Complete request and return status */
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||
{
|
||||
DPRINT1("FatSetInformation()\n");
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
NTSTATUS Status;
|
||||
BOOLEAN TopLevel, CanWait;
|
||||
PFAT_IRP_CONTEXT IrpContext;
|
||||
|
||||
CanWait = TRUE;
|
||||
TopLevel = FALSE;
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
|
||||
/* Get CanWait flag */
|
||||
if (IoGetCurrentIrpStackLocation(Irp)->FileObject != NULL)
|
||||
CanWait = IoIsOperationSynchronous(Irp);
|
||||
|
||||
/* Enter FsRtl critical region */
|
||||
FsRtlEnterFileSystem();
|
||||
|
||||
/* Set Top Level IRP if not set */
|
||||
TopLevel = FatIsTopLevelIrp(Irp);
|
||||
|
||||
/* Build an irp context */
|
||||
IrpContext = FatBuildIrpContext(Irp, CanWait);
|
||||
|
||||
/* Perform the actual read */
|
||||
Status = FatiSetInformation(IrpContext, Irp);
|
||||
|
||||
/* Restore top level Irp */
|
||||
if (TopLevel) IoSetTopLevelIrp(NULL);
|
||||
|
||||
/* Leave FsRtl critical region */
|
||||
FsRtlExitFileSystem();
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
||||
@@ -13,13 +13,181 @@
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatOplockRequest(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
DPRINT1("Oplock request!\n");
|
||||
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatMarkVolumeDirty(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
DPRINT1("Marking volume as dirty\n");
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatUserFsCtrl(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
|
||||
{
|
||||
DPRINT1("FatUserFsCtrl()\n");
|
||||
FatCompleteRequest(IrpContext, Irp, STATUS_INVALID_DEVICE_REQUEST);
|
||||
return STATUS_INVALID_DEVICE_REQUEST;
|
||||
PIO_STACK_LOCATION IrpSp;
|
||||
NTSTATUS Status;
|
||||
ULONG Code;
|
||||
|
||||
/* Get current IRP stack location */
|
||||
IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
Code = IrpSp->Parameters.FileSystemControl.FsControlCode;
|
||||
|
||||
/* Set the wait flag */
|
||||
if (Irp->RequestorMode != KernelMode &&
|
||||
(Code & 3) == METHOD_NEITHER)
|
||||
{
|
||||
SetFlag(IrpContext->Flags, IRPCONTEXT_CANWAIT);
|
||||
}
|
||||
|
||||
/* Branch according to the code */
|
||||
switch (Code)
|
||||
{
|
||||
case FSCTL_REQUEST_OPLOCK_LEVEL_1:
|
||||
case FSCTL_REQUEST_OPLOCK_LEVEL_2:
|
||||
case FSCTL_REQUEST_BATCH_OPLOCK:
|
||||
case FSCTL_OPLOCK_BREAK_ACKNOWLEDGE:
|
||||
case FSCTL_OPBATCH_ACK_CLOSE_PENDING:
|
||||
case FSCTL_OPLOCK_BREAK_NOTIFY:
|
||||
case FSCTL_OPLOCK_BREAK_ACK_NO_2:
|
||||
case FSCTL_REQUEST_FILTER_OPLOCK :
|
||||
Status = FatOplockRequest(IrpContext, Irp);
|
||||
break;
|
||||
|
||||
case FSCTL_LOCK_VOLUME:
|
||||
//Status = FatLockVolume( IrpContext, Irp );
|
||||
DPRINT1("FSCTL_LOCK_VOLUME\n");
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
break;
|
||||
|
||||
case FSCTL_UNLOCK_VOLUME:
|
||||
//Status = FatUnlockVolume( IrpContext, Irp );
|
||||
DPRINT1("FSCTL_UNLOCK_VOLUME\n");
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
break;
|
||||
|
||||
case FSCTL_DISMOUNT_VOLUME:
|
||||
//Status = FatDismountVolume( IrpContext, Irp );
|
||||
DPRINT1("FSCTL_DISMOUNT_VOLUME\n");
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
break;
|
||||
|
||||
case FSCTL_MARK_VOLUME_DIRTY:
|
||||
Status = FatMarkVolumeDirty(IrpContext, Irp);
|
||||
break;
|
||||
|
||||
case FSCTL_IS_VOLUME_DIRTY:
|
||||
//Status = FatIsVolumeDirty( IrpContext, Irp );
|
||||
DPRINT1("FSCTL_IS_VOLUME_DIRTY\n");
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
break;
|
||||
|
||||
case FSCTL_IS_VOLUME_MOUNTED:
|
||||
//Status = FatIsVolumeMounted( IrpContext, Irp );
|
||||
DPRINT1("FSCTL_IS_VOLUME_MOUNTED\n");
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
break;
|
||||
|
||||
case FSCTL_IS_PATHNAME_VALID:
|
||||
//Status = FatIsPathnameValid( IrpContext, Irp );
|
||||
DPRINT1("FSCTL_IS_PATHNAME_VALID\n");
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
break;
|
||||
|
||||
case FSCTL_QUERY_RETRIEVAL_POINTERS:
|
||||
//Status = FatQueryRetrievalPointers( IrpContext, Irp );
|
||||
DPRINT1("FSCTL_QUERY_RETRIEVAL_POINTERS\n");
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
break;
|
||||
|
||||
case FSCTL_QUERY_FAT_BPB:
|
||||
//Status = FatQueryBpb( IrpContext, Irp );
|
||||
DPRINT1("FSCTL_QUERY_FAT_BPB\n");
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
break;
|
||||
|
||||
case FSCTL_FILESYSTEM_GET_STATISTICS:
|
||||
//Status = FatGetStatistics( IrpContext, Irp );
|
||||
DPRINT1("FSCTL_FILESYSTEM_GET_STATISTICS\n");
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
break;
|
||||
|
||||
case FSCTL_GET_VOLUME_BITMAP:
|
||||
//Status = FatGetVolumeBitmap( IrpContext, Irp );
|
||||
DPRINT1("FSCTL_GET_VOLUME_BITMAP\n");
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
break;
|
||||
|
||||
case FSCTL_GET_RETRIEVAL_POINTERS:
|
||||
//Status = FatGetRetrievalPointers( IrpContext, Irp );
|
||||
DPRINT1("FSCTL_GET_RETRIEVAL_POINTERS\n");
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
break;
|
||||
|
||||
case FSCTL_MOVE_FILE:
|
||||
//Status = FatMoveFile( IrpContext, Irp );
|
||||
DPRINT1("FSCTL_MOVE_FILE\n");
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
break;
|
||||
|
||||
case FSCTL_ALLOW_EXTENDED_DASD_IO:
|
||||
//Status = FatAllowExtendedDasdIo( IrpContext, Irp );
|
||||
DPRINT1("FSCTL_ALLOW_EXTENDED_DASD_IO\n");
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
break;
|
||||
|
||||
default:
|
||||
DPRINT("FatUserFsCtrl(), unhandled fs control code 0x%x\n", Code);
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
FatCompleteRequest(IrpContext, Irp, Status);
|
||||
}
|
||||
|
||||
//(((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
|
||||
|
||||
// 9c040
|
||||
// 1 1 0 0 0
|
||||
// 6 4 8 4 0
|
||||
// 10011100000001000000
|
||||
// DT = 1001 = 9
|
||||
// Access = 11 = 3
|
||||
// Function = 10000 = 16
|
||||
// Method = 0
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
|
||||
@@ -13,12 +13,98 @@
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatiLockControl(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
|
||||
{
|
||||
PIO_STACK_LOCATION IrpSp;
|
||||
TYPE_OF_OPEN TypeOfOpen;
|
||||
PVCB Vcb;
|
||||
PFCB Fcb;
|
||||
PCCB Ccb;
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Get IRP stack location */
|
||||
IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
/* Determine type of open */
|
||||
TypeOfOpen = FatDecodeFileObject(IrpSp->FileObject, &Vcb, &Fcb, &Ccb);
|
||||
|
||||
/* Only user file open is allowed */
|
||||
if (TypeOfOpen != UserFileOpen)
|
||||
{
|
||||
FatCompleteRequest(IrpContext, Irp, STATUS_INVALID_PARAMETER);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* Acquire shared FCB lock */
|
||||
if (!FatAcquireSharedFcb(IrpContext, Fcb))
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
//Status = FatFsdPostRequest(IrpContext, Irp);
|
||||
Status = STATUS_NOT_IMPLEMENTED;
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Check oplock state */
|
||||
Status = FsRtlCheckOplock(&Fcb->Fcb.Oplock,
|
||||
Irp,
|
||||
IrpContext,
|
||||
FatOplockComplete,
|
||||
NULL);
|
||||
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* Release FCB lock */
|
||||
FatReleaseFcb(IrpContext, Fcb);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Process the lock */
|
||||
Status = FsRtlProcessFileLock(&Fcb->Fcb.Lock, Irp, NULL);
|
||||
|
||||
/* Update Fast I/O state */
|
||||
Fcb->Header.IsFastIoPossible = FatIsFastIoPossible(Fcb);
|
||||
|
||||
/* Complete the request */
|
||||
FatCompleteRequest(IrpContext, NULL, 0);
|
||||
|
||||
/* Release FCB lock */
|
||||
FatReleaseFcb(IrpContext, Fcb);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatLockControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||
{
|
||||
PFAT_IRP_CONTEXT IrpContext;
|
||||
NTSTATUS Status;
|
||||
BOOLEAN TopLevel;
|
||||
|
||||
DPRINT1("FatLockControl()\n");
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
|
||||
/* Enter FsRtl critical region */
|
||||
FsRtlEnterFileSystem();
|
||||
|
||||
/* Set Top Level IRP if not set */
|
||||
TopLevel = FatIsTopLevelIrp(Irp);
|
||||
|
||||
/* Build an irp context */
|
||||
IrpContext = FatBuildIrpContext(Irp, IoIsOperationSynchronous(Irp));
|
||||
|
||||
/* Call internal function */
|
||||
Status = FatiLockControl(IrpContext, Irp);
|
||||
|
||||
/* Reset Top Level IRP */
|
||||
if (TopLevel) IoSetTopLevelIrp(NULL);
|
||||
|
||||
/* Leave FsRtl critical region */
|
||||
FsRtlExitFileSystem();
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
VOID
|
||||
|
||||
@@ -91,11 +91,7 @@ FatRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||
if (DeviceObject != FatGlobalData.DiskDeviceObject)
|
||||
{
|
||||
/* Set Top Level IRP if not set */
|
||||
if (IoGetTopLevelIrp() == NULL)
|
||||
{
|
||||
IoSetTopLevelIrp(Irp);
|
||||
TopLevel = TRUE;
|
||||
}
|
||||
TopLevel = FatIsTopLevelIrp(Irp);
|
||||
|
||||
/* Build an irp context */
|
||||
IrpContext = FatBuildIrpContext(Irp, CanWait);
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
//#define NDEBUG
|
||||
#define NDEBUG
|
||||
#include "fastfat.h"
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
@@ -77,12 +77,31 @@ FatiQueryFsSizeInfo(PVCB Vcb,
|
||||
Buffer->SectorsPerAllocationUnit = Vcb->Bpb.SectorsPerCluster;
|
||||
Buffer->BytesPerSector = Vcb->Bpb.BytesPerSector;
|
||||
|
||||
DPRINT1("Total %d, free %d, SPC %d, BPS %d\n", Partition->FreeClusterCount,
|
||||
Partition->NumClusters, Vcb->Bpb.SectorsPerCluster, Vcb->Bpb.BytesPerSector);
|
||||
DPRINT1("Total %d, free %d, SPC %d, BPS %d\n", Partition->NumClusters,
|
||||
Partition->FreeClusterCount, Vcb->Bpb.SectorsPerCluster, Vcb->Bpb.BytesPerSector);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatiQueryFsDeviceInfo(PVCB Vcb,
|
||||
PFILE_FS_DEVICE_INFORMATION Buffer,
|
||||
PLONG Length)
|
||||
{
|
||||
/* Deduct the minimum written length */
|
||||
*Length -= sizeof(FILE_FS_DEVICE_INFORMATION);
|
||||
|
||||
/* Zero it */
|
||||
RtlZeroMemory(Buffer, sizeof(FILE_FS_DEVICE_INFORMATION));
|
||||
|
||||
/* Set values */
|
||||
Buffer->DeviceType = FILE_DEVICE_DISK;
|
||||
Buffer->Characteristics = Vcb->TargetDeviceObject->Characteristics;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatiQueryVolumeInfo(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
|
||||
@@ -135,13 +154,28 @@ FatiQueryVolumeInfo(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
|
||||
/* Call FsVolumeInfo handler */
|
||||
Status = FatiQueryFsVolumeInfo(Vcb, Buffer, &Length);
|
||||
break;
|
||||
|
||||
case FileFsSizeInformation:
|
||||
/* Call FsVolumeInfo handler */
|
||||
Status = FatiQueryFsSizeInfo(Vcb, Buffer, &Length);
|
||||
break;
|
||||
default:
|
||||
DPRINT1("Volume information class %d is not supported!\n", InfoClass);
|
||||
|
||||
case FileFsDeviceInformation:
|
||||
Status = FatiQueryFsDeviceInfo(Vcb, Buffer, &Length);
|
||||
break;
|
||||
|
||||
case FileFsAttributeInformation:
|
||||
UNIMPLEMENTED;
|
||||
//Status = FatiQueryFsAttributeInfo(IrpContext, Vcb, Buffer, &Length);
|
||||
break;
|
||||
|
||||
case FileFsFullSizeInformation:
|
||||
UNIMPLEMENTED;
|
||||
//Status = FatiQueryFsFullSizeInfo(IrpContext, Vcb, Buffer, &Length);
|
||||
break;
|
||||
|
||||
default:
|
||||
Status = STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* Set IoStatus.Information to amount of filled bytes */
|
||||
@@ -175,11 +209,7 @@ FatQueryVolumeInfo(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||
FsRtlEnterFileSystem();
|
||||
|
||||
/* Set Top Level IRP if not set */
|
||||
if (IoGetTopLevelIrp() == NULL)
|
||||
{
|
||||
IoSetTopLevelIrp(Irp);
|
||||
TopLevel = TRUE;
|
||||
}
|
||||
TopLevel = FatIsTopLevelIrp(Irp);
|
||||
|
||||
/* Build an irp context */
|
||||
IrpContext = FatBuildIrpContext(Irp, CanWait);
|
||||
@@ -228,4 +258,14 @@ FatReadStreamFile(PVCB Vcb,
|
||||
}
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
FatCheckForDismount(IN PFAT_IRP_CONTEXT IrpContext,
|
||||
PVCB Vcb,
|
||||
IN BOOLEAN Force)
|
||||
{
|
||||
/* We never allow deletion of a volume for now */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
||||
@@ -27,7 +27,7 @@ typedef struct _NDIS_M_DRIVER_BLOCK {
|
||||
PDRIVER_OBJECT DriverObject; /* Driver object of miniport */
|
||||
LIST_ENTRY DeviceList; /* Adapters created by miniport */
|
||||
PUNICODE_STRING RegistryPath; /* SCM Registry key */
|
||||
#if !defined(_MSC_VER) && defined(__NDIS_H)
|
||||
#if !defined(_MSC_VER) && defined(_NDIS_)
|
||||
} NDIS_M_DRIVER_BLOCK_COMPATIBILITY_HACK_DONT_USE;
|
||||
#else
|
||||
} NDIS_M_DRIVER_BLOCK, *PNDIS_M_DRIVER_BLOCK;
|
||||
|
||||
+30
-30
@@ -35,7 +35,7 @@ extern "C" {
|
||||
|
||||
typedef struct _ACPI_EVAL_INPUT_BUFFER {
|
||||
ULONG Signature;
|
||||
union {
|
||||
_ANONYMOUS_UNION union {
|
||||
UCHAR MethodName[4];
|
||||
ULONG MethodNameAsUlong;
|
||||
} DUMMYUNIONNAME;
|
||||
@@ -43,7 +43,7 @@ typedef struct _ACPI_EVAL_INPUT_BUFFER {
|
||||
|
||||
typedef struct _ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER {
|
||||
ULONG Signature;
|
||||
union {
|
||||
_ANONYMOUS_UNION union {
|
||||
UCHAR MethodName[4];
|
||||
ULONG MethodNameAsUlong;
|
||||
} DUMMYUNIONNAME;
|
||||
@@ -52,7 +52,7 @@ typedef struct _ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER {
|
||||
|
||||
typedef struct _ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING {
|
||||
ULONG Signature;
|
||||
union {
|
||||
_ANONYMOUS_UNION union {
|
||||
UCHAR MethodName[4];
|
||||
ULONG MethodNameAsUlong;
|
||||
} DUMMYUNIONNAME;
|
||||
@@ -63,7 +63,7 @@ typedef struct _ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING {
|
||||
typedef struct _ACPI_METHOD_ARGUMENT {
|
||||
USHORT Type;
|
||||
USHORT DataLength;
|
||||
union {
|
||||
_ANONYMOUS_UNION union {
|
||||
ULONG Argument;
|
||||
UCHAR Data[ANYSIZE_ARRAY];
|
||||
} DUMMYUNIONNAME;
|
||||
@@ -72,7 +72,7 @@ typedef ACPI_METHOD_ARGUMENT UNALIGNED *PACPI_METHOD_ARGUMENT;
|
||||
|
||||
typedef struct _ACPI_EVAL_INPUT_BUFFER_COMPLEX {
|
||||
ULONG Signature;
|
||||
union {
|
||||
_ANONYMOUS_UNION union {
|
||||
UCHAR MethodName[4];
|
||||
ULONG MethodNameAsUlong;
|
||||
} DUMMYUNIONNAME;
|
||||
@@ -142,47 +142,47 @@ typedef struct _ACPI_ENUM_CHILDREN_OUTPUT_BUFFER {
|
||||
typedef ACPI_ENUM_CHILDREN_OUTPUT_BUFFER UNALIGNED *PACPI_ENUM_CHILDREN_OUTPUT_BUFFER;
|
||||
|
||||
#define ACPI_METHOD_ARGUMENT_LENGTH( DataLength ) \
|
||||
(FIELD_OFFSET(ACPI_METHOD_ARGUMENT, Data) + max(sizeof(ULONG), DataLength))
|
||||
(FIELD_OFFSET(ACPI_METHOD_ARGUMENT, Data) + max(sizeof(ULONG), DataLength))
|
||||
|
||||
#define ACPI_METHOD_ARGUMENT_LENGTH_FROM_ARGUMENT( Argument ) \
|
||||
(ACPI_METHOD_ARGUMENT_LENGTH(((PACPI_METHOD_ARGUMENT)Argument)->DataLength))
|
||||
(ACPI_METHOD_ARGUMENT_LENGTH(((PACPI_METHOD_ARGUMENT)Argument)->DataLength))
|
||||
|
||||
#define ACPI_METHOD_NEXT_ARGUMENT( Argument ) \
|
||||
(PACPI_METHOD_ARGUMENT) ( (PUCHAR) Argument + \
|
||||
ACPI_METHOD_ARGUMENT_LENGTH_FROM_ARGUMENT( Argument ) )
|
||||
(PACPI_METHOD_ARGUMENT) ( (PUCHAR) Argument + \
|
||||
ACPI_METHOD_ARGUMENT_LENGTH_FROM_ARGUMENT( Argument ) )
|
||||
|
||||
|
||||
#define ACPI_METHOD_SET_ARGUMENT_INTEGER( MethodArgument, IntData ) \
|
||||
{ MethodArgument->Type = ACPI_METHOD_ARGUMENT_INTEGER; \
|
||||
MethodArgument->DataLength = sizeof(ULONG); \
|
||||
MethodArgument->Argument = IntData; }
|
||||
{ MethodArgument->Type = ACPI_METHOD_ARGUMENT_INTEGER; \
|
||||
MethodArgument->DataLength = sizeof(ULONG); \
|
||||
MethodArgument->Argument = IntData; }
|
||||
|
||||
#define ACPI_METHOD_SET_ARGUMENT_STRING( Argument, StrData ) \
|
||||
{ Argument->Type = ACPI_METHOD_ARGUMENT_STRING; \
|
||||
Argument->DataLength = strlen((PCHAR)StrData) + sizeof(UCHAR); \
|
||||
RtlCopyMemory(&Argument->Data[0],(PUCHAR)StrData,Argument->DataLength); }
|
||||
{ Argument->Type = ACPI_METHOD_ARGUMENT_STRING; \
|
||||
Argument->DataLength = strlen((PCHAR)StrData) + sizeof(UCHAR); \
|
||||
RtlCopyMemory(&Argument->Data[0],(PUCHAR)StrData,Argument->DataLength); }
|
||||
|
||||
#define ACPI_METHOD_SET_ARGUMENT_BUFFER( Argument, BuffData, BuffLength ) \
|
||||
{ Argument->Type = ACPI_METHOD_ARGUMENT_BUFFER; \
|
||||
Argument->DataLength = BuffLength; \
|
||||
RtlCopyMemory(&Argument->Data[0],(PUCHAR)BuffData,Argument->DataLength); }
|
||||
{ Argument->Type = ACPI_METHOD_ARGUMENT_BUFFER; \
|
||||
Argument->DataLength = BuffLength; \
|
||||
RtlCopyMemory(&Argument->Data[0],(PUCHAR)BuffData,Argument->DataLength); }
|
||||
|
||||
#define ACPI_ENUM_CHILD_LENGTH_FROM_CHILD( Child ) \
|
||||
( (2* sizeof (ULONG)) + Child->NameLength )
|
||||
#define ACPI_ENUM_CHILD_LENGTH_FROM_CHILD( Child ) \
|
||||
( (2* sizeof (ULONG)) + Child->NameLength )
|
||||
|
||||
#define ACPI_ENUM_CHILD_NEXT( Child ) \
|
||||
(PACPI_ENUM_CHILD) ( (PUCHAR) Child + \
|
||||
ACPI_ENUM_CHILD_LENGTH_FROM_CHILD( Child ) )
|
||||
#define ACPI_ENUM_CHILD_NEXT( Child ) \
|
||||
(PACPI_ENUM_CHILD) ( (PUCHAR) Child + \
|
||||
ACPI_ENUM_CHILD_LENGTH_FROM_CHILD( Child ) )
|
||||
|
||||
#define IOCTL_ACPI_ASYNC_EVAL_METHOD CTL_CODE(FILE_DEVICE_ACPI, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
#define IOCTL_ACPI_EVAL_METHOD CTL_CODE(FILE_DEVICE_ACPI, 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
#define IOCTL_ACPI_ACQUIRE_GLOBAL_LOCK CTL_CODE(FILE_DEVICE_ACPI, 4, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
#define IOCTL_ACPI_RELEASE_GLOBAL_LOCK CTL_CODE(FILE_DEVICE_ACPI, 5, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
#define IOCTL_ACPI_ASYNC_EVAL_METHOD CTL_CODE(FILE_DEVICE_ACPI, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
#define IOCTL_ACPI_EVAL_METHOD CTL_CODE(FILE_DEVICE_ACPI, 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
#define IOCTL_ACPI_ACQUIRE_GLOBAL_LOCK CTL_CODE(FILE_DEVICE_ACPI, 4, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
#define IOCTL_ACPI_RELEASE_GLOBAL_LOCK CTL_CODE(FILE_DEVICE_ACPI, 5, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
|
||||
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
||||
#define IOCTL_ACPI_EVAL_METHOD_EX CTL_CODE(FILE_DEVICE_ACPI, 6, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
#define IOCTL_ACPI_ASYNC_EVAL_METHOD_EX CTL_CODE(FILE_DEVICE_ACPI, 7, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
#define IOCTL_ACPI_ENUM_CHILDREN CTL_CODE(FILE_DEVICE_ACPI, 8, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
#define IOCTL_ACPI_EVAL_METHOD_EX CTL_CODE(FILE_DEVICE_ACPI, 6, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
#define IOCTL_ACPI_ASYNC_EVAL_METHOD_EX CTL_CODE(FILE_DEVICE_ACPI, 7, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
#define IOCTL_ACPI_ENUM_CHILDREN CTL_CODE(FILE_DEVICE_ACPI, 8, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -6,15 +6,6 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Helper macro to enable gcc's extension. */
|
||||
#ifndef __GNU_EXTENSION
|
||||
#ifdef __GNUC__
|
||||
#define __GNU_EXTENSION __extension__
|
||||
#else
|
||||
#define __GNU_EXTENSION
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define STDMETHODCALLTYPE __stdcall
|
||||
|
||||
#ifndef _WDMDDK_
|
||||
|
||||
+343
-366
@@ -22,15 +22,6 @@
|
||||
#ifndef _D3DHAL_H_
|
||||
#define _D3DHAL_H_
|
||||
|
||||
/* Helper macro to enable gcc's extension. */
|
||||
#ifndef __GNU_EXTENSION
|
||||
#ifdef __GNUC__
|
||||
#define __GNU_EXTENSION __extension__
|
||||
#else
|
||||
#define __GNU_EXTENSION
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -61,31 +52,31 @@ typedef struct _DDRAWI_DDRAWSURFACE_LCL FAR *LPDDRAWI_DDRAWSURFACE_LCL;
|
||||
* device info structures
|
||||
*/
|
||||
typedef struct _D3DDeviceDesc_V1 {
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
D3DCOLORMODEL dcmColorModel;
|
||||
DWORD dwDevCaps;
|
||||
D3DTRANSFORMCAPS dtcTransformCaps;
|
||||
BOOL bClipping;
|
||||
D3DLIGHTINGCAPS dlcLightingCaps;
|
||||
D3DPRIMCAPS dpcLineCaps;
|
||||
D3DPRIMCAPS dpcTriCaps;
|
||||
DWORD dwDeviceRenderBitDepth;
|
||||
DWORD dwDeviceZBufferBitDepth;
|
||||
DWORD dwMaxBufferSize;
|
||||
DWORD dwMaxVertexCount;
|
||||
} D3DDEVICEDESC_V1,*LPD3DDEVICEDESC_V1;
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
D3DCOLORMODEL dcmColorModel;
|
||||
DWORD dwDevCaps;
|
||||
D3DTRANSFORMCAPS dtcTransformCaps;
|
||||
BOOL bClipping;
|
||||
D3DLIGHTINGCAPS dlcLightingCaps;
|
||||
D3DPRIMCAPS dpcLineCaps;
|
||||
D3DPRIMCAPS dpcTriCaps;
|
||||
DWORD dwDeviceRenderBitDepth;
|
||||
DWORD dwDeviceZBufferBitDepth;
|
||||
DWORD dwMaxBufferSize;
|
||||
DWORD dwMaxVertexCount;
|
||||
} D3DDEVICEDESC_V1, *LPD3DDEVICEDESC_V1;
|
||||
|
||||
/* this is to allow keeping the bulk of our OpenGL code out of x11drv */
|
||||
#define D3DDD_WINE_OPENGL_DEVICE 0x00008000
|
||||
|
||||
typedef struct _D3DHAL_GLOBALDRIVERDATA {
|
||||
DWORD dwSize;
|
||||
D3DDEVICEDESC_V1 hwCaps;
|
||||
DWORD dwNumVertices;
|
||||
DWORD dwNumClipVertices;
|
||||
DWORD dwNumTextureFormats;
|
||||
LPDDSURFACEDESC lpTextureFormats;
|
||||
DWORD dwSize;
|
||||
D3DDEVICEDESC_V1 hwCaps;
|
||||
DWORD dwNumVertices;
|
||||
DWORD dwNumClipVertices;
|
||||
DWORD dwNumTextureFormats;
|
||||
LPDDSURFACEDESC lpTextureFormats;
|
||||
} D3DHAL_GLOBALDRIVERDATA;
|
||||
|
||||
#ifndef D3DHAL_GLOBALDRIVERDATA_DEFINED
|
||||
@@ -94,103 +85,103 @@ typedef D3DHAL_GLOBALDRIVERDATA *LPD3DHAL_GLOBALDRIVERDATA;
|
||||
#endif
|
||||
|
||||
typedef struct _D3DHAL_D3DEXTENDEDCAPS {
|
||||
DWORD dwSize;
|
||||
DWORD dwSize;
|
||||
/* DirectX 5 */
|
||||
DWORD dwMinTextureWidth, dwMaxTextureWidth;
|
||||
DWORD dwMinTextureHeight, dwMaxTextureHeight;
|
||||
DWORD dwMinStippleWidth, dwMaxStippleWidth;
|
||||
DWORD dwMinStippleHeight, dwMaxStippleHeight;
|
||||
DWORD dwMinTextureWidth, dwMaxTextureWidth;
|
||||
DWORD dwMinTextureHeight, dwMaxTextureHeight;
|
||||
DWORD dwMinStippleWidth, dwMaxStippleWidth;
|
||||
DWORD dwMinStippleHeight, dwMaxStippleHeight;
|
||||
/* DirectX 6 */
|
||||
DWORD dwMaxTextureRepeat;
|
||||
DWORD dwMaxTextureAspectRatio;
|
||||
DWORD dwMaxAnisotropy;
|
||||
D3DVALUE dvGuardBandLeft;
|
||||
D3DVALUE dvGuardBandTop;
|
||||
D3DVALUE dvGuardBandRight;
|
||||
D3DVALUE dvGuardBandBottom;
|
||||
D3DVALUE dvExtentsAdjust;
|
||||
DWORD dwStencilCaps;
|
||||
DWORD dwFVFCaps;
|
||||
DWORD dwTextureOpCaps;
|
||||
WORD wMaxTextureBlendStages;
|
||||
WORD wMaxSimultaneousTextures;
|
||||
DWORD dwMaxTextureRepeat;
|
||||
DWORD dwMaxTextureAspectRatio;
|
||||
DWORD dwMaxAnisotropy;
|
||||
D3DVALUE dvGuardBandLeft;
|
||||
D3DVALUE dvGuardBandTop;
|
||||
D3DVALUE dvGuardBandRight;
|
||||
D3DVALUE dvGuardBandBottom;
|
||||
D3DVALUE dvExtentsAdjust;
|
||||
DWORD dwStencilCaps;
|
||||
DWORD dwFVFCaps;
|
||||
DWORD dwTextureOpCaps;
|
||||
WORD wMaxTextureBlendStages;
|
||||
WORD wMaxSimultaneousTextures;
|
||||
/* DirectX 7 */
|
||||
DWORD dwMaxActiveLights;
|
||||
D3DVALUE dvMaxVertexW;
|
||||
WORD wMaxUserClipPlanes;
|
||||
WORD wMaxVertexBlendMatrices;
|
||||
DWORD dwVertexProcessingCaps;
|
||||
DWORD dwReserved1;
|
||||
DWORD dwReserved2;
|
||||
DWORD dwReserved3;
|
||||
DWORD dwReserved4;
|
||||
} D3DHAL_D3DEXTENDEDCAPS,*LPD3DHAL_D3DEXTENDEDCAPS;
|
||||
DWORD dwMaxActiveLights;
|
||||
D3DVALUE dvMaxVertexW;
|
||||
WORD wMaxUserClipPlanes;
|
||||
WORD wMaxVertexBlendMatrices;
|
||||
DWORD dwVertexProcessingCaps;
|
||||
DWORD dwReserved1;
|
||||
DWORD dwReserved2;
|
||||
DWORD dwReserved3;
|
||||
DWORD dwReserved4;
|
||||
} D3DHAL_D3DEXTENDEDCAPS, *LPD3DHAL_D3DEXTENDEDCAPS;
|
||||
|
||||
/*****************************************************************************
|
||||
* d3d->driver callbacks
|
||||
*/
|
||||
typedef struct _D3DHAL_CONTEXTCREATEDATA *LPD3DHAL_CONTEXTCREATEDATA;
|
||||
typedef struct _D3DHAL_CONTEXTDESTROYDATA *LPD3DHAL_CONTEXTDESTROYDATA;
|
||||
typedef struct _D3DHAL_CONTEXTDESTROYALLDATA *LPD3DHAL_CONTEXTDESTROYALLDATA;
|
||||
typedef struct _D3DHAL_SCENECAPTUREDATA *LPD3DHAL_SCENECAPTUREDATA;
|
||||
typedef struct _D3DHAL_RENDERSTATEDATA *LPD3DHAL_RENDERSTATEDATA;
|
||||
typedef struct _D3DHAL_RENDERPRIMITIVEDATA *LPD3DHAL_RENDERPRIMITIVEDATA;
|
||||
typedef struct _D3DHAL_TEXTURECREATEDATA *LPD3DHAL_TEXTURECREATEDATA;
|
||||
typedef struct _D3DHAL_TEXTUREDESTROYDATA *LPD3DHAL_TEXTUREDESTROYDATA;
|
||||
typedef struct _D3DHAL_TEXTURESWAPDATA *LPD3DHAL_TEXTURESWAPDATA;
|
||||
typedef struct _D3DHAL_TEXTUREGETSURFDATA *LPD3DHAL_TEXTUREGETSURFDATA;
|
||||
typedef struct _D3DHAL_GETSTATEDATA *LPD3DHAL_GETSTATEDATA;
|
||||
typedef struct _D3DHAL_CONTEXTCREATEDATA *LPD3DHAL_CONTEXTCREATEDATA;
|
||||
typedef struct _D3DHAL_CONTEXTDESTROYDATA *LPD3DHAL_CONTEXTDESTROYDATA;
|
||||
typedef struct _D3DHAL_CONTEXTDESTROYALLDATA *LPD3DHAL_CONTEXTDESTROYALLDATA;
|
||||
typedef struct _D3DHAL_SCENECAPTUREDATA *LPD3DHAL_SCENECAPTUREDATA;
|
||||
typedef struct _D3DHAL_RENDERSTATEDATA *LPD3DHAL_RENDERSTATEDATA;
|
||||
typedef struct _D3DHAL_RENDERPRIMITIVEDATA *LPD3DHAL_RENDERPRIMITIVEDATA;
|
||||
typedef struct _D3DHAL_TEXTURECREATEDATA *LPD3DHAL_TEXTURECREATEDATA;
|
||||
typedef struct _D3DHAL_TEXTUREDESTROYDATA *LPD3DHAL_TEXTUREDESTROYDATA;
|
||||
typedef struct _D3DHAL_TEXTURESWAPDATA *LPD3DHAL_TEXTURESWAPDATA;
|
||||
typedef struct _D3DHAL_TEXTUREGETSURFDATA *LPD3DHAL_TEXTUREGETSURFDATA;
|
||||
typedef struct _D3DHAL_GETSTATEDATA *LPD3DHAL_GETSTATEDATA;
|
||||
|
||||
typedef DWORD (PASCAL *LPD3DHAL_CONTEXTCREATECB) (LPD3DHAL_CONTEXTCREATEDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_CONTEXTDESTROYCB) (LPD3DHAL_CONTEXTDESTROYDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_CONTEXTDESTROYALLCB)(LPD3DHAL_CONTEXTDESTROYALLDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_SCENECAPTURECB) (LPD3DHAL_SCENECAPTUREDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_RENDERSTATECB) (LPD3DHAL_RENDERSTATEDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_SCENECAPTURECB) (LPD3DHAL_SCENECAPTUREDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_RENDERSTATECB) (LPD3DHAL_RENDERSTATEDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_RENDERPRIMITIVECB) (LPD3DHAL_RENDERPRIMITIVEDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_TEXTURECREATECB) (LPD3DHAL_TEXTURECREATEDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_TEXTUREDESTROYCB) (LPD3DHAL_TEXTUREDESTROYDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_TEXTURESWAPCB) (LPD3DHAL_TEXTURESWAPDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_TEXTURESWAPCB) (LPD3DHAL_TEXTURESWAPDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_TEXTUREGETSURFCB) (LPD3DHAL_TEXTUREGETSURFDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_GETSTATECB) (LPD3DHAL_GETSTATEDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_GETSTATECB) (LPD3DHAL_GETSTATEDATA);
|
||||
|
||||
typedef struct _D3DHAL_CALLBACKS {
|
||||
DWORD dwSize;
|
||||
LPD3DHAL_CONTEXTCREATECB ContextCreate;
|
||||
LPD3DHAL_CONTEXTDESTROYCB ContextDestroy;
|
||||
LPD3DHAL_CONTEXTDESTROYALLCB ContextDestroyAll;
|
||||
LPD3DHAL_SCENECAPTURECB SceneCapture;
|
||||
LPVOID lpReserved10;
|
||||
LPVOID lpReserved11;
|
||||
LPD3DHAL_RENDERSTATECB RenderState;
|
||||
LPD3DHAL_RENDERPRIMITIVECB RenderPrimitive;
|
||||
DWORD dwReserved;
|
||||
LPD3DHAL_TEXTURECREATECB TextureCreate;
|
||||
LPD3DHAL_TEXTUREDESTROYCB TextureDestroy;
|
||||
LPD3DHAL_TEXTURESWAPCB TextureSwap;
|
||||
LPD3DHAL_TEXTUREGETSURFCB TextureGetSurf;
|
||||
DWORD dwSize;
|
||||
LPD3DHAL_CONTEXTCREATECB ContextCreate;
|
||||
LPD3DHAL_CONTEXTDESTROYCB ContextDestroy;
|
||||
LPD3DHAL_CONTEXTDESTROYALLCB ContextDestroyAll;
|
||||
LPD3DHAL_SCENECAPTURECB SceneCapture;
|
||||
LPVOID lpReserved10;
|
||||
LPVOID lpReserved11;
|
||||
LPD3DHAL_RENDERSTATECB RenderState;
|
||||
LPD3DHAL_RENDERPRIMITIVECB RenderPrimitive;
|
||||
DWORD dwReserved;
|
||||
LPD3DHAL_TEXTURECREATECB TextureCreate;
|
||||
LPD3DHAL_TEXTUREDESTROYCB TextureDestroy;
|
||||
LPD3DHAL_TEXTURESWAPCB TextureSwap;
|
||||
LPD3DHAL_TEXTUREGETSURFCB TextureGetSurf;
|
||||
/* now why did MS create CALLBACKS2 and CALLBACKS3 structures if
|
||||
* all these reserved fields were available? we may never know */
|
||||
LPVOID lpReserved12;
|
||||
LPVOID lpReserved13;
|
||||
LPVOID lpReserved14;
|
||||
LPVOID lpReserved15;
|
||||
LPVOID lpReserved16;
|
||||
LPVOID lpReserved17;
|
||||
LPVOID lpReserved18;
|
||||
LPVOID lpReserved19;
|
||||
LPVOID lpReserved20;
|
||||
LPVOID lpReserved21;
|
||||
LPD3DHAL_GETSTATECB GetState;
|
||||
DWORD dwReserved0;
|
||||
DWORD dwReserved1;
|
||||
DWORD dwReserved2;
|
||||
DWORD dwReserved3;
|
||||
DWORD dwReserved4;
|
||||
DWORD dwReserved5;
|
||||
DWORD dwReserved6;
|
||||
DWORD dwReserved7;
|
||||
DWORD dwReserved8;
|
||||
DWORD dwReserved9;
|
||||
LPVOID lpReserved12;
|
||||
LPVOID lpReserved13;
|
||||
LPVOID lpReserved14;
|
||||
LPVOID lpReserved15;
|
||||
LPVOID lpReserved16;
|
||||
LPVOID lpReserved17;
|
||||
LPVOID lpReserved18;
|
||||
LPVOID lpReserved19;
|
||||
LPVOID lpReserved20;
|
||||
LPVOID lpReserved21;
|
||||
LPD3DHAL_GETSTATECB GetState;
|
||||
DWORD dwReserved0;
|
||||
DWORD dwReserved1;
|
||||
DWORD dwReserved2;
|
||||
DWORD dwReserved3;
|
||||
DWORD dwReserved4;
|
||||
DWORD dwReserved5;
|
||||
DWORD dwReserved6;
|
||||
DWORD dwReserved7;
|
||||
DWORD dwReserved8;
|
||||
DWORD dwReserved9;
|
||||
} D3DHAL_CALLBACKS;
|
||||
|
||||
#ifndef D3DHAL_CALLBACKS_DEFINED
|
||||
@@ -198,132 +189,132 @@ typedef D3DHAL_CALLBACKS *LPD3DHAL_CALLBACKS;
|
||||
#define D3DHAL_CALLBACKS_DEFINED
|
||||
#endif
|
||||
|
||||
typedef struct _D3DHAL_SETRENDERTARGETDATA *LPD3DHAL_SETRENDERTARGETDATA;
|
||||
typedef struct _D3DHAL_CLEARDATA *LPD3DHAL_CLEARDATA;
|
||||
typedef struct _D3DHAL_DRAWONEPRIMITIVEDATA *LPD3DHAL_DRAWONEPRIMITIVEDATA;
|
||||
typedef struct _D3DHAL_DRAWONEINDEXEDPRIMITIVEDATA *LPD3DHAL_DRAWONEINDEXEDPRIMITIVEDATA;
|
||||
typedef struct _D3DHAL_DRAWPRIMITIVESDATA *LPD3DHAL_DRAWPRIMITIVESDATA;
|
||||
typedef struct _D3DHAL_SETRENDERTARGETDATA *LPD3DHAL_SETRENDERTARGETDATA;
|
||||
typedef struct _D3DHAL_CLEARDATA *LPD3DHAL_CLEARDATA;
|
||||
typedef struct _D3DHAL_DRAWONEPRIMITIVEDATA *LPD3DHAL_DRAWONEPRIMITIVEDATA;
|
||||
typedef struct _D3DHAL_DRAWONEINDEXEDPRIMITIVEDATA *LPD3DHAL_DRAWONEINDEXEDPRIMITIVEDATA;
|
||||
typedef struct _D3DHAL_DRAWPRIMITIVESDATA *LPD3DHAL_DRAWPRIMITIVESDATA;
|
||||
|
||||
typedef DWORD (PASCAL *LPD3DHAL_SETRENDERTARGETCB) (LPD3DHAL_SETRENDERTARGETDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_CLEARCB) (LPD3DHAL_CLEARDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_DRAWONEPRIMITIVECB) (LPD3DHAL_DRAWONEPRIMITIVEDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_SETRENDERTARGETCB) (LPD3DHAL_SETRENDERTARGETDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_CLEARCB) (LPD3DHAL_CLEARDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_DRAWONEPRIMITIVECB) (LPD3DHAL_DRAWONEPRIMITIVEDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_DRAWONEINDEXEDPRIMITIVECB)(LPD3DHAL_DRAWONEINDEXEDPRIMITIVEDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_DRAWPRIMITIVESCB) (LPD3DHAL_DRAWPRIMITIVESDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_DRAWPRIMITIVESCB) (LPD3DHAL_DRAWPRIMITIVESDATA);
|
||||
|
||||
typedef struct _D3DHAL_CALLBACKS2 {
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
LPD3DHAL_SETRENDERTARGETCB SetRenderTarget;
|
||||
LPD3DHAL_CLEARCB Clear;
|
||||
LPD3DHAL_DRAWONEPRIMITIVECB DrawOnePrimitive;
|
||||
LPD3DHAL_DRAWONEINDEXEDPRIMITIVECB DrawOneIndexedPrimitive;
|
||||
LPD3DHAL_DRAWPRIMITIVESCB DrawPrimitives;
|
||||
} D3DHAL_CALLBACKS2,*LPD3DHAL_CALLBACKS2;
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
LPD3DHAL_SETRENDERTARGETCB SetRenderTarget;
|
||||
LPD3DHAL_CLEARCB Clear;
|
||||
LPD3DHAL_DRAWONEPRIMITIVECB DrawOnePrimitive;
|
||||
LPD3DHAL_DRAWONEINDEXEDPRIMITIVECB DrawOneIndexedPrimitive;
|
||||
LPD3DHAL_DRAWPRIMITIVESCB DrawPrimitives;
|
||||
} D3DHAL_CALLBACKS2, *LPD3DHAL_CALLBACKS2;
|
||||
|
||||
typedef struct _D3DHAL_CLEAR2DATA *LPD3DHAL_CLEAR2DATA;
|
||||
typedef struct _D3DHAL_VALIDATETEXTURESTAGESTATEDATA *LPD3DHAL_VALIDATETEXTURESTAGESTATEDATA;
|
||||
typedef struct _D3DHAL_DRAWPRIMITIVES2DATA *LPD3DHAL_DRAWPRIMITIVES2DATA;
|
||||
typedef struct _D3DHAL_CLEAR2DATA *LPD3DHAL_CLEAR2DATA;
|
||||
typedef struct _D3DHAL_VALIDATETEXTURESTAGESTATEDATA *LPD3DHAL_VALIDATETEXTURESTAGESTATEDATA;
|
||||
typedef struct _D3DHAL_DRAWPRIMITIVES2DATA *LPD3DHAL_DRAWPRIMITIVES2DATA;
|
||||
|
||||
typedef DWORD (PASCAL *LPD3DHAL_CLEAR2CB) (LPD3DHAL_CLEAR2DATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_VALIDATETEXTURESTAGESTATECB)(LPD3DHAL_VALIDATETEXTURESTAGESTATEDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_DRAWPRIMITIVES2CB) (LPD3DHAL_DRAWPRIMITIVES2DATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_CLEAR2CB) (LPD3DHAL_CLEAR2DATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_VALIDATETEXTURESTAGESTATECB) (LPD3DHAL_VALIDATETEXTURESTAGESTATEDATA);
|
||||
typedef DWORD (PASCAL *LPD3DHAL_DRAWPRIMITIVES2CB) (LPD3DHAL_DRAWPRIMITIVES2DATA);
|
||||
|
||||
typedef struct _D3DHAL_CALLBACKS3 {
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
LPD3DHAL_CLEAR2CB Clear2;
|
||||
LPVOID lpvReserved;
|
||||
LPD3DHAL_VALIDATETEXTURESTAGESTATECB ValidateTextureStageState;
|
||||
LPD3DHAL_DRAWPRIMITIVES2CB DrawPrimitives2;
|
||||
} D3DHAL_CALLBACKS3,*LPD3DHAL_CALLBACKS3;
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
LPD3DHAL_CLEAR2CB Clear2;
|
||||
LPVOID lpvReserved;
|
||||
LPD3DHAL_VALIDATETEXTURESTAGESTATECB ValidateTextureStageState;
|
||||
LPD3DHAL_DRAWPRIMITIVES2CB DrawPrimitives2;
|
||||
} D3DHAL_CALLBACKS3, *LPD3DHAL_CALLBACKS3;
|
||||
|
||||
/*****************************************************************************
|
||||
* parameter structures
|
||||
*/
|
||||
typedef struct _D3DHAL_CONTEXTCREATEDATA {
|
||||
union {
|
||||
LPDDRAWI_DIRECTDRAW_GBL lpDDGbl; /* pre-DirectX 7 */
|
||||
LPDDRAWI_DIRECTDRAW_LCL lpDDLcl; /* DirectX 7 */
|
||||
_ANONYMOUS_UNION union {
|
||||
LPDDRAWI_DIRECTDRAW_GBL lpDDGbl; /* pre-DirectX 7 */
|
||||
LPDDRAWI_DIRECTDRAW_LCL lpDDLcl; /* DirectX 7 */
|
||||
} DUMMYUNIONNAME1;
|
||||
union {
|
||||
LPDIRECTDRAWSURFACE lpDDS;
|
||||
LPDDRAWI_DDRAWSURFACE_LCL lpDDSLcl; /* DirectX 7 */
|
||||
_ANONYMOUS_UNION union {
|
||||
LPDIRECTDRAWSURFACE lpDDS;
|
||||
LPDDRAWI_DDRAWSURFACE_LCL lpDDSLcl; /* DirectX 7 */
|
||||
} DUMMYUNIONNAME2;
|
||||
union {
|
||||
LPDIRECTDRAWSURFACE lpDDSZ;
|
||||
LPDDRAWI_DDRAWSURFACE_LCL lpDDSZLcl; /* DirectX 7 */
|
||||
_ANONYMOUS_UNION union {
|
||||
LPDIRECTDRAWSURFACE lpDDSZ;
|
||||
LPDDRAWI_DDRAWSURFACE_LCL lpDDSZLcl; /* DirectX 7 */
|
||||
} DUMMYUNIONNAME3;
|
||||
union {
|
||||
DWORD dwPID;
|
||||
ULONG_PTR dwrstates;
|
||||
_ANONYMOUS_UNION union {
|
||||
DWORD dwPID;
|
||||
ULONG_PTR dwrstates;
|
||||
} DUMMYUNIONNAME4;
|
||||
ULONG_PTR dwhContext;
|
||||
HRESULT ddrval;
|
||||
ULONG_PTR dwhContext;
|
||||
HRESULT ddrval;
|
||||
} D3DHAL_CONTEXTCREATEDATA;
|
||||
|
||||
typedef struct _D3DHAL_CONTEXTDESTROYDATA {
|
||||
ULONG_PTR dwhContext;
|
||||
HRESULT ddrval;
|
||||
ULONG_PTR dwhContext;
|
||||
HRESULT ddrval;
|
||||
} D3DHAL_CONTEXTDESTROYDATA;
|
||||
|
||||
typedef struct _D3DHAL_CONTEXTDESTROYALLDATA {
|
||||
DWORD dwPID;
|
||||
HRESULT ddrval;
|
||||
DWORD dwPID;
|
||||
HRESULT ddrval;
|
||||
} D3DHAL_CONTEXTDESTROYALLDATA;
|
||||
|
||||
typedef struct _D3DHAL_SCENECAPTUREDATA {
|
||||
ULONG_PTR dwhContext;
|
||||
DWORD dwFlag;
|
||||
HRESULT ddrval;
|
||||
ULONG_PTR dwhContext;
|
||||
DWORD dwFlag;
|
||||
HRESULT ddrval;
|
||||
} D3DHAL_SCENECAPTUREDATA;
|
||||
|
||||
#define D3DHAL_SCENE_CAPTURE_START 0x00000000
|
||||
#define D3DHAL_SCENE_CAPTURE_END 0x00000001
|
||||
#define D3DHAL_SCENE_CAPTURE_START 0x00000000
|
||||
#define D3DHAL_SCENE_CAPTURE_END 0x00000001
|
||||
|
||||
typedef struct _D3DHAL_SETRENDERTARGETDATA {
|
||||
ULONG_PTR dwhContext;
|
||||
union {
|
||||
LPDIRECTDRAWSURFACE lpDDS;
|
||||
LPDDRAWI_DDRAWSURFACE_LCL lpDDSLcl;
|
||||
ULONG_PTR dwhContext;
|
||||
_ANONYMOUS_UNION union {
|
||||
LPDIRECTDRAWSURFACE lpDDS;
|
||||
LPDDRAWI_DDRAWSURFACE_LCL lpDDSLcl;
|
||||
} DUMMYUNIONNAME1;
|
||||
union {
|
||||
LPDIRECTDRAWSURFACE lpDDSZ;
|
||||
LPDDRAWI_DDRAWSURFACE_LCL lpDDSZLcl;
|
||||
_ANONYMOUS_UNION union {
|
||||
LPDIRECTDRAWSURFACE lpDDSZ;
|
||||
LPDDRAWI_DDRAWSURFACE_LCL lpDDSZLcl;
|
||||
} DUMMYUNIONNAME2;
|
||||
HRESULT ddrval;
|
||||
HRESULT ddrval;
|
||||
} D3DHAL_SETRENDERTARGETDATA;
|
||||
|
||||
typedef struct _D3DHAL_DRAWPRIMITIVES2DATA {
|
||||
ULONG_PTR dwhContext;
|
||||
DWORD dwFlags;
|
||||
DWORD dwVertexType;
|
||||
LPDDRAWI_DDRAWSURFACE_LCL lpDDCommands;
|
||||
DWORD dwCommandOffset;
|
||||
DWORD dwCommandLength;
|
||||
union {
|
||||
LPDDRAWI_DDRAWSURFACE_LCL lpDDVertex;
|
||||
LPVOID lpVertices;
|
||||
ULONG_PTR dwhContext;
|
||||
DWORD dwFlags;
|
||||
DWORD dwVertexType;
|
||||
LPDDRAWI_DDRAWSURFACE_LCL lpDDCommands;
|
||||
DWORD dwCommandOffset;
|
||||
DWORD dwCommandLength;
|
||||
_ANONYMOUS_UNION union {
|
||||
LPDDRAWI_DDRAWSURFACE_LCL lpDDVertex;
|
||||
LPVOID lpVertices;
|
||||
} DUMMYUNIONNAME1;
|
||||
DWORD dwVertexOffset;
|
||||
DWORD dwVertexLength;
|
||||
DWORD dwReqVertexBufSize;
|
||||
DWORD dwReqCommandBufSize;
|
||||
LPDWORD lpdwRStates;
|
||||
union {
|
||||
DWORD dwVertexSize;
|
||||
HRESULT ddrval;
|
||||
DWORD dwVertexOffset;
|
||||
DWORD dwVertexLength;
|
||||
DWORD dwReqVertexBufSize;
|
||||
DWORD dwReqCommandBufSize;
|
||||
LPDWORD lpdwRStates;
|
||||
_ANONYMOUS_UNION union {
|
||||
DWORD dwVertexSize;
|
||||
HRESULT ddrval;
|
||||
} DUMMYUNIONNAME2;
|
||||
DWORD dwErrorOffset;
|
||||
DWORD dwErrorOffset;
|
||||
} D3DHAL_DRAWPRIMITIVES2DATA;
|
||||
|
||||
#define D3DHALDP2_USERMEMVERTICES 0x00000001
|
||||
#define D3DHALDP2_EXECUTEBUFFER 0x00000002
|
||||
#define D3DHALDP2_SWAPVERTEXBUFFER 0x00000004
|
||||
#define D3DHALDP2_SWAPCOMMANDBUFFER 0x00000008
|
||||
#define D3DHALDP2_REQVERTEXBUFSIZE 0x00000010
|
||||
#define D3DHALDP2_REQCOMMANDBUFSIZE 0x00000020
|
||||
#define D3DHALDP2_VIDMEMVERTEXBUF 0x00000040
|
||||
#define D3DHALDP2_VIDMEMCOMMANDBUF 0x00000080
|
||||
#define D3DHALDP2_USERMEMVERTICES 0x00000001
|
||||
#define D3DHALDP2_EXECUTEBUFFER 0x00000002
|
||||
#define D3DHALDP2_SWAPVERTEXBUFFER 0x00000004
|
||||
#define D3DHALDP2_SWAPCOMMANDBUFFER 0x00000008
|
||||
#define D3DHALDP2_REQVERTEXBUFSIZE 0x00000010
|
||||
#define D3DHALDP2_REQCOMMANDBUFSIZE 0x00000020
|
||||
#define D3DHALDP2_VIDMEMVERTEXBUF 0x00000040
|
||||
#define D3DHALDP2_VIDMEMCOMMANDBUF 0x00000080
|
||||
|
||||
/*****************************************************************************
|
||||
* DrawPrimitives2 command structures
|
||||
@@ -331,50 +322,50 @@ typedef struct _D3DHAL_DRAWPRIMITIVES2DATA {
|
||||
typedef struct _D3DHAL_DP2COMMAND {
|
||||
BYTE bCommand;
|
||||
BYTE bReserved;
|
||||
union {
|
||||
_ANONYMOUS_UNION union {
|
||||
WORD wPrimitiveCount;
|
||||
WORD wStateCount;
|
||||
} DUMMYUNIONNAME;
|
||||
} D3DHAL_DP2COMMAND,*LPD3DHAL_DP2COMMAND;
|
||||
} D3DHAL_DP2COMMAND, *LPD3DHAL_DP2COMMAND;
|
||||
|
||||
typedef enum _D3DHAL_DP2OPERATION {
|
||||
D3DDP2OP_POINTS = 1,
|
||||
D3DDP2OP_INDEXEDLINELIST = 2,
|
||||
D3DDP2OP_INDEXEDTRIANGLELIST = 3,
|
||||
D3DDP2OP_RENDERSTATE = 8,
|
||||
D3DDP2OP_LINELIST = 15,
|
||||
D3DDP2OP_LINESTRIP = 16,
|
||||
D3DDP2OP_INDEXEDLINESTRIP = 17,
|
||||
D3DDP2OP_TRIANGLELIST = 18,
|
||||
D3DDP2OP_TRIANGLESTRIP = 19,
|
||||
D3DDP2OP_INDEXEDTRIANGLESTRIP = 20,
|
||||
D3DDP2OP_TRIANGLEFAN = 21,
|
||||
D3DDP2OP_INDEXEDTRIANGLEFAN = 22,
|
||||
D3DDP2OP_TRIANGLEFAN_IMM = 23,
|
||||
D3DDP2OP_LINELIST_IMM = 24,
|
||||
D3DDP2OP_TEXTURESTAGESTATE = 25,
|
||||
D3DDP2OP_INDEXEDTRIANGLELIST2 = 26,
|
||||
D3DDP2OP_INDEXEDLINELIST2 = 27,
|
||||
D3DDP2OP_VIEWPORTINFO = 28,
|
||||
D3DDP2OP_WINFO = 29,
|
||||
D3DDP2OP_POINTS = 1,
|
||||
D3DDP2OP_INDEXEDLINELIST = 2,
|
||||
D3DDP2OP_INDEXEDTRIANGLELIST = 3,
|
||||
D3DDP2OP_RENDERSTATE = 8,
|
||||
D3DDP2OP_LINELIST = 15,
|
||||
D3DDP2OP_LINESTRIP = 16,
|
||||
D3DDP2OP_INDEXEDLINESTRIP = 17,
|
||||
D3DDP2OP_TRIANGLELIST = 18,
|
||||
D3DDP2OP_TRIANGLESTRIP = 19,
|
||||
D3DDP2OP_INDEXEDTRIANGLESTRIP = 20,
|
||||
D3DDP2OP_TRIANGLEFAN = 21,
|
||||
D3DDP2OP_INDEXEDTRIANGLEFAN = 22,
|
||||
D3DDP2OP_TRIANGLEFAN_IMM = 23,
|
||||
D3DDP2OP_LINELIST_IMM = 24,
|
||||
D3DDP2OP_TEXTURESTAGESTATE = 25,
|
||||
D3DDP2OP_INDEXEDTRIANGLELIST2 = 26,
|
||||
D3DDP2OP_INDEXEDLINELIST2 = 27,
|
||||
D3DDP2OP_VIEWPORTINFO = 28,
|
||||
D3DDP2OP_WINFO = 29,
|
||||
/* pre-DirectX 7 interfaces */
|
||||
D3DDP2OP_SETPALETTE = 30,
|
||||
D3DDP2OP_UPDATEPALETTE = 31,
|
||||
D3DDP2OP_SETPALETTE = 30,
|
||||
D3DDP2OP_UPDATEPALETTE = 31,
|
||||
/* DirectX 7 interfaces */
|
||||
D3DDP2OP_ZRANGE = 32,
|
||||
D3DDP2OP_SETMATERIAL = 33,
|
||||
D3DDP2OP_SETLIGHT = 34,
|
||||
D3DDP2OP_CREATELIGHT = 35,
|
||||
D3DDP2OP_SETTRANSFORM = 36,
|
||||
D3DDP2OP_TEXBLT = 38,
|
||||
D3DDP2OP_STATESET = 39,
|
||||
D3DDP2OP_SETPRIORITY = 40,
|
||||
D3DDP2OP_ZRANGE = 32,
|
||||
D3DDP2OP_SETMATERIAL = 33,
|
||||
D3DDP2OP_SETLIGHT = 34,
|
||||
D3DDP2OP_CREATELIGHT = 35,
|
||||
D3DDP2OP_SETTRANSFORM = 36,
|
||||
D3DDP2OP_TEXBLT = 38,
|
||||
D3DDP2OP_STATESET = 39,
|
||||
D3DDP2OP_SETPRIORITY = 40,
|
||||
/* all interfaces */
|
||||
D3DDP2OP_SETRENDERTARGET = 41,
|
||||
D3DDP2OP_CLEAR = 42,
|
||||
D3DDP2OP_SETRENDERTARGET = 41,
|
||||
D3DDP2OP_CLEAR = 42,
|
||||
/* DirectX 7 interfaces */
|
||||
D3DDP2OP_SETTEXLOD = 43,
|
||||
D3DPP2OP_SETCLIPPLANE = 44,
|
||||
D3DDP2OP_SETTEXLOD = 43,
|
||||
D3DPP2OP_SETCLIPPLANE = 44,
|
||||
#if(DIRECT3D_VERSION >= 0x0800)
|
||||
D3DDP2OP_CREATEVERTEXSHADER = 45,
|
||||
D3DDP2OP_DELETEVERTEXSHADER = 46,
|
||||
@@ -433,84 +424,84 @@ typedef enum _D3DHAL_DP2OPERATION {
|
||||
typedef struct _D3DHAL_POINTS {
|
||||
WORD wCount;
|
||||
WORD wVStart;
|
||||
} D3DHAL_DP2POINTS,*LPD3DHAL_DP2POINTS;
|
||||
} D3DHAL_DP2POINTS, *LPD3DHAL_DP2POINTS;
|
||||
|
||||
/* line primitives */
|
||||
|
||||
typedef struct _D3DHAL_DP2STARTVERTEX {
|
||||
WORD wVStart;
|
||||
} D3DHAL_DP2STARTVERTEX,*LPD3DHAL_DP2STARTVERTEX;
|
||||
} D3DHAL_DP2STARTVERTEX, *LPD3DHAL_DP2STARTVERTEX;
|
||||
|
||||
typedef struct _D3DHAL_DP2LINELIST {
|
||||
WORD wVStart;
|
||||
} D3DHAL_DP2LINELIST,*LPD3DHAL_DP2LINELIST;
|
||||
} D3DHAL_DP2LINELIST, *LPD3DHAL_DP2LINELIST;
|
||||
|
||||
typedef struct _D3DHAL_DP2INDEXEDLINELIST {
|
||||
WORD wV1;
|
||||
WORD wV2;
|
||||
} D3DHAL_DP2INDEXEDLINELIST,*LPD3DHAL_DP2INDEXEDLINELIST;
|
||||
} D3DHAL_DP2INDEXEDLINELIST, *LPD3DHAL_DP2INDEXEDLINELIST;
|
||||
|
||||
typedef struct _D3DHAL_DP2LINESTRIP {
|
||||
WORD wVStart;
|
||||
} D3DHAL_DP2LINESTRIP,*LPD3DHAL_DP2LINESTRIP;
|
||||
} D3DHAL_DP2LINESTRIP, *LPD3DHAL_DP2LINESTRIP;
|
||||
|
||||
typedef struct _D3DHAL_DP2INDEXEDLINESTRIP {
|
||||
WORD wV[2];
|
||||
} D3DHAL_DP2INDEXEDLINESTRIP,*LPD3DHAL_DP2INDEXEDLINESTRIP;
|
||||
} D3DHAL_DP2INDEXEDLINESTRIP, *LPD3DHAL_DP2INDEXEDLINESTRIP;
|
||||
|
||||
/* triangle primitives */
|
||||
|
||||
typedef struct _D3DHAL_DP2TRIANGLELIST {
|
||||
WORD wVStart;
|
||||
} D3DHAL_DP2TRIANGLELIST,*LPD3DHAL_DP2TRIANGLELIST;
|
||||
} D3DHAL_DP2TRIANGLELIST, *LPD3DHAL_DP2TRIANGLELIST;
|
||||
|
||||
typedef struct _D3DHAL_DP2INDEXEDTRIANGLELIST {
|
||||
WORD wV1;
|
||||
WORD wV2;
|
||||
WORD wV3;
|
||||
WORD wFlags;
|
||||
} D3DHAL_DP2INDEXEDTRIANGLELIST,*LPD3DHAL_DP2INDEXEDTRIANGLELIST;
|
||||
} D3DHAL_DP2INDEXEDTRIANGLELIST, *LPD3DHAL_DP2INDEXEDTRIANGLELIST;
|
||||
|
||||
typedef struct _D3DHAL_DP2INDEXEDTRIANGLELIST2 {
|
||||
WORD wV1;
|
||||
WORD wV2;
|
||||
WORD wV3;
|
||||
} D3DHAL_DP2INDEXEDTRIANGLELIST2,*LPD3DHAL_DP2INDEXEDTRIANGLELIST2;
|
||||
} D3DHAL_DP2INDEXEDTRIANGLELIST2, *LPD3DHAL_DP2INDEXEDTRIANGLELIST2;
|
||||
|
||||
typedef struct _D3DHAL_DP2TRIANGLESTRIP {
|
||||
WORD wVStart;
|
||||
} D3DHAL_DP2TRIANGLESTRIP,*LPD3DHAL_DP2TRIANGLESTRIP;
|
||||
} D3DHAL_DP2TRIANGLESTRIP, *LPD3DHAL_DP2TRIANGLESTRIP;
|
||||
|
||||
typedef struct _D3DHAL_DP2INDEXEDTRIANGLESTRIP {
|
||||
WORD wV[3];
|
||||
} D3DHAL_DP2INDEXEDTRIANGLESTRIP,*LPD3DHAL_DP2INDEXEDTRIANGLESTRIP;
|
||||
} D3DHAL_DP2INDEXEDTRIANGLESTRIP, *LPD3DHAL_DP2INDEXEDTRIANGLESTRIP;
|
||||
|
||||
typedef struct _D3DHAL_DP2TRIANGLEFAN {
|
||||
WORD wVStart;
|
||||
} D3DHAL_DP2TRIANGLEFAN,*LPD3DHAL_DP2TRIANGLEFAN;
|
||||
} D3DHAL_DP2TRIANGLEFAN, *LPD3DHAL_DP2TRIANGLEFAN;
|
||||
|
||||
typedef struct _D3DHAL_DP2INDEXEDTRIANGLEFAN {
|
||||
WORD wV[3];
|
||||
} D3DHAL_DP2INDEXEDTRIANGLEFAN,*LPD3DHAL_DP2INDEXEDTRIANGLEFAN;
|
||||
} D3DHAL_DP2INDEXEDTRIANGLEFAN, *LPD3DHAL_DP2INDEXEDTRIANGLEFAN;
|
||||
|
||||
typedef struct _D3DHAL_DP2TRIANGLEFAN_IMM {
|
||||
DWORD dwEdgeFlags;
|
||||
} D3DHAL_DP2TRIANGLEFAN_IMM,*LPD3DHAL_DP2TRIANGLEFAN_IMM;
|
||||
} D3DHAL_DP2TRIANGLEFAN_IMM, *LPD3DHAL_DP2TRIANGLEFAN_IMM;
|
||||
|
||||
/* render states */
|
||||
typedef struct _D3DHAL_DP2RENDERSTATE {
|
||||
D3DRENDERSTATETYPE RenderState;
|
||||
union {
|
||||
D3DRENDERSTATETYPE RenderState;
|
||||
_ANONYMOUS_UNION union {
|
||||
D3DVALUE dvState;
|
||||
DWORD dwState;
|
||||
} DUMMYUNIONNAME;
|
||||
} D3DHAL_DP2RENDERSTATE,*LPD3DHAL_DP2RENDERSTATE;
|
||||
} D3DHAL_DP2RENDERSTATE, *LPD3DHAL_DP2RENDERSTATE;
|
||||
|
||||
typedef struct _D3DHAL_DP2TEXTURESTAGESTATE {
|
||||
WORD wStage;
|
||||
WORD TSState;
|
||||
WORD wStage;
|
||||
WORD TSState;
|
||||
DWORD dwValue;
|
||||
} D3DHAL_DP2TEXTURESTAGESTATE,*LPD3DHAL_DP2TEXTURESTAGESTATE;
|
||||
} D3DHAL_DP2TEXTURESTAGESTATE, *LPD3DHAL_DP2TEXTURESTAGESTATE;
|
||||
|
||||
#define D3DTSS_TEXTUREMAP 0
|
||||
|
||||
@@ -519,49 +510,49 @@ typedef struct _D3DHAL_DP2VIEWPORTINFO {
|
||||
DWORD dwY;
|
||||
DWORD dwWidth;
|
||||
DWORD dwHeight;
|
||||
} D3DHAL_DP2VIEWPORTINFO,*LPD3DHAL_DP2VIEWPORTINFO;
|
||||
} D3DHAL_DP2VIEWPORTINFO, *LPD3DHAL_DP2VIEWPORTINFO;
|
||||
|
||||
typedef struct _D3DHAL_DP2WINFO {
|
||||
D3DVALUE dwWNear;
|
||||
D3DVALUE dwWFar;
|
||||
} D3DHAL_DP2WINFO,*LPD3DHAL_DP2WINFO;
|
||||
} D3DHAL_DP2WINFO, *LPD3DHAL_DP2WINFO;
|
||||
|
||||
typedef struct _D3DHAL_DP2SETPALETTE {
|
||||
DWORD dwPaletteHandle;
|
||||
DWORD dwPaletteFlags;
|
||||
DWORD dwSurfaceHandle;
|
||||
} D3DHAL_DP2SETPALETTE,*LPD3DHAL_DP2SETPALETTE;
|
||||
} D3DHAL_DP2SETPALETTE, *LPD3DHAL_DP2SETPALETTE;
|
||||
|
||||
typedef struct _D3DHAL_DP2UPDATEPALETTE {
|
||||
DWORD dwPaletteHandle;
|
||||
WORD wStartIndex;
|
||||
WORD wNumEntries;
|
||||
} D3DHAL_DP2UPDATEPALETTE,*LPD3DHAL_DP2UPDATEPALETTE;
|
||||
WORD wStartIndex;
|
||||
WORD wNumEntries;
|
||||
} D3DHAL_DP2UPDATEPALETTE, *LPD3DHAL_DP2UPDATEPALETTE;
|
||||
|
||||
typedef struct _D3DHAL_DP2ZRANGE {
|
||||
D3DVALUE dvMinZ;
|
||||
D3DVALUE dvMaxZ;
|
||||
} D3DHAL_DP2ZRANGE,*LPD3DHAL_DP2ZRANGE;
|
||||
} D3DHAL_DP2ZRANGE, *LPD3DHAL_DP2ZRANGE;
|
||||
|
||||
typedef D3DMATERIAL7 D3DHAL_DP2SETMATERIAL,*LPD3DHAL_DP2SETMATERIAL;
|
||||
|
||||
typedef struct _D3DHAL_DP2SETLIGHT {
|
||||
DWORD dwIndex;
|
||||
DWORD dwDataType;
|
||||
} D3DHAL_DP2SETLIGHT,*LPD3DHAL_DP2SETLIGHT;
|
||||
} D3DHAL_DP2SETLIGHT, *LPD3DHAL_DP2SETLIGHT;
|
||||
|
||||
#define D3DHAL_SETLIGHT_ENABLE 0
|
||||
#define D3DHAL_SETLIGHT_DISABLE 1
|
||||
#define D3DHAL_SETLIGHT_DATA 2
|
||||
#define D3DHAL_SETLIGHT_ENABLE 0
|
||||
#define D3DHAL_SETLIGHT_DISABLE 1
|
||||
#define D3DHAL_SETLIGHT_DATA 2
|
||||
|
||||
typedef struct _D3DHAL_DP2CREATELIGHT {
|
||||
DWORD dwIndex;
|
||||
} D3DHAL_DP2CREATELIGHT,*LPD3DHAL_DP2CREATELIGHT;
|
||||
} D3DHAL_DP2CREATELIGHT, *LPD3DHAL_DP2CREATELIGHT;
|
||||
|
||||
typedef struct _D3DHAL_DP2SETTRANSFORM {
|
||||
D3DTRANSFORMSTATETYPE xfrmType;
|
||||
D3DMATRIX matrix;
|
||||
} D3DHAL_DP2SETTRANSFORM,*LPD3DHAL_DP2SETTRANSFORM;
|
||||
D3DTRANSFORMSTATETYPE xfrmType;
|
||||
D3DMATRIX matrix;
|
||||
} D3DHAL_DP2SETTRANSFORM, *LPD3DHAL_DP2SETTRANSFORM;
|
||||
|
||||
typedef struct _D3DHAL_DP2TEXBLT {
|
||||
DWORD dwDDDestSurface;
|
||||
@@ -569,72 +560,72 @@ typedef struct _D3DHAL_DP2TEXBLT {
|
||||
POINT pDest;
|
||||
RECTL rSrc;
|
||||
DWORD dwFlags;
|
||||
} D3DHAL_DP2TEXBLT,*LPD3DHAL_DP2TEXBLT;
|
||||
} D3DHAL_DP2TEXBLT, *LPD3DHAL_DP2TEXBLT;
|
||||
|
||||
typedef struct _D3DHAL_DP2STATESET {
|
||||
DWORD dwOperation;
|
||||
DWORD dwParam;
|
||||
D3DSTATEBLOCKTYPE sbType;
|
||||
} D3DHAL_DP2STATESET,*LPD3DHAL_DP2STATESET;
|
||||
DWORD dwOperation;
|
||||
DWORD dwParam;
|
||||
D3DSTATEBLOCKTYPE sbType;
|
||||
} D3DHAL_DP2STATESET, *LPD3DHAL_DP2STATESET;
|
||||
|
||||
#define D3DHAL_STATESETBEGIN 0
|
||||
#define D3DHAL_STATESETEND 1
|
||||
#define D3DHAL_STATESETDELETE 2
|
||||
#define D3DHAL_STATESETEXECUTE 3
|
||||
#define D3DHAL_STATESETCAPTURE 4
|
||||
#define D3DHAL_STATESETBEGIN 0
|
||||
#define D3DHAL_STATESETEND 1
|
||||
#define D3DHAL_STATESETDELETE 2
|
||||
#define D3DHAL_STATESETEXECUTE 3
|
||||
#define D3DHAL_STATESETCAPTURE 4
|
||||
|
||||
typedef struct _D3DHAL_DP2SETPRIORITY {
|
||||
DWORD dwDDSurface;
|
||||
DWORD dwPriority;
|
||||
} D3DHAL_DP2SETPRIORITY,*LPD3DHAL_DP2SETPRIORITY;
|
||||
} D3DHAL_DP2SETPRIORITY, *LPD3DHAL_DP2SETPRIORITY;
|
||||
|
||||
typedef struct _D3DHAL_DP2SETRENDERTARGET {
|
||||
DWORD hRenderTarget;
|
||||
DWORD hZBuffer;
|
||||
} D3DHAL_DP2SETRENDERTARGET,*LPD3DHAL_DP2SETRENDERTARGET;
|
||||
} D3DHAL_DP2SETRENDERTARGET, *LPD3DHAL_DP2SETRENDERTARGET;
|
||||
|
||||
typedef struct _D3DHAL_DP2CLEAR {
|
||||
DWORD dwFlags;
|
||||
DWORD dwFillColor;
|
||||
D3DVALUE dvFillDepth;
|
||||
DWORD dwFillStencil;
|
||||
RECT Rects[1];
|
||||
} D3DHAL_DP2CLEAR,*LPD3DHAL_DP2CLEAR;
|
||||
DWORD dwFlags;
|
||||
DWORD dwFillColor;
|
||||
D3DVALUE dvFillDepth;
|
||||
DWORD dwFillStencil;
|
||||
RECT Rects[1];
|
||||
} D3DHAL_DP2CLEAR, *LPD3DHAL_DP2CLEAR;
|
||||
|
||||
typedef struct _D3DHAL_DP2SETTEXLOD {
|
||||
DWORD dwDDSurface;
|
||||
DWORD dwLOD;
|
||||
} D3DHAL_DP2SETTEXLOD,*LPD3DHAL_DP2SETTEXLOD;
|
||||
|
||||
} D3DHAL_DP2SETTEXLOD, *LPD3DHAL_DP2SETTEXLOD;
|
||||
|
||||
#if (DIRECT3D_VERSION >= 0x0900)
|
||||
|
||||
#define DX9_DDI_VERSION 4
|
||||
#define DX9_DDI_VERSION 4
|
||||
|
||||
#ifndef D3DVTXPCAPS_NO_VSDT_UBYTE4
|
||||
#define D3DVTXPCAPS_NO_VSDT_UBYTE4 0x00000080
|
||||
#define D3DVTXPCAPS_NO_VSDT_UBYTE4 0x00000080
|
||||
#endif
|
||||
|
||||
#define D3DPMISCCAPS_LINEPATTERNREP 0x00000004
|
||||
#ifndef D3DPMISCCAPS_LINEPATTERNREP
|
||||
#define D3DPMISCCAPS_LINEPATTERNREP 0x00000004
|
||||
#endif
|
||||
|
||||
#define D3DDEVCAPS_HWVERTEXBUFFER 0x02000000
|
||||
#define D3DDEVCAPS_HWINDEXBUFFER 0x04000000
|
||||
#define D3DDEVCAPS_SUBVOLUMELOCK 0x08000000
|
||||
#define D3DDEVCAPS_HWVERTEXBUFFER 0x02000000
|
||||
#define D3DDEVCAPS_HWINDEXBUFFER 0x04000000
|
||||
#define D3DDEVCAPS_SUBVOLUMELOCK 0x08000000
|
||||
|
||||
#ifndef D3DPMISCCAPS_FOGINFVF
|
||||
#define D3DPMISCCAPS_FOGINFVF 0x00002000
|
||||
#define D3DPMISCCAPS_FOGINFVF 0x00002000
|
||||
#endif
|
||||
|
||||
#ifndef D3DFVF_FOG
|
||||
#define D3DFVF_FOG 0x00002000
|
||||
#define D3DFVF_FOG 0x00002000
|
||||
#endif
|
||||
|
||||
typedef struct _DD_GETDRIVERINFO2DATA
|
||||
{
|
||||
DWORD dwReserved;
|
||||
DWORD dwMagic;
|
||||
DWORD dwType;
|
||||
DWORD dwExpectedSize;
|
||||
typedef struct _DD_GETDRIVERINFO2DATA {
|
||||
DWORD dwReserved;
|
||||
DWORD dwMagic;
|
||||
DWORD dwType;
|
||||
DWORD dwExpectedSize;
|
||||
} DD_GETDRIVERINFO2DATA;
|
||||
|
||||
/**
|
||||
@@ -642,19 +633,19 @@ typedef struct _DD_GETDRIVERINFO2DATA
|
||||
* D3DGDI2_MAGIC to see if the passed GUID is GUID_GetDriverInfo2
|
||||
* or a GUID_DDStereoMode.
|
||||
*/
|
||||
#define GUID_GetDriverInfo2 GUID_DDStereoMode
|
||||
#define GUID_GetDriverInfo2 GUID_DDStereoMode
|
||||
|
||||
/**
|
||||
* Magic number used in DD_GETDRIVERINFO2DATA.dwHeight when
|
||||
* GUID_GetDriverInfo2/GUID_DDStereoMode is specified in a
|
||||
* GetDriverInfo call.
|
||||
*/
|
||||
#define D3DGDI2_MAGIC 0xFFFFFFFF
|
||||
#define D3DGDI2_MAGIC 0xFFFFFFFF
|
||||
|
||||
#define D3DGDI2_TYPE_GETD3DCAPS8 0x00000001
|
||||
#define D3DGDI2_TYPE_GETFORMATCOUNT 0x00000002
|
||||
#define D3DGDI2_TYPE_GETFORMAT 0x00000003
|
||||
#define D3DGDI2_TYPE_DXVERSION 0x00000004 /* Make driver aware of currently used DirectX version */
|
||||
#define D3DGDI2_TYPE_DXVERSION 0x00000004 /* Make driver aware of currently used DirectX version */
|
||||
#define D3DGDI2_TYPE_GETD3DCAPS9 0x00000010
|
||||
#define D3DGDI2_TYPE_GETEXTENDEDMODECOUNT 0x00000011
|
||||
#define D3DGDI2_TYPE_GETEXTENDEDMODE 0x00000012
|
||||
@@ -665,10 +656,9 @@ typedef struct _DD_GETDRIVERINFO2DATA
|
||||
#define D3DGDI2_TYPE_DEFER_AGP_FREES 0x00000020
|
||||
#define D3DGDI2_TYPE_GETD3DQUERYCOUNT 0x00000021
|
||||
#define D3DGDI2_TYPE_GETD3DQUERY 0x00000022
|
||||
#define D3DGDI2_TYPE_GETDDIVERSION 0x00000023 /* Returns DX9_DDI_VERSION, used to check which DDK version the driver is compiled against */
|
||||
#define D3DGDI2_TYPE_GETDDIVERSION 0x00000023 /* Returns DX9_DDI_VERSION, used to check which DDK version the driver is compiled against */
|
||||
|
||||
typedef struct _D3DCAPS8
|
||||
{
|
||||
typedef struct _D3DCAPS8 {
|
||||
D3DDEVTYPE DeviceType;
|
||||
UINT AdapterOrdinal;
|
||||
DWORD Caps;
|
||||
@@ -724,90 +714,77 @@ typedef struct _D3DCAPS8
|
||||
float MaxPixelShaderValue;
|
||||
} D3DCAPS8;
|
||||
|
||||
typedef struct _DD_GETFORMATCOUNTDATA
|
||||
{
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwFormatCount;
|
||||
DWORD dwReserved;
|
||||
typedef struct _DD_GETFORMATCOUNTDATA {
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwFormatCount;
|
||||
DWORD dwReserved;
|
||||
} DD_GETFORMATCOUNTDATA;
|
||||
|
||||
typedef struct _DD_GETFORMATDATA
|
||||
{
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwFormatIndex;
|
||||
DDPIXELFORMAT format;
|
||||
typedef struct _DD_GETFORMATDATA {
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwFormatIndex;
|
||||
DDPIXELFORMAT format;
|
||||
} DD_GETFORMATDATA;
|
||||
|
||||
typedef struct _DD_DXVERSION
|
||||
{
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwDXVersion;
|
||||
DWORD dwReserved;
|
||||
typedef struct _DD_DXVERSION {
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwDXVersion;
|
||||
DWORD dwReserved;
|
||||
} DD_DXVERSION;
|
||||
|
||||
typedef struct _DD_DEFERRED_AGP_AWARE_DATA
|
||||
{
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
typedef struct _DD_DEFERRED_AGP_AWARE_DATA {
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
} DD_DEFERRED_AGP_AWARE_DATA;
|
||||
|
||||
typedef struct _DD_FREE_DEFERRED_AGP_DATA
|
||||
{
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwProcessId;
|
||||
typedef struct _DD_FREE_DEFERRED_AGP_DATA {
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwProcessId;
|
||||
} DD_FREE_DEFERRED_AGP_DATA;
|
||||
|
||||
typedef struct _DD_GETEXTENDEDMODECOUNTDATA
|
||||
{
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwModeCount;
|
||||
DWORD dwReserved;
|
||||
typedef struct _DD_GETEXTENDEDMODECOUNTDATA {
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwModeCount;
|
||||
DWORD dwReserved;
|
||||
} DD_GETEXTENDEDMODECOUNTDATA;
|
||||
|
||||
typedef struct _DD_GETEXTENDEDMODEDATA
|
||||
{
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwModeIndex;
|
||||
D3DDISPLAYMODE mode;
|
||||
typedef struct _DD_GETEXTENDEDMODEDATA {
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwModeIndex;
|
||||
D3DDISPLAYMODE mode;
|
||||
} DD_GETEXTENDEDMODEDATA;
|
||||
|
||||
typedef struct _DD_GETADAPTERGROUPDATA
|
||||
{
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
ULONG_PTR ulUniqueAdapterGroupId;
|
||||
DWORD dwReserved1;
|
||||
DWORD dwReserved2;
|
||||
typedef struct _DD_GETADAPTERGROUPDATA {
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
ULONG_PTR ulUniqueAdapterGroupId;
|
||||
DWORD dwReserved1;
|
||||
DWORD dwReserved2;
|
||||
} DD_GETADAPTERGROUPDATA;
|
||||
|
||||
typedef struct _DD_MULTISAMPLEQUALITYLEVELSDATA
|
||||
{
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
D3DFORMAT Format;
|
||||
BOOL bFlip : 1;
|
||||
D3DMULTISAMPLE_TYPE MSType : 31;
|
||||
DWORD QualityLevels;
|
||||
typedef struct _DD_MULTISAMPLEQUALITYLEVELSDATA {
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
D3DFORMAT Format;
|
||||
WINBOOL bFlip : 1;
|
||||
D3DMULTISAMPLE_TYPE MSType : 31;
|
||||
DWORD QualityLevels;
|
||||
} DD_MULTISAMPLEQUALITYLEVELSDATA;
|
||||
|
||||
typedef struct _DD_GETD3DQUERYCOUNTDATA
|
||||
{
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwNumQueries;
|
||||
typedef struct _DD_GETD3DQUERYCOUNTDATA {
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwNumQueries;
|
||||
} DD_GETD3DQUERYCOUNTDATA;
|
||||
|
||||
typedef struct _DD_GETD3DQUERYDATA
|
||||
{
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
__GNU_EXTENSION union
|
||||
{
|
||||
DWORD dwQueryIndex;
|
||||
D3DQUERYTYPE QueryType;
|
||||
};
|
||||
typedef struct _DD_GETD3DQUERYDATA {
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
__GNU_EXTENSION union {
|
||||
DWORD dwQueryIndex;
|
||||
D3DQUERYTYPE QueryType;
|
||||
};
|
||||
} DD_GETD3DQUERYDATA;
|
||||
|
||||
typedef struct _DD_GETDDIVERSIONDATA
|
||||
{
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwDXVersion;
|
||||
DWORD dwDDIVersion;
|
||||
typedef struct _DD_GETDDIVERSIONDATA {
|
||||
DD_GETDRIVERINFO2DATA gdi2;
|
||||
DWORD dwDXVersion;
|
||||
DWORD dwDDIVersion;
|
||||
} DD_GETDDIVERSIONDATA;
|
||||
|
||||
#endif /* (DIRECT3D_VERSION >= 0x0900) */
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
|
||||
|
||||
#ifndef _D3DHALEX_H
|
||||
#define _D3DHALEX_H
|
||||
|
||||
#define D3DGDI_IS_GDI2(pData) ((((DD_GETDRIVERINFO2DATA*)(pData->lpvData))->dwMagic) == D3DGDI2_MAGIC)
|
||||
#define D3DGDI_IS_STEREOMODE(pData) ((((DD_STEREOMODE*) (pData->lpvData))->dwHeight) != D3DGDI2_MAGIC)
|
||||
#define D3DGDI_GET_GDI2_DATA(pData) (D3DGDI_IS_GDI2(pData) ? (((DD_GETDRIVERINFO2DATA*)(pData->lpvData))) : NULL)
|
||||
#define D3DGDI_GET_STEREOMODE_DATA(pData) (D3DGDI_IS_STEREOMODE(pData) ? (((DD_STEREOMODE*)(pData->lpvData))) : NULL)
|
||||
|
||||
#endif
|
||||
#endif /* _D3DHALEX_H */
|
||||
|
||||
@@ -1,272 +0,0 @@
|
||||
/*
|
||||
* Direct3D NT driver interface
|
||||
*/
|
||||
|
||||
#ifndef __DDK_D3DNTHAL_H
|
||||
#define __DDK_D3DNTHAL_H
|
||||
|
||||
#include <ddrawint.h>
|
||||
#include <d3dtypes.h>
|
||||
#include <d3dcaps.h>
|
||||
|
||||
/* Helper macro to enable gcc's extension. */
|
||||
#ifndef __GNU_EXTENSION
|
||||
#ifdef __GNUC__
|
||||
#define __GNU_EXTENSION __extension__
|
||||
#else
|
||||
#define __GNU_EXTENSION
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
DEFINE_GUID(GUID_D3DCallbacks, 0x7BF06990, 0x8794, 0x11D0, 0x91, 0x39, 0x08, 0x00, 0x36, 0xD2, 0xEF, 0x02);
|
||||
DEFINE_GUID(GUID_D3DCallbacks3, 0xDDF41230, 0xEC0A, 0x11D0, 0xA9, 0xB6, 0x00, 0xAA, 0x00, 0xC0, 0x99, 0x3E);
|
||||
DEFINE_GUID(GUID_D3DExtendedCaps, 0x7DE41F80, 0x9D93, 0x11D0, 0x89, 0xAB, 0x00, 0xA0, 0xC9, 0x05, 0x41, 0x29);
|
||||
DEFINE_GUID(GUID_D3DParseUnknownCommandCallback, 0x2E04FFA0, 0x98E4, 0x11D1, 0x8C, 0xE1, 0x00, 0xA0, 0xC9, 0x06, 0x29, 0xA8);
|
||||
DEFINE_GUID(GUID_ZPixelFormats, 0x93869880, 0x36CF, 0x11D1, 0x9B, 0x1B, 0x00, 0xAA, 0x00, 0xBB, 0xB8, 0xAE);
|
||||
DEFINE_GUID(GUID_DDStereoMode, 0xF828169C, 0xA8E8, 0x11D2, 0xA1, 0xF2, 0x00, 0xA0, 0xC9, 0x83, 0xEA, 0xF6);
|
||||
|
||||
typedef struct _D3DNTHAL_CONTEXTCREATEDATA
|
||||
{
|
||||
__GNU_EXTENSION union
|
||||
{
|
||||
PDD_DIRECTDRAW_GLOBAL lpDDGbl;
|
||||
PDD_DIRECTDRAW_LOCAL lpDDLcl;
|
||||
};
|
||||
__GNU_EXTENSION union
|
||||
{
|
||||
PDD_SURFACE_LOCAL lpDDS;
|
||||
PDD_SURFACE_LOCAL lpDDSLcl;
|
||||
};
|
||||
__GNU_EXTENSION union
|
||||
{
|
||||
PDD_SURFACE_LOCAL lpDDSZ;
|
||||
PDD_SURFACE_LOCAL lpDDSZLcl;
|
||||
};
|
||||
DWORD dwPID;
|
||||
ULONG_PTR dwhContext;
|
||||
HRESULT ddrval;
|
||||
} D3DNTHAL_CONTEXTCREATEDATA, *LPD3DNTHAL_CONTEXTCREATEDATA;
|
||||
|
||||
typedef struct _D3DNTHAL_CONTEXTDESTROYDATA
|
||||
{
|
||||
ULONG_PTR dwhContext;
|
||||
HRESULT ddrval;
|
||||
} D3DNTHAL_CONTEXTDESTROYDATA, *LPD3DNTHAL_CONTEXTDESTROYDATA;
|
||||
|
||||
typedef struct _D3DNTHAL_CONTEXTDESTROYALLDATA
|
||||
{
|
||||
DWORD dwPID;
|
||||
HRESULT ddrval;
|
||||
} D3DNTHAL_CONTEXTDESTROYALLDATA, *LPD3DNTHAL_CONTEXTDESTROYALLDATA;
|
||||
|
||||
typedef struct _D3DNTHAL_SCENECAPTUREDATA
|
||||
{
|
||||
ULONG_PTR dwhContext;
|
||||
DWORD dwFlag;
|
||||
HRESULT ddrval;
|
||||
} D3DNTHAL_SCENECAPTUREDATA, *LPD3DNTHAL_SCENECAPTUREDATA;
|
||||
|
||||
typedef struct _D3DNTHAL_TEXTURECREATEDATA
|
||||
{
|
||||
ULONG_PTR dwhContext;
|
||||
HANDLE hDDS;
|
||||
ULONG_PTR dwHandle;
|
||||
HRESULT ddrval;
|
||||
} D3DNTHAL_TEXTURECREATEDATA, *LPD3DNTHAL_TEXTURECREATEDATA;
|
||||
|
||||
typedef struct _D3DNTHAL_TEXTUREDESTROYDATA
|
||||
{
|
||||
ULONG_PTR dwhContext;
|
||||
ULONG_PTR dwHandle;
|
||||
HRESULT ddrval;
|
||||
} D3DNTHAL_TEXTUREDESTROYDATA, *LPD3DNTHAL_TEXTUREDESTROYDATA;
|
||||
|
||||
typedef struct _D3DNTHAL_TEXTURESWAPDATA
|
||||
{
|
||||
ULONG_PTR dwhContext;
|
||||
ULONG_PTR dwHandle1;
|
||||
ULONG_PTR dwHandle2;
|
||||
HRESULT ddrval;
|
||||
} D3DNTHAL_TEXTURESWAPDATA, *LPD3DNTHAL_TEXTURESWAPDATA;
|
||||
|
||||
typedef struct _D3DNTHAL_TEXTUREGETSURFDATA
|
||||
{
|
||||
ULONG_PTR dwhContext;
|
||||
HANDLE hDDS;
|
||||
ULONG_PTR dwHandle;
|
||||
HRESULT ddrval;
|
||||
} D3DNTHAL_TEXTUREGETSURFDATA, *LPD3DNTHAL_TEXTUREGETSURFDATA;
|
||||
|
||||
typedef DWORD (APIENTRY *LPD3DNTHAL_CONTEXTCREATECB)(LPD3DNTHAL_CONTEXTCREATEDATA);
|
||||
typedef DWORD (APIENTRY *LPD3DNTHAL_CONTEXTDESTROYCB)(LPD3DNTHAL_CONTEXTDESTROYDATA);
|
||||
typedef DWORD (APIENTRY *LPD3DNTHAL_CONTEXTDESTROYALLCB)(LPD3DNTHAL_CONTEXTDESTROYALLDATA);
|
||||
typedef DWORD (APIENTRY *LPD3DNTHAL_SCENECAPTURECB)(LPD3DNTHAL_SCENECAPTUREDATA);
|
||||
typedef DWORD (APIENTRY *LPD3DNTHAL_TEXTURECREATECB)(LPD3DNTHAL_TEXTURECREATEDATA);
|
||||
typedef DWORD (APIENTRY *LPD3DNTHAL_TEXTUREDESTROYCB)(LPD3DNTHAL_TEXTUREDESTROYDATA);
|
||||
typedef DWORD (APIENTRY *LPD3DNTHAL_TEXTURESWAPCB)(LPD3DNTHAL_TEXTURESWAPDATA);
|
||||
typedef DWORD (APIENTRY *LPD3DNTHAL_TEXTUREGETSURFCB)(LPD3DNTHAL_TEXTUREGETSURFDATA);
|
||||
|
||||
typedef struct _D3DNTHALDeviceDesc_V1
|
||||
{
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
D3DCOLORMODEL dcmColorModel;
|
||||
DWORD dwDevCaps;
|
||||
D3DTRANSFORMCAPS dtcTransformCaps;
|
||||
BOOL bClipping;
|
||||
D3DLIGHTINGCAPS dlcLightingCaps;
|
||||
D3DPRIMCAPS dpcLineCaps;
|
||||
D3DPRIMCAPS dpcTriCaps;
|
||||
DWORD dwDeviceRenderBitDepth;
|
||||
DWORD dwDeviceZBufferBitDepth;
|
||||
DWORD dwMaxBufferSize;
|
||||
DWORD dwMaxVertexCount;
|
||||
} D3DNTHALDEVICEDESC_V1, *LPD3DNTHALDEVICEDESC_V1;
|
||||
|
||||
typedef struct _D3DNTHAL_GLOBALDRIVERDATA
|
||||
{
|
||||
DWORD dwSize;
|
||||
D3DNTHALDEVICEDESC_V1 hwCaps;
|
||||
DWORD dwNumVertices;
|
||||
DWORD dwNumClipVertices;
|
||||
DWORD dwNumTextureFormats;
|
||||
LPDDSURFACEDESC lpTextureFormats;
|
||||
} D3DNTHAL_GLOBALDRIVERDATA, *LPD3DNTHAL_GLOBALDRIVERDATA;
|
||||
|
||||
typedef struct _D3DNTHAL_CALLBACKS
|
||||
{
|
||||
DWORD dwSize;
|
||||
LPD3DNTHAL_CONTEXTCREATECB ContextCreate;
|
||||
LPD3DNTHAL_CONTEXTDESTROYCB ContextDestroy;
|
||||
LPD3DNTHAL_CONTEXTDESTROYALLCB ContextDestroyAll;
|
||||
LPD3DNTHAL_SCENECAPTURECB SceneCapture;
|
||||
LPVOID dwReserved10;
|
||||
LPVOID dwReserved11;
|
||||
LPVOID dwReserved22;
|
||||
LPVOID dwReserved23;
|
||||
ULONG_PTR dwReserved;
|
||||
LPD3DNTHAL_TEXTURECREATECB TextureCreate;
|
||||
LPD3DNTHAL_TEXTUREDESTROYCB TextureDestroy;
|
||||
LPD3DNTHAL_TEXTURESWAPCB TextureSwap;
|
||||
LPD3DNTHAL_TEXTUREGETSURFCB TextureGetSurf;
|
||||
LPVOID dwReserved12;
|
||||
LPVOID dwReserved13;
|
||||
LPVOID dwReserved14;
|
||||
LPVOID dwReserved15;
|
||||
LPVOID dwReserved16;
|
||||
LPVOID dwReserved17;
|
||||
LPVOID dwReserved18;
|
||||
LPVOID dwReserved19;
|
||||
LPVOID dwReserved20;
|
||||
LPVOID dwReserved21;
|
||||
LPVOID dwReserved24;
|
||||
ULONG_PTR dwReserved0;
|
||||
ULONG_PTR dwReserved1;
|
||||
ULONG_PTR dwReserved2;
|
||||
ULONG_PTR dwReserved3;
|
||||
ULONG_PTR dwReserved4;
|
||||
ULONG_PTR dwReserved5;
|
||||
ULONG_PTR dwReserved6;
|
||||
ULONG_PTR dwReserved7;
|
||||
ULONG_PTR dwReserved8;
|
||||
ULONG_PTR dwReserved9;
|
||||
} D3DNTHAL_CALLBACKS, *LPD3DNTHAL_CALLBACKS;
|
||||
|
||||
|
||||
typedef struct _D3DNTHAL_SETRENDERTARGETDATA
|
||||
{
|
||||
ULONG_PTR dwhContext;
|
||||
PDD_SURFACE_LOCAL lpDDS;
|
||||
PDD_SURFACE_LOCAL lpDDSZ;
|
||||
HRESULT ddrval;
|
||||
} D3DNTHAL_SETRENDERTARGETDATA;
|
||||
typedef D3DNTHAL_SETRENDERTARGETDATA *LPD3DNTHAL_SETRENDERTARGETDATA;
|
||||
|
||||
typedef DWORD (APIENTRY *LPD3DNTHAL_SETRENDERTARGETCB)(LPD3DNTHAL_SETRENDERTARGETDATA);
|
||||
|
||||
|
||||
typedef struct _D3DNTHAL_CALLBACKS2
|
||||
{
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
|
||||
LPD3DNTHAL_SETRENDERTARGETCB SetRenderTarget;
|
||||
LPVOID dwReserved1;
|
||||
LPVOID dwReserved2;
|
||||
LPVOID dwReserved3;
|
||||
LPVOID dwReserved4;
|
||||
} D3DNTHAL_CALLBACKS2, *LPD3DNTHAL_CALLBACKS2;
|
||||
|
||||
|
||||
typedef struct _D3DNTHAL_CLEAR2DATA
|
||||
{
|
||||
ULONG_PTR dwhContext;
|
||||
DWORD dwFlags;
|
||||
DWORD dwFillColor;
|
||||
D3DVALUE dvFillDepth;
|
||||
DWORD dwFillStencil;
|
||||
LPD3DRECT lpRects;
|
||||
DWORD dwNumRects;
|
||||
HRESULT ddrval;
|
||||
} D3DNTHAL_CLEAR2DATA;
|
||||
typedef D3DNTHAL_CLEAR2DATA FAR *LPD3DNTHAL_CLEAR2DATA;
|
||||
|
||||
typedef struct _D3DNTHAL_VALIDATETEXTURESTAGESTATEDATA
|
||||
{
|
||||
ULONG_PTR dwhContext;
|
||||
DWORD dwFlags;
|
||||
ULONG_PTR dwReserved;
|
||||
DWORD dwNumPasses;
|
||||
HRESULT ddrval;
|
||||
} D3DNTHAL_VALIDATETEXTURESTAGESTATEDATA, FAR *LPD3DNTHAL_VALIDATETEXTURESTAGESTATEDATA;
|
||||
|
||||
typedef struct _D3DNTHAL_DRAWPRIMITIVES2DATA
|
||||
{
|
||||
ULONG_PTR dwhContext;
|
||||
DWORD dwFlags;
|
||||
DWORD dwVertexType;
|
||||
PDD_SURFACE_LOCAL lpDDCommands;
|
||||
DWORD dwCommandOffset;
|
||||
DWORD dwCommandLength;
|
||||
__GNU_EXTENSION union
|
||||
{
|
||||
PDD_SURFACE_LOCAL lpDDVertex;
|
||||
LPVOID lpVertices;
|
||||
};
|
||||
DWORD dwVertexOffset;
|
||||
DWORD dwVertexLength;
|
||||
DWORD dwReqVertexBufSize;
|
||||
DWORD dwReqCommandBufSize;
|
||||
LPDWORD lpdwRStates;
|
||||
__GNU_EXTENSION union
|
||||
{
|
||||
DWORD dwVertexSize;
|
||||
HRESULT ddrval;
|
||||
};
|
||||
DWORD dwErrorOffset;
|
||||
} D3DNTHAL_DRAWPRIMITIVES2DATA, FAR *LPD3DNTHAL_DRAWPRIMITIVES2DATA;
|
||||
|
||||
typedef DWORD (APIENTRY *LPD3DNTHAL_CLEAR2CB)(LPD3DNTHAL_CLEAR2DATA);
|
||||
typedef DWORD (APIENTRY *LPD3DNTHAL_VALIDATETEXTURESTAGESTATECB)(LPD3DNTHAL_VALIDATETEXTURESTAGESTATEDATA);
|
||||
typedef DWORD (APIENTRY *LPD3DNTHAL_DRAWPRIMITIVES2CB)(LPD3DNTHAL_DRAWPRIMITIVES2DATA);
|
||||
|
||||
typedef struct _D3DNTHAL_CALLBACKS3
|
||||
{
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
|
||||
LPD3DNTHAL_CLEAR2CB Clear2;
|
||||
LPVOID lpvReserved;
|
||||
LPD3DNTHAL_VALIDATETEXTURESTAGESTATECB ValidateTextureStageState;
|
||||
LPD3DNTHAL_DRAWPRIMITIVES2CB DrawPrimitives2;
|
||||
} D3DNTHAL_CALLBACKS3, *LPD3DNTHAL_CALLBACKS3;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* __DDK_D3DNTHAL_H */
|
||||
@@ -1,97 +0,0 @@
|
||||
/* $Id$
|
||||
*
|
||||
* COPYRIGHT: This file is in the public domain.
|
||||
* PROJECT: ReactOS kernel
|
||||
* FILE:
|
||||
* PURPOSE: Directx headers
|
||||
* PROGRAMMER: Magnus Olsen (greatlrd)
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __DDKM_INCLUDED__
|
||||
#define __DDKM_INCLUDED__
|
||||
|
||||
#if defined (_WIN32) && !defined (_NO_COM)
|
||||
DEFINE_GUID (IID_IDirectDrawKernel, 0x8D56C120,0x6A08,0x11D0,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8);
|
||||
DEFINE_GUID (IID_IDirectDrawSurfaceKernel, 0x60755DA0,0x6A40,0x11D0,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8);
|
||||
#endif
|
||||
|
||||
typedef struct _DDKERNELCAPS
|
||||
{
|
||||
DWORD dwSize;
|
||||
DWORD dwCaps;
|
||||
DWORD dwIRQCaps;
|
||||
} DDKERNELCAPS, *LPDDKERNELCAPS;
|
||||
|
||||
#define DDKERNELCAPS_SKIPFIELDS 0x00000001
|
||||
#define DDKERNELCAPS_AUTOFLIP 0x00000002
|
||||
#define DDKERNELCAPS_SETSTATE 0x00000004
|
||||
#define DDKERNELCAPS_LOCK 0x00000008
|
||||
#define DDKERNELCAPS_FLIPVIDEOPORT 0x00000010
|
||||
#define DDKERNELCAPS_FLIPOVERLAY 0x00000020
|
||||
#define DDKERNELCAPS_CAPTURE_SYSMEM 0x00000040
|
||||
#define DDKERNELCAPS_CAPTURE_NONLOCALVIDMEM 0x00000080
|
||||
#define DDKERNELCAPS_FIELDPOLARITY 0x00000100
|
||||
#define DDKERNELCAPS_CAPTURE_INVERTED 0x00000200
|
||||
#define DDIRQ_DISPLAY_VSYNC 0x00000001
|
||||
#define DDIRQ_RESERVED1 0x00000002
|
||||
#define DDIRQ_VPORT0_VSYNC 0x00000004
|
||||
#define DDIRQ_VPORT0_LINE 0x00000008
|
||||
#define DDIRQ_VPORT1_VSYNC 0x00000010
|
||||
#define DDIRQ_VPORT1_LINE 0x00000020
|
||||
#define DDIRQ_VPORT2_VSYNC 0x00000040
|
||||
#define DDIRQ_VPORT2_LINE 0x00000080
|
||||
#define DDIRQ_VPORT3_VSYNC 0x00000100
|
||||
#define DDIRQ_VPORT3_LINE 0x00000200
|
||||
#define DDIRQ_VPORT4_VSYNC 0x00000400
|
||||
#define DDIRQ_VPORT4_LINE 0x00000800
|
||||
#define DDIRQ_VPORT5_VSYNC 0x00001000
|
||||
#define DDIRQ_VPORT5_LINE 0x00002000
|
||||
#define DDIRQ_VPORT6_VSYNC 0x00004000
|
||||
#define DDIRQ_VPORT6_LINE 0x00008000
|
||||
#define DDIRQ_VPORT7_VSYNC 0x00010000
|
||||
#define DDIRQ_VPORT7_LINE 0x00020000
|
||||
#define DDIRQ_VPORT8_VSYNC 0x00040000
|
||||
#define DDIRQ_VPORT8_LINE 0x00080000
|
||||
#define DDIRQ_VPORT9_VSYNC 0x00010000
|
||||
#define DDIRQ_VPORT9_LINE 0x00020000
|
||||
|
||||
typedef struct IDirectDrawKernel* LPDIRECTDRAWKERNEL;
|
||||
typedef struct IDirectDrawSurfaceKernel* LPDIRECTDRAWSURFACEKERNEL;
|
||||
|
||||
#if defined(_WIN32) && !defined(_NO_COM)
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirectDrawKernel
|
||||
DECLARE_INTERFACE_ (IDirectDrawKernel, IUnknown)
|
||||
{
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
STDMETHOD(GetKernelHandle) (THIS_ ULONG*) PURE;
|
||||
STDMETHOD(ReleaseKernelHandle) (THIS) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirectDrawSurfaceKernel
|
||||
DECLARE_INTERFACE_ (IDirectDrawSurfaceKernel, IUnknown)
|
||||
{
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
STDMETHOD(GetKernelHandle) (THIS_ ULONG*) PURE;
|
||||
STDMETHOD(ReleaseKernelHandle) (THIS) PURE;
|
||||
};
|
||||
|
||||
#undef INTERFACE
|
||||
#endif // defined(_WIN32) && !defined(_NO_COM)
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+142
-170
@@ -7,33 +7,30 @@
|
||||
typedef LONGLONG REFERENCE_TIME;
|
||||
#endif
|
||||
|
||||
typedef struct _DMUS_KERNEL_EVENT
|
||||
{
|
||||
BYTE bReserved;
|
||||
BYTE cbStruct;
|
||||
USHORT cbEvent;
|
||||
USHORT usChannelGroup;
|
||||
USHORT usFlags;
|
||||
REFERENCE_TIME ullPresTime100ns;
|
||||
ULONGLONG ullBytePosition;
|
||||
struct _DMUS_KERNEL_EVENT *pNextEvt;
|
||||
union
|
||||
{
|
||||
BYTE abData[sizeof(PBYTE)];
|
||||
PBYTE pbData;
|
||||
struct _DMUS_KERNEL_EVENT *pPackageEvt;
|
||||
}uData;
|
||||
}DMUS_KERNEL_EVENT, *PDMUS_KERNEL_EVENT;
|
||||
typedef struct _DMUS_KERNEL_EVENT {
|
||||
BYTE bReserved;
|
||||
BYTE cbStruct;
|
||||
USHORT cbEvent;
|
||||
USHORT usChannelGroup;
|
||||
USHORT usFlags;
|
||||
REFERENCE_TIME ullPresTime100ns;
|
||||
ULONGLONG ullBytePosition;
|
||||
struct _DMUS_KERNEL_EVENT *pNextEvt;
|
||||
union {
|
||||
BYTE abData[sizeof(PBYTE)];
|
||||
PBYTE pbData;
|
||||
struct _DMUS_KERNEL_EVENT *pPackageEvt;
|
||||
} uData;
|
||||
} DMUS_KERNEL_EVENT, *PDMUS_KERNEL_EVENT;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DMUS_STREAM_MIDI_INVALID = -1,
|
||||
DMUS_STREAM_MIDI_RENDER = 0,
|
||||
DMUS_STREAM_MIDI_CAPTURE,
|
||||
DMUS_STREAM_WAVE_SINK
|
||||
}DMUS_STREAM_TYPE;
|
||||
typedef enum {
|
||||
DMUS_STREAM_MIDI_INVALID = -1,
|
||||
DMUS_STREAM_MIDI_RENDER = 0,
|
||||
DMUS_STREAM_MIDI_CAPTURE,
|
||||
DMUS_STREAM_WAVE_SINK
|
||||
} DMUS_STREAM_TYPE;
|
||||
|
||||
DEFINE_GUID(CLSID_MiniportDriverDMusUART, 0xd3f0ce1c, 0xFFFC, 0x11D1, 0x81, 0xB0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xC1);
|
||||
DEFINE_GUID(CLSID_MiniportDriverDMusUART, 0xd3f0ce1c, 0xFFFC, 0x11D1, 0x81, 0xB0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xC1);
|
||||
DEFINE_GUID(CLSID_MiniportDriverDMusUARTCapture, 0xD3F0CE1D, 0xFFFC, 0x11D1, 0x81, 0xB0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xC1);
|
||||
|
||||
/* ===============================================================
|
||||
@@ -43,21 +40,20 @@ DEFINE_GUID(CLSID_MiniportDriverDMusUARTCapture, 0xD3F0CE1D, 0xFFFC, 0x11D1, 0x8
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IMasterClock
|
||||
|
||||
DECLARE_INTERFACE_(IMasterClock,IUnknown)
|
||||
{
|
||||
DEFINE_ABSTRACT_UNKNOWN()
|
||||
DECLARE_INTERFACE_(IMasterClock,IUnknown) {
|
||||
DEFINE_ABSTRACT_UNKNOWN()
|
||||
|
||||
STDMETHOD_(NTSTATUS,GetTime)( THIS_
|
||||
OUT REFERENCE_TIME * pTime
|
||||
) PURE;
|
||||
STDMETHOD_(NTSTATUS,GetTime)( THIS_
|
||||
OUT REFERENCE_TIME *pTime
|
||||
) PURE;
|
||||
};
|
||||
|
||||
typedef IMasterClock *PMASTERCLOCK;
|
||||
|
||||
#define IMP_IMasterClock \
|
||||
STDMETHODIMP_(NTSTATUS) GetTime( \
|
||||
OUT REFERENCE_TIME * pTime \
|
||||
)
|
||||
#define IMP_IMasterClock \
|
||||
STDMETHODIMP_(NTSTATUS) GetTime( \
|
||||
OUT REFERENCE_TIME *pTime \
|
||||
)
|
||||
|
||||
/* ===============================================================
|
||||
IMXF Interface
|
||||
@@ -70,46 +66,32 @@ struct IMXF;
|
||||
typedef struct IMXF *PMXF;
|
||||
|
||||
#define DEFINE_ABSTRACT_IMXF() \
|
||||
STDMETHOD_(NTSTATUS,SetState)(THIS_ \
|
||||
IN KSSTATE State \
|
||||
) PURE; \
|
||||
STDMETHOD_(NTSTATUS,PutMessage) \
|
||||
( THIS_ \
|
||||
IN PDMUS_KERNEL_EVENT pDMKEvt \
|
||||
) PURE; \
|
||||
STDMETHOD_(NTSTATUS,ConnectOutput) \
|
||||
( THIS_ \
|
||||
IN PMXF sinkMXF \
|
||||
) PURE; \
|
||||
STDMETHOD_(NTSTATUS,DisconnectOutput) \
|
||||
( THIS_ \
|
||||
IN PMXF sinkMXF \
|
||||
) PURE;
|
||||
STDMETHOD_(NTSTATUS,SetState)(THIS_ \
|
||||
IN KSSTATE State \
|
||||
) PURE; \
|
||||
STDMETHOD_(NTSTATUS,PutMessage)(THIS_ \
|
||||
IN PDMUS_KERNEL_EVENT pDMKEvt \
|
||||
) PURE; \
|
||||
STDMETHOD_(NTSTATUS,ConnectOutput)(THIS_ \
|
||||
IN PMXF sinkMXF \
|
||||
) PURE; \
|
||||
STDMETHOD_(NTSTATUS,DisconnectOutput)(THIS_ \
|
||||
IN PMXF sinkMXF \
|
||||
) PURE;
|
||||
|
||||
#define IMP_IMXF \
|
||||
STDMETHODIMP_(NTSTATUS) SetState \
|
||||
( \
|
||||
IN KSSTATE State \
|
||||
); \
|
||||
STDMETHODIMP_(NTSTATUS) PutMessage \
|
||||
( THIS_ \
|
||||
IN PDMUS_KERNEL_EVENT pDMKEvt \
|
||||
); \
|
||||
STDMETHODIMP_(NTSTATUS) ConnectOutput \
|
||||
( THIS_ \
|
||||
IN PMXF sinkMXF \
|
||||
); \
|
||||
STDMETHODIMP_(NTSTATUS) DisconnectOutput \
|
||||
( THIS_ \
|
||||
IN PMXF sinkMXF \
|
||||
)
|
||||
#define IMP_IMXF \
|
||||
STDMETHODIMP_(NTSTATUS) SetState ( \
|
||||
IN KSSTATE State); \
|
||||
STDMETHODIMP_(NTSTATUS) PutMessage (THIS_ \
|
||||
IN PDMUS_KERNEL_EVENT pDMKEvt); \
|
||||
STDMETHODIMP_(NTSTATUS) ConnectOutput (THIS_ \
|
||||
IN PMXF sinkMXF); \
|
||||
STDMETHODIMP_(NTSTATUS) DisconnectOutput (THIS_ \
|
||||
IN PMXF sinkMXF)
|
||||
|
||||
|
||||
DECLARE_INTERFACE_(IMXF,IUnknown)
|
||||
{
|
||||
DEFINE_ABSTRACT_UNKNOWN()
|
||||
|
||||
DEFINE_ABSTRACT_IMXF()
|
||||
DECLARE_INTERFACE_(IMXF,IUnknown) {
|
||||
DEFINE_ABSTRACT_UNKNOWN()
|
||||
DEFINE_ABSTRACT_IMXF()
|
||||
};
|
||||
|
||||
/* ===============================================================
|
||||
@@ -123,47 +105,43 @@ struct IAllocatorMXF;
|
||||
typedef struct IAllocatorMXF *PAllocatorMXF;
|
||||
|
||||
#define STATIC_IID_IAllocatorMXF\
|
||||
0xa5f0d62c, 0xb30f, 0x11d2, 0xb7, 0xa3, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1
|
||||
0xa5f0d62c, 0xb30f, 0x11d2, 0xb7, 0xa3, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1
|
||||
DEFINE_GUIDSTRUCT("a5f0d62c-b30f-11d2-b7a3-0060083316c1", IID_IAllocatorMXF);
|
||||
#define IID_IAllocatorMXF DEFINE_GUIDNAMED(IID_IAllocatorMXF)
|
||||
|
||||
|
||||
DECLARE_INTERFACE_(IAllocatorMXF, IMXF)
|
||||
{
|
||||
DEFINE_ABSTRACT_UNKNOWN()
|
||||
DECLARE_INTERFACE_(IAllocatorMXF, IMXF) {
|
||||
DEFINE_ABSTRACT_UNKNOWN()
|
||||
|
||||
DEFINE_ABSTRACT_IMXF()
|
||||
DEFINE_ABSTRACT_IMXF()
|
||||
|
||||
STDMETHOD_(NTSTATUS,GetMessage)(THIS_
|
||||
OUT PDMUS_KERNEL_EVENT * ppDMKEvt
|
||||
) PURE;
|
||||
STDMETHOD_(NTSTATUS,GetMessage)(THIS_
|
||||
OUT PDMUS_KERNEL_EVENT *ppDMKEvt
|
||||
) PURE;
|
||||
|
||||
STDMETHOD_(USHORT,GetBufferSize)(THIS) PURE;
|
||||
STDMETHOD_(USHORT,GetBufferSize)(THIS) PURE;
|
||||
|
||||
STDMETHOD_(NTSTATUS,GetBuffer)(THIS_
|
||||
OUT PBYTE * ppBuffer
|
||||
)PURE;
|
||||
STDMETHOD_(NTSTATUS,GetBuffer)(THIS_
|
||||
OUT PBYTE *ppBuffer
|
||||
)PURE;
|
||||
|
||||
STDMETHOD_(NTSTATUS,PutBuffer)(THIS_
|
||||
IN PBYTE pBuffer
|
||||
) PURE;
|
||||
STDMETHOD_(NTSTATUS,PutBuffer)(THIS_
|
||||
IN PBYTE pBuffer
|
||||
) PURE;
|
||||
};
|
||||
|
||||
#define IMP_IAllocatorMXF \
|
||||
IMP_IMXF; \
|
||||
STDMETHODIMP_(NTSTATUS) GetMessage( \
|
||||
OUT PDMUS_KERNEL_EVENT * ppDMKEvt \
|
||||
); \
|
||||
\
|
||||
STDMETHODIMP_(USHORT) GetBufferSize(void); \
|
||||
\
|
||||
STDMETHODIMP_(NTSTATUS) GetBuffer( \
|
||||
OUT PBYTE * ppBuffer \
|
||||
); \
|
||||
\
|
||||
STDMETHODIMP_(NTSTATUS) PutBuffer( \
|
||||
IN PBYTE pBuffer \
|
||||
)
|
||||
#define IMP_IAllocatorMXF \
|
||||
IMP_IMXF; \
|
||||
STDMETHODIMP_(NTSTATUS) GetMessage( \
|
||||
OUT PDMUS_KERNEL_EVENT *ppDMKEvt); \
|
||||
\
|
||||
STDMETHODIMP_(USHORT) GetBufferSize(void); \
|
||||
\
|
||||
STDMETHODIMP_(NTSTATUS) GetBuffer( \
|
||||
OUT PBYTE *ppBuffer); \
|
||||
\
|
||||
STDMETHODIMP_(NTSTATUS) PutBuffer( \
|
||||
IN PBYTE pBuffer)
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IPortDMus
|
||||
@@ -171,91 +149,85 @@ DECLARE_INTERFACE_(IAllocatorMXF, IMXF)
|
||||
DEFINE_GUID(IID_IPortDMus, 0xc096df9c, 0xfb09, 0x11d1, 0x81, 0xb0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1);
|
||||
DEFINE_GUID(CLSID_PortDMus, 0xb7902fe9, 0xfb0a, 0x11d1, 0x81, 0xb0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1);
|
||||
|
||||
DECLARE_INTERFACE_(IPortDMus, IPort)
|
||||
{
|
||||
DEFINE_ABSTRACT_UNKNOWN()
|
||||
DECLARE_INTERFACE_(IPortDMus, IPort) {
|
||||
DEFINE_ABSTRACT_UNKNOWN()
|
||||
|
||||
DEFINE_ABSTRACT_PORT()
|
||||
DEFINE_ABSTRACT_PORT()
|
||||
|
||||
STDMETHOD_(void,Notify)(THIS_
|
||||
IN PSERVICEGROUP ServiceGroup OPTIONAL
|
||||
)PURE;
|
||||
STDMETHOD_(void,Notify)(THIS_
|
||||
IN PSERVICEGROUP ServiceGroup OPTIONAL
|
||||
) PURE;
|
||||
|
||||
STDMETHOD_(void,RegisterServiceGroup)(THIS_
|
||||
IN PSERVICEGROUP ServiceGroup
|
||||
) PURE;
|
||||
STDMETHOD_(void,RegisterServiceGroup)(THIS_
|
||||
IN PSERVICEGROUP ServiceGroup
|
||||
) PURE;
|
||||
};
|
||||
typedef IPortDMus *PPORTDMUS;
|
||||
|
||||
#define IMP_IPortDMus \
|
||||
IMP_IPort; \
|
||||
STDMETHODIMP_(void) Notify( \
|
||||
IN PSERVICEGROUP ServiceGroup OPTIONAL \
|
||||
); \
|
||||
\
|
||||
STDMETHODIMP_(void) RegisterServiceGroup( \
|
||||
IN PSERVICEGROUP ServiceGroup \
|
||||
)
|
||||
#define IMP_IPortDMus \
|
||||
IMP_IPort; \
|
||||
STDMETHODIMP_(void) Notify( \
|
||||
IN PSERVICEGROUP ServiceGroup OPTIONAL); \
|
||||
\
|
||||
STDMETHODIMP_(void) RegisterServiceGroup( \
|
||||
IN PSERVICEGROUP ServiceGroup)
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IMiniportDMus
|
||||
|
||||
DEFINE_GUID(IID_IMiniportDMus, 0xc096df9d, 0xfb09, 0x11d1, 0x81, 0xb0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1);
|
||||
DECLARE_INTERFACE_(IMiniportDMus, IMiniport)
|
||||
{
|
||||
DEFINE_ABSTRACT_UNKNOWN()
|
||||
|
||||
DEFINE_ABSTRACT_MINIPORT()
|
||||
|
||||
DECLARE_INTERFACE_(IMiniportDMus, IMiniport) {
|
||||
DEFINE_ABSTRACT_UNKNOWN()
|
||||
|
||||
STDMETHOD_(NTSTATUS,Init)(THIS_
|
||||
IN PUNKNOWN UnknownAdapter,
|
||||
IN PRESOURCELIST ResourceList,
|
||||
IN PPORTDMUS Port,
|
||||
OUT PSERVICEGROUP * ServiceGroup
|
||||
) PURE;
|
||||
DEFINE_ABSTRACT_MINIPORT()
|
||||
|
||||
STDMETHOD_(void,Service)(THIS) PURE;
|
||||
STDMETHOD_(NTSTATUS,Init)(THIS_
|
||||
IN PUNKNOWN UnknownAdapter,
|
||||
IN PRESOURCELIST ResourceList,
|
||||
IN PPORTDMUS Port,
|
||||
OUT PSERVICEGROUP *ServiceGroup
|
||||
) PURE;
|
||||
|
||||
STDMETHOD_(NTSTATUS,NewStream)(THIS_
|
||||
OUT PMXF * MXF,
|
||||
IN PUNKNOWN OuterUnknown OPTIONAL,
|
||||
IN POOL_TYPE PoolType,
|
||||
IN ULONG PinID,
|
||||
IN DMUS_STREAM_TYPE StreamType,
|
||||
IN PKSDATAFORMAT DataFormat,
|
||||
OUT PSERVICEGROUP * ServiceGroup,
|
||||
IN PAllocatorMXF AllocatorMXF,
|
||||
IN PMASTERCLOCK MasterClock,
|
||||
OUT PULONGLONG SchedulePreFetch
|
||||
) PURE;
|
||||
STDMETHOD_(void,Service)(THIS) PURE;
|
||||
|
||||
STDMETHOD_(NTSTATUS,NewStream)(THIS_
|
||||
OUT PMXF *MXF,
|
||||
IN PUNKNOWN OuterUnknown OPTIONAL,
|
||||
IN POOL_TYPE PoolType,
|
||||
IN ULONG PinID,
|
||||
IN DMUS_STREAM_TYPE StreamType,
|
||||
IN PKSDATAFORMAT DataFormat,
|
||||
OUT PSERVICEGROUP *ServiceGroup,
|
||||
IN PAllocatorMXF AllocatorMXF,
|
||||
IN PMASTERCLOCK MasterClock,
|
||||
OUT PULONGLONG SchedulePreFetch
|
||||
) PURE;
|
||||
};
|
||||
|
||||
typedef IMiniportDMus *PMINIPORTDMUS;
|
||||
#undef INTERFACE
|
||||
|
||||
#define IMP_IMiniportDMus \
|
||||
IMP_IMiniport; \
|
||||
STDMETHODIMP_(NTSTATUS) Init( \
|
||||
IN PUNKNOWN UnknownAdapter, \
|
||||
IN PRESOURCELIST ResourceList, \
|
||||
IN PPORTDMUS Port, \
|
||||
OUT PSERVICEGROUP * ServiceGroup \
|
||||
); \
|
||||
\
|
||||
STDMETHODIMP_(void) Service(THIS); \
|
||||
\
|
||||
STDMETHODIMP_(NTSTATUS) NewStream( \
|
||||
OUT PMXF * MXF, \
|
||||
IN PUNKNOWN OuterUnknown, \
|
||||
IN POOL_TYPE PoolType, \
|
||||
IN ULONG PinID, \
|
||||
IN DMUS_STREAM_TYPE StreamType, \
|
||||
IN PKSDATAFORMAT DataFormat, \
|
||||
OUT PSERVICEGROUP * ServiceGroup, \
|
||||
IN PAllocatorMXF AllocatorMXF, \
|
||||
IN PMASTERCLOCK MasterClock, \
|
||||
OUT PULONGLONG SchedulePreFetch \
|
||||
)
|
||||
#define IMP_IMiniportDMus \
|
||||
IMP_IMiniport; \
|
||||
STDMETHODIMP_(NTSTATUS) Init( \
|
||||
IN PUNKNOWN UnknownAdapter, \
|
||||
IN PRESOURCELIST ResourceList, \
|
||||
IN PPORTDMUS Port, \
|
||||
OUT PSERVICEGROUP *ServiceGroup); \
|
||||
\
|
||||
STDMETHODIMP_(void) Service(THIS); \
|
||||
\
|
||||
STDMETHODIMP_(NTSTATUS) NewStream( \
|
||||
OUT PMXF *MXF, \
|
||||
IN PUNKNOWN OuterUnknown, \
|
||||
IN POOL_TYPE PoolType, \
|
||||
IN ULONG PinID, \
|
||||
IN DMUS_STREAM_TYPE StreamType, \
|
||||
IN PKSDATAFORMAT DataFormat, \
|
||||
OUT PSERVICEGROUP *ServiceGroup, \
|
||||
IN PAllocatorMXF AllocatorMXF, \
|
||||
IN PMASTERCLOCK MasterClock, \
|
||||
OUT PULONGLONG SchedulePreFetch)
|
||||
|
||||
#endif
|
||||
#endif /* _DMUSICKS_ */
|
||||
|
||||
@@ -1,4 +1,2 @@
|
||||
|
||||
/* This are empty and is left for be compatible with building some older windows nt4/2000/2003/XP drivers */
|
||||
|
||||
|
||||
|
||||
+44
-51
@@ -8,19 +8,17 @@
|
||||
#ifndef DRMK_H
|
||||
#define DRMK_H
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD Flags;
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
PFILE_OBJECT FileObject;
|
||||
PVOID Context;
|
||||
typedef struct {
|
||||
DWORD Flags;
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
PFILE_OBJECT FileObject;
|
||||
PVOID Context;
|
||||
} DRMFORWARD, *PDRMFORWARD, *PCDRMFORWARD;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
BOOL CopyProtect;
|
||||
ULONG Reserved;
|
||||
BOOL DigitalOutputDisable;
|
||||
typedef struct {
|
||||
BOOL CopyProtect;
|
||||
ULONG Reserved;
|
||||
BOOL DigitalOutputDisable;
|
||||
} DRMRIGHTS, *PDRMRIGHTS;
|
||||
|
||||
typedef const DRMRIGHTS *PCDRMRIGHTS;
|
||||
@@ -31,87 +29,82 @@ typedef const DRMRIGHTS *PCDRMRIGHTS;
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DrmAddContentHandlers(
|
||||
IN ULONG ContentId,
|
||||
IN PVOID *paHandlers,
|
||||
IN ULONG NumHandlers);
|
||||
IN ULONG ContentId,
|
||||
IN PVOID *paHandlers,
|
||||
IN ULONG NumHandlers);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DrmCreateContentMixed(
|
||||
IN PULONG paContentId,
|
||||
IN ULONG cContentId,
|
||||
OUT PULONG pMixedContentId);
|
||||
IN PULONG paContentId,
|
||||
IN ULONG cContentId,
|
||||
OUT PULONG pMixedContentId);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DrmDestroyContent(
|
||||
IN ULONG ContentId);
|
||||
IN ULONG ContentId);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DrmForwardContentToDeviceObject(
|
||||
IN ULONG ContentId,
|
||||
IN PVOID Reserved,
|
||||
IN PCDRMFORWARD DrmForward);
|
||||
IN ULONG ContentId,
|
||||
IN PVOID Reserved,
|
||||
IN PCDRMFORWARD DrmForward);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DrmForwardContentToFileObject(
|
||||
IN ULONG ContentId,
|
||||
IN PFILE_OBJECT FileObject);
|
||||
IN ULONG ContentId,
|
||||
IN PFILE_OBJECT FileObject);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DrmForwardContentToInterface(
|
||||
IN ULONG ContentId,
|
||||
IN PUNKNOWN pUnknown,
|
||||
IN ULONG NumMethods);
|
||||
IN ULONG ContentId,
|
||||
IN PUNKNOWN pUnknown,
|
||||
IN ULONG NumMethods);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DrmGetContentRights(
|
||||
IN ULONG ContentId,
|
||||
OUT PDRMRIGHTS DrmRights);
|
||||
IN ULONG ContentId,
|
||||
OUT PDRMRIGHTS DrmRights);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
DEFINE_GUID(IID_IDrmAudioStream,
|
||||
0x1915c967, 0x3299, 0x48cb, 0xa3, 0xe4, 0x69, 0xfd, 0x1d, 0x1b, 0x30, 0x6e);
|
||||
0x1915c967, 0x3299, 0x48cb, 0xa3, 0xe4, 0x69, 0xfd, 0x1d, 0x1b, 0x30, 0x6e);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDrmAudioStream
|
||||
|
||||
DECLARE_INTERFACE_(IDrmAudioStream, IUnknown)
|
||||
{
|
||||
STDMETHOD_(NTSTATUS, QueryInterface)(THIS_
|
||||
REFIID InterfaceId,
|
||||
PVOID* Interface
|
||||
) PURE;
|
||||
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release)(THIS) PURE;
|
||||
STDMETHOD_(NTSTATUS,SetContentId)(THIS_
|
||||
IN ULONG ContentId,
|
||||
IN PCDRMRIGHTS DrmRights) PURE;
|
||||
DECLARE_INTERFACE_(IDrmAudioStream, IUnknown) {
|
||||
STDMETHOD_(NTSTATUS, QueryInterface)(THIS_
|
||||
REFIID InterfaceId,
|
||||
PVOID* Interface
|
||||
) PURE;
|
||||
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release)(THIS) PURE;
|
||||
STDMETHOD_(NTSTATUS,SetContentId)(THIS_
|
||||
IN ULONG ContentId,
|
||||
IN PCDRMRIGHTS DrmRights
|
||||
) PURE;
|
||||
};
|
||||
|
||||
typedef IDrmAudioStream *PDRMAUDIOSTREAM;
|
||||
|
||||
#define IMP_IDrmAudioStream \
|
||||
STDMETHODIMP_(NTSTATUS) SetContentId \
|
||||
( IN ULONG ContentId, \
|
||||
IN PCDRMRIGHTS DrmRights \
|
||||
);
|
||||
#define IMP_IDrmAudioStream \
|
||||
STDMETHODIMP_(NTSTATUS) SetContentId( \
|
||||
IN ULONG ContentId, \
|
||||
IN PCDRMRIGHTS DrmRights);
|
||||
|
||||
|
||||
#endif
|
||||
#endif /* DRMK_H */
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
ULONG
|
||||
DxApiGetVersion();
|
||||
DxApiGetVersion(void);
|
||||
|
||||
ULONG
|
||||
DxApi(
|
||||
|
||||
+100
-137
@@ -22,15 +22,15 @@ typedef struct _ROOTHUB_PDO_EXTENSION {
|
||||
#define USB_BUSIFFN __stdcall
|
||||
#endif
|
||||
|
||||
#define CD_ERR_V1 0x00000001
|
||||
#define CD_ERR_V1 0x00000001
|
||||
|
||||
#define ID_ERR_V1 0x00000001
|
||||
#define ID_ERR_V1 0x00000001
|
||||
|
||||
#define USBD_KEEP_DEVICE_DATA 0x00000001
|
||||
#define USBD_MARK_DEVICE_BUSY 0x00000002
|
||||
|
||||
#define USB_IDLE_NOT_READY 0
|
||||
#define USB_IDLE_READY 1
|
||||
#define USB_IDLE_NOT_READY 0
|
||||
#define USB_IDLE_READY 1
|
||||
|
||||
typedef
|
||||
NTSTATUS
|
||||
@@ -41,7 +41,6 @@ USB_BUSIFFN_CREATE_USB_DEVICE (
|
||||
IN PUSB_DEVICE_HANDLE HubDeviceHandle,
|
||||
IN USHORT PortStatus,
|
||||
IN USHORT PortNumber);
|
||||
|
||||
typedef USB_BUSIFFN_CREATE_USB_DEVICE *PUSB_BUSIFFN_CREATE_USB_DEVICE;
|
||||
|
||||
typedef enum _USBPORT_CREATEDEV_ERROR {
|
||||
@@ -56,47 +55,45 @@ typedef enum _USBPORT_CREATEDEV_ERROR {
|
||||
} USBPORT_CREATEDEV_ERROR;
|
||||
|
||||
typedef struct _USB_CD_ERROR_INFORMATION {
|
||||
ULONG Version;
|
||||
USBPORT_CREATEDEV_ERROR PathError;
|
||||
ULONG UlongArg1;
|
||||
ULONG UlongArg2;
|
||||
NTSTATUS NtStatus;
|
||||
UCHAR XtraInfo[64];
|
||||
ULONG Version;
|
||||
USBPORT_CREATEDEV_ERROR PathError;
|
||||
ULONG UlongArg1;
|
||||
ULONG UlongArg2;
|
||||
NTSTATUS NtStatus;
|
||||
UCHAR XtraInfo[64];
|
||||
} USB_CD_ERROR_INFORMATION, *PUSB_CD_ERROR_INFORMATION;
|
||||
|
||||
typedef
|
||||
NTSTATUS
|
||||
USB_BUSIFFN
|
||||
USB_BUSIFFN_CREATE_USB_DEVICE_EX (
|
||||
IN PVOID BusContext,
|
||||
OUT PUSB_DEVICE_HANDLE *NewDeviceHandle,
|
||||
IN PUSB_DEVICE_HANDLE HsHubDeviceHandle,
|
||||
IN USHORT PortStatus,
|
||||
IN USHORT PortNumber,
|
||||
OUT PUSB_CD_ERROR_INFORMATION CdErrorInfo,
|
||||
IN PVOID BusContext,
|
||||
OUT PUSB_DEVICE_HANDLE *NewDeviceHandle,
|
||||
IN PUSB_DEVICE_HANDLE HsHubDeviceHandle,
|
||||
IN USHORT PortStatus,
|
||||
IN USHORT PortNumber,
|
||||
OUT PUSB_CD_ERROR_INFORMATION CdErrorInfo,
|
||||
IN USHORT TtPortNumber);
|
||||
|
||||
typedef USB_BUSIFFN_CREATE_USB_DEVICE_EX *PUSB_BUSIFFN_CREATE_USB_DEVICE_EX;
|
||||
|
||||
typedef struct _USB_PORT_PATH {
|
||||
ULONG PortPathDepth;
|
||||
ULONG PortPath[6];
|
||||
ULONG PortPathDepth;
|
||||
ULONG PortPath[6];
|
||||
} USB_PORT_PATH, *PUSB_PORT_PATH;
|
||||
|
||||
typedef
|
||||
NTSTATUS
|
||||
USB_BUSIFFN
|
||||
USB_BUSIFFN_CREATE_USB_DEVICE_V7 (
|
||||
IN PVOID BusContext,
|
||||
OUT PUSB_DEVICE_HANDLE *NewDeviceHandle,
|
||||
IN PUSB_DEVICE_HANDLE HsHubDeviceHandle,
|
||||
IN USHORT PortStatus,
|
||||
IN PUSB_PORT_PATH PortPath,
|
||||
OUT PUSB_CD_ERROR_INFORMATION CdErrorInfo,
|
||||
IN USHORT TtPortNumber,
|
||||
IN PDEVICE_OBJECT PdoDeviceObject,
|
||||
IN PUNICODE_STRING PhysicalDeviceObjectName);
|
||||
|
||||
IN PVOID BusContext,
|
||||
OUT PUSB_DEVICE_HANDLE *NewDeviceHandle,
|
||||
IN PUSB_DEVICE_HANDLE HsHubDeviceHandle,
|
||||
IN USHORT PortStatus,
|
||||
IN PUSB_PORT_PATH PortPath,
|
||||
OUT PUSB_CD_ERROR_INFORMATION CdErrorInfo,
|
||||
IN USHORT TtPortNumber,
|
||||
IN PDEVICE_OBJECT PdoDeviceObject,
|
||||
IN PUNICODE_STRING PhysicalDeviceObjectName);
|
||||
typedef USB_BUSIFFN_CREATE_USB_DEVICE_V7 *PUSB_BUSIFFN_CREATE_USB_DEVICE_V7;
|
||||
|
||||
typedef enum _USBPORT_INITDEV_ERROR {
|
||||
@@ -120,29 +117,26 @@ typedef
|
||||
NTSTATUS
|
||||
USB_BUSIFFN
|
||||
USB_BUSIFFN_INITIALIZE_USB_DEVICE (
|
||||
IN PVOID BusContext,
|
||||
IN OUT PUSB_DEVICE_HANDLE DeviceHandle);
|
||||
|
||||
IN PVOID BusContext,
|
||||
IN OUT PUSB_DEVICE_HANDLE DeviceHandle);
|
||||
typedef USB_BUSIFFN_INITIALIZE_USB_DEVICE *PUSB_BUSIFFN_INITIALIZE_USB_DEVICE;
|
||||
|
||||
typedef
|
||||
NTSTATUS
|
||||
USB_BUSIFFN
|
||||
USB_BUSIFFN_INITIALIZE_USB_DEVICE_EX (
|
||||
IN PVOID BusContext,
|
||||
IN OUT PUSB_DEVICE_HANDLE DeviceHandle,
|
||||
OUT PUSB_ID_ERROR_INFORMATION IdErrInfo);
|
||||
|
||||
IN PVOID BusContext,
|
||||
IN OUT PUSB_DEVICE_HANDLE DeviceHandle,
|
||||
OUT PUSB_ID_ERROR_INFORMATION IdErrInfo);
|
||||
typedef USB_BUSIFFN_INITIALIZE_USB_DEVICE_EX *PUSB_BUSIFFN_INITIALIZE_USB_DEVICE_EX;
|
||||
|
||||
typedef
|
||||
NTSTATUS
|
||||
USB_BUSIFFN
|
||||
USB_BUSIFFN_REMOVE_USB_DEVICE (
|
||||
IN PVOID BusContext,
|
||||
IN OUT PUSB_DEVICE_HANDLE DeviceHandle,
|
||||
IN ULONG Flags);
|
||||
|
||||
IN PVOID BusContext,
|
||||
IN OUT PUSB_DEVICE_HANDLE DeviceHandle,
|
||||
IN ULONG Flags);
|
||||
typedef USB_BUSIFFN_REMOVE_USB_DEVICE *PUSB_BUSIFFN_REMOVE_USB_DEVICE;
|
||||
|
||||
typedef
|
||||
@@ -155,7 +149,6 @@ USB_BUSIFFN_GET_USB_DESCRIPTORS (
|
||||
IN OUT PULONG DeviceDescriptorBufferLength,
|
||||
OUT PUCHAR ConfigDescriptorBuffer,
|
||||
IN OUT PULONG ConfigDescriptorBufferLength);
|
||||
|
||||
typedef USB_BUSIFFN_GET_USB_DESCRIPTORS *PUSB_BUSIFFN_GET_USB_DESCRIPTORS;
|
||||
|
||||
typedef
|
||||
@@ -165,7 +158,6 @@ USB_BUSIFFN_RESTORE_DEVICE (
|
||||
IN PVOID BusContext,
|
||||
IN OUT PUSB_DEVICE_HANDLE OldDeviceHandle,
|
||||
IN OUT PUSB_DEVICE_HANDLE NewDeviceHandle);
|
||||
|
||||
typedef USB_BUSIFFN_RESTORE_DEVICE *PUSB_BUSIFFN_RESTORE_DEVICE;
|
||||
|
||||
typedef
|
||||
@@ -174,7 +166,6 @@ USB_BUSIFFN
|
||||
USB_BUSIFFN_GET_POTRTHACK_FLAGS (
|
||||
IN PVOID BusContext,
|
||||
IN OUT PULONG Flags);
|
||||
|
||||
typedef USB_BUSIFFN_GET_POTRTHACK_FLAGS *PUSB_BUSIFFN_GET_POTRTHACK_FLAGS;
|
||||
|
||||
typedef
|
||||
@@ -186,7 +177,6 @@ USB_BUSIFFN_GET_DEVICE_INFORMATION (
|
||||
OUT PVOID DeviceInformationBuffer,
|
||||
IN ULONG DeviceInformationBufferLength,
|
||||
IN OUT PULONG LengthOfDataCopied);
|
||||
|
||||
typedef USB_BUSIFFN_GET_DEVICE_INFORMATION *PUSB_BUSIFFN_GET_DEVICE_INFORMATION;
|
||||
|
||||
typedef
|
||||
@@ -197,7 +187,6 @@ USB_BUSIFFN_GET_CONTROLLER_INFORMATION (
|
||||
IN OUT PVOID ControllerInformationBuffer,
|
||||
IN ULONG ControllerInformationBufferLength,
|
||||
IN OUT PULONG LengthOfDataCopied);
|
||||
|
||||
typedef USB_BUSIFFN_GET_CONTROLLER_INFORMATION *PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION;
|
||||
|
||||
typedef
|
||||
@@ -206,7 +195,6 @@ USB_BUSIFFN
|
||||
USB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND (
|
||||
IN PVOID BusContext,
|
||||
IN BOOLEAN Enable);
|
||||
|
||||
typedef USB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND *PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND;
|
||||
|
||||
typedef
|
||||
@@ -218,7 +206,6 @@ USB_BUSIFFN_GET_EXTENDED_HUB_INFO (
|
||||
IN PVOID HubInformationBuffer,
|
||||
IN ULONG HubInformationBufferLength,
|
||||
OUT PULONG LengthOfDataCopied);
|
||||
|
||||
typedef USB_BUSIFFN_GET_EXTENDED_HUB_INFO *PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO;
|
||||
|
||||
typedef
|
||||
@@ -229,7 +216,6 @@ USB_BUSIFFN_GET_ROOTHUB_SYM_NAME (
|
||||
IN PVOID HubSymNameBuffer,
|
||||
IN ULONG HubSymNameBufferLength,
|
||||
OUT PULONG HubSymNameActualLength);
|
||||
|
||||
typedef USB_BUSIFFN_GET_ROOTHUB_SYM_NAME *PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME;
|
||||
|
||||
typedef
|
||||
@@ -238,7 +224,6 @@ USB_BUSIFFN
|
||||
USB_BUSIFFN_GET_DEVICE_BUSCONTEXT (
|
||||
IN PVOID HubBusContext,
|
||||
IN PVOID DeviceHandle);
|
||||
|
||||
typedef USB_BUSIFFN_GET_DEVICE_BUSCONTEXT *PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT;
|
||||
|
||||
typedef
|
||||
@@ -248,7 +233,6 @@ USB_BUSIFFN_INITIALIZE_20HUB (
|
||||
IN PVOID BusContext,
|
||||
IN PUSB_DEVICE_HANDLE HubDeviceHandle,
|
||||
IN ULONG TtCount);
|
||||
|
||||
typedef USB_BUSIFFN_INITIALIZE_20HUB *PUSB_BUSIFFN_INITIALIZE_20HUB;
|
||||
|
||||
typedef
|
||||
@@ -257,7 +241,6 @@ USB_BUSIFFN
|
||||
USB_BUSIFFN_IS_ROOT (
|
||||
IN PVOID BusContext,
|
||||
IN PVOID DeviceObject);
|
||||
|
||||
typedef USB_BUSIFFN_IS_ROOT *PUSB_BUSIFFN_IS_ROOT;
|
||||
|
||||
typedef
|
||||
@@ -265,7 +248,6 @@ VOID
|
||||
USB_BUSIFFN
|
||||
USB_BUSIFFN_ACQUIRE_SEMAPHORE (
|
||||
IN PVOID BusContext);
|
||||
|
||||
typedef USB_BUSIFFN_ACQUIRE_SEMAPHORE *PUSB_BUSIFFN_ACQUIRE_SEMAPHORE;
|
||||
|
||||
typedef
|
||||
@@ -273,7 +255,6 @@ VOID
|
||||
USB_BUSIFFN
|
||||
USB_BUSIFFN_RELEASE_SEMAPHORE (
|
||||
IN PVOID BusContext);
|
||||
|
||||
typedef USB_BUSIFFN_RELEASE_SEMAPHORE *PUSB_BUSIFFN_RELEASE_SEMAPHORE;
|
||||
|
||||
typedef
|
||||
@@ -281,7 +262,6 @@ VOID
|
||||
__stdcall
|
||||
RH_INIT_CALLBACK (
|
||||
IN PVOID CallBackContext);
|
||||
|
||||
typedef RH_INIT_CALLBACK *PRH_INIT_CALLBACK;
|
||||
|
||||
typedef
|
||||
@@ -291,7 +271,6 @@ USB_BUSIFFN_ROOTHUB_INIT_NOTIFY (
|
||||
IN PVOID BusContext,
|
||||
IN PVOID CallbackContext,
|
||||
IN PRH_INIT_CALLBACK CallbackRoutine);
|
||||
|
||||
typedef USB_BUSIFFN_ROOTHUB_INIT_NOTIFY *PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY;
|
||||
|
||||
typedef
|
||||
@@ -300,7 +279,6 @@ USB_BUSIFFN
|
||||
USB_BUSIFFN_FLUSH_TRANSFERS (
|
||||
IN PVOID BusContext,
|
||||
IN PVOID DeviceHandle);
|
||||
|
||||
typedef USB_BUSIFFN_FLUSH_TRANSFERS *PUSB_BUSIFFN_FLUSH_TRANSFERS;
|
||||
|
||||
typedef
|
||||
@@ -310,7 +288,6 @@ USB_BUSIFFN_CALC_PIPE_BANDWIDTH (
|
||||
IN PVOID BusContext,
|
||||
IN PUSBD_PIPE_INFORMATION PipeInfo,
|
||||
IN USB_DEVICE_SPEED DeviceSpeed);
|
||||
|
||||
typedef USB_BUSIFFN_CALC_PIPE_BANDWIDTH *PUSB_BUSIFFN_CALC_PIPE_BANDWIDTH;
|
||||
|
||||
typedef
|
||||
@@ -319,7 +296,6 @@ USB_BUSIFFN
|
||||
USB_BUSIFFN_SET_BUS_WAKE_MODE (
|
||||
IN PVOID BusContext,
|
||||
IN ULONG Mode);
|
||||
|
||||
typedef USB_BUSIFFN_SET_BUS_WAKE_MODE *PUSB_BUSIFFN_SET_BUS_WAKE_MODE;
|
||||
|
||||
typedef
|
||||
@@ -330,7 +306,6 @@ USB_BUSIFFN_SET_DEVICE_FLAG (
|
||||
IN GUID *DeviceFlagGuid,
|
||||
IN PVOID ValueData,
|
||||
IN ULONG ValueLength);
|
||||
|
||||
typedef USB_BUSIFFN_SET_DEVICE_FLAG *PUSB_BUSIFFN_SET_DEVICE_FLAG;
|
||||
|
||||
typedef
|
||||
@@ -340,7 +315,6 @@ USB_BUSIFFN_SET_DEVHANDLE_DATA (
|
||||
IN PVOID BusContext,
|
||||
IN PVOID DeviceHandle,
|
||||
IN PDEVICE_OBJECT UsbDevicePdo);
|
||||
|
||||
typedef USB_BUSIFFN_SET_DEVHANDLE_DATA *PUSB_BUSIFFN_SET_DEVHANDLE_DATA;
|
||||
|
||||
typedef
|
||||
@@ -351,7 +325,6 @@ USB_BUSIFFN_TEST_POINT (
|
||||
IN PVOID DeviceHandle,
|
||||
IN ULONG Opcode,
|
||||
IN PVOID TestData);
|
||||
|
||||
typedef USB_BUSIFFN_TEST_POINT *PUSB_BUSIFFN_TEST_POINT;
|
||||
|
||||
typedef
|
||||
@@ -363,7 +336,6 @@ USB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO (
|
||||
OUT PVOID DeviceInformationBuffer,
|
||||
IN ULONG DeviceInformationBufferLength,
|
||||
IN OUT PULONG LengthOfDataCopied);
|
||||
|
||||
typedef USB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO *PUSB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO;
|
||||
|
||||
typedef
|
||||
@@ -371,7 +343,6 @@ NTSTATUS
|
||||
USB_BUSIFFN
|
||||
USB_BUSIFFN_WAIT_ASYNC_POWERUP (
|
||||
IN PVOID BusContext);
|
||||
|
||||
typedef USB_BUSIFFN_WAIT_ASYNC_POWERUP *PUSB_BUSIFFN_WAIT_ASYNC_POWERUP;
|
||||
|
||||
typedef
|
||||
@@ -381,7 +352,6 @@ USB_BUSIFFN_GET_DEVICE_ADDRESS (
|
||||
IN PVOID BusContext,
|
||||
IN PUSB_DEVICE_HANDLE DeviceHandle,
|
||||
OUT PUSHORT DeviceAddress);
|
||||
|
||||
typedef USB_BUSIFFN_GET_DEVICE_ADDRESS *PUSB_BUSIFFN_GET_DEVICE_ADDRESS;
|
||||
|
||||
typedef
|
||||
@@ -392,7 +362,6 @@ USB_BUSIFFN_DEREF_DEVICE_HANDLE (
|
||||
IN PUSB_DEVICE_HANDLE DeviceHandle,
|
||||
IN PVOID Object,
|
||||
IN ULONG Tag);
|
||||
|
||||
typedef USB_BUSIFFN_DEREF_DEVICE_HANDLE *PUSB_BUSIFFN_DEREF_DEVICE_HANDLE;
|
||||
|
||||
typedef
|
||||
@@ -403,7 +372,6 @@ USB_BUSIFFN_REF_DEVICE_HANDLE (
|
||||
IN PUSB_DEVICE_HANDLE DeviceHandle,
|
||||
IN PVOID Object,
|
||||
IN ULONG Tag);
|
||||
|
||||
typedef USB_BUSIFFN_REF_DEVICE_HANDLE *PUSB_BUSIFFN_REF_DEVICE_HANDLE;
|
||||
|
||||
typedef
|
||||
@@ -413,7 +381,6 @@ USB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE (
|
||||
IN PVOID BusContext,
|
||||
IN PUSB_DEVICE_HANDLE DeviceHandle,
|
||||
IN ULONG NewIdleReadyState);
|
||||
|
||||
typedef USB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE *PUSB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE;
|
||||
|
||||
typedef
|
||||
@@ -423,7 +390,6 @@ USB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT (
|
||||
IN PVOID BusContext,
|
||||
IN USHORT PortNumber,
|
||||
OUT LPGUID ContainerId);
|
||||
|
||||
typedef USB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT *PUSB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT;
|
||||
|
||||
typedef
|
||||
@@ -433,7 +399,6 @@ USB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT (
|
||||
IN PVOID BusContext,
|
||||
IN USHORT PortNumber,
|
||||
IN LPGUID ContainerId);
|
||||
|
||||
typedef USB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT *PUSB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT;
|
||||
|
||||
typedef
|
||||
@@ -442,7 +407,6 @@ USB_BUSIFFN
|
||||
USB_BUSIFFN_ABORT_ALL_DEVICE_PIPES (
|
||||
IN PVOID BusContext,
|
||||
IN PUSB_DEVICE_HANDLE DeviceHandle);
|
||||
|
||||
typedef USB_BUSIFFN_ABORT_ALL_DEVICE_PIPES *PUSB_BUSIFFN_ABORT_ALL_DEVICE_PIPES;
|
||||
|
||||
#define ERRATA_FLAG_RESET_TT_ON_CANCEL 1
|
||||
@@ -468,11 +432,10 @@ USB_BUSIFFN_SET_DEVICE_ERRATA_FLAG (
|
||||
IN PVOID BusContext,
|
||||
IN PUSB_DEVICE_HANDLE DeviceHandle,
|
||||
IN ULONG DeviceErrataFlag);
|
||||
|
||||
typedef USB_BUSIFFN_SET_DEVICE_ERRATA_FLAG *PUSB_BUSIFFN_SET_DEVICE_ERRATA_FLAG;
|
||||
|
||||
DEFINE_GUID(USB_BUS_INTERFACE_HUB_GUID,
|
||||
0xb2bb8c0a, 0x5ab4, 0x11d3, 0xa8, 0xcd, 0x0, 0xc0, 0x4f, 0x68, 0x74, 0x7a);
|
||||
0xb2bb8c0a, 0x5ab4, 0x11d3, 0xa8, 0xcd, 0x0, 0xc0, 0x4f, 0x68, 0x74, 0x7a);
|
||||
|
||||
typedef struct _USB_BUS_INTERFACE_HUB_V0 {
|
||||
USHORT Size;
|
||||
@@ -667,7 +630,7 @@ typedef struct _USB_BUS_INTERFACE_HUB_V7 {
|
||||
} USB_BUS_INTERFACE_HUB_V7, *PUSB_BUS_INTERFACE_HUB_V7;
|
||||
|
||||
DEFINE_GUID(USB_BUS_INTERFACE_HUB_MINIDUMP_GUID,
|
||||
0xc5485f21, 0x4e81, 0x4a23, 0xa8, 0xf9, 0xd8, 0x51, 0x8a, 0xf4, 0x5c, 0x38);
|
||||
0xc5485f21, 0x4e81, 0x4a23, 0xa8, 0xf9, 0xd8, 0x51, 0x8a, 0xf4, 0x5c, 0x38);
|
||||
|
||||
typedef VOID
|
||||
(USB_BUSIFFN *PUSB_BUSIFFN_SET_MINIDUMP_FLAGS) (
|
||||
@@ -683,7 +646,7 @@ typedef struct _USB_BUS_INTERFACE_HUB_MINIDUMP {
|
||||
} USB_BUS_INTERFACE_HUB_MINIDUMP, *PUSB_BUS_INTERFACE_HUB_MINIDUMP;
|
||||
|
||||
DEFINE_GUID(USB_BUS_INTERFACE_HUB_SS_GUID,
|
||||
0xbfc3f363, 0x8ba1, 0x4c7b, 0x97, 0xba, 0x9b, 0x12, 0xb1, 0xca, 0x13, 0x2f);
|
||||
0xbfc3f363, 0x8ba1, 0x4c7b, 0x97, 0xba, 0x9b, 0x12, 0xb1, 0xca, 0x13, 0x2f);
|
||||
|
||||
typedef NTSTATUS
|
||||
(USB_BUSIFFN *PUSB_BUSIFFN_SUSPEND_HUB) (
|
||||
@@ -694,95 +657,95 @@ typedef NTSTATUS
|
||||
PDEVICE_OBJECT Pdo);
|
||||
|
||||
typedef struct _USB_BUS_INTERFACE_HUB_SELECTIVE_SUSPEND {
|
||||
USHORT Size;
|
||||
USHORT Version;
|
||||
PVOID BusContext;
|
||||
PINTERFACE_REFERENCE InterfaceReference;
|
||||
PINTERFACE_DEREFERENCE InterfaceDereference;
|
||||
PUSB_BUSIFFN_SUSPEND_HUB SuspendHub;
|
||||
PUSB_BUSIFFN_RESUME_HUB ResumeHub;
|
||||
USHORT Size;
|
||||
USHORT Version;
|
||||
PVOID BusContext;
|
||||
PINTERFACE_REFERENCE InterfaceReference;
|
||||
PINTERFACE_DEREFERENCE InterfaceDereference;
|
||||
PUSB_BUSIFFN_SUSPEND_HUB SuspendHub;
|
||||
PUSB_BUSIFFN_RESUME_HUB ResumeHub;
|
||||
} USB_BUS_INTERFACE_HUB_SELECTIVE_SUSPEND, *PUSB_BUS_INTERFACE_HUB_SELECTIVE_SUSPEND;
|
||||
|
||||
#include <pshpack1.h>
|
||||
|
||||
typedef struct _USB_PIPE_INFORMATION_0 {
|
||||
USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;
|
||||
UCHAR ED_Pad[1];
|
||||
ULONG ScheduleOffset;
|
||||
USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;
|
||||
UCHAR ED_Pad[1];
|
||||
ULONG ScheduleOffset;
|
||||
} USB_PIPE_INFORMATION_0, *PUSB_PIPE_INFORMATION_0;
|
||||
|
||||
typedef struct _USB_LEVEL_INFORMATION {
|
||||
ULONG InformationLevel;
|
||||
ULONG ActualLength;
|
||||
ULONG InformationLevel;
|
||||
ULONG ActualLength;
|
||||
} USB_LEVEL_INFORMATION, *PUSB_LEVEL_INFORMATION;
|
||||
|
||||
typedef struct _USB_DEVICE_INFORMATION_0 {
|
||||
ULONG InformationLevel;
|
||||
ULONG ActualLength;
|
||||
ULONG PortNumber;
|
||||
USB_DEVICE_DESCRIPTOR DeviceDescriptor;
|
||||
UCHAR DD_pad[2];
|
||||
UCHAR CurrentConfigurationValue;
|
||||
UCHAR ReservedMBZ;
|
||||
USHORT DeviceAddress;
|
||||
ULONG HubAddress;
|
||||
USB_DEVICE_SPEED DeviceSpeed;
|
||||
USB_DEVICE_TYPE DeviceType;
|
||||
ULONG NumberOfOpenPipes;
|
||||
USB_PIPE_INFORMATION_0 PipeList[1];
|
||||
ULONG InformationLevel;
|
||||
ULONG ActualLength;
|
||||
ULONG PortNumber;
|
||||
USB_DEVICE_DESCRIPTOR DeviceDescriptor;
|
||||
UCHAR DD_pad[2];
|
||||
UCHAR CurrentConfigurationValue;
|
||||
UCHAR ReservedMBZ;
|
||||
USHORT DeviceAddress;
|
||||
ULONG HubAddress;
|
||||
USB_DEVICE_SPEED DeviceSpeed;
|
||||
USB_DEVICE_TYPE DeviceType;
|
||||
ULONG NumberOfOpenPipes;
|
||||
USB_PIPE_INFORMATION_0 PipeList[1];
|
||||
} USB_DEVICE_INFORMATION_0, *PUSB_DEVICE_INFORMATION_0;
|
||||
|
||||
typedef struct _USB_CONTROLLER_INFORMATION_0 {
|
||||
ULONG InformationLevel;
|
||||
ULONG ActualLength;
|
||||
BOOLEAN SelectiveSuspendEnabled;
|
||||
BOOLEAN IsHighSpeedController;
|
||||
ULONG InformationLevel;
|
||||
ULONG ActualLength;
|
||||
BOOLEAN SelectiveSuspendEnabled;
|
||||
BOOLEAN IsHighSpeedController;
|
||||
} USB_CONTROLLER_INFORMATION_0, *PUSB_CONTROLLER_INFORMATION_0;
|
||||
|
||||
typedef struct _USB_CONTROLLER_INFORMATION_1 {
|
||||
ULONG InformationLevel;
|
||||
ULONG ActualLength;
|
||||
BOOLEAN SelectiveSuspendEnabled;
|
||||
BOOLEAN IsHighSpeedController;
|
||||
ULONG HcBusNumber;
|
||||
ULONG HcBusDevice;
|
||||
ULONG HcBusFunction;
|
||||
ULONG InformationLevel;
|
||||
ULONG ActualLength;
|
||||
BOOLEAN SelectiveSuspendEnabled;
|
||||
BOOLEAN IsHighSpeedController;
|
||||
ULONG HcBusNumber;
|
||||
ULONG HcBusDevice;
|
||||
ULONG HcBusFunction;
|
||||
} USB_CONTROLLER_INFORMATION_1, *PUSB_CONTROLLER_INFORMATION_1;
|
||||
|
||||
typedef struct _USB_EXTPORT_INFORMATION_0 {
|
||||
ULONG PhysicalPortNumber;
|
||||
ULONG PortLabelNumber;
|
||||
USHORT VidOverride;
|
||||
USHORT PidOverride;
|
||||
ULONG PortAttributes;
|
||||
ULONG PhysicalPortNumber;
|
||||
ULONG PortLabelNumber;
|
||||
USHORT VidOverride;
|
||||
USHORT PidOverride;
|
||||
ULONG PortAttributes;
|
||||
} USB_EXTPORT_INFORMATION_0, *PUSB_EXTPORT_INFORMATION;
|
||||
|
||||
typedef struct _USB_EXTHUB_INFORMATION_0 {
|
||||
ULONG InformationLevel;
|
||||
ULONG NumberOfPorts;
|
||||
USB_EXTPORT_INFORMATION_0 Port[255];
|
||||
ULONG InformationLevel;
|
||||
ULONG NumberOfPorts;
|
||||
USB_EXTPORT_INFORMATION_0 Port[255];
|
||||
} USB_EXTHUB_INFORMATION_0, *PUSB_EXTHUB_INFORMATION_0;
|
||||
|
||||
typedef struct _USB_DEVICE_PERFORMANCE_INFO_0 {
|
||||
ULONG InformationLevel;
|
||||
ULONG ActualLength;
|
||||
ULONG BulkBytes;
|
||||
ULONG BulkUrbCount;
|
||||
ULONG ControlDataBytes;
|
||||
ULONG ControlUrbCount;
|
||||
ULONG IsoBytes;
|
||||
ULONG IsoUrbCount;
|
||||
ULONG InterruptBytes;
|
||||
ULONG InterruptUrbCount;
|
||||
ULONG AllocedInterrupt[6];
|
||||
ULONG AllocedIso;
|
||||
ULONG Total32secBandwidth;
|
||||
ULONG TotalTtBandwidth;
|
||||
ULONG TotalIsoLatency;
|
||||
ULONG DroppedIsoPackets;
|
||||
ULONG TransferErrors;
|
||||
ULONG InformationLevel;
|
||||
ULONG ActualLength;
|
||||
ULONG BulkBytes;
|
||||
ULONG BulkUrbCount;
|
||||
ULONG ControlDataBytes;
|
||||
ULONG ControlUrbCount;
|
||||
ULONG IsoBytes;
|
||||
ULONG IsoUrbCount;
|
||||
ULONG InterruptBytes;
|
||||
ULONG InterruptUrbCount;
|
||||
ULONG AllocedInterrupt[6];
|
||||
ULONG AllocedIso;
|
||||
ULONG Total32secBandwidth;
|
||||
ULONG TotalTtBandwidth;
|
||||
ULONG TotalIsoLatency;
|
||||
ULONG DroppedIsoPackets;
|
||||
ULONG TransferErrors;
|
||||
} USB_DEVICE_PERFORMANCE_INFO_0, *PUSB_DEVICE_PERFORMANCE_INFO_0;
|
||||
|
||||
#include <poppack.h>
|
||||
|
||||
#endif
|
||||
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
|
||||
|
||||
@@ -23,15 +23,6 @@
|
||||
#ifndef __IDE_H
|
||||
#define __IDE_H
|
||||
|
||||
/* Helper macro to enable gcc's extension. */
|
||||
#ifndef __GNU_EXTENSION
|
||||
#ifdef __GNUC__
|
||||
#define __GNU_EXTENSION __extension__
|
||||
#else
|
||||
#define __GNU_EXTENSION
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@@ -1,173 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2007 CodeWeavers, Aric Stewart
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef _DDKIMM_H_
|
||||
#define _DDKIMM_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct _tagINPUTCONTEXT {
|
||||
HWND hWnd;
|
||||
BOOL fOpen;
|
||||
POINT ptStatusWndPos;
|
||||
POINT ptSoftKbdPos;
|
||||
DWORD fdwConversion;
|
||||
DWORD fdwSentence;
|
||||
union {
|
||||
LOGFONTA A;
|
||||
LOGFONTW W;
|
||||
} lfFont;
|
||||
COMPOSITIONFORM cfCompForm;
|
||||
CANDIDATEFORM cfCandForm[4];
|
||||
HIMCC hCompStr;
|
||||
HIMCC hCandInfo;
|
||||
HIMCC hGuideLine;
|
||||
HIMCC hPrivate;
|
||||
DWORD dwNumMsgBuf;
|
||||
HIMCC hMsgBuf;
|
||||
DWORD fdwInit;
|
||||
DWORD dwReserve[3];
|
||||
} INPUTCONTEXT, *LPINPUTCONTEXT;
|
||||
|
||||
typedef struct _tagIMEINFO {
|
||||
DWORD dwPrivateDataSize;
|
||||
DWORD fdwProperty;
|
||||
DWORD fdwConversionCaps;
|
||||
DWORD fdwSentenceCaps;
|
||||
DWORD fdwUICaps;
|
||||
DWORD fdwSCSCaps;
|
||||
DWORD fdwSelectCaps;
|
||||
} IMEINFO, *LPIMEINFO;
|
||||
|
||||
typedef struct tagCOMPOSITIONSTRING {
|
||||
DWORD dwSize;
|
||||
DWORD dwCompReadAttrLen;
|
||||
DWORD dwCompReadAttrOffset;
|
||||
DWORD dwCompReadClauseLen;
|
||||
DWORD dwCompReadClauseOffset;
|
||||
DWORD dwCompReadStrLen;
|
||||
DWORD dwCompReadStrOffset;
|
||||
DWORD dwCompAttrLen;
|
||||
DWORD dwCompAttrOffset;
|
||||
DWORD dwCompClauseLen;
|
||||
DWORD dwCompClauseOffset;
|
||||
DWORD dwCompStrLen;
|
||||
DWORD dwCompStrOffset;
|
||||
DWORD dwCursorPos;
|
||||
DWORD dwDeltaStart;
|
||||
DWORD dwResultReadClauseLen;
|
||||
DWORD dwResultReadClauseOffset;
|
||||
DWORD dwResultReadStrLen;
|
||||
DWORD dwResultReadStrOffset;
|
||||
DWORD dwResultClauseLen;
|
||||
DWORD dwResultClauseOffset;
|
||||
DWORD dwResultStrLen;
|
||||
DWORD dwResultStrOffset;
|
||||
DWORD dwPrivateSize;
|
||||
DWORD dwPrivateOffset;
|
||||
} COMPOSITIONSTRING, *LPCOMPOSITIONSTRING;
|
||||
|
||||
typedef struct tagGUIDELINE {
|
||||
DWORD dwSize;
|
||||
DWORD dwLevel;
|
||||
DWORD dwIndex;
|
||||
DWORD dwStrLen;
|
||||
DWORD dwStrOffset;
|
||||
DWORD dwPrivateSize;
|
||||
DWORD dwPrivateOffset;
|
||||
} GUIDELINE, *LPGUIDELINE;
|
||||
|
||||
typedef struct tagCANDIDATEINFO {
|
||||
DWORD dwSize;
|
||||
DWORD dwCount;
|
||||
DWORD dwOffset[32];
|
||||
DWORD dwPrivateSize;
|
||||
DWORD dwPrivateOffset;
|
||||
} CANDIDATEINFO, *LPCANDIDATEINFO;
|
||||
|
||||
LPINPUTCONTEXT WINAPI ImmLockIMC(HIMC);
|
||||
BOOL WINAPI ImmUnlockIMC(HIMC);
|
||||
DWORD WINAPI ImmGetIMCLockCount(HIMC);
|
||||
HIMCC WINAPI ImmCreateIMCC(DWORD);
|
||||
HIMCC WINAPI ImmDestroyIMCC(HIMCC);
|
||||
LPVOID WINAPI ImmLockIMCC(HIMCC);
|
||||
BOOL WINAPI ImmUnlockIMCC(HIMCC);
|
||||
DWORD WINAPI ImmGetIMCCLockCount(HIMCC);
|
||||
HIMCC WINAPI ImmReSizeIMCC(HIMCC, DWORD);
|
||||
DWORD WINAPI ImmGetIMCCSize(HIMCC);
|
||||
|
||||
#define IMMGWL_IMC 0
|
||||
#define IMMGWL_PRIVATE (sizeof(LONG))
|
||||
|
||||
/* IME Property bits */
|
||||
#define IME_PROP_END_UNLOAD 0x0001
|
||||
#define IME_PROP_KBD_CHAR_FIRST 0x0002
|
||||
#define IME_PROP_IGNORE_UPKEYS 0x0004
|
||||
#define IME_PROP_NEED_ALTKEY 0x0008
|
||||
#define IME_PROP_NO_KEYS_ON_CLOSE 0x0010
|
||||
|
||||
/* for NI_CONTEXTUPDATED */
|
||||
#define IMC_SETCONVERSIONMODE 0x0002
|
||||
#define IMC_SETSENTENCEMODE 0x0004
|
||||
#define IMC_SETOPENSTATUS 0x0006
|
||||
|
||||
/* dwAction for ImmNotifyIME */
|
||||
#define NI_CONTEXTUPDATED 0x0003
|
||||
#define NI_OPENCANDIDATE 0x0010
|
||||
#define NI_CLOSECANDIDATE 0x0011
|
||||
#define NI_SELECTCANDIDATESTR 0x0012
|
||||
#define NI_CHANGECANDIDATELIST 0x0013
|
||||
#define NI_FINALIZECONVERSIONRESULT 0x0014
|
||||
#define NI_COMPOSITIONSTR 0x0015
|
||||
#define NI_SETCANDIDATE_PAGESTART 0x0016
|
||||
#define NI_SETCANDIDATE_PAGESIZE 0x0017
|
||||
#define NI_IMEMENUSELECTED 0x0018
|
||||
|
||||
BOOL WINAPI ImmGenerateMessage(HIMC);
|
||||
LRESULT WINAPI ImmRequestMessageA(HIMC, WPARAM, LPARAM);
|
||||
LRESULT WINAPI ImmRequestMessageW(HIMC, WPARAM, LPARAM);
|
||||
#define ImmRequestMessage WINELIB_NAME_AW(ImmRequestMessage);
|
||||
BOOL WINAPI ImmTranslateMessage(HWND, UINT, WPARAM, LPARAM);
|
||||
HWND WINAPI ImmCreateSoftKeyboard(UINT, UINT, int, int);
|
||||
BOOL WINAPI ImmDestroySoftKeyboard(HWND);
|
||||
BOOL WINAPI ImmShowSoftKeyboard(HWND, int);
|
||||
|
||||
BOOL WINAPI ImeInquire(LPIMEINFO, LPWSTR, LPCWSTR lpszOptions);
|
||||
BOOL WINAPI ImeConfigure (HKL, HWND, DWORD, LPVOID);
|
||||
DWORD WINAPI ImeConversionList(HIMC, LPCWSTR, LPCANDIDATELIST,DWORD,UINT);
|
||||
BOOL WINAPI ImeDestroy(UINT);
|
||||
LRESULT WINAPI ImeEscape(HIMC, UINT, LPVOID);
|
||||
BOOL WINAPI ImeProcessKey(HIMC, UINT, LPARAM, CONST LPBYTE);
|
||||
BOOL WINAPI ImeSelect(HIMC, BOOL);
|
||||
BOOL WINAPI ImeSetActiveContext(HIMC, BOOL);
|
||||
UINT WINAPI ImeToAsciiEx(UINT, UINT, CONST LPBYTE, LPDWORD, UINT, HIMC);
|
||||
BOOL WINAPI NotifyIME(HIMC, DWORD, DWORD, DWORD);
|
||||
BOOL WINAPI ImeRegisterWord(LPCWSTR, DWORD, LPCWSTR);
|
||||
BOOL WINAPI ImeUnregisterWord(LPCWSTR, DWORD, LPCWSTR);
|
||||
UINT WINAPI ImeGetRegisterWordStyle(UINT, LPSTYLEBUFW);
|
||||
UINT WINAPI ImeEnumRegisterWord(REGISTERWORDENUMPROCW, LPCWSTR, DWORD, LPCWSTR, LPVOID);
|
||||
BOOL WINAPI ImeSetCompositionString(HIMC, DWORD, LPCVOID, DWORD, LPCVOID, DWORD);
|
||||
DWORD WINAPI ImeGetImeMenuItems(HIMC, DWORD, DWORD, LPIMEMENUITEMINFOW, LPIMEMENUITEMINFOW, DWORD);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* _DDKIMM_H_ */
|
||||
@@ -24,7 +24,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#define H2I(p) PtrToUshort(p)
|
||||
|
||||
|
||||
#ifndef NO_PORT_MACROS
|
||||
|
||||
#if defined(_X86_) || defined(_M_AMD64)
|
||||
@@ -41,7 +41,7 @@ extern "C" {
|
||||
#define WRITE_PORT_USHORT(p, v) __outword (H2I(p), (v))
|
||||
#define WRITE_PORT_ULONG(p, v) __outdword (H2I(p), (v))
|
||||
|
||||
#define MEMORY_BARRIER()
|
||||
#define MEMORY_BARRIER()
|
||||
|
||||
#elif defined(_PPC_) || defined(_MIPS_) || defined(_ARM_)
|
||||
|
||||
@@ -59,10 +59,15 @@ extern "C" {
|
||||
#define WRITE_PORT_ULONG(p, v) WRITE_REGISTER_ULONG(p, (ULONG) (v))
|
||||
|
||||
#else
|
||||
|
||||
|
||||
#error Unsupported architecture
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* NO_PORT_MACROS */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __IOACCESS_H */
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
|
||||
|
||||
#ifndef _ISGUIDS_H_
|
||||
#define _ISGUIDS_H_
|
||||
|
||||
DEFINE_GUID(CLSID_InternetShortcut, 0xFBF23B40L, 0xE3F0, 0x101B, 0x84, 0x88, 0x00, 0xAA, 0x00, 0x3E, 0x56, 0xF8);
|
||||
DEFINE_GUID(IID_IUniformResourceLocatorA, 0xFBF23B80L, 0xE3F0, 0x101B, 0x84, 0x88, 0x00, 0xAA, 0x00, 0x3E, 0x56, 0xF8);
|
||||
DEFINE_GUID(IID_IUniformResourceLocatorW, 0xCABB0DA0L, 0xDA57, 0x11CF, 0x99, 0x74, 0x00, 0x20, 0xAF, 0xD7, 0x97, 0x62);
|
||||
|
||||
#ifdef UNICODE
|
||||
#define IID_IUniformResourceLocator IID_IUniformResourceLocatorW
|
||||
#else
|
||||
#define IID_IUniformResourceLocator IID_IUniformResourceLocatorA
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
+41
-41
@@ -32,9 +32,9 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#if defined(_MCD_)
|
||||
#define CHANGERAPI
|
||||
#define CHANGERAPI
|
||||
#else
|
||||
#define CHANGERAPI DECLSPEC_IMPORT
|
||||
#define CHANGERAPI DECLSPEC_IMPORT
|
||||
#endif
|
||||
|
||||
#ifdef DebugPrint
|
||||
@@ -47,41 +47,41 @@ extern "C" {
|
||||
#define DebugPrint(x)
|
||||
#endif
|
||||
|
||||
#define MAXIMUM_CHANGER_INQUIRY_DATA 252
|
||||
#define MAXIMUM_CHANGER_INQUIRY_DATA 252
|
||||
|
||||
CHANGERAPI
|
||||
PVOID
|
||||
NTAPI
|
||||
ChangerClassAllocatePool(
|
||||
IN POOL_TYPE PoolType,
|
||||
IN ULONG NumberOfBytes);
|
||||
IN POOL_TYPE PoolType,
|
||||
IN ULONG NumberOfBytes);
|
||||
|
||||
VOID
|
||||
ChangerClassDebugPrint(
|
||||
ULONG DebugPrintLevel,
|
||||
PCCHAR DebugMessage,
|
||||
ULONG DebugPrintLevel,
|
||||
PCCHAR DebugMessage,
|
||||
...);
|
||||
|
||||
CHANGERAPI
|
||||
PVOID
|
||||
NTAPI
|
||||
ChangerClassFreePool(
|
||||
IN PVOID PoolToFree);
|
||||
IN PVOID PoolToFree);
|
||||
|
||||
CHANGERAPI
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
ChangerClassSendSrbSynchronous(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PSCSI_REQUEST_BLOCK Srb,
|
||||
IN PVOID Buffer,
|
||||
IN ULONG BufferSize,
|
||||
IN BOOLEAN WriteToDevice);
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PSCSI_REQUEST_BLOCK Srb,
|
||||
IN PVOID Buffer,
|
||||
IN ULONG BufferSize,
|
||||
IN BOOLEAN WriteToDevice);
|
||||
|
||||
|
||||
typedef NTSTATUS NTAPI
|
||||
(*CHANGER_INITIALIZE)(
|
||||
IN PDEVICE_OBJECT DeviceObject);
|
||||
IN PDEVICE_OBJECT DeviceObject);
|
||||
|
||||
typedef ULONG NTAPI
|
||||
(*CHANGER_EXTENSION_SIZE)(
|
||||
@@ -89,47 +89,47 @@ typedef ULONG NTAPI
|
||||
|
||||
typedef VOID NTAPI
|
||||
(*CHANGER_ERROR_ROUTINE)(
|
||||
PDEVICE_OBJECT DeviceObject,
|
||||
PSCSI_REQUEST_BLOCK Srb,
|
||||
NTSTATUS *Status,
|
||||
BOOLEAN *Retry);
|
||||
PDEVICE_OBJECT DeviceObject,
|
||||
PSCSI_REQUEST_BLOCK Srb,
|
||||
NTSTATUS *Status,
|
||||
BOOLEAN *Retry);
|
||||
|
||||
typedef NTSTATUS NTAPI
|
||||
(*CHANGER_COMMAND_ROUTINE)(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp);
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp);
|
||||
|
||||
typedef NTSTATUS NTAPI
|
||||
(*CHANGER_PERFORM_DIAGNOSTICS)(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
OUT PWMI_CHANGER_PROBLEM_DEVICE_ERROR ChangerDeviceError);
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
OUT PWMI_CHANGER_PROBLEM_DEVICE_ERROR ChangerDeviceError);
|
||||
|
||||
typedef struct _MCD_INIT_DATA {
|
||||
ULONG InitDataSize;
|
||||
CHANGER_EXTENSION_SIZE ChangerAdditionalExtensionSize;
|
||||
CHANGER_INITIALIZE ChangerInitialize;
|
||||
CHANGER_ERROR_ROUTINE ChangerError;
|
||||
CHANGER_PERFORM_DIAGNOSTICS ChangerPerformDiagnostics;
|
||||
CHANGER_COMMAND_ROUTINE ChangerGetParameters;
|
||||
CHANGER_COMMAND_ROUTINE ChangerGetStatus;
|
||||
CHANGER_COMMAND_ROUTINE ChangerGetProductData;
|
||||
CHANGER_COMMAND_ROUTINE ChangerSetAccess;
|
||||
CHANGER_COMMAND_ROUTINE ChangerGetElementStatus;
|
||||
CHANGER_COMMAND_ROUTINE ChangerInitializeElementStatus;
|
||||
CHANGER_COMMAND_ROUTINE ChangerSetPosition;
|
||||
CHANGER_COMMAND_ROUTINE ChangerExchangeMedium;
|
||||
CHANGER_COMMAND_ROUTINE ChangerMoveMedium;
|
||||
CHANGER_COMMAND_ROUTINE ChangerReinitializeUnit;
|
||||
CHANGER_COMMAND_ROUTINE ChangerQueryVolumeTags;
|
||||
ULONG InitDataSize;
|
||||
CHANGER_EXTENSION_SIZE ChangerAdditionalExtensionSize;
|
||||
CHANGER_INITIALIZE ChangerInitialize;
|
||||
CHANGER_ERROR_ROUTINE ChangerError;
|
||||
CHANGER_PERFORM_DIAGNOSTICS ChangerPerformDiagnostics;
|
||||
CHANGER_COMMAND_ROUTINE ChangerGetParameters;
|
||||
CHANGER_COMMAND_ROUTINE ChangerGetStatus;
|
||||
CHANGER_COMMAND_ROUTINE ChangerGetProductData;
|
||||
CHANGER_COMMAND_ROUTINE ChangerSetAccess;
|
||||
CHANGER_COMMAND_ROUTINE ChangerGetElementStatus;
|
||||
CHANGER_COMMAND_ROUTINE ChangerInitializeElementStatus;
|
||||
CHANGER_COMMAND_ROUTINE ChangerSetPosition;
|
||||
CHANGER_COMMAND_ROUTINE ChangerExchangeMedium;
|
||||
CHANGER_COMMAND_ROUTINE ChangerMoveMedium;
|
||||
CHANGER_COMMAND_ROUTINE ChangerReinitializeUnit;
|
||||
CHANGER_COMMAND_ROUTINE ChangerQueryVolumeTags;
|
||||
} MCD_INIT_DATA, *PMCD_INIT_DATA;
|
||||
|
||||
CHANGERAPI
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
ChangerClassInitialize(
|
||||
IN PDRIVER_OBJECT DriverObject,
|
||||
IN PUNICODE_STRING RegistryPath,
|
||||
IN PMCD_INIT_DATA MCDInitData);
|
||||
IN PDRIVER_OBJECT DriverObject,
|
||||
IN PUNICODE_STRING RegistryPath,
|
||||
IN PMCD_INIT_DATA MCDInitData);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+34
-30
@@ -3,7 +3,7 @@
|
||||
#if defined(_X86_) || defined(_IA64_) || defined(_AMD64_)
|
||||
|
||||
typedef union _MCI_ADDR {
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONG Address;
|
||||
ULONG Reserved;
|
||||
} DUMMYSTRUCTNAME;
|
||||
@@ -157,7 +157,7 @@ typedef enum _ERROR_SEVERITY_VALUE {
|
||||
|
||||
typedef union _ERROR_REVISION {
|
||||
USHORT Revision;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
UCHAR Minor;
|
||||
UCHAR Major;
|
||||
} DUMMYSTRUCTNAME;
|
||||
@@ -174,7 +174,7 @@ typedef union _ERROR_REVISION {
|
||||
|
||||
typedef union _ERROR_TIMESTAMP {
|
||||
ULONGLONG TimeStamp;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
UCHAR Seconds;
|
||||
UCHAR Minutes;
|
||||
UCHAR Hours;
|
||||
@@ -201,7 +201,7 @@ typedef _ERROR_PLATFORM_GUID ERROR_PLATFORM_GUID, *PERROR_PLATFORM_GUID;
|
||||
|
||||
typedef union _ERROR_RECORD_VALID {
|
||||
UCHAR Valid;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
UCHAR OemPlatformID:1;
|
||||
UCHAR Reserved:7;
|
||||
} DUMMYSTRUCTNAME;
|
||||
@@ -219,7 +219,7 @@ typedef struct _ERROR_RECORD_HEADER {
|
||||
|
||||
typedef union _ERROR_RECOVERY_INFO {
|
||||
UCHAR RecoveryInfo;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
UCHAR Corrected:1;
|
||||
UCHAR NotContained:1;
|
||||
UCHAR Reset:1;
|
||||
@@ -236,7 +236,7 @@ typedef struct _ERROR_SECTION_HEADER {
|
||||
ULONG Length;
|
||||
} ERROR_SECTION_HEADER, *PERROR_SECTION_HEADER;
|
||||
|
||||
#if !defined(__midl) && defined(_MSC_EXTENSIONS)
|
||||
#if !defined(__midl)
|
||||
__inline
|
||||
USHORT
|
||||
NTAPI
|
||||
@@ -245,16 +245,20 @@ GetFwMceLogProcessorNumber(
|
||||
{
|
||||
PERROR_SECTION_HEADER section = (PERROR_SECTION_HEADER)((ULONG64)Log + sizeof(*Log));
|
||||
USHORT lid = (USHORT)((UCHAR)(section->Reserved));
|
||||
#ifdef NONAMELESSUNION
|
||||
lid |= (USHORT)((UCHAR)(Log->TimeStamp.s.Reserved) << 8);
|
||||
#else
|
||||
lid |= (USHORT)((UCHAR)(Log->TimeStamp.Reserved) << 8);
|
||||
#endif
|
||||
return( lid );
|
||||
}
|
||||
#endif
|
||||
#endif /* !__midl */
|
||||
|
||||
#define ERROR_PROCESSOR_GUID {0xe429faf1, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81}}
|
||||
|
||||
typedef union _ERROR_MODINFO_VALID {
|
||||
ULONGLONG Valid;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG CheckInfo:1;
|
||||
ULONGLONG RequestorIdentifier:1;
|
||||
ULONGLONG ResponderIdentifier:1;
|
||||
@@ -291,7 +295,7 @@ typedef enum _ERROR_CACHE_CHECK_MESI {
|
||||
|
||||
typedef union _ERROR_CACHE_CHECK {
|
||||
ULONGLONG CacheCheck;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG Operation:4;
|
||||
ULONGLONG Level:2;
|
||||
ULONGLONG Reserved1:2;
|
||||
@@ -324,7 +328,7 @@ typedef union _ERROR_CACHE_CHECK {
|
||||
|
||||
typedef union _ERROR_CACHE_CHECK {
|
||||
ULONGLONG CacheCheck;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG Operation:4;
|
||||
ULONGLONG Level:2;
|
||||
ULONGLONG Reserved1:2;
|
||||
@@ -367,7 +371,7 @@ typedef enum _ERROR_TLB_CHECK_OPERATION {
|
||||
|
||||
typedef union _ERROR_TLB_CHECK {
|
||||
ULONGLONG TlbCheck;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG TRSlot:8;
|
||||
ULONGLONG TRSlotValid:1;
|
||||
ULONGLONG Reserved1:1;
|
||||
@@ -407,7 +411,7 @@ typedef enum _ERROR_BUS_CHECK_OPERATION {
|
||||
|
||||
typedef union _ERROR_BUS_CHECK {
|
||||
ULONGLONG BusCheck;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG Size:5;
|
||||
ULONGLONG Internal:1;
|
||||
ULONGLONG External:1;
|
||||
@@ -434,7 +438,7 @@ typedef union _ERROR_BUS_CHECK {
|
||||
|
||||
typedef union _ERROR_BUS_CHECK {
|
||||
ULONGLONG BusCheck;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG Size:5;
|
||||
ULONGLONG Internal:1;
|
||||
ULONGLONG External:1;
|
||||
@@ -484,7 +488,7 @@ typedef enum _ERROR_REGFILE_CHECK_OPERATION {
|
||||
|
||||
typedef union _ERROR_REGFILE_CHECK {
|
||||
ULONGLONG RegFileCheck;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG Identifier:4;
|
||||
ULONGLONG Operation:4;
|
||||
ULONGLONG RegisterNumber:7;
|
||||
@@ -518,7 +522,7 @@ typedef enum _ERROR_MS_CHECK_OPERATION {
|
||||
|
||||
typedef union _ERROR_MS_CHECK {
|
||||
ULONGLONG MsCheck;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG StructureIdentifier:5;
|
||||
ULONGLONG Level:3;
|
||||
ULONGLONG ArrayId:4;
|
||||
@@ -561,7 +565,7 @@ typedef struct _ERROR_MODINFO {
|
||||
|
||||
typedef union _ERROR_PROCESSOR_VALID {
|
||||
ULONGLONG Valid;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG ErrorMap:1;
|
||||
ULONGLONG StateParameter:1;
|
||||
ULONGLONG CRLid:1;
|
||||
@@ -578,7 +582,7 @@ typedef union _ERROR_PROCESSOR_VALID {
|
||||
|
||||
typedef union _ERROR_PROCESSOR_ERROR_MAP {
|
||||
ULONGLONG ErrorMap;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG Cid:4;
|
||||
ULONGLONG Tid:4;
|
||||
ULONGLONG Eic:4;
|
||||
@@ -597,7 +601,7 @@ typedef _ERROR_PROCESSOR_LEVEL_INDEX ERROR_PROCESSOR_LEVEL_INDEX, *PERROR_PROCES
|
||||
|
||||
typedef union _ERROR_PROCESSOR_STATE_PARAMETER {
|
||||
ULONGLONG StateParameter;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG reserved0:2;
|
||||
ULONGLONG rz:1;
|
||||
ULONGLONG ra:1;
|
||||
@@ -641,7 +645,7 @@ typedef union _ERROR_PROCESSOR_STATE_PARAMETER {
|
||||
|
||||
typedef union _PROCESSOR_LOCAL_ID {
|
||||
ULONGLONG LocalId;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG reserved:16;
|
||||
ULONGLONG eid:8;
|
||||
ULONGLONG id:8;
|
||||
@@ -664,7 +668,7 @@ typedef struct _ERROR_PROCESSOR_CPUID_INFO {
|
||||
|
||||
typedef union _ERROR_PROCESSOR_STATIC_INFO_VALID {
|
||||
ULONGLONG Valid;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG MinState:1;
|
||||
ULONGLONG BR:1;
|
||||
ULONGLONG CR:1;
|
||||
@@ -730,7 +734,7 @@ typedef enum _ERR_TYPES {
|
||||
|
||||
typedef union _ERROR_STATUS {
|
||||
ULONGLONG Status;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG Reserved0:8;
|
||||
ULONGLONG Type:8;
|
||||
ULONGLONG Address:1;
|
||||
@@ -750,7 +754,7 @@ typedef struct _ERROR_OEM_DATA {
|
||||
|
||||
typedef union _ERROR_BUS_SPECIFIC_DATA {
|
||||
ULONGLONG BusSpecificData;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG LockAsserted:1;
|
||||
ULONGLONG DeferLogged:1;
|
||||
ULONGLONG IOQEmpty:1;
|
||||
@@ -777,7 +781,7 @@ typedef union _ERROR_BUS_SPECIFIC_DATA {
|
||||
|
||||
typedef union _ERROR_MEMORY_VALID {
|
||||
ULONGLONG Valid;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG ErrorStatus:1;
|
||||
ULONGLONG PhysicalAddress:1;
|
||||
ULONGLONG AddressMask:1;
|
||||
@@ -825,7 +829,7 @@ typedef struct _ERROR_MEMORY {
|
||||
|
||||
typedef union _ERROR_PCI_BUS_VALID {
|
||||
ULONGLONG Valid;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG ErrorStatus:1;
|
||||
ULONGLONG ErrorType:1;
|
||||
ULONGLONG Id:1;
|
||||
@@ -881,7 +885,7 @@ typedef struct _ERROR_PCI_BUS {
|
||||
|
||||
typedef union _ERROR_PCI_COMPONENT_VALID {
|
||||
ULONGLONG Valid;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG ErrorStatus:1;
|
||||
ULONGLONG Info:1;
|
||||
ULONGLONG MemoryMappedRegistersPairs:1;
|
||||
@@ -919,7 +923,7 @@ typedef struct _ERROR_PCI_COMPONENT {
|
||||
|
||||
typedef union _ERROR_SYSTEM_EVENT_LOG_VALID {
|
||||
ULONGLONG Valid;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG RecordId:1;
|
||||
ULONGLONG RecordType:1;
|
||||
ULONGLONG GeneratorId:1;
|
||||
@@ -954,7 +958,7 @@ typedef struct _ERROR_SYSTEM_EVENT_LOG {
|
||||
|
||||
typedef union _ERROR_SMBIOS_VALID {
|
||||
ULONGLONG Valid;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG EventType:1;
|
||||
ULONGLONG Length:1;
|
||||
ULONGLONG TimeStamp:1;
|
||||
@@ -978,7 +982,7 @@ typedef struct _ERROR_SMBIOS {
|
||||
|
||||
typedef union _ERROR_PLATFORM_SPECIFIC_VALID {
|
||||
ULONGLONG Valid;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG ErrorStatus:1;
|
||||
ULONGLONG RequestorId:1;
|
||||
ULONGLONG ResponderId:1;
|
||||
@@ -1007,7 +1011,7 @@ typedef struct _ERROR_PLATFORM_SPECIFIC {
|
||||
|
||||
typedef union _ERROR_PLATFORM_BUS_VALID {
|
||||
ULONGLONG Valid;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG ErrorStatus:1;
|
||||
ULONGLONG RequestorId:1;
|
||||
ULONGLONG ResponderId:1;
|
||||
@@ -1036,7 +1040,7 @@ typedef struct _ERROR_PLATFORM_BUS {
|
||||
|
||||
typedef union _ERROR_PLATFORM_HOST_CONTROLLER_VALID {
|
||||
ULONGLONG Valid;
|
||||
struct {
|
||||
_ANONYMOUS_STRUCT struct {
|
||||
ULONGLONG ErrorStatus:1;
|
||||
ULONGLONG RequestorId:1;
|
||||
ULONGLONG ResponderId:1;
|
||||
|
||||
+153
-169
@@ -31,213 +31,197 @@ extern "C" {
|
||||
#define EMULATOR_WRITE_ACCESS 0x02
|
||||
|
||||
typedef enum _EMULATOR_PORT_ACCESS_TYPE {
|
||||
Uchar,
|
||||
Ushort,
|
||||
Ulong
|
||||
Uchar,
|
||||
Ushort,
|
||||
Ulong
|
||||
} EMULATOR_PORT_ACCESS_TYPE, *PEMULATOR_PORT_ACCESS_TYPE;
|
||||
|
||||
|
||||
typedef struct _EMULATOR_ACCESS_ENTRY {
|
||||
ULONG BasePort;
|
||||
ULONG NumConsecutivePorts;
|
||||
EMULATOR_PORT_ACCESS_TYPE AccessType;
|
||||
UCHAR AccessMode;
|
||||
UCHAR StringSupport;
|
||||
PVOID Routine;
|
||||
ULONG BasePort;
|
||||
ULONG NumConsecutivePorts;
|
||||
EMULATOR_PORT_ACCESS_TYPE AccessType;
|
||||
UCHAR AccessMode;
|
||||
UCHAR StringSupport;
|
||||
PVOID Routine;
|
||||
} EMULATOR_ACCESS_ENTRY, *PEMULATOR_ACCESS_ENTRY;
|
||||
|
||||
typedef VOID
|
||||
(NTAPI *PBANKED_SECTION_ROUTINE)(
|
||||
IN ULONG ReadBank,
|
||||
IN ULONG WriteBank,
|
||||
IN PVOID Context);
|
||||
|
||||
IN ULONG ReadBank,
|
||||
IN ULONG WriteBank,
|
||||
IN PVOID Context);
|
||||
|
||||
#ifndef __BROKEN__
|
||||
|
||||
typedef enum _INTERFACE_TYPE {
|
||||
InterfaceTypeUndefined = -1,
|
||||
Internal,
|
||||
Isa,
|
||||
Eisa,
|
||||
MicroChannel,
|
||||
TurboChannel,
|
||||
PCIBus,
|
||||
VMEBus,
|
||||
NuBus,
|
||||
PCMCIABus,
|
||||
CBus,
|
||||
MPIBus,
|
||||
MPSABus,
|
||||
ProcessorInternal,
|
||||
InternalPowerBus,
|
||||
PNPISABus,
|
||||
PNPBus,
|
||||
Vmcs,
|
||||
MaximumInterfaceType
|
||||
}INTERFACE_TYPE, *PINTERFACE_TYPE;
|
||||
InterfaceTypeUndefined = -1,
|
||||
Internal,
|
||||
Isa,
|
||||
Eisa,
|
||||
MicroChannel,
|
||||
TurboChannel,
|
||||
PCIBus,
|
||||
VMEBus,
|
||||
NuBus,
|
||||
PCMCIABus,
|
||||
CBus,
|
||||
MPIBus,
|
||||
MPSABus,
|
||||
ProcessorInternal,
|
||||
InternalPowerBus,
|
||||
PNPISABus,
|
||||
PNPBus,
|
||||
Vmcs,
|
||||
MaximumInterfaceType
|
||||
} INTERFACE_TYPE, *PINTERFACE_TYPE;
|
||||
|
||||
typedef enum _KINTERRUPT_MODE {
|
||||
LevelSensitive,
|
||||
Latched
|
||||
LevelSensitive,
|
||||
Latched
|
||||
} KINTERRUPT_MODE;
|
||||
|
||||
typedef VOID (*PINTERFACE_REFERENCE)(PVOID Context);
|
||||
typedef VOID (*PINTERFACE_DEREFERENCE)(PVOID Context);
|
||||
|
||||
typedef enum _BUS_DATA_TYPE {
|
||||
ConfigurationSpaceUndefined = -1,
|
||||
Cmos,
|
||||
EisaConfiguration,
|
||||
Pos,
|
||||
CbusConfiguration,
|
||||
PCIConfiguration,
|
||||
VMEConfiguration,
|
||||
NuBusConfiguration,
|
||||
PCMCIAConfiguration,
|
||||
MPIConfiguration,
|
||||
MPSAConfiguration,
|
||||
PNPISAConfiguration,
|
||||
SgiInternalConfiguration,
|
||||
MaximumBusDataType
|
||||
ConfigurationSpaceUndefined = -1,
|
||||
Cmos,
|
||||
EisaConfiguration,
|
||||
Pos,
|
||||
CbusConfiguration,
|
||||
PCIConfiguration,
|
||||
VMEConfiguration,
|
||||
NuBusConfiguration,
|
||||
PCMCIAConfiguration,
|
||||
MPIConfiguration,
|
||||
MPSAConfiguration,
|
||||
PNPISAConfiguration,
|
||||
SgiInternalConfiguration,
|
||||
MaximumBusDataType
|
||||
} BUS_DATA_TYPE, *PBUS_DATA_TYPE;
|
||||
|
||||
typedef enum _DMA_WIDTH {
|
||||
Width8Bits,
|
||||
Width16Bits,
|
||||
Width32Bits,
|
||||
MaximumDmaWidth
|
||||
}DMA_WIDTH, *PDMA_WIDTH;
|
||||
Width8Bits,
|
||||
Width16Bits,
|
||||
Width32Bits,
|
||||
MaximumDmaWidth
|
||||
} DMA_WIDTH, *PDMA_WIDTH;
|
||||
|
||||
typedef enum _DMA_SPEED {
|
||||
Compatible,
|
||||
TypeA,
|
||||
TypeB,
|
||||
TypeC,
|
||||
TypeF,
|
||||
MaximumDmaSpeed
|
||||
}DMA_SPEED, *PDMA_SPEED;
|
||||
Compatible,
|
||||
TypeA,
|
||||
TypeB,
|
||||
TypeC,
|
||||
TypeF,
|
||||
MaximumDmaSpeed
|
||||
} DMA_SPEED, *PDMA_SPEED;
|
||||
|
||||
typedef struct _INTERFACE {
|
||||
USHORT Size;
|
||||
USHORT Version;
|
||||
PVOID Context;
|
||||
PINTERFACE_REFERENCE InterfaceReference;
|
||||
PINTERFACE_DEREFERENCE InterfaceDereference;
|
||||
USHORT Size;
|
||||
USHORT Version;
|
||||
PVOID Context;
|
||||
PINTERFACE_REFERENCE InterfaceReference;
|
||||
PINTERFACE_DEREFERENCE InterfaceDereference;
|
||||
} INTERFACE, *PINTERFACE;
|
||||
|
||||
typedef enum _IRQ_DEVICE_POLICY {
|
||||
IrqPolicyMachineDefault = 0,
|
||||
IrqPolicyAllCloseProcessors,
|
||||
IrqPolicyOneCloseProcessor,
|
||||
IrqPolicyAllProcessorsInMachine,
|
||||
IrqPolicySpecifiedProcessors,
|
||||
IrqPolicySpreadMessagesAcrossAllProcessors
|
||||
IrqPolicyMachineDefault = 0,
|
||||
IrqPolicyAllCloseProcessors,
|
||||
IrqPolicyOneCloseProcessor,
|
||||
IrqPolicyAllProcessorsInMachine,
|
||||
IrqPolicySpecifiedProcessors,
|
||||
IrqPolicySpreadMessagesAcrossAllProcessors
|
||||
} IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
|
||||
|
||||
typedef enum _IRQ_PRIORITY {
|
||||
IrqPriorityUndefined = 0,
|
||||
IrqPriorityLow,
|
||||
IrqPriorityNormal,
|
||||
IrqPriorityHigh
|
||||
IrqPriorityUndefined = 0,
|
||||
IrqPriorityLow,
|
||||
IrqPriorityNormal,
|
||||
IrqPriorityHigh
|
||||
} IRQ_PRIORITY, *PIRQ_PRIORITY;
|
||||
|
||||
typedef struct _IO_RESOURCE_DESCRIPTOR {
|
||||
UCHAR Option;
|
||||
UCHAR Type; // use CM_RESOURCE_TYPE
|
||||
UCHAR ShareDisposition; // use CM_SHARE_DISPOSITION
|
||||
UCHAR Spare1;
|
||||
USHORT Flags; // use CM resource flag defines
|
||||
USHORT Spare2; // align
|
||||
|
||||
union {
|
||||
struct {
|
||||
ULONG Length;
|
||||
ULONG Alignment;
|
||||
PHYSICAL_ADDRESS MinimumAddress;
|
||||
PHYSICAL_ADDRESS MaximumAddress;
|
||||
} Port;
|
||||
|
||||
struct {
|
||||
ULONG Length;
|
||||
ULONG Alignment;
|
||||
PHYSICAL_ADDRESS MinimumAddress;
|
||||
PHYSICAL_ADDRESS MaximumAddress;
|
||||
} Memory;
|
||||
|
||||
struct {
|
||||
ULONG MinimumVector;
|
||||
ULONG MaximumVector;
|
||||
IRQ_DEVICE_POLICY AffinityPolicy;
|
||||
IRQ_PRIORITY PriorityPolicy;
|
||||
KAFFINITY TargetedProcessors;
|
||||
} Interrupt;
|
||||
|
||||
struct {
|
||||
ULONG MinimumChannel;
|
||||
ULONG MaximumChannel;
|
||||
} Dma;
|
||||
|
||||
struct {
|
||||
ULONG Length;
|
||||
ULONG Alignment;
|
||||
PHYSICAL_ADDRESS MinimumAddress;
|
||||
PHYSICAL_ADDRESS MaximumAddress;
|
||||
} Generic;
|
||||
|
||||
struct {
|
||||
ULONG Data[3];
|
||||
} DevicePrivate;
|
||||
|
||||
//
|
||||
// Bus Number information.
|
||||
//
|
||||
|
||||
struct {
|
||||
ULONG Length;
|
||||
ULONG MinBusNumber;
|
||||
ULONG MaxBusNumber;
|
||||
ULONG Reserved;
|
||||
} BusNumber;
|
||||
|
||||
struct {
|
||||
ULONG Priority; // use LCPRI_Xxx values in cfg.h
|
||||
ULONG Reserved1;
|
||||
ULONG Reserved2;
|
||||
} ConfigData;
|
||||
|
||||
//
|
||||
// The following structures provide descriptions
|
||||
// for memory resource requirement greater than MAXULONG
|
||||
//
|
||||
|
||||
struct {
|
||||
ULONG Length40;
|
||||
ULONG Alignment40;
|
||||
PHYSICAL_ADDRESS MinimumAddress;
|
||||
PHYSICAL_ADDRESS MaximumAddress;
|
||||
} Memory40;
|
||||
|
||||
struct {
|
||||
ULONG Length48;
|
||||
ULONG Alignment48;
|
||||
PHYSICAL_ADDRESS MinimumAddress;
|
||||
PHYSICAL_ADDRESS MaximumAddress;
|
||||
} Memory48;
|
||||
|
||||
struct {
|
||||
ULONG Length64;
|
||||
ULONG Alignment64;
|
||||
PHYSICAL_ADDRESS MinimumAddress;
|
||||
PHYSICAL_ADDRESS MaximumAddress;
|
||||
} Memory64;
|
||||
|
||||
|
||||
} u;
|
||||
|
||||
UCHAR Option;
|
||||
UCHAR Type; // use CM_RESOURCE_TYPE
|
||||
UCHAR ShareDisposition; // use CM_SHARE_DISPOSITION
|
||||
UCHAR Spare1;
|
||||
USHORT Flags; // use CM resource flag defines
|
||||
USHORT Spare2; // align
|
||||
union {
|
||||
struct {
|
||||
ULONG Length;
|
||||
ULONG Alignment;
|
||||
PHYSICAL_ADDRESS MinimumAddress;
|
||||
PHYSICAL_ADDRESS MaximumAddress;
|
||||
} Port;
|
||||
struct {
|
||||
ULONG Length;
|
||||
ULONG Alignment;
|
||||
PHYSICAL_ADDRESS MinimumAddress;
|
||||
PHYSICAL_ADDRESS MaximumAddress;
|
||||
} Memory;
|
||||
struct {
|
||||
ULONG MinimumVector;
|
||||
ULONG MaximumVector;
|
||||
IRQ_DEVICE_POLICY AffinityPolicy;
|
||||
IRQ_PRIORITY PriorityPolicy;
|
||||
KAFFINITY TargetedProcessors;
|
||||
} Interrupt;
|
||||
struct {
|
||||
ULONG MinimumChannel;
|
||||
ULONG MaximumChannel;
|
||||
} Dma;
|
||||
struct {
|
||||
ULONG Length;
|
||||
ULONG Alignment;
|
||||
PHYSICAL_ADDRESS MinimumAddress;
|
||||
PHYSICAL_ADDRESS MaximumAddress;
|
||||
} Generic;
|
||||
struct {
|
||||
ULONG Data[3];
|
||||
} DevicePrivate;
|
||||
//
|
||||
// Bus Number information.
|
||||
//
|
||||
struct {
|
||||
ULONG Length;
|
||||
ULONG MinBusNumber;
|
||||
ULONG MaxBusNumber;
|
||||
ULONG Reserved;
|
||||
} BusNumber;
|
||||
struct {
|
||||
ULONG Priority; // use LCPRI_Xxx values in cfg.h
|
||||
ULONG Reserved1;
|
||||
ULONG Reserved2;
|
||||
} ConfigData;
|
||||
//
|
||||
// The following structures provide descriptions
|
||||
// for memory resource requirement greater than MAXULONG
|
||||
//
|
||||
struct {
|
||||
ULONG Length40;
|
||||
ULONG Alignment40;
|
||||
PHYSICAL_ADDRESS MinimumAddress;
|
||||
PHYSICAL_ADDRESS MaximumAddress;
|
||||
} Memory40;
|
||||
struct {
|
||||
ULONG Length48;
|
||||
ULONG Alignment48;
|
||||
PHYSICAL_ADDRESS MinimumAddress;
|
||||
PHYSICAL_ADDRESS MaximumAddress;
|
||||
} Memory48;
|
||||
struct {
|
||||
ULONG Length64;
|
||||
ULONG Alignment64;
|
||||
PHYSICAL_ADDRESS MinimumAddress;
|
||||
PHYSICAL_ADDRESS MaximumAddress;
|
||||
} Memory64;
|
||||
} u;
|
||||
} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
|
||||
|
||||
#include <guiddef.h>
|
||||
#endif
|
||||
#endif /* ! __BROKEN__ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+142
-148
@@ -22,15 +22,6 @@
|
||||
#ifndef __MINITAPE_H
|
||||
#define __MINITAPE_H
|
||||
|
||||
/* Helper macro to enable gcc's extension. */
|
||||
#ifndef __GNU_EXTENSION
|
||||
#ifdef __GNUC__
|
||||
#define __GNU_EXTENSION __extension__
|
||||
#else
|
||||
#define __GNU_EXTENSION
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -45,176 +36,179 @@ extern "C" {
|
||||
#define MEDIA_CURRENTLY_MOUNTED 0x80000000
|
||||
|
||||
typedef enum _TAPE_STATUS {
|
||||
TAPE_STATUS_SEND_SRB_AND_CALLBACK,
|
||||
TAPE_STATUS_CALLBACK,
|
||||
TAPE_STATUS_CHECK_TEST_UNIT_READY,
|
||||
TAPE_STATUS_SUCCESS,
|
||||
TAPE_STATUS_INSUFFICIENT_RESOURCES,
|
||||
TAPE_STATUS_NOT_IMPLEMENTED,
|
||||
TAPE_STATUS_INVALID_DEVICE_REQUEST,
|
||||
TAPE_STATUS_INVALID_PARAMETER,
|
||||
TAPE_STATUS_MEDIA_CHANGED,
|
||||
TAPE_STATUS_BUS_RESET,
|
||||
TAPE_STATUS_SETMARK_DETECTED,
|
||||
TAPE_STATUS_FILEMARK_DETECTED,
|
||||
TAPE_STATUS_BEGINNING_OF_MEDIA,
|
||||
TAPE_STATUS_END_OF_MEDIA,
|
||||
TAPE_STATUS_BUFFER_OVERFLOW,
|
||||
TAPE_STATUS_NO_DATA_DETECTED,
|
||||
TAPE_STATUS_EOM_OVERFLOW,
|
||||
TAPE_STATUS_NO_MEDIA,
|
||||
TAPE_STATUS_IO_DEVICE_ERROR,
|
||||
TAPE_STATUS_UNRECOGNIZED_MEDIA,
|
||||
TAPE_STATUS_DEVICE_NOT_READY,
|
||||
TAPE_STATUS_MEDIA_WRITE_PROTECTED,
|
||||
TAPE_STATUS_DEVICE_DATA_ERROR,
|
||||
TAPE_STATUS_NO_SUCH_DEVICE,
|
||||
TAPE_STATUS_INVALID_BLOCK_LENGTH,
|
||||
TAPE_STATUS_IO_TIMEOUT,
|
||||
TAPE_STATUS_DEVICE_NOT_CONNECTED,
|
||||
TAPE_STATUS_DATA_OVERRUN,
|
||||
TAPE_STATUS_DEVICE_BUSY,
|
||||
TAPE_STATUS_REQUIRES_CLEANING,
|
||||
TAPE_STATUS_CLEANER_CARTRIDGE_INSTALLED
|
||||
TAPE_STATUS_SEND_SRB_AND_CALLBACK,
|
||||
TAPE_STATUS_CALLBACK,
|
||||
TAPE_STATUS_CHECK_TEST_UNIT_READY,
|
||||
TAPE_STATUS_SUCCESS,
|
||||
TAPE_STATUS_INSUFFICIENT_RESOURCES,
|
||||
TAPE_STATUS_NOT_IMPLEMENTED,
|
||||
TAPE_STATUS_INVALID_DEVICE_REQUEST,
|
||||
TAPE_STATUS_INVALID_PARAMETER,
|
||||
TAPE_STATUS_MEDIA_CHANGED,
|
||||
TAPE_STATUS_BUS_RESET,
|
||||
TAPE_STATUS_SETMARK_DETECTED,
|
||||
TAPE_STATUS_FILEMARK_DETECTED,
|
||||
TAPE_STATUS_BEGINNING_OF_MEDIA,
|
||||
TAPE_STATUS_END_OF_MEDIA,
|
||||
TAPE_STATUS_BUFFER_OVERFLOW,
|
||||
TAPE_STATUS_NO_DATA_DETECTED,
|
||||
TAPE_STATUS_EOM_OVERFLOW,
|
||||
TAPE_STATUS_NO_MEDIA,
|
||||
TAPE_STATUS_IO_DEVICE_ERROR,
|
||||
TAPE_STATUS_UNRECOGNIZED_MEDIA,
|
||||
TAPE_STATUS_DEVICE_NOT_READY,
|
||||
TAPE_STATUS_MEDIA_WRITE_PROTECTED,
|
||||
TAPE_STATUS_DEVICE_DATA_ERROR,
|
||||
TAPE_STATUS_NO_SUCH_DEVICE,
|
||||
TAPE_STATUS_INVALID_BLOCK_LENGTH,
|
||||
TAPE_STATUS_IO_TIMEOUT,
|
||||
TAPE_STATUS_DEVICE_NOT_CONNECTED,
|
||||
TAPE_STATUS_DATA_OVERRUN,
|
||||
TAPE_STATUS_DEVICE_BUSY,
|
||||
TAPE_STATUS_REQUIRES_CLEANING,
|
||||
TAPE_STATUS_CLEANER_CARTRIDGE_INSTALLED
|
||||
} TAPE_STATUS, *PTAPE_STATUS;
|
||||
|
||||
#define INQUIRYDATABUFFERSIZE 36
|
||||
|
||||
#ifndef _INQUIRYDATA_DEFINED /* also in scsi.h */
|
||||
#define _INQUIRYDATA_DEFINED
|
||||
|
||||
typedef struct _INQUIRYDATA {
|
||||
UCHAR DeviceType : 5;
|
||||
UCHAR DeviceTypeQualifier : 3;
|
||||
UCHAR DeviceTypeModifier : 7;
|
||||
UCHAR RemovableMedia : 1;
|
||||
__GNU_EXTENSION union {
|
||||
UCHAR Versions;
|
||||
__GNU_EXTENSION struct {
|
||||
UCHAR ANSIVersion : 3;
|
||||
UCHAR ECMAVersion : 3;
|
||||
UCHAR ISOVersion : 2;
|
||||
};
|
||||
};
|
||||
UCHAR ResponseDataFormat : 4;
|
||||
UCHAR HiSupport : 1;
|
||||
UCHAR NormACA : 1;
|
||||
UCHAR TerminateTask : 1;
|
||||
UCHAR AERC : 1;
|
||||
UCHAR AdditionalLength;
|
||||
UCHAR Reserved;
|
||||
UCHAR Addr16 : 1;
|
||||
UCHAR Addr32 : 1;
|
||||
UCHAR AckReqQ: 1;
|
||||
UCHAR MediumChanger : 1;
|
||||
UCHAR MultiPort : 1;
|
||||
UCHAR ReservedBit2 : 1;
|
||||
UCHAR EnclosureServices : 1;
|
||||
UCHAR ReservedBit3 : 1;
|
||||
UCHAR SoftReset : 1;
|
||||
UCHAR CommandQueue : 1;
|
||||
UCHAR TransferDisable : 1;
|
||||
UCHAR LinkedCommands : 1;
|
||||
UCHAR Synchronous : 1;
|
||||
UCHAR Wide16Bit : 1;
|
||||
UCHAR Wide32Bit : 1;
|
||||
UCHAR RelativeAddressing : 1;
|
||||
UCHAR VendorId[8];
|
||||
UCHAR ProductId[16];
|
||||
UCHAR ProductRevisionLevel[4];
|
||||
UCHAR VendorSpecific[20];
|
||||
UCHAR Reserved3[40];
|
||||
UCHAR DeviceType:5;
|
||||
UCHAR DeviceTypeQualifier:3;
|
||||
UCHAR DeviceTypeModifier:7;
|
||||
UCHAR RemovableMedia:1;
|
||||
__GNU_EXTENSION union {
|
||||
UCHAR Versions;
|
||||
__GNU_EXTENSION struct {
|
||||
UCHAR ANSIVersion:3;
|
||||
UCHAR ECMAVersion:3;
|
||||
UCHAR ISOVersion:2;
|
||||
};
|
||||
};
|
||||
UCHAR ResponseDataFormat:4;
|
||||
UCHAR HiSupport:1;
|
||||
UCHAR NormACA:1;
|
||||
UCHAR TerminateTask:1;
|
||||
UCHAR AERC:1;
|
||||
UCHAR AdditionalLength;
|
||||
UCHAR Reserved;
|
||||
UCHAR Addr16:1;
|
||||
UCHAR Addr32:1;
|
||||
UCHAR AckReqQ:1;
|
||||
UCHAR MediumChanger:1;
|
||||
UCHAR MultiPort:1;
|
||||
UCHAR ReservedBit2:1;
|
||||
UCHAR EnclosureServices:1;
|
||||
UCHAR ReservedBit3:1;
|
||||
UCHAR SoftReset:1;
|
||||
UCHAR CommandQueue:1;
|
||||
UCHAR TransferDisable:1;
|
||||
UCHAR LinkedCommands:1;
|
||||
UCHAR Synchronous:1;
|
||||
UCHAR Wide16Bit:1;
|
||||
UCHAR Wide32Bit:1;
|
||||
UCHAR RelativeAddressing:1;
|
||||
UCHAR VendorId[8];
|
||||
UCHAR ProductId[16];
|
||||
UCHAR ProductRevisionLevel[4];
|
||||
UCHAR VendorSpecific[20];
|
||||
UCHAR Reserved3[40];
|
||||
} INQUIRYDATA, *PINQUIRYDATA;
|
||||
#endif
|
||||
|
||||
#endif /* _INQUIRYDATA_DEFINED */
|
||||
|
||||
typedef struct _MODE_CAPABILITIES_PAGE {
|
||||
UCHAR PageCode : 6;
|
||||
UCHAR Reserved1 : 2;
|
||||
UCHAR PageLength;
|
||||
UCHAR Reserved2[2];
|
||||
UCHAR RO : 1;
|
||||
UCHAR Reserved3 : 4;
|
||||
UCHAR SPREV : 1;
|
||||
UCHAR Reserved4 : 2;
|
||||
UCHAR Reserved5 : 3;
|
||||
UCHAR EFMT : 1;
|
||||
UCHAR Reserved6 : 1;
|
||||
UCHAR QFA : 1;
|
||||
UCHAR Reserved7 : 2;
|
||||
UCHAR LOCK : 1;
|
||||
UCHAR LOCKED : 1;
|
||||
UCHAR PREVENT : 1;
|
||||
UCHAR UNLOAD : 1;
|
||||
UCHAR Reserved8 : 2;
|
||||
UCHAR ECC : 1;
|
||||
UCHAR CMPRS : 1;
|
||||
UCHAR Reserved9 : 1;
|
||||
UCHAR BLK512 : 1;
|
||||
UCHAR BLK1024 : 1;
|
||||
UCHAR Reserved10 : 4;
|
||||
UCHAR SLOWB : 1;
|
||||
UCHAR MaximumSpeedSupported[2];
|
||||
UCHAR MaximumStoredDefectedListEntries[2];
|
||||
UCHAR ContinuousTransferLimit[2];
|
||||
UCHAR CurrentSpeedSelected[2];
|
||||
UCHAR BufferSize[2];
|
||||
UCHAR Reserved11[2];
|
||||
UCHAR PageCode:6;
|
||||
UCHAR Reserved1:2;
|
||||
UCHAR PageLength;
|
||||
UCHAR Reserved2[2];
|
||||
UCHAR RO:1;
|
||||
UCHAR Reserved3:4;
|
||||
UCHAR SPREV:1;
|
||||
UCHAR Reserved4:2;
|
||||
UCHAR Reserved5:3;
|
||||
UCHAR EFMT:1;
|
||||
UCHAR Reserved6:1;
|
||||
UCHAR QFA:1;
|
||||
UCHAR Reserved7:2;
|
||||
UCHAR LOCK:1;
|
||||
UCHAR LOCKED:1;
|
||||
UCHAR PREVENT:1;
|
||||
UCHAR UNLOAD:1;
|
||||
UCHAR Reserved8:2;
|
||||
UCHAR ECC:1;
|
||||
UCHAR CMPRS:1;
|
||||
UCHAR Reserved9:1;
|
||||
UCHAR BLK512:1;
|
||||
UCHAR BLK1024:1;
|
||||
UCHAR Reserved10:4;
|
||||
UCHAR SLOWB:1;
|
||||
UCHAR MaximumSpeedSupported[2];
|
||||
UCHAR MaximumStoredDefectedListEntries[2];
|
||||
UCHAR ContinuousTransferLimit[2];
|
||||
UCHAR CurrentSpeedSelected[2];
|
||||
UCHAR BufferSize[2];
|
||||
UCHAR Reserved11[2];
|
||||
} MODE_CAPABILITIES_PAGE, *PMODE_CAPABILITIES_PAGE;
|
||||
|
||||
typedef BOOLEAN NTAPI
|
||||
(*TAPE_VERIFY_INQUIRY_ROUTINE)(
|
||||
IN PINQUIRYDATA InquiryData,
|
||||
IN PMODE_CAPABILITIES_PAGE ModeCapabilitiesPage);
|
||||
IN PINQUIRYDATA InquiryData,
|
||||
IN PMODE_CAPABILITIES_PAGE ModeCapabilitiesPage);
|
||||
|
||||
typedef VOID NTAPI
|
||||
(*TAPE_EXTENSION_INIT_ROUTINE)(
|
||||
IN PVOID MinitapeExtension,
|
||||
IN PINQUIRYDATA InquiryData,
|
||||
IN PMODE_CAPABILITIES_PAGE ModeCapabilitiesPage);
|
||||
IN PVOID MinitapeExtension,
|
||||
IN PINQUIRYDATA InquiryData,
|
||||
IN PMODE_CAPABILITIES_PAGE ModeCapabilitiesPage);
|
||||
|
||||
typedef VOID NTAPI
|
||||
(*TAPE_ERROR_ROUTINE)(
|
||||
IN PVOID MinitapeExtension,
|
||||
IN PSCSI_REQUEST_BLOCK Srb,
|
||||
IN OUT PTAPE_STATUS TapeStatus);
|
||||
IN PVOID MinitapeExtension,
|
||||
IN PSCSI_REQUEST_BLOCK Srb,
|
||||
IN OUT PTAPE_STATUS TapeStatus);
|
||||
|
||||
typedef TAPE_STATUS NTAPI
|
||||
(*TAPE_PROCESS_COMMAND_ROUTINE)(
|
||||
IN OUT PVOID MinitapeExtension,
|
||||
IN OUT PVOID CommandExtension,
|
||||
IN OUT PVOID CommandParameters,
|
||||
IN OUT PSCSI_REQUEST_BLOCK Srb,
|
||||
IN ULONG CallNumber,
|
||||
IN TAPE_STATUS StatusOfLastCommand,
|
||||
IN OUT PULONG RetryFlags);
|
||||
IN OUT PVOID MinitapeExtension,
|
||||
IN OUT PVOID CommandExtension,
|
||||
IN OUT PVOID CommandParameters,
|
||||
IN OUT PSCSI_REQUEST_BLOCK Srb,
|
||||
IN ULONG CallNumber,
|
||||
IN TAPE_STATUS StatusOfLastCommand,
|
||||
IN OUT PULONG RetryFlags);
|
||||
|
||||
#define TAPE_RETRY_MASK 0x0000FFFF
|
||||
#define IGNORE_ERRORS 0x00010000
|
||||
#define RETURN_ERRORS 0x00020000
|
||||
|
||||
typedef struct _TAPE_INIT_DATA {
|
||||
TAPE_VERIFY_INQUIRY_ROUTINE VerifyInquiry;
|
||||
BOOLEAN QueryModeCapabilitiesPage;
|
||||
ULONG MinitapeExtensionSize;
|
||||
TAPE_EXTENSION_INIT_ROUTINE ExtensionInit;
|
||||
ULONG DefaultTimeOutValue;
|
||||
TAPE_ERROR_ROUTINE TapeError;
|
||||
ULONG CommandExtensionSize;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE CreatePartition;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE Erase;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE GetDriveParameters;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE GetMediaParameters;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE GetPosition;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE GetStatus;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE Prepare;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE SetDriveParameters;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE SetMediaParameters;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE SetPosition;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE WriteMarks;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE PreProcessReadWrite; /* optional */
|
||||
TAPE_VERIFY_INQUIRY_ROUTINE VerifyInquiry;
|
||||
BOOLEAN QueryModeCapabilitiesPage;
|
||||
ULONG MinitapeExtensionSize;
|
||||
TAPE_EXTENSION_INIT_ROUTINE ExtensionInit;
|
||||
ULONG DefaultTimeOutValue;
|
||||
TAPE_ERROR_ROUTINE TapeError;
|
||||
ULONG CommandExtensionSize;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE CreatePartition;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE Erase;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE GetDriveParameters;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE GetMediaParameters;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE GetPosition;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE GetStatus;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE Prepare;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE SetDriveParameters;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE SetMediaParameters;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE SetPosition;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE WriteMarks;
|
||||
TAPE_PROCESS_COMMAND_ROUTINE PreProcessReadWrite; /* optional */
|
||||
} TAPE_INIT_DATA, *PTAPE_INIT_DATA;
|
||||
|
||||
typedef struct _TAPE_PHYS_POSITION {
|
||||
ULONG SeekBlockAddress;
|
||||
ULONG SpaceBlockCount;
|
||||
ULONG SeekBlockAddress;
|
||||
ULONG SpaceBlockCount;
|
||||
} TAPE_PHYS_POSITION, PTAPE_PHYS_POSITION;
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
+30
-25
@@ -15,13 +15,12 @@ DEFINE_GUID(MOUNTDEV_MOUNTED_DEVICE_GUID, 0x53F5630D, 0xB6BF, 0x11D0, 0x94, 0xF2
|
||||
#define IOCTL_MOUNTMGR_DEFINE_UNIX_DRIVE CTL_CODE(MOUNTMGRCONTROLTYPE, 32, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
||||
#define IOCTL_MOUNTMGR_QUERY_UNIX_DRIVE CTL_CODE(MOUNTMGRCONTROLTYPE, 33, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||||
|
||||
struct mountmgr_unix_drive
|
||||
{
|
||||
ULONG size;
|
||||
ULONG type;
|
||||
WCHAR letter;
|
||||
USHORT mount_point_offset;
|
||||
USHORT device_offset;
|
||||
struct mountmgr_unix_drive {
|
||||
ULONG size;
|
||||
ULONG type;
|
||||
WCHAR letter;
|
||||
USHORT mount_point_offset;
|
||||
USHORT device_offset;
|
||||
};
|
||||
|
||||
#define IOCTL_MOUNTMGR_CREATE_POINT \
|
||||
@@ -51,20 +50,22 @@ struct mountmgr_unix_drive
|
||||
#define IOCTL_MOUNTDEV_QUERY_DEVICE_NAME \
|
||||
CTL_CODE(MOUNTDEVCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#define MOUNTMGR_IS_DRIVE_LETTER(s) ((s)->Length == 28 && (s)->Buffer[0] == '\\' && (s)->Buffer[1] == 'D' && \
|
||||
(s)->Buffer[2] == 'o' && (s)->Buffer[3] == 's' && (s)->Buffer[4] == 'D' && \
|
||||
(s)->Buffer[5] == 'e' && \ (s)->Buffer[6] == 'v' && (s)->Buffer[7] == 'i' && \
|
||||
(s)->Buffer[8] == 'c' && (s)->Buffer[9] == 'e' && (s)->Buffer[10] == 's' && \
|
||||
(s)->Buffer[11] == '\\' && (s)->Buffer[12] >= 'A' && \
|
||||
(s)->Buffer[12] <= 'Z' && (s)->Buffer[13] == ':')
|
||||
#define MOUNTMGR_IS_DRIVE_LETTER(s) \
|
||||
((s)->Length == 28 && (s)->Buffer[0] == '\\' && (s)->Buffer[1] == 'D' && \
|
||||
(s)->Buffer[2] == 'o' && (s)->Buffer[3] == 's' && (s)->Buffer[4] == 'D' && \
|
||||
(s)->Buffer[5] == 'e' && \ (s)->Buffer[6] == 'v' && (s)->Buffer[7] == 'i' && \
|
||||
(s)->Buffer[8] == 'c' && (s)->Buffer[9] == 'e' && (s)->Buffer[10] == 's' && \
|
||||
(s)->Buffer[11] == '\\' && (s)->Buffer[12] >= 'A' && \
|
||||
(s)->Buffer[12] <= 'Z' && (s)->Buffer[13] == ':')
|
||||
|
||||
#define MOUNTMGR_IS_VOLUME_NAME(s) (((s)->Length == 96 || ((s)->Length == 98 && (s)->Buffer[48] == '\\')) && \
|
||||
(s)->Buffer[0] == '\\'&& ((s)->Buffer[1] == '?' || (s)->Buffer[1] == '\\') && \
|
||||
(s)->Buffer[2] == '?' && (s)->Buffer[3] == '\\' && (s)->Buffer[4] == 'V' && \
|
||||
(s)->Buffer[5] == 'o' && (s)->Buffer[6] == 'l' && (s)->Buffer[7] == 'u' && \
|
||||
(s)->Buffer[8] == 'm' && (s)->Buffer[9] == 'e' && (s)->Buffer[10] == '{' && \
|
||||
(s)->Buffer[19] == '-' && (s)->Buffer[24] == '-' && (s)->Buffer[29] == '-' && \
|
||||
(s)->Buffer[34] == '-' && (s)->Buffer[47] == '}')
|
||||
#define MOUNTMGR_IS_VOLUME_NAME(s) \
|
||||
(((s)->Length == 96 || ((s)->Length == 98 && (s)->Buffer[48] == '\\')) && \
|
||||
(s)->Buffer[0] == '\\'&& ((s)->Buffer[1] == '?' || (s)->Buffer[1] == '\\') && \
|
||||
(s)->Buffer[2] == '?' && (s)->Buffer[3] == '\\' && (s)->Buffer[4] == 'V' && \
|
||||
(s)->Buffer[5] == 'o' && (s)->Buffer[6] == 'l' && (s)->Buffer[7] == 'u' && \
|
||||
(s)->Buffer[8] == 'm' && (s)->Buffer[9] == 'e' && (s)->Buffer[10] == '{' && \
|
||||
(s)->Buffer[19] == '-' && (s)->Buffer[24] == '-' && (s)->Buffer[29] == '-' && \
|
||||
(s)->Buffer[34] == '-' && (s)->Buffer[47] == '}')
|
||||
|
||||
typedef struct _MOUNTMGR_CREATE_POINT_INPUT {
|
||||
USHORT SymbolicLinkNameOffset;
|
||||
@@ -128,10 +129,14 @@ typedef struct _MOUNTDEV_NAME {
|
||||
#define IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS \
|
||||
CTL_CODE(MOUNTMGRCONTROLTYPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#define MOUNTMGR_IS_DOS_VOLUME_NAME(s) (MOUNTMGR_IS_VOLUME_NAME(s) && (s)->Length == 96 && (s)->Buffer[1] == '\\')
|
||||
#define MOUNTMGR_IS_DOS_VOLUME_NAME_WB(s) (MOUNTMGR_IS_VOLUME_NAME(s) && (s)->Length == 98 && (s)->Buffer[1] == '\\')
|
||||
#define MOUNTMGR_IS_NT_VOLUME_NAME(s) ( MOUNTMGR_IS_VOLUME_NAME(s) && (s)->Length == 96 && (s)->Buffer[1] == '?')
|
||||
#define MOUNTMGR_IS_NT_VOLUME_NAME_WB(s) (MOUNTMGR_IS_VOLUME_NAME(s) && (s)->Length == 98 && (s)->Buffer[1] == '?')
|
||||
#define MOUNTMGR_IS_DOS_VOLUME_NAME(s) \
|
||||
(MOUNTMGR_IS_VOLUME_NAME(s) && (s)->Length == 96 && (s)->Buffer[1] == '\\')
|
||||
#define MOUNTMGR_IS_DOS_VOLUME_NAME_WB(s) \
|
||||
(MOUNTMGR_IS_VOLUME_NAME(s) && (s)->Length == 98 && (s)->Buffer[1] == '\\')
|
||||
#define MOUNTMGR_IS_NT_VOLUME_NAME(s) \
|
||||
( MOUNTMGR_IS_VOLUME_NAME(s) && (s)->Length == 96 && (s)->Buffer[1] == '?')
|
||||
#define MOUNTMGR_IS_NT_VOLUME_NAME_WB(s) \
|
||||
(MOUNTMGR_IS_VOLUME_NAME(s) && (s)->Length == 98 && (s)->Buffer[1] == '?')
|
||||
|
||||
typedef struct _MOUNTMGR_VOLUME_PATHS {
|
||||
ULONG MultiSzLength;
|
||||
@@ -171,7 +176,7 @@ typedef struct _MOUNTMGR_SET_AUTO_MOUNT {
|
||||
#define IOCTL_MOUNTMGR_TRACELOG_CACHE \
|
||||
CTL_CODE(MOUNTMGRCONTROLTYPE, 18, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||||
|
||||
#endif
|
||||
#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
|
||||
|
||||
#endif /* _MOUNTMGR_ */
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user