mirror of
https://github.com/reactos/reactos.git
synced 2024-08-18 09:28:36 +00:00
Sync with trunk (r49303)
svn path=/branches/cmake-bringup/; revision=49307
This commit is contained in:
commit
b2f64ac552
|
@ -2,47 +2,47 @@
|
|||
|
||||
[Section]
|
||||
Name = Mozilla Firefox 3.6
|
||||
Version = 3.6.10
|
||||
Version = 3.6.11
|
||||
Licence = MPL/GPL/LGPL
|
||||
Description = The most popular and one of the best free Web Browsers out there.
|
||||
Size = 8.1M
|
||||
Category = 5
|
||||
URLSite = http://www.mozilla.com/en-US/
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.10/win32/en-US/Firefox%20Setup%203.6.10.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.11/win32/en-US/Firefox%20Setup%203.6.11.exe
|
||||
CDPath = none
|
||||
|
||||
[Section.0407]
|
||||
Description = Der populärste und einer der besten freien Webbrowser.
|
||||
Size = 8.0M
|
||||
URLSite = http://www.mozilla-europe.org/de/
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.10/win32/de/Firefox%20Setup%203.6.10.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.11/win32/de/Firefox%20Setup%203.6.11.exe
|
||||
|
||||
[Section.040a]
|
||||
Description = El más popular y uno de los mejores navegadores web gratuitos que hay.
|
||||
Size = 8.0M
|
||||
URLSite = http://www.mozilla-europe.org/es/
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.10/win32/es-ES/Firefox%20Setup%203.6.10.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.11/win32/es-ES/Firefox%20Setup%203.6.11.exe
|
||||
|
||||
[Section.0414]
|
||||
Description = Mest populære og best også gratis nettleserene der ute.
|
||||
Size = 8.0M
|
||||
URLSite = http://www.mozilla-europe.org/no/
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.10/win32/nb-NO/Firefox%20Setup%203.6.10.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.11/win32/nb-NO/Firefox%20Setup%203.6.11.exe
|
||||
|
||||
[Section.0415]
|
||||
Description = Najpopularniejsza i jedna z najlepszych darmowych przeglądarek internetowych.
|
||||
Size = 8.8M
|
||||
URLSite = http://www.mozilla-europe.org/pl/
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.10/win32/pl/Firefox%20Setup%203.6.10.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.11/win32/pl/Firefox%20Setup%203.6.11.exe
|
||||
|
||||
[Section.0419]
|
||||
Description = Один из самых популярных и лучших бесплатных браузеров.
|
||||
Size = 8.4M
|
||||
URLSite = http://www.mozilla-europe.org/ru/
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.10/win32/ru/Firefox%20Setup%203.6.10.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.11/win32/ru/Firefox%20Setup%203.6.11.exe
|
||||
|
||||
[Section.0422]
|
||||
Description = Найпопулярніший та один з кращих безплатних веб-браузерів.
|
||||
Size = 8.4M
|
||||
URLSite = http://www.mozilla-europe.org/uk/
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.10/win32/uk/Firefox%20Setup%203.6.10.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.11/win32/uk/Firefox%20Setup%203.6.11.exe
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
[Section]
|
||||
Name = LibreOffice
|
||||
Version = 3.3.0 Beta 1
|
||||
Version = 3.3.0 Beta 2
|
||||
Licence = LGPL
|
||||
Description = Former called OpenOffice. Open Source Office Suite.
|
||||
Size = 138.0MB
|
||||
Size = 318.0MB
|
||||
Category = 6
|
||||
URLSite = http://www.documentfoundation.org/
|
||||
URLDownload = http://download.documentfoundation.org/libreoffice/testing/LO_3.3.0-beta1_Win_x86_install_en-US.exe
|
||||
URLDownload = http://download.documentfoundation.org/libreoffice/testing/3.3.0-beta2/win/x86/LibO_3.3.0_beta2_Win_x86_install_multi.exe
|
||||
CDPath = none
|
||||
|
||||
[Section.0407]
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
[Section]
|
||||
Name = Miranda IM
|
||||
Version = 0.9.5
|
||||
Version = 0.9.8
|
||||
Licence = GPL
|
||||
Description = Open source multiprotocol instant messaging application - May not work completely.
|
||||
Size = 2.2MB
|
||||
Size = 3.0MB
|
||||
Category = 5
|
||||
URLSite = http://www.miranda-im.org/
|
||||
URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.9.5-unicode.exe
|
||||
URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.9.8-unicode.exe
|
||||
CDPath = none
|
||||
|
||||
[Section.0407]
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
[Section]
|
||||
Name = mIRC
|
||||
Version = 7.1
|
||||
Version = 7.14
|
||||
Licence = Shareware
|
||||
Description = The most popular client for the Internet Relay Chat (IRC).
|
||||
Size = 1.8M
|
||||
Size = 2.0M
|
||||
Category = 5
|
||||
URLSite = http://www.mirc.com/
|
||||
URLDownload = http://download.mirc.com/mirc71.exe
|
||||
URLDownload = http://download.mirc.com/mirc714.exe
|
||||
CDPath = none
|
||||
|
||||
[Section.0407]
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
[Section]
|
||||
Name = Opera
|
||||
Version = 10.62
|
||||
Version = 10.63
|
||||
Licence = Freeware
|
||||
Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client.
|
||||
Size = 12.7M
|
||||
Category = 5
|
||||
URLSite = http://www.opera.com/
|
||||
URLDownload = http://get4.opera.com/pub/opera/win/1062/int/Opera_1062_int_Setup.exe
|
||||
URLDownload = http://get4.opera.com/pub/opera/win/1063/int/Opera_1063_int_Setup.exe
|
||||
CDPath = none
|
||||
|
||||
[Section.0407]
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
[Section]
|
||||
Name = ScummVM
|
||||
Version = 1.1.1
|
||||
Version = 1.2.0
|
||||
Licence = GPL
|
||||
Description = Sam and Max, Day of the Tentacle, etc on ReactOS.
|
||||
Size = 3.3MB
|
||||
Size = 3.5MB
|
||||
Category = 4
|
||||
URLSite = http://scummvm.org/
|
||||
URLDownload = http://dfn.dl.sourceforge.net/project/scummvm/scummvm/1.1.1/scummvm-1.1.1-win32.exe
|
||||
URLDownload = http://dfn.dl.sourceforge.net/project/scummvm/scummvm/1.2.0/scummvm-1.2.0-win32.exe
|
||||
CDPath = none
|
||||
|
||||
[Section.0407]
|
||||
|
|
|
@ -2,31 +2,31 @@
|
|||
|
||||
[Section]
|
||||
Name = Mozilla SeaMonkey
|
||||
Version = 2.0.8
|
||||
Version = 2.0.9
|
||||
Licence = MPL/GPL/LGPL
|
||||
Description = Mozilla Suite is alive. This is the one and only Browser, Mail, Chat, and Composer bundle you will ever need.
|
||||
Size = 10.1MB
|
||||
Category = 5
|
||||
URLSite = http://www.seamonkey-project.org/
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.8/win32/en-US/SeaMonkey%20Setup%202.0.8.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.9/win32/en-US/SeaMonkey%20Setup%202.0.9.exe
|
||||
CDPath = none
|
||||
|
||||
[Section.0407]
|
||||
Description = Mozilla Suite lebt. Dies ist das einzige Browser-, Mail-, Chat- and Composerwerkzeug-Bundle welches Sie benötigen.
|
||||
Size = 10.0MB
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.8/win32/de/SeaMonkey%20Setup%202.0.8.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.9/win32/de/SeaMonkey%20Setup%202.0.9.exe
|
||||
|
||||
[Section.040a]
|
||||
Description = La suite de Mozilla está viva. Es el primero y único navegador web, gestor de correo, lector de noticias, Chat y editor HTML que necesitarás.
|
||||
Size = 10.0MB
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.8/win32/es-ES/SeaMonkey%20Setup%202.0.8.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.9/win32/es-ES/SeaMonkey%20Setup%202.0.9.exe
|
||||
|
||||
[Section.0415]
|
||||
Description = Pakiet Mozilla żyje. W zestawie: przeglądarka, klient poczty, IRC oraz Edytor HTML - wszystko, czego potrzebujesz.
|
||||
Size = 10.8MB
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.8/win32/pl/SeaMonkey%20Setup%202.0.8.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.9/win32/pl/SeaMonkey%20Setup%202.0.9.exe
|
||||
|
||||
[Section.0419]
|
||||
Description = Продолжение Mozilla Suite. Включает браузер, почтовый клиент, IRC-клиент и HTML-редактор.
|
||||
Size = 10.4MB
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.8/win32/ru/SeaMonkey%20Setup%202.0.8.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.9/win32/ru/SeaMonkey%20Setup%202.0.9.exe
|
||||
|
|
|
@ -2,41 +2,41 @@
|
|||
|
||||
[Section]
|
||||
Name = Mozilla Thunderbird
|
||||
Version = 3.1.4
|
||||
Version = 3.1.5
|
||||
Licence = MPL/GPL/LGPL
|
||||
Description = The most popular and one of the best free Mail Clients out there.
|
||||
Size = 9.0M
|
||||
Category = 5
|
||||
URLSite = http://www.mozilla-europe.org/en/products/thunderbird/
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.4/win32/en-US/Thunderbird%20Setup%203.1.4.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.5/win32/en-US/Thunderbird%20Setup%203.1.5.exe
|
||||
CDPath = none
|
||||
|
||||
[Section.0407]
|
||||
Description = Der populärste und einer der besten freien Mail-Clients.
|
||||
Size = 8.8M
|
||||
URLSite = http://www.mozilla-europe.org/de/products/thunderbird/
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.4/win32/de/Thunderbird%20Setup%203.1.4.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.5/win32/de/Thunderbird%20Setup%203.1.5.exe
|
||||
|
||||
[Section.040a]
|
||||
Description = El más popular y uno de los mejores clientes mail que hay.
|
||||
Size = 8.8M
|
||||
URLSite = http://www.mozilla-europe.org/es/products/thunderbird/
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.4/win32/es-ES/Thunderbird%20Setup%203.1.4.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.5/win32/es-ES/Thunderbird%20Setup%203.1.5.exe
|
||||
|
||||
[Section.0415]
|
||||
Description = Najpopularniejszy i jeden z najlepszych darmowych klientów poczty.
|
||||
Size = 9.7M
|
||||
URLSite = http://www.mozilla-europe.org/pl/products/thunderbird/
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.4/win32/pl/Thunderbird%20Setup%203.1.4.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.5/win32/pl/Thunderbird%20Setup%203.1.5.exe
|
||||
|
||||
[Section.0419]
|
||||
Description = Один из самых популярных и лучших бесплатных почтовых клиентов.
|
||||
Size = 9.2M
|
||||
URLSite = http://www.mozilla-europe.org/ru/products/thunderbird/
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.4/win32/ru/Thunderbird%20Setup%203.1.4.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.5/win32/ru/Thunderbird%20Setup%203.1.5.exe
|
||||
|
||||
[Section.0422]
|
||||
Description = Найпопулярніший та один з кращих поштових клієнтів.
|
||||
Size = 9.2M
|
||||
URLSite = http://www.mozillamessaging.com/uk/thunderbird/
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.4/win32/uk/Thunderbird%20Setup%203.1.4.exe
|
||||
URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.5/win32/uk/Thunderbird%20Setup%203.1.5.exe
|
||||
|
|
|
@ -435,6 +435,12 @@ LRESULT DesktopWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
|
|||
explorer_show_frame(SW_SHOWNORMAL);
|
||||
break;
|
||||
|
||||
case WM_DISPLAYCHANGE:
|
||||
MoveWindow(_hwnd, 0, 0, LOWORD(lparam), HIWORD(lparam), TRUE);
|
||||
MoveWindow(g_Globals._hwndShellView, 0, 0, LOWORD(lparam), HIWORD(lparam), TRUE);
|
||||
MoveWindow(_desktopBar, 0, HIWORD(lparam) - DESKTOPBARBAR_HEIGHT, LOWORD(lparam), DESKTOPBARBAR_HEIGHT, TRUE);
|
||||
break;
|
||||
|
||||
case WM_GETISHELLBROWSER:
|
||||
return (LRESULT)static_cast<IShellBrowser*>(this);
|
||||
|
||||
|
|
|
@ -31,9 +31,6 @@ typedef struct _SCMGR_HANDLE
|
|||
typedef struct _MANAGER_HANDLE
|
||||
{
|
||||
SCMGR_HANDLE Handle;
|
||||
|
||||
/* FIXME: Insert more data here */
|
||||
|
||||
WCHAR DatabaseName[1];
|
||||
} MANAGER_HANDLE, *PMANAGER_HANDLE;
|
||||
|
||||
|
@ -41,11 +38,7 @@ typedef struct _MANAGER_HANDLE
|
|||
typedef struct _SERVICE_HANDLE
|
||||
{
|
||||
SCMGR_HANDLE Handle;
|
||||
|
||||
PSERVICE ServiceEntry;
|
||||
|
||||
/* FIXME: Insert more data here */
|
||||
|
||||
} SERVICE_HANDLE, *PSERVICE_HANDLE;
|
||||
|
||||
|
||||
|
@ -149,7 +142,7 @@ ScmCreateManagerHandle(LPWSTR lpDatabaseName,
|
|||
if (lpDatabaseName == NULL)
|
||||
lpDatabaseName = SERVICES_ACTIVE_DATABASEW;
|
||||
|
||||
if (_wcsicmp(lpDatabaseName,SERVICES_FAILED_DATABASEW)==0)
|
||||
if (_wcsicmp(lpDatabaseName, SERVICES_FAILED_DATABASEW) == 0)
|
||||
{
|
||||
DPRINT("Database %S, does not exist\n",lpDatabaseName);
|
||||
return ERROR_DATABASE_DOES_NOT_EXIST;
|
||||
|
@ -168,8 +161,6 @@ ScmCreateManagerHandle(LPWSTR lpDatabaseName,
|
|||
|
||||
Ptr->Handle.Tag = MANAGER_TAG;
|
||||
|
||||
/* FIXME: initialize more data here */
|
||||
|
||||
wcscpy(Ptr->DatabaseName, lpDatabaseName);
|
||||
|
||||
*Handle = (SC_HANDLE)Ptr;
|
||||
|
@ -192,7 +183,6 @@ ScmCreateServiceHandle(PSERVICE lpServiceEntry,
|
|||
|
||||
Ptr->Handle.Tag = SERVICE_TAG;
|
||||
|
||||
/* FIXME: initialize more data here */
|
||||
Ptr->ServiceEntry = lpServiceEntry;
|
||||
|
||||
*Handle = (SC_HANDLE)Ptr;
|
||||
|
@ -453,9 +443,10 @@ DWORD RCloseServiceHandle(
|
|||
if (*hSCObject == 0)
|
||||
return ERROR_INVALID_HANDLE;
|
||||
|
||||
hManager = (PMANAGER_HANDLE)*hSCObject;
|
||||
hService = (PSERVICE_HANDLE)*hSCObject;
|
||||
if (hManager->Handle.Tag == MANAGER_TAG)
|
||||
hManager = ScmGetServiceManagerFromHandle(*hSCObject);
|
||||
hService = ScmGetServiceFromHandle(*hSCObject);
|
||||
|
||||
if (hManager != NULL)
|
||||
{
|
||||
DPRINT("Found manager handle\n");
|
||||
|
||||
|
@ -467,7 +458,7 @@ DWORD RCloseServiceHandle(
|
|||
DPRINT("RCloseServiceHandle() done\n");
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
else if (hService->Handle.Tag == SERVICE_TAG)
|
||||
else if (hService != NULL)
|
||||
{
|
||||
DPRINT("Found service handle\n");
|
||||
|
||||
|
@ -561,6 +552,8 @@ DWORD RControlService(
|
|||
DWORD dwError = ERROR_SUCCESS;
|
||||
DWORD pcbBytesNeeded = 0;
|
||||
DWORD dwServicesReturned = 0;
|
||||
DWORD dwControlsAccepted;
|
||||
DWORD dwCurrentState;
|
||||
HKEY hServicesKey = NULL;
|
||||
|
||||
DPRINT("RControlService() called\n");
|
||||
|
@ -662,6 +655,49 @@ DWORD RControlService(
|
|||
}
|
||||
else
|
||||
{
|
||||
dwControlsAccepted = lpService->Status.dwControlsAccepted;
|
||||
dwCurrentState = lpService->Status.dwCurrentState;
|
||||
|
||||
/* Check the current state before sending a control request */
|
||||
switch (dwCurrentState)
|
||||
{
|
||||
case SERVICE_STOP_PENDING:
|
||||
case SERVICE_STOPPED:
|
||||
return ERROR_SERVICE_CANNOT_ACCEPT_CTRL;
|
||||
|
||||
case SERVICE_START_PENDING:
|
||||
switch (dwControl)
|
||||
{
|
||||
case SERVICE_CONTROL_STOP:
|
||||
break;
|
||||
|
||||
case SERVICE_CONTROL_INTERROGATE:
|
||||
RtlCopyMemory(lpServiceStatus,
|
||||
&lpService->Status,
|
||||
sizeof(SERVICE_STATUS));
|
||||
return ERROR_SUCCESS;
|
||||
|
||||
default:
|
||||
return ERROR_SERVICE_CANNOT_ACCEPT_CTRL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/* Check if the control code is acceptable to the service */
|
||||
switch (dwControl)
|
||||
{
|
||||
case SERVICE_CONTROL_STOP:
|
||||
if ((dwControlsAccepted & SERVICE_ACCEPT_STOP) == 0)
|
||||
return ERROR_INVALID_SERVICE_CONTROL;
|
||||
break;
|
||||
|
||||
case SERVICE_CONTROL_PAUSE:
|
||||
case SERVICE_CONTROL_CONTINUE:
|
||||
if ((dwControlsAccepted & SERVICE_ACCEPT_PAUSE_CONTINUE) == 0)
|
||||
return ERROR_INVALID_SERVICE_CONTROL;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Send control code to the service */
|
||||
dwError = ScmControlService(lpService,
|
||||
dwControl);
|
||||
|
|
|
@ -1085,7 +1085,7 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Beep","Type",0x00010001,0x00000001
|
|||
HKLM,"SYSTEM\CurrentControlSet\Services\Blue","ErrorControl",0x00010001,0x00000000
|
||||
HKLM,"SYSTEM\CurrentControlSet\Services\Blue","Group",0x00000000,"Video Init"
|
||||
HKLM,"SYSTEM\CurrentControlSet\Services\Blue","ImagePath",0x00020000,"system32\drivers\blue.sys"
|
||||
HKLM,"SYSTEM\CurrentControlSet\Services\Blue","Start",0x00010001,0x00000004
|
||||
HKLM,"SYSTEM\CurrentControlSet\Services\Blue","Start",0x00010001,0x00000001
|
||||
HKLM,"SYSTEM\CurrentControlSet\Services\Blue","Type",0x00010001,0x00000001
|
||||
|
||||
; Cdfs (ISO96660) filesystem driver
|
||||
|
|
|
@ -586,6 +586,8 @@ media\fonts\symbol.ttf 3
|
|||
media\fonts\tahoma.ttf 3
|
||||
media\fonts\tahomabd.ttf 3
|
||||
|
||||
media\vgafonts\vgafonts.cab 4
|
||||
|
||||
media\nls\c_037.nls 1
|
||||
media\nls\c_424.nls 1
|
||||
media\nls\c_500.nls 1
|
||||
|
|
|
@ -146,7 +146,7 @@ typedef BOOL (WINAPI *STARTPAGEPRINTER) (HANDLE);
|
|||
typedef BOOL (WINAPI *SEEKPRINTER) (HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD,BOOL);
|
||||
typedef BOOL (WINAPI *SPLREADPRINTER) (HANDLE,LPBYTE *,DWORD);
|
||||
// Same as ddk/winsplp.h DriverUnloadComplete?
|
||||
typedef BOOL (WINAPI *SPLDRIVERUNLOADCOMPLETE) (LPWSTR);
|
||||
typedef BOOL (WINAPI *SPLDRIVERUNLOADCOMPLETE) (LPWSTR);
|
||||
// Driver support:
|
||||
// DrvDocumentEvent api/winddiui.h not W2k8 DocumentEventAW
|
||||
typedef INT (WINAPI *DOCUMENTEVENT) (HANDLE,HDC,INT,ULONG,PVOID,ULONG,PVOID);
|
||||
|
@ -173,10 +173,10 @@ HEAP_strdupA2W(
|
|||
VOID
|
||||
HEAP_free(LPVOID memory);
|
||||
|
||||
VOID
|
||||
VOID
|
||||
FASTCALL
|
||||
FONT_TextMetricWToA(
|
||||
const TEXTMETRICW *ptmW,
|
||||
const TEXTMETRICW *ptmW,
|
||||
LPTEXTMETRICA ptmA
|
||||
);
|
||||
|
||||
|
@ -279,7 +279,7 @@ WINAPI
|
|||
GdiSetLastError( DWORD dwErrCode );
|
||||
|
||||
DWORD WINAPI GdiGetCodePage(HDC);
|
||||
UINT FASTCALL DIB_BitmapBitsSize( PBITMAPINFO );
|
||||
UINT FASTCALL DIB_BitmapBitsSize( CONST BITMAPINFO* );
|
||||
|
||||
int
|
||||
WINAPI
|
||||
|
|
|
@ -166,6 +166,10 @@ SetPixelFormat(HDC hdc,
|
|||
INT iPixelFormat,
|
||||
CONST PIXELFORMATDESCRIPTOR * ppfd)
|
||||
{
|
||||
/* Can only be set once */
|
||||
INT current = GetPixelFormat(hdc);
|
||||
if(current) return current == iPixelFormat ;
|
||||
|
||||
if (glSetPixelFormat == NULL)
|
||||
if (OpenGLEnable() == FALSE)
|
||||
return(0);
|
||||
|
|
|
@ -34,7 +34,7 @@ DIB_BitmapMaxBitsSize( PBITMAPINFO Info, UINT ScanLines )
|
|||
|
||||
UINT
|
||||
FASTCALL
|
||||
DIB_BitmapBitsSize( PBITMAPINFO Info )
|
||||
DIB_BitmapBitsSize( CONST BITMAPINFO* Info )
|
||||
{
|
||||
UINT Ret;
|
||||
|
||||
|
@ -43,16 +43,16 @@ DIB_BitmapBitsSize( PBITMAPINFO Info )
|
|||
if ( Info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
|
||||
{
|
||||
PBITMAPCOREHEADER Core = (PBITMAPCOREHEADER)Info;
|
||||
Ret = Core->bcHeight *
|
||||
Ret = Core->bcHeight *
|
||||
((Core->bcWidth * Core->bcPlanes * Core->bcBitCount + 31) & ~31 ) / 8;
|
||||
}
|
||||
else /* assume BITMAPINFOHEADER */
|
||||
{
|
||||
if ((Info->bmiHeader.biCompression) &&
|
||||
if ((Info->bmiHeader.biCompression) &&
|
||||
(Info->bmiHeader.biCompression != BI_BITFIELDS))
|
||||
return Info->bmiHeader.biSizeImage;
|
||||
// Make Height positive always....
|
||||
Ret = abs(Info->bmiHeader.biHeight) *
|
||||
Ret = abs(Info->bmiHeader.biHeight) *
|
||||
((Info->bmiHeader.biWidth * Info->bmiHeader.biPlanes * Info->bmiHeader.biBitCount + 31) & ~31 ) / 8;
|
||||
}
|
||||
return Ret;
|
||||
|
@ -132,12 +132,12 @@ WINAPI
|
|||
GdiGetBitmapBitsSize(BITMAPINFO *lpbmi)
|
||||
{
|
||||
int retSize;
|
||||
|
||||
|
||||
if (lpbmi->bmiHeader.biSize == FIELD_OFFSET(BITMAPINFOHEADER, biPlanes))
|
||||
{
|
||||
/* Calc the bits Size and align it*/
|
||||
retSize = HIWORD(lpbmi->bmiHeader.biWidth) * ((LOWORD(lpbmi->bmiHeader.biWidth) *
|
||||
LOWORD(lpbmi->bmiHeader.biHeight) * HIWORD(lpbmi->bmiHeader.biHeight) + 31)
|
||||
retSize = HIWORD(lpbmi->bmiHeader.biWidth) * ((LOWORD(lpbmi->bmiHeader.biWidth) *
|
||||
LOWORD(lpbmi->bmiHeader.biHeight) * HIWORD(lpbmi->bmiHeader.biHeight) + 31)
|
||||
& -32) / 8;
|
||||
}
|
||||
else
|
||||
|
@ -148,13 +148,13 @@ GdiGetBitmapBitsSize(BITMAPINFO *lpbmi)
|
|||
if (lpbmi->bmiHeader.biHeight >=0 )
|
||||
{
|
||||
/* Calc the bits Size and align it*/
|
||||
retSize = lpbmi->bmiHeader.biHeight * ((lpbmi->bmiHeader.biWidth *
|
||||
retSize = lpbmi->bmiHeader.biHeight * ((lpbmi->bmiHeader.biWidth *
|
||||
lpbmi->bmiHeader.biPlanes * lpbmi->bmiHeader.biBitCount + 31) & -32) / 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Make height postiive if it negitve then calc the bits Size and align it*/
|
||||
retSize = (-lpbmi->bmiHeader.biHeight) * ((lpbmi->bmiHeader.biWidth *
|
||||
retSize = (-lpbmi->bmiHeader.biHeight) * ((lpbmi->bmiHeader.biWidth *
|
||||
lpbmi->bmiHeader.biPlanes * lpbmi->bmiHeader.biBitCount + 31) & -32) / 8;
|
||||
}
|
||||
}
|
||||
|
@ -189,7 +189,7 @@ CreateDIBSection(
|
|||
{ // Verify header due to converted may == info.
|
||||
if ( pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) )
|
||||
{
|
||||
if ( pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
|
||||
if ( pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
|
||||
pConvertedInfo->bmiHeader.biCompression == BI_PNG )
|
||||
{
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
|
@ -319,7 +319,7 @@ CreateBitmapIndirect(const BITMAP *pbm)
|
|||
(!(pbm->bmWidthBytes & 1)) )
|
||||
|
||||
{
|
||||
|
||||
|
||||
bitmap = CreateBitmap(pbm->bmWidth,
|
||||
pbm->bmHeight,
|
||||
pbm->bmPlanes,
|
||||
|
@ -409,7 +409,7 @@ GetDIBits(
|
|||
{
|
||||
if ( lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) )
|
||||
{
|
||||
if ( lpbmi->bmiHeader.biCompression == BI_JPEG ||
|
||||
if ( lpbmi->bmiHeader.biCompression == BI_JPEG ||
|
||||
lpbmi->bmiHeader.biCompression == BI_PNG )
|
||||
{
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
|
@ -461,78 +461,61 @@ CreateDIBitmap( HDC hDC,
|
|||
LONG width, height, compr, dibsize;
|
||||
WORD planes, bpp;
|
||||
// PDC_ATTR pDc_Attr;
|
||||
PBITMAPINFO pConvertedInfo;
|
||||
UINT ConvertedInfoSize;
|
||||
UINT cjBmpScanSize;
|
||||
PVOID pvSafeBits = NULL;
|
||||
UINT InfoSize = 0;
|
||||
UINT cjBmpScanSize = 0;
|
||||
HBITMAP hBmp;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
|
||||
if (!Header) return 0;
|
||||
|
||||
pConvertedInfo = ConvertBitmapInfo(Data, ColorUse,
|
||||
&ConvertedInfoSize, FALSE);
|
||||
|
||||
if (DIB_GetBitmapInfo(Header, &width, &height, &planes, &bpp, &compr, &dibsize) == -1)
|
||||
{
|
||||
GdiSetLastError(ERROR_INVALID_PARAMETER);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ( pConvertedInfo )
|
||||
{
|
||||
if ( pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) )
|
||||
{
|
||||
if ( pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
|
||||
pConvertedInfo->bmiHeader.biCompression == BI_PNG )
|
||||
{
|
||||
hBmp = NULL;
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// For Icm support.
|
||||
// GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
|
||||
|
||||
cjBmpScanSize = DIB_BitmapBitsSize((LPBITMAPINFO)pConvertedInfo);
|
||||
DPRINT("pBMI %x, Size bpp %d, dibsize %d, Conv %d, BSS %d\n", pConvertedInfo,bpp,dibsize,ConvertedInfoSize,cjBmpScanSize);
|
||||
if(Data)
|
||||
{
|
||||
_SEH2_TRY
|
||||
{
|
||||
cjBmpScanSize = DIB_BitmapBitsSize(Data);
|
||||
CalculateColorTableSize(&Data->bmiHeader, &ColorUse, &InfoSize);
|
||||
InfoSize += Data->bmiHeader.biSize;
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
Status = _SEH2_GetExceptionCode();
|
||||
}
|
||||
_SEH2_END
|
||||
}
|
||||
|
||||
if(!NT_SUCCESS(Status))
|
||||
{
|
||||
GdiSetLastError(ERROR_INVALID_PARAMETER);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
DPRINT("pBMI %x, Size bpp %d, dibsize %d, Conv %d, BSS %d\n", Data,bpp,dibsize,InfoSize,cjBmpScanSize);
|
||||
|
||||
if ( !width || !height )
|
||||
hBmp = GetStockObject(DEFAULT_BITMAP);
|
||||
else
|
||||
{
|
||||
if ( Bits && Init == CBM_INIT )
|
||||
{
|
||||
pvSafeBits = RtlAllocateHeap(GetProcessHeap(), 0, cjBmpScanSize);
|
||||
if (pvSafeBits == NULL)
|
||||
{
|
||||
hBmp = NULL;
|
||||
goto Exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
RtlCopyMemory( pvSafeBits, Bits, cjBmpScanSize);
|
||||
}
|
||||
}
|
||||
|
||||
hBmp = NtGdiCreateDIBitmapInternal(hDC,
|
||||
width,
|
||||
height,
|
||||
Init,
|
||||
(LPBYTE)pvSafeBits,
|
||||
(PBITMAPINFO)pConvertedInfo,
|
||||
(LPBYTE)Bits,
|
||||
(LPBITMAPINFO)Data,
|
||||
ColorUse,
|
||||
ConvertedInfoSize,
|
||||
InfoSize,
|
||||
cjBmpScanSize,
|
||||
0,
|
||||
0);
|
||||
|
||||
if ( Bits && Init == CBM_INIT )
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits);
|
||||
}
|
||||
Exit:
|
||||
if (Data != pConvertedInfo)
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
|
||||
return hBmp;
|
||||
}
|
||||
|
||||
|
@ -588,7 +571,7 @@ SetDIBits(HDC hDC,
|
|||
|
||||
if ( hOldBitmap )
|
||||
{
|
||||
if ( hDC )
|
||||
if ( hDC )
|
||||
hPal = SelectPalette(SavehDC, (HPALETTE)GetDCObject(hDC, GDI_OBJECT_TYPE_PALETTE), FALSE);
|
||||
|
||||
if ( lpbmi->bmiHeader.biSize < sizeof(BITMAPINFOHEADER))
|
||||
|
@ -782,7 +765,7 @@ SetDIBitsToDevice(
|
|||
/*
|
||||
if ( !pDc_Attr ||
|
||||
((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) &&
|
||||
(pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
|
||||
(pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
|
||||
pConvertedInfo->bmiHeader.biCompression == BI_PNG )) )*/
|
||||
{
|
||||
LinesCopied = NtGdiSetDIBitsToDeviceInternal( hdc,
|
||||
|
@ -806,7 +789,7 @@ SetDIBitsToDevice(
|
|||
RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits);
|
||||
if (lpbmi != pConvertedInfo)
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
|
||||
|
||||
|
||||
return LinesCopied;
|
||||
}
|
||||
|
||||
|
@ -886,17 +869,12 @@ StretchDIBits(HDC hdc,
|
|||
}
|
||||
}
|
||||
#endif
|
||||
if ( iUsage ) // Save time, we only look at non RGB.
|
||||
{
|
||||
pConvertedInfo = ConvertBitmapInfo(lpBitsInfo, iUsage,
|
||||
&ConvertedInfoSize, FALSE);
|
||||
if (!pConvertedInfo)
|
||||
{
|
||||
pConvertedInfo = ConvertBitmapInfo(lpBitsInfo, iUsage,
|
||||
&ConvertedInfoSize, FALSE);
|
||||
if (!pConvertedInfo)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
pConvertedInfo = (PBITMAPINFO)lpBitsInfo;
|
||||
}
|
||||
|
||||
cjBmpScanSize = DIB_BitmapBitsSize((LPBITMAPINFO)pConvertedInfo);
|
||||
|
||||
|
@ -933,7 +911,7 @@ StretchDIBits(HDC hdc,
|
|||
/*
|
||||
if ( !pDc_Attr ||
|
||||
((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) &&
|
||||
(pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
|
||||
(pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
|
||||
pConvertedInfo->bmiHeader.biCompression == BI_PNG )) )*/
|
||||
{
|
||||
LinesCopied = NtGdiStretchDIBitsInternal( hdc,
|
||||
|
|
|
@ -15,7 +15,7 @@ IntCreateDICW ( LPCWSTR lpwszDriver,
|
|||
{
|
||||
UNICODE_STRING Device, Output;
|
||||
HDC hDC = NULL;
|
||||
BOOL Display = FALSE, Default = TRUE;
|
||||
BOOL Display = FALSE, Default = FALSE;
|
||||
ULONG UMdhpdev = 0;
|
||||
|
||||
HANDLE hspool = NULL;
|
||||
|
@ -31,7 +31,7 @@ IntCreateDICW ( LPCWSTR lpwszDriver,
|
|||
|
||||
if ((!lpwszDevice) && (!lpwszDriver))
|
||||
{
|
||||
Default = FALSE; // Ask Win32k to set Default device.
|
||||
Default = TRUE; // Ask Win32k to set Default device.
|
||||
Display = TRUE; // Most likely to be DISPLAY.
|
||||
}
|
||||
else
|
||||
|
@ -60,7 +60,7 @@ IntCreateDICW ( LPCWSTR lpwszDriver,
|
|||
DPRINT1("Not a DISPLAY device! %wZ\n", &Device);
|
||||
}
|
||||
|
||||
hDC = NtGdiOpenDCW( (Default ? &Device : NULL),
|
||||
hDC = NtGdiOpenDCW( (Default ? NULL : &Device),
|
||||
(PDEVMODEW) lpInitData,
|
||||
(lpwszOutput ? &Output : NULL),
|
||||
iType, // DCW 0 and ICW 1.
|
||||
|
@ -318,7 +318,7 @@ WINAPI
|
|||
DeleteObject(HGDIOBJ hObject)
|
||||
{
|
||||
UINT Type = 0;
|
||||
|
||||
|
||||
/* From Wine: DeleteObject does not SetLastError() on a null object */
|
||||
if(!hObject) return FALSE;
|
||||
|
||||
|
@ -332,7 +332,7 @@ DeleteObject(HGDIOBJ hObject)
|
|||
|
||||
Type = GDI_HANDLE_GET_TYPE(hObject);
|
||||
|
||||
if ((Type == GDI_OBJECT_TYPE_METAFILE) ||
|
||||
if ((Type == GDI_OBJECT_TYPE_METAFILE) ||
|
||||
(Type == GDI_OBJECT_TYPE_ENHMETAFILE))
|
||||
return FALSE;
|
||||
|
||||
|
@ -348,7 +348,7 @@ DeleteObject(HGDIOBJ hObject)
|
|||
case GDI_OBJECT_TYPE_METADC:
|
||||
return MFDRV_DeleteObject( hObject );
|
||||
case GDI_OBJECT_TYPE_EMF:
|
||||
{
|
||||
{
|
||||
PLDC pLDC = GdiGetLDC(hObject);
|
||||
if ( !pLDC ) return FALSE;
|
||||
return EMFDRV_DeleteObject( hObject );
|
||||
|
@ -533,7 +533,7 @@ GetDeviceCaps(HDC hDC,
|
|||
return NtGdiGetDeviceCaps(hDC,i);
|
||||
}
|
||||
DPRINT("Device CAPS2\n");
|
||||
|
||||
|
||||
switch (i)
|
||||
{
|
||||
case DRIVERVERSION:
|
||||
|
@ -1603,7 +1603,7 @@ SelectObject(HDC hDC,
|
|||
|
||||
#if 0
|
||||
case GDI_OBJECT_TYPE_METADC:
|
||||
return MFDRV_SelectObject( hDC, hGdiObj);
|
||||
return MFDRV_SelectObject( hDC, hGdiObj);
|
||||
case GDI_OBJECT_TYPE_EMF:
|
||||
PLDC pLDC = GdiGetLDC(hDC);
|
||||
if ( !pLDC ) return NULL;
|
||||
|
|
|
@ -1,2 +1,12 @@
|
|||
HCURSOR
|
||||
CursorIconToCursor(HICON hIcon, BOOL SemiTransparent);
|
||||
CursorIconToCursor(HICON hIcon,
|
||||
BOOL SemiTransparent);
|
||||
|
||||
HICON CreateCursorIconFromData(PVOID ImageData,
|
||||
ICONIMAGE* IconImage,
|
||||
int cxDesired,
|
||||
int cyDesired,
|
||||
int xHotspot,
|
||||
int yHotspot,
|
||||
BOOL fIcon);
|
||||
|
||||
|
|
|
@ -43,7 +43,8 @@
|
|||
#include <pseh/pseh2.h>
|
||||
|
||||
#define HOOKID_TO_FLAG(HookId) (1 << ((HookId) + 1))
|
||||
#define ISITHOOKED(HookId) (GetWin32ClientInfo()->fsHooks & HOOKID_TO_FLAG(HookId))
|
||||
#define ISITHOOKED(HookId) (GetWin32ClientInfo()->fsHooks & HOOKID_TO_FLAG(HookId) ||\
|
||||
(GetWin32ClientInfo()->pDeskInfo && GetWin32ClientInfo()->pDeskInfo->fsHooks & HOOKID_TO_FLAG(HookId)))
|
||||
|
||||
/* Temporarily in here for now. */
|
||||
typedef struct _USERAPIHOOKINFO
|
||||
|
@ -168,7 +169,7 @@ SharedPtrToKernel(PVOID Ptr)
|
|||
static __inline BOOL
|
||||
IsThreadHooked(PCLIENTINFO pci)
|
||||
{
|
||||
return pci->fsHooks != 0;
|
||||
return (pci->fsHooks|pci->pDeskInfo->fsHooks) != 0;
|
||||
}
|
||||
|
||||
static __inline PDESKTOPINFO
|
||||
|
@ -194,3 +195,4 @@ VOID FASTCALL GetConnected(VOID);
|
|||
BOOL FASTCALL DefSetText(HWND hWnd, PCWSTR String, BOOL Ansi);
|
||||
BOOL FASTCALL TestWindowProcess(PWND);
|
||||
VOID UserGetWindowBorders(DWORD, DWORD, SIZE *, BOOL);
|
||||
VOID FASTCALL IntNotifyWinEvent(DWORD, HWND, LONG, LONG, DWORD);
|
||||
|
|
|
@ -83,9 +83,6 @@
|
|||
#define NtUserGetCursorPos(lpPoint) \
|
||||
(BOOL)NtUserCallOneParam((DWORD_PTR)lpPoint, ONEPARAM_ROUTINE_GETCURSORPOSITION)
|
||||
|
||||
#define NtUserIsWindowInDestroy(hWnd) \
|
||||
(BOOL)NtUserCallOneParam((DWORD_PTR)hWnd, ONEPARAM_ROUTINE_ISWINDOWINDESTROY)
|
||||
|
||||
#define NtUserEnableProcessWindowGhosting(bEnable) \
|
||||
NtUserCallOneParam((DWORD_PTR)bEnable, ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING)
|
||||
|
||||
|
|
|
@ -457,7 +457,6 @@ ChangeDisplaySettingsExA(
|
|||
LONG rc;
|
||||
UNICODE_STRING DeviceName;
|
||||
PUNICODE_STRING pDeviceName = &DeviceName;
|
||||
LPDEVMODEW pDevModeW;
|
||||
|
||||
if (lpszDeviceName != NULL)
|
||||
{
|
||||
|
@ -471,14 +470,19 @@ ChangeDisplaySettingsExA(
|
|||
pDeviceName = NULL;
|
||||
|
||||
if (lpDevMode != NULL)
|
||||
{
|
||||
LPDEVMODEW pDevModeW;
|
||||
pDevModeW = GdiConvertToDevmodeW(lpDevMode);
|
||||
if(pDevModeW)
|
||||
{
|
||||
rc = NtUserChangeDisplaySettings ( pDeviceName, pDevModeW, hwnd, dwflags, lParam );
|
||||
RtlFreeHeap(GetProcessHeap(), 0, pDevModeW);
|
||||
}
|
||||
else
|
||||
rc = DISP_CHANGE_SUCCESSFUL;
|
||||
}
|
||||
else
|
||||
pDevModeW = NULL;
|
||||
|
||||
rc = NtUserChangeDisplaySettings ( pDeviceName, pDevModeW, hwnd, dwflags, lParam );
|
||||
|
||||
if (pDevModeW != NULL)
|
||||
RtlFreeHeap(GetProcessHeap(), 0, pDevModeW);
|
||||
rc = NtUserChangeDisplaySettings ( pDeviceName, NULL, hwnd, dwflags, lParam );
|
||||
|
||||
if (lpszDeviceName != NULL)
|
||||
RtlFreeUnicodeString ( &DeviceName );
|
||||
|
@ -539,6 +543,6 @@ ChangeDisplaySettingsW(
|
|||
DWORD dwflags)
|
||||
{
|
||||
if(lpDevMode)
|
||||
lpDevMode->dmDriverExtra = 0;
|
||||
lpDevMode->dmDriverExtra = 0;
|
||||
return ChangeDisplaySettingsExW ( NULL, lpDevMode, NULL, dwflags, 0 );
|
||||
}
|
||||
|
|
|
@ -304,13 +304,13 @@ GetUser32Handle(HANDLE handle)
|
|||
static const BOOL g_ObjectHeapTypeShared[VALIDATE_TYPE_EVENT + 1] =
|
||||
{
|
||||
FALSE, /* VALIDATE_TYPE_FREE (not used) */
|
||||
FALSE, /* VALIDATE_TYPE_WIN FALSE */
|
||||
FALSE, /* VALIDATE_TYPE_WIN */
|
||||
TRUE, /* VALIDATE_TYPE_MENU FALSE */
|
||||
TRUE, /* VALIDATE_TYPE_CURSOR */
|
||||
TRUE, /* VALIDATE_TYPE_MWPOS */
|
||||
TRUE, /* VALIDATE_TYPE_HOOK FALSE */
|
||||
FALSE, /* VALIDATE_TYPE_HOOK */
|
||||
FALSE, /* (not used) */
|
||||
TRUE, /* VALIDATE_TYPE_CALLPROC FALSE */
|
||||
FALSE, /* VALIDATE_TYPE_CALLPROC */
|
||||
TRUE, /* VALIDATE_TYPE_ACCEL */
|
||||
FALSE, /* (not used) */
|
||||
FALSE, /* (not used) */
|
||||
|
|
|
@ -298,7 +298,7 @@ IntGetWndProc(PWND pWnd, BOOL Ansi)
|
|||
}
|
||||
return Ret;
|
||||
}
|
||||
// Wine Class tests:
|
||||
// Wine Class tests:
|
||||
/* Edit controls are special - they return a wndproc handle when
|
||||
GetWindowLongPtr is called with a different A/W.
|
||||
On the other hand there is no W->A->W conversion so this control
|
||||
|
@ -831,7 +831,6 @@ CreateSmallIcon(HICON StdIcon)
|
|||
int SmallIconWidth;
|
||||
int SmallIconHeight;
|
||||
BITMAP StdBitmapInfo;
|
||||
HDC hInfoDc = NULL;
|
||||
HDC hSourceDc = NULL;
|
||||
HDC hDestDc = NULL;
|
||||
ICONINFO SmallInfo;
|
||||
|
@ -867,15 +866,6 @@ CreateSmallIcon(HICON StdIcon)
|
|||
return StdIcon;
|
||||
}
|
||||
|
||||
/* Get a handle to a info DC and handles to DCs which can be used to
|
||||
select a bitmap into. This is done to avoid triggering a switch to
|
||||
graphics mode (if we're currently in text/blue screen mode) */
|
||||
hInfoDc = CreateICW(NULL, NULL, NULL, NULL);
|
||||
if (NULL == hInfoDc)
|
||||
{
|
||||
ERR("Failed to create info DC\n");
|
||||
goto cleanup;
|
||||
}
|
||||
hSourceDc = CreateCompatibleDC(NULL);
|
||||
if (NULL == hSourceDc)
|
||||
{
|
||||
|
@ -895,7 +885,7 @@ CreateSmallIcon(HICON StdIcon)
|
|||
ERR("Failed to select source color bitmap\n");
|
||||
goto cleanup;
|
||||
}
|
||||
SmallInfo.hbmColor = CreateCompatibleBitmap(hInfoDc, SmallIconWidth,
|
||||
SmallInfo.hbmColor = CreateCompatibleBitmap(hSourceDc, SmallIconWidth,
|
||||
SmallIconHeight);
|
||||
if (NULL == SmallInfo.hbmColor)
|
||||
{
|
||||
|
@ -921,8 +911,7 @@ CreateSmallIcon(HICON StdIcon)
|
|||
ERR("Failed to select source mask bitmap\n");
|
||||
goto cleanup;
|
||||
}
|
||||
SmallInfo.hbmMask = CreateBitmap(SmallIconWidth, SmallIconHeight, 1, 1,
|
||||
NULL);
|
||||
SmallInfo.hbmMask = CreateCompatibleBitmap(hSourceDc, SmallIconWidth, SmallIconHeight);
|
||||
if (NULL == SmallInfo.hbmMask)
|
||||
{
|
||||
ERR("Failed to create mask bitmap\n");
|
||||
|
@ -976,10 +965,6 @@ cleanup:
|
|||
{
|
||||
DeleteDC(hSourceDc);
|
||||
}
|
||||
if (NULL != hInfoDc)
|
||||
{
|
||||
DeleteDC(hInfoDc);
|
||||
}
|
||||
|
||||
return SmallIcon;
|
||||
}
|
||||
|
@ -1070,9 +1055,9 @@ RegisterClassExWOWW(WNDCLASSEXW *lpwcx,
|
|||
clsMenuName.pszClientAnsiMenuName = AnsiMenuName.Buffer;
|
||||
clsMenuName.pwszClientUnicodeMenuName = MenuName.Buffer;
|
||||
clsMenuName.pusMenuName = &MenuName;
|
||||
|
||||
|
||||
Atom = NtUserRegisterClassExWOW( &WndClass,
|
||||
&ClassName,
|
||||
&ClassName,
|
||||
NULL, //PUNICODE_STRING ClsNVersion,
|
||||
&clsMenuName,
|
||||
fnID,
|
||||
|
|
|
@ -458,10 +458,16 @@ static BOOL create_icon_bitmaps( const BITMAPINFO *bmi, int width, int height,
|
|||
void *color_bits, *mask_bits;
|
||||
BOOL ret = FALSE;
|
||||
HDC hdc = 0;
|
||||
static HDC hScreenDC = 0;
|
||||
|
||||
if (!(info = HeapAlloc( GetProcessHeap(), 0, max( size, FIELD_OFFSET( BITMAPINFO, bmiColors[2] )))))
|
||||
return FALSE;
|
||||
if (!(hdc = CreateCompatibleDC( 0 ))) goto done;
|
||||
if(!hScreenDC)
|
||||
{
|
||||
hScreenDC = GetDC(0);
|
||||
if(!hScreenDC) goto done;
|
||||
}
|
||||
if (!(hdc = CreateCompatibleDC(hScreenDC))) goto done;
|
||||
|
||||
memcpy( info, bmi, size );
|
||||
info->bmiHeader.biHeight /= 2;
|
||||
|
@ -485,8 +491,8 @@ static BOOL create_icon_bitmaps( const BITMAPINFO *bmi, int width, int height,
|
|||
else
|
||||
{
|
||||
if (!(*mask = CreateBitmap( width, height, 1, 1, NULL ))) goto done;
|
||||
if (!(*color = CreateBitmap( width, height, bmi->bmiHeader.biPlanes,
|
||||
bmi->bmiHeader.biBitCount, NULL )))
|
||||
if (!(*color = CreateBitmap( width, height, GetDeviceCaps(hScreenDC, PLANES),
|
||||
GetDeviceCaps(hScreenDC, BITSPIXEL), NULL )))
|
||||
{
|
||||
DeleteObject( *mask );
|
||||
goto done;
|
||||
|
@ -523,7 +529,7 @@ static BOOL create_icon_bitmaps( const BITMAPINFO *bmi, int width, int height,
|
|||
ret = TRUE;
|
||||
|
||||
done:
|
||||
DeleteDC( hdc );
|
||||
if(hdc) DeleteDC( hdc );
|
||||
HeapFree( GetProcessHeap(), 0, info );
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -103,6 +103,7 @@ BOOL
|
|||
FASTCALL
|
||||
DefSetText(HWND hWnd, PCWSTR String, BOOL Ansi)
|
||||
{
|
||||
BOOL Ret;
|
||||
LARGE_STRING lsString;
|
||||
|
||||
if ( String )
|
||||
|
@ -112,7 +113,12 @@ DefSetText(HWND hWnd, PCWSTR String, BOOL Ansi)
|
|||
else
|
||||
RtlInitLargeUnicodeString((PLARGE_UNICODE_STRING)&lsString, String, 0);
|
||||
}
|
||||
return NtUserDefSetText(hWnd, (String ? &lsString : NULL));
|
||||
Ret = NtUserDefSetText(hWnd, (String ? &lsString : NULL));
|
||||
|
||||
if (Ret)
|
||||
IntNotifyWinEvent(EVENT_OBJECT_NAMECHANGE, hWnd, OBJID_WINDOW, CHILDID_SELF, 0);
|
||||
|
||||
return Ret;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1969,7 +1975,6 @@ RealDefWindowProcA(HWND hWnd,
|
|||
{
|
||||
DefWndNCPaint(hWnd, (HRGN)1, -1);
|
||||
}
|
||||
|
||||
Result = 1;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -1373,9 +1373,9 @@ IntDrawState(HDC hdc, HBRUSH hbr, DRAWSTATEPROC func, LPARAM lp, WPARAM wp,
|
|||
}
|
||||
|
||||
if (flags & DSS_DISABLED)
|
||||
hbrtmp = CreateSolidBrush(GetSysColor(COLOR_3DHILIGHT));
|
||||
hbrtmp = GetSysColorBrush(COLOR_3DHILIGHT);
|
||||
else if (flags & DSS_DEFAULT)
|
||||
hbrtmp = CreateSolidBrush(GetSysColor(COLOR_3DSHADOW));
|
||||
hbrtmp = GetSysColorBrush(COLOR_3DSHADOW);
|
||||
|
||||
/* Draw light or dark shadow */
|
||||
if (flags & (DSS_DISABLED|DSS_DEFAULT))
|
||||
|
@ -1388,13 +1388,11 @@ IntDrawState(HDC hdc, HBRUSH hbr, DRAWSTATEPROC func, LPARAM lp, WPARAM wp,
|
|||
if(!BitBlt(hdc, x+1, y+1, cx, cy, memdc, 0, 0, 0x00B8074A))
|
||||
goto cleanup;
|
||||
SelectObject(hdc, hbsave);
|
||||
DeleteObject(hbrtmp);
|
||||
hbrtmp = 0;
|
||||
}
|
||||
|
||||
if (flags & DSS_DISABLED)
|
||||
{
|
||||
hbr = hbrtmp = CreateSolidBrush(GetSysColor(COLOR_3DSHADOW));
|
||||
hbr = hbrtmp = GetSysColorBrush(COLOR_3DSHADOW);
|
||||
if(!hbrtmp)
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -1418,8 +1416,6 @@ cleanup:
|
|||
SelectObject(hdc, hbsave);
|
||||
if(hbmsave)
|
||||
SelectObject(memdc, hbmsave);
|
||||
if(hbrtmp)
|
||||
DeleteObject(hbrtmp);
|
||||
if(hbm)
|
||||
DeleteObject(hbm);
|
||||
if(memdc)
|
||||
|
|
|
@ -34,6 +34,14 @@
|
|||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(user32);
|
||||
|
||||
typedef struct _NOTIFYEVENT
|
||||
{
|
||||
DWORD event;
|
||||
LONG idObject;
|
||||
LONG idChild;
|
||||
DWORD flags;
|
||||
} NOTIFYEVENT, *PNOTIFYEVENT;
|
||||
|
||||
/* PRIVATE FUNCTIONS *********************************************************/
|
||||
|
||||
static
|
||||
|
@ -99,6 +107,29 @@ IntSetWindowsHook(
|
|||
return NtUserSetWindowsHookEx(hMod, &USModuleName, dwThreadId, idHook, lpfn, bAnsi);
|
||||
}
|
||||
|
||||
/*
|
||||
Since ReactOS uses User32 as the main message source this was needed.
|
||||
Base on the funny rules from the wine tests it left it with this option.
|
||||
8^(
|
||||
*/
|
||||
VOID
|
||||
FASTCALL
|
||||
IntNotifyWinEvent(
|
||||
DWORD event,
|
||||
HWND hwnd,
|
||||
LONG idObject,
|
||||
LONG idChild,
|
||||
DWORD flags
|
||||
)
|
||||
{
|
||||
NOTIFYEVENT ne;
|
||||
ne.event = event;
|
||||
ne.idObject = idObject;
|
||||
ne.idChild = idChild;
|
||||
ne.flags = flags;
|
||||
if (gpsi->dwInstalledEventHooks & GetMaskFromEvent(event))
|
||||
NtUserCallHwndParam(hwnd, (DWORD)&ne, HWNDPARAM_ROUTINE_ROS_NOTIFYWINEVENT);
|
||||
}
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
|
@ -195,7 +226,7 @@ CallNextHookEx(
|
|||
{
|
||||
PCLIENTINFO ClientInfo;
|
||||
DWORD Flags, Save;
|
||||
PHOOK pHook;
|
||||
PHOOK pHook, phkNext;
|
||||
LRESULT lResult = 0;
|
||||
|
||||
GetConnected();
|
||||
|
@ -204,9 +235,14 @@ CallNextHookEx(
|
|||
|
||||
if (!ClientInfo->phkCurrent) return 0;
|
||||
|
||||
pHook = SharedPtrToUser(ClientInfo->phkCurrent);
|
||||
pHook = DesktopPtrToUser(ClientInfo->phkCurrent);
|
||||
|
||||
if (pHook->HookId == WH_CALLWNDPROC || pHook->HookId == WH_CALLWNDPROCRET)
|
||||
if (!pHook->phkNext) return 0; // Nothing to do....
|
||||
|
||||
phkNext = DesktopPtrToUser(pHook->phkNext);
|
||||
|
||||
if ( phkNext->HookId == WH_CALLWNDPROC ||
|
||||
phkNext->HookId == WH_CALLWNDPROCRET)
|
||||
{
|
||||
Save = ClientInfo->dwHookData;
|
||||
Flags = ClientInfo->CI_flags & CI_CURTHPRHOOK;
|
||||
|
@ -215,7 +251,7 @@ CallNextHookEx(
|
|||
if (wParam) ClientInfo->CI_flags |= CI_CURTHPRHOOK;
|
||||
else ClientInfo->CI_flags &= ~CI_CURTHPRHOOK;
|
||||
|
||||
if (pHook->HookId == WH_CALLWNDPROC)
|
||||
if (phkNext->HookId == WH_CALLWNDPROC)
|
||||
{
|
||||
PCWPSTRUCT pCWP = (PCWPSTRUCT)lParam;
|
||||
|
||||
|
@ -225,7 +261,7 @@ CallNextHookEx(
|
|||
pCWP->lParam,
|
||||
(ULONG_PTR)&lResult,
|
||||
FNID_CALLWNDPROC,
|
||||
pHook->Ansi);
|
||||
phkNext->Ansi);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -239,7 +275,7 @@ CallNextHookEx(
|
|||
pCWPR->lParam,
|
||||
(ULONG_PTR)&lResult,
|
||||
FNID_CALLWNDPROCRET,
|
||||
pHook->Ansi);
|
||||
phkNext->Ansi);
|
||||
}
|
||||
ClientInfo->CI_flags ^= ((ClientInfo->CI_flags ^ Flags) & CI_CURTHPRHOOK);
|
||||
ClientInfo->dwHookData = Save;
|
||||
|
@ -252,23 +288,27 @@ CallNextHookEx(
|
|||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
HHOOK
|
||||
WINAPI
|
||||
SetWindowsHookW(int idHook, HOOKPROC lpfn)
|
||||
{
|
||||
return IntSetWindowsHook(idHook, lpfn, NULL, 0, FALSE);
|
||||
DWORD ThreadId = PtrToUint(NtCurrentTeb()->ClientId.UniqueThread);
|
||||
return IntSetWindowsHook(idHook, lpfn, NULL, ThreadId, FALSE);
|
||||
// return NtUserSetWindowsHookAW(idHook, lpfn, FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
HHOOK
|
||||
WINAPI
|
||||
SetWindowsHookA(int idHook, HOOKPROC lpfn)
|
||||
{
|
||||
return IntSetWindowsHook(idHook, lpfn, NULL, 0, TRUE);
|
||||
DWORD ThreadId = PtrToUint(NtCurrentTeb()->ClientId.UniqueThread);
|
||||
return IntSetWindowsHook(idHook, lpfn, NULL, ThreadId, TRUE);
|
||||
// return NtUserSetWindowsHookAW(idHook, lpfn, TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -377,7 +417,7 @@ IsWinEventHookInstalled(
|
|||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
HHOOK
|
||||
WINAPI
|
||||
|
@ -392,7 +432,7 @@ SetWindowsHookExA(
|
|||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
HHOOK
|
||||
WINAPI
|
||||
|
@ -409,22 +449,21 @@ NTSTATUS WINAPI
|
|||
User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
|
||||
{
|
||||
PHOOKPROC_CALLBACK_ARGUMENTS Common;
|
||||
LRESULT Result;
|
||||
CREATESTRUCTW Csw;
|
||||
CBT_CREATEWNDW CbtCreatewndw;
|
||||
CREATESTRUCTA Csa;
|
||||
CBT_CREATEWNDA CbtCreatewnda;
|
||||
PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra = NULL;
|
||||
WPARAM wParam = 0;
|
||||
LPARAM lParam = 0;
|
||||
PKBDLLHOOKSTRUCT KeyboardLlData;
|
||||
PMSLLHOOKSTRUCT MouseLlData;
|
||||
PMSG Msg;
|
||||
PMOUSEHOOKSTRUCT MHook;
|
||||
PCWPSTRUCT CWP;
|
||||
PCWPRETSTRUCT CWPR;
|
||||
KBDLLHOOKSTRUCT KeyboardLlData, *pKeyboardLlData;
|
||||
MSLLHOOKSTRUCT MouseLlData, *pMouseLlData;
|
||||
MSG Msg, *pMsg;
|
||||
PMOUSEHOOKSTRUCT pMHook;
|
||||
CWPSTRUCT CWP, *pCWP;
|
||||
CWPRETSTRUCT CWPR, *pCWPR;
|
||||
PRECTL prl;
|
||||
LPCBTACTIVATESTRUCT pcbtas;
|
||||
WPARAM wParam = 0;
|
||||
LPARAM lParam = 0;
|
||||
LRESULT Result = 0;
|
||||
BOOL Hit = FALSE;
|
||||
|
||||
Common = (PHOOKPROC_CALLBACK_ARGUMENTS) Arguments;
|
||||
|
||||
|
@ -438,34 +477,16 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
|
|||
CbtCreatewndExtra = (PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS)
|
||||
((PCHAR) Common + Common->lParam);
|
||||
Csw = CbtCreatewndExtra->Cs;
|
||||
if (NULL != CbtCreatewndExtra->Cs.lpszName)
|
||||
{
|
||||
Csw.lpszName = (LPCWSTR)((PCHAR) CbtCreatewndExtra
|
||||
+ (ULONG_PTR) CbtCreatewndExtra->Cs.lpszName);
|
||||
}
|
||||
if (0 != HIWORD(CbtCreatewndExtra->Cs.lpszClass))
|
||||
{
|
||||
Csw.lpszClass = (LPCWSTR)((PCHAR) CbtCreatewndExtra
|
||||
+ LOWORD((ULONG_PTR) CbtCreatewndExtra->Cs.lpszClass));
|
||||
}
|
||||
Csw.lpszName = CbtCreatewndExtra->Cs.lpszName;
|
||||
Csw.lpszClass = CbtCreatewndExtra->Cs.lpszClass;
|
||||
wParam = Common->wParam;
|
||||
if (Common->Ansi)
|
||||
{
|
||||
memcpy(&Csa, &Csw, sizeof(CREATESTRUCTW));
|
||||
CbtCreatewnda.lpcs = &Csa;
|
||||
CbtCreatewnda.hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter;
|
||||
lParam = (LPARAM) &CbtCreatewnda;
|
||||
}
|
||||
else
|
||||
{
|
||||
CbtCreatewndw.lpcs = &Csw;
|
||||
CbtCreatewndw.hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter;
|
||||
lParam = (LPARAM) &CbtCreatewndw;
|
||||
}
|
||||
CbtCreatewndw.lpcs = &Csw;
|
||||
CbtCreatewndw.hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter;
|
||||
lParam = (LPARAM) &CbtCreatewndw;
|
||||
break;
|
||||
case HCBT_CLICKSKIPPED:
|
||||
MHook = (PMOUSEHOOKSTRUCT)((PCHAR) Common + Common->lParam);
|
||||
lParam = (LPARAM) MHook;
|
||||
pMHook = (PMOUSEHOOKSTRUCT)((PCHAR) Common + Common->lParam);
|
||||
lParam = (LPARAM) pMHook;
|
||||
break;
|
||||
case HCBT_MOVESIZE:
|
||||
prl = (PRECTL)((PCHAR) Common + Common->lParam);
|
||||
|
@ -475,7 +496,7 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
|
|||
pcbtas = (LPCBTACTIVATESTRUCT)((PCHAR) Common + Common->lParam);
|
||||
lParam = (LPARAM) pcbtas;
|
||||
break;
|
||||
case HCBT_KEYSKIPPED:
|
||||
case HCBT_KEYSKIPPED: /* The rest SEH support */
|
||||
case HCBT_MINMAX:
|
||||
case HCBT_SETFOCUS:
|
||||
case HCBT_SYSCOMMAND:
|
||||
|
@ -490,7 +511,17 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
|
|||
}
|
||||
|
||||
if (Common->Proc)
|
||||
Result = Common->Proc(Common->Code, wParam, lParam);
|
||||
{
|
||||
_SEH2_TRY
|
||||
{
|
||||
Result = Common->Proc(Common->Code, wParam, lParam);
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
Hit = TRUE;
|
||||
}
|
||||
_SEH2_END;
|
||||
}
|
||||
else
|
||||
{
|
||||
ERR("Common = 0x%x, Proc = 0x%x\n",Common,Common->Proc);
|
||||
|
@ -499,46 +530,86 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
|
|||
{
|
||||
case HCBT_CREATEWND:
|
||||
CbtCreatewndExtra->WndInsertAfter = CbtCreatewndw.hwndInsertAfter;
|
||||
CbtCreatewndExtra->Cs.x = CbtCreatewndw.lpcs->x;
|
||||
CbtCreatewndExtra->Cs.y = CbtCreatewndw.lpcs->y;
|
||||
CbtCreatewndExtra->Cs.cx = CbtCreatewndw.lpcs->cx;
|
||||
CbtCreatewndExtra->Cs.cy = CbtCreatewndw.lpcs->cy;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case WH_KEYBOARD_LL:
|
||||
KeyboardLlData = (PKBDLLHOOKSTRUCT)((PCHAR) Common + Common->lParam);
|
||||
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) KeyboardLlData);
|
||||
ERR("WH_KEYBOARD_LL: Code %d, wParam %d\n",Common->Code,Common->wParam);
|
||||
pKeyboardLlData = (PKBDLLHOOKSTRUCT)((PCHAR) Common + Common->lParam);
|
||||
RtlCopyMemory(&KeyboardLlData, pKeyboardLlData, sizeof(KBDLLHOOKSTRUCT));
|
||||
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) &KeyboardLlData);
|
||||
break;
|
||||
case WH_MOUSE_LL:
|
||||
MouseLlData = (PMSLLHOOKSTRUCT)((PCHAR) Common + Common->lParam);
|
||||
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) MouseLlData);
|
||||
pMouseLlData = (PMSLLHOOKSTRUCT)((PCHAR) Common + Common->lParam);
|
||||
RtlCopyMemory(&MouseLlData, pMouseLlData, sizeof(MSLLHOOKSTRUCT));
|
||||
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) &MouseLlData);
|
||||
break;
|
||||
case WH_MOUSE:
|
||||
MHook = (PMOUSEHOOKSTRUCT)((PCHAR) Common + Common->lParam);
|
||||
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) MHook);
|
||||
case WH_MOUSE: /* SEH support */
|
||||
pMHook = (PMOUSEHOOKSTRUCT)((PCHAR) Common + Common->lParam);
|
||||
_SEH2_TRY
|
||||
{
|
||||
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) pMHook);
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
Hit = TRUE;
|
||||
}
|
||||
_SEH2_END;
|
||||
break;
|
||||
case WH_CALLWNDPROC:
|
||||
CWP = (PCWPSTRUCT)((PCHAR) Common + Common->lParam);
|
||||
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) CWP);
|
||||
ERR("WH_CALLWNDPROC: Code %d, wParam %d\n",Common->Code,Common->wParam);
|
||||
pCWP = (PCWPSTRUCT)((PCHAR) Common + Common->lParam);
|
||||
RtlCopyMemory(&CWP, pCWP, sizeof(CWPSTRUCT));
|
||||
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) &CWP);
|
||||
break;
|
||||
case WH_CALLWNDPROCRET:
|
||||
CWPR = (PCWPRETSTRUCT)((PCHAR) Common + Common->lParam);
|
||||
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) CWPR);
|
||||
pCWPR = (PCWPRETSTRUCT)((PCHAR) Common + Common->lParam);
|
||||
RtlCopyMemory(&CWPR, pCWPR, sizeof(CWPRETSTRUCT));
|
||||
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) &CWPR);
|
||||
break;
|
||||
case WH_MSGFILTER:
|
||||
case WH_MSGFILTER: /* All SEH support */
|
||||
ERR("WH_MSGFILTER: Code %d, wParam %d\n",Common->Code,Common->wParam);
|
||||
case WH_SYSMSGFILTER:
|
||||
case WH_GETMESSAGE:
|
||||
Msg = (PMSG)((PCHAR) Common + Common->lParam);
|
||||
// FIXME("UHOOK Memory: %x: %x\n",Common, Msg);
|
||||
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) Msg);
|
||||
pMsg = (PMSG)((PCHAR) Common + Common->lParam);
|
||||
RtlCopyMemory(&Msg, pMsg, sizeof(MSG));
|
||||
_SEH2_TRY
|
||||
{
|
||||
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) &Msg);
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
Hit = TRUE;
|
||||
}
|
||||
_SEH2_END;
|
||||
if (!Hit && Common->HookId == WH_GETMESSAGE)
|
||||
RtlCopyMemory(pMsg, &Msg, sizeof(MSG));
|
||||
break;
|
||||
case WH_FOREGROUNDIDLE:
|
||||
case WH_FOREGROUNDIDLE: /* <-- SEH support */
|
||||
case WH_KEYBOARD:
|
||||
case WH_SHELL:
|
||||
Result = Common->Proc(Common->Code, Common->wParam, Common->lParam);
|
||||
_SEH2_TRY
|
||||
{
|
||||
Result = Common->Proc(Common->Code, Common->wParam, Common->lParam);
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
Hit = TRUE;
|
||||
}
|
||||
_SEH2_END;
|
||||
break;
|
||||
default:
|
||||
return ZwCallbackReturn(NULL, 0, STATUS_NOT_SUPPORTED);
|
||||
}
|
||||
|
||||
if (Hit)
|
||||
{
|
||||
ERR("Hook Exception! Id: %d, Code %d, Proc 0x%x\n",Common->HookId,Common->Code,Common->Proc);
|
||||
}
|
||||
return ZwCallbackReturn(&Result, sizeof(LRESULT), STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
|
|
@ -138,6 +138,7 @@ EnableWindow(HWND hWnd,
|
|||
|
||||
if (Update)
|
||||
{
|
||||
IntNotifyWinEvent(EVENT_OBJECT_STATECHANGE, hWnd, OBJID_WINDOW, CHILDID_SELF, 0);
|
||||
SendMessageW(hWnd, WM_ENABLE, (LPARAM)bEnable, 0);
|
||||
}
|
||||
// Return nonzero if it was disabled, or zero if it wasn't:
|
||||
|
|
|
@ -1636,6 +1636,8 @@ static BOOL FASTCALL MenuShowPopup(HWND hwndOwner, HMENU hmenu, UINT id, UINT fl
|
|||
top_popup_hmenu = hmenu;
|
||||
}
|
||||
|
||||
IntNotifyWinEvent(EVENT_SYSTEM_MENUPOPUPSTART, MenuInfo.Wnd, OBJID_CLIENT, CHILDID_SELF, 0);
|
||||
|
||||
/* Display the window */
|
||||
|
||||
SetWindowPos( MenuInfo.Wnd, HWND_TOPMOST, 0, 0, 0, 0,
|
||||
|
@ -3445,6 +3447,7 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y,
|
|||
|
||||
if (MenuInfo.Flags & MF_POPUP)
|
||||
{
|
||||
IntNotifyWinEvent(EVENT_SYSTEM_MENUPOPUPEND, MenuInfo.Wnd, OBJID_CLIENT, CHILDID_SELF, 0);
|
||||
DestroyWindow(MenuInfo.Wnd);
|
||||
MenuInfo.Wnd = NULL;
|
||||
|
||||
|
@ -3518,7 +3521,11 @@ static BOOL FASTCALL MenuInitTracking(HWND hWnd, HMENU hMenu, BOOL bPopup, UINT
|
|||
MenuInfo.Wnd = hWnd;
|
||||
MenuSetRosMenuInfo(&MenuInfo);
|
||||
}
|
||||
|
||||
|
||||
IntNotifyWinEvent( EVENT_SYSTEM_MENUSTART,
|
||||
hWnd,
|
||||
MenuInfo.Flags & MF_SYSMENU ? OBJID_SYSMENU : OBJID_MENU,
|
||||
CHILDID_SELF, 0);
|
||||
return TRUE;
|
||||
}
|
||||
/***********************************************************************
|
||||
|
@ -3528,6 +3535,7 @@ static BOOL FASTCALL MenuExitTracking(HWND hWnd, BOOL bPopup)
|
|||
{
|
||||
TRACE("hwnd=%p\n", hWnd);
|
||||
|
||||
IntNotifyWinEvent( EVENT_SYSTEM_MENUEND, hWnd, OBJID_WINDOW, CHILDID_SELF, 0);
|
||||
SendMessageW( hWnd, WM_EXITMENULOOP, bPopup, 0 );
|
||||
ShowCaret(0);
|
||||
top_popup = 0;
|
||||
|
@ -3645,7 +3653,7 @@ BOOL WINAPI TrackPopupMenuEx( HMENU Menu, UINT Flags, int x, int y,
|
|||
{
|
||||
BOOL ret = FALSE;
|
||||
|
||||
if (!IsMenu(Menu))
|
||||
if (!IsMenu(Menu))
|
||||
{
|
||||
SetLastError( ERROR_INVALID_MENU_HANDLE );
|
||||
return FALSE;
|
||||
|
|
|
@ -2064,13 +2064,18 @@ SendMessageW(HWND Wnd,
|
|||
|
||||
if (Wnd != HWND_BROADCAST && (Msg < WM_DDE_FIRST || Msg > WM_DDE_LAST))
|
||||
{
|
||||
if (Window != NULL && Window->head.pti == ti && !IsThreadHooked(GetWin32ClientInfo()))
|
||||
if ( Window != NULL &&
|
||||
Window->head.pti == ti &&
|
||||
!IsThreadHooked(GetWin32ClientInfo()) &&
|
||||
!(Window->state & WNDS_SERVERSIDEWINDOWPROC) )
|
||||
{
|
||||
/* NOTE: We can directly send messages to the window procedure
|
||||
if *all* the following conditions are met:
|
||||
|
||||
* Window belongs to calling thread
|
||||
* The calling thread is not being hooked
|
||||
* Not calling a server side proc:
|
||||
Desktop, Switch, ScrollBar, Menu, IconTitle, or hWndMessage
|
||||
*/
|
||||
|
||||
return IntCallMessageProc(Window, Wnd, Msg, wParam, lParam, FALSE);
|
||||
|
@ -2130,13 +2135,18 @@ SendMessageA(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
|||
|
||||
if (Wnd != HWND_BROADCAST && (Msg < WM_DDE_FIRST || Msg > WM_DDE_LAST))
|
||||
{
|
||||
if (Window != NULL && Window->head.pti == ti && !IsThreadHooked(GetWin32ClientInfo()))
|
||||
if ( Window != NULL &&
|
||||
Window->head.pti == ti &&
|
||||
!IsThreadHooked(GetWin32ClientInfo()) &&
|
||||
!(Window->state & WNDS_SERVERSIDEWINDOWPROC) )
|
||||
{
|
||||
/* NOTE: We can directly send messages to the window procedure
|
||||
if *all* the following conditions are met:
|
||||
|
||||
* Window belongs to calling thread
|
||||
* The calling thread is not being hooked
|
||||
* Not calling a server side proc:
|
||||
Desktop, Switch, ScrollBar, Menu, IconTitle, or hWndMessage
|
||||
*/
|
||||
|
||||
return IntCallMessageProc(Window, Wnd, Msg, wParam, lParam, TRUE);
|
||||
|
|
|
@ -2060,7 +2060,11 @@ AnyPopup(VOID)
|
|||
BOOL WINAPI
|
||||
IsWindowInDestroy(HWND hWnd)
|
||||
{
|
||||
return NtUserIsWindowInDestroy(hWnd);
|
||||
PWND pwnd;
|
||||
pwnd = ValidateHwnd(hWnd);
|
||||
if (!pwnd)
|
||||
return FALSE;
|
||||
return ((pwnd->state2 & WNDS2_INDESTROY) == WNDS2_INDESTROY);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -47,6 +47,25 @@ FindPropertyHandler(
|
|||
IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinData;
|
||||
return STATUS_MORE_ENTRIES;
|
||||
}
|
||||
|
||||
/* store property set */
|
||||
*Set = (PKSPROPERTY_SET)&PropertySet[Index];
|
||||
|
||||
if (Property->Flags & KSPROPERTY_TYPE_SET)
|
||||
{
|
||||
/* store property handler */
|
||||
*PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].SetPropertyHandler;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
if (Property->Flags & KSPROPERTY_TYPE_GET)
|
||||
{
|
||||
/* store property handler */
|
||||
*PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].GetPropertyHandler;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
if (Property->Flags & KSPROPERTY_TYPE_BASICSUPPORT)
|
||||
{
|
||||
PULONG Flags;
|
||||
|
@ -64,14 +83,21 @@ FindPropertyHandler(
|
|||
/* clear flags */
|
||||
*Flags = 0;
|
||||
|
||||
IoStatus->Information = sizeof(ULONG);
|
||||
|
||||
if (PropertySet[Index].PropertyItem[ItemIndex].SupportHandler)
|
||||
{
|
||||
/* use support handler from driver */
|
||||
*PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].SupportHandler;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
if (PropertySet[Index].PropertyItem[ItemIndex].GetSupported)
|
||||
*Flags |= KSPROPERTY_TYPE_GET;
|
||||
|
||||
if (PropertySet[Index].PropertyItem[ItemIndex].SetSupported)
|
||||
*Flags |= KSPROPERTY_TYPE_SET;
|
||||
|
||||
IoStatus->Information = sizeof(ULONG);
|
||||
|
||||
if (OutputBufferLength >= sizeof(KSPROPERTY_DESCRIPTION))
|
||||
{
|
||||
/* get output buffer */
|
||||
|
@ -89,14 +115,6 @@ FindPropertyHandler(
|
|||
}
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
if (Property->Flags & KSPROPERTY_TYPE_SET)
|
||||
*PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].SetPropertyHandler;
|
||||
|
||||
if (Property->Flags & KSPROPERTY_TYPE_GET)
|
||||
*PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].GetPropertyHandler;
|
||||
|
||||
*Set = (PKSPROPERTY_SET)&PropertySet[Index];
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -171,7 +189,7 @@ KspPropertyHandler(
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (IsEqualGUIDAligned(&Property->Set, &GUID_NULL) && Property->Id == 0 && Property->Flags == KSPROPERTY_TYPE_SETSUPPORT)
|
||||
else if (IsEqualGUIDAligned(&Property->Set, &GUID_NULL) && Property->Id == 0 && (Property->Flags & KSPROPERTY_TYPE_SETSUPPORT) == KSPROPERTY_TYPE_SETSUPPORT)
|
||||
{
|
||||
// store output size
|
||||
Irp->IoStatus.Information = sizeof(GUID) * PropertySetsCount;
|
||||
|
@ -189,7 +207,7 @@ KspPropertyHandler(
|
|||
{
|
||||
RtlMoveMemory(&Guid[Index], PropertySet[Index].Set, sizeof(GUID));
|
||||
}
|
||||
return STATUS_SUCCESS;
|
||||
Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* done */
|
||||
|
|
|
@ -327,7 +327,7 @@ CPortFilterWaveCyclic::Init(
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
CPortFilterWaveCyclic::FreePin(
|
||||
IN struct IPortPinWaveCyclic* Pin)
|
||||
IN PPORTPINWAVECYCLIC Pin)
|
||||
{
|
||||
ULONG Index;
|
||||
|
||||
|
|
|
@ -96,13 +96,14 @@ CPortFilterWavePci::NewIrpTarget(
|
|||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
if (m_Pins[ConnectDetails->PinId] && m_Descriptor->Factory.Instances[ConnectDetails->PinId].CurrentPinInstanceCount)
|
||||
if (m_Pins[ConnectDetails->PinId] &&
|
||||
(m_Descriptor->Factory.Instances[ConnectDetails->PinId].CurrentPinInstanceCount == m_Descriptor->Factory.Instances[ConnectDetails->PinId].MaxFilterInstanceCount))
|
||||
{
|
||||
// release existing instance
|
||||
PC_ASSERT(0);
|
||||
m_Pins[ConnectDetails->PinId]->Close(DeviceObject, NULL);
|
||||
// no available instance
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
|
||||
// now create the pin
|
||||
Status = NewPortPinWavePci(&Pin);
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
@ -305,6 +306,26 @@ CPortFilterWavePci::Init(
|
|||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CPortFilterWavePci::FreePin(
|
||||
IN struct IPortPinWavePci* Pin)
|
||||
{
|
||||
ULONG Index;
|
||||
|
||||
for(Index = 0; Index < m_Descriptor->Factory.PinDescriptorCount; Index++)
|
||||
{
|
||||
if (m_Pins[Index] == Pin)
|
||||
{
|
||||
m_Descriptor->Factory.Instances[Index].CurrentPinInstanceCount--;
|
||||
m_Pins[Index] = NULL;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
NewPortFilterWavePci(
|
||||
OUT IPortFilterWavePci ** OutFilter)
|
||||
|
|
|
@ -79,6 +79,7 @@ const GUID KSPROPSETID_Topology = {0x720D4AC0L, 0x7533, 0x11D0, {
|
|||
const GUID KSPROPSETID_Pin = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
|
||||
const GUID KSPROPSETID_Connection = {0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
|
||||
const GUID KSPROPTYPESETID_General = {0x97E99BA0L, 0xBDEA, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
|
||||
const GUID KSPROPSETID_DrmAudioStream = {0x2f2c8ddd, 0x4198, 0x4fac, {0xba, 0x29, 0x61, 0xbb, 0x05, 0xb7, 0xde, 0x06}};
|
||||
|
||||
const GUID KSEVENTSETID_LoopedStreaming = {0x4682B940L, 0xC6EF, 0x11D0, {0x96, 0xD8, 0x00, 0xAA, 0x00, 0x51, 0xE5, 0x1D}};
|
||||
const GUID KSEVENTSETID_Connection = {0x7f4bcbe0L, 0x9ea5, 0x11cf, {0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00}};
|
||||
|
|
|
@ -321,8 +321,7 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
|
|||
STDMETHOD_(NTSTATUS, Init)(THIS_
|
||||
IN KSPIN_CONNECT *ConnectDetails,
|
||||
IN ULONG FrameSize,
|
||||
IN ULONG Alignment,
|
||||
IN PVOID SilenceBuffer) PURE;
|
||||
IN ULONG Alignment) PURE;
|
||||
|
||||
STDMETHOD_(NTSTATUS, AddMapping)(THIS_
|
||||
IN PIRP Irp,
|
||||
|
@ -363,8 +362,7 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
|
|||
STDMETHODIMP_(NTSTATUS) Init(THIS_ \
|
||||
IN KSPIN_CONNECT *ConnectDetails, \
|
||||
IN ULONG FrameSize, \
|
||||
IN ULONG Alignment, \
|
||||
IN PVOID SilenceBuffer); \
|
||||
IN ULONG Alignment); \
|
||||
\
|
||||
STDMETHODIMP_(NTSTATUS) AddMapping(THIS_ \
|
||||
IN PIRP Irp, \
|
||||
|
@ -599,6 +597,8 @@ DECLARE_INTERFACE_(IIrpStreamVirtual, IIrpStream)
|
|||
#undef INTERFACE
|
||||
#define INTERFACE IPortFilterWavePci
|
||||
|
||||
struct IPortPinWavePci;
|
||||
|
||||
DECLARE_INTERFACE_(IPortFilterWavePci, IIrpTarget)
|
||||
{
|
||||
DEFINE_ABSTRACT_UNKNOWN()
|
||||
|
@ -607,6 +607,9 @@ DECLARE_INTERFACE_(IPortFilterWavePci, IIrpTarget)
|
|||
|
||||
STDMETHOD_(NTSTATUS, Init)(THIS_
|
||||
IN PPORTWAVEPCI Port)PURE;
|
||||
|
||||
STDMETHOD_(NTSTATUS, FreePin)(THIS_
|
||||
IN struct IPortPinWavePci* Pin)PURE;
|
||||
};
|
||||
|
||||
typedef IPortFilterWavePci *PPORTFILTERWAVEPCI;
|
||||
|
@ -614,7 +617,10 @@ typedef IPortFilterWavePci *PPORTFILTERWAVEPCI;
|
|||
#define IMP_IPortFilterPci \
|
||||
IMP_IIrpTarget; \
|
||||
STDMETHODIMP_(NTSTATUS) Init(THIS_ \
|
||||
IN PPORTWAVEPCI Port)
|
||||
IN PPORTWAVEPCI Port); \
|
||||
STDMETHODIMP_(NTSTATUS) FreePin(THIS_ \
|
||||
IN struct IPortPinWavePci* Pin)
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* IPortPinWavePci
|
||||
|
|
|
@ -43,7 +43,6 @@ protected:
|
|||
LIST_ENTRY m_IrpList;
|
||||
LIST_ENTRY m_FreeIrpList;
|
||||
PIRP m_Irp;
|
||||
PVOID m_SilenceBuffer;
|
||||
|
||||
ULONG m_OutOfMapping;
|
||||
ULONG m_MaxFrameSize;
|
||||
|
@ -84,12 +83,10 @@ NTAPI
|
|||
CIrpQueue::Init(
|
||||
IN KSPIN_CONNECT *ConnectDetails,
|
||||
IN ULONG FrameSize,
|
||||
IN ULONG Alignment,
|
||||
IN PVOID SilenceBuffer)
|
||||
IN ULONG Alignment)
|
||||
{
|
||||
m_ConnectDetails = ConnectDetails;
|
||||
m_MaxFrameSize = FrameSize;
|
||||
m_SilenceBuffer = SilenceBuffer;
|
||||
m_Alignment = Alignment;
|
||||
|
||||
InitializeListHead(&m_IrpList);
|
||||
|
@ -259,22 +256,13 @@ CIrpQueue::GetMapping(
|
|||
m_CurrentOffset = Offset = 0;
|
||||
}
|
||||
|
||||
if (!Irp && m_SilenceBuffer && m_MaxFrameSize)
|
||||
{
|
||||
DPRINT("NoIrp\n");
|
||||
// no irp available, use silence buffer
|
||||
*Buffer = (PUCHAR)m_SilenceBuffer;
|
||||
*BufferSize = m_MaxFrameSize;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
if (!Irp)
|
||||
{
|
||||
// no irp buffer available
|
||||
DPRINT("NoIrp\n");
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
|
||||
// get stream header
|
||||
StreamHeader = (PKSSTREAM_HEADER)Irp->Tail.Overlay.DriverContext[2];
|
||||
|
||||
|
|
|
@ -604,7 +604,7 @@ CPortPinDMus::Init(
|
|||
}
|
||||
}
|
||||
|
||||
Status = m_IrpQueue->Init(ConnectDetails, 0, 0, NULL);
|
||||
Status = m_IrpQueue->Init(ConnectDetails, 0, 0);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("IrpQueue_Init failed with %x\n", Status);
|
||||
|
|
|
@ -73,7 +73,7 @@ protected:
|
|||
ULONG m_StopCount;
|
||||
KSAUDIO_POSITION m_Position;
|
||||
KSALLOCATOR_FRAMING m_AllocatorFraming;
|
||||
SUBDEVICE_DESCRIPTOR m_Descriptor;
|
||||
PSUBDEVICE_DESCRIPTOR m_Descriptor;
|
||||
|
||||
KSPIN_LOCK m_EventListLock;
|
||||
LIST_ENTRY m_EventList;
|
||||
|
@ -105,10 +105,12 @@ NTSTATUS NTAPI PinWaveCyclicAudioPosition(IN PIRP Irp, IN PKSIDENTIFIER Request,
|
|||
NTSTATUS NTAPI PinWaveCyclicAllocatorFraming(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
|
||||
NTSTATUS NTAPI PinWaveCyclicAddEndOfStreamEvent(IN PIRP Irp, IN PKSEVENTDATA EventData, IN PKSEVENT_ENTRY EventEntry);
|
||||
NTSTATUS NTAPI PinWaveCyclicAddLoopedStreamEvent(IN PIRP Irp, IN PKSEVENTDATA EventData, IN PKSEVENT_ENTRY EventEntry);
|
||||
NTSTATUS NTAPI PinWaveCyclicDRMHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
|
||||
|
||||
|
||||
DEFINE_KSPROPERTY_CONNECTIONSET(PinWaveCyclicConnectionSet, PinWaveCyclicState, PinWaveCyclicDataFormat, PinWaveCyclicAllocatorFraming);
|
||||
DEFINE_KSPROPERTY_AUDIOSET(PinWaveCyclicAudioSet, PinWaveCyclicAudioPosition);
|
||||
DEFINE_KSPROPERTY_DRMSET(PinWaveCyclicDRMSet, PinWaveCyclicDRMHandler);
|
||||
|
||||
KSEVENT_ITEM PinWaveCyclicConnectionEventSet =
|
||||
{
|
||||
|
@ -146,6 +148,13 @@ KSPROPERTY_SET PinWaveCyclicPropertySet[] =
|
|||
(const KSPROPERTY_ITEM*)&PinWaveCyclicAudioSet,
|
||||
0,
|
||||
NULL
|
||||
},
|
||||
{
|
||||
&KSPROPSETID_DrmAudioStream,
|
||||
sizeof(PinWaveCyclicDRMSet) / sizeof(KSPROPERTY_ITEM),
|
||||
(const KSPROPERTY_ITEM*)&PinWaveCyclicDRMSet,
|
||||
0,
|
||||
NULL
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -192,6 +201,19 @@ CPortPinWaveCyclic::QueryInterface(
|
|||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PinWaveCyclicDRMHandler(
|
||||
IN PIRP Irp,
|
||||
IN PKSIDENTIFIER Request,
|
||||
IN OUT PVOID Data)
|
||||
{
|
||||
DPRINT1("PinWaveCyclicDRMHandler\n");
|
||||
ASSERT(0);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
PinWaveCyclicAddEndOfStreamEvent(
|
||||
|
@ -448,12 +470,14 @@ PinWaveCyclicState(
|
|||
{
|
||||
// FIXME
|
||||
// complete with successful state
|
||||
Pin->m_Stream->Silence(Pin->m_CommonBuffer, Pin->m_CommonBufferSize);
|
||||
Pin->m_IrpQueue->CancelBuffers();
|
||||
Pin->m_Position.PlayOffset = 0;
|
||||
Pin->m_Position.WriteOffset = 0;
|
||||
}
|
||||
else if (Pin->m_State == KSSTATE_STOP)
|
||||
{
|
||||
Pin->m_Stream->Silence(Pin->m_CommonBuffer, Pin->m_CommonBufferSize);
|
||||
Pin->m_IrpQueue->CancelBuffers();
|
||||
Pin->m_Position.PlayOffset = 0;
|
||||
Pin->m_Position.WriteOffset = 0;
|
||||
|
@ -662,6 +686,7 @@ CPortPinWaveCyclic::UpdateCommonBuffer(
|
|||
ULONG BufferLength;
|
||||
ULONG BytesToCopy;
|
||||
ULONG BufferSize;
|
||||
ULONG Gap;
|
||||
PUCHAR Buffer;
|
||||
NTSTATUS Status;
|
||||
|
||||
|
@ -672,7 +697,18 @@ CPortPinWaveCyclic::UpdateCommonBuffer(
|
|||
{
|
||||
Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return;
|
||||
{
|
||||
Gap = Position - m_CommonBufferOffset;
|
||||
if (Gap > m_FrameSize)
|
||||
{
|
||||
// insert silence samples
|
||||
DPRINT1("Inserting Silence Buffer Offset %lu GapLength %lu\n", m_CommonBufferOffset, BufferLength);
|
||||
m_Stream->Silence((PUCHAR)m_CommonBuffer + m_CommonBufferOffset, BufferLength);
|
||||
|
||||
m_CommonBufferOffset += BufferLength;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BytesToCopy = min(BufferLength, BufferSize);
|
||||
|
||||
|
@ -688,7 +724,7 @@ CPortPinWaveCyclic::UpdateCommonBuffer(
|
|||
m_IrpQueue->UpdateMapping(BytesToCopy);
|
||||
m_CommonBufferOffset += BytesToCopy;
|
||||
|
||||
BufferLength = Position - m_CommonBufferOffset;
|
||||
BufferLength -= BytesToCopy;
|
||||
m_Position.PlayOffset += BytesToCopy;
|
||||
|
||||
if (m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING)
|
||||
|
@ -720,7 +756,18 @@ CPortPinWaveCyclic::UpdateCommonBufferOverlap(
|
|||
{
|
||||
Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return;
|
||||
{
|
||||
Gap = m_CommonBufferSize - m_CommonBufferOffset + Position;
|
||||
if (Gap > m_FrameSize)
|
||||
{
|
||||
// insert silence samples
|
||||
DPRINT1("Overlap Inserting Silence Buffer Size %lu Offset %lu Gap %lu Position %lu\n", m_CommonBufferSize, m_CommonBufferOffset, Gap, Position);
|
||||
m_Stream->Silence((PUCHAR)m_CommonBuffer + m_CommonBufferOffset, BufferLength);
|
||||
|
||||
m_CommonBufferOffset += BufferLength;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
BytesToCopy = min(BufferLength, BufferSize);
|
||||
|
||||
|
@ -741,7 +788,7 @@ CPortPinWaveCyclic::UpdateCommonBufferOverlap(
|
|||
m_CommonBufferOffset += BytesToCopy;
|
||||
m_Position.PlayOffset += BytesToCopy;
|
||||
|
||||
BufferLength = m_CommonBufferSize - m_CommonBufferOffset;
|
||||
BufferLength -=BytesToCopy;
|
||||
|
||||
if (m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING)
|
||||
{
|
||||
|
@ -751,7 +798,6 @@ CPortPinWaveCyclic::UpdateCommonBufferOverlap(
|
|||
m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (Gap == Length)
|
||||
|
@ -773,22 +819,13 @@ CPortPinWaveCyclic::RequestService()
|
|||
{
|
||||
ULONG Position;
|
||||
NTSTATUS Status;
|
||||
PUCHAR Buffer;
|
||||
ULONG BufferSize;
|
||||
ULONGLONG OldOffset, NewOffset;
|
||||
|
||||
PC_ASSERT_IRQL(DISPATCH_LEVEL);
|
||||
|
||||
if (m_State == KSSTATE_RUN)
|
||||
{
|
||||
Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Status = m_Stream->GetPosition(&Position);
|
||||
DPRINT("Position %u Buffer %p BufferSize %u ActiveIrpOffset %u Capture %u\n", Position, Buffer, m_CommonBufferSize, BufferSize, m_Capture);
|
||||
|
||||
OldOffset = m_Position.PlayOffset;
|
||||
|
||||
|
@ -841,7 +878,7 @@ CPortPinWaveCyclic::DeviceIoControl(
|
|||
if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY)
|
||||
{
|
||||
/* handle property with subdevice descriptor */
|
||||
Status = PcHandlePropertyWithTable(Irp, m_Descriptor.FilterPropertySetCount, m_Descriptor.FilterPropertySet, &m_Descriptor);
|
||||
Status = PcHandlePropertyWithTable(Irp, m_Descriptor->FilterPropertySetCount, m_Descriptor->FilterPropertySet, m_Descriptor);
|
||||
|
||||
if (Status == STATUS_NOT_FOUND)
|
||||
{
|
||||
|
@ -854,11 +891,11 @@ CPortPinWaveCyclic::DeviceIoControl(
|
|||
}
|
||||
else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_ENABLE_EVENT)
|
||||
{
|
||||
Status = PcHandleEnableEventWithTable(Irp, &m_Descriptor);
|
||||
Status = PcHandleEnableEventWithTable(Irp, m_Descriptor);
|
||||
}
|
||||
else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_DISABLE_EVENT)
|
||||
{
|
||||
Status = PcHandleDisableEventWithTable(Irp, &m_Descriptor);
|
||||
Status = PcHandleDisableEventWithTable(Irp, m_Descriptor);
|
||||
}
|
||||
else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_RESET_STATE)
|
||||
{
|
||||
|
@ -960,27 +997,29 @@ CPortPinWaveCyclic::Close(
|
|||
{
|
||||
// free format
|
||||
FreeItem(m_Format, TAG_PORTCLASS);
|
||||
|
||||
// format is freed
|
||||
m_Format = NULL;
|
||||
}
|
||||
|
||||
if (m_IrpQueue)
|
||||
{
|
||||
// fixme cancel irps
|
||||
// cancel remaining irps
|
||||
m_IrpQueue->CancelBuffers();
|
||||
|
||||
// release irp queue
|
||||
m_IrpQueue->Release();
|
||||
}
|
||||
|
||||
|
||||
if (m_Port)
|
||||
{
|
||||
// release reference to port driver
|
||||
m_Port->Release();
|
||||
m_Port = NULL;
|
||||
// queue is freed
|
||||
m_IrpQueue = NULL;
|
||||
}
|
||||
|
||||
if (m_ServiceGroup)
|
||||
{
|
||||
// remove member from service group
|
||||
m_ServiceGroup->RemoveMember(PSERVICESINK(this));
|
||||
|
||||
// do not release service group, it is released by the miniport object
|
||||
m_ServiceGroup = NULL;
|
||||
}
|
||||
|
||||
|
@ -999,22 +1038,37 @@ CPortPinWaveCyclic::Close(
|
|||
// set state to stop
|
||||
m_State = KSSTATE_STOP;
|
||||
|
||||
|
||||
DPRINT("Closing stream at Irql %u\n", KeGetCurrentIrql());
|
||||
|
||||
// release stream
|
||||
m_Stream->Release();
|
||||
|
||||
// stream is now freed
|
||||
m_Stream = NULL;
|
||||
}
|
||||
|
||||
|
||||
if (m_Filter)
|
||||
{
|
||||
// release reference to filter instance
|
||||
// disconnect pin from filter
|
||||
m_Filter->FreePin((PPORTPINWAVECYCLIC)this);
|
||||
|
||||
// release filter reference
|
||||
m_Filter->Release();
|
||||
|
||||
// pin is done with filter
|
||||
m_Filter = NULL;
|
||||
}
|
||||
|
||||
if (m_Port)
|
||||
{
|
||||
// release reference to port driver
|
||||
m_Port->Release();
|
||||
|
||||
// work is done for port
|
||||
m_Port = NULL;
|
||||
}
|
||||
|
||||
Irp->IoStatus.Information = 0;
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
@ -1103,7 +1157,6 @@ CPortPinWaveCyclic::Init(
|
|||
PKSDATAFORMAT DataFormat;
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
BOOLEAN Capture;
|
||||
PVOID SilenceBuffer;
|
||||
PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor = NULL;
|
||||
//IDrmAudioStream * DrmAudio = NULL;
|
||||
|
||||
|
@ -1162,7 +1215,6 @@ CPortPinWaveCyclic::Init(
|
|||
#endif
|
||||
|
||||
DPRINT1("CPortPinWaveCyclic::Init Status %x PinId %u Capture %u\n", Status, ConnectDetails->PinId, Capture);
|
||||
DPRINT1("Bits %u Samples %u Channels %u Tag %u FrameSize %u\n", ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.wBitsPerSample, ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.nSamplesPerSec, ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.nChannels, ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.wFormatTag, m_FrameSize);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
@ -1186,18 +1238,26 @@ CPortPinWaveCyclic::Init(
|
|||
InitializeListHead(&m_EventList);
|
||||
KeInitializeSpinLock(&m_EventListLock);
|
||||
|
||||
/* set up subdevice descriptor */
|
||||
RtlZeroMemory(&m_Descriptor, sizeof(SUBDEVICE_DESCRIPTOR));
|
||||
m_Descriptor.FilterPropertySet = PinWaveCyclicPropertySet;
|
||||
m_Descriptor.FilterPropertySetCount = sizeof(PinWaveCyclicPropertySet) / sizeof(KSPROPERTY_SET);
|
||||
m_Descriptor.UnknownStream = (PUNKNOWN)m_Stream;
|
||||
m_Descriptor.DeviceDescriptor = SubDeviceDescriptor->DeviceDescriptor;
|
||||
m_Descriptor.UnknownMiniport = SubDeviceDescriptor->UnknownMiniport;
|
||||
m_Descriptor.PortPin = (PVOID)this;
|
||||
m_Descriptor.EventSetCount = sizeof(PinWaveCyclicEventSet) / sizeof(KSEVENT_SET);
|
||||
m_Descriptor.EventSet = PinWaveCyclicEventSet;
|
||||
m_Descriptor.EventList = &m_EventList;
|
||||
m_Descriptor.EventListLock = &m_EventListLock;
|
||||
Status = PcCreateSubdeviceDescriptor(&m_Descriptor,
|
||||
SubDeviceDescriptor->InterfaceCount,
|
||||
SubDeviceDescriptor->Interfaces,
|
||||
0, /* FIXME KSINTERFACE_STANDARD with KSINTERFACE_STANDARD_STREAMING / KSINTERFACE_STANDARD_LOOPED_STREAMING */
|
||||
NULL,
|
||||
sizeof(PinWaveCyclicPropertySet) / sizeof(KSPROPERTY_SET),
|
||||
PinWaveCyclicPropertySet,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
NULL,
|
||||
sizeof(PinWaveCyclicEventSet) / sizeof(KSEVENT_SET),
|
||||
PinWaveCyclicEventSet,
|
||||
SubDeviceDescriptor->DeviceDescriptor);
|
||||
|
||||
m_Descriptor->UnknownStream = (PUNKNOWN)m_Stream;
|
||||
m_Descriptor->UnknownMiniport = SubDeviceDescriptor->UnknownMiniport;
|
||||
m_Descriptor->PortPin = (PVOID)this;
|
||||
m_Descriptor->EventList = &m_EventList;
|
||||
m_Descriptor->EventListLock = &m_EventListLock;
|
||||
|
||||
// initialize reset state
|
||||
m_ResetState = KSRESET_END;
|
||||
|
@ -1230,9 +1290,7 @@ CPortPinWaveCyclic::Init(
|
|||
PC_ASSERT(NT_SUCCESS(Status));
|
||||
PC_ASSERT(m_FrameSize);
|
||||
|
||||
SilenceBuffer = AllocateItem(NonPagedPool, m_FrameSize, TAG_PORTCLASS);
|
||||
if (!SilenceBuffer)
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
DPRINT1("Bits %u Samples %u Channels %u Tag %u FrameSize %u CommonBufferSize %lu\n", ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.wBitsPerSample, ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.nSamplesPerSec, ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.nChannels, ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.wFormatTag, m_FrameSize, m_CommonBufferSize);
|
||||
|
||||
|
||||
/* set up allocator framing */
|
||||
|
@ -1243,10 +1301,9 @@ CPortPinWaveCyclic::Init(
|
|||
m_AllocatorFraming.Reserved = 0;
|
||||
m_AllocatorFraming.FrameSize = m_FrameSize;
|
||||
|
||||
m_Stream->Silence(SilenceBuffer, m_FrameSize);
|
||||
m_Stream->Silence(m_CommonBuffer, m_CommonBufferSize);
|
||||
|
||||
Status = m_IrpQueue->Init(ConnectDetails, m_FrameSize, 0, SilenceBuffer);
|
||||
Status = m_IrpQueue->Init(ConnectDetails, m_FrameSize, 0);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
m_IrpQueue->Release();
|
||||
|
@ -1265,9 +1322,6 @@ CPortPinWaveCyclic::Init(
|
|||
m_Port = Port;
|
||||
m_Filter = Filter;
|
||||
|
||||
//DPRINT("Setting state to acquire %x\n", m_Stream->SetState(KSSTATE_ACQUIRE));
|
||||
//DPRINT("Setting state to pause %x\n", m_Stream->SetState(KSSTATE_PAUSE));
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
@ -62,8 +62,6 @@ protected:
|
|||
KSAUDIO_POSITION m_Position;
|
||||
ULONG m_StopCount;
|
||||
|
||||
ULONG m_Delay;
|
||||
|
||||
BOOL m_bUsePrefetch;
|
||||
ULONG m_PrefetchOffset;
|
||||
SUBDEVICE_DESCRIPTOR m_Descriptor;
|
||||
|
@ -637,41 +635,85 @@ CPortPinWavePci::Close(
|
|||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
ISubdevice *SubDevice;
|
||||
NTSTATUS Status;
|
||||
PSUBDEVICE_DESCRIPTOR Descriptor;
|
||||
|
||||
if (m_Format)
|
||||
{
|
||||
// free format
|
||||
FreeItem(m_Format, TAG_PORTCLASS);
|
||||
|
||||
// format is freed
|
||||
m_Format = NULL;
|
||||
}
|
||||
|
||||
if (m_IrpQueue)
|
||||
{
|
||||
// cancel remaining irps
|
||||
m_IrpQueue->CancelBuffers();
|
||||
|
||||
// release irp queue
|
||||
m_IrpQueue->Release();
|
||||
|
||||
// queue is freed
|
||||
m_IrpQueue = NULL;
|
||||
}
|
||||
|
||||
|
||||
if (m_ServiceGroup)
|
||||
{
|
||||
// remove member from service group
|
||||
m_ServiceGroup->RemoveMember(PSERVICESINK(this));
|
||||
|
||||
// do not release service group, it is released by the miniport object
|
||||
m_ServiceGroup = NULL;
|
||||
}
|
||||
|
||||
if (m_Stream)
|
||||
{
|
||||
if (m_State != KSSTATE_STOP)
|
||||
{
|
||||
m_Stream->SetState(KSSTATE_STOP);
|
||||
// stop stream
|
||||
Status = m_Stream->SetState(KSSTATE_STOP);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("Warning: failed to stop stream with %x\n", Status);
|
||||
PC_ASSERT(0);
|
||||
}
|
||||
}
|
||||
// set state to stop
|
||||
m_State = KSSTATE_STOP;
|
||||
|
||||
DPRINT("Closing stream at Irql %u\n", KeGetCurrentIrql());
|
||||
|
||||
// release stream
|
||||
m_Stream->Release();
|
||||
|
||||
// stream is now freed
|
||||
m_Stream = NULL;
|
||||
}
|
||||
|
||||
Status = m_Port->QueryInterface(IID_ISubdevice, (PVOID*)&SubDevice);
|
||||
if (NT_SUCCESS(Status))
|
||||
if (m_Filter)
|
||||
{
|
||||
Status = SubDevice->GetDescriptor(&Descriptor);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
Descriptor->Factory.Instances[m_ConnectDetails->PinId].CurrentPinInstanceCount--;
|
||||
}
|
||||
SubDevice->Release();
|
||||
// disconnect pin from filter
|
||||
m_Filter->FreePin((PPORTPINWAVEPCI)this);
|
||||
|
||||
// release filter reference
|
||||
m_Filter->Release();
|
||||
|
||||
// pin is done with filter
|
||||
m_Filter = NULL;
|
||||
}
|
||||
|
||||
if (m_Format)
|
||||
if (m_Port)
|
||||
{
|
||||
FreeItem(m_Format, TAG_PORTCLASS);
|
||||
m_Format = NULL;
|
||||
// release reference to port driver
|
||||
m_Port->Release();
|
||||
|
||||
// work is done for port
|
||||
m_Port = NULL;
|
||||
}
|
||||
|
||||
// successfully complete irp
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
Irp->IoStatus.Information = 0;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
@ -756,33 +798,18 @@ CPortPinWavePci::Init(
|
|||
NTSTATUS Status;
|
||||
PKSDATAFORMAT DataFormat;
|
||||
BOOLEAN Capture;
|
||||
ISubdevice * Subdevice = NULL;
|
||||
PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor = NULL;
|
||||
|
||||
Port->AddRef();
|
||||
Filter->AddRef();
|
||||
|
||||
m_Port = Port;
|
||||
m_Filter = Filter;
|
||||
m_KsPinDescriptor = KsPinDescriptor;
|
||||
m_ConnectDetails = ConnectDetails;
|
||||
m_Miniport = GetWavePciMiniport(Port);
|
||||
m_DeviceObject = DeviceObject;
|
||||
|
||||
DataFormat = (PKSDATAFORMAT)(ConnectDetails + 1);
|
||||
|
||||
DPRINT("IPortPinWavePci_fnInit entered\n");
|
||||
|
||||
m_Format = (PKSDATAFORMAT)AllocateItem(NonPagedPool, DataFormat->FormatSize, TAG_PORTCLASS);
|
||||
if (!m_Format)
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
||||
RtlMoveMemory(m_Format, DataFormat, DataFormat->FormatSize);
|
||||
|
||||
// check if it is a source / sink pin
|
||||
if (KsPinDescriptor->Communication == KSPIN_COMMUNICATION_SINK && KsPinDescriptor->DataFlow == KSPIN_DATAFLOW_IN)
|
||||
{
|
||||
// sink pin
|
||||
Capture = FALSE;
|
||||
}
|
||||
else if (KsPinDescriptor->Communication == KSPIN_COMMUNICATION_SINK && KsPinDescriptor->DataFlow == KSPIN_DATAFLOW_OUT)
|
||||
{
|
||||
// source pin
|
||||
Capture = TRUE;
|
||||
}
|
||||
else
|
||||
|
@ -792,6 +819,45 @@ CPortPinWavePci::Init(
|
|||
while(TRUE);
|
||||
}
|
||||
|
||||
// add port / filter reference
|
||||
Port->AddRef();
|
||||
Filter->AddRef();
|
||||
|
||||
// initialize pin
|
||||
m_Port = Port;
|
||||
m_Filter = Filter;
|
||||
m_KsPinDescriptor = KsPinDescriptor;
|
||||
m_ConnectDetails = ConnectDetails;
|
||||
m_Miniport = GetWavePciMiniport(Port);
|
||||
m_DeviceObject = DeviceObject;
|
||||
m_State = KSSTATE_STOP;
|
||||
m_Capture = Capture;
|
||||
|
||||
DPRINT("IPortPinWavePci_fnInit entered\n");
|
||||
|
||||
// get dataformat
|
||||
DataFormat = (PKSDATAFORMAT)(ConnectDetails + 1);
|
||||
|
||||
// allocate data format
|
||||
m_Format = (PKSDATAFORMAT)AllocateItem(NonPagedPool, DataFormat->FormatSize, TAG_PORTCLASS);
|
||||
if (!m_Format)
|
||||
{
|
||||
// release references
|
||||
m_Port->Release();
|
||||
m_Filter->Release();
|
||||
|
||||
// no dangling pointers
|
||||
Port = NULL;
|
||||
Filter = NULL;
|
||||
|
||||
// failed to allocate data format
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
// copy data format
|
||||
RtlMoveMemory(m_Format, DataFormat, DataFormat->FormatSize);
|
||||
|
||||
// allocate new stream
|
||||
Status = m_Miniport->NewStream(&m_Stream,
|
||||
NULL,
|
||||
NonPagedPool,
|
||||
|
@ -805,47 +871,81 @@ CPortPinWavePci::Init(
|
|||
DPRINT("IPortPinWavePci_fnInit Status %x\n", Status);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
if (m_ServiceGroup)
|
||||
{
|
||||
Status = m_ServiceGroup->AddMember(PSERVICESINK(this));
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("Failed to add pin to service group\n");
|
||||
return Status;
|
||||
}
|
||||
// free references
|
||||
Port->Release();
|
||||
Filter->Release();
|
||||
|
||||
// free data format
|
||||
FreeItem(m_Format, TAG_PORTCLASS);
|
||||
|
||||
// no dangling pointers
|
||||
m_Port = NULL;
|
||||
m_Filter = NULL;
|
||||
m_Format = NULL;
|
||||
|
||||
// failed to allocate stream
|
||||
return Status;
|
||||
}
|
||||
|
||||
// delay of 10 milisec
|
||||
m_Delay = Int32x32To64(10, -10000);
|
||||
|
||||
// get allocator requirements for pin
|
||||
Status = m_Stream->GetAllocatorFraming(&m_AllocatorFraming);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("OptionFlags %x RequirementsFlag %x PoolType %x Frames %lu FrameSize %lu FileAlignment %lu\n",
|
||||
m_AllocatorFraming.OptionsFlags, m_AllocatorFraming.RequirementsFlags, m_AllocatorFraming.PoolType, m_AllocatorFraming.Frames, m_AllocatorFraming.FrameSize, m_AllocatorFraming.FileAlignment);
|
||||
}
|
||||
|
||||
// allocate new irp queue
|
||||
Status = NewIrpQueue(&m_IrpQueue);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("GetAllocatorFraming failed with %x\n", Status);
|
||||
// free references
|
||||
Port->Release();
|
||||
Filter->Release();
|
||||
m_Stream->Release();
|
||||
|
||||
// free data format
|
||||
FreeItem(m_Format, TAG_PORTCLASS);
|
||||
|
||||
// no dangling pointers
|
||||
m_Port = NULL;
|
||||
m_Filter = NULL;
|
||||
m_Format = NULL;
|
||||
m_Stream = NULL;
|
||||
|
||||
// failed to allocate irp queue
|
||||
return Status;
|
||||
}
|
||||
|
||||
DPRINT("OptionFlags %x RequirementsFlag %x PoolType %x Frames %lu FrameSize %lu FileAlignment %lu\n",
|
||||
m_AllocatorFraming.OptionsFlags, m_AllocatorFraming.RequirementsFlags, m_AllocatorFraming.PoolType, m_AllocatorFraming.Frames, m_AllocatorFraming.FrameSize, m_AllocatorFraming.FileAlignment);
|
||||
// initialize irp queue
|
||||
Status = m_IrpQueue->Init(ConnectDetails, m_AllocatorFraming.FrameSize, m_AllocatorFraming.FileAlignment);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
// this should never happen
|
||||
ASSERT(0);
|
||||
}
|
||||
|
||||
ISubdevice * Subdevice = NULL;
|
||||
// get subdevice interface
|
||||
Status = Port->QueryInterface(IID_ISubdevice, (PVOID*)&Subdevice);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor = NULL;
|
||||
{
|
||||
// this function should never fail
|
||||
ASSERT(0);
|
||||
}
|
||||
|
||||
// get subdevice descriptor
|
||||
Status = Subdevice->GetDescriptor(&SubDeviceDescriptor);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
// failed to get descriptor
|
||||
Subdevice->Release();
|
||||
return Status;
|
||||
// this function should never fail
|
||||
ASSERT(0);
|
||||
}
|
||||
|
||||
// release subdevice
|
||||
Subdevice->Release();
|
||||
|
||||
/* set up subdevice descriptor */
|
||||
RtlZeroMemory(&m_Descriptor, sizeof(SUBDEVICE_DESCRIPTOR));
|
||||
m_Descriptor.FilterPropertySet = PinWavePciPropertySet;
|
||||
|
@ -855,21 +955,30 @@ CPortPinWavePci::Init(
|
|||
m_Descriptor.UnknownMiniport = SubDeviceDescriptor->UnknownMiniport;
|
||||
m_Descriptor.PortPin = (PVOID)this;
|
||||
|
||||
|
||||
|
||||
Status = NewIrpQueue(&m_IrpQueue);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
Status = m_IrpQueue->Init(ConnectDetails, m_AllocatorFraming.FrameSize, m_AllocatorFraming.FileAlignment, NULL);
|
||||
if (!NT_SUCCESS(Status))
|
||||
if (m_ServiceGroup)
|
||||
{
|
||||
DPRINT("IrpQueue_Init failed with %x\n", Status);
|
||||
return Status;
|
||||
Status = m_ServiceGroup->AddMember(PSERVICESINK(this));
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
// free references
|
||||
m_Stream->Release();
|
||||
Port->Release();
|
||||
Filter->Release();
|
||||
|
||||
// free data format
|
||||
FreeItem(m_Format, TAG_PORTCLASS);
|
||||
|
||||
// no dangling pointers
|
||||
m_Stream = NULL;
|
||||
m_Port = NULL;
|
||||
m_Filter = NULL;
|
||||
m_Format = NULL;
|
||||
|
||||
// failed to add to service group
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
m_State = KSSTATE_STOP;
|
||||
m_Capture = Capture;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -587,7 +587,7 @@ CPortPinWaveRT::Init(
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
Status = m_IrpQueue->Init(ConnectDetails, 0, 0, NULL);
|
||||
Status = m_IrpQueue->Init(ConnectDetails, 0, 0);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
goto cleanup;
|
||||
|
|
|
@ -275,12 +275,12 @@ CPortWaveCyclic::Init(
|
|||
}
|
||||
|
||||
// create the subdevice descriptor
|
||||
Status = PcCreateSubdeviceDescriptor(&m_SubDeviceDescriptor,
|
||||
Status = PcCreateSubdeviceDescriptor(&m_SubDeviceDescriptor,
|
||||
4,
|
||||
InterfaceGuids,
|
||||
0,
|
||||
0,
|
||||
NULL,
|
||||
2,
|
||||
2,
|
||||
WaveCyclicPropertySet,
|
||||
0,
|
||||
0,
|
||||
|
|
|
@ -356,6 +356,22 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\
|
|||
DEFINE_KSPROPERTY_ITEM_AUDIO_POSITION(PropPositionHandler, PropPositionHandler)\
|
||||
}
|
||||
|
||||
|
||||
#define DEFINE_KSPROPERTY_ITEM_DRMAUDIOSTREAM_CONTENTID(SetHandler)\
|
||||
DEFINE_KSPROPERTY_ITEM(\
|
||||
KSPROPERTY_DRMAUDIOSTREAM_CONTENTID,\
|
||||
NULL,\
|
||||
sizeof(KSPROPERTY),\
|
||||
sizeof(ULONG),\
|
||||
(SetHandler),\
|
||||
NULL, 0, NULL, NULL, 0)
|
||||
|
||||
#define DEFINE_KSPROPERTY_DRMSET(PinSet,\
|
||||
PropPositionHandler)\
|
||||
DEFINE_KSPROPERTY_TABLE(PinSet) {\
|
||||
DEFINE_KSPROPERTY_ITEM_DRMAUDIOSTREAM_CONTENTID(PropPositionHandler)\
|
||||
}
|
||||
|
||||
#define DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PinSet,\
|
||||
PropGeneral, PropInstances, PropIntersection)\
|
||||
DEFINE_KSPROPERTY_TABLE(PinSet) {\
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -235,8 +235,9 @@ HalpReportResourceUsage(IN PUNICODE_STRING HalName,
|
|||
if (!HalpGetInfoFromACPI)
|
||||
{
|
||||
/* No, so use our local table */
|
||||
Port = HalpComPortIrqMapping[0][0];
|
||||
for (i = 0; Port; i++)
|
||||
for (i = 0, Port = HalpComPortIrqMapping[i][0];
|
||||
Port;
|
||||
i++, Port = HalpComPortIrqMapping[i][0])
|
||||
{
|
||||
/* Is this the port we want? */
|
||||
if (Port == (ULONG_PTR)KdComPortInUse)
|
||||
|
@ -248,9 +249,6 @@ HalpReportResourceUsage(IN PUNICODE_STRING HalName,
|
|||
PRIMARY_VECTOR_BASE,
|
||||
HIGH_LEVEL);
|
||||
}
|
||||
|
||||
/* Next port */
|
||||
Port = HalpComPortIrqMapping[i][0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -509,6 +507,9 @@ HalpEnableInterruptHandler(IN UCHAR Flags,
|
|||
IN PVOID Handler,
|
||||
IN KINTERRUPT_MODE Mode)
|
||||
{
|
||||
/* Set the IDT_LATCHED flag for latched interrupts */
|
||||
if (Mode == Latched) Flags |= IDT_LATCHED;
|
||||
|
||||
/* Register the vector */
|
||||
HalpRegisterVector(Flags, BusVector, SystemVector, Irql);
|
||||
|
||||
|
|
|
@ -1005,11 +1005,6 @@ DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000", KSPROPTYPESETID_Genera
|
|||
KSPROPERTY_DIRECTSOUND3DLISTENER_VELOCITY
|
||||
*/
|
||||
|
||||
#define KSPROPSETID_DrmAudioStream
|
||||
/*
|
||||
KSPROPERTY_DRMAUDIOSTREAM_CONTENTID
|
||||
*/
|
||||
|
||||
#define KSPROPSETID_Hrtf3d
|
||||
/*
|
||||
KSPROPERTY_HRTF3D_FILTER_FORMAT
|
||||
|
|
|
@ -565,6 +565,15 @@ typedef struct {
|
|||
#endif // !_NTDDK_
|
||||
} LOOPEDSTREAMING_POSITION_EVENT_DATA, *PLOOPEDSTREAMING_POSITION_EVENT_DATA ;
|
||||
|
||||
#define STATIC_KSPROPSETID_DrmAudioStream\
|
||||
0x2f2c8ddd, 0x4198, 0x4fac, 0xba, 0x29, 0x61, 0xbb, 0x5, 0xb7, 0xde, 0x6
|
||||
DEFINE_GUIDSTRUCT("2F2C8DDD-4198-4fac-BA29-61BB05B7DE06", KSPROPSETID_DrmAudioStream);
|
||||
#define KSPROPSETID_DrmAudioStream DEFINE_GUIDNAMED(KSPROPSETID_DrmAudioStream)
|
||||
|
||||
typedef enum {
|
||||
KSPROPERTY_DRMAUDIOSTREAM_CONTENTID
|
||||
} KSPROPERTY_DRMAUDIOSTREAM;
|
||||
|
||||
|
||||
/*
|
||||
SysAudio Properties
|
||||
|
|
|
@ -51,13 +51,15 @@ VOID NTAPI RtlInitLargeAnsiString(IN OUT PLARGE_ANSI_STRING,IN PCSZ,IN INT);
|
|||
VOID NTAPI RtlInitLargeUnicodeString(IN OUT PLARGE_UNICODE_STRING,IN PCWSTR,IN INT);
|
||||
BOOL NTAPI RtlLargeStringToUnicodeString( PUNICODE_STRING, PLARGE_STRING);
|
||||
|
||||
#define NB_HOOKS (WH_MAXHOOK-WH_MINHOOK+1)
|
||||
|
||||
typedef struct _DESKTOPINFO
|
||||
{
|
||||
PVOID pvDesktopBase;
|
||||
PVOID pvDesktopLimit;
|
||||
struct _WND *spwnd;
|
||||
DWORD fsHooks;
|
||||
struct tagHOOK * aphkStart[16];
|
||||
LIST_ENTRY aphkStart[NB_HOOKS];
|
||||
|
||||
HWND hTaskManWindow;
|
||||
HWND hProgmanWindow;
|
||||
|
@ -127,15 +129,23 @@ typedef struct _PROCMARKHEAD
|
|||
/* Window Client Information structure */
|
||||
struct _ETHREAD;
|
||||
|
||||
#define WEF_SETBYWNDPTI 0x0001
|
||||
|
||||
typedef struct tagHOOK
|
||||
{
|
||||
THRDESKHEAD head;
|
||||
struct tagHOOK *phkNext; /* This is for user space. */
|
||||
int HookId; /* Hook table index */
|
||||
ULONG_PTR offPfn;
|
||||
ULONG flags; /* Some internal flags */
|
||||
INT ihmod;
|
||||
PTHREADINFO ptiHooked;
|
||||
struct _DESKTOP *rpdesk;
|
||||
/* ReactOS */
|
||||
LIST_ENTRY Chain; /* Hook chain entry */
|
||||
struct _ETHREAD* Thread; /* Thread owning the hook */
|
||||
int HookId; /* Hook table index */
|
||||
HOOKPROC Proc; /* Hook function */
|
||||
BOOLEAN Ansi; /* Is it an Ansi hook? */
|
||||
ULONG Flags; /* Some internal flags */
|
||||
UNICODE_STRING ModuleName; /* Module name for global hooks */
|
||||
} HOOK, *PHOOK;
|
||||
|
||||
|
@ -3149,7 +3159,6 @@ typedef struct tagKMDDELPARAM
|
|||
#define NOPARAM_ROUTINE_ANYPOPUP 0xffff0006
|
||||
#define ONEPARAM_ROUTINE_CSRSS_GUICHECK 0xffff0008
|
||||
#define ONEPARAM_ROUTINE_SWITCHCARETSHOWING 0xfffe0008
|
||||
#define ONEPARAM_ROUTINE_ISWINDOWINDESTROY 0xfffe000c
|
||||
#define ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING 0xfffe000d
|
||||
#define ONEPARAM_ROUTINE_GETDESKTOPMAPPING 0xfffe000e
|
||||
#define ONEPARAM_ROUTINE_MSQSETWAKEMASK 0xfffe0027
|
||||
|
@ -3167,6 +3176,7 @@ typedef struct tagKMDDELPARAM
|
|||
#define TWOPARAM_ROUTINE_SETCARETPOS 0xfffd0060
|
||||
#define TWOPARAM_ROUTINE_REGISTERLOGONPROC 0xfffd0062
|
||||
#define TWOPARAM_ROUTINE_ROS_UPDATEUISTATE 0x1004
|
||||
#define HWNDPARAM_ROUTINE_ROS_NOTIFYWINEVENT 0x1005
|
||||
|
||||
DWORD
|
||||
NTAPI
|
||||
|
|
|
@ -514,6 +514,21 @@ IopAssignDeviceResources(
|
|||
IN PDEVICE_NODE DeviceNode
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IopCreateResourceListFromRequirements(
|
||||
IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList,
|
||||
OUT PCM_RESOURCE_LIST *ResourceList
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IopDetectResourceConflict(
|
||||
IN PCM_RESOURCE_LIST ResourceList,
|
||||
IN BOOLEAN Silent,
|
||||
OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor
|
||||
);
|
||||
|
||||
//
|
||||
// PNP Routines
|
||||
//
|
||||
|
|
|
@ -841,7 +841,7 @@ IoGetConfigurationInformation(VOID)
|
|||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @halfplemented
|
||||
*/
|
||||
NTSTATUS NTAPI
|
||||
IoReportResourceUsage(PUNICODE_STRING DriverClassName,
|
||||
|
@ -876,13 +876,48 @@ IoReportResourceUsage(PUNICODE_STRING DriverClassName,
|
|||
* a conflict is detected with another driver.
|
||||
*/
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
*ConflictDetected = FALSE;
|
||||
return STATUS_SUCCESS;
|
||||
NTSTATUS Status;
|
||||
PCM_RESOURCE_LIST ResourceList;
|
||||
|
||||
DPRINT1("IoReportResourceUsage is halfplemented!\n");
|
||||
|
||||
if (!DriverList && !DeviceList)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
|
||||
if (DeviceList)
|
||||
ResourceList = DeviceList;
|
||||
else
|
||||
ResourceList = DriverList;
|
||||
|
||||
Status = IopDetectResourceConflict(ResourceList, FALSE, NULL);
|
||||
if (Status == STATUS_CONFLICTING_ADDRESSES)
|
||||
{
|
||||
*ConflictDetected = TRUE;
|
||||
|
||||
if (!OverrideConflict)
|
||||
{
|
||||
DPRINT1("Denying an attempt to claim resources currently in use by another device!\n");
|
||||
return STATUS_CONFLICTING_ADDRESSES;
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT1("Proceeding with conflicting resources\n");
|
||||
}
|
||||
}
|
||||
else if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* TODO: Claim resources in registry */
|
||||
|
||||
*ConflictDetected = FALSE;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @halfplemented
|
||||
*/
|
||||
NTSTATUS NTAPI
|
||||
IoAssignResources(PUNICODE_STRING RegistryPath,
|
||||
|
@ -892,8 +927,23 @@ IoAssignResources(PUNICODE_STRING RegistryPath,
|
|||
PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
|
||||
PCM_RESOURCE_LIST* AllocatedResources)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return(STATUS_NOT_IMPLEMENTED);
|
||||
NTSTATUS Status;
|
||||
|
||||
DPRINT1("IoAssignResources is halfplemented!\n");
|
||||
|
||||
Status = IopCreateResourceListFromRequirements(RequestedResources,
|
||||
AllocatedResources);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
if (Status == STATUS_CONFLICTING_ADDRESSES)
|
||||
DPRINT1("Denying an attempt to claim resources currently in use by another device!\n");
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* TODO: Claim resources in registry */
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -38,9 +38,6 @@ NTSTATUS
|
|||
IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode,
|
||||
PVOID Context);
|
||||
|
||||
NTSTATUS
|
||||
IopDetectResourceConflict(IN PCM_RESOURCE_LIST ResourceList);
|
||||
|
||||
NTSTATUS
|
||||
PpSetCustomTargetEvent(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN OUT PKEVENT SyncEvent OPTIONAL,
|
||||
|
@ -379,7 +376,7 @@ IoReportResourceForDetection(IN PDRIVER_OBJECT DriverObject,
|
|||
ResourceList = DriverList;
|
||||
|
||||
/* Look for a resource conflict */
|
||||
Status = IopDetectResourceConflict(ResourceList);
|
||||
Status = IopDetectResourceConflict(ResourceList, FALSE, NULL);
|
||||
if (Status == STATUS_CONFLICTING_ADDRESSES)
|
||||
{
|
||||
/* Oh noes */
|
||||
|
|
|
@ -12,12 +12,6 @@
|
|||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
NTSTATUS
|
||||
IopDetectResourceConflict(
|
||||
IN PCM_RESOURCE_LIST ResourceList,
|
||||
IN BOOLEAN Silent,
|
||||
OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor);
|
||||
|
||||
static
|
||||
BOOLEAN
|
||||
IopCheckDescriptorForConflict(PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc, OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor)
|
||||
|
@ -187,8 +181,8 @@ IopFindInterruptResource(
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
|
||||
NTSTATUS NTAPI
|
||||
IopCreateResourceListFromRequirements(
|
||||
IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList,
|
||||
OUT PCM_RESOURCE_LIST *ResourceList)
|
||||
|
@ -336,9 +330,6 @@ IopCheckResourceDescriptor(
|
|||
ULONG i, ii;
|
||||
BOOLEAN Result = FALSE;
|
||||
|
||||
if (ResDesc->ShareDisposition == CmResourceShareShared)
|
||||
return FALSE;
|
||||
|
||||
for (i = 0; i < ResourceList->Count; i++)
|
||||
{
|
||||
PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList->List[i].PartialResourceList;
|
||||
|
@ -615,40 +606,61 @@ IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2
|
|||
|
||||
if (DeviceNode->ResourceList)
|
||||
{
|
||||
PWCHAR DeviceName = NULL;
|
||||
UNICODE_STRING NameU;
|
||||
UNICODE_STRING Suffix;
|
||||
UNICODE_STRING RawSuffix, TranslatedSuffix;
|
||||
ULONG OldLength = 0;
|
||||
|
||||
ASSERT(DeviceNode->ResourceListTranslated);
|
||||
|
||||
RtlInitUnicodeString(&TranslatedSuffix, L".Translated");
|
||||
RtlInitUnicodeString(&RawSuffix, L".Raw");
|
||||
|
||||
Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject,
|
||||
DevicePropertyPhysicalDeviceObjectName,
|
||||
0,
|
||||
NULL,
|
||||
&OldLength);
|
||||
if ((OldLength != 0) && (Status == STATUS_BUFFER_TOO_SMALL))
|
||||
{
|
||||
DeviceName = ExAllocatePool(NonPagedPool, OldLength);
|
||||
ASSERT(DeviceName);
|
||||
if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL)
|
||||
{
|
||||
ASSERT(OldLength);
|
||||
|
||||
NameU.Buffer = ExAllocatePool(PagedPool, OldLength + TranslatedSuffix.Length);
|
||||
if (!NameU.Buffer)
|
||||
{
|
||||
ZwClose(PnpMgrLevel2);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
NameU.Length = 0;
|
||||
NameU.MaximumLength = OldLength + TranslatedSuffix.Length;
|
||||
|
||||
Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject,
|
||||
DevicePropertyPhysicalDeviceObjectName,
|
||||
NameU.MaximumLength,
|
||||
NameU.Buffer,
|
||||
&OldLength);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ZwClose(PnpMgrLevel2);
|
||||
ExFreePool(NameU.Buffer);
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
else if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Some failure */
|
||||
ZwClose(PnpMgrLevel2);
|
||||
return Status;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* This should never happen */
|
||||
ASSERT(FALSE);
|
||||
}
|
||||
|
||||
NameU.Length = OldLength;
|
||||
|
||||
IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject,
|
||||
DevicePropertyPhysicalDeviceObjectName,
|
||||
OldLength,
|
||||
DeviceName,
|
||||
&OldLength);
|
||||
|
||||
RtlInitUnicodeString(&NameU, DeviceName);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Some failure */
|
||||
ASSERT(!NT_SUCCESS(Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
RtlInitUnicodeString(&Suffix, L".Raw");
|
||||
RtlAppendUnicodeStringToString(&NameU, &Suffix);
|
||||
RtlAppendUnicodeStringToString(&NameU, &RawSuffix);
|
||||
|
||||
Status = ZwSetValueKey(PnpMgrLevel2,
|
||||
&NameU,
|
||||
|
@ -659,14 +671,14 @@ IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2
|
|||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ZwClose(PnpMgrLevel2);
|
||||
ExFreePool(NameU.Buffer);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* "Remove" the suffix by setting the length back to what it used to be */
|
||||
NameU.Length = (USHORT)OldLength;
|
||||
NameU.Length = OldLength;
|
||||
|
||||
RtlInitUnicodeString(&Suffix, L".Translated");
|
||||
RtlAppendUnicodeStringToString(&NameU, &Suffix);
|
||||
RtlAppendUnicodeStringToString(&NameU, &TranslatedSuffix);
|
||||
|
||||
Status = ZwSetValueKey(PnpMgrLevel2,
|
||||
&NameU,
|
||||
|
@ -675,8 +687,8 @@ IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2
|
|||
DeviceNode->ResourceListTranslated,
|
||||
PnpDetermineResourceListSize(DeviceNode->ResourceListTranslated));
|
||||
ZwClose(PnpMgrLevel2);
|
||||
ASSERT(DeviceName);
|
||||
ExFreePool(DeviceName);
|
||||
ExFreePool(NameU.Buffer);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
}
|
||||
|
@ -718,7 +730,7 @@ IopTranslateDeviceResources(
|
|||
DeviceNode->ResourceListTranslated = ExAllocatePool(PagedPool, ListSize);
|
||||
if (!DeviceNode->ResourceListTranslated)
|
||||
{
|
||||
Status =STATUS_NO_MEMORY;
|
||||
Status = STATUS_NO_MEMORY;
|
||||
goto cleanup;
|
||||
}
|
||||
RtlCopyMemory(DeviceNode->ResourceListTranslated, DeviceNode->ResourceList, ListSize);
|
||||
|
@ -743,6 +755,7 @@ IopTranslateDeviceResources(
|
|||
&DescriptorTranslated->u.Port.Start))
|
||||
{
|
||||
Status = STATUS_UNSUCCESSFUL;
|
||||
DPRINT1("Failed to translate port resource (Start: 0xI64x)\n", DescriptorRaw->u.Port.Start.QuadPart);
|
||||
goto cleanup;
|
||||
}
|
||||
break;
|
||||
|
@ -756,6 +769,14 @@ IopTranslateDeviceResources(
|
|||
DescriptorRaw->u.Interrupt.Vector,
|
||||
(PKIRQL)&DescriptorTranslated->u.Interrupt.Level,
|
||||
&DescriptorTranslated->u.Interrupt.Affinity);
|
||||
|
||||
if (!DescriptorTranslated->u.Interrupt.Vector)
|
||||
{
|
||||
Status = STATUS_UNSUCCESSFUL;
|
||||
DPRINT1("Failed to translate interrupt resource (Vector: 0x%x | Level: 0x%x)\n", DescriptorRaw->u.Interrupt.Vector,
|
||||
DescriptorRaw->u.Interrupt.Level);
|
||||
goto cleanup;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CmResourceTypeMemory:
|
||||
|
@ -769,6 +790,7 @@ IopTranslateDeviceResources(
|
|||
&DescriptorTranslated->u.Memory.Start))
|
||||
{
|
||||
Status = STATUS_UNSUCCESSFUL;
|
||||
DPRINT1("Failed to translate memory resource (Start: 0xI64x)\n", DescriptorRaw->u.Memory.Start.QuadPart);
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
@ -864,16 +886,21 @@ IopAssignDeviceResources(
|
|||
Status = IopCreateResourceListFromRequirements(DeviceNode->ResourceRequirements,
|
||||
&DeviceNode->ResourceList);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Failed to create a resource list from supplied resources for %wZ\n", &DeviceNode->InstancePath);
|
||||
goto ByeBye;
|
||||
}
|
||||
|
||||
Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL);
|
||||
if (!NT_SUCCESS(Status))
|
||||
goto ByeBye;
|
||||
/* IopCreateResourceListFromRequirements should NEVER succeed with a conflicting list */
|
||||
ASSERT(IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL) != STATUS_CONFLICTING_ADDRESSES);
|
||||
|
||||
Finish:
|
||||
Status = IopTranslateDeviceResources(DeviceNode);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Failed to translate resources for %wZ\n", &DeviceNode->InstancePath);
|
||||
goto ByeBye;
|
||||
}
|
||||
|
||||
Status = IopUpdateResourceMapForPnPDevice(DeviceNode);
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
@ -935,7 +962,7 @@ ByeBye:
|
|||
return Result;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTSTATUS NTAPI
|
||||
IopDetectResourceConflict(
|
||||
IN PCM_RESOURCE_LIST ResourceList,
|
||||
IN BOOLEAN Silent,
|
||||
|
|
|
@ -1048,6 +1048,48 @@ MmFlushVirtualMemory(IN PEPROCESS Process,
|
|||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ULONG
|
||||
NTAPI
|
||||
MiGetPageProtection(IN PMMPTE PointerPte)
|
||||
{
|
||||
MMPTE TempPte;
|
||||
PMMPFN Pfn;
|
||||
PAGED_CODE();
|
||||
|
||||
/* Copy this PTE's contents */
|
||||
TempPte = *PointerPte;
|
||||
|
||||
/* Assure it's not totally zero */
|
||||
ASSERT(TempPte.u.Long);
|
||||
|
||||
/* Check for a special prototype format */
|
||||
if (TempPte.u.Soft.Valid == 0 &&
|
||||
TempPte.u.Soft.Prototype == 1)
|
||||
{
|
||||
/* Unsupported now */
|
||||
UNIMPLEMENTED;
|
||||
ASSERT(FALSE);
|
||||
}
|
||||
|
||||
/* In the easy case of transition or demand zero PTE just return its protection */
|
||||
if (!TempPte.u.Hard.Valid) return MmProtectToValue[TempPte.u.Soft.Protection];
|
||||
|
||||
/* If we get here, the PTE is valid, so look up the page in PFN database */
|
||||
Pfn = MiGetPfnEntry(TempPte.u.Hard.PageFrameNumber);
|
||||
|
||||
if (!Pfn->u3.e1.PrototypePte)
|
||||
{
|
||||
/* Return protection of the original pte */
|
||||
return MmProtectToValue[Pfn->OriginalPte.u.Soft.Protection];
|
||||
}
|
||||
|
||||
/* This is hardware PTE */
|
||||
UNIMPLEMENTED;
|
||||
ASSERT(FALSE);
|
||||
|
||||
return PAGE_NOACCESS;
|
||||
}
|
||||
|
||||
ULONG
|
||||
NTAPI
|
||||
MiQueryAddressState(IN PVOID Va,
|
||||
|
@ -1119,9 +1161,9 @@ MiQueryAddressState(IN PVOID Va,
|
|||
{
|
||||
/* This means it's committed */
|
||||
State = MEM_COMMIT;
|
||||
|
||||
/* For now, we lie about the protection */
|
||||
Protect = PAGE_EXECUTE_READWRITE;
|
||||
|
||||
/* Get protection state of this page */
|
||||
Protect = MiGetPageProtection(PointerPte);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2306,7 +2348,7 @@ NtQueryVirtualMemory(IN HANDLE ProcessHandle,
|
|||
NTSTATUS Status;
|
||||
PMMVAD Vad = NULL;
|
||||
PVOID Address, NextAddress;
|
||||
BOOLEAN Found;
|
||||
BOOLEAN Found = FALSE;
|
||||
ULONG NewProtect, NewState, BaseVpn;
|
||||
MEMORY_BASIC_INFORMATION MemoryInfo;
|
||||
KAPC_STATE ApcState;
|
||||
|
@ -2329,9 +2371,34 @@ NtQueryVirtualMemory(IN HANDLE ProcessHandle,
|
|||
if ((BaseAddress > MM_HIGHEST_VAD_ADDRESS) ||
|
||||
(PAGE_ALIGN(BaseAddress) == (PVOID)USER_SHARED_DATA))
|
||||
{
|
||||
/* FIXME: We should return some bogus info structure */
|
||||
UNIMPLEMENTED;
|
||||
while (TRUE);
|
||||
Address = PAGE_ALIGN(BaseAddress);
|
||||
|
||||
/* Make up an info structure describing this range */
|
||||
MemoryInfo.BaseAddress = Address;
|
||||
MemoryInfo.AllocationProtect = PAGE_READONLY;
|
||||
MemoryInfo.Type = MEM_PRIVATE;
|
||||
|
||||
/* Special case for shared data */
|
||||
if (Address == (PVOID)USER_SHARED_DATA)
|
||||
{
|
||||
MemoryInfo.AllocationBase = (PVOID)USER_SHARED_DATA;
|
||||
MemoryInfo.State = MEM_COMMIT;
|
||||
MemoryInfo.Protect = PAGE_READONLY;
|
||||
MemoryInfo.RegionSize = PAGE_SIZE;
|
||||
}
|
||||
else
|
||||
{
|
||||
MemoryInfo.AllocationBase = (PCHAR)MM_HIGHEST_VAD_ADDRESS + 1;
|
||||
MemoryInfo.State = MEM_RESERVE;
|
||||
MemoryInfo.Protect = PAGE_NOACCESS;
|
||||
MemoryInfo.RegionSize = (ULONG_PTR)MemoryInfo.AllocationBase - (ULONG_PTR)Address;
|
||||
}
|
||||
|
||||
/* Return the data (FIXME: Use SEH) */
|
||||
*(PMEMORY_BASIC_INFORMATION)MemoryInformation = MemoryInfo;
|
||||
if (ReturnLength) *ReturnLength = sizeof(MEMORY_BASIC_INFORMATION);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* Check if this is for a local or remote process */
|
||||
|
@ -2390,11 +2457,61 @@ NtQueryVirtualMemory(IN HANDLE ProcessHandle,
|
|||
/* Was a VAD found? */
|
||||
if (!Found)
|
||||
{
|
||||
/* We don't handle this yet */
|
||||
UNIMPLEMENTED;
|
||||
while (TRUE);
|
||||
Address = PAGE_ALIGN(BaseAddress);
|
||||
|
||||
/* Calculate region size */
|
||||
if (Vad)
|
||||
{
|
||||
if (Vad->StartingVpn >= BaseVpn)
|
||||
{
|
||||
/* Region size is the free space till the start of that VAD */
|
||||
MemoryInfo.RegionSize = (ULONG_PTR)(Vad->StartingVpn << PAGE_SHIFT) - (ULONG_PTR)Address;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Get the next VAD */
|
||||
Vad = (PMMVAD)MiGetNextNode((PMMADDRESS_NODE)Vad);
|
||||
if (Vad)
|
||||
{
|
||||
/* Region size is the free space till the start of that VAD */
|
||||
MemoryInfo.RegionSize = (ULONG_PTR)(Vad->StartingVpn << PAGE_SHIFT) - (ULONG_PTR)Address;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Maximum possible region size with that base address */
|
||||
MemoryInfo.RegionSize = (PCHAR)MM_HIGHEST_VAD_ADDRESS + 1 - (PCHAR)Address;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Maximum possible region size with that base address */
|
||||
MemoryInfo.RegionSize = (PCHAR)MM_HIGHEST_VAD_ADDRESS + 1 - (PCHAR)Address;
|
||||
}
|
||||
|
||||
/* Check if we were attached */
|
||||
if (ProcessHandle != NtCurrentProcess())
|
||||
{
|
||||
/* Detach and derefernece the process */
|
||||
KeUnstackDetachProcess(&ApcState);
|
||||
ObDereferenceObject(TargetProcess);
|
||||
}
|
||||
|
||||
/* Build the rest of the initial information block */
|
||||
MemoryInfo.BaseAddress = Address;
|
||||
MemoryInfo.AllocationBase = NULL;
|
||||
MemoryInfo.AllocationProtect = 0;
|
||||
MemoryInfo.State = MEM_FREE;
|
||||
MemoryInfo.Protect = PAGE_NOACCESS;
|
||||
MemoryInfo.Type = 0;
|
||||
|
||||
/* Return the data (FIXME: Use SEH) */
|
||||
*(PMEMORY_BASIC_INFORMATION)MemoryInformation = MemoryInfo;
|
||||
if (ReturnLength) *ReturnLength = sizeof(MEMORY_BASIC_INFORMATION);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/* This must be a VM VAD */
|
||||
ASSERT(Vad->u.VadFlags.PrivateMemory);
|
||||
|
||||
|
|
|
@ -68,6 +68,10 @@ DtbgWindowProc(HWND Wnd,
|
|||
case WM_CLOSE:
|
||||
return 0;
|
||||
|
||||
case WM_DISPLAYCHANGE:
|
||||
MoveWindow(Wnd, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
|
||||
break;
|
||||
|
||||
case WM_NOTIFY:
|
||||
{
|
||||
PPRIVATE_NOTIFY_DESKTOP nmh = (PPRIVATE_NOTIFY_DESKTOP)lParam;
|
||||
|
|
|
@ -12,7 +12,8 @@ add_definitions(-DLANGPACK)
|
|||
add_definitions(-D_WIN32K_)
|
||||
|
||||
list(APPEND SOURCE
|
||||
dib/dib1bpp.c
|
||||
dib/alphablend.c
|
||||
dib/dib1bpp.c
|
||||
dib/dib4bpp.c
|
||||
dib/dib8bpp.c
|
||||
dib/dib16bpp.c
|
||||
|
@ -34,12 +35,15 @@ list(APPEND SOURCE
|
|||
eng/float.c
|
||||
eng/gradient.c
|
||||
eng/lineto.c
|
||||
eng/ldevobj.c
|
||||
eng/mapping.c
|
||||
eng/mem.c
|
||||
eng/engmisc.c
|
||||
eng/mouse.c
|
||||
eng/paint.c
|
||||
eng/pdevobj.c
|
||||
eng/perfcnt.c
|
||||
eng/rlecomp.c
|
||||
eng/semaphor.c
|
||||
eng/sort.c
|
||||
eng/string.c
|
||||
|
@ -48,7 +52,6 @@ list(APPEND SOURCE
|
|||
eng/transblt.c
|
||||
eng/engwindow.c
|
||||
eng/xlate.c
|
||||
ldr/loader.c
|
||||
main/dllmain.c
|
||||
misc/driver.c
|
||||
misc/err.c
|
||||
|
|
123
subsystems/win32/win32k/dib/alphablend.c
Normal file
123
subsystems/win32/win32k/dib/alphablend.c
Normal file
|
@ -0,0 +1,123 @@
|
|||
/*
|
||||
* PROJECT: Win32 subsystem
|
||||
* LICENSE: See COPYING in the top level directory
|
||||
* FILE: subsystems/win32/win32k/dib/stretchblt.c
|
||||
* PURPOSE: AlphaBlend implementation suitable for all bit depths
|
||||
* PROGRAMMERS: Jérôme Gardou
|
||||
*/
|
||||
|
||||
#include <win32k.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
typedef union
|
||||
{
|
||||
ULONG ul;
|
||||
struct
|
||||
{
|
||||
UCHAR red;
|
||||
UCHAR green;
|
||||
UCHAR blue;
|
||||
UCHAR alpha;
|
||||
} col;
|
||||
} NICEPIXEL32;
|
||||
|
||||
static __inline UCHAR
|
||||
Clamp8(ULONG val)
|
||||
{
|
||||
return (val > 255) ? 255 : val;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
DIB_XXBPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
|
||||
RECTL* SourceRect, CLIPOBJ* ClipRegion,
|
||||
XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj)
|
||||
{
|
||||
INT DstX, DstY, SrcX, SrcY;
|
||||
BLENDFUNCTION BlendFunc;
|
||||
register NICEPIXEL32 DstPixel32;
|
||||
register NICEPIXEL32 SrcPixel32;
|
||||
UCHAR Alpha, SrcBpp = BitsPerFormat(Source->iBitmapFormat);
|
||||
EXLATEOBJ* pexlo;
|
||||
EXLATEOBJ exloSrcRGB, exloDstRGB, exloRGBSrc;
|
||||
PFN_DIB_PutPixel pfnDibPutPixel = DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_PutPixel;
|
||||
|
||||
DPRINT("DIB_16BPP_AlphaBlend: srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n",
|
||||
SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom,
|
||||
DestRect->left, DestRect->top, DestRect->right, DestRect->bottom);
|
||||
|
||||
BlendFunc = BlendObj->BlendFunction;
|
||||
if (BlendFunc.BlendOp != AC_SRC_OVER)
|
||||
{
|
||||
DPRINT1("BlendOp != AC_SRC_OVER\n");
|
||||
return FALSE;
|
||||
}
|
||||
if (BlendFunc.BlendFlags != 0)
|
||||
{
|
||||
DPRINT1("BlendFlags != 0\n");
|
||||
return FALSE;
|
||||
}
|
||||
if ((BlendFunc.AlphaFormat & ~AC_SRC_ALPHA) != 0)
|
||||
{
|
||||
DPRINT1("Unsupported AlphaFormat (0x%x)\n", BlendFunc.AlphaFormat);
|
||||
return FALSE;
|
||||
}
|
||||
if ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0 &&
|
||||
SrcBpp != 32)
|
||||
{
|
||||
DPRINT1("Source bitmap must be 32bpp when AC_SRC_ALPHA is set\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!ColorTranslation)
|
||||
{
|
||||
DPRINT1("ColorTranslation must not be NULL!\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pexlo = CONTAINING_RECORD(ColorTranslation, EXLATEOBJ, xlo);
|
||||
EXLATEOBJ_vInitialize(&exloSrcRGB, pexlo->ppalSrc, &gpalRGB, 0, 0, 0);
|
||||
EXLATEOBJ_vInitialize(&exloDstRGB, pexlo->ppalDst, &gpalRGB, 0, 0, 0);
|
||||
EXLATEOBJ_vInitialize(&exloRGBSrc, &gpalRGB, pexlo->ppalSrc, 0, 0, 0);
|
||||
|
||||
SrcY = SourceRect->top;
|
||||
DstY = DestRect->top;
|
||||
while ( DstY < DestRect->bottom )
|
||||
{
|
||||
SrcX = SourceRect->left;
|
||||
DstX = DestRect->left;
|
||||
while(DstX < DestRect->right)
|
||||
{
|
||||
SrcPixel32.ul = DIB_GetSource(Source, SrcX, SrcY, &exloSrcRGB.xlo);
|
||||
SrcPixel32.col.red = (SrcPixel32.col.red * BlendFunc.SourceConstantAlpha) / 255;
|
||||
SrcPixel32.col.green = (SrcPixel32.col.green * BlendFunc.SourceConstantAlpha) / 255;
|
||||
SrcPixel32.col.blue = (SrcPixel32.col.blue * BlendFunc.SourceConstantAlpha) / 255;
|
||||
|
||||
Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ?
|
||||
(SrcPixel32.col.alpha * BlendFunc.SourceConstantAlpha) / 255 :
|
||||
BlendFunc.SourceConstantAlpha ;
|
||||
|
||||
DstPixel32.ul = DIB_GetSource(Dest, DstX, DstY, &exloDstRGB.xlo);
|
||||
DstPixel32.col.red = Clamp8((DstPixel32.col.red * (255 - Alpha)) / 255 + SrcPixel32.col.red) ;
|
||||
DstPixel32.col.green = Clamp8((DstPixel32.col.green * (255 - Alpha)) / 255 + SrcPixel32.col.green) ;
|
||||
DstPixel32.col.blue = Clamp8((DstPixel32.col.blue * (255 - Alpha)) / 255 + SrcPixel32.col.blue) ;
|
||||
DstPixel32.ul = XLATEOBJ_iXlate(&exloRGBSrc.xlo, DstPixel32.ul);
|
||||
pfnDibPutPixel(Dest, DstX, DstY, XLATEOBJ_iXlate(ColorTranslation, DstPixel32.ul));
|
||||
|
||||
DstX++;
|
||||
SrcX = SourceRect->left + ((DstX-DestRect->left)*(SourceRect->right - SourceRect->left))
|
||||
/(DestRect->right-DestRect->left);
|
||||
}
|
||||
DstY++;
|
||||
SrcY = SourceRect->top + ((DstY-DestRect->top)*(SourceRect->bottom - SourceRect->top))
|
||||
/(DestRect->bottom-DestRect->top);
|
||||
}
|
||||
|
||||
EXLATEOBJ_vCleanup(&exloDstRGB);
|
||||
EXLATEOBJ_vCleanup(&exloRGBSrc);
|
||||
EXLATEOBJ_vCleanup(&exloSrcRGB);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -29,25 +29,25 @@ DIB_FUNCTIONS DibFunctionsForBitmapFormat[] =
|
|||
{
|
||||
DIB_1BPP_PutPixel, DIB_1BPP_GetPixel, DIB_1BPP_HLine, DIB_1BPP_VLine,
|
||||
DIB_1BPP_BitBlt, DIB_1BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt,
|
||||
DIB_1BPP_TransparentBlt, DIB_1BPP_ColorFill, DIB_1BPP_AlphaBlend
|
||||
DIB_1BPP_TransparentBlt, DIB_1BPP_ColorFill, DIB_XXBPP_AlphaBlend
|
||||
},
|
||||
/* BMF_4BPP */
|
||||
{
|
||||
DIB_4BPP_PutPixel, DIB_4BPP_GetPixel, DIB_4BPP_HLine, DIB_4BPP_VLine,
|
||||
DIB_4BPP_BitBlt, DIB_4BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt,
|
||||
DIB_4BPP_TransparentBlt, DIB_4BPP_ColorFill, DIB_4BPP_AlphaBlend
|
||||
DIB_4BPP_TransparentBlt, DIB_4BPP_ColorFill, DIB_XXBPP_AlphaBlend
|
||||
},
|
||||
/* BMF_8BPP */
|
||||
{
|
||||
DIB_8BPP_PutPixel, DIB_8BPP_GetPixel, DIB_8BPP_HLine, DIB_8BPP_VLine,
|
||||
DIB_8BPP_BitBlt, DIB_8BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt,
|
||||
DIB_8BPP_TransparentBlt, DIB_8BPP_ColorFill, DIB_8BPP_AlphaBlend
|
||||
DIB_8BPP_TransparentBlt, DIB_8BPP_ColorFill, DIB_XXBPP_AlphaBlend
|
||||
},
|
||||
/* BMF_16BPP */
|
||||
{
|
||||
DIB_16BPP_PutPixel, DIB_16BPP_GetPixel, DIB_16BPP_HLine, DIB_16BPP_VLine,
|
||||
DIB_16BPP_BitBlt, DIB_16BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt,
|
||||
DIB_16BPP_TransparentBlt, DIB_16BPP_ColorFill, DIB_16BPP_AlphaBlend
|
||||
DIB_16BPP_TransparentBlt, DIB_16BPP_ColorFill, DIB_XXBPP_AlphaBlend
|
||||
},
|
||||
/* BMF_24BPP */
|
||||
{
|
||||
|
|
|
@ -78,7 +78,6 @@ BOOLEAN DIB_1BPP_BitBlt(PBLTINFO);
|
|||
BOOLEAN DIB_1BPP_BitBltSrcCopy(PBLTINFO);
|
||||
BOOLEAN DIB_1BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,XLATEOBJ*,ULONG);
|
||||
BOOLEAN DIB_1BPP_ColorFill(SURFOBJ*, RECTL*, ULONG);
|
||||
BOOLEAN DIB_1BPP_AlphaBlend(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATEOBJ*, BLENDOBJ*);
|
||||
|
||||
VOID DIB_4BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
|
||||
ULONG DIB_4BPP_GetPixel(SURFOBJ*,LONG,LONG);
|
||||
|
@ -88,7 +87,6 @@ BOOLEAN DIB_4BPP_BitBlt(PBLTINFO);
|
|||
BOOLEAN DIB_4BPP_BitBltSrcCopy(PBLTINFO);
|
||||
BOOLEAN DIB_4BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,XLATEOBJ*,ULONG);
|
||||
BOOLEAN DIB_4BPP_ColorFill(SURFOBJ*, RECTL*, ULONG);
|
||||
BOOLEAN DIB_4BPP_AlphaBlend(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATEOBJ*, BLENDOBJ*);
|
||||
|
||||
VOID DIB_8BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
|
||||
ULONG DIB_8BPP_GetPixel(SURFOBJ*,LONG,LONG);
|
||||
|
@ -98,7 +96,6 @@ BOOLEAN DIB_8BPP_BitBlt(PBLTINFO);
|
|||
BOOLEAN DIB_8BPP_BitBltSrcCopy(PBLTINFO);
|
||||
BOOLEAN DIB_8BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,XLATEOBJ*,ULONG);
|
||||
BOOLEAN DIB_8BPP_ColorFill(SURFOBJ*, RECTL*, ULONG);
|
||||
BOOLEAN DIB_8BPP_AlphaBlend(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATEOBJ*, BLENDOBJ*);
|
||||
|
||||
VOID DIB_16BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
|
||||
ULONG DIB_16BPP_GetPixel(SURFOBJ*,LONG,LONG);
|
||||
|
@ -108,7 +105,6 @@ BOOLEAN DIB_16BPP_BitBlt(PBLTINFO);
|
|||
BOOLEAN DIB_16BPP_BitBltSrcCopy(PBLTINFO);
|
||||
BOOLEAN DIB_16BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,XLATEOBJ*,ULONG);
|
||||
BOOLEAN DIB_16BPP_ColorFill(SURFOBJ*, RECTL*, ULONG);
|
||||
BOOLEAN DIB_16BPP_AlphaBlend(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATEOBJ*, BLENDOBJ*);
|
||||
|
||||
VOID DIB_24BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
|
||||
ULONG DIB_24BPP_GetPixel(SURFOBJ*,LONG,LONG);
|
||||
|
@ -132,6 +128,7 @@ BOOLEAN DIB_32BPP_AlphaBlend(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATE
|
|||
|
||||
BOOLEAN DIB_XXBPP_StretchBlt(SURFOBJ*,SURFOBJ*,SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,BRUSHOBJ*,POINTL*,XLATEOBJ*,ROP4);
|
||||
BOOLEAN DIB_XXBPP_FloodFillSolid(SURFOBJ*, BRUSHOBJ*, RECTL*, POINTL*, ULONG, UINT);
|
||||
BOOLEAN DIB_XXBPP_AlphaBlend(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATEOBJ*, BLENDOBJ*);
|
||||
|
||||
extern unsigned char notmask[2];
|
||||
extern unsigned char altnotmask[2];
|
||||
|
|
|
@ -525,174 +525,4 @@ DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
typedef union
|
||||
{
|
||||
ULONG ul;
|
||||
struct
|
||||
{
|
||||
UCHAR red;
|
||||
UCHAR green;
|
||||
UCHAR blue;
|
||||
UCHAR alpha;
|
||||
} col;
|
||||
} NICEPIXEL32;
|
||||
|
||||
typedef union
|
||||
{
|
||||
USHORT us;
|
||||
struct
|
||||
{
|
||||
USHORT red:5,
|
||||
green:6,
|
||||
blue:5;
|
||||
} col;
|
||||
} NICEPIXEL16;
|
||||
|
||||
static __inline UCHAR
|
||||
Clamp5(ULONG val)
|
||||
{
|
||||
return (val > 31) ? 31 : val;
|
||||
}
|
||||
|
||||
static __inline UCHAR
|
||||
Clamp8(ULONG val)
|
||||
{
|
||||
return (val > 255) ? 255 : val;
|
||||
}
|
||||
|
||||
static __inline UCHAR
|
||||
Clamp6(ULONG val)
|
||||
{
|
||||
return (val > 63) ? 63 : val;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
DIB_16BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
|
||||
RECTL* SourceRect, CLIPOBJ* ClipRegion,
|
||||
XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj)
|
||||
{
|
||||
INT Rows, Cols, SrcX, SrcY;
|
||||
register PUSHORT Dst;
|
||||
ULONG DstDelta;
|
||||
BLENDFUNCTION BlendFunc;
|
||||
register NICEPIXEL16 SrcPixel16;
|
||||
register NICEPIXEL16 DstPixel16;
|
||||
register NICEPIXEL32 SrcPixel32;
|
||||
register NICEPIXEL32 DstPixel32;
|
||||
UCHAR Alpha, SrcBpp;
|
||||
EXLATEOBJ *pexlo;
|
||||
EXLATEOBJ exloDst2Src;
|
||||
|
||||
DPRINT("DIB_16BPP_AlphaBlend: srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n",
|
||||
SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom,
|
||||
DestRect->left, DestRect->top, DestRect->right, DestRect->bottom);
|
||||
|
||||
ASSERT(DestRect->bottom - DestRect->top == SourceRect->bottom - SourceRect->top &&
|
||||
DestRect->right - DestRect->left == SourceRect->right - SourceRect->left);
|
||||
|
||||
BlendFunc = BlendObj->BlendFunction;
|
||||
if (BlendFunc.BlendOp != AC_SRC_OVER)
|
||||
{
|
||||
DPRINT1("BlendOp != AC_SRC_OVER\n");
|
||||
return FALSE;
|
||||
}
|
||||
if (BlendFunc.BlendFlags != 0)
|
||||
{
|
||||
DPRINT1("BlendFlags != 0\n");
|
||||
return FALSE;
|
||||
}
|
||||
if ((BlendFunc.AlphaFormat & ~AC_SRC_ALPHA) != 0)
|
||||
{
|
||||
DPRINT1("Unsupported AlphaFormat (0x%x)\n", BlendFunc.AlphaFormat);
|
||||
return FALSE;
|
||||
}
|
||||
if ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0 &&
|
||||
BitsPerFormat(Source->iBitmapFormat) != 32)
|
||||
{
|
||||
DPRINT1("Source bitmap must be 32bpp when AC_SRC_ALPHA is set\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!ColorTranslation)
|
||||
{
|
||||
DPRINT1("ColorTranslation must not be NULL!\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pexlo = CONTAINING_RECORD(ColorTranslation, EXLATEOBJ, xlo);
|
||||
EXLATEOBJ_vInitialize(&exloDst2Src, pexlo->ppalDst, pexlo->ppalSrc, 0, 0, 0);
|
||||
|
||||
Dst = (PUSHORT)((ULONG_PTR)Dest->pvScan0 + (DestRect->top * Dest->lDelta) +
|
||||
(DestRect->left << 1));
|
||||
DstDelta = Dest->lDelta - ((DestRect->right - DestRect->left) << 1);
|
||||
SrcBpp = BitsPerFormat(Source->iBitmapFormat);
|
||||
|
||||
Rows = DestRect->bottom - DestRect->top;
|
||||
SrcY = SourceRect->top;
|
||||
while (--Rows >= 0)
|
||||
{
|
||||
Cols = DestRect->right - DestRect->left;
|
||||
SrcX = SourceRect->left;
|
||||
while (--Cols >= 0)
|
||||
{
|
||||
if (SrcBpp <= 16)
|
||||
{
|
||||
SrcPixel16.us = DIB_GetSource(Source, SrcX++, SrcY, ColorTranslation);
|
||||
SrcPixel32.col.red = (SrcPixel16.col.red << 3);
|
||||
SrcPixel32.col.green = (SrcPixel16.col.green << 2);
|
||||
SrcPixel32.col.blue = (SrcPixel16.col.blue << 3);
|
||||
|
||||
SrcPixel32.col.red = SrcPixel32.col.red * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel32.col.green = SrcPixel32.col.green * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel32.col.blue = SrcPixel32.col.blue * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel32.col.alpha = (SrcBpp == 32) ?
|
||||
(SrcPixel32.col.alpha * BlendFunc.SourceConstantAlpha / 255) :
|
||||
BlendFunc.SourceConstantAlpha;
|
||||
|
||||
Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ?
|
||||
SrcPixel32.col.alpha : BlendFunc.SourceConstantAlpha;
|
||||
|
||||
DstPixel16.us = *Dst;
|
||||
DstPixel16.col.red = Clamp5(DstPixel16.col.red * (255 - Alpha) / 255 +
|
||||
(SrcPixel32.col.red >> 3));
|
||||
|
||||
DstPixel16.col.green = Clamp6(DstPixel16.col.green * (255 - Alpha) / 255 +
|
||||
(SrcPixel32.col.green >> 2));
|
||||
|
||||
DstPixel16.col.blue = Clamp5(DstPixel16.col.blue * (255 - Alpha) / 255 +
|
||||
(SrcPixel32.col.blue >> 3));
|
||||
|
||||
*Dst++ = DstPixel16.us;
|
||||
}
|
||||
else
|
||||
{
|
||||
SrcPixel32.ul = DIB_GetSourceIndex(Source, SrcX++, SrcY);
|
||||
|
||||
SrcPixel32.col.red = SrcPixel32.col.red * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel32.col.green = SrcPixel32.col.green * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel32.col.blue = SrcPixel32.col.blue * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel32.col.alpha = (SrcBpp == 32) ?
|
||||
(SrcPixel32.col.alpha * BlendFunc.SourceConstantAlpha / 255) :
|
||||
BlendFunc.SourceConstantAlpha;
|
||||
|
||||
Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ?
|
||||
SrcPixel32.col.alpha : BlendFunc.SourceConstantAlpha;
|
||||
|
||||
DstPixel32.ul = XLATEOBJ_iXlate(&exloDst2Src.xlo, *Dst);
|
||||
SrcPixel32.col.red = Clamp8(DstPixel32.col.red * (255 - Alpha) / 255 + SrcPixel32.col.red);
|
||||
SrcPixel32.col.green = Clamp8(DstPixel32.col.green * (255 - Alpha) / 255 + SrcPixel32.col.green);
|
||||
SrcPixel32.col.blue = Clamp8(DstPixel32.col.blue * (255 - Alpha) / 255 + SrcPixel32.col.blue);
|
||||
*Dst++ = XLATEOBJ_iXlate(ColorTranslation, SrcPixel32.ul);
|
||||
}
|
||||
}
|
||||
|
||||
Dst = (PUSHORT)((ULONG_PTR)Dst + DstDelta);
|
||||
SrcY++;
|
||||
}
|
||||
|
||||
EXLATEOBJ_vCleanup(&exloDst2Src);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -33,7 +33,7 @@ DIB_1BPP_GetPixel(SURFOBJ *SurfObj, LONG x, LONG y)
|
|||
VOID
|
||||
DIB_1BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c)
|
||||
{
|
||||
while(x1 < x2)
|
||||
while(x1 < x2)
|
||||
{
|
||||
DIB_1BPP_PutPixel(SurfObj, x1, y, c);
|
||||
x1++;
|
||||
|
@ -43,7 +43,7 @@ DIB_1BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c)
|
|||
VOID
|
||||
DIB_1BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c)
|
||||
{
|
||||
while(y1 < y2)
|
||||
while(y1 < y2)
|
||||
{
|
||||
DIB_1BPP_PutPixel(SurfObj, x, y1, c);
|
||||
y1++;
|
||||
|
@ -474,13 +474,4 @@ DIB_1BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
DIB_1BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
|
||||
RECTL* SourceRect, CLIPOBJ* ClipRegion,
|
||||
XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -37,7 +37,7 @@ DIB_24BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c)
|
|||
LONG lDelta = SurfObj->lDelta;
|
||||
|
||||
c &= 0xFFFFFF;
|
||||
while(y1++ < y2)
|
||||
while(y1++ < y2)
|
||||
{
|
||||
*(PUSHORT)(addr) = c & 0xFFFF;
|
||||
*(addr + 2) = c >> 16;
|
||||
|
@ -466,7 +466,6 @@ DIB_24BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
|
|||
{
|
||||
INT Rows, Cols, SrcX, SrcY;
|
||||
register PUCHAR Dst;
|
||||
ULONG DstDelta;
|
||||
BLENDFUNCTION BlendFunc;
|
||||
register NICEPIXEL32 DstPixel, SrcPixel;
|
||||
UCHAR Alpha, SrcBpp;
|
||||
|
@ -475,9 +474,6 @@ DIB_24BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
|
|||
SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom,
|
||||
DestRect->left, DestRect->top, DestRect->right, DestRect->bottom);
|
||||
|
||||
ASSERT(DestRect->bottom - DestRect->top == SourceRect->bottom - SourceRect->top &&
|
||||
DestRect->right - DestRect->left == SourceRect->right - SourceRect->left);
|
||||
|
||||
BlendFunc = BlendObj->BlendFunction;
|
||||
if (BlendFunc.BlendOp != AC_SRC_OVER)
|
||||
{
|
||||
|
@ -503,39 +499,41 @@ DIB_24BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
|
|||
|
||||
Dst = (PUCHAR)((ULONG_PTR)Dest->pvScan0 + (DestRect->top * Dest->lDelta) +
|
||||
(DestRect->left * 3));
|
||||
DstDelta = Dest->lDelta - ((DestRect->right - DestRect->left) * 3);
|
||||
SrcBpp = BitsPerFormat(Source->iBitmapFormat);
|
||||
|
||||
Rows = DestRect->bottom - DestRect->top;
|
||||
Rows = 0;
|
||||
SrcY = SourceRect->top;
|
||||
while (--Rows >= 0)
|
||||
{
|
||||
Cols = DestRect->right - DestRect->left;
|
||||
SrcX = SourceRect->left;
|
||||
while (--Cols >= 0)
|
||||
while (++Rows <= DestRect->bottom - DestRect->top)
|
||||
{
|
||||
Cols = 0;
|
||||
SrcX = SourceRect->left;
|
||||
while (++Cols <= DestRect->right - DestRect->left)
|
||||
{
|
||||
SrcPixel.ul = DIB_GetSource(Source, SrcX, SrcY, ColorTranslation);
|
||||
SrcPixel.col.red = (SrcPixel.col.red * BlendFunc.SourceConstantAlpha) / 255;
|
||||
SrcPixel.col.green = (SrcPixel.col.green * BlendFunc.SourceConstantAlpha) / 255;
|
||||
SrcPixel.col.blue = (SrcPixel.col.blue * BlendFunc.SourceConstantAlpha) / 255;
|
||||
if (!(BlendFunc.AlphaFormat & AC_SRC_ALPHA))
|
||||
{
|
||||
SrcPixel.ul = DIB_GetSource(Source, SrcX++, SrcY, ColorTranslation);
|
||||
SrcPixel.col.red = SrcPixel.col.red * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel.col.green = SrcPixel.col.green * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel.col.blue = SrcPixel.col.blue * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel.col.alpha = (SrcBpp == 32) ? (SrcPixel.col.alpha * BlendFunc.SourceConstantAlpha / 255) : BlendFunc.SourceConstantAlpha;
|
||||
|
||||
Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ?
|
||||
SrcPixel.col.alpha : BlendFunc.SourceConstantAlpha;
|
||||
|
||||
/* copy only 24bits of dst */
|
||||
DstPixel.ul = *(PUSHORT)(Dst) + (*(Dst+2) << 16);
|
||||
DstPixel.col.red = Clamp8(DstPixel.col.red * (255 - Alpha) / 255 + SrcPixel.col.red);
|
||||
DstPixel.col.green = Clamp8(DstPixel.col.green * (255 - Alpha) / 255 + SrcPixel.col.green);
|
||||
DstPixel.col.blue = Clamp8(DstPixel.col.blue * (255 - Alpha) / 255 + SrcPixel.col.blue);
|
||||
/* copy back 24bits of result */
|
||||
*(PUSHORT)(Dst) = (USHORT)(DstPixel.ul & 0xFFFF);
|
||||
*(Dst + 2) = (UCHAR)((DstPixel.ul >> 16) & 0xFF);
|
||||
Dst = (PUCHAR)((ULONG_PTR)Dst + 3);
|
||||
Alpha = BlendFunc.SourceConstantAlpha ;
|
||||
}
|
||||
Dst = (PUCHAR)((ULONG_PTR)Dst + DstDelta);
|
||||
SrcY++;
|
||||
}
|
||||
else
|
||||
{
|
||||
Alpha = (SrcPixel.col.alpha * BlendFunc.SourceConstantAlpha) / 255;
|
||||
}
|
||||
|
||||
DstPixel.col.red = Clamp8((*Dst * (255 - Alpha)) / 255 + SrcPixel.col.red) ;
|
||||
DstPixel.col.green = Clamp8((*(Dst+1) * (255 - Alpha) / 255 + SrcPixel.col.green)) ;
|
||||
DstPixel.col.blue = Clamp8((*(Dst+2) * (255 - Alpha)) / 255 + SrcPixel.col.blue) ;
|
||||
*Dst++ = DstPixel.col.red;
|
||||
*Dst++ = DstPixel.col.green;
|
||||
*Dst++ = DstPixel.col.blue;
|
||||
SrcX = SourceRect->left + (Cols*(SourceRect->right - SourceRect->left))/(DestRect->right - DestRect->left);
|
||||
}
|
||||
Dst = (PUCHAR)((ULONG_PTR)Dest->pvScan0 + ((DestRect->top + Rows) * Dest->lDelta) +
|
||||
(DestRect->left*3));
|
||||
SrcY = SourceRect->top + (Rows*(SourceRect->bottom - SourceRect->top))/(DestRect->bottom - DestRect->top);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -54,8 +54,8 @@ DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo)
|
|||
PBYTE SourceBits_4BPP, SourceLine_4BPP;
|
||||
PDWORD Source32, Dest32;
|
||||
|
||||
DestBits = (PBYTE)BltInfo->DestSurface->pvScan0
|
||||
+ (BltInfo->DestRect.top * BltInfo->DestSurface->lDelta)
|
||||
DestBits = (PBYTE)BltInfo->DestSurface->pvScan0
|
||||
+ (BltInfo->DestRect.top * BltInfo->DestSurface->lDelta)
|
||||
+ 4 * BltInfo->DestRect.left;
|
||||
|
||||
switch (BltInfo->SourceSurface->iBitmapFormat)
|
||||
|
@ -83,8 +83,8 @@ DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo)
|
|||
break;
|
||||
|
||||
case BMF_4BPP:
|
||||
SourceBits_4BPP = (PBYTE)BltInfo->SourceSurface->pvScan0
|
||||
+ (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta)
|
||||
SourceBits_4BPP = (PBYTE)BltInfo->SourceSurface->pvScan0
|
||||
+ (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta)
|
||||
+ (BltInfo->SourcePoint.x >> 1);
|
||||
|
||||
for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++)
|
||||
|
@ -156,8 +156,8 @@ DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo)
|
|||
break;
|
||||
|
||||
case BMF_24BPP:
|
||||
SourceLine = (PBYTE)BltInfo->SourceSurface->pvScan0
|
||||
+ (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta)
|
||||
SourceLine = (PBYTE)BltInfo->SourceSurface->pvScan0
|
||||
+ (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta)
|
||||
+ 3 * BltInfo->SourcePoint.x;
|
||||
DestLine = DestBits;
|
||||
|
||||
|
@ -182,7 +182,7 @@ DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo)
|
|||
break;
|
||||
|
||||
case BMF_32BPP:
|
||||
if (NULL == BltInfo->XlateSourceToDest ||
|
||||
if (NULL == BltInfo->XlateSourceToDest ||
|
||||
0 != (BltInfo->XlateSourceToDest->flXlate & XO_TRIVIAL))
|
||||
{
|
||||
if (BltInfo->DestRect.top < BltInfo->SourcePoint.y)
|
||||
|
@ -197,10 +197,10 @@ DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo)
|
|||
}
|
||||
else
|
||||
{
|
||||
SourceBits = (PBYTE)BltInfo->SourceSurface->pvScan0
|
||||
+ ((BltInfo->SourcePoint.y
|
||||
+ BltInfo->DestRect.bottom
|
||||
- BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta)
|
||||
SourceBits = (PBYTE)BltInfo->SourceSurface->pvScan0
|
||||
+ ((BltInfo->SourcePoint.y
|
||||
+ BltInfo->DestRect.bottom
|
||||
- BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta)
|
||||
+ 4 * BltInfo->SourcePoint.x;
|
||||
DestBits = (PBYTE)BltInfo->DestSurface->pvScan0 + ((BltInfo->DestRect.bottom - 1) * BltInfo->DestSurface->lDelta) + 4 * BltInfo->DestRect.left;
|
||||
for (j = BltInfo->DestRect.bottom - 1; BltInfo->DestRect.top <= j; j--)
|
||||
|
@ -348,7 +348,6 @@ DIB_32BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
|
|||
{
|
||||
INT Rows, Cols, SrcX, SrcY;
|
||||
register PULONG Dst;
|
||||
ULONG DstDelta;
|
||||
BLENDFUNCTION BlendFunc;
|
||||
register NICEPIXEL32 DstPixel, SrcPixel;
|
||||
UCHAR Alpha, SrcBpp;
|
||||
|
@ -357,9 +356,6 @@ DIB_32BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
|
|||
SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom,
|
||||
DestRect->left, DestRect->top, DestRect->right, DestRect->bottom);
|
||||
|
||||
ASSERT(DestRect->bottom - DestRect->top == SourceRect->bottom - SourceRect->top &&
|
||||
DestRect->right - DestRect->left == SourceRect->right - SourceRect->left);
|
||||
|
||||
BlendFunc = BlendObj->BlendFunction;
|
||||
if (BlendFunc.BlendOp != AC_SRC_OVER)
|
||||
{
|
||||
|
@ -385,35 +381,38 @@ DIB_32BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
|
|||
|
||||
Dst = (PULONG)((ULONG_PTR)Dest->pvScan0 + (DestRect->top * Dest->lDelta) +
|
||||
(DestRect->left << 2));
|
||||
DstDelta = Dest->lDelta - ((DestRect->right - DestRect->left) << 2);
|
||||
SrcBpp = BitsPerFormat(Source->iBitmapFormat);
|
||||
|
||||
Rows = DestRect->bottom - DestRect->top;
|
||||
SrcY = SourceRect->top;
|
||||
while (--Rows >= 0)
|
||||
Rows = 0;
|
||||
SrcY = SourceRect->top;
|
||||
while (++Rows <= DestRect->bottom - DestRect->top)
|
||||
{
|
||||
Cols = DestRect->right - DestRect->left;
|
||||
Cols = 0;
|
||||
SrcX = SourceRect->left;
|
||||
while (--Cols >= 0)
|
||||
while (++Cols <= DestRect->right - DestRect->left)
|
||||
{
|
||||
SrcPixel.ul = DIB_GetSource(Source, SrcX++, SrcY, ColorTranslation);
|
||||
SrcPixel.col.red = SrcPixel.col.red * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel.col.green = SrcPixel.col.green * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel.col.blue = SrcPixel.col.blue * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel.col.alpha = (SrcBpp == 32) ? (SrcPixel.col.alpha * BlendFunc.SourceConstantAlpha / 255) : BlendFunc.SourceConstantAlpha;
|
||||
SrcPixel.ul = DIB_GetSource(Source, SrcX, SrcY, ColorTranslation);
|
||||
SrcPixel.col.red = (SrcPixel.col.red * BlendFunc.SourceConstantAlpha) / 255;
|
||||
SrcPixel.col.green = (SrcPixel.col.green * BlendFunc.SourceConstantAlpha) / 255;
|
||||
SrcPixel.col.blue = (SrcPixel.col.blue * BlendFunc.SourceConstantAlpha) / 255;
|
||||
SrcPixel.col.alpha = (32 == SrcBpp) ?
|
||||
(SrcPixel.col.alpha * BlendFunc.SourceConstantAlpha) / 255 :
|
||||
BlendFunc.SourceConstantAlpha ;
|
||||
|
||||
Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ?
|
||||
SrcPixel.col.alpha : BlendFunc.SourceConstantAlpha;
|
||||
SrcPixel.col.alpha : BlendFunc.SourceConstantAlpha ;
|
||||
|
||||
DstPixel.ul = *Dst;
|
||||
DstPixel.col.red = Clamp8(DstPixel.col.red * (255 - Alpha) / 255 + SrcPixel.col.red);
|
||||
DstPixel.col.green = Clamp8(DstPixel.col.green * (255 - Alpha) / 255 + SrcPixel.col.green);
|
||||
DstPixel.col.blue = Clamp8(DstPixel.col.blue * (255 - Alpha) / 255 + SrcPixel.col.blue);
|
||||
DstPixel.col.alpha = Clamp8(DstPixel.col.alpha * (255 - Alpha) / 255 + SrcPixel.col.alpha);
|
||||
DstPixel.col.red = Clamp8((DstPixel.col.red * (255 - Alpha)) / 255 + SrcPixel.col.red) ;
|
||||
DstPixel.col.green = Clamp8((DstPixel.col.green * (255 - Alpha)) / 255 + SrcPixel.col.green) ;
|
||||
DstPixel.col.blue = Clamp8((DstPixel.col.blue * (255 - Alpha)) / 255 + SrcPixel.col.blue) ;
|
||||
DstPixel.col.alpha = Clamp8((DstPixel.col.alpha * (255 - Alpha)) / 255 + SrcPixel.col.alpha) ;
|
||||
*Dst++ = DstPixel.ul;
|
||||
SrcX = SourceRect->left + (Cols*(SourceRect->right - SourceRect->left))/(DestRect->right - DestRect->left);
|
||||
}
|
||||
Dst = (PULONG)((ULONG_PTR)Dst + DstDelta);
|
||||
SrcY++;
|
||||
Dst = (PULONG)((ULONG_PTR)Dest->pvScan0 + ((DestRect->top + Rows) * Dest->lDelta) +
|
||||
(DestRect->left << 2));
|
||||
SrcY = SourceRect->top + (Rows*(SourceRect->bottom - SourceRect->top))/(DestRect->bottom - DestRect->top);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
|
|
@ -32,7 +32,7 @@ DIB_4BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c)
|
|||
PBYTE addr = (PBYTE)SurfObj->pvScan0 + (x1>>1) + y * SurfObj->lDelta;
|
||||
LONG cx = x1;
|
||||
|
||||
while(cx < x2)
|
||||
while(cx < x2)
|
||||
{
|
||||
*addr = (*addr & notmask[x1&1]) | (c << ((1-(x1&1))<<2));
|
||||
if((++x1 & 1) == 0)
|
||||
|
@ -48,7 +48,7 @@ DIB_4BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c)
|
|||
int lDelta = SurfObj->lDelta;
|
||||
|
||||
addr += (x>>1) + y1 * lDelta;
|
||||
while(y1++ < y2)
|
||||
while(y1++ < y2)
|
||||
{
|
||||
*addr = (*addr & notmask[x&1]) | (c << ((1-(x&1))<<2));
|
||||
addr += lDelta;
|
||||
|
@ -81,8 +81,8 @@ DIB_4BPP_BitBltSrcCopy(PBLTINFO BltInfo)
|
|||
if(DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0)
|
||||
{
|
||||
DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 0));
|
||||
}
|
||||
else
|
||||
}
|
||||
else
|
||||
{
|
||||
DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 1));
|
||||
}
|
||||
|
@ -375,13 +375,4 @@ DIB_4BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
DIB_4BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
|
||||
RECTL* SourceRect, CLIPOBJ* ClipRegion,
|
||||
XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -43,7 +43,7 @@ DIB_8BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c)
|
|||
LONG lDelta = SurfObj->lDelta;
|
||||
|
||||
byteaddr = addr;
|
||||
while(y1++ < y2)
|
||||
while(y1++ < y2)
|
||||
{
|
||||
*addr = c;
|
||||
|
||||
|
@ -74,8 +74,8 @@ DIB_8BPP_BitBltSrcCopy(PBLTINFO BltInfo)
|
|||
if(DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0)
|
||||
{
|
||||
DIB_8BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 0));
|
||||
}
|
||||
else
|
||||
}
|
||||
else
|
||||
{
|
||||
DIB_8BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 1));
|
||||
}
|
||||
|
@ -362,130 +362,4 @@ DIB_8BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
typedef union {
|
||||
ULONG ul;
|
||||
struct {
|
||||
UCHAR red;
|
||||
UCHAR green;
|
||||
UCHAR blue;
|
||||
UCHAR alpha;
|
||||
} col;
|
||||
} NICEPIXEL32;
|
||||
|
||||
typedef union {
|
||||
USHORT us;
|
||||
struct {
|
||||
USHORT red:5,
|
||||
green:6,
|
||||
blue:5;
|
||||
} col;
|
||||
} NICEPIXEL16;
|
||||
|
||||
static __inline UCHAR
|
||||
Clamp8(ULONG val)
|
||||
{
|
||||
return (val > 255) ? 255 : val;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
DIB_8BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
|
||||
RECTL* SourceRect, CLIPOBJ* ClipRegion,
|
||||
XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj)
|
||||
{
|
||||
INT Rows, Cols, SrcX, SrcY;
|
||||
register PUCHAR Dst;
|
||||
ULONG DstDelta;
|
||||
BLENDFUNCTION BlendFunc;
|
||||
register NICEPIXEL32 DstPixel32;
|
||||
register NICEPIXEL32 SrcPixel32;
|
||||
register NICEPIXEL16 SrcPixel16;
|
||||
UCHAR Alpha, SrcBpp;
|
||||
EXLATEOBJ exloDst2Src;
|
||||
EXLATEOBJ* pexlo;
|
||||
|
||||
DPRINT("DIB_8BPP_AlphaBlend: srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n",
|
||||
SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom,
|
||||
DestRect->left, DestRect->top, DestRect->right, DestRect->bottom);
|
||||
|
||||
ASSERT(DestRect->bottom - DestRect->top == SourceRect->bottom - SourceRect->top &&
|
||||
DestRect->right - DestRect->left == SourceRect->right - SourceRect->left);
|
||||
|
||||
BlendFunc = BlendObj->BlendFunction;
|
||||
if (BlendFunc.BlendOp != AC_SRC_OVER)
|
||||
{
|
||||
DPRINT1("BlendOp != AC_SRC_OVER\n");
|
||||
return FALSE;
|
||||
}
|
||||
if (BlendFunc.BlendFlags != 0)
|
||||
{
|
||||
DPRINT1("BlendFlags != 0\n");
|
||||
return FALSE;
|
||||
}
|
||||
if ((BlendFunc.AlphaFormat & ~AC_SRC_ALPHA) != 0)
|
||||
{
|
||||
DPRINT1("Unsupported AlphaFormat (0x%x)\n", BlendFunc.AlphaFormat);
|
||||
return FALSE;
|
||||
}
|
||||
if ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0 &&
|
||||
BitsPerFormat(Source->iBitmapFormat) != 32)
|
||||
{
|
||||
DPRINT1("Source bitmap must be 32bpp when AC_SRC_ALPHA is set\n");
|
||||
return FALSE;
|
||||
}
|
||||
if (!ColorTranslation)
|
||||
{
|
||||
DPRINT1("ColorTranslation must not be NULL!\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pexlo = CONTAINING_RECORD(ColorTranslation, EXLATEOBJ, xlo);
|
||||
EXLATEOBJ_vInitialize(&exloDst2Src, pexlo->ppalDst, pexlo->ppalSrc, 0, 0, 0);
|
||||
|
||||
Dst = (PUCHAR)((ULONG_PTR)Dest->pvScan0 + (DestRect->top * Dest->lDelta) +
|
||||
DestRect->left);
|
||||
DstDelta = Dest->lDelta - (DestRect->right - DestRect->left);
|
||||
SrcBpp = BitsPerFormat(Source->iBitmapFormat);
|
||||
|
||||
Rows = DestRect->bottom - DestRect->top;
|
||||
SrcY = SourceRect->top;
|
||||
while (--Rows >= 0)
|
||||
{
|
||||
Cols = DestRect->right - DestRect->left;
|
||||
SrcX = SourceRect->left;
|
||||
while (--Cols >= 0)
|
||||
{
|
||||
if (SrcBpp <= 16)
|
||||
{
|
||||
SrcPixel16.us = DIB_GetSource(Source, SrcX++, SrcY, ColorTranslation);
|
||||
SrcPixel32.col.red = (SrcPixel16.col.red << 3) | (SrcPixel16.col.red >> 2);
|
||||
SrcPixel32.col.green = (SrcPixel16.col.green << 2) | (SrcPixel16.col.green >> 4);
|
||||
SrcPixel32.col.blue = (SrcPixel16.col.blue << 3) | (SrcPixel16.col.blue >> 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
SrcPixel32.ul = DIB_GetSourceIndex(Source, SrcX++, SrcY);
|
||||
}
|
||||
SrcPixel32.col.red = SrcPixel32.col.red * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel32.col.green = SrcPixel32.col.green * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel32.col.blue = SrcPixel32.col.blue * BlendFunc.SourceConstantAlpha / 255;
|
||||
SrcPixel32.col.alpha = (SrcBpp == 32) ? (SrcPixel32.col.alpha * BlendFunc.SourceConstantAlpha / 255) : BlendFunc.SourceConstantAlpha;
|
||||
|
||||
Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ?
|
||||
SrcPixel32.col.alpha : BlendFunc.SourceConstantAlpha;
|
||||
|
||||
DstPixel32.ul = XLATEOBJ_iXlate(&exloDst2Src.xlo, *Dst);
|
||||
SrcPixel32.col.red = Clamp8(DstPixel32.col.red * (255 - Alpha) / 255 + SrcPixel32.col.red);
|
||||
SrcPixel32.col.green = Clamp8(DstPixel32.col.green * (255 - Alpha) / 255 + SrcPixel32.col.green);
|
||||
SrcPixel32.col.blue = Clamp8(DstPixel32.col.blue * (255 - Alpha) / 255 + SrcPixel32.col.blue);
|
||||
*Dst++ = XLATEOBJ_iXlate(ColorTranslation, SrcPixel32.ul);
|
||||
}
|
||||
Dst = (PUCHAR)((ULONG_PTR)Dst + DstDelta);
|
||||
SrcY++;
|
||||
}
|
||||
|
||||
EXLATEOBJ_vCleanup(&exloDst2Src);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/*
|
||||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
* PURPOSE: GDI alpha blending functions
|
||||
|
@ -25,10 +25,6 @@ EngAlphaBlend(IN SURFOBJ *psoDest,
|
|||
IN PRECTL SourceRect,
|
||||
IN BLENDOBJ *BlendObj)
|
||||
{
|
||||
RECTL SourceStretchedRect;
|
||||
SIZEL SourceStretchedSize;
|
||||
HBITMAP SourceStretchedBitmap = 0;
|
||||
SURFOBJ* SourceStretchedObj = NULL;
|
||||
RECTL InputRect;
|
||||
RECTL OutputRect;
|
||||
RECTL ClipRect;
|
||||
|
@ -39,7 +35,6 @@ EngAlphaBlend(IN SURFOBJ *psoDest,
|
|||
INTENG_ENTER_LEAVE EnterLeaveDest;
|
||||
SURFOBJ* InputObj;
|
||||
SURFOBJ* OutputObj;
|
||||
LONG Width;
|
||||
LONG ClippingType;
|
||||
RECT_ENUM RectEnum;
|
||||
BOOL EnumMore;
|
||||
|
@ -71,7 +66,7 @@ EngAlphaBlend(IN SURFOBJ *psoDest,
|
|||
InputRect = *SourceRect;
|
||||
if ( (InputRect.top < 0) || (InputRect.bottom < 0) ||
|
||||
(InputRect.left < 0) || (InputRect.right < 0) ||
|
||||
InputRect.right > psoSource->sizlBitmap.cx ||
|
||||
InputRect.right > psoSource->sizlBitmap.cx ||
|
||||
InputRect.bottom > psoSource->sizlBitmap.cy )
|
||||
{
|
||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
||||
|
@ -111,68 +106,9 @@ EngAlphaBlend(IN SURFOBJ *psoDest,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* Stretch source if needed */
|
||||
if (OutputRect.right - OutputRect.left != InputRect.right - InputRect.left ||
|
||||
OutputRect.bottom - OutputRect.top != InputRect.bottom - InputRect.top)
|
||||
{
|
||||
SourceStretchedSize.cx = OutputRect.right - OutputRect.left;
|
||||
SourceStretchedSize.cy = OutputRect.bottom - OutputRect.top;
|
||||
Width = DIB_GetDIBWidthBytes(SourceStretchedSize.cx, BitsPerFormat(psoSource->iBitmapFormat));
|
||||
/* FIXME: Maybe it is a good idea to use EngCreateDeviceBitmap and IntEngStretchBlt
|
||||
if possible to get a HW accelerated stretch. */
|
||||
SourceStretchedBitmap = EngCreateBitmap(SourceStretchedSize, Width, psoSource->iBitmapFormat,
|
||||
BMF_TOPDOWN | BMF_NOZEROINIT, NULL);
|
||||
if (SourceStretchedBitmap == 0)
|
||||
{
|
||||
DPRINT1("EngCreateBitmap failed!\n");
|
||||
return FALSE;
|
||||
}
|
||||
SourceStretchedObj = EngLockSurface((HSURF)SourceStretchedBitmap);
|
||||
if (SourceStretchedObj == NULL)
|
||||
{
|
||||
DPRINT1("EngLockSurface failed!\n");
|
||||
EngDeleteSurface((HSURF)SourceStretchedBitmap);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
SourceStretchedRect.left = 0;
|
||||
SourceStretchedRect.right = SourceStretchedSize.cx;
|
||||
SourceStretchedRect.top = 0;
|
||||
SourceStretchedRect.bottom = SourceStretchedSize.cy;
|
||||
/* FIXME: IntEngStretchBlt isn't used here atm because it results in a
|
||||
try to acquire an already acquired mutex (lock the already locked source surface) */
|
||||
/*if (!IntEngStretchBlt(SourceStretchedObj, psoSource, NULL, NULL,
|
||||
NULL, &SourceStretchedRect, SourceRect, NULL,
|
||||
NULL, NULL, COLORONCOLOR))*/
|
||||
if (!EngStretchBlt(SourceStretchedObj, psoSource, NULL, NULL, NULL,
|
||||
NULL, NULL, &SourceStretchedRect, &InputRect,
|
||||
NULL, COLORONCOLOR))
|
||||
{
|
||||
DPRINT1("EngStretchBlt failed!\n");
|
||||
EngFreeMem(SourceStretchedObj->pvBits);
|
||||
EngUnlockSurface(SourceStretchedObj);
|
||||
EngDeleteSurface((HSURF)SourceStretchedBitmap);
|
||||
return FALSE;
|
||||
}
|
||||
InputRect.top = SourceStretchedRect.top;
|
||||
InputRect.bottom = SourceStretchedRect.bottom;
|
||||
InputRect.left = SourceStretchedRect.left;
|
||||
InputRect.right = SourceStretchedRect.right;
|
||||
psoSource = SourceStretchedObj;
|
||||
}
|
||||
|
||||
/* Now call the DIB function */
|
||||
if (!IntEngEnter(&EnterLeaveSource, psoSource, &InputRect, TRUE, &Translate, &InputObj))
|
||||
{
|
||||
if (SourceStretchedObj != NULL)
|
||||
{
|
||||
EngFreeMem(SourceStretchedObj->pvBits);
|
||||
EngUnlockSurface(SourceStretchedObj);
|
||||
}
|
||||
if (SourceStretchedBitmap != 0)
|
||||
{
|
||||
EngDeleteSurface((HSURF)SourceStretchedBitmap);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
InputRect.left += Translate.x;
|
||||
|
@ -182,16 +118,6 @@ EngAlphaBlend(IN SURFOBJ *psoDest,
|
|||
|
||||
if (!IntEngEnter(&EnterLeaveDest, psoDest, &OutputRect, FALSE, &Translate, &OutputObj))
|
||||
{
|
||||
IntEngLeave(&EnterLeaveSource);
|
||||
if (SourceStretchedObj != NULL)
|
||||
{
|
||||
EngFreeMem(SourceStretchedObj->pvBits);
|
||||
EngUnlockSurface(SourceStretchedObj);
|
||||
}
|
||||
if (SourceStretchedBitmap != 0)
|
||||
{
|
||||
EngDeleteSurface((HSURF)SourceStretchedBitmap);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
OutputRect.left += Translate.x;
|
||||
|
@ -261,16 +187,6 @@ EngAlphaBlend(IN SURFOBJ *psoDest,
|
|||
IntEngLeave(&EnterLeaveDest);
|
||||
IntEngLeave(&EnterLeaveSource);
|
||||
|
||||
if (SourceStretchedObj != NULL)
|
||||
{
|
||||
EngFreeMem(SourceStretchedObj->pvBits);
|
||||
EngUnlockSurface(SourceStretchedObj);
|
||||
}
|
||||
if (SourceStretchedBitmap != 0)
|
||||
{
|
||||
EngDeleteSurface((HSURF)SourceStretchedBitmap);
|
||||
}
|
||||
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
@ -305,17 +221,8 @@ IntEngAlphaBlend(IN SURFOBJ *psoDest,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
SURFACE_LockBitmapBits(psurfDest);
|
||||
MouseSafetyOnDrawStart(psoDest, DestRect->left, DestRect->top,
|
||||
DestRect->right, DestRect->bottom);
|
||||
|
||||
if (psoSource != psoDest)
|
||||
SURFACE_LockBitmapBits(psurfSource);
|
||||
MouseSafetyOnDrawStart(psoSource, SourceRect->left, SourceRect->top,
|
||||
SourceRect->right, SourceRect->bottom);
|
||||
|
||||
/* Call the driver's DrvAlphaBlend if available */
|
||||
if (psurfDest->flHooks & HOOK_ALPHABLEND)
|
||||
if (psurfDest->flags & HOOK_ALPHABLEND)
|
||||
{
|
||||
ret = GDIDEVFUNCS(psoDest).AlphaBlend(
|
||||
psoDest, psoSource, ClipRegion, ColorTranslation,
|
||||
|
@ -328,12 +235,6 @@ IntEngAlphaBlend(IN SURFOBJ *psoDest,
|
|||
DestRect, SourceRect, BlendObj);
|
||||
}
|
||||
|
||||
MouseSafetyOnDrawEnd(psoSource);
|
||||
if (psoSource != psoDest)
|
||||
SURFACE_UnlockBitmapBits(psurfSource);
|
||||
MouseSafetyOnDrawEnd(psoDest);
|
||||
SURFACE_UnlockBitmapBits(psurfDest);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -522,7 +522,7 @@ EngBitBlt(SURFOBJ *DestObj,
|
|||
}
|
||||
|
||||
BOOL APIENTRY
|
||||
IntEngBitBltEx(
|
||||
IntEngBitBlt(
|
||||
SURFOBJ *psoTrg,
|
||||
SURFOBJ *psoSrc,
|
||||
SURFOBJ *psoMask,
|
||||
|
@ -533,8 +533,7 @@ IntEngBitBltEx(
|
|||
POINTL *pptlMask,
|
||||
BRUSHOBJ *pbo,
|
||||
POINTL *pptlBrush,
|
||||
ROP4 rop4,
|
||||
BOOL bRemoveMouse)
|
||||
ROP4 rop4)
|
||||
{
|
||||
SURFACE *psurfTrg;
|
||||
SURFACE *psurfSrc = NULL;
|
||||
|
@ -583,28 +582,11 @@ IntEngBitBltEx(
|
|||
psurfSrc = NULL;
|
||||
}
|
||||
|
||||
if (bRemoveMouse)
|
||||
{
|
||||
SURFACE_LockBitmapBits(psurfTrg);
|
||||
|
||||
if (psoSrc)
|
||||
{
|
||||
if (psoSrc != psoTrg)
|
||||
{
|
||||
SURFACE_LockBitmapBits(psurfSrc);
|
||||
}
|
||||
MouseSafetyOnDrawStart(psoSrc, rclSrc.left, rclSrc.top,
|
||||
rclSrc.right, rclSrc.bottom);
|
||||
}
|
||||
MouseSafetyOnDrawStart(psoTrg, rclClipped.left, rclClipped.top,
|
||||
rclClipped.right, rclClipped.bottom);
|
||||
}
|
||||
|
||||
/* Is the target surface device managed? */
|
||||
if (psurfTrg->flHooks & HOOK_BITBLT)
|
||||
if (psurfTrg->flags & HOOK_BITBLT)
|
||||
{
|
||||
/* Is the source a different device managed surface? */
|
||||
if (psoSrc && psoSrc->hdev != psoTrg->hdev && psurfSrc->flHooks & HOOK_BITBLT)
|
||||
if (psoSrc && psoSrc->hdev != psoTrg->hdev && psurfSrc->flags & HOOK_BITBLT)
|
||||
{
|
||||
DPRINT1("Need to copy to standard bitmap format!\n");
|
||||
ASSERT(FALSE);
|
||||
|
@ -614,7 +596,7 @@ IntEngBitBltEx(
|
|||
}
|
||||
|
||||
/* Is the source surface device managed? */
|
||||
else if (psoSrc && psurfSrc->flHooks & HOOK_BITBLT)
|
||||
else if (psoSrc && psurfSrc->flags & HOOK_BITBLT)
|
||||
{
|
||||
pfnBitBlt = GDIDEVFUNCS(psoSrc).BitBlt;
|
||||
}
|
||||
|
@ -637,21 +619,6 @@ IntEngBitBltEx(
|
|||
|
||||
// FIXME: cleanup temp surface!
|
||||
|
||||
if (bRemoveMouse)
|
||||
{
|
||||
MouseSafetyOnDrawEnd(psoTrg);
|
||||
if (psoSrc)
|
||||
{
|
||||
MouseSafetyOnDrawEnd(psoSrc);
|
||||
if (psoSrc != psoTrg)
|
||||
{
|
||||
SURFACE_UnlockBitmapBits(psurfSrc);
|
||||
}
|
||||
}
|
||||
|
||||
SURFACE_UnlockBitmapBits(psurfTrg);
|
||||
}
|
||||
|
||||
return bResult;
|
||||
}
|
||||
|
||||
|
@ -983,27 +950,20 @@ IntEngMaskBlt(SURFOBJ *psoDest,
|
|||
ASSERT(psoDest);
|
||||
psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj);
|
||||
|
||||
SURFACE_LockBitmapBits(psurfDest);
|
||||
MouseSafetyOnDrawStart(psoDest, OutputRect.left, OutputRect.top,
|
||||
OutputRect.right, OutputRect.bottom);
|
||||
|
||||
/* Dummy BitBlt to let driver know that it should flush its changes.
|
||||
This should really be done using a call to DrvSynchronizeSurface,
|
||||
but the VMware driver doesn't hook that call. */
|
||||
IntEngBitBltEx(psoDest, NULL, psoMask, ClipRegion, DestColorTranslation,
|
||||
IntEngBitBlt(psoDest, NULL, psoMask, ClipRegion, DestColorTranslation,
|
||||
DestRect, pptlMask, pptlMask, pbo, BrushOrigin,
|
||||
R4_NOOP, FALSE);
|
||||
R4_NOOP);
|
||||
|
||||
ret = EngMaskBitBlt(psoDest, psoMask, ClipRegion, DestColorTranslation, SourceColorTranslation,
|
||||
&OutputRect, &InputPoint, pbo, BrushOrigin);
|
||||
|
||||
/* Dummy BitBlt to let driver know that something has changed. */
|
||||
IntEngBitBltEx(psoDest, NULL, psoMask, ClipRegion, DestColorTranslation,
|
||||
IntEngBitBlt(psoDest, NULL, psoMask, ClipRegion, DestColorTranslation,
|
||||
DestRect, pptlMask, pptlMask, pbo, BrushOrigin,
|
||||
R4_NOOP, FALSE);
|
||||
|
||||
MouseSafetyOnDrawEnd(psoDest);
|
||||
SURFACE_UnlockBitmapBits(psurfDest);
|
||||
R4_NOOP);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -53,13 +53,7 @@ EngCopyBits(SURFOBJ *psoDest,
|
|||
ASSERT(psoDest != NULL && psoSource != NULL && DestRect != NULL && SourcePoint != NULL);
|
||||
|
||||
psurfSource = CONTAINING_RECORD(psoSource, SURFACE, SurfObj);
|
||||
SURFACE_LockBitmapBits(psurfSource);
|
||||
|
||||
psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj);
|
||||
if (psoDest != psoSource)
|
||||
{
|
||||
SURFACE_LockBitmapBits(psurfDest);
|
||||
}
|
||||
|
||||
// FIXME: Don't punt to the driver's DrvCopyBits immediately. Instead,
|
||||
// mark the copy block function to be DrvCopyBits instead of the
|
||||
|
@ -73,7 +67,7 @@ EngCopyBits(SURFOBJ *psoDest,
|
|||
if (psoDest->iType!=STYPE_BITMAP)
|
||||
{
|
||||
/* FIXME: Eng* functions shouldn't call Drv* functions. ? */
|
||||
if (psurfDest->flHooks & HOOK_COPYBITS)
|
||||
if (psurfDest->flags & HOOK_COPYBITS)
|
||||
{
|
||||
ret = GDIDEVFUNCS(psoDest).CopyBits(
|
||||
psoDest, psoSource, Clip, ColorTranslation, DestRect, SourcePoint);
|
||||
|
@ -86,7 +80,7 @@ EngCopyBits(SURFOBJ *psoDest,
|
|||
if (psoSource->iType!=STYPE_BITMAP)
|
||||
{
|
||||
/* FIXME: Eng* functions shouldn't call Drv* functions. ? */
|
||||
if (psurfSource->flHooks & HOOK_COPYBITS)
|
||||
if (psurfSource->flags & HOOK_COPYBITS)
|
||||
{
|
||||
ret = GDIDEVFUNCS(psoSource).CopyBits(
|
||||
psoDest, psoSource, Clip, ColorTranslation, DestRect, SourcePoint);
|
||||
|
@ -180,12 +174,6 @@ EngCopyBits(SURFOBJ *psoDest,
|
|||
}
|
||||
|
||||
cleanup:
|
||||
if (psoDest != psoSource)
|
||||
{
|
||||
SURFACE_UnlockBitmapBits(psurfDest);
|
||||
}
|
||||
SURFACE_UnlockBitmapBits(psurfSource);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -198,20 +186,7 @@ IntEngCopyBits(
|
|||
RECTL *prclDest,
|
||||
POINTL *ptlSource)
|
||||
{
|
||||
BOOL bResult;
|
||||
|
||||
MouseSafetyOnDrawStart(psoSource, ptlSource->x, ptlSource->y,
|
||||
(ptlSource->x + abs(prclDest->right - prclDest->left)),
|
||||
(ptlSource->y + abs(prclDest->bottom - prclDest->top)));
|
||||
|
||||
MouseSafetyOnDrawStart(psoDest, prclDest->left, prclDest->top, prclDest->right, prclDest->bottom);
|
||||
|
||||
bResult = EngCopyBits(psoDest, psoSource, pco, pxlo, prclDest, ptlSource);
|
||||
|
||||
MouseSafetyOnDrawEnd(psoDest);
|
||||
MouseSafetyOnDrawEnd(psoSource);
|
||||
|
||||
return bResult;
|
||||
return EngCopyBits(psoDest, psoSource, pco, pxlo, prclDest, ptlSource);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -12,6 +12,264 @@
|
|||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
PGRAPHICS_DEVICE gpPrimaryGraphicsDevice;
|
||||
PGRAPHICS_DEVICE gpVgaGraphicsDevice;
|
||||
|
||||
static PGRAPHICS_DEVICE gpGraphicsDeviceFirst = NULL;
|
||||
static PGRAPHICS_DEVICE gpGraphicsDeviceLast = NULL;
|
||||
static HSEMAPHORE ghsemGraphicsDeviceList;
|
||||
static ULONG giDevNum = 1;
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
InitDeviceImpl()
|
||||
{
|
||||
ghsemGraphicsDeviceList = EngCreateSemaphore();
|
||||
if (!ghsemGraphicsDeviceList)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
PGRAPHICS_DEVICE
|
||||
NTAPI
|
||||
EngpRegisterGraphicsDevice(
|
||||
PUNICODE_STRING pustrDeviceName,
|
||||
PUNICODE_STRING pustrDiplayDrivers,
|
||||
PUNICODE_STRING pustrDescription,
|
||||
PDEVMODEW pdmDefault)
|
||||
{
|
||||
PGRAPHICS_DEVICE pGraphicsDevice;
|
||||
PDEVICE_OBJECT pDeviceObject;
|
||||
PFILE_OBJECT pFileObject;
|
||||
NTSTATUS Status;
|
||||
PWSTR pwsz;
|
||||
ULONG i, cj, cModes = 0;
|
||||
BOOL bEnable = TRUE;
|
||||
PDEVMODEINFO pdminfo;
|
||||
PDEVMODEW pdm, pdmEnd;
|
||||
PLDEVOBJ pldev;
|
||||
|
||||
DPRINT1("EngpRegisterGraphicsDevice(%S)\n", pustrDeviceName->Buffer);
|
||||
|
||||
/* Allocate a GRAPHICS_DEVICE structure */
|
||||
pGraphicsDevice = ExAllocatePoolWithTag(PagedPool,
|
||||
sizeof(GRAPHICS_DEVICE),
|
||||
GDITAG_GDEVICE);
|
||||
if (!pGraphicsDevice)
|
||||
{
|
||||
DPRINT1("ExAllocatePoolWithTag failed\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Try to open the driver */
|
||||
Status = IoGetDeviceObjectPointer(pustrDeviceName,
|
||||
FILE_READ_DATA | FILE_WRITE_DATA,
|
||||
&pFileObject,
|
||||
&pDeviceObject);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Could not open driver, 0x%lx\n", Status);
|
||||
ExFreePoolWithTag(pGraphicsDevice, GDITAG_GDEVICE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Enable the device */
|
||||
EngFileWrite(pFileObject, &bEnable, sizeof(BOOL), &cj);
|
||||
|
||||
/* Copy the device and file object pointers */
|
||||
pGraphicsDevice->DeviceObject = pDeviceObject;
|
||||
pGraphicsDevice->FileObject = pFileObject;
|
||||
|
||||
/* Copy device name */
|
||||
wcsncpy(pGraphicsDevice->szNtDeviceName,
|
||||
pustrDeviceName->Buffer,
|
||||
sizeof(pGraphicsDevice->szNtDeviceName) / sizeof(WCHAR));
|
||||
|
||||
/* Create a win device name (FIXME: virtual devices!) */
|
||||
swprintf(pGraphicsDevice->szWinDeviceName, L"\\\\.\\VIDEO%d", (CHAR)giDevNum);
|
||||
|
||||
/* Allocate a buffer for the strings */
|
||||
cj = pustrDiplayDrivers->Length + pustrDescription->Length + sizeof(WCHAR);
|
||||
pwsz = ExAllocatePoolWithTag(PagedPool, cj, GDITAG_DRVSUP);
|
||||
if (!pwsz)
|
||||
{
|
||||
DPRINT1("Could not allocate string buffer\n");
|
||||
ASSERT(FALSE); // FIXME
|
||||
}
|
||||
|
||||
/* Copy display driver names */
|
||||
pGraphicsDevice->pDiplayDrivers = pwsz;
|
||||
RtlCopyMemory(pGraphicsDevice->pDiplayDrivers,
|
||||
pustrDiplayDrivers->Buffer,
|
||||
pustrDiplayDrivers->Length);
|
||||
|
||||
/* Copy description */
|
||||
pGraphicsDevice->pwszDescription = pwsz + pustrDiplayDrivers->Length / sizeof(WCHAR);
|
||||
RtlCopyMemory(pGraphicsDevice->pwszDescription,
|
||||
pustrDescription->Buffer,
|
||||
pustrDescription->Length + sizeof(WCHAR));
|
||||
|
||||
/* Initialize the pdevmodeInfo list and default index */
|
||||
pGraphicsDevice->pdevmodeInfo = NULL;
|
||||
pGraphicsDevice->iDefaultMode = 0;
|
||||
pGraphicsDevice->iCurrentMode = 0;
|
||||
|
||||
// FIXME: initialize state flags
|
||||
pGraphicsDevice->StateFlags = 0;
|
||||
|
||||
/* Loop through the driver names
|
||||
* This is a REG_MULTI_SZ string */
|
||||
for (; *pwsz; pwsz += wcslen(pwsz) + 1)
|
||||
{
|
||||
DPRINT1("trying driver: %ls\n", pwsz);
|
||||
/* Try to load the display driver */
|
||||
pldev = EngLoadImageEx(pwsz, LDEV_DEVICE_DISPLAY);
|
||||
if (!pldev)
|
||||
{
|
||||
DPRINT1("Could not load driver: '%ls'\n", pwsz);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Get the mode list from the driver */
|
||||
pdminfo = LDEVOBJ_pdmiGetModes(pldev, pDeviceObject);
|
||||
if (!pdminfo)
|
||||
{
|
||||
DPRINT1("Could not get mode list for '%ls'\n", pwsz);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Attach the mode info to the device */
|
||||
pdminfo->pdmiNext = pGraphicsDevice->pdevmodeInfo;
|
||||
pGraphicsDevice->pdevmodeInfo = pdminfo;
|
||||
|
||||
/* Count DEVMODEs */
|
||||
pdmEnd = (DEVMODEW*)((PCHAR)pdminfo->adevmode + pdminfo->cbdevmode);
|
||||
for (pdm = pdminfo->adevmode;
|
||||
pdm + 1 <= pdmEnd;
|
||||
pdm = (DEVMODEW*)((PCHAR)pdm + pdm->dmSize + pdm->dmDriverExtra))
|
||||
{
|
||||
cModes++;
|
||||
}
|
||||
|
||||
// FIXME: release the driver again until it's used?
|
||||
}
|
||||
|
||||
if (!pGraphicsDevice->pdevmodeInfo || cModes == 0)
|
||||
{
|
||||
DPRINT1("No devmodes\n");
|
||||
ExFreePool(pGraphicsDevice);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Allocate an index buffer */
|
||||
pGraphicsDevice->cDevModes = cModes;
|
||||
pGraphicsDevice->pDevModeList = ExAllocatePoolWithTag(PagedPool,
|
||||
cModes * sizeof(DEVMODEENTRY),
|
||||
GDITAG_GDEVICE);
|
||||
if (!pGraphicsDevice->pDevModeList)
|
||||
{
|
||||
DPRINT1("No devmode list\n");
|
||||
ExFreePool(pGraphicsDevice);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Loop through all DEVMODEINFOs */
|
||||
for (pdminfo = pGraphicsDevice->pdevmodeInfo, i = 0;
|
||||
pdminfo;
|
||||
pdminfo = pdminfo->pdmiNext)
|
||||
{
|
||||
/* Calculate End of the DEVMODEs */
|
||||
pdmEnd = (DEVMODEW*)((PCHAR)pdminfo->adevmode + pdminfo->cbdevmode);
|
||||
|
||||
/* Loop through the DEVMODEs */
|
||||
for (pdm = pdminfo->adevmode;
|
||||
pdm + 1 <= pdmEnd;
|
||||
pdm = (PDEVMODEW)((PCHAR)pdm + pdm->dmSize + pdm->dmDriverExtra))
|
||||
{
|
||||
/* Compare with the default entry */
|
||||
if (pdm->dmBitsPerPel == pdmDefault->dmBitsPerPel &&
|
||||
pdm->dmPelsWidth == pdmDefault->dmPelsWidth &&
|
||||
pdm->dmPelsHeight == pdmDefault->dmPelsHeight &&
|
||||
pdm->dmDisplayFrequency == pdmDefault->dmDisplayFrequency)
|
||||
{
|
||||
pGraphicsDevice->iDefaultMode = i;
|
||||
pGraphicsDevice->iCurrentMode = i;
|
||||
DPRINT1("Found default entry: %ld '%ls'\n", i, pdm->dmDeviceName);
|
||||
}
|
||||
|
||||
/* Initialize the entry */
|
||||
pGraphicsDevice->pDevModeList[i].dwFlags = 0;
|
||||
pGraphicsDevice->pDevModeList[i].pdm = pdm;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Lock loader */
|
||||
EngAcquireSemaphore(ghsemGraphicsDeviceList);
|
||||
|
||||
/* Insert the device into the global list */
|
||||
pGraphicsDevice->pNextGraphicsDevice = gpGraphicsDeviceLast;
|
||||
gpGraphicsDeviceLast = pGraphicsDevice;
|
||||
if (!gpGraphicsDeviceFirst)
|
||||
gpGraphicsDeviceFirst = pGraphicsDevice;
|
||||
|
||||
/* Increment device number */
|
||||
giDevNum++;
|
||||
|
||||
/* Unlock loader */
|
||||
EngReleaseSemaphore(ghsemGraphicsDeviceList);
|
||||
DPRINT1("Prepared %ld modes for %ls\n", cModes, pGraphicsDevice->pwszDescription);
|
||||
|
||||
return pGraphicsDevice;
|
||||
}
|
||||
|
||||
|
||||
PGRAPHICS_DEVICE
|
||||
NTAPI
|
||||
EngpFindGraphicsDevice(
|
||||
PUNICODE_STRING pustrDevice,
|
||||
ULONG iDevNum,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
UNICODE_STRING ustrCurrent;
|
||||
PGRAPHICS_DEVICE pGraphicsDevice;
|
||||
ULONG i;
|
||||
|
||||
/* Lock list */
|
||||
EngAcquireSemaphore(ghsemGraphicsDeviceList);
|
||||
|
||||
if (pustrDevice)
|
||||
{
|
||||
/* Loop through the list of devices */
|
||||
for (pGraphicsDevice = gpGraphicsDeviceFirst;
|
||||
pGraphicsDevice;
|
||||
pGraphicsDevice = pGraphicsDevice->pNextGraphicsDevice)
|
||||
{
|
||||
/* Compare the device name */
|
||||
RtlInitUnicodeString(&ustrCurrent, pGraphicsDevice->szWinDeviceName);
|
||||
if (RtlEqualUnicodeString(&ustrCurrent, pustrDevice, FALSE))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Loop through the list of devices */
|
||||
for (pGraphicsDevice = gpGraphicsDeviceFirst, i = 0;
|
||||
pGraphicsDevice && i < iDevNum;
|
||||
pGraphicsDevice = pGraphicsDevice->pNextGraphicsDevice, i++);
|
||||
}
|
||||
|
||||
/* Unlock list */
|
||||
EngReleaseSemaphore(ghsemGraphicsDeviceList);
|
||||
|
||||
return pGraphicsDevice;
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
EngpFileIoRequest(
|
||||
|
@ -39,7 +297,7 @@ EngpFileIoRequest(
|
|||
/* Initialize an event */
|
||||
KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
|
||||
|
||||
/* Build IPR */
|
||||
/* Build IRP */
|
||||
liStartOffset.QuadPart = ullStartOffset;
|
||||
pIrp = IoBuildSynchronousFsdRequest(ulMajorFunction,
|
||||
pDeviceObject,
|
||||
|
@ -113,7 +371,7 @@ EngFileIoControl(
|
|||
/* Initialize an event */
|
||||
KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
|
||||
|
||||
/* Build IO control IPR */
|
||||
/* Build IO control IRP */
|
||||
pIrp = IoBuildDeviceIoControlRequest(dwIoControlCode,
|
||||
pDeviceObject,
|
||||
lpInBuffer,
|
||||
|
|
|
@ -18,8 +18,6 @@ VOID
|
|||
NTAPI
|
||||
EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
|
||||
{
|
||||
HPALETTE hpal = NULL;
|
||||
|
||||
ASSERT(pebo);
|
||||
ASSERT(pbrush);
|
||||
ASSERT(pdc);
|
||||
|
@ -35,14 +33,11 @@ EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
|
|||
pebo->crCurrentText = pdc->pdcattr->crForegroundClr;
|
||||
|
||||
pebo->psurfTrg = pdc->dclevel.pSurface;
|
||||
// ASSERT(pebo->psurfTrg); // FIXME: some dcs don't have a surface
|
||||
ASSERT(pebo->psurfTrg);
|
||||
ASSERT(pebo->psurfTrg->ppal);
|
||||
|
||||
if (pebo->psurfTrg)
|
||||
hpal = pebo->psurfTrg->hDIBPalette;
|
||||
if (!hpal) hpal = pPrimarySurface->devinfo.hpalDefault;
|
||||
pebo->ppalSurf = PALETTE_ShareLockPalette(hpal);
|
||||
if (!pebo->ppalSurf)
|
||||
pebo->ppalSurf = &gpalRGB;
|
||||
pebo->ppalSurf = pebo->psurfTrg->ppal;
|
||||
GDIOBJ_IncrementShareCount(&pebo->ppalSurf->BaseObject);
|
||||
|
||||
if (pbrush->flAttrs & GDIBRUSH_IS_NULL)
|
||||
{
|
||||
|
@ -80,7 +75,12 @@ EBRUSHOBJ_vSetSolidBrushColor(EBRUSHOBJ *pebo, COLORREF crColor)
|
|||
pebo->ulRGBColor = crColor;
|
||||
|
||||
/* Initialize an XLATEOBJ RGB -> surface */
|
||||
EXLATEOBJ_vInitialize(&exlo, &gpalRGB, pebo->ppalSurf, 0, 0, 0);
|
||||
EXLATEOBJ_vInitialize(&exlo,
|
||||
&gpalRGB,
|
||||
pebo->ppalSurf,
|
||||
pebo->crCurrentBack,
|
||||
0,
|
||||
0);
|
||||
|
||||
/* Translate the brush color to the target format */
|
||||
iSolidColor = XLATEOBJ_iXlate(&exlo.xlo, crColor);
|
||||
|
@ -109,8 +109,7 @@ EBRUSHOBJ_vCleanup(EBRUSHOBJ *pebo)
|
|||
pebo->BrushObject.pvRbrush = NULL;
|
||||
}
|
||||
|
||||
if (pebo->ppalSurf != &gpalRGB)
|
||||
PALETTE_ShareUnlockPalette(pebo->ppalSurf);
|
||||
PALETTE_ShareUnlockPalette(pebo->ppalSurf);
|
||||
}
|
||||
|
||||
VOID
|
||||
|
@ -145,7 +144,7 @@ EngRealizeBrush(
|
|||
ULONG lWidth;
|
||||
|
||||
/* Calculate width in bytes of the realized brush */
|
||||
lWidth = DIB_GetDIBWidthBytes(psoPattern->sizlBitmap.cx,
|
||||
lWidth = WIDTH_BYTES_ALIGN32(psoPattern->sizlBitmap.cx,
|
||||
BitsPerFormat(psoDst->iBitmapFormat));
|
||||
|
||||
/* Allocate a bitmap */
|
||||
|
@ -192,12 +191,8 @@ EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ *pebo, BOOL bCallDriver)
|
|||
PPDEVOBJ ppdev = NULL;
|
||||
EXLATEOBJ exlo;
|
||||
|
||||
// FIXME: all EBRUSHOBJs need a surface, see EBRUSHOBJ_vInit
|
||||
if (!pebo->psurfTrg)
|
||||
{
|
||||
DPRINT1("Pattern brush has no target surface!\n");
|
||||
return FALSE;
|
||||
}
|
||||
/* All EBRUSHOBJs have a surface, see EBRUSHOBJ_vInit */
|
||||
ASSERT(pebo->psurfTrg);
|
||||
|
||||
ppdev = (PPDEVOBJ)pebo->psurfTrg->SurfObj.hdev;
|
||||
|
||||
|
@ -210,16 +205,18 @@ EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ *pebo, BOOL bCallDriver)
|
|||
|
||||
psurfPattern = SURFACE_ShareLockSurface(pebo->pbrush->hbmPattern);
|
||||
ASSERT(psurfPattern);
|
||||
ASSERT(psurfPattern->ppal);
|
||||
|
||||
/* FIXME: implement mask */
|
||||
psurfMask = NULL;
|
||||
|
||||
/* Initialize XLATEOBJ for the brush */
|
||||
EXLATEOBJ_vInitBrushXlate(&exlo,
|
||||
pebo->pbrush,
|
||||
pebo->psurfTrg,
|
||||
pebo->crCurrentText,
|
||||
pebo->crCurrentBack);
|
||||
EXLATEOBJ_vInitialize(&exlo,
|
||||
psurfPattern->ppal,
|
||||
pebo->psurfTrg->ppal,
|
||||
0,
|
||||
pebo->crCurrentBack,
|
||||
pebo->crCurrentText);
|
||||
|
||||
/* Create the realization */
|
||||
bResult = pfnRealzizeBrush(&pebo->BrushObject,
|
||||
|
|
|
@ -56,7 +56,7 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
|
|||
{
|
||||
/* Driver needs to support DrvCopyBits, else we can't do anything */
|
||||
SURFACE *psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj);
|
||||
if (!(psurfDest->flHooks & HOOK_COPYBITS))
|
||||
if (!(psurfDest->flags & HOOK_COPYBITS))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
|
|||
/* Allocate a temporary bitmap */
|
||||
BitmapSize.cx = DestRect->right - DestRect->left;
|
||||
BitmapSize.cy = DestRect->bottom - DestRect->top;
|
||||
Width = DIB_GetDIBWidthBytes(BitmapSize.cx, BitsPerFormat(psoDest->iBitmapFormat));
|
||||
Width = WIDTH_BYTES_ALIGN32(BitmapSize.cx, BitsPerFormat(psoDest->iBitmapFormat));
|
||||
EnterLeave->OutputBitmap = EngCreateBitmap(BitmapSize, Width,
|
||||
psoDest->iBitmapFormat,
|
||||
BMF_TOPDOWN | BMF_NOZEROINIT, NULL);
|
||||
|
@ -127,7 +127,6 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
|
|||
&ClippedDestRect, &SrcPoint))
|
||||
{
|
||||
EngDeleteClip(EnterLeave->TrivialClipObj);
|
||||
EngFreeMem((*ppsoOutput)->pvBits);
|
||||
EngUnlockSurface(*ppsoOutput);
|
||||
EngDeleteSurface((HSURF)EnterLeave->OutputBitmap);
|
||||
return FALSE;
|
||||
|
@ -149,7 +148,7 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
|
|||
if (NULL != *ppsoOutput)
|
||||
{
|
||||
SURFACE* psurfOutput = CONTAINING_RECORD(*ppsoOutput, SURFACE, SurfObj);
|
||||
if (0 != (psurfOutput->flHooks & HOOK_SYNCHRONIZE))
|
||||
if (0 != (psurfOutput->flags & HOOK_SYNCHRONIZE))
|
||||
{
|
||||
if (NULL != GDIDEVFUNCS(*ppsoOutput).SynchronizeSurface)
|
||||
{
|
||||
|
@ -219,7 +218,6 @@ IntEngLeave(PINTENG_ENTER_LEAVE EnterLeave)
|
|||
Result = TRUE;
|
||||
}
|
||||
}
|
||||
EngFreeMem(EnterLeave->OutputObj->pvBits);
|
||||
EngUnlockSurface(EnterLeave->OutputObj);
|
||||
EngDeleteSurface((HSURF)EnterLeave->OutputBitmap);
|
||||
EngDeleteClip(EnterLeave->TrivialClipObj);
|
||||
|
|
|
@ -548,14 +548,7 @@ IntEngGradientFill(
|
|||
psurf = CONTAINING_RECORD(psoDest, SURFACE, SurfObj);
|
||||
ASSERT(psurf);
|
||||
|
||||
SURFACE_LockBitmapBits(psurf);
|
||||
MouseSafetyOnDrawStart(
|
||||
psoDest,
|
||||
pco->rclBounds.left,
|
||||
pco->rclBounds.top,
|
||||
pco->rclBounds.right,
|
||||
pco->rclBounds.bottom);
|
||||
if(psurf->flHooks & HOOK_GRADIENTFILL)
|
||||
if(psurf->flags & HOOK_GRADIENTFILL)
|
||||
{
|
||||
Ret = GDIDEVFUNCS(psoDest).GradientFill(
|
||||
psoDest, pco, pxlo, pVertex, nVertex, pMesh, nMesh,
|
||||
|
@ -566,8 +559,6 @@ IntEngGradientFill(
|
|||
Ret = EngGradientFill(psoDest, pco, pxlo, pVertex, nVertex, pMesh, nMesh, prclExtents,
|
||||
pptlDitherOrg, ulMode);
|
||||
}
|
||||
MouseSafetyOnDrawEnd(psoDest);
|
||||
SURFACE_UnlockBitmapBits(psurf);
|
||||
|
||||
return Ret;
|
||||
}
|
||||
|
|
504
subsystems/win32/win32k/eng/ldevobj.c
Normal file
504
subsystems/win32/win32k/eng/ldevobj.c
Normal file
|
@ -0,0 +1,504 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
* PURPOSE: Support for logical devices
|
||||
* FILE: subsystems/win32/win32k/eng/ldevobj.c
|
||||
* PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org)
|
||||
*/
|
||||
|
||||
#include <win32k.h>
|
||||
|
||||
#include <intrin.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
#ifndef RVA_TO_ADDR
|
||||
#define RVA_TO_ADDR(Base,Rva) ((PVOID)(((ULONG_PTR)(Base)) + (Rva)))
|
||||
#endif
|
||||
|
||||
/** Globals *******************************************************************/
|
||||
|
||||
HSEMAPHORE ghsemLDEVList;
|
||||
LDEVOBJ *gpldevHead = NULL;
|
||||
LDEVOBJ *gpldevWin32k = NULL;
|
||||
|
||||
|
||||
/** Private functions *********************************************************/
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
InitLDEVImpl()
|
||||
{
|
||||
/* Initialize the loader lock */
|
||||
ghsemLDEVList = EngCreateSemaphore();
|
||||
if (!ghsemLDEVList)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Allocate a LDEVOBJ for win32k */
|
||||
gpldevWin32k = ExAllocatePoolWithTag(PagedPool,
|
||||
sizeof(LDEVOBJ) +
|
||||
sizeof(SYSTEM_GDI_DRIVER_INFORMATION),
|
||||
GDITAG_LDEV);
|
||||
if (!gpldevWin32k)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Initialize the LDEVOBJ for win32k */
|
||||
gpldevWin32k->pldevNext = NULL;
|
||||
gpldevWin32k->pldevPrev = NULL;
|
||||
gpldevWin32k->ldevtype = LDEV_DEVICE_DISPLAY;
|
||||
gpldevWin32k->cRefs = 1;
|
||||
gpldevWin32k->ulDriverVersion = GDI_ENGINE_VERSION;
|
||||
gpldevWin32k->pGdiDriverInfo = (PVOID)(gpldevWin32k + 1);
|
||||
RtlInitUnicodeString(&gpldevWin32k->pGdiDriverInfo->DriverName,
|
||||
L"\\SystemRoot\\System32\\win32k.sys");
|
||||
gpldevWin32k->pGdiDriverInfo->ImageAddress = &__ImageBase;
|
||||
gpldevWin32k->pGdiDriverInfo->SectionPointer = NULL;
|
||||
gpldevWin32k->pGdiDriverInfo->EntryPoint = (PVOID)DriverEntry;
|
||||
gpldevWin32k->pGdiDriverInfo->ExportSectionPointer = NULL;
|
||||
gpldevWin32k->pGdiDriverInfo->ImageLength = 0; // FIXME;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
PLDEVOBJ
|
||||
NTAPI
|
||||
LDEVOBJ_AllocLDEV(LDEVTYPE ldevtype)
|
||||
{
|
||||
PLDEVOBJ pldev;
|
||||
|
||||
/* Allocate the structure from paged pool */
|
||||
pldev = ExAllocatePoolWithTag(PagedPool, sizeof(LDEVOBJ), GDITAG_LDEV);
|
||||
if (!pldev)
|
||||
{
|
||||
DPRINT1("Failed to allocate LDEVOBJ.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Zero out the structure */
|
||||
RtlZeroMemory(pldev, sizeof(LDEVOBJ));
|
||||
|
||||
/* Set the ldevtype */
|
||||
pldev->ldevtype = ldevtype;
|
||||
|
||||
return pldev;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
LDEVOBJ_vFreeLDEV(PLDEVOBJ pldev)
|
||||
{
|
||||
/* Make sure we don't have a driver loaded */
|
||||
ASSERT(pldev && pldev->pGdiDriverInfo == NULL);
|
||||
|
||||
/* Free the memory */
|
||||
ExFreePoolWithTag(pldev, TAG_LDEV);
|
||||
}
|
||||
|
||||
PDEVMODEINFO
|
||||
NTAPI
|
||||
LDEVOBJ_pdmiGetModes(
|
||||
PLDEVOBJ pldev,
|
||||
HANDLE hDriver)
|
||||
{
|
||||
ULONG cbSize, cbFull;
|
||||
PDEVMODEINFO pdminfo;
|
||||
|
||||
DPRINT("LDEVOBJ_pdmiGetModes(%p, %p)\n", pldev, hDriver);
|
||||
|
||||
/* Call the driver to get the required size */
|
||||
cbSize = pldev->pfn.GetModes(hDriver, 0, NULL);
|
||||
if (!cbSize)
|
||||
{
|
||||
DPRINT1("DrvGetModes returned 0\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Add space for the header */
|
||||
cbFull = cbSize + FIELD_OFFSET(DEVMODEINFO, adevmode);
|
||||
|
||||
/* Allocate a buffer for the DEVMODE array */
|
||||
pdminfo = ExAllocatePoolWithTag(PagedPool, cbFull, GDITAG_DEVMODE);
|
||||
if (!pdminfo)
|
||||
{
|
||||
DPRINT1("Could not allocate devmodeinfo\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pdminfo->pldev = pldev;
|
||||
pdminfo->cbdevmode = cbSize;
|
||||
|
||||
/* Call the driver again to fill the buffer */
|
||||
cbSize = pldev->pfn.GetModes(hDriver, cbSize, pdminfo->adevmode);
|
||||
if (!cbSize)
|
||||
{
|
||||
/* Could not get modes */
|
||||
DPRINT1("returned size %ld(%ld)\n", cbSize, pdminfo->cbdevmode);
|
||||
ExFreePool(pdminfo);
|
||||
pdminfo = NULL;
|
||||
}
|
||||
|
||||
return pdminfo;
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
LDEVOBJ_bLoadImage(
|
||||
IN PLDEVOBJ pldev,
|
||||
PUNICODE_STRING pstrPathName)
|
||||
{
|
||||
PSYSTEM_GDI_DRIVER_INFORMATION pDriverInfo;
|
||||
NTSTATUS Status;
|
||||
ULONG cbSize;
|
||||
|
||||
/* Make sure no image is loaded yet */
|
||||
ASSERT(pldev && pldev->pGdiDriverInfo == NULL);
|
||||
|
||||
/* Allocate a SYSTEM_GDI_DRIVER_INFORMATION structure */
|
||||
cbSize = sizeof(SYSTEM_GDI_DRIVER_INFORMATION) + pstrPathName->Length;
|
||||
pDriverInfo = ExAllocatePoolWithTag(PagedPool, cbSize, GDITAG_LDEV);
|
||||
if (!pDriverInfo)
|
||||
{
|
||||
DPRINT1("Failed to allocate SYSTEM_GDI_DRIVER_INFORMATION\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Initialize the UNICODE_STRING and copy the driver name */
|
||||
RtlInitEmptyUnicodeString(&pDriverInfo->DriverName,
|
||||
(PWSTR)(pDriverInfo + 1),
|
||||
pstrPathName->Length);
|
||||
RtlCopyUnicodeString(&pDriverInfo->DriverName, pstrPathName);
|
||||
|
||||
/* Try to load the driver */
|
||||
Status = ZwSetSystemInformation(SystemLoadGdiDriverInformation,
|
||||
pDriverInfo,
|
||||
sizeof(SYSTEM_GDI_DRIVER_INFORMATION));
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Failed to load a GDI driver: '%S', Status = 0x%lx\n",
|
||||
pstrPathName->Buffer, Status);
|
||||
|
||||
/* Free the allocated memory */
|
||||
ExFreePoolWithTag(pDriverInfo, TAG_LDEV);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Set the driver info */
|
||||
pldev->pGdiDriverInfo = pDriverInfo;
|
||||
|
||||
/* Return success. */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
LDEVOBJ_vUnloadImage(
|
||||
IN PLDEVOBJ pldev)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Make sure we have a driver info */
|
||||
ASSERT(pldev && pldev->pGdiDriverInfo != NULL);
|
||||
|
||||
/* Check if we have loaded a driver */
|
||||
if (pldev->pfn.DisableDriver)
|
||||
{
|
||||
/* Call the unload function */
|
||||
pldev->pfn.DisableDriver();
|
||||
}
|
||||
|
||||
/* Unload the driver */
|
||||
Status = ZwSetSystemInformation(SystemUnloadGdiDriverInformation,
|
||||
&pldev->pGdiDriverInfo->ImageAddress,
|
||||
sizeof(HANDLE));
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Failed to unload the driver, this is bad.\n");
|
||||
}
|
||||
|
||||
/* Free the driver info structure */
|
||||
ExFreePoolWithTag(pldev->pGdiDriverInfo, GDITAG_LDEV);
|
||||
pldev->pGdiDriverInfo = NULL;
|
||||
}
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
LDEVOBJ_bLoadDriver(
|
||||
IN PLDEVOBJ pldev)
|
||||
{
|
||||
PFN_DrvEnableDriver pfnEnableDriver;
|
||||
DRVENABLEDATA ded;
|
||||
ULONG i;
|
||||
|
||||
/* Make sure we have a driver info */
|
||||
ASSERT(pldev && pldev->pGdiDriverInfo != NULL);
|
||||
|
||||
/* Call the drivers DrvEnableDriver function */
|
||||
RtlZeroMemory(&ded, sizeof(ded));
|
||||
pfnEnableDriver = pldev->pGdiDriverInfo->EntryPoint;
|
||||
if (!pfnEnableDriver(GDI_ENGINE_VERSION, sizeof(ded), &ded))
|
||||
{
|
||||
DPRINT1("DrvEnableDriver failed\n");
|
||||
|
||||
/* Unload the image. */
|
||||
LDEVOBJ_vUnloadImage(pldev);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Copy the returned driver version */
|
||||
pldev->ulDriverVersion = ded.iDriverVersion;
|
||||
|
||||
/* Fill the driver function array */
|
||||
for (i = 0; i < ded.c; i++)
|
||||
{
|
||||
pldev->apfn[ded.pdrvfn[i].iFunc] = ded.pdrvfn[i].pfn;
|
||||
}
|
||||
|
||||
/* Return success. */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
PVOID
|
||||
NTAPI
|
||||
LDEVOBJ_pvFindImageProcAddress(
|
||||
IN PLDEVOBJ pldev,
|
||||
IN LPSTR pszProcName)
|
||||
{
|
||||
PVOID pvImageBase;
|
||||
PIMAGE_EXPORT_DIRECTORY pExportDir;
|
||||
PVOID pvProcAdress = NULL;
|
||||
PUSHORT pOrdinals;
|
||||
PULONG pNames, pAddresses;
|
||||
ULONG i, cbSize;
|
||||
|
||||
/* Make sure we have a driver info */
|
||||
ASSERT(pldev && pldev->pGdiDriverInfo != NULL);
|
||||
|
||||
/* Get the pointer to the export directory */
|
||||
pvImageBase = pldev->pGdiDriverInfo->ImageAddress;
|
||||
pExportDir = RtlImageDirectoryEntryToData(pvImageBase,
|
||||
TRUE,
|
||||
IMAGE_DIRECTORY_ENTRY_EXPORT,
|
||||
&cbSize);
|
||||
if (!pExportDir)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Get pointers to some tables */
|
||||
pNames = RVA_TO_ADDR(pvImageBase, pExportDir->AddressOfNames);
|
||||
pOrdinals = RVA_TO_ADDR(pvImageBase, pExportDir->AddressOfNameOrdinals);
|
||||
pAddresses = RVA_TO_ADDR(pvImageBase, pExportDir->AddressOfFunctions);
|
||||
|
||||
/* Loop the export table */
|
||||
for (i = 0; i < pExportDir->NumberOfNames; i++)
|
||||
{
|
||||
/* Compare the name */
|
||||
if (_stricmp(pszProcName, RVA_TO_ADDR(pvImageBase, pNames[i])) == 0)
|
||||
{
|
||||
/* Found! Calculate the procedure address */
|
||||
pvProcAdress = RVA_TO_ADDR(pvImageBase, pAddresses[pOrdinals[i]]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Return the address */
|
||||
return pvProcAdress;
|
||||
}
|
||||
|
||||
PLDEVOBJ
|
||||
NTAPI
|
||||
EngLoadImageEx(
|
||||
LPWSTR pwszDriverName,
|
||||
ULONG ldevtype)
|
||||
{
|
||||
WCHAR acwBuffer[MAX_PATH];
|
||||
PLDEVOBJ pldev;
|
||||
UNICODE_STRING strDriverName;
|
||||
ULONG cwcLength;
|
||||
LPWSTR pwsz;
|
||||
|
||||
DPRINT("EngLoadImageEx(%ls, %ld)\n", pwszDriverName, ldevtype);
|
||||
ASSERT(pwszDriverName);
|
||||
|
||||
/* Initialize buffer for the the driver name */
|
||||
RtlInitEmptyUnicodeString(&strDriverName, acwBuffer, sizeof(acwBuffer));
|
||||
|
||||
/* Start path with systemroot */
|
||||
RtlAppendUnicodeToString(&strDriverName, L"\\SystemRoot\\System32\\");
|
||||
|
||||
/* Get Length of given string */
|
||||
cwcLength = wcslen(pwszDriverName);
|
||||
|
||||
/* Check if we have a system32 path given */
|
||||
pwsz = pwszDriverName + cwcLength;
|
||||
while (pwsz > pwszDriverName)
|
||||
{
|
||||
if (_wcsnicmp(pwsz, L"\\system32\\", 10) == 0)
|
||||
{
|
||||
/* Driver name starts after system32 */
|
||||
pwsz += 10;
|
||||
break;
|
||||
}
|
||||
pwsz--;
|
||||
}
|
||||
|
||||
/* Append the driver name */
|
||||
RtlAppendUnicodeToString(&strDriverName, pwsz);
|
||||
|
||||
/* MSDN says "The driver must include this suffix in the pwszDriver string."
|
||||
But in fact it's optional. */
|
||||
if (_wcsnicmp(pwszDriverName + cwcLength - 4, L".dll", 4) != 0)
|
||||
{
|
||||
/* Append the .dll suffix */
|
||||
RtlAppendUnicodeToString(&strDriverName, L".dll");
|
||||
}
|
||||
|
||||
/* Lock loader */
|
||||
EngAcquireSemaphore(ghsemLDEVList);
|
||||
|
||||
/* Search the List of LDEVS for the driver name */
|
||||
for (pldev = gpldevHead; pldev != NULL; pldev = pldev->pldevNext)
|
||||
{
|
||||
/* Check if the ldev is associated with a file */
|
||||
if (pldev->pGdiDriverInfo)
|
||||
{
|
||||
/* Check for match (case insensative) */
|
||||
if (RtlEqualUnicodeString(&pldev->pGdiDriverInfo->DriverName, &strDriverName, 1))
|
||||
{
|
||||
/* Image found in LDEV list */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Did we find one? */
|
||||
if (!pldev)
|
||||
{
|
||||
/* No, allocate a new LDEVOBJ */
|
||||
pldev = LDEVOBJ_AllocLDEV(ldevtype);
|
||||
if (!pldev)
|
||||
{
|
||||
DPRINT1("Could not allocate LDEV\n");
|
||||
goto leave;
|
||||
}
|
||||
|
||||
/* Load the image */
|
||||
if (!LDEVOBJ_bLoadImage(pldev, &strDriverName))
|
||||
{
|
||||
LDEVOBJ_vFreeLDEV(pldev);
|
||||
pldev = NULL;
|
||||
DPRINT1("LDEVOBJ_bLoadImage failed\n");
|
||||
goto leave;
|
||||
}
|
||||
|
||||
/* Shall we load a driver? */
|
||||
if (ldevtype != LDEV_IMAGE)
|
||||
{
|
||||
/* Load the driver */
|
||||
if (!LDEVOBJ_bLoadDriver(pldev))
|
||||
{
|
||||
DPRINT1("LDEVOBJ_bLoadDriver failed\n");
|
||||
LDEVOBJ_vFreeLDEV(pldev);
|
||||
pldev = NULL;
|
||||
goto leave;
|
||||
}
|
||||
}
|
||||
|
||||
/* Insert the LDEV into the global list */
|
||||
pldev->pldevPrev = NULL;
|
||||
pldev->pldevNext = gpldevHead;
|
||||
gpldevHead = pldev;
|
||||
}
|
||||
|
||||
/* Increase ref count */
|
||||
pldev->cRefs++;
|
||||
|
||||
leave:
|
||||
/* Unlock loader */
|
||||
EngReleaseSemaphore(ghsemLDEVList);
|
||||
|
||||
DPRINT("EngLoadImageEx returning %p\n", pldev);
|
||||
|
||||
return pldev;
|
||||
}
|
||||
|
||||
|
||||
/** Exported functions ********************************************************/
|
||||
|
||||
HANDLE
|
||||
APIENTRY
|
||||
EngLoadImage(
|
||||
LPWSTR pwszDriverName)
|
||||
{
|
||||
return (HANDLE)EngLoadImageEx(pwszDriverName, LDEV_IMAGE);
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
APIENTRY
|
||||
EngUnloadImage(
|
||||
IN HANDLE hModule)
|
||||
{
|
||||
PLDEVOBJ pldev = (PLDEVOBJ)hModule;
|
||||
|
||||
/* Make sure the LDEV is in the list */
|
||||
ASSERT(pldev->pldevPrev || pldev->pldevNext);
|
||||
|
||||
/* Lock loader */
|
||||
EngAcquireSemaphore(ghsemLDEVList);
|
||||
|
||||
/* Decrement reference count */
|
||||
pldev->cRefs--;
|
||||
|
||||
/* No more references left? */
|
||||
if (pldev->cRefs == 0)
|
||||
{
|
||||
/* Remove ldev from the list */
|
||||
if (pldev->pldevPrev)
|
||||
pldev->pldevPrev->pldevNext = pldev->pldevNext;
|
||||
if (pldev->pldevNext)
|
||||
pldev->pldevNext->pldevPrev = pldev->pldevPrev;
|
||||
|
||||
/* Unload the image */
|
||||
LDEVOBJ_vUnloadImage(pldev);
|
||||
}
|
||||
|
||||
/* Unlock loader */
|
||||
EngReleaseSemaphore(ghsemLDEVList);
|
||||
}
|
||||
|
||||
|
||||
PVOID
|
||||
APIENTRY
|
||||
EngFindImageProcAddress(
|
||||
IN HANDLE hModule,
|
||||
IN LPSTR lpProcName)
|
||||
{
|
||||
PLDEVOBJ pldev = (PLDEVOBJ)hModule;
|
||||
|
||||
ASSERT(gpldevWin32k != NULL);
|
||||
|
||||
/* Check if win32k is requested */
|
||||
if (!pldev)
|
||||
{
|
||||
pldev = gpldevWin32k;
|
||||
}
|
||||
|
||||
/* Check if the drivers entry point is requested */
|
||||
if (_strnicmp(lpProcName, "DrvEnableDriver", 15) == 0)
|
||||
{
|
||||
return pldev->pGdiDriverInfo->EntryPoint;
|
||||
}
|
||||
|
||||
/* Try to find the address */
|
||||
return LDEVOBJ_pvFindImageProcAddress(pldev, lpProcName);
|
||||
}
|
||||
|
|
@ -565,10 +565,7 @@ IntEngLineTo(SURFOBJ *psoDest,
|
|||
if (b.left == b.right) b.right++;
|
||||
if (b.top == b.bottom) b.bottom++;
|
||||
|
||||
SURFACE_LockBitmapBits(psurfDest);
|
||||
MouseSafetyOnDrawStart(psoDest, x1, y1, x2, y2);
|
||||
|
||||
if (psurfDest->flHooks & HOOK_LINETO)
|
||||
if (psurfDest->flags & HOOK_LINETO)
|
||||
{
|
||||
/* Call the driver's DrvLineTo */
|
||||
ret = GDIDEVFUNCS(psoDest).LineTo(
|
||||
|
@ -576,7 +573,7 @@ IntEngLineTo(SURFOBJ *psoDest,
|
|||
}
|
||||
|
||||
#if 0
|
||||
if (! ret && (psurfDest->flHooks & HOOK_STROKEPATH))
|
||||
if (! ret && (psurfDest->flags & HOOK_STROKEPATH))
|
||||
{
|
||||
/* FIXME: Emulate LineTo using drivers DrvStrokePath and set ret on success */
|
||||
}
|
||||
|
@ -587,9 +584,6 @@ IntEngLineTo(SURFOBJ *psoDest,
|
|||
ret = EngLineTo(psoDest, ClipObj, pbo, x1, y1, x2, y2, RectBounds, Mix);
|
||||
}
|
||||
|
||||
MouseSafetyOnDrawEnd(psoDest);
|
||||
SURFACE_UnlockBitmapBits(psurfDest);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* PROJECT: ReactOS kernel
|
||||
* PURPOSE: Functions for mapping files and sections
|
||||
* FILE: subsys/win32k/eng/device.c
|
||||
* PROGRAMER:
|
||||
* PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org)
|
||||
*/
|
||||
|
||||
#include <win32k.h>
|
||||
|
@ -11,12 +11,348 @@
|
|||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
// HACK!!!
|
||||
#define MmMapViewInSessionSpace MmMapViewInSystemSpace
|
||||
#define MmUnmapViewInSessionSpace MmUnmapViewInSystemSpace
|
||||
|
||||
typedef struct _ENGSECTION
|
||||
{
|
||||
PVOID pvSectionObject;
|
||||
PVOID pvMappedBase;
|
||||
SIZE_T cjViewSize;
|
||||
ULONG ulTag;
|
||||
} ENGSECTION, *PENGSECTION;
|
||||
|
||||
typedef struct _FILEVIEW
|
||||
{
|
||||
LARGE_INTEGER LastWriteTime;
|
||||
PVOID pvKView;
|
||||
PVOID pvViewFD;
|
||||
SIZE_T cjView;
|
||||
PVOID pSection;
|
||||
} FILEVIEW, *PFILEVIEW;
|
||||
|
||||
typedef struct _FONTFILEVIEW
|
||||
{
|
||||
FILEVIEW;
|
||||
DWORD reserved[2];
|
||||
PWSTR pwszPath;
|
||||
SIZE_T ulRegionSize;
|
||||
ULONG cKRefCount;
|
||||
ULONG cRefCountFD;
|
||||
PVOID pvSpoolerBase;
|
||||
DWORD dwSpoolerPid;
|
||||
} FONTFILEVIEW, *PFONTFILEVIEW;
|
||||
|
||||
enum
|
||||
{
|
||||
FVF_SYSTEMROOT = 1,
|
||||
FVF_READONLY = 2,
|
||||
FVF_FONTFILE = 4,
|
||||
};
|
||||
|
||||
HANDLE ghSystem32Directory;
|
||||
HANDLE ghRootDirectory;
|
||||
|
||||
|
||||
PVOID
|
||||
NTAPI
|
||||
EngCreateSection(
|
||||
IN ULONG fl,
|
||||
IN SIZE_T cjSize,
|
||||
IN ULONG ulTag)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PENGSECTION pSection;
|
||||
PVOID pvSectionObject;
|
||||
LARGE_INTEGER liSize;
|
||||
|
||||
/* Allocate a section object */
|
||||
pSection = EngAllocMem(0, sizeof(ENGSECTION), 'stsU');
|
||||
if (!pSection) return NULL;
|
||||
|
||||
liSize.QuadPart = cjSize;
|
||||
Status = MmCreateSection(&pvSectionObject,
|
||||
SECTION_ALL_ACCESS,
|
||||
NULL,
|
||||
&liSize,
|
||||
PAGE_READWRITE,
|
||||
SEC_COMMIT,
|
||||
NULL,
|
||||
NULL);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Failed to create a section Status=0x%x\n", Status);
|
||||
EngFreeMem(pSection);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Set the fields of the section */
|
||||
pSection->ulTag = ulTag;
|
||||
pSection->pvSectionObject = pvSectionObject;
|
||||
pSection->pvMappedBase = NULL;
|
||||
pSection->cjViewSize = cjSize;
|
||||
|
||||
return pSection;
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
APIENTRY
|
||||
EngMapSection(
|
||||
IN PVOID pvSection,
|
||||
IN BOOL bMap,
|
||||
IN HANDLE hProcess,
|
||||
OUT PVOID* pvBaseAddress)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PENGSECTION pSection = pvSection;
|
||||
PEPROCESS pepProcess;
|
||||
|
||||
/* Get a pointer to the process */
|
||||
Status = ObReferenceObjectByHandle(hProcess,
|
||||
PROCESS_VM_OPERATION,
|
||||
NULL,
|
||||
KernelMode,
|
||||
(PVOID*)&pepProcess,
|
||||
NULL);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Could not access process %p, Status=0x%lx\n", hProcess, Status);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (bMap)
|
||||
{
|
||||
/* Make sure the section isn't already mapped */
|
||||
ASSERT(pSection->pvMappedBase == NULL);
|
||||
|
||||
/* Map the section into the process address space */
|
||||
Status = MmMapViewOfSection(pSection->pvSectionObject,
|
||||
pepProcess,
|
||||
&pSection->pvMappedBase,
|
||||
0,
|
||||
pSection->cjViewSize,
|
||||
NULL,
|
||||
&pSection->cjViewSize,
|
||||
0,
|
||||
0,
|
||||
PAGE_READWRITE);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Failed to map a section Status=0x%x\n", Status);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Make sure the section is mapped */
|
||||
ASSERT(pSection->pvMappedBase);
|
||||
|
||||
/* Unmap the section from the process address space */
|
||||
Status = MmUnmapViewOfSection(pepProcess, pSection->pvMappedBase);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
pSection->pvMappedBase = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT1("Failed to unmap a section @ &p Status=0x%x\n",
|
||||
pSection->pvMappedBase, Status);
|
||||
}
|
||||
}
|
||||
|
||||
/* Dereference the process */
|
||||
ObDereferenceObject(pepProcess);
|
||||
|
||||
/* Set the new mapping base and return bool status */
|
||||
*pvBaseAddress = pSection->pvMappedBase;
|
||||
return NT_SUCCESS(Status);
|
||||
}
|
||||
|
||||
BOOL
|
||||
APIENTRY
|
||||
EngFreeSectionMem(
|
||||
IN PVOID pvSection OPTIONAL,
|
||||
IN PVOID pvMappedBase OPTIONAL)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PENGSECTION pSection = pvSection;
|
||||
BOOL bResult = TRUE;
|
||||
|
||||
/* Did the caller give us a mapping base? */
|
||||
if (pvMappedBase)
|
||||
{
|
||||
Status = MmUnmapViewInSessionSpace(pvMappedBase);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("MmUnmapViewInSessionSpace failed: 0x%lx\n", Status);
|
||||
bResult = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if we should free the section as well */
|
||||
if (pSection)
|
||||
{
|
||||
/* Dereference the kernel section */
|
||||
ObDereferenceObject(pSection->pvSectionObject);
|
||||
|
||||
/* Finally free the section memory itself */
|
||||
EngFreeMem(pSection);
|
||||
}
|
||||
|
||||
return bResult;
|
||||
}
|
||||
|
||||
PVOID
|
||||
APIENTRY
|
||||
EngAllocSectionMem(
|
||||
OUT PVOID *ppvSection,
|
||||
IN ULONG fl,
|
||||
IN SIZE_T cjSize,
|
||||
IN ULONG ulTag)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PENGSECTION pSection;
|
||||
|
||||
/* Check parameter */
|
||||
if (cjSize == 0) return NULL;
|
||||
|
||||
/* Allocate a section object */
|
||||
pSection = EngCreateSection(fl, cjSize, ulTag);
|
||||
if (!pSection)
|
||||
{
|
||||
*ppvSection = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Map the section in session space */
|
||||
Status = MmMapViewInSessionSpace(pSection->pvSectionObject,
|
||||
&pSection->pvMappedBase,
|
||||
&pSection->cjViewSize);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Failed to map a section Status=0x%x\n", Status);
|
||||
*ppvSection = NULL;
|
||||
EngFreeSectionMem(pSection, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (fl & FL_ZERO_MEMORY)
|
||||
{
|
||||
RtlZeroMemory(pSection->pvMappedBase, cjSize);
|
||||
}
|
||||
|
||||
/* Set section pointer and return base address */
|
||||
*ppvSection = pSection;
|
||||
return pSection->pvMappedBase;
|
||||
}
|
||||
|
||||
|
||||
PFILEVIEW
|
||||
NTAPI
|
||||
EngLoadModuleEx(
|
||||
LPWSTR pwsz,
|
||||
ULONG cjSizeOfModule,
|
||||
FLONG fl)
|
||||
{
|
||||
PFILEVIEW pFileView = NULL;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
HANDLE hRootDir;
|
||||
UNICODE_STRING ustrFileName;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
FILE_BASIC_INFORMATION FileInformation;
|
||||
HANDLE hFile;
|
||||
NTSTATUS Status;
|
||||
LARGE_INTEGER liSize;
|
||||
|
||||
if (fl & FVF_FONTFILE)
|
||||
{
|
||||
pFileView = EngAllocMem(0, sizeof(FONTFILEVIEW), 'vffG');
|
||||
}
|
||||
else
|
||||
{
|
||||
pFileView = EngAllocMem(0, sizeof(FILEVIEW), 'liFg');
|
||||
}
|
||||
|
||||
/* Check for success */
|
||||
if (!pFileView) return NULL;
|
||||
|
||||
/* Check if the file is relative to system32 */
|
||||
if (fl & FVF_SYSTEMROOT)
|
||||
{
|
||||
hRootDir = ghSystem32Directory;
|
||||
}
|
||||
else
|
||||
{
|
||||
hRootDir = ghRootDirectory;
|
||||
}
|
||||
|
||||
/* Initialize unicode string and object attributes */
|
||||
RtlInitUnicodeString(&ustrFileName, pwsz);
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&ustrFileName,
|
||||
OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
|
||||
hRootDir,
|
||||
NULL);
|
||||
|
||||
/* Now open the file */
|
||||
Status = ZwCreateFile(&hFile,
|
||||
FILE_READ_DATA,
|
||||
&ObjectAttributes,
|
||||
&IoStatusBlock,
|
||||
NULL,
|
||||
FILE_ATTRIBUTE_NORMAL,
|
||||
0,
|
||||
FILE_OPEN,
|
||||
FILE_NON_DIRECTORY_FILE,
|
||||
NULL,
|
||||
0);
|
||||
|
||||
Status = ZwQueryInformationFile(hFile,
|
||||
&IoStatusBlock,
|
||||
&FileInformation,
|
||||
sizeof(FILE_BASIC_INFORMATION),
|
||||
FileBasicInformation);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
pFileView->LastWriteTime = FileInformation.LastWriteTime;
|
||||
}
|
||||
|
||||
/* Create a section from the file */
|
||||
liSize.QuadPart = cjSizeOfModule;
|
||||
Status = MmCreateSection(&pFileView->pSection,
|
||||
SECTION_ALL_ACCESS,
|
||||
NULL,
|
||||
cjSizeOfModule ? &liSize : NULL,
|
||||
fl & FVF_READONLY ? PAGE_EXECUTE_READ : PAGE_EXECUTE_READWRITE,
|
||||
SEC_COMMIT,
|
||||
hFile,
|
||||
NULL);
|
||||
|
||||
/* Close the file handle */
|
||||
ZwClose(hFile);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Failed to create a section Status=0x%x\n", Status);
|
||||
EngFreeMem(pFileView);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
pFileView->pvKView = NULL;
|
||||
pFileView->pvViewFD = NULL;
|
||||
pFileView->cjView = 0;
|
||||
|
||||
return pFileView;
|
||||
}
|
||||
|
||||
HANDLE
|
||||
APIENTRY
|
||||
EngLoadModule(LPWSTR pwsz)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return NULL;
|
||||
/* Forward to EngLoadModuleEx */
|
||||
return (HANDLE)EngLoadModuleEx(pwsz, 0, FVF_READONLY | FVF_SYSTEMROOT);
|
||||
}
|
||||
|
||||
HANDLE
|
||||
|
@ -25,9 +361,8 @@ EngLoadModuleForWrite(
|
|||
IN LPWSTR pwsz,
|
||||
IN ULONG cjSizeOfModule)
|
||||
{
|
||||
// www.osr.com/ddk/graphics/gdifncs_98rr.htm
|
||||
UNIMPLEMENTED;
|
||||
return NULL;
|
||||
/* Forward to EngLoadModuleEx */
|
||||
return (HANDLE)EngLoadModuleEx(pwsz, cjSizeOfModule, FVF_SYSTEMROOT);
|
||||
}
|
||||
|
||||
PVOID
|
||||
|
@ -36,17 +371,46 @@ EngMapModule(
|
|||
IN HANDLE h,
|
||||
OUT PULONG pulSize)
|
||||
{
|
||||
// www.osr.com/ddk/graphics/gdifncs_9b1j.htm
|
||||
UNIMPLEMENTED;
|
||||
return NULL;
|
||||
PFILEVIEW pFileView = (PFILEVIEW)h;
|
||||
NTSTATUS Status;
|
||||
|
||||
pFileView->cjView = 0;
|
||||
|
||||
/* Map the section in session space */
|
||||
Status = MmMapViewInSessionSpace(pFileView->pSection,
|
||||
&pFileView->pvKView,
|
||||
&pFileView->cjView);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Failed to map a section Status=0x%x\n", Status);
|
||||
*pulSize = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*pulSize = pFileView->cjView;
|
||||
return pFileView->pvKView;
|
||||
}
|
||||
|
||||
VOID
|
||||
APIENTRY
|
||||
EngFreeModule (IN HANDLE h)
|
||||
EngFreeModule(IN HANDLE h)
|
||||
{
|
||||
// www.osr.com/ddk/graphics/gdifncs_9fzb.htm
|
||||
UNIMPLEMENTED;
|
||||
PFILEVIEW pFileView = (PFILEVIEW)h;
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Unmap the section */
|
||||
Status = MmUnmapViewInSessionSpace(pFileView->pvKView);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("MmUnmapViewInSessionSpace failed: 0x%lx\n", Status);
|
||||
ASSERT(FALSE);
|
||||
}
|
||||
|
||||
/* Dereference the section */
|
||||
ObDereferenceObject(pFileView->pSection);
|
||||
|
||||
/* Free the file view memory */
|
||||
EngFreeMem(pFileView);
|
||||
}
|
||||
|
||||
PVOID
|
||||
|
@ -56,8 +420,28 @@ EngMapFile(
|
|||
IN ULONG cjSize,
|
||||
OUT ULONG_PTR *piFile)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return NULL;
|
||||
HANDLE hModule;
|
||||
PVOID pvBase;
|
||||
|
||||
/* Load the file */
|
||||
hModule = EngLoadModuleEx(pwsz, 0, 0);
|
||||
if (!hModule)
|
||||
{
|
||||
*piFile = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Map the file */
|
||||
pvBase = EngMapModule(hModule, &cjSize);
|
||||
if (!pvBase)
|
||||
{
|
||||
EngFreeModule(hModule);
|
||||
hModule = NULL;
|
||||
}
|
||||
|
||||
/* Set iFile and return mapped base */
|
||||
*piFile = (ULONG_PTR)hModule;
|
||||
return pvBase;
|
||||
}
|
||||
|
||||
BOOL
|
||||
|
@ -65,8 +449,11 @@ APIENTRY
|
|||
EngUnmapFile(
|
||||
IN ULONG_PTR iFile)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
HANDLE hModule = (HANDLE)iFile;
|
||||
|
||||
EngFreeModule(hModule);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -110,36 +497,3 @@ EngUnmapFontFile(
|
|||
// www.osr.com/ddk/graphics/gdifncs_09wn.htm
|
||||
EngUnmapFontFileFD(iFile);
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
APIENTRY
|
||||
EngMapSection(IN PVOID Section,
|
||||
IN BOOLEAN Map,
|
||||
IN HANDLE Process,
|
||||
IN PVOID* BaseAddress)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
PVOID
|
||||
APIENTRY
|
||||
EngAllocSectionMem(IN PVOID SectionObject,
|
||||
IN ULONG Flags,
|
||||
IN SIZE_T MemSize,
|
||||
IN ULONG Tag)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
APIENTRY
|
||||
EngFreeSectionMem(IN PVOID SectionObject OPTIONAL,
|
||||
IN PVOID MappedBase)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
@ -79,6 +79,7 @@ EngAllocUserMem(SIZE_T cj, ULONG Tag)
|
|||
}
|
||||
|
||||
/* TODO: Add allocation info to AVL tree (stored inside W32PROCESS structure) */
|
||||
//hSecure = EngSecureMem(NewMem, cj);
|
||||
|
||||
return NewMem;
|
||||
}
|
||||
|
@ -166,6 +167,7 @@ HackUnsecureVirtualMemory(
|
|||
HANDLE APIENTRY
|
||||
EngSecureMem(PVOID Address, ULONG Length)
|
||||
{
|
||||
return (HANDLE)-1; // HACK!!!
|
||||
return MmSecureVirtualMemory(Address, Length, PAGE_READWRITE);
|
||||
}
|
||||
|
||||
|
@ -175,6 +177,7 @@ EngSecureMem(PVOID Address, ULONG Length)
|
|||
VOID APIENTRY
|
||||
EngUnsecureMem(HANDLE Mem)
|
||||
{
|
||||
if (Mem == (HANDLE)-1) return; // HACK!!!
|
||||
MmUnsecureVirtualMemory((PVOID) Mem);
|
||||
}
|
||||
|
||||
|
|
|
@ -37,23 +37,17 @@ EngSetPointerTag(
|
|||
*/
|
||||
INT INTERNAL_CALL
|
||||
MouseSafetyOnDrawStart(
|
||||
SURFOBJ *pso,
|
||||
PPDEVOBJ ppdev,
|
||||
LONG HazardX1,
|
||||
LONG HazardY1,
|
||||
LONG HazardX2,
|
||||
LONG HazardY2)
|
||||
{
|
||||
LONG tmp;
|
||||
PDEVOBJ *ppdev;
|
||||
GDIPOINTER *pgp;
|
||||
|
||||
ASSERT(pso != NULL);
|
||||
|
||||
ppdev = GDIDEV(pso);
|
||||
if (ppdev == NULL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
ASSERT(ppdev != NULL);
|
||||
ASSERT(ppdev->pSurface != NULL);
|
||||
|
||||
pgp = &ppdev->Pointer;
|
||||
|
||||
|
@ -83,12 +77,12 @@ MouseSafetyOnDrawStart(
|
|||
}
|
||||
|
||||
if (pgp->Exclude.right >= HazardX1
|
||||
&& pgp->Exclude.left <= HazardX2
|
||||
&& pgp->Exclude.bottom >= HazardY1
|
||||
&& pgp->Exclude.top <= HazardY2)
|
||||
&& pgp->Exclude.left <= HazardX2
|
||||
&& pgp->Exclude.bottom >= HazardY1
|
||||
&& pgp->Exclude.top <= HazardY2)
|
||||
{
|
||||
ppdev->SafetyRemoveLevel = ppdev->SafetyRemoveCount;
|
||||
ppdev->pfnMovePointer(pso, -1, -1, NULL);
|
||||
ppdev->pfnMovePointer(&ppdev->pSurface->SurfObj, -1, -1, NULL);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
|
@ -99,19 +93,12 @@ MouseSafetyOnDrawStart(
|
|||
*/
|
||||
INT INTERNAL_CALL
|
||||
MouseSafetyOnDrawEnd(
|
||||
SURFOBJ *pso)
|
||||
PPDEVOBJ ppdev)
|
||||
{
|
||||
PDEVOBJ *ppdev;
|
||||
GDIPOINTER *pgp;
|
||||
|
||||
ASSERT(pso != NULL);
|
||||
|
||||
ppdev = (PDEVOBJ*)pso->hdev;
|
||||
|
||||
if (ppdev == NULL)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
ASSERT(ppdev != NULL);
|
||||
ASSERT(ppdev->pSurface != NULL);
|
||||
|
||||
pgp = &ppdev->Pointer;
|
||||
|
||||
|
@ -125,7 +112,10 @@ MouseSafetyOnDrawEnd(
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
ppdev->pfnMovePointer(pso, gpsi->ptCursor.x, gpsi->ptCursor.y, &pgp->Exclude);
|
||||
ppdev->pfnMovePointer(&ppdev->pSurface->SurfObj,
|
||||
gpsi->ptCursor.x,
|
||||
gpsi->ptCursor.y,
|
||||
&pgp->Exclude);
|
||||
|
||||
ppdev->SafetyRemoveLevel = 0;
|
||||
|
||||
|
@ -175,18 +165,17 @@ IntHideMousePointer(
|
|||
ptlSave.x = rclDest.left - pt.x;
|
||||
ptlSave.y = rclDest.top - pt.y;
|
||||
|
||||
IntEngBitBltEx(psoDest,
|
||||
&pgp->psurfSave->SurfObj,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&rclDest,
|
||||
&ptlSave,
|
||||
&ptlSave,
|
||||
NULL,
|
||||
NULL,
|
||||
ROP3_TO_ROP4(SRCCOPY),
|
||||
FALSE);
|
||||
IntEngBitBlt(psoDest,
|
||||
&pgp->psurfSave->SurfObj,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&rclDest,
|
||||
&ptlSave,
|
||||
&ptlSave,
|
||||
NULL,
|
||||
NULL,
|
||||
ROP3_TO_ROP4(SRCCOPY));
|
||||
}
|
||||
|
||||
VOID
|
||||
|
@ -229,77 +218,72 @@ IntShowMousePointer(PDEVOBJ *ppdev, SURFOBJ *psoDest)
|
|||
rclPointer.bottom = min(pgp->Size.cy, psoDest->sizlBitmap.cy - pt.y);
|
||||
|
||||
/* Copy the pixels under the cursor to temporary surface. */
|
||||
IntEngBitBltEx(&pgp->psurfSave->SurfObj,
|
||||
psoDest,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&rclPointer,
|
||||
(POINTL*)&rclSurf,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
ROP3_TO_ROP4(SRCCOPY),
|
||||
FALSE);
|
||||
IntEngBitBlt(&pgp->psurfSave->SurfObj,
|
||||
psoDest,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&rclPointer,
|
||||
(POINTL*)&rclSurf,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
ROP3_TO_ROP4(SRCCOPY));
|
||||
|
||||
/* Blt the pointer on the screen. */
|
||||
if (pgp->psurfColor)
|
||||
{
|
||||
IntEngBitBltEx(psoDest,
|
||||
&pgp->psurfMask->SurfObj,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&rclSurf,
|
||||
(POINTL*)&rclPointer,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
ROP3_TO_ROP4(SRCAND),
|
||||
FALSE);
|
||||
IntEngBitBlt(psoDest,
|
||||
&pgp->psurfMask->SurfObj,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&rclSurf,
|
||||
(POINTL*)&rclPointer,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
ROP3_TO_ROP4(SRCAND));
|
||||
|
||||
IntEngBitBltEx(psoDest,
|
||||
&pgp->psurfColor->SurfObj,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&rclSurf,
|
||||
(POINTL*)&rclPointer,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
ROP3_TO_ROP4(SRCINVERT),
|
||||
FALSE);
|
||||
IntEngBitBlt(psoDest,
|
||||
&pgp->psurfColor->SurfObj,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&rclSurf,
|
||||
(POINTL*)&rclPointer,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
ROP3_TO_ROP4(SRCINVERT));
|
||||
}
|
||||
else
|
||||
{
|
||||
IntEngBitBltEx(psoDest,
|
||||
&pgp->psurfMask->SurfObj,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&rclSurf,
|
||||
(POINTL*)&rclPointer,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
ROP3_TO_ROP4(SRCAND),
|
||||
FALSE);
|
||||
IntEngBitBlt(psoDest,
|
||||
&pgp->psurfMask->SurfObj,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&rclSurf,
|
||||
(POINTL*)&rclPointer,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
ROP3_TO_ROP4(SRCAND));
|
||||
|
||||
rclPointer.top += pgp->Size.cy;
|
||||
|
||||
IntEngBitBltEx(psoDest,
|
||||
&pgp->psurfMask->SurfObj,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&rclSurf,
|
||||
(POINTL*)&rclPointer,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
ROP3_TO_ROP4(SRCINVERT),
|
||||
FALSE);
|
||||
IntEngBitBlt(psoDest,
|
||||
&pgp->psurfMask->SurfObj,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&rclSurf,
|
||||
(POINTL*)&rclPointer,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
ROP3_TO_ROP4(SRCINVERT));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -353,7 +337,7 @@ EngSetPointerShape(
|
|||
rectl.bottom = sizel.cy;
|
||||
|
||||
/* Calculate lDelta for our surfaces. */
|
||||
lDelta = DIB_GetDIBWidthBytes(sizel.cx,
|
||||
lDelta = WIDTH_BYTES_ALIGN32(sizel.cx,
|
||||
BitsPerFormat(pso->iBitmapFormat));
|
||||
|
||||
/* Create a bitmap for saving the pixels under the cursor. */
|
||||
|
@ -373,10 +357,10 @@ EngSetPointerShape(
|
|||
|
||||
/* Create a bitmap to copy the color bitmap to */
|
||||
hbmColor = EngCreateBitmap(psoColor->sizlBitmap,
|
||||
lDelta,
|
||||
pso->iBitmapFormat,
|
||||
BMF_TOPDOWN | BMF_NOZEROINIT,
|
||||
NULL);
|
||||
lDelta,
|
||||
pso->iBitmapFormat,
|
||||
BMF_TOPDOWN | BMF_NOZEROINIT,
|
||||
NULL);
|
||||
psurfColor = SURFACE_ShareLockSurface(hbmColor);
|
||||
if (!psurfColor) goto failure;
|
||||
|
||||
|
@ -540,28 +524,13 @@ EngMovePointer(
|
|||
prcl->right = prcl->left + pgp->Size.cx;
|
||||
prcl->bottom = prcl->top + pgp->Size.cy;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (prcl != NULL)
|
||||
{
|
||||
prcl->left = prcl->top = prcl->right = prcl->bottom = -1;
|
||||
}
|
||||
}
|
||||
|
||||
VOID APIENTRY
|
||||
IntEngMovePointer(
|
||||
IN SURFOBJ *pso,
|
||||
IN LONG x,
|
||||
IN LONG y,
|
||||
IN RECTL *prcl)
|
||||
{
|
||||
SURFACE *psurf = CONTAINING_RECORD(pso, SURFACE, SurfObj);
|
||||
PPDEVOBJ ppdev = (PPDEVOBJ)pso->hdev;
|
||||
|
||||
SURFACE_LockBitmapBits(psurf);
|
||||
ppdev->pfnMovePointer(pso, x, y, prcl);
|
||||
SURFACE_UnlockBitmapBits(psurf);
|
||||
}
|
||||
|
||||
ULONG APIENTRY
|
||||
IntEngSetPointerShape(
|
||||
IN SURFOBJ *pso,
|
||||
|
@ -576,13 +545,11 @@ IntEngSetPointerShape(
|
|||
IN FLONG fl)
|
||||
{
|
||||
ULONG ulResult = SPS_DECLINE;
|
||||
SURFACE *psurf = CONTAINING_RECORD(pso, SURFACE, SurfObj);
|
||||
PFN_DrvSetPointerShape pfnSetPointerShape;
|
||||
PPDEVOBJ ppdev = GDIDEV(pso);
|
||||
|
||||
pfnSetPointerShape = GDIDEVFUNCS(pso).SetPointerShape;
|
||||
|
||||
SURFACE_LockBitmapBits(psurf);
|
||||
if (pfnSetPointerShape)
|
||||
{
|
||||
ulResult = pfnSetPointerShape(pso,
|
||||
|
@ -620,8 +587,6 @@ IntEngSetPointerShape(
|
|||
ppdev->pfnMovePointer = EngMovePointer;
|
||||
}
|
||||
|
||||
SURFACE_UnlockBitmapBits(psurf);
|
||||
|
||||
return ulResult;
|
||||
}
|
||||
|
||||
|
@ -649,10 +614,14 @@ GreSetPointerShape(
|
|||
return 0;
|
||||
}
|
||||
|
||||
psurf = pdc->dclevel.pSurface;
|
||||
ASSERT(pdc->dctype == DCTYPE_DIRECT);
|
||||
EngAcquireSemaphore(pdc->ppdev->hsemDevLock);
|
||||
/* We're not sure DC surface is the good one */
|
||||
psurf = pdc->ppdev->pSurface;
|
||||
if (!psurf)
|
||||
{
|
||||
DPRINT1("DC has no surface.\n");
|
||||
EngReleaseSemaphore(pdc->ppdev->hsemDevLock);
|
||||
DC_UnlockDc(pdc);
|
||||
return 0;
|
||||
}
|
||||
|
@ -668,7 +637,7 @@ GreSetPointerShape(
|
|||
{
|
||||
/* We have one, lock it */
|
||||
psurfColor = SURFACE_ShareLockSurface(hbmColor);
|
||||
|
||||
|
||||
if (psurfColor)
|
||||
{
|
||||
/* Create an XLATEOBJ, no mono support */
|
||||
|
@ -700,6 +669,8 @@ GreSetPointerShape(
|
|||
if (psurfMask)
|
||||
SURFACE_ShareUnlockSurface(psurfMask);
|
||||
|
||||
EngReleaseSemaphore(pdc->ppdev->hsemDevLock);
|
||||
|
||||
/* Unlock the DC */
|
||||
DC_UnlockDc(pdc);
|
||||
|
||||
|
@ -724,12 +695,23 @@ GreMovePointer(
|
|||
DPRINT1("Failed to lock the DC.\n");
|
||||
return;
|
||||
}
|
||||
ASSERT(pdc->dctype == DCTYPE_DIRECT);
|
||||
|
||||
/* Store the cursor exclude position in the PDEV */
|
||||
prcl = &pdc->ppdev->Pointer.Exclude;
|
||||
/* Acquire PDEV lock */
|
||||
EngAcquireSemaphore(pdc->ppdev->hsemDevLock);
|
||||
|
||||
/* Call Eng/Drv function */
|
||||
IntEngMovePointer(&pdc->dclevel.pSurface->SurfObj, x, y, prcl);
|
||||
/* Check if we need to move it */
|
||||
if(pdc->ppdev->SafetyRemoveLevel == 0)
|
||||
{
|
||||
/* Store the cursor exclude position in the PDEV */
|
||||
prcl = &pdc->ppdev->Pointer.Exclude;
|
||||
|
||||
/* Call Eng/Drv function */
|
||||
pdc->ppdev->pfnMovePointer(&pdc->ppdev->pSurface->SurfObj, x, y, prcl);
|
||||
}
|
||||
|
||||
/* Release PDEV lock */
|
||||
EngReleaseSemaphore(pdc->ppdev->hsemDevLock);
|
||||
|
||||
/* Unlock the DC */
|
||||
DC_UnlockDc(pdc);
|
||||
|
|
|
@ -32,14 +32,13 @@
|
|||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
static BOOL APIENTRY FillSolidUnlocked(SURFOBJ *pso, PRECTL pRect, ULONG iColor)
|
||||
BOOL APIENTRY FillSolid(SURFOBJ *pso, PRECTL pRect, ULONG iColor)
|
||||
{
|
||||
LONG y;
|
||||
ULONG LineWidth;
|
||||
|
||||
ASSERT(pso);
|
||||
ASSERT(pRect);
|
||||
MouseSafetyOnDrawStart(pso, pRect->left, pRect->top, pRect->right, pRect->bottom);
|
||||
LineWidth = pRect->right - pRect->left;
|
||||
DPRINT(" LineWidth: %d, top: %d, bottom: %d\n", LineWidth, pRect->top, pRect->bottom);
|
||||
for (y = pRect->top; y < pRect->bottom; y++)
|
||||
|
@ -47,22 +46,9 @@ static BOOL APIENTRY FillSolidUnlocked(SURFOBJ *pso, PRECTL pRect, ULONG iColor)
|
|||
DibFunctionsForBitmapFormat[pso->iBitmapFormat].DIB_HLine(
|
||||
pso, pRect->left, pRect->right, y, iColor);
|
||||
}
|
||||
MouseSafetyOnDrawEnd(pso);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL APIENTRY FillSolid(SURFOBJ *pso, PRECTL pRect, ULONG iColor)
|
||||
{
|
||||
SURFACE *psurf;
|
||||
BOOL Result;
|
||||
psurf = CONTAINING_RECORD(pso, SURFACE, SurfObj);
|
||||
SURFACE_LockBitmapBits(psurf);
|
||||
Result = FillSolidUnlocked(pso, pRect, iColor);
|
||||
SURFACE_UnlockBitmapBits(psurf);
|
||||
return Result;
|
||||
}
|
||||
|
||||
BOOL APIENTRY
|
||||
EngPaintRgn(SURFOBJ *pso, CLIPOBJ *ClipRegion, ULONG iColor, MIX Mix,
|
||||
BRUSHOBJ *BrushObj, POINTL *BrushPoint)
|
||||
|
@ -85,7 +71,7 @@ EngPaintRgn(SURFOBJ *pso, CLIPOBJ *ClipRegion, ULONG iColor, MIX Mix,
|
|||
|
||||
if (ClipRegion->iDComplexity == DC_RECT)
|
||||
{
|
||||
FillSolidUnlocked(pso, &(ClipRegion->rclBounds), iColor);
|
||||
FillSolid(pso, &(ClipRegion->rclBounds), iColor);
|
||||
} else {
|
||||
|
||||
/* Enumerate all the rectangles and draw them */
|
||||
|
@ -94,7 +80,7 @@ EngPaintRgn(SURFOBJ *pso, CLIPOBJ *ClipRegion, ULONG iColor, MIX Mix,
|
|||
do {
|
||||
EnumMore = CLIPOBJ_bEnum(ClipRegion, sizeof(RectEnum), (PVOID) &RectEnum);
|
||||
for (i = 0; i < RectEnum.c; i++) {
|
||||
FillSolidUnlocked(pso, RectEnum.arcl + i, iColor);
|
||||
FillSolid(pso, RectEnum.arcl + i, iColor);
|
||||
}
|
||||
} while (EnumMore);
|
||||
}
|
||||
|
@ -136,18 +122,11 @@ IntEngPaint(IN SURFOBJ *pso,
|
|||
|
||||
DPRINT("pso->iType == %d\n", pso->iType);
|
||||
/* Is the surface's Paint function hooked? */
|
||||
if((pso->iType!=STYPE_BITMAP) && (psurf->flHooks & HOOK_PAINT))
|
||||
if((pso->iType!=STYPE_BITMAP) && (psurf->flags & HOOK_PAINT))
|
||||
{
|
||||
// Call the driver's DrvPaint
|
||||
SURFACE_LockBitmapBits(psurf);
|
||||
MouseSafetyOnDrawStart(pso, ClipRegion->rclBounds.left,
|
||||
ClipRegion->rclBounds.top, ClipRegion->rclBounds.right,
|
||||
ClipRegion->rclBounds.bottom);
|
||||
|
||||
ret = GDIDEVFUNCS(pso).Paint(
|
||||
pso, ClipRegion, Brush, BrushOrigin, Mix);
|
||||
MouseSafetyOnDrawEnd(pso);
|
||||
SURFACE_UnlockBitmapBits(psurf);
|
||||
return ret;
|
||||
}
|
||||
return EngPaint(pso, ClipRegion, Brush, BrushOrigin, Mix );
|
||||
|
|
844
subsystems/win32/win32k/eng/pdevobj.c
Normal file
844
subsystems/win32/win32k/eng/pdevobj.c
Normal file
|
@ -0,0 +1,844 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
* PURPOSE: Support for physical devices
|
||||
* FILE: subsystems/win32/win32k/eng/pdevobj.c
|
||||
* PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org)
|
||||
*/
|
||||
|
||||
#include <win32k.h>
|
||||
|
||||
#include <intrin.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
PPDEVOBJ gppdevPrimary = NULL;
|
||||
|
||||
static PPDEVOBJ gppdevList = NULL;
|
||||
static HSEMAPHORE ghsemPDEV;
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
InitPDEVImpl()
|
||||
{
|
||||
ghsemPDEV = EngCreateSemaphore();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
PPDEVOBJ
|
||||
PDEVOBJ_AllocPDEV()
|
||||
{
|
||||
PPDEVOBJ ppdev;
|
||||
|
||||
ppdev = ExAllocatePoolWithTag(PagedPool, sizeof(PDEVOBJ), GDITAG_PDEV);
|
||||
if (!ppdev)
|
||||
return NULL;
|
||||
|
||||
RtlZeroMemory(ppdev, sizeof(PDEVOBJ));
|
||||
|
||||
ppdev->cPdevRefs = 1;
|
||||
|
||||
return ppdev;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
PDEVOBJ_vRelease(PPDEVOBJ ppdev)
|
||||
{
|
||||
/* Lock loader */
|
||||
EngAcquireSemaphore(ghsemPDEV);
|
||||
|
||||
/* Decrease reference count */
|
||||
--ppdev->cPdevRefs;
|
||||
|
||||
ASSERT(ppdev->cPdevRefs >= 0) ;
|
||||
|
||||
/* Check if references are left */
|
||||
if (ppdev->cPdevRefs == 0)
|
||||
{
|
||||
/* Do we have a surface? */
|
||||
if(ppdev->pSurface)
|
||||
{
|
||||
/* Release the surface and let the driver free it */
|
||||
SURFACE_ShareUnlockSurface(ppdev->pSurface);
|
||||
ppdev->pfn.DisableSurface(ppdev->dhpdev);
|
||||
}
|
||||
|
||||
/* Do we have a palette? */
|
||||
if(ppdev->ppalSurf)
|
||||
{
|
||||
PALETTE_ShareUnlockPalette(ppdev->ppalSurf);
|
||||
}
|
||||
|
||||
/* Disable PDEV */
|
||||
ppdev->pfn.DisablePDEV(ppdev->dhpdev);
|
||||
|
||||
/* Remove it from list */
|
||||
if( ppdev == gppdevList )
|
||||
gppdevList = ppdev->ppdevNext ;
|
||||
else
|
||||
{
|
||||
PPDEVOBJ ppdevCurrent = gppdevList;
|
||||
BOOL found = FALSE ;
|
||||
while (!found && ppdevCurrent->ppdevNext)
|
||||
{
|
||||
if (ppdevCurrent->ppdevNext == ppdev)
|
||||
found = TRUE;
|
||||
else
|
||||
ppdevCurrent = ppdevCurrent->ppdevNext ;
|
||||
}
|
||||
if(found)
|
||||
ppdevCurrent->ppdevNext = ppdev->ppdevNext;
|
||||
}
|
||||
|
||||
/* Is this the primary one ? */
|
||||
if (ppdev == gppdevPrimary)
|
||||
gppdevPrimary = NULL;
|
||||
|
||||
/* Free it */
|
||||
ExFreePoolWithTag(ppdev, GDITAG_PDEV );
|
||||
}
|
||||
|
||||
/* Unlock loader */
|
||||
EngReleaseSemaphore(ghsemPDEV);
|
||||
|
||||
}
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
PDEVOBJ_bEnablePDEV(
|
||||
PPDEVOBJ ppdev,
|
||||
PDEVMODEW pdevmode,
|
||||
PWSTR pwszLogAddress)
|
||||
{
|
||||
PFN_DrvEnablePDEV pfnEnablePDEV;
|
||||
|
||||
DPRINT1("PDEVOBJ_bEnablePDEV()\n");
|
||||
|
||||
/* Get the DrvEnablePDEV function */
|
||||
pfnEnablePDEV = ppdev->pldev->pfn.EnablePDEV;
|
||||
|
||||
/* Call the drivers DrvEnablePDEV function */
|
||||
ppdev->dhpdev = pfnEnablePDEV(pdevmode,
|
||||
pwszLogAddress,
|
||||
HS_DDI_MAX,
|
||||
ppdev->ahsurf,
|
||||
sizeof(GDIINFO),
|
||||
&ppdev->gdiinfo,
|
||||
sizeof(DEVINFO),
|
||||
&ppdev->devinfo,
|
||||
(HDEV)ppdev,
|
||||
ppdev->pGraphicsDevice->pwszDescription,
|
||||
ppdev->pGraphicsDevice->DeviceObject);
|
||||
|
||||
/* Fix up some values */
|
||||
if (ppdev->gdiinfo.ulLogPixelsX == 0)
|
||||
ppdev->gdiinfo.ulLogPixelsX = 96;
|
||||
|
||||
if (ppdev->gdiinfo.ulLogPixelsY == 0)
|
||||
ppdev->gdiinfo.ulLogPixelsY = 96;
|
||||
|
||||
/* Setup Palette */
|
||||
GDIOBJ_SetOwnership(ppdev->devinfo.hpalDefault, NULL);
|
||||
ppdev->ppalSurf = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault);
|
||||
|
||||
DPRINT1("PDEVOBJ_bEnablePDEV - dhpdev = %p\n", ppdev->dhpdev);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
PDEVOBJ_vCompletePDEV(
|
||||
PPDEVOBJ ppdev)
|
||||
{
|
||||
/* Call the drivers DrvCompletePDEV function */
|
||||
ppdev->pldev->pfn.CompletePDEV(ppdev->dhpdev, (HDEV)ppdev);
|
||||
}
|
||||
|
||||
PSURFACE
|
||||
NTAPI
|
||||
PDEVOBJ_pSurface(
|
||||
PPDEVOBJ ppdev)
|
||||
{
|
||||
HSURF hsurf;
|
||||
|
||||
/* Check if we already have a surface */
|
||||
if (ppdev->pSurface)
|
||||
{
|
||||
/* Increment reference count */
|
||||
GDIOBJ_IncrementShareCount(&ppdev->pSurface->BaseObject);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Call the drivers DrvEnableSurface */
|
||||
hsurf = ppdev->pldev->pfn.EnableSurface(ppdev->dhpdev);
|
||||
|
||||
/* Lock the surface */
|
||||
ppdev->pSurface = SURFACE_ShareLockSurface(hsurf);
|
||||
}
|
||||
|
||||
DPRINT("PDEVOBJ_pSurface() returning %p\n", ppdev->pSurface);
|
||||
return ppdev->pSurface;
|
||||
}
|
||||
|
||||
PDEVMODEW
|
||||
NTAPI
|
||||
PDEVOBJ_pdmMatchDevMode(
|
||||
PPDEVOBJ ppdev,
|
||||
PDEVMODEW pdm)
|
||||
{
|
||||
PGRAPHICS_DEVICE pGraphicsDevice;
|
||||
PDEVMODEW pdmCurrent;
|
||||
INT i;
|
||||
DWORD dwFields;
|
||||
|
||||
pGraphicsDevice = ppdev->pGraphicsDevice;
|
||||
|
||||
for (i = 0; i < pGraphicsDevice->cDevModes; i++)
|
||||
{
|
||||
pdmCurrent = pGraphicsDevice->pDevModeList[i].pdm;
|
||||
|
||||
/* Compare asked DEVMODE fields
|
||||
* Only compare those that are valid in both DEVMODE structs */
|
||||
dwFields = pdmCurrent->dmFields & pdm->dmFields ;
|
||||
/* For now, we only need those */
|
||||
if ((dwFields & DM_BITSPERPEL) &&
|
||||
(pdmCurrent->dmBitsPerPel != pdm->dmBitsPerPel))
|
||||
continue;
|
||||
if ((dwFields & DM_PELSWIDTH) &&
|
||||
(pdmCurrent->dmPelsWidth != pdm->dmPelsWidth))
|
||||
continue;
|
||||
if ((dwFields & DM_PELSHEIGHT) &&
|
||||
(pdmCurrent->dmPelsHeight != pdm->dmPelsHeight))
|
||||
continue;
|
||||
if ((dwFields & DM_DISPLAYFREQUENCY) &&
|
||||
(pdmCurrent->dmDisplayFrequency != pdm->dmDisplayFrequency))
|
||||
continue;
|
||||
|
||||
/* Match! Return the DEVMODE */
|
||||
return pdmCurrent;
|
||||
}
|
||||
|
||||
/* Nothing found */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static
|
||||
PPDEVOBJ
|
||||
EngpCreatePDEV(
|
||||
PUNICODE_STRING pustrDeviceName,
|
||||
PDEVMODEW pdm)
|
||||
{
|
||||
PGRAPHICS_DEVICE pGraphicsDevice;
|
||||
PPDEVOBJ ppdev;
|
||||
|
||||
/* Try to find the GRAPHICS_DEVICE */
|
||||
if (pustrDeviceName)
|
||||
{
|
||||
pGraphicsDevice = EngpFindGraphicsDevice(pustrDeviceName, 0, 0);
|
||||
if (!pGraphicsDevice)
|
||||
{
|
||||
DPRINT1("No GRAPHICS_DEVICE found for %ls!\n",
|
||||
pustrDeviceName ? pustrDeviceName->Buffer : 0);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pGraphicsDevice = gpPrimaryGraphicsDevice;
|
||||
}
|
||||
|
||||
/* Allocate a new PDEVOBJ */
|
||||
ppdev = PDEVOBJ_AllocPDEV();
|
||||
if (!ppdev)
|
||||
{
|
||||
DPRINT1("failed to allocate a PDEV\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* If no DEVMODEW is given, ... */
|
||||
if (!pdm)
|
||||
{
|
||||
/* ... use the device's default one */
|
||||
pdm = pGraphicsDevice->pDevModeList[pGraphicsDevice->iDefaultMode].pdm;
|
||||
DPRINT1("Using iDefaultMode = %ld\n", pGraphicsDevice->iDefaultMode);
|
||||
}
|
||||
|
||||
/* Try to get a diplay driver */
|
||||
ppdev->pldev = EngLoadImageEx(pdm->dmDeviceName, LDEV_DEVICE_DISPLAY);
|
||||
if (!ppdev->pldev)
|
||||
{
|
||||
DPRINT1("Could not load display driver '%ls'\n",
|
||||
pGraphicsDevice->pDiplayDrivers);
|
||||
ExFreePoolWithTag(ppdev, GDITAG_PDEV);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Copy the function table */
|
||||
ppdev->pfn = ppdev->pldev->pfn;
|
||||
|
||||
/* Set MovePointer function */
|
||||
ppdev->pfnMovePointer = ppdev->pfn.MovePointer;
|
||||
if (!ppdev->pfnMovePointer)
|
||||
ppdev->pfnMovePointer = EngMovePointer;
|
||||
|
||||
ppdev->pGraphicsDevice = pGraphicsDevice;
|
||||
ppdev->hsemDevLock = EngCreateSemaphore();
|
||||
// Should we change the ative mode of pGraphicsDevice ?
|
||||
ppdev->pdmwDev = PDEVOBJ_pdmMatchDevMode(ppdev, pdm) ;
|
||||
|
||||
/* FIXME! */
|
||||
ppdev->flFlags = PDEV_DISPLAY;
|
||||
|
||||
/* HACK: Don't use the pointer */
|
||||
ppdev->Pointer.Exclude.right = -1;
|
||||
|
||||
/* Call the driver to enable the PDEV */
|
||||
if (!PDEVOBJ_bEnablePDEV(ppdev, pdm, NULL))
|
||||
{
|
||||
DPRINT1("Failed to enable PDEV!\n");
|
||||
ASSERT(FALSE);
|
||||
}
|
||||
|
||||
/* FIXME: this must be done in a better way */
|
||||
pGraphicsDevice->StateFlags |= DISPLAY_DEVICE_ATTACHED_TO_DESKTOP;
|
||||
|
||||
/* Tell the driver that the PDEV is ready */
|
||||
PDEVOBJ_vCompletePDEV(ppdev);
|
||||
|
||||
/* Return the PDEV */
|
||||
return ppdev;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
PDEVOBJ_vSwitchPdev(
|
||||
PPDEVOBJ ppdev,
|
||||
PPDEVOBJ ppdev2)
|
||||
{
|
||||
PDEVOBJ pdevTmp;
|
||||
DWORD tmpStateFlags;
|
||||
|
||||
/* Exchange data */
|
||||
pdevTmp = *ppdev;
|
||||
|
||||
/* Exchange driver functions */
|
||||
ppdev->pfn = ppdev2->pfn;
|
||||
ppdev2->pfn = pdevTmp.pfn;
|
||||
|
||||
/* Exchange LDEVs */
|
||||
ppdev->pldev = ppdev2->pldev;
|
||||
ppdev2->pldev = pdevTmp.pldev;
|
||||
|
||||
/* Exchange DHPDEV */
|
||||
ppdev->dhpdev = ppdev2->dhpdev;
|
||||
ppdev2->dhpdev = pdevTmp.dhpdev;
|
||||
|
||||
/* Exchange surfaces and associate them with their new PDEV */
|
||||
ppdev->pSurface = ppdev2->pSurface;
|
||||
ppdev2->pSurface = pdevTmp.pSurface;
|
||||
ppdev->pSurface->SurfObj.hdev = (HDEV)ppdev;
|
||||
ppdev2->pSurface->SurfObj.hdev = (HDEV)ppdev2;
|
||||
|
||||
/* Exchange devinfo */
|
||||
ppdev->devinfo = ppdev2->devinfo;
|
||||
ppdev2->devinfo = pdevTmp.devinfo;
|
||||
|
||||
/* Exchange gdiinfo */
|
||||
ppdev->gdiinfo = ppdev2->gdiinfo;
|
||||
ppdev2->gdiinfo = pdevTmp.gdiinfo;
|
||||
|
||||
/* Exchange DEVMODE */
|
||||
ppdev->pdmwDev = ppdev2->pdmwDev;
|
||||
ppdev2->pdmwDev = pdevTmp.pdmwDev;
|
||||
|
||||
/* Exchange state flags */
|
||||
tmpStateFlags = ppdev->pGraphicsDevice->StateFlags;
|
||||
ppdev->pGraphicsDevice->StateFlags = ppdev2->pGraphicsDevice->StateFlags;
|
||||
ppdev2->pGraphicsDevice->StateFlags = tmpStateFlags;
|
||||
|
||||
/* Notify each driver instance of its new HDEV association */
|
||||
ppdev->pfn.CompletePDEV(ppdev->dhpdev, (HDEV)ppdev);
|
||||
ppdev2->pfn.CompletePDEV(ppdev2->dhpdev, (HDEV)ppdev2);
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
PDEVOBJ_bSwitchMode(
|
||||
PPDEVOBJ ppdev,
|
||||
PDEVMODEW pdm)
|
||||
{
|
||||
UNICODE_STRING ustrDevice;
|
||||
PPDEVOBJ ppdevTmp;
|
||||
PSURFACE pSurface;
|
||||
BOOL retval = FALSE;
|
||||
|
||||
/* Lock the PDEV */
|
||||
EngAcquireSemaphore(ppdev->hsemDevLock);
|
||||
/* And everything else */
|
||||
EngAcquireSemaphore(ghsemPDEV);
|
||||
|
||||
DPRINT1("PDEVOBJ_bSwitchMode, ppdev = %p, pSurface = %p\n", ppdev, ppdev->pSurface);
|
||||
|
||||
// Lookup the GraphicsDevice + select DEVMODE
|
||||
// pdm = PDEVOBJ_pdmMatchDevMode(ppdev, pdm);
|
||||
|
||||
/* 1. Temporarily disable the current PDEV */
|
||||
if (!ppdev->pfn.AssertMode(ppdev->dhpdev, FALSE))
|
||||
{
|
||||
DPRINT1("DrvAssertMode failed\n");
|
||||
goto leave;
|
||||
}
|
||||
|
||||
/* 2. Create new PDEV */
|
||||
RtlInitUnicodeString(&ustrDevice, ppdev->pGraphicsDevice->szWinDeviceName);
|
||||
ppdevTmp = EngpCreatePDEV(&ustrDevice, pdm);
|
||||
if (!ppdevTmp)
|
||||
{
|
||||
DPRINT1("Failed to create a new PDEV\n");
|
||||
goto leave;
|
||||
}
|
||||
|
||||
/* 3. Create a new surface */
|
||||
pSurface = PDEVOBJ_pSurface(ppdevTmp);
|
||||
if (!pSurface)
|
||||
{
|
||||
DPRINT1("DrvEnableSurface failed\n");
|
||||
goto leave;
|
||||
}
|
||||
|
||||
/* 4. Get DirectDraw information */
|
||||
/* 5. Enable DirectDraw Not traced */
|
||||
/* 6. Copy old PDEV state to new PDEV instance */
|
||||
|
||||
/* 7. Switch the PDEVs */
|
||||
PDEVOBJ_vSwitchPdev(ppdev, ppdevTmp);
|
||||
|
||||
/* 8. Disable DirectDraw */
|
||||
|
||||
PDEVOBJ_vRelease(ppdevTmp);
|
||||
|
||||
/* Update primary display capabilities */
|
||||
if(ppdev == gppdevPrimary)
|
||||
{
|
||||
PDEVOBJ_vGetDeviceCaps(ppdev, &GdiHandleTable->DevCaps);
|
||||
}
|
||||
|
||||
/* Success! */
|
||||
retval = TRUE;
|
||||
leave:
|
||||
/* Unlock PDEV */
|
||||
EngReleaseSemaphore(ppdev->hsemDevLock);
|
||||
EngReleaseSemaphore(ghsemPDEV);
|
||||
|
||||
DPRINT1("leave, ppdev = %p, pSurface = %p\n", ppdev, ppdev->pSurface);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
PPDEVOBJ
|
||||
NTAPI
|
||||
EngpGetPDEV(
|
||||
PUNICODE_STRING pustrDeviceName)
|
||||
{
|
||||
UNICODE_STRING ustrCurrent;
|
||||
PPDEVOBJ ppdev;
|
||||
PGRAPHICS_DEVICE pGraphicsDevice;
|
||||
|
||||
/* Acquire PDEV lock */
|
||||
EngAcquireSemaphore(ghsemPDEV);
|
||||
|
||||
/* If no device name is given, ... */
|
||||
if (!pustrDeviceName && gppdevPrimary)
|
||||
{
|
||||
/* ... use the primary PDEV */
|
||||
ppdev = gppdevPrimary;
|
||||
|
||||
/* Reference the pdev */
|
||||
InterlockedIncrement(&ppdev->cPdevRefs);
|
||||
goto leave;
|
||||
}
|
||||
|
||||
/* Loop all present PDEVs */
|
||||
for (ppdev = gppdevList; ppdev; ppdev = ppdev->ppdevNext)
|
||||
{
|
||||
/* Get a pointer to the GRAPHICS_DEVICE */
|
||||
pGraphicsDevice = ppdev->pGraphicsDevice;
|
||||
|
||||
/* Compare the name */
|
||||
RtlInitUnicodeString(&ustrCurrent, pGraphicsDevice->szWinDeviceName);
|
||||
if (RtlEqualUnicodeString(pustrDeviceName, &ustrCurrent, FALSE))
|
||||
{
|
||||
/* Found! Reference the PDEV */
|
||||
InterlockedIncrement(&ppdev->cPdevRefs);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Did we find one? */
|
||||
if (!ppdev)
|
||||
{
|
||||
/* No, create a new PDEV */
|
||||
ppdev = EngpCreatePDEV(pustrDeviceName, NULL);
|
||||
if (ppdev)
|
||||
{
|
||||
/* Insert the PDEV into the list */
|
||||
ppdev->ppdevNext = gppdevList;
|
||||
gppdevList = ppdev;
|
||||
|
||||
/* Set as primary PDEV, if we don't have one yet */
|
||||
if (!gppdevPrimary)
|
||||
{
|
||||
gppdevPrimary = ppdev;
|
||||
ppdev->pGraphicsDevice->StateFlags |= DISPLAY_DEVICE_PRIMARY_DEVICE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
leave:
|
||||
/* Release PDEV lock */
|
||||
EngReleaseSemaphore(ghsemPDEV);
|
||||
|
||||
return ppdev;
|
||||
}
|
||||
|
||||
INT
|
||||
NTAPI
|
||||
PDEVOBJ_iGetColorManagementCaps(PPDEVOBJ ppdev)
|
||||
{
|
||||
INT ret = CM_NONE;
|
||||
|
||||
if (ppdev->flFlags & PDEV_DISPLAY)
|
||||
{
|
||||
if (ppdev->devinfo.iDitherFormat == BMF_8BPP ||
|
||||
ppdev->devinfo.flGraphicsCaps2 & GCAPS2_CHANGEGAMMARAMP)
|
||||
ret = CM_GAMMA_RAMP;
|
||||
}
|
||||
|
||||
if (ppdev->devinfo.flGraphicsCaps & GCAPS_CMYKCOLOR)
|
||||
ret |= CM_CMYK_COLOR;
|
||||
if (ppdev->devinfo.flGraphicsCaps & GCAPS_ICM)
|
||||
ret |= CM_DEVICE_ICM;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
PDEVOBJ_vGetDeviceCaps(
|
||||
IN PPDEVOBJ ppdev,
|
||||
OUT PDEVCAPS pDevCaps)
|
||||
{
|
||||
PGDIINFO pGdiInfo = &ppdev->gdiinfo;
|
||||
|
||||
pDevCaps->ulVersion = pGdiInfo->ulVersion;
|
||||
pDevCaps->ulTechnology = pGdiInfo->ulTechnology;
|
||||
pDevCaps->ulHorzSizeM = (pGdiInfo->ulHorzSize + 500) / 1000;
|
||||
pDevCaps->ulVertSizeM = (pGdiInfo->ulVertSize + 500) / 1000;
|
||||
pDevCaps->ulHorzSize = pGdiInfo->ulHorzSize;
|
||||
pDevCaps->ulVertSize = pGdiInfo->ulVertSize;
|
||||
pDevCaps->ulHorzRes = pGdiInfo->ulHorzRes;
|
||||
pDevCaps->ulVertRes = pGdiInfo->ulVertRes;
|
||||
pDevCaps->ulBitsPixel = pGdiInfo->cBitsPixel;
|
||||
if (pDevCaps->ulBitsPixel == 15) pDevCaps->ulBitsPixel = 16;
|
||||
pDevCaps->ulPlanes = pGdiInfo->cPlanes;
|
||||
pDevCaps->ulNumPens = pGdiInfo->ulNumColors;
|
||||
if (pDevCaps->ulNumPens != -1) pDevCaps->ulNumPens *= 5;
|
||||
pDevCaps->ulNumFonts = 0; // PDEVOBJ_cFonts(ppdev);
|
||||
pDevCaps->ulNumColors = pGdiInfo->ulNumColors;
|
||||
pDevCaps->ulRasterCaps = pGdiInfo->flRaster;
|
||||
pDevCaps->ulAspectX = pGdiInfo->ulAspectX;
|
||||
pDevCaps->ulAspectY = pGdiInfo->ulAspectY;
|
||||
pDevCaps->ulAspectXY = pGdiInfo->ulAspectXY;
|
||||
pDevCaps->ulLogPixelsX = pGdiInfo->ulLogPixelsX;
|
||||
pDevCaps->ulLogPixelsY = pGdiInfo->ulLogPixelsY;
|
||||
pDevCaps->ulSizePalette = pGdiInfo->ulNumPalReg;
|
||||
pDevCaps->ulColorRes = pGdiInfo->ulDACRed +
|
||||
pGdiInfo->ulDACGreen +
|
||||
pGdiInfo->ulDACBlue;
|
||||
pDevCaps->ulPhysicalWidth = pGdiInfo->szlPhysSize.cx;
|
||||
pDevCaps->ulPhysicalHeight = pGdiInfo->szlPhysSize.cy;
|
||||
pDevCaps->ulPhysicalOffsetX = pGdiInfo->ptlPhysOffset.x;
|
||||
pDevCaps->ulPhysicalOffsetY = pGdiInfo->ptlPhysOffset.y;
|
||||
pDevCaps->ulTextCaps = pGdiInfo->flTextCaps;
|
||||
pDevCaps->ulTextCaps |= (TC_SO_ABLE|TC_UA_ABLE|TC_CP_STROKE|TC_OP_STROKE|TC_OP_CHARACTER);
|
||||
if (pGdiInfo->ulTechnology != DT_PLOTTER)
|
||||
pDevCaps->ulTextCaps |= TC_VA_ABLE;
|
||||
pDevCaps->ulVRefresh = pGdiInfo->ulVRefresh;
|
||||
pDevCaps->ulDesktopHorzRes = pGdiInfo->ulHorzRes;
|
||||
pDevCaps->ulDesktopVertRes = pGdiInfo->ulVertRes;
|
||||
pDevCaps->ulBltAlignment = pGdiInfo->ulBltAlignment;
|
||||
pDevCaps->ulPanningHorzRes = pGdiInfo->ulPanningHorzRes;
|
||||
pDevCaps->ulPanningVertRes = pGdiInfo->ulPanningVertRes;
|
||||
pDevCaps->xPanningAlignment = pGdiInfo->xPanningAlignment;
|
||||
pDevCaps->yPanningAlignment = pGdiInfo->yPanningAlignment;
|
||||
pDevCaps->ulShadeBlend = pGdiInfo->flShadeBlend;
|
||||
pDevCaps->ulColorMgmtCaps = PDEVOBJ_iGetColorManagementCaps(ppdev);
|
||||
}
|
||||
|
||||
|
||||
/** Exported functions ********************************************************/
|
||||
|
||||
LPWSTR
|
||||
APIENTRY
|
||||
EngGetDriverName(IN HDEV hdev)
|
||||
{
|
||||
PPDEVOBJ ppdev = (PPDEVOBJ)hdev;
|
||||
PLDEVOBJ pldev;
|
||||
|
||||
if (!hdev)
|
||||
return NULL;
|
||||
|
||||
pldev = ppdev->pldev;
|
||||
ASSERT(pldev);
|
||||
|
||||
if (!pldev->pGdiDriverInfo)
|
||||
return NULL;
|
||||
|
||||
return pldev->pGdiDriverInfo->DriverName.Buffer;
|
||||
}
|
||||
|
||||
|
||||
INT
|
||||
APIENTRY
|
||||
NtGdiGetDeviceCaps(
|
||||
HDC hdc,
|
||||
INT Index)
|
||||
{
|
||||
PDC pdc;
|
||||
DEVCAPS devcaps;
|
||||
|
||||
/* Lock the given DC */
|
||||
pdc = DC_LockDc(hdc);
|
||||
if (!pdc)
|
||||
{
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Get the data */
|
||||
PDEVOBJ_vGetDeviceCaps(pdc->ppdev, &devcaps);
|
||||
|
||||
/* Unlock the DC */
|
||||
DC_UnlockDc(pdc);
|
||||
|
||||
/* Return capability */
|
||||
switch (Index)
|
||||
{
|
||||
case DRIVERVERSION:
|
||||
return devcaps.ulVersion;
|
||||
|
||||
case TECHNOLOGY:
|
||||
return devcaps.ulTechnology;
|
||||
|
||||
case HORZSIZE:
|
||||
return devcaps.ulHorzSize;
|
||||
|
||||
case VERTSIZE:
|
||||
return devcaps.ulVertSize;
|
||||
|
||||
case HORZRES:
|
||||
return devcaps.ulHorzRes;
|
||||
|
||||
case VERTRES:
|
||||
return devcaps.ulVertRes;
|
||||
|
||||
case LOGPIXELSX:
|
||||
return devcaps.ulLogPixelsX;
|
||||
|
||||
case LOGPIXELSY:
|
||||
return devcaps.ulLogPixelsY;
|
||||
|
||||
case BITSPIXEL:
|
||||
return devcaps.ulBitsPixel;
|
||||
|
||||
case PLANES:
|
||||
return devcaps.ulPlanes;
|
||||
|
||||
case NUMBRUSHES:
|
||||
return -1;
|
||||
|
||||
case NUMPENS:
|
||||
return devcaps.ulNumPens;
|
||||
|
||||
case NUMFONTS:
|
||||
return devcaps.ulNumFonts;
|
||||
|
||||
case NUMCOLORS:
|
||||
return devcaps.ulNumColors;
|
||||
|
||||
case ASPECTX:
|
||||
return devcaps.ulAspectX;
|
||||
|
||||
case ASPECTY:
|
||||
return devcaps.ulAspectY;
|
||||
|
||||
case ASPECTXY:
|
||||
return devcaps.ulAspectXY;
|
||||
|
||||
case CLIPCAPS:
|
||||
return CP_RECTANGLE;
|
||||
|
||||
case SIZEPALETTE:
|
||||
return devcaps.ulSizePalette;
|
||||
|
||||
case NUMRESERVED:
|
||||
return 20;
|
||||
|
||||
case COLORRES:
|
||||
return devcaps.ulColorRes;
|
||||
|
||||
case DESKTOPVERTRES:
|
||||
return devcaps.ulVertRes;
|
||||
|
||||
case DESKTOPHORZRES:
|
||||
return devcaps.ulHorzRes;
|
||||
|
||||
case BLTALIGNMENT:
|
||||
return devcaps.ulBltAlignment;
|
||||
|
||||
case SHADEBLENDCAPS:
|
||||
return devcaps.ulShadeBlend;
|
||||
|
||||
case COLORMGMTCAPS:
|
||||
return devcaps.ulColorMgmtCaps;
|
||||
|
||||
case PHYSICALWIDTH:
|
||||
return devcaps.ulPhysicalWidth;
|
||||
|
||||
case PHYSICALHEIGHT:
|
||||
return devcaps.ulPhysicalHeight;
|
||||
|
||||
case PHYSICALOFFSETX:
|
||||
return devcaps.ulPhysicalOffsetX;
|
||||
|
||||
case PHYSICALOFFSETY:
|
||||
return devcaps.ulPhysicalOffsetY;
|
||||
|
||||
case VREFRESH:
|
||||
return devcaps.ulVRefresh;
|
||||
|
||||
case RASTERCAPS:
|
||||
return devcaps.ulRasterCaps;
|
||||
|
||||
case CURVECAPS:
|
||||
return (CC_CIRCLES | CC_PIE | CC_CHORD | CC_ELLIPSES | CC_WIDE |
|
||||
CC_STYLED | CC_WIDESTYLED | CC_INTERIORS | CC_ROUNDRECT);
|
||||
|
||||
case LINECAPS:
|
||||
return (LC_POLYLINE | LC_MARKER | LC_POLYMARKER | LC_WIDE |
|
||||
LC_STYLED | LC_WIDESTYLED | LC_INTERIORS);
|
||||
|
||||
case POLYGONALCAPS:
|
||||
return (PC_POLYGON | PC_RECTANGLE | PC_WINDPOLYGON | PC_SCANLINE |
|
||||
PC_WIDE | PC_STYLED | PC_WIDESTYLED | PC_INTERIORS);
|
||||
|
||||
case TEXTCAPS:
|
||||
return devcaps.ulTextCaps;
|
||||
|
||||
case CAPS1:
|
||||
case PDEVICESIZE:
|
||||
case SCALINGFACTORX:
|
||||
case SCALINGFACTORY:
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
APIENTRY
|
||||
NtGdiGetDeviceCapsAll(
|
||||
IN HDC hDC,
|
||||
OUT PDEVCAPS pDevCaps)
|
||||
{
|
||||
PDC pdc;
|
||||
DEVCAPS devcaps;
|
||||
BOOL bResult = TRUE;
|
||||
|
||||
/* Lock the given DC */
|
||||
pdc = DC_LockDc(hDC);
|
||||
if (!pdc)
|
||||
{
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Get the data */
|
||||
PDEVOBJ_vGetDeviceCaps(pdc->ppdev, &devcaps);
|
||||
|
||||
/* Unlock the DC */
|
||||
DC_UnlockDc(pdc);
|
||||
|
||||
/* Copy data to caller */
|
||||
_SEH2_TRY
|
||||
{
|
||||
ProbeForWrite(pDevCaps, sizeof(DEVCAPS), 1);
|
||||
RtlCopyMemory(pDevCaps, &devcaps, sizeof(DEVCAPS));
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
SetLastNtError(_SEH2_GetExceptionCode());
|
||||
bResult = FALSE;
|
||||
}
|
||||
_SEH2_END;
|
||||
|
||||
return bResult;
|
||||
}
|
||||
|
||||
DHPDEV
|
||||
APIENTRY
|
||||
NtGdiGetDhpdev(
|
||||
IN HDEV hdev)
|
||||
{
|
||||
PPDEVOBJ ppdev;
|
||||
DHPDEV dhpdev = NULL;
|
||||
|
||||
/* Check parameter */
|
||||
if (!hdev || (PCHAR)hdev < (PCHAR)MmSystemRangeStart)
|
||||
return NULL;
|
||||
|
||||
/* Lock PDEV list */
|
||||
EngAcquireSemaphore(ghsemPDEV);
|
||||
|
||||
/* Walk through the list of PDEVs */
|
||||
for (ppdev = gppdevList; ppdev; ppdev = ppdev->ppdevNext)
|
||||
{
|
||||
/* Compare with the given HDEV */
|
||||
if (ppdev == hdev)
|
||||
{
|
||||
/* Found the PDEV! Get it's dhpdev and break */
|
||||
dhpdev = ppdev->dhpdev;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Unlock PDEV list */
|
||||
EngReleaseSemaphore(ghsemPDEV);
|
||||
|
||||
return dhpdev;
|
||||
}
|
||||
|
||||
PSIZEL
|
||||
FASTCALL
|
||||
PDEVOBJ_sizl(PPDEVOBJ ppdev, PSIZEL psizl)
|
||||
{
|
||||
if (ppdev->flFlags & PDEV_META_DEVICE)
|
||||
{
|
||||
psizl->cx = ppdev->ulHorzRes;
|
||||
psizl->cy = ppdev->ulVertRes;
|
||||
}
|
||||
else
|
||||
{
|
||||
psizl->cx = ppdev->gdiinfo.ulHorzRes;
|
||||
psizl->cy = ppdev->gdiinfo.ulVertRes;
|
||||
}
|
||||
return psizl;
|
||||
}
|
99
subsystems/win32/win32k/eng/rlecomp.c
Normal file
99
subsystems/win32/win32k/eng/rlecomp.c
Normal file
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
* PURPOSE: RLE compression
|
||||
* FILE: subsystems/win32k/eng/rlecomp.c
|
||||
* PROGRAMER: Jason Filby
|
||||
*/
|
||||
|
||||
#include <win32k.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
enum Rle_EscapeCodes
|
||||
{
|
||||
RLE_EOL = 0, /* End of line */
|
||||
RLE_END = 1, /* End of bitmap */
|
||||
RLE_DELTA = 2 /* Delta */
|
||||
};
|
||||
|
||||
VOID DecompressBitmap(SIZEL Size, BYTE *CompressedBits, BYTE *UncompressedBits, LONG Delta, ULONG Format)
|
||||
{
|
||||
INT x = 0;
|
||||
INT y = Size.cy - 1;
|
||||
INT c;
|
||||
INT length;
|
||||
INT width;
|
||||
INT height = Size.cy - 1;
|
||||
BYTE *begin = CompressedBits;
|
||||
BYTE *bits = CompressedBits;
|
||||
BYTE *temp;
|
||||
INT shift = 0;
|
||||
|
||||
if (Format == BMF_4RLE)
|
||||
shift = 1;
|
||||
else if(Format != BMF_8RLE)
|
||||
return;
|
||||
|
||||
width = ((Size.cx + shift) >> shift);
|
||||
|
||||
_SEH2_TRY
|
||||
{
|
||||
while (y >= 0)
|
||||
{
|
||||
length = (*bits++) >> shift;
|
||||
if (length)
|
||||
{
|
||||
c = *bits++;
|
||||
while (length--)
|
||||
{
|
||||
if (x >= width) break;
|
||||
temp = UncompressedBits + (((height - y) * Delta) + x);
|
||||
x++;
|
||||
*temp = c;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
length = *bits++;
|
||||
switch (length)
|
||||
{
|
||||
case RLE_EOL:
|
||||
x = 0;
|
||||
y--;
|
||||
break;
|
||||
case RLE_END:
|
||||
_SEH2_YIELD(return);
|
||||
case RLE_DELTA:
|
||||
x += (*bits++) >> shift;
|
||||
y -= (*bits++) >> shift;
|
||||
break;
|
||||
default:
|
||||
length = length >> shift;
|
||||
while (length--)
|
||||
{
|
||||
c = *bits++;
|
||||
if (x < width)
|
||||
{
|
||||
temp = UncompressedBits + (((height - y) * Delta) + x);
|
||||
x++;
|
||||
*temp = c;
|
||||
}
|
||||
}
|
||||
if ((bits - begin) & 1)
|
||||
{
|
||||
bits++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
DPRINT1("Decoding error\n");
|
||||
}
|
||||
_SEH2_END;
|
||||
|
||||
return;
|
||||
}
|
|
@ -69,6 +69,19 @@ EngReleaseSemaphore ( IN HSEMAPHORE hsem )
|
|||
IntGdiReleaseSemaphore ( hsem );
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
EngAcquireSemaphoreShared(
|
||||
IN HSEMAPHORE hsem)
|
||||
{
|
||||
PTHREADINFO pti;
|
||||
|
||||
ASSERT(hsem);
|
||||
ExEnterCriticalRegionAndAcquireResourceShared((PERESOURCE)hsem);
|
||||
pti = PsGetThreadWin32Thread(PsGetCurrentThread());
|
||||
if (pti) ++pti->dwEngAcquireCount;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
|
|
|
@ -462,25 +462,16 @@ IntEngStretchBlt(SURFOBJ *psoDest,
|
|||
|
||||
/* No success yet */
|
||||
ret = FALSE;
|
||||
SURFACE_LockBitmapBits(psurfDest);
|
||||
MouseSafetyOnDrawStart(psoDest, OutputRect.left, OutputRect.top,
|
||||
OutputRect.right, OutputRect.bottom);
|
||||
|
||||
if (UsesSource)
|
||||
{
|
||||
psurfSource = CONTAINING_RECORD(psoSource, SURFACE, SurfObj);
|
||||
if (psoSource != psoDest)
|
||||
{
|
||||
SURFACE_LockBitmapBits(psurfSource);
|
||||
}
|
||||
MouseSafetyOnDrawStart(psoSource, InputRect.left, InputRect.top,
|
||||
InputRect.right, InputRect.bottom);
|
||||
}
|
||||
|
||||
/* Prepare color adjustment */
|
||||
|
||||
/* Call the driver's DrvStretchBlt if available */
|
||||
if (psurfDest->flHooks & HOOK_STRETCHBLTROP)
|
||||
if (psurfDest->flags & HOOK_STRETCHBLTROP)
|
||||
{
|
||||
/* Drv->StretchBltROP (look at http://www.osronline.com/ddkx/graphics/ddifncs_0z3b.htm ) */
|
||||
ret = GDIDEVFUNCS(psoDest).StretchBltROP(psoDest,
|
||||
|
@ -514,17 +505,6 @@ IntEngStretchBlt(SURFOBJ *psoDest,
|
|||
ROP);
|
||||
}
|
||||
|
||||
if (UsesSource)
|
||||
{
|
||||
MouseSafetyOnDrawEnd(psoSource);
|
||||
if (psoSource != psoDest)
|
||||
{
|
||||
SURFACE_UnlockBitmapBits(psurfSource);
|
||||
}
|
||||
}
|
||||
MouseSafetyOnDrawEnd(psoDest);
|
||||
SURFACE_UnlockBitmapBits(psurfDest);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -76,7 +76,7 @@ EngTransparentBlt(SURFOBJ *psoDest,
|
|||
OutputRect.top = DestRect->bottom;
|
||||
OutputRect.bottom = DestRect->top;
|
||||
}
|
||||
|
||||
|
||||
if(Clip)
|
||||
{
|
||||
if(OutputRect.left < Clip->rclBounds.left)
|
||||
|
@ -284,17 +284,7 @@ IntEngTransparentBlt(SURFOBJ *psoDest,
|
|||
OutputRect = InputClippedRect;
|
||||
}
|
||||
|
||||
if(psoSource != psoDest)
|
||||
{
|
||||
SURFACE_LockBitmapBits(psurfSource);
|
||||
MouseSafetyOnDrawStart(psoSource, InputRect.left, InputRect.top,
|
||||
InputRect.right, InputRect.bottom);
|
||||
}
|
||||
SURFACE_LockBitmapBits(psurfDest);
|
||||
MouseSafetyOnDrawStart(psoDest, OutputRect.left, OutputRect.top,
|
||||
OutputRect.right, OutputRect.bottom);
|
||||
|
||||
if(psurfDest->flHooks & HOOK_TRANSPARENTBLT)
|
||||
if(psurfDest->flags & HOOK_TRANSPARENTBLT)
|
||||
{
|
||||
Ret = GDIDEVFUNCS(psoDest).TransparentBlt(
|
||||
psoDest, psoSource, Clip, ColorTranslation, &OutputRect,
|
||||
|
@ -309,14 +299,6 @@ IntEngTransparentBlt(SURFOBJ *psoDest,
|
|||
&OutputRect, &InputRect, iTransColor, Reserved);
|
||||
}
|
||||
|
||||
MouseSafetyOnDrawEnd(psoDest);
|
||||
SURFACE_UnlockBitmapBits(psurfDest);
|
||||
if(psoSource != psoDest)
|
||||
{
|
||||
MouseSafetyOnDrawEnd(psoSource);
|
||||
SURFACE_UnlockBitmapBits(psurfSource);
|
||||
}
|
||||
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@ EXLATEOBJ_iXlateRGBtoBGR(PEXLATEOBJ pxlo, ULONG iColor)
|
|||
{
|
||||
ULONG iNewColor;
|
||||
|
||||
/* Copy green and alpha */
|
||||
/* Copy green */
|
||||
iNewColor = iColor & 0xff00ff00;
|
||||
|
||||
/* Mask red and blue */
|
||||
|
@ -362,19 +362,19 @@ EXLATEOBJ_vInitialize(
|
|||
EXLATEOBJ_vInitTrivial(pexlo);
|
||||
|
||||
if (ppalDst == ppalSrc || !ppalSrc || !ppalDst ||
|
||||
((ppalDst->Mode == PAL_RGB || ppalDst->Mode == PAL_BGR) &&
|
||||
ppalDst->Mode == ppalSrc->Mode))
|
||||
((ppalDst->flFlags == PAL_RGB || ppalDst->flFlags == PAL_BGR) &&
|
||||
ppalDst->flFlags == ppalSrc->flFlags))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
pexlo->ppalSrc = ppalSrc;
|
||||
pexlo->ppalDst = ppalDst;
|
||||
pexlo->xlo.iSrcType = ppalSrc->Mode;
|
||||
pexlo->xlo.iDstType = ppalDst->Mode;
|
||||
pexlo->xlo.iSrcType = ppalSrc->flFlags;
|
||||
pexlo->xlo.iDstType = ppalDst->flFlags;
|
||||
|
||||
/* Chack if both of the pallettes are indexed */
|
||||
if (!(ppalSrc->Mode & PAL_INDEXED) || !(ppalDst->Mode & PAL_INDEXED))
|
||||
if (!(ppalSrc->flFlags & PAL_INDEXED) || !(ppalDst->flFlags & PAL_INDEXED))
|
||||
{
|
||||
/* At least one palette is not indexed, calculate shifts/masks */
|
||||
ULONG aulMasksSrc[3], aulMasksDst[3];
|
||||
|
@ -391,10 +391,10 @@ EXLATEOBJ_vInitialize(
|
|||
pexlo->ulBlueShift = CalculateShift(aulMasksSrc[2], aulMasksDst[2]);
|
||||
}
|
||||
|
||||
if (ppalSrc->Mode & PAL_MONOCHROME)
|
||||
if (ppalSrc->flFlags & PAL_MONOCHROME)
|
||||
{
|
||||
/* This is a monochrome palette */
|
||||
if (!(ppalDst->Mode & PAL_MONOCHROME))
|
||||
if (!(ppalDst->flFlags & PAL_MONOCHROME))
|
||||
{
|
||||
/* Mono to color, use the dest DC's fore and back color */
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateTable;
|
||||
|
@ -406,28 +406,28 @@ EXLATEOBJ_vInitialize(
|
|||
PALETTE_ulGetNearestIndex(ppalDst, crDstBackColor);
|
||||
}
|
||||
}
|
||||
else if (ppalDst->Mode & PAL_MONOCHROME)
|
||||
else if (ppalDst->flFlags & PAL_MONOCHROME)
|
||||
{
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateToMono;
|
||||
pexlo->xlo.flXlate |= XO_TO_MONO;
|
||||
pexlo->xlo.cEntries = 1;
|
||||
|
||||
if (ppalSrc->Mode & PAL_INDEXED)
|
||||
if (ppalSrc->flFlags & PAL_INDEXED)
|
||||
{
|
||||
pexlo->aulXlate[0] =
|
||||
PALETTE_ulGetNearestPaletteIndex(ppalSrc, crSrcBackColor);
|
||||
}
|
||||
else if (ppalSrc->Mode & PAL_BGR)
|
||||
else if (ppalSrc->flFlags & PAL_BGR)
|
||||
{
|
||||
pexlo->aulXlate[0] = crSrcBackColor;
|
||||
}
|
||||
else if (ppalSrc->Mode & PAL_RGB)
|
||||
else if (ppalSrc->flFlags & PAL_RGB)
|
||||
{
|
||||
pexlo->aulXlate[0] = RGB(GetBValue(crSrcBackColor),
|
||||
GetGValue(crSrcBackColor),
|
||||
GetRValue(crSrcBackColor));
|
||||
}
|
||||
else if (ppalSrc->Mode & PAL_BITFIELDS)
|
||||
else if (ppalSrc->flFlags & PAL_BITFIELDS)
|
||||
{
|
||||
PALETTE_vGetBitMasks(ppalSrc, &pexlo->ulRedMask);
|
||||
pexlo->ulRedShift = CalculateShift(0xFF, pexlo->ulRedMask);
|
||||
|
@ -437,7 +437,7 @@ EXLATEOBJ_vInitialize(
|
|||
pexlo->aulXlate[0] = EXLATEOBJ_iXlateShiftAndMask(pexlo, crSrcBackColor);
|
||||
}
|
||||
}
|
||||
else if (ppalSrc->Mode & PAL_INDEXED)
|
||||
else if (ppalSrc->flFlags & PAL_INDEXED)
|
||||
{
|
||||
cEntries = ppalSrc->NumColors;
|
||||
|
||||
|
@ -458,7 +458,7 @@ EXLATEOBJ_vInitialize(
|
|||
pexlo->xlo.cEntries = cEntries;
|
||||
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateTable;
|
||||
if (ppalDst->Mode & PAL_INDEXED)
|
||||
if (ppalDst->flFlags & PAL_INDEXED)
|
||||
{
|
||||
pexlo->xlo.flXlate |= XO_TABLE;
|
||||
|
||||
|
@ -504,78 +504,78 @@ EXLATEOBJ_vInitialize(
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (ppalSrc->Mode & PAL_RGB)
|
||||
else if (ppalSrc->flFlags & PAL_RGB)
|
||||
{
|
||||
if (ppalDst->Mode & PAL_INDEXED)
|
||||
if (ppalDst->flFlags & PAL_INDEXED)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoPal;
|
||||
|
||||
else if (ppalDst->Mode & PAL_BGR)
|
||||
else if (ppalDst->flFlags & PAL_BGR)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR;
|
||||
|
||||
else if (ppalDst->Mode & PAL_RGB16_555)
|
||||
else if (ppalDst->flFlags & PAL_RGB16_555)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto555;
|
||||
|
||||
else if (ppalDst->Mode & PAL_RGB16_565)
|
||||
else if (ppalDst->flFlags & PAL_RGB16_565)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto565;
|
||||
|
||||
else if (ppalDst->Mode & PAL_BITFIELDS)
|
||||
else if (ppalDst->flFlags & PAL_BITFIELDS)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
|
||||
}
|
||||
else if (ppalSrc->Mode & PAL_BGR)
|
||||
else if (ppalSrc->flFlags & PAL_BGR)
|
||||
{
|
||||
if (ppalDst->Mode & PAL_INDEXED)
|
||||
if (ppalDst->flFlags & PAL_INDEXED)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateBitfieldsToPal;
|
||||
|
||||
else if (ppalDst->Mode & PAL_RGB)
|
||||
else if (ppalDst->flFlags & PAL_RGB)
|
||||
/* The inverse function works the same */
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR;
|
||||
|
||||
else if (ppalDst->Mode & PAL_RGB16_555)
|
||||
else if (ppalDst->flFlags & PAL_RGB16_555)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto555;
|
||||
|
||||
else if (ppalDst->Mode & PAL_RGB16_565)
|
||||
else if (ppalDst->flFlags & PAL_RGB16_565)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto565;
|
||||
|
||||
else if (ppalDst->Mode & PAL_BITFIELDS)
|
||||
else if (ppalDst->flFlags & PAL_BITFIELDS)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
|
||||
}
|
||||
else if (ppalSrc->Mode & PAL_RGB16_555)
|
||||
else if (ppalSrc->flFlags & PAL_RGB16_555)
|
||||
{
|
||||
if (ppalDst->Mode & PAL_INDEXED)
|
||||
if (ppalDst->flFlags & PAL_INDEXED)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlate555toPal;
|
||||
|
||||
else if (ppalDst->Mode & PAL_RGB)
|
||||
else if (ppalDst->flFlags & PAL_RGB)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlate555toRGB;
|
||||
|
||||
else if (ppalDst->Mode & PAL_BGR)
|
||||
else if (ppalDst->flFlags & PAL_BGR)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlate555toBGR;
|
||||
|
||||
else if (ppalDst->Mode & PAL_RGB16_565)
|
||||
else if (ppalDst->flFlags & PAL_RGB16_565)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlate555to565;
|
||||
|
||||
else if (ppalDst->Mode & PAL_BITFIELDS)
|
||||
else if (ppalDst->flFlags & PAL_BITFIELDS)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
|
||||
}
|
||||
else if (ppalSrc->Mode & PAL_RGB16_565)
|
||||
else if (ppalSrc->flFlags & PAL_RGB16_565)
|
||||
{
|
||||
if (ppalDst->Mode & PAL_INDEXED)
|
||||
if (ppalDst->flFlags & PAL_INDEXED)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlate565toPal;
|
||||
|
||||
else if (ppalDst->Mode & PAL_RGB)
|
||||
else if (ppalDst->flFlags & PAL_RGB)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlate565toRGB;
|
||||
|
||||
else if (ppalDst->Mode & PAL_BGR)
|
||||
else if (ppalDst->flFlags & PAL_BGR)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlate565toBGR;
|
||||
|
||||
else if (ppalDst->Mode & PAL_RGB16_555)
|
||||
else if (ppalDst->flFlags & PAL_RGB16_555)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlate565to555;
|
||||
|
||||
else if (ppalDst->Mode & PAL_BITFIELDS)
|
||||
else if (ppalDst->flFlags & PAL_BITFIELDS)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
|
||||
}
|
||||
else if (ppalSrc->Mode & PAL_BITFIELDS)
|
||||
else if (ppalSrc->flFlags & PAL_BITFIELDS)
|
||||
{
|
||||
if (ppalDst->Mode & PAL_INDEXED)
|
||||
if (ppalDst->flFlags & PAL_INDEXED)
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateBitfieldsToPal;
|
||||
else
|
||||
pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
|
||||
|
@ -603,157 +603,24 @@ EXLATEOBJ_vInitXlateFromDCs(
|
|||
PDC pdcDst)
|
||||
{
|
||||
PSURFACE psurfDst, psurfSrc;
|
||||
HPALETTE hpalSrc, hpalDst;
|
||||
PPALETTE ppalSrc, ppalDst, ppalDstDc;
|
||||
|
||||
DPRINT("Enter EXLATEOBJ_vInitXlateFromDCs\n");
|
||||
|
||||
/* Do basic init */
|
||||
EXLATEOBJ_vInitTrivial(pexlo);
|
||||
|
||||
psurfDst = pdcDst->dclevel.pSurface;
|
||||
psurfSrc = pdcSrc->dclevel.pSurface;
|
||||
|
||||
/* Check for trivial color translation */
|
||||
if (psurfDst == psurfSrc)
|
||||
{
|
||||
EXLATEOBJ_vInitTrivial(pexlo);
|
||||
return;
|
||||
}
|
||||
|
||||
hpalSrc = psurfSrc->hDIBPalette;
|
||||
if (!hpalSrc)
|
||||
hpalSrc = pPrimarySurface->devinfo.hpalDefault;
|
||||
|
||||
ppalSrc = PALETTE_ShareLockPalette(hpalSrc);
|
||||
if (!ppalSrc)
|
||||
return;
|
||||
|
||||
hpalDst = psurfDst->hDIBPalette;
|
||||
if (!hpalDst) hpalDst = pPrimarySurface->devinfo.hpalDefault;
|
||||
|
||||
ppalDst = PALETTE_ShareLockPalette(hpalDst);
|
||||
if (!ppalDst)
|
||||
{
|
||||
PALETTE_ShareUnlockPalette(ppalSrc);
|
||||
return;
|
||||
}
|
||||
|
||||
ppalDstDc = pdcDst->dclevel.ppal;
|
||||
ASSERT(ppalDstDc);
|
||||
|
||||
/* KB41464 details how to convert between mono and color */
|
||||
if (psurfDst->SurfObj.iBitmapFormat == BMF_1BPP)
|
||||
{
|
||||
if (psurfSrc->SurfObj.iBitmapFormat != BMF_1BPP)
|
||||
{
|
||||
// HACK!! FIXME: 1bpp DDBs should have gpalMono already!
|
||||
EXLATEOBJ_vInitialize(pexlo,
|
||||
ppalSrc,
|
||||
&gpalMono,
|
||||
pdcSrc->pdcattr->crBackgroundClr,
|
||||
pdcDst->pdcattr->crBackgroundClr,
|
||||
pdcDst->pdcattr->crForegroundClr);
|
||||
}
|
||||
}
|
||||
else if (psurfSrc->SurfObj.iBitmapFormat == BMF_1BPP && !psurfSrc->hSecure)
|
||||
{
|
||||
// HACK!! FIXME: 1bpp DDBs should have gpalMono already!
|
||||
EXLATEOBJ_vInitialize(pexlo,
|
||||
&gpalMono,
|
||||
ppalDst,
|
||||
0,
|
||||
pdcDst->pdcattr->crBackgroundClr,
|
||||
pdcDst->pdcattr->crForegroundClr);
|
||||
}
|
||||
else
|
||||
{
|
||||
EXLATEOBJ_vInitialize(pexlo, ppalSrc, ppalDst, 0, 0, 0);
|
||||
}
|
||||
|
||||
PALETTE_ShareUnlockPalette(ppalDst);
|
||||
PALETTE_ShareUnlockPalette(ppalSrc);
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
EXLATEOBJ_vInitBrushXlate(
|
||||
PEXLATEOBJ pexlo,
|
||||
BRUSH *pbrush,
|
||||
SURFACE *psurfDst,
|
||||
COLORREF crForegroundClr,
|
||||
COLORREF crBackgroundClr)
|
||||
{
|
||||
HPALETTE hpalDst = NULL;
|
||||
PPALETTE ppalDst, ppalPattern;
|
||||
SURFACE *psurfPattern;
|
||||
|
||||
ASSERT(pexlo);
|
||||
ASSERT(pbrush);
|
||||
ASSERT(psurfDst);
|
||||
ASSERT(!(pbrush->flAttrs & (GDIBRUSH_IS_SOLID | GDIBRUSH_IS_NULL)));
|
||||
|
||||
EXLATEOBJ_vInitTrivial(pexlo);
|
||||
|
||||
hpalDst = psurfDst->hDIBPalette;
|
||||
if (!hpalDst) hpalDst = pPrimarySurface->devinfo.hpalDefault;
|
||||
ppalDst = PALETTE_ShareLockPalette(hpalDst);
|
||||
if (!ppalDst)
|
||||
{
|
||||
DPRINT1("No ppalDst!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
psurfPattern = SURFACE_ShareLockSurface(pbrush->hbmPattern);
|
||||
if (!psurfPattern)
|
||||
{
|
||||
PALETTE_ShareUnlockPalette(ppalDst);
|
||||
return;
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (psurfDst->SurfObj.iBitmapFormat == BMF_1BPP)
|
||||
{
|
||||
if (psurfSrc->SurfObj.iBitmapFormat != BMF_1BPP)
|
||||
{
|
||||
// HACK!! FIXME: 1bpp DDBs should have gpalMono already!
|
||||
EXLATEOBJ_vInitialize(pexlo,
|
||||
ppalSrc,
|
||||
&gpalMono,
|
||||
0,
|
||||
crBackgroundClr,
|
||||
crForegroundClr);
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (psurfPattern->SurfObj.iBitmapFormat == BMF_1BPP &&
|
||||
!(pbrush->flAttrs & GDIBRUSH_IS_DIB))
|
||||
{
|
||||
/* Special case: 1 bpp pattern, not a DIB brush. */
|
||||
if (psurfDst->SurfObj.iBitmapFormat != BMF_1BPP)
|
||||
{
|
||||
// HACK!! FIXME: 1bpp DDBs should have gpalMono already!
|
||||
EXLATEOBJ_vInitialize(pexlo,
|
||||
&gpalMono,
|
||||
ppalDst,
|
||||
0,
|
||||
crBackgroundClr,
|
||||
crForegroundClr);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Default: use the patterns' palette */
|
||||
ppalPattern = PALETTE_LockPalette(psurfPattern->hDIBPalette);
|
||||
if (ppalPattern)
|
||||
{
|
||||
EXLATEOBJ_vInitialize(pexlo, &gpalRGB, ppalDst, 0, 0, 0);
|
||||
PALETTE_UnlockPalette(ppalPattern);
|
||||
}
|
||||
}
|
||||
|
||||
PALETTE_ShareUnlockPalette(ppalDst);
|
||||
SURFACE_ShareUnlockSurface(psurfPattern);
|
||||
/* Normal initialisation. No surface means DEFAULT_BITMAP */
|
||||
EXLATEOBJ_vInitialize(pexlo,
|
||||
psurfSrc ? psurfSrc->ppal : &gpalMono,
|
||||
psurfDst ? psurfDst->ppal : &gpalMono,
|
||||
pdcSrc->pdcattr->crBackgroundClr,
|
||||
pdcDst->pdcattr->crBackgroundClr,
|
||||
pdcDst->pdcattr->crForegroundClr);
|
||||
}
|
||||
|
||||
VOID
|
||||
|
@ -827,9 +694,9 @@ XLATEOBJ_cGetPalette(XLATEOBJ *pxlo, ULONG iPal, ULONG cPal, ULONG *pPalOut)
|
|||
/* Verify palette type match */
|
||||
if (!ppal ||
|
||||
((iPal == XO_SRCPALETTE || iPal == XO_DESTPALETTE)
|
||||
&& !(ppal->Mode & PAL_INDEXED)) ||
|
||||
&& !(ppal->flFlags & PAL_INDEXED)) ||
|
||||
((iPal == XO_SRCBITFIELDS || iPal == XO_DESTBITFIELDS)
|
||||
&& !(ppal->Mode & PAL_BITFIELDS)))
|
||||
&& !(ppal->flFlags & PAL_BITFIELDS)))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@ -840,7 +707,7 @@ XLATEOBJ_cGetPalette(XLATEOBJ *pxlo, ULONG iPal, ULONG cPal, ULONG *pPalOut)
|
|||
}
|
||||
|
||||
/* Copy the values into the buffer */
|
||||
if (ppal->Mode & PAL_INDEXED)
|
||||
if (ppal->flFlags & PAL_INDEXED)
|
||||
{
|
||||
cPal = min(cPal, ppal->NumColors);
|
||||
for (i = 0; i < cPal; i++)
|
||||
|
|
|
@ -2,11 +2,47 @@
|
|||
|
||||
#include "surface.h"
|
||||
|
||||
INT FASTCALL DIB_GetDIBWidthBytes (INT width, INT depth);
|
||||
int APIENTRY DIB_GetDIBImageBytes (INT width, INT height, INT depth);
|
||||
INT FASTCALL DIB_BitmapInfoSize (const BITMAPINFO * info, WORD coloruse);
|
||||
typedef struct tagBITMAPV5INFO
|
||||
{
|
||||
BITMAPV5HEADER bmiHeader;
|
||||
RGBQUAD bmiColors[256];
|
||||
} BITMAPV5INFO, *PBITMAPV5INFO;
|
||||
|
||||
INT APIENTRY BITMAP_GetObject(SURFACE * bmp, INT count, LPVOID buffer);
|
||||
HBITMAP FASTCALL IntCreateBitmap(IN SIZEL Size, IN LONG Width, IN ULONG Format, IN ULONG Flags, IN PVOID Bits);
|
||||
HBITMAP FASTCALL BITMAP_CopyBitmap (HBITMAP hBitmap);
|
||||
UINT FASTCALL BITMAP_GetRealBitsPixel(UINT nBitsPixel);
|
||||
INT FASTCALL BITMAP_GetWidthBytes (INT bmWidth, INT bpp);
|
||||
|
||||
HBITMAP
|
||||
APIENTRY
|
||||
GreCreateBitmap(
|
||||
IN INT nWidth,
|
||||
IN INT nHeight,
|
||||
IN UINT cPlanes,
|
||||
IN UINT cBitsPixel,
|
||||
IN OPTIONAL PVOID pvBits);
|
||||
|
||||
HBITMAP
|
||||
APIENTRY
|
||||
GreCreateBitmapEx(
|
||||
IN INT nWidth,
|
||||
IN INT nHeight,
|
||||
IN ULONG cjWidthBytes,
|
||||
IN ULONG iFormat,
|
||||
IN USHORT fjBitmap,
|
||||
IN ULONG cjBits,
|
||||
IN OPTIONAL PVOID pvBits,
|
||||
IN FLONG flags);
|
||||
|
||||
HBITMAP
|
||||
FASTCALL
|
||||
GreCreateDIBitmapInternal(
|
||||
IN HDC hDc,
|
||||
IN INT cx,
|
||||
IN INT cy,
|
||||
IN DWORD fInit,
|
||||
IN OPTIONAL LPBYTE pjInit,
|
||||
IN OPTIONAL PBITMAPINFO pbmi,
|
||||
IN DWORD iUsage,
|
||||
IN FLONG fl,
|
||||
IN HANDLE hcmXform);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#pragma once
|
||||
#ifndef __WIN32K_DC_H
|
||||
#define __WIN32K_DC_H
|
||||
|
||||
typedef struct _DC *PDC;
|
||||
|
||||
|
@ -22,6 +23,30 @@ typedef struct _DC *PDC;
|
|||
/* fl */
|
||||
#define DC_FL_PAL_BACK 1
|
||||
|
||||
#define DC_DISPLAY 1
|
||||
#define DC_DIRECT 2
|
||||
#define DC_CANCELED 4
|
||||
#define DC_PERMANANT 0x08
|
||||
#define DC_DIRTY_RAO 0x10
|
||||
#define DC_ACCUM_WMGR 0x20
|
||||
#define DC_ACCUM_APP 0x40
|
||||
#define DC_RESET 0x80
|
||||
#define DC_SYNCHRONIZEACCESS 0x100
|
||||
#define DC_EPSPRINTINGESCAPE 0x200
|
||||
#define DC_TEMPINFODC 0x400
|
||||
#define DC_FULLSCREEN 0x800
|
||||
#define DC_IN_CLONEPDEV 0x1000
|
||||
#define DC_REDIRECTION 0x2000
|
||||
#define DC_SHAREACCESS 0x4000
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DCTYPE_DIRECT = 0,
|
||||
DCTYPE_MEMORY = 1,
|
||||
DCTYPE_INFO = 2,
|
||||
} DCTYPE;
|
||||
|
||||
|
||||
/* Type definitions ***********************************************************/
|
||||
|
||||
typedef struct _ROS_DC_INFO
|
||||
|
@ -29,7 +54,7 @@ typedef struct _ROS_DC_INFO
|
|||
HRGN hClipRgn; /* Clip region (may be 0) */
|
||||
HRGN hGCClipRgn; /* GC clip region (ClipRgn AND VisRgn) */
|
||||
|
||||
CLIPOBJ *CombinedClip; /* Use XCLIPOBJ in DC. */
|
||||
CLIPOBJ *CombinedClip;
|
||||
|
||||
UNICODE_STRING DriverName;
|
||||
|
||||
|
@ -136,13 +161,12 @@ extern PDC defaultDCstate;
|
|||
|
||||
NTSTATUS FASTCALL InitDcImpl(VOID);
|
||||
PPDEVOBJ FASTCALL IntEnumHDev(VOID);
|
||||
HDC FASTCALL DC_AllocDC(PUNICODE_STRING Driver);
|
||||
PDC NTAPI DC_AllocDcWithHandle();
|
||||
VOID FASTCALL DC_InitDC(HDC DCToInit);
|
||||
HDC FASTCALL DC_FindOpenDC(PUNICODE_STRING Driver);
|
||||
VOID FASTCALL DC_AllocateDcAttr(HDC);
|
||||
VOID FASTCALL DC_FreeDcAttr(HDC);
|
||||
BOOL INTERNAL_CALL DC_Cleanup(PVOID ObjectBody);
|
||||
BOOL FASTCALL DC_SetOwnership(HDC DC, PEPROCESS Owner);
|
||||
BOOL FASTCALL DC_SetOwnership(HDC hDC, PEPROCESS Owner);
|
||||
VOID FASTCALL DC_LockDisplay(HDC);
|
||||
VOID FASTCALL DC_UnlockDisplay(HDC);
|
||||
BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL);
|
||||
|
@ -155,10 +179,16 @@ VOID FASTCALL DC_vUpdateFillBrush(PDC pdc);
|
|||
VOID FASTCALL DC_vUpdateLineBrush(PDC pdc);
|
||||
VOID FASTCALL DC_vUpdateTextBrush(PDC pdc);
|
||||
VOID FASTCALL DC_vUpdateBackgroundBrush(PDC pdc);
|
||||
VOID FASTCALL DC_vFinishBlit(PDC pdc1, PDC pdc2);
|
||||
VOID FASTCALL DC_vPrepareDCsForBlit(PDC pdc1, RECT rc1, PDC pdc2, RECT rc2);
|
||||
|
||||
VOID NTAPI DC_vRestoreDC(IN PDC pdc, INT iSaveLevel);
|
||||
|
||||
BOOL FASTCALL DCU_SyncDcAttrtoUser(PDC);
|
||||
BOOL FASTCALL DCU_SynchDcAttrtoUser(HDC);
|
||||
VOID FASTCALL DCU_SetDcUndeletable(HDC);
|
||||
VOID NTAPI DC_vFreeDcAttr(PDC pdc);
|
||||
VOID NTAPI DC_vInitDc(PDC pdc, DCTYPE dctype, PPDEVOBJ ppdev);
|
||||
|
||||
COLORREF FASTCALL IntGdiSetBkColor (HDC hDC, COLORREF Color);
|
||||
INT FASTCALL IntGdiSetBkMode(HDC hDC, INT backgroundMode);
|
||||
|
@ -174,12 +204,9 @@ VOID FASTCALL IntGdiUnreferencePdev(PPDEVOBJ pPDev, DWORD CleanUpType);
|
|||
HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC);
|
||||
BOOL FASTCALL IntGdiCleanDC(HDC hDC);
|
||||
VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS);
|
||||
INT FASTCALL IntGdiGetDeviceCaps(PDC,INT);
|
||||
BOOL FASTCALL MakeInfoDC(PDC,BOOL);
|
||||
BOOL FASTCALL IntSetDefaultRegion(PDC);
|
||||
|
||||
extern PPDEVOBJ pPrimarySurface;
|
||||
|
||||
VOID
|
||||
FORCEINLINE
|
||||
DC_vSelectSurface(PDC pdc, PSURFACE psurfNew)
|
||||
|
@ -228,5 +255,6 @@ DC_vSelectPalette(PDC pdc, PPALETTE ppal)
|
|||
pdc->dclevel.ppal = ppal;
|
||||
}
|
||||
|
||||
BOOL FASTCALL IntPrepareDriverIfNeeded(VOID);
|
||||
extern PDEVOBJ PrimarySurface;
|
||||
extern PBRUSH pbrDefaultBrush ;
|
||||
|
||||
#endif /* not __WIN32K_DC_H */
|
||||
|
|
57
subsystems/win32/win32k/include/device.h
Normal file
57
subsystems/win32/win32k/include/device.h
Normal file
|
@ -0,0 +1,57 @@
|
|||
|
||||
//#define _PDEVOBJ _PDEVOBJ2
|
||||
//#define PDEVOBJ PDEVOBJ2
|
||||
//#define PPDEVOBJ PPDEVOBJ2
|
||||
|
||||
//typedef struct _PDEVOBJ *PPDEVOBJ;
|
||||
|
||||
#define TAG_GDEV 'gdev'
|
||||
|
||||
VOID
|
||||
APIENTRY
|
||||
EngFileWrite(
|
||||
IN PFILE_OBJECT pFileObject,
|
||||
IN PVOID lpBuffer,
|
||||
IN SIZE_T nLength,
|
||||
IN PSIZE_T lpBytesWritten);
|
||||
|
||||
PGRAPHICS_DEVICE
|
||||
NTAPI
|
||||
EngpFindGraphicsDevice(
|
||||
PUNICODE_STRING pustrDevice,
|
||||
DWORD iDevNum,
|
||||
DWORD dwFlags);
|
||||
|
||||
PGRAPHICS_DEVICE
|
||||
NTAPI
|
||||
EngpRegisterGraphicsDevice(
|
||||
PUNICODE_STRING pustrDeviceName,
|
||||
PUNICODE_STRING pustrDiplayDrivers,
|
||||
PUNICODE_STRING pustrDescription,
|
||||
PDEVMODEW pdmDefault);
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
InitDeviceImpl();
|
||||
|
||||
BOOL
|
||||
FASTCALL
|
||||
DC_AllocDcAttr(PDC pdc);
|
||||
|
||||
//#define KeRosDumpStackFrames(Frames, Count) KdSystemDebugControl(TAG('R', 'o', 's', 'D'), (PVOID)Frames, Count, NULL, 0, NULL, KernelMode)
|
||||
NTSYSAPI ULONG APIENTRY RtlWalkFrameChain(OUT PVOID *Callers, IN ULONG Count, IN ULONG Flags);
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
PDEVOBJ_bSwitchMode(
|
||||
PPDEVOBJ ppdev,
|
||||
PDEVMODEW pdm);
|
||||
|
||||
PDEVMODEW
|
||||
NTAPI
|
||||
PDEVOBJ_pdmMatchDevMode(
|
||||
PPDEVOBJ ppdev,
|
||||
PDEVMODEW pdm);
|
||||
|
||||
extern PGRAPHICS_DEVICE gpPrimaryGraphicsDevice;
|
||||
extern PGRAPHICS_DEVICE gpVgaGraphicsDevice;
|
|
@ -5,15 +5,17 @@
|
|||
INT FASTCALL
|
||||
DIB_BitmapInfoSize (const BITMAPINFO * info, WORD coloruse);
|
||||
HBITMAP APIENTRY
|
||||
DIB_CreateDIBSection (PDC dc, PBITMAPINFO bmi, UINT usage, LPVOID *bits, HANDLE section, DWORD offset, DWORD ovr_pitch);
|
||||
INT APIENTRY
|
||||
DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, PLONG width, PLONG height, PWORD planes, PWORD bpp, PLONG compr, PLONG size );
|
||||
DIB_CreateDIBSection (PDC dc, CONST BITMAPINFO *bmi, UINT usage, LPVOID *bits, HANDLE section, DWORD offset, DWORD ovr_pitch);
|
||||
int FASTCALL
|
||||
DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, LONG *width,
|
||||
LONG *height, WORD *planes, WORD *bpp, DWORD *compr, DWORD *size );
|
||||
INT APIENTRY
|
||||
DIB_GetDIBImageBytes (INT width, INT height, INT depth);
|
||||
INT FASTCALL
|
||||
DIB_GetDIBWidthBytes (INT width, INT depth);
|
||||
RGBQUAD * FASTCALL
|
||||
DIB_MapPaletteColors(PDC dc, CONST BITMAPINFO* lpbmi);
|
||||
HPALETTE FASTCALL
|
||||
DIB_MapPaletteColors(PPALETTE ppal, CONST BITMAPINFO* lpbmi);
|
||||
|
||||
HPALETTE FASTCALL
|
||||
BuildDIBPalette (CONST BITMAPINFO *bmi, PINT paletteType);
|
||||
BuildDIBPalette (CONST BITMAPINFO *bmi);
|
||||
|
||||
BITMAPINFO* FASTCALL DIB_ConvertBitmapInfo(CONST BITMAPINFO* bmi, DWORD Usage);
|
||||
VOID FASTCALL DIB_FreeConvertedBitmapInfo(BITMAPINFO* converted, BITMAPINFO* orig);
|
|
@ -21,3 +21,19 @@ IntEngWindowChanged(
|
|||
VOID FASTCALL IntGdiAcquireSemaphore ( HSEMAPHORE hsem );
|
||||
VOID FASTCALL IntGdiReleaseSemaphore ( HSEMAPHORE hsem );
|
||||
ULONGLONG APIENTRY EngGetTickCount(VOID);
|
||||
|
||||
BOOL
|
||||
APIENTRY
|
||||
EngFreeSectionMem(
|
||||
IN PVOID pvSection OPTIONAL,
|
||||
IN PVOID pvMappedBase OPTIONAL);
|
||||
|
||||
PVOID
|
||||
APIENTRY
|
||||
EngAllocSectionMem(
|
||||
OUT PVOID *ppvSection,
|
||||
IN ULONG fl,
|
||||
IN SIZE_T cjSize,
|
||||
IN ULONG ulTag);
|
||||
|
||||
VOID DecompressBitmap(SIZEL Size, BYTE *CompressedBits, BYTE *UncompressedBits, LONG Delta, ULONG iFormat);
|
||||
|
|
|
@ -71,6 +71,7 @@ VOID INTERNAL_CALL GDIOBJ_FreeObj (POBJ pObj, UCHAR ObjectType);
|
|||
BOOL INTERNAL_CALL GDIOBJ_FreeObjByHandle (HGDIOBJ hObj, DWORD ObjectType);
|
||||
PGDIOBJ INTERNAL_CALL GDIOBJ_LockObj (HGDIOBJ hObj, DWORD ObjectType);
|
||||
PGDIOBJ INTERNAL_CALL GDIOBJ_ShareLockObj (HGDIOBJ hObj, DWORD ObjectType);
|
||||
VOID INTERNAL_CALL GDIOBJ_LockMultipleObjs(ULONG ulCount, IN HGDIOBJ* ahObj, OUT PGDIOBJ* apObj);
|
||||
|
||||
PVOID INTERNAL_CALL GDI_MapHandleTable(PSECTION_OBJECT SectionObject, PEPROCESS Process);
|
||||
|
||||
|
|
|
@ -1,17 +1,10 @@
|
|||
#pragma once
|
||||
|
||||
#define HOOK_THREAD_REFERENCED (0x1)
|
||||
#define NB_HOOKS (WH_MAXHOOK-WH_MINHOOK+1)
|
||||
#define HOOKID_TO_INDEX(HookId) (HookId - WH_MINHOOK)
|
||||
#define HOOKID_TO_FLAG(HookId) (1 << ((HookId) + 1))
|
||||
#define ISITHOOKED(HookId) (((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks & HOOKID_TO_FLAG(HookId))
|
||||
|
||||
typedef struct tagHOOKTABLE
|
||||
{
|
||||
LIST_ENTRY Hooks[NB_HOOKS]; /* array of hook chains */
|
||||
UINT Counts[NB_HOOKS]; /* use counts for each hook chain */
|
||||
} HOOKTABLE, *PHOOKTABLE;
|
||||
|
||||
typedef struct tagEVENTHOOK
|
||||
{
|
||||
THROBJHEAD head;
|
||||
|
@ -32,11 +25,22 @@ typedef struct tagEVENTTABLE
|
|||
UINT Counts;
|
||||
} EVENTTABLE, *PEVENTTABLE;
|
||||
|
||||
typedef struct _NOTIFYEVENT
|
||||
{
|
||||
DWORD event;
|
||||
LONG idObject;
|
||||
LONG idChild;
|
||||
DWORD flags;
|
||||
} NOTIFYEVENT, *PNOTIFYEVENT;
|
||||
|
||||
LRESULT FASTCALL co_CallHook(INT HookId, INT Code, WPARAM wParam, LPARAM lParam);
|
||||
LRESULT FASTCALL co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam);
|
||||
LRESULT FASTCALL co_EVENT_CallEvents(DWORD, HWND, UINT_PTR, LONG_PTR);
|
||||
VOID FASTCALL HOOK_DestroyThreadHooks(PETHREAD Thread);
|
||||
VOID FASTCALL EVENT_DestroyThreadEvents(PETHREAD Thread);
|
||||
PHOOK FASTCALL IntGetHookObject(HHOOK);
|
||||
PHOOK FASTCALL IntGetNextHook(PHOOK Hook);
|
||||
LRESULT FASTCALL UserCallNextHookEx( PHOOK pHook, int Code, WPARAM wParam, LPARAM lParam, BOOL Ansi);
|
||||
BOOL FASTCALL IntUnhookWindowsHook(int,HOOKPROC);
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -45,7 +45,7 @@ IntEngLineTo(SURFOBJ *Surface,
|
|||
MIX mix);
|
||||
|
||||
BOOL APIENTRY
|
||||
IntEngBitBltEx(SURFOBJ *DestObj,
|
||||
IntEngBitBlt(SURFOBJ *DestObj,
|
||||
SURFOBJ *SourceObj,
|
||||
SURFOBJ *Mask,
|
||||
CLIPOBJ *ClipRegion,
|
||||
|
@ -55,14 +55,7 @@ IntEngBitBltEx(SURFOBJ *DestObj,
|
|||
POINTL *MaskOrigin,
|
||||
BRUSHOBJ *Brush,
|
||||
POINTL *BrushOrigin,
|
||||
ROP4 Rop4,
|
||||
BOOL RemoveMouse);
|
||||
#define IntEngBitBlt(DestObj, SourceObj, Mask, ClipRegion, ColorTranslation, \
|
||||
DestRect, SourcePoint, MaskOrigin, Brush, BrushOrigin, \
|
||||
Rop4) \
|
||||
IntEngBitBltEx((DestObj), (SourceObj), (Mask), (ClipRegion), \
|
||||
(ColorTranslation), (DestRect), (SourcePoint), \
|
||||
(MaskOrigin), (Brush), (BrushOrigin), (Rop4), TRUE)
|
||||
ROP4 Rop4);
|
||||
|
||||
BOOL APIENTRY
|
||||
IntEngStretchBlt(SURFOBJ *DestObj,
|
||||
|
|
|
@ -167,9 +167,6 @@ IntGetSysColor(INT nIndex);
|
|||
|
||||
/* Other Stuff */
|
||||
|
||||
INT FASTCALL
|
||||
IntGdiGetDeviceCaps(PDC dc, INT Index);
|
||||
|
||||
INT
|
||||
FASTCALL
|
||||
IntGdiEscape(PDC dc,
|
||||
|
@ -186,14 +183,6 @@ IntEnumDisplaySettings(
|
|||
IN OUT LPDEVMODEW pDevMode,
|
||||
IN DWORD dwFlags);
|
||||
|
||||
LONG
|
||||
FASTCALL
|
||||
IntChangeDisplaySettings(
|
||||
IN PUNICODE_STRING pDeviceName OPTIONAL,
|
||||
IN LPDEVMODEW pDevMode,
|
||||
IN DWORD dwflags,
|
||||
IN PVOID lParam OPTIONAL);
|
||||
|
||||
HBITMAP
|
||||
FASTCALL
|
||||
IntCreateCompatibleBitmap(PDC Dc,
|
||||
|
|
86
subsystems/win32/win32k/include/ldevobj.h
Normal file
86
subsystems/win32/win32k/include/ldevobj.h
Normal file
|
@ -0,0 +1,86 @@
|
|||
|
||||
#ifdef __GNUC__
|
||||
/* Hack, for bug in ld. Will be removed soon. */
|
||||
#define __ImageBase _image_base__
|
||||
#endif
|
||||
extern IMAGE_DOS_HEADER __ImageBase;
|
||||
|
||||
|
||||
#define TAG_LDEV 'Gldv'
|
||||
|
||||
#define GDI_ENGINE_VERSION DDI_DRIVER_VERSION_NT5_01
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LDEV_DEVICE_DISPLAY = 1,
|
||||
LDEV_DEVICE_PRINTER = 2,
|
||||
LDEV_DEVICE_META = 3,
|
||||
LDEV_DEVICE_MIRROR = 4,
|
||||
LDEV_IMAGE = 5,
|
||||
LDEV_FONT = 6,
|
||||
} LDEVTYPE;
|
||||
|
||||
typedef struct _LDEVOBJ
|
||||
{
|
||||
struct _LDEVOBJ *pldevNext;
|
||||
struct _LDEVOBJ *pldevPrev;
|
||||
SYSTEM_GDI_DRIVER_INFORMATION *pGdiDriverInfo;
|
||||
LDEVTYPE ldevtype;
|
||||
ULONG cRefs;
|
||||
ULONG ulDriverVersion;
|
||||
|
||||
union
|
||||
{
|
||||
PVOID apfn[INDEX_LAST];
|
||||
DRIVER_FUNCTIONS pfn;
|
||||
};
|
||||
|
||||
} LDEVOBJ, *PLDEVOBJ;
|
||||
|
||||
extern PLDEVOBJ gpldevHead;
|
||||
extern HSEMAPHORE ghsemDriverMgmt;
|
||||
|
||||
PLDEVOBJ
|
||||
NTAPI
|
||||
LDEVOBJ_pldevLoadImage(
|
||||
PUNICODE_STRING pusPathName,
|
||||
LDEVTYPE ldevtype);
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
LDEVOBJ_bLoadDriver(
|
||||
IN PLDEVOBJ pldev);
|
||||
|
||||
PVOID
|
||||
NTAPI
|
||||
LDEVOBJ_pvFindImageProcAddress(
|
||||
IN PLDEVOBJ pldev,
|
||||
IN LPSTR lpProcName);
|
||||
|
||||
PDEVMODEINFO
|
||||
NTAPI
|
||||
LDEVOBJ_pdmiGetModes(
|
||||
PLDEVOBJ pldev,
|
||||
HANDLE hDriver);
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
InitLDEVImpl();
|
||||
|
||||
PLDEVOBJ
|
||||
APIENTRY
|
||||
EngLoadImageEx(
|
||||
LPWSTR pwszDriverName,
|
||||
ULONG ldevtype);
|
||||
|
||||
PLDEVOBJ
|
||||
NTAPI
|
||||
EngGetLDEV(
|
||||
PDEVMODEW pdm);
|
||||
|
||||
NTSTATUS
|
||||
APIENTRY
|
||||
DriverEntry (
|
||||
IN PDRIVER_OBJECT DriverObject,
|
||||
IN PUNICODE_STRING RegistryPath);
|
||||
|
|
@ -29,6 +29,33 @@ VOID FASTCALL IntUserManualGuiCheck(LONG Check);
|
|||
PVOID APIENTRY HackSecureVirtualMemory(IN PVOID,IN SIZE_T,IN ULONG,OUT PVOID *);
|
||||
VOID APIENTRY HackUnsecureVirtualMemory(IN PVOID);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
RegOpenKey(
|
||||
LPCWSTR pwszKeyName,
|
||||
PHKEY phkey);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
RegQueryValue(
|
||||
IN HKEY hkey,
|
||||
IN PCWSTR pwszValueName,
|
||||
IN ULONG ulType,
|
||||
OUT PVOID pvData,
|
||||
IN OUT PULONG pcbValue);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
RegWriteSZ(HKEY hkey, PWSTR pwszValue, PWSTR pwszData);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
RegWriteDWORD(HKEY hkey, PWSTR pwszValue, DWORD dwData);
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
RegReadDWORD(HKEY hkey, PWSTR pwszValue, PDWORD pdwData);
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
RegReadUserSetting(
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
#include <include/winsta.h>
|
||||
|
||||
INT INTERNAL_CALL MouseSafetyOnDrawStart(SURFOBJ *SurfObj, LONG HazardX1, LONG HazardY1, LONG HazardX2, LONG HazardY2);
|
||||
INT INTERNAL_CALL MouseSafetyOnDrawEnd(SURFOBJ *SurfObj);
|
||||
INT INTERNAL_CALL MouseSafetyOnDrawStart(PPDEVOBJ ppdev, LONG HazardX1, LONG HazardY1, LONG HazardX2, LONG HazardY2);
|
||||
INT INTERNAL_CALL MouseSafetyOnDrawEnd(PPDEVOBJ ppdev);
|
||||
|
||||
#ifndef XBUTTON1
|
||||
#define XBUTTON1 (0x01)
|
||||
|
|
|
@ -87,9 +87,6 @@ typedef struct _USER_MESSAGE_QUEUE
|
|||
/* Caret information for this queue */
|
||||
PTHRDCARETINFO CaretInfo;
|
||||
|
||||
/* Window hooks */
|
||||
PHOOKTABLE Hooks;
|
||||
|
||||
/* queue state tracking */
|
||||
WORD WakeMask;
|
||||
WORD QueueBits;
|
||||
|
@ -212,9 +209,6 @@ BOOL APIENTRY IntInitMessagePumpHook();
|
|||
BOOL APIENTRY IntUninitMessagePumpHook();
|
||||
#define MAKE_LONG(x, y) ((((y) & 0xFFFF) << 16) | ((x) & 0xFFFF))
|
||||
|
||||
PHOOKTABLE FASTCALL MsqGetHooks(PUSER_MESSAGE_QUEUE Queue);
|
||||
VOID FASTCALL MsqSetHooks(PUSER_MESSAGE_QUEUE Queue, PHOOKTABLE Hooks);
|
||||
|
||||
LPARAM FASTCALL MsqSetMessageExtraInfo(LPARAM lParam);
|
||||
LPARAM FASTCALL MsqGetMessageExtraInfo(VOID);
|
||||
VOID APIENTRY MsqRemoveWindowMessagesFromQueue(PVOID pWindow); /* F*(&$ headers, will be gone in the rewrite! */
|
||||
|
|
|
@ -40,7 +40,7 @@ typedef struct _PALETTE
|
|||
PALOBJ PalObj;
|
||||
XLATEOBJ *logicalToSystem;
|
||||
HPALETTE Self;
|
||||
ULONG Mode; // PAL_INDEXED, PAL_BITFIELDS, PAL_RGB, PAL_BGR
|
||||
FLONG flFlags; // PAL_INDEXED, PAL_BITFIELDS, PAL_RGB, PAL_BGR
|
||||
ULONG NumColors;
|
||||
PALETTEENTRY *IndexedColors;
|
||||
ULONG RedMask;
|
||||
|
@ -52,8 +52,8 @@ typedef struct _PALETTE
|
|||
HDEV hPDev;
|
||||
} PALETTE, *PPALETTE;
|
||||
|
||||
extern PALETTE gpalRGB, gpalBGR, gpalMono;
|
||||
|
||||
extern PALETTE gpalRGB, gpalBGR, gpalMono, gpalRGB555, gpalRGB565, *gppalDefault;
|
||||
extern PPALETTE appalSurfaceDefault[];
|
||||
|
||||
HPALETTE FASTCALL PALETTE_AllocPalette(ULONG Mode,
|
||||
ULONG NumColors,
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
#include <drivers/directx/directxint.h>
|
||||
#ifndef __WIN32K_PDEVOBJ_H
|
||||
#define __WIN32K_PDEVOBJ_H
|
||||
|
||||
/* PDEVOBJ flags */
|
||||
#define PDEV_DISPLAY 0x00000001 /* Display device */
|
||||
|
@ -37,6 +36,21 @@ typedef struct _GDIPOINTER /* should stay private to ENG? No, part of PDEVOBJ ak
|
|||
RECTL Exclude; /* required publicly for SPS_ACCEPT_EXCLUDE */
|
||||
} GDIPOINTER, *PGDIPOINTER;
|
||||
|
||||
typedef struct _DEVMODEINFO
|
||||
{
|
||||
struct _DEVMODEINFO *pdmiNext;
|
||||
struct _LDEVOBJ *pldev;
|
||||
ULONG cbdevmode;
|
||||
DEVMODEW adevmode[1];
|
||||
} DEVMODEINFO, *PDEVMODEINFO;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwFlags;
|
||||
PDEVMODEW pdm;
|
||||
|
||||
} DEVMODEENTRY, *PDEVMODEENTRY;
|
||||
|
||||
typedef struct _GRAPHICS_DEVICE
|
||||
{
|
||||
WCHAR szNtDeviceName[CCHDEVICENAME/2];
|
||||
|
@ -48,15 +62,17 @@ typedef struct _GRAPHICS_DEVICE
|
|||
DWORD hkClassDriverConfig;
|
||||
DWORD StateFlags; /* See DISPLAY_DEVICE_* */
|
||||
ULONG cbdevmodeInfo;
|
||||
PVOID devmodeInfo;
|
||||
DWORD cbdevmodeInfo1;
|
||||
PVOID devmodeInfo1;
|
||||
LPWSTR pwszDeviceNames;
|
||||
PDEVMODEINFO pdevmodeInfo;
|
||||
ULONG cDevModes;
|
||||
PDEVMODEENTRY pDevModeList;
|
||||
LPWSTR pDiplayDrivers;
|
||||
LPWSTR pwszDescription;
|
||||
DWORD dwUnknown;
|
||||
PVOID pUnknown;
|
||||
PFILE_OBJECT FileObject;
|
||||
DWORD ProtocolType;
|
||||
ULONG iDefaultMode;
|
||||
ULONG iCurrentMode;
|
||||
} GRAPHICS_DEVICE, *PGRAPHICS_DEVICE;
|
||||
|
||||
typedef struct _PDEVOBJ
|
||||
|
@ -64,8 +80,8 @@ typedef struct _PDEVOBJ
|
|||
BASEOBJECT BaseObject;
|
||||
|
||||
struct _PDEVOBJ * ppdevNext;
|
||||
INT cPdevRefs;
|
||||
INT cPdevOpenRefs;
|
||||
LONG cPdevRefs;
|
||||
LONG cPdevOpenRefs;
|
||||
struct _PDEVOBJ * ppdevParent;
|
||||
FLONG flFlags; // flags
|
||||
// FLONG flAccelerated;
|
||||
|
@ -98,17 +114,17 @@ typedef struct _PDEVOBJ
|
|||
// PFN_DrvSetPalette pfnDrvSetPalette;
|
||||
// PFN_DrvNotify pfnDrvNotify;
|
||||
// ULONG TagSig;
|
||||
// PLDEVOBJ pldev;
|
||||
struct _LDEVOBJ * pldev;
|
||||
DHPDEV dhpdev; /* DHPDEV for device. */
|
||||
PVOID ppalSurf; /* PEPALOBJ/PPALETTE for this device. */
|
||||
struct _PALETTE* ppalSurf; /* PEPALOBJ/PPALETTE for this device. */
|
||||
DEVINFO devinfo;
|
||||
GDIINFO gdiinfo;
|
||||
HSURF pSurface; /* SURFACE for this device., FIXME: PSURFACE */
|
||||
PSURFACE pSurface; /* SURFACE for this device. */
|
||||
// HANDLE hSpooler; /* Handle to spooler, if spooler dev driver. */
|
||||
// PVOID pDesktopId;
|
||||
PGRAPHICS_DEVICE pGraphicsDevice;
|
||||
POINTL ptlOrigion;
|
||||
PVOID pdmwDev; /* Ptr->DEVMODEW.dmSize + dmDriverExtra == alloc size. */
|
||||
PDEVMODEW pdmwDev; /* Ptr->DEVMODEW.dmSize + dmDriverExtra == alloc size. */
|
||||
// DWORD Unknown3;
|
||||
FLONG DxDd_Flags; /* DxDD active status flags. */
|
||||
// LONG devAttr;
|
||||
|
@ -117,15 +133,12 @@ typedef struct _PDEVOBJ
|
|||
union
|
||||
{
|
||||
DRIVER_FUNCTIONS DriverFunctions;
|
||||
DRIVER_FUNCTIONS pfn;
|
||||
PVOID apfn[INDEX_LAST]; // B8C 0x0598
|
||||
};
|
||||
|
||||
/* ros specific */
|
||||
ULONG DxDd_nCount;
|
||||
ULONG DisplayNumber;
|
||||
DEVMODEW DMW;
|
||||
PFILE_OBJECT VideoFileObject;
|
||||
BOOLEAN PreparedDriver;
|
||||
GDIPOINTER Pointer;
|
||||
/* Stuff to keep track of software cursors; win32k gdi part */
|
||||
UINT SafetyRemoveLevel; /* at what level was the cursor removed?
|
||||
|
@ -134,13 +147,47 @@ typedef struct _PDEVOBJ
|
|||
struct _EDD_DIRECTDRAW_GLOBAL * pEDDgpl;
|
||||
} PDEVOBJ, *PPDEVOBJ;
|
||||
|
||||
/* PDEV and EDDX extra data container.*/
|
||||
typedef struct _PDEVEDD
|
||||
{
|
||||
PDEVOBJ pdevobj;
|
||||
EDD_DIRECTDRAW_GLOBAL EDDgpl;
|
||||
} PDEVEDD, *PPDEVEDD;
|
||||
/* Globals ********************************************************************/
|
||||
|
||||
PSIZEL FASTCALL PDEV_sizl(PPDEVOBJ, PSIZEL);
|
||||
extern PPDEVOBJ gppdevPrimary;
|
||||
#define pPrimarySurface gppdevPrimary
|
||||
|
||||
extern ULONG gdwDirectDrawContext;
|
||||
|
||||
/* Function prototypes ********************************************************/
|
||||
|
||||
PPDEVOBJ
|
||||
NTAPI
|
||||
EngpGetPDEV(PUNICODE_STRING pustrDevice);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
PDEVOBJ_vRelease(PPDEVOBJ ppdev);
|
||||
|
||||
PSURFACE
|
||||
NTAPI
|
||||
PDEVOBJ_pSurface(
|
||||
PPDEVOBJ ppdev);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
PDEVOBJ_vGetDeviceCaps(
|
||||
PPDEVOBJ ppdev,
|
||||
PDEVCAPS pDevCaps);
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
InitPDEVImpl();
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
InitLDEVImpl();
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
InitDeviceImpl();
|
||||
|
||||
PSIZEL
|
||||
FASTCALL
|
||||
PDEVOBJ_sizl(PPDEVOBJ, PSIZEL);
|
||||
|
||||
#endif /* !__WIN32K_PDEVOBJ_H */
|
||||
|
|
|
@ -14,7 +14,7 @@ typedef struct _ROSRGNDATA
|
|||
|
||||
RGNDATAHEADER rdh;
|
||||
RECTL *Buffer;
|
||||
} ROSRGNDATA, *PROSRGNDATA, *LPROSRGNDATA;
|
||||
} ROSRGNDATA, *PROSRGNDATA, *LPROSRGNDATA, REGION, *PREGION;
|
||||
|
||||
|
||||
/* Functions ******************************************************************/
|
||||
|
|
|
@ -8,48 +8,88 @@
|
|||
/* GDI surface object */
|
||||
typedef struct _SURFACE
|
||||
{
|
||||
BASEOBJECT BaseObject;
|
||||
BASEOBJECT BaseObject;
|
||||
|
||||
SURFOBJ SurfObj;
|
||||
FLONG flHooks;
|
||||
FLONG flFlags;
|
||||
struct _PALETTE *ppal;
|
||||
SURFOBJ SurfObj;
|
||||
//XDCOBJ * pdcoAA;
|
||||
FLONG flags;
|
||||
struct _PALETTE *ppal;
|
||||
//UINT unk_050;
|
||||
|
||||
union
|
||||
{
|
||||
HANDLE hSecureUMPD; // if UMPD_SURFACE set
|
||||
HANDLE hMirrorParent;// if MIRROR_SURFACE set
|
||||
HANDLE hDDSurface; // if DIRECTDRAW_SURFACE set
|
||||
};
|
||||
union
|
||||
{
|
||||
HANDLE hSecureUMPD; // if UMPD_SURFACE set
|
||||
HANDLE hMirrorParent;// if MIRROR_SURFACE set
|
||||
HANDLE hDDSurface; // if DIRECTDRAW_SURFACE set
|
||||
};
|
||||
|
||||
SIZEL dimension; /* For SetBitmapDimension(), do NOT use
|
||||
SIZEL sizlDim; /* For SetBitmapDimension(), do NOT use
|
||||
to get width/height of bitmap, use
|
||||
bitmap.bmWidth/bitmap.bmHeight for
|
||||
that */
|
||||
|
||||
HDC hDC; // Doc in "Undocumented Windows", page 546, seems to be supported with XP.
|
||||
ULONG cRef; // 0x064
|
||||
HPALETTE hpalHint;
|
||||
|
||||
/* For device-independent bitmaps: */
|
||||
HANDLE hDIBSection;
|
||||
HANDLE hSecure;
|
||||
DWORD dwOffset;
|
||||
HDC hdc; // Doc in "Undocumented Windows", page 546, seems to be supported with XP.
|
||||
ULONG cRef;
|
||||
HPALETTE hpalHint;
|
||||
|
||||
/* For device-independent bitmaps: */
|
||||
HANDLE hDIBSection;
|
||||
HANDLE hSecure;
|
||||
DWORD dwOffset;
|
||||
//UINT unk_078;
|
||||
|
||||
/* reactos specific */
|
||||
PFAST_MUTEX BitsLock; /* You need to hold this lock before you touch
|
||||
the actual bits in the bitmap */
|
||||
HPALETTE hDIBPalette;
|
||||
DWORD dsBitfields[3]; // hack, should probably use palette instead
|
||||
DWORD biClrUsed;
|
||||
DWORD biClrImportant;
|
||||
DWORD biClrImportant;
|
||||
} SURFACE, *PSURFACE;
|
||||
|
||||
#define BITMAPOBJ_IS_APIBITMAP 0x1
|
||||
// flags field:
|
||||
//#define HOOK_BITBLT 0x00000001
|
||||
//#define HOOK_STRETCHBLT 0x00000002
|
||||
//#define HOOK_PLGBLT 0x00000004
|
||||
//#define HOOK_TEXTOUT 0x00000008
|
||||
//#define HOOK_PAINT 0x00000010
|
||||
//#define HOOK_STROKEPATH 0x00000020
|
||||
//#define HOOK_FILLPATH 0x00000040
|
||||
//#define HOOK_STROKEANDFILLPATH 0x00000080
|
||||
//#define HOOK_LINETO 0x00000100
|
||||
//#define SHAREACCESS_SURFACE 0x00000200
|
||||
//#define HOOK_COPYBITS 0x00000400
|
||||
//#define REDIRECTION_SURFACE 0x00000800 // ?
|
||||
//#define HOOK_MOVEPANNING 0x00000800
|
||||
//#define HOOK_SYNCHRONIZE 0x00001000
|
||||
//#define HOOK_STRETCHBLTROP 0x00002000
|
||||
//#define HOOK_SYNCHRONIZEACCESS 0x00004000
|
||||
//#define USE_DEVLOCK_SURFACE 0x00004000
|
||||
//#define HOOK_TRANSPARENTBLT 0x00008000
|
||||
//#define HOOK_ALPHABLEND 0x00010000
|
||||
//#define HOOK_GRADIENTFILL 0x00020000
|
||||
//#if (NTDDI_VERSION < 0x06000000)
|
||||
// #define HOOK_FLAGS 0x0003B5FF
|
||||
//#else
|
||||
// #define HOOK_FLAGS 0x0003B5EF
|
||||
//#endif
|
||||
#define UMPD_SURFACE 0x00040000
|
||||
#define MIRROR_SURFACE 0x00080000
|
||||
#define DIRECTDRAW_SURFACE 0x00100000
|
||||
#define DRIVER_CREATED_SURFACE 0x00200000
|
||||
#define ENG_CREATE_DEVICE_SURFACE 0x00400000
|
||||
#define DDB_SURFACE 0x00800000
|
||||
#define LAZY_DELETE_SURFACE 0x01000000
|
||||
#define BANDING_SURFACE 0x02000000
|
||||
#define API_BITMAP 0x04000000
|
||||
#define PALETTE_SELECT_SET 0x08000000
|
||||
#define UNREADABLE_SURFACE 0x10000000
|
||||
#define DYNAMIC_MODE_PALETTE 0x20000000
|
||||
#define ABORT_SURFACE 0x40000000
|
||||
#define PDEV_SURFACE 0x80000000
|
||||
|
||||
|
||||
#define BMF_DONT_FREE 0x100
|
||||
#define BMF_RLE_HACK 0x200
|
||||
|
||||
|
||||
/* Internal interface */
|
||||
|
||||
#define SURFACE_AllocSurface() ((PSURFACE) GDIOBJ_AllocObj(GDIObjType_SURF_TYPE))
|
||||
#define SURFACE_AllocSurfaceWithHandle() ((PSURFACE) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP))
|
||||
#define SURFACE_FreeSurface(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDIObjType_SURF_TYPE)
|
||||
#define SURFACE_FreeSurfaceByHandle(hBMObj) GDIOBJ_FreeObjByHandle((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP)
|
||||
|
@ -64,15 +104,31 @@ typedef struct _SURFACE
|
|||
#define SURFACE_ShareUnlockSurface(pBMObj) \
|
||||
GDIOBJ_ShareUnlockObjByPtr ((POBJ)pBMObj)
|
||||
|
||||
#define SURFACE_LockBitmapBits(pBMObj) ExEnterCriticalRegionAndAcquireFastMutexUnsafe((pBMObj)->BitsLock)
|
||||
#define SURFACE_UnlockBitmapBits(pBMObj) ExReleaseFastMutexUnsafeAndLeaveCriticalRegion((pBMObj)->BitsLock)
|
||||
|
||||
BOOL INTERNAL_CALL SURFACE_Cleanup(PVOID ObjectBody);
|
||||
BOOL INTERNAL_CALL SURFACE_InitBitsLock(SURFACE *pBMObj);
|
||||
void INTERNAL_CALL SURFACE_CleanupBitsLock(SURFACE *pBMObj);
|
||||
|
||||
PSURFACE
|
||||
NTAPI
|
||||
SURFACE_AllocSurface(
|
||||
IN ULONG iType,
|
||||
IN ULONG cx,
|
||||
IN ULONG cy,
|
||||
IN ULONG iFormat);
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
SURFACE_bSetBitmapBits(
|
||||
IN PSURFACE psurf,
|
||||
IN USHORT fjBitmap,
|
||||
IN ULONG ulWidth,
|
||||
IN PVOID pvBits OPTIONAL);
|
||||
|
||||
#define GDIDEV(SurfObj) ((PDEVOBJ *)((SurfObj)->hdev))
|
||||
#define GDIDEVFUNCS(SurfObj) ((PDEVOBJ *)((SurfObj)->hdev))->DriverFunctions
|
||||
|
||||
INT FASTCALL BitsPerFormat (ULONG Format);
|
||||
ULONG FASTCALL BitmapFormat (WORD Bits, DWORD Compression);
|
||||
extern UCHAR gajBitsPerFormat[];
|
||||
#define BitsPerFormat(Format) gajBitsPerFormat[Format]
|
||||
|
||||
#define WIDTH_BYTES_ALIGN32(cx, bpp) ((((cx) * (bpp) + 31) & ~31) >> 3)
|
||||
#define WIDTH_BYTES_ALIGN16(cx, bpp) ((((cx) * (bpp) + 15) & ~15) >> 3)
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue