Sync with trunk (r49303)

svn path=/branches/cmake-bringup/; revision=49307
This commit is contained in:
Jérôme Gardou 2010-10-27 15:52:24 +00:00
commit b2f64ac552
157 changed files with 10003 additions and 9064 deletions

View file

@ -2,47 +2,47 @@
[Section] [Section]
Name = Mozilla Firefox 3.6 Name = Mozilla Firefox 3.6
Version = 3.6.10 Version = 3.6.11
Licence = MPL/GPL/LGPL Licence = MPL/GPL/LGPL
Description = The most popular and one of the best free Web Browsers out there. Description = The most popular and one of the best free Web Browsers out there.
Size = 8.1M Size = 8.1M
Category = 5 Category = 5
URLSite = http://www.mozilla.com/en-US/ 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 CDPath = none
[Section.0407] [Section.0407]
Description = Der populärste und einer der besten freien Webbrowser. Description = Der populärste und einer der besten freien Webbrowser.
Size = 8.0M Size = 8.0M
URLSite = http://www.mozilla-europe.org/de/ 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] [Section.040a]
Description = El más popular y uno de los mejores navegadores web gratuitos que hay. Description = El más popular y uno de los mejores navegadores web gratuitos que hay.
Size = 8.0M Size = 8.0M
URLSite = http://www.mozilla-europe.org/es/ 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] [Section.0414]
Description = Mest populære og best også gratis nettleserene der ute. Description = Mest populære og best også gratis nettleserene der ute.
Size = 8.0M Size = 8.0M
URLSite = http://www.mozilla-europe.org/no/ 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] [Section.0415]
Description = Najpopularniejsza i jedna z najlepszych darmowych przeglądarek internetowych. Description = Najpopularniejsza i jedna z najlepszych darmowych przeglądarek internetowych.
Size = 8.8M Size = 8.8M
URLSite = http://www.mozilla-europe.org/pl/ 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] [Section.0419]
Description = Один из самых популярных и лучших бесплатных браузеров. Description = Один из самых популярных и лучших бесплатных браузеров.
Size = 8.4M Size = 8.4M
URLSite = http://www.mozilla-europe.org/ru/ 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] [Section.0422]
Description = Найпопулярніший та один з кращих безплатних веб-браузерів. Description = Найпопулярніший та один з кращих безплатних веб-браузерів.
Size = 8.4M Size = 8.4M
URLSite = http://www.mozilla-europe.org/uk/ 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

View file

@ -2,13 +2,13 @@
[Section] [Section]
Name = LibreOffice Name = LibreOffice
Version = 3.3.0 Beta 1 Version = 3.3.0 Beta 2
Licence = LGPL Licence = LGPL
Description = Former called OpenOffice. Open Source Office Suite. Description = Former called OpenOffice. Open Source Office Suite.
Size = 138.0MB Size = 318.0MB
Category = 6 Category = 6
URLSite = http://www.documentfoundation.org/ 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 CDPath = none
[Section.0407] [Section.0407]

View file

@ -2,13 +2,13 @@
[Section] [Section]
Name = Miranda IM Name = Miranda IM
Version = 0.9.5 Version = 0.9.8
Licence = GPL Licence = GPL
Description = Open source multiprotocol instant messaging application - May not work completely. Description = Open source multiprotocol instant messaging application - May not work completely.
Size = 2.2MB Size = 3.0MB
Category = 5 Category = 5
URLSite = http://www.miranda-im.org/ 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 CDPath = none
[Section.0407] [Section.0407]

View file

@ -2,13 +2,13 @@
[Section] [Section]
Name = mIRC Name = mIRC
Version = 7.1 Version = 7.14
Licence = Shareware Licence = Shareware
Description = The most popular client for the Internet Relay Chat (IRC). Description = The most popular client for the Internet Relay Chat (IRC).
Size = 1.8M Size = 2.0M
Category = 5 Category = 5
URLSite = http://www.mirc.com/ URLSite = http://www.mirc.com/
URLDownload = http://download.mirc.com/mirc71.exe URLDownload = http://download.mirc.com/mirc714.exe
CDPath = none CDPath = none
[Section.0407] [Section.0407]

View file

@ -2,13 +2,13 @@
[Section] [Section]
Name = Opera Name = Opera
Version = 10.62 Version = 10.63
Licence = Freeware Licence = Freeware
Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client. Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client.
Size = 12.7M Size = 12.7M
Category = 5 Category = 5
URLSite = http://www.opera.com/ 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 CDPath = none
[Section.0407] [Section.0407]

View file

@ -2,13 +2,13 @@
[Section] [Section]
Name = ScummVM Name = ScummVM
Version = 1.1.1 Version = 1.2.0
Licence = GPL Licence = GPL
Description = Sam and Max, Day of the Tentacle, etc on ReactOS. Description = Sam and Max, Day of the Tentacle, etc on ReactOS.
Size = 3.3MB Size = 3.5MB
Category = 4 Category = 4
URLSite = http://scummvm.org/ 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 CDPath = none
[Section.0407] [Section.0407]

View file

@ -2,31 +2,31 @@
[Section] [Section]
Name = Mozilla SeaMonkey Name = Mozilla SeaMonkey
Version = 2.0.8 Version = 2.0.9
Licence = MPL/GPL/LGPL 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. Description = Mozilla Suite is alive. This is the one and only Browser, Mail, Chat, and Composer bundle you will ever need.
Size = 10.1MB Size = 10.1MB
Category = 5 Category = 5
URLSite = http://www.seamonkey-project.org/ 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 CDPath = none
[Section.0407] [Section.0407]
Description = Mozilla Suite lebt. Dies ist das einzige Browser-, Mail-, Chat- and Composerwerkzeug-Bundle welches Sie benötigen. Description = Mozilla Suite lebt. Dies ist das einzige Browser-, Mail-, Chat- and Composerwerkzeug-Bundle welches Sie benötigen.
Size = 10.0MB 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] [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. 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 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] [Section.0415]
Description = Pakiet Mozilla żyje. W zestawie: przeglądarka, klient poczty, IRC oraz Edytor HTML - wszystko, czego potrzebujesz. Description = Pakiet Mozilla żyje. W zestawie: przeglądarka, klient poczty, IRC oraz Edytor HTML - wszystko, czego potrzebujesz.
Size = 10.8MB 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] [Section.0419]
Description = Продолжение Mozilla Suite. Включает браузер, почтовый клиент, IRC-клиент и HTML-редактор. Description = Продолжение Mozilla Suite. Включает браузер, почтовый клиент, IRC-клиент и HTML-редактор.
Size = 10.4MB 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

View file

@ -2,41 +2,41 @@
[Section] [Section]
Name = Mozilla Thunderbird Name = Mozilla Thunderbird
Version = 3.1.4 Version = 3.1.5
Licence = MPL/GPL/LGPL Licence = MPL/GPL/LGPL
Description = The most popular and one of the best free Mail Clients out there. Description = The most popular and one of the best free Mail Clients out there.
Size = 9.0M Size = 9.0M
Category = 5 Category = 5
URLSite = http://www.mozilla-europe.org/en/products/thunderbird/ 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 CDPath = none
[Section.0407] [Section.0407]
Description = Der populärste und einer der besten freien Mail-Clients. Description = Der populärste und einer der besten freien Mail-Clients.
Size = 8.8M Size = 8.8M
URLSite = http://www.mozilla-europe.org/de/products/thunderbird/ 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] [Section.040a]
Description = El más popular y uno de los mejores clientes mail que hay. Description = El más popular y uno de los mejores clientes mail que hay.
Size = 8.8M Size = 8.8M
URLSite = http://www.mozilla-europe.org/es/products/thunderbird/ 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] [Section.0415]
Description = Najpopularniejszy i jeden z najlepszych darmowych klientów poczty. Description = Najpopularniejszy i jeden z najlepszych darmowych klientów poczty.
Size = 9.7M Size = 9.7M
URLSite = http://www.mozilla-europe.org/pl/products/thunderbird/ 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] [Section.0419]
Description = Один из самых популярных и лучших бесплатных почтовых клиентов. Description = Один из самых популярных и лучших бесплатных почтовых клиентов.
Size = 9.2M Size = 9.2M
URLSite = http://www.mozilla-europe.org/ru/products/thunderbird/ 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] [Section.0422]
Description = Найпопулярніший та один з кращих поштових клієнтів. Description = Найпопулярніший та один з кращих поштових клієнтів.
Size = 9.2M Size = 9.2M
URLSite = http://www.mozillamessaging.com/uk/thunderbird/ 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

View file

@ -435,6 +435,12 @@ LRESULT DesktopWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
explorer_show_frame(SW_SHOWNORMAL); explorer_show_frame(SW_SHOWNORMAL);
break; 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: case WM_GETISHELLBROWSER:
return (LRESULT)static_cast<IShellBrowser*>(this); return (LRESULT)static_cast<IShellBrowser*>(this);

View file

@ -31,9 +31,6 @@ typedef struct _SCMGR_HANDLE
typedef struct _MANAGER_HANDLE typedef struct _MANAGER_HANDLE
{ {
SCMGR_HANDLE Handle; SCMGR_HANDLE Handle;
/* FIXME: Insert more data here */
WCHAR DatabaseName[1]; WCHAR DatabaseName[1];
} MANAGER_HANDLE, *PMANAGER_HANDLE; } MANAGER_HANDLE, *PMANAGER_HANDLE;
@ -41,11 +38,7 @@ typedef struct _MANAGER_HANDLE
typedef struct _SERVICE_HANDLE typedef struct _SERVICE_HANDLE
{ {
SCMGR_HANDLE Handle; SCMGR_HANDLE Handle;
PSERVICE ServiceEntry; PSERVICE ServiceEntry;
/* FIXME: Insert more data here */
} SERVICE_HANDLE, *PSERVICE_HANDLE; } SERVICE_HANDLE, *PSERVICE_HANDLE;
@ -149,7 +142,7 @@ ScmCreateManagerHandle(LPWSTR lpDatabaseName,
if (lpDatabaseName == NULL) if (lpDatabaseName == NULL)
lpDatabaseName = SERVICES_ACTIVE_DATABASEW; 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); DPRINT("Database %S, does not exist\n",lpDatabaseName);
return ERROR_DATABASE_DOES_NOT_EXIST; return ERROR_DATABASE_DOES_NOT_EXIST;
@ -168,8 +161,6 @@ ScmCreateManagerHandle(LPWSTR lpDatabaseName,
Ptr->Handle.Tag = MANAGER_TAG; Ptr->Handle.Tag = MANAGER_TAG;
/* FIXME: initialize more data here */
wcscpy(Ptr->DatabaseName, lpDatabaseName); wcscpy(Ptr->DatabaseName, lpDatabaseName);
*Handle = (SC_HANDLE)Ptr; *Handle = (SC_HANDLE)Ptr;
@ -192,7 +183,6 @@ ScmCreateServiceHandle(PSERVICE lpServiceEntry,
Ptr->Handle.Tag = SERVICE_TAG; Ptr->Handle.Tag = SERVICE_TAG;
/* FIXME: initialize more data here */
Ptr->ServiceEntry = lpServiceEntry; Ptr->ServiceEntry = lpServiceEntry;
*Handle = (SC_HANDLE)Ptr; *Handle = (SC_HANDLE)Ptr;
@ -453,9 +443,10 @@ DWORD RCloseServiceHandle(
if (*hSCObject == 0) if (*hSCObject == 0)
return ERROR_INVALID_HANDLE; return ERROR_INVALID_HANDLE;
hManager = (PMANAGER_HANDLE)*hSCObject; hManager = ScmGetServiceManagerFromHandle(*hSCObject);
hService = (PSERVICE_HANDLE)*hSCObject; hService = ScmGetServiceFromHandle(*hSCObject);
if (hManager->Handle.Tag == MANAGER_TAG)
if (hManager != NULL)
{ {
DPRINT("Found manager handle\n"); DPRINT("Found manager handle\n");
@ -467,7 +458,7 @@ DWORD RCloseServiceHandle(
DPRINT("RCloseServiceHandle() done\n"); DPRINT("RCloseServiceHandle() done\n");
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
else if (hService->Handle.Tag == SERVICE_TAG) else if (hService != NULL)
{ {
DPRINT("Found service handle\n"); DPRINT("Found service handle\n");
@ -561,6 +552,8 @@ DWORD RControlService(
DWORD dwError = ERROR_SUCCESS; DWORD dwError = ERROR_SUCCESS;
DWORD pcbBytesNeeded = 0; DWORD pcbBytesNeeded = 0;
DWORD dwServicesReturned = 0; DWORD dwServicesReturned = 0;
DWORD dwControlsAccepted;
DWORD dwCurrentState;
HKEY hServicesKey = NULL; HKEY hServicesKey = NULL;
DPRINT("RControlService() called\n"); DPRINT("RControlService() called\n");
@ -662,6 +655,49 @@ DWORD RControlService(
} }
else 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 */ /* Send control code to the service */
dwError = ScmControlService(lpService, dwError = ScmControlService(lpService,
dwControl); dwControl);

View file

@ -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","ErrorControl",0x00010001,0x00000000
HKLM,"SYSTEM\CurrentControlSet\Services\Blue","Group",0x00000000,"Video Init" 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","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 HKLM,"SYSTEM\CurrentControlSet\Services\Blue","Type",0x00010001,0x00000001
; Cdfs (ISO96660) filesystem driver ; Cdfs (ISO96660) filesystem driver

View file

@ -586,6 +586,8 @@ media\fonts\symbol.ttf 3
media\fonts\tahoma.ttf 3 media\fonts\tahoma.ttf 3
media\fonts\tahomabd.ttf 3 media\fonts\tahomabd.ttf 3
media\vgafonts\vgafonts.cab 4
media\nls\c_037.nls 1 media\nls\c_037.nls 1
media\nls\c_424.nls 1 media\nls\c_424.nls 1
media\nls\c_500.nls 1 media\nls\c_500.nls 1

View file

@ -146,7 +146,7 @@ typedef BOOL (WINAPI *STARTPAGEPRINTER) (HANDLE);
typedef BOOL (WINAPI *SEEKPRINTER) (HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD,BOOL); typedef BOOL (WINAPI *SEEKPRINTER) (HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD,BOOL);
typedef BOOL (WINAPI *SPLREADPRINTER) (HANDLE,LPBYTE *,DWORD); typedef BOOL (WINAPI *SPLREADPRINTER) (HANDLE,LPBYTE *,DWORD);
// Same as ddk/winsplp.h DriverUnloadComplete? // Same as ddk/winsplp.h DriverUnloadComplete?
typedef BOOL (WINAPI *SPLDRIVERUNLOADCOMPLETE) (LPWSTR); typedef BOOL (WINAPI *SPLDRIVERUNLOADCOMPLETE) (LPWSTR);
// Driver support: // Driver support:
// DrvDocumentEvent api/winddiui.h not W2k8 DocumentEventAW // DrvDocumentEvent api/winddiui.h not W2k8 DocumentEventAW
typedef INT (WINAPI *DOCUMENTEVENT) (HANDLE,HDC,INT,ULONG,PVOID,ULONG,PVOID); typedef INT (WINAPI *DOCUMENTEVENT) (HANDLE,HDC,INT,ULONG,PVOID,ULONG,PVOID);
@ -173,10 +173,10 @@ HEAP_strdupA2W(
VOID VOID
HEAP_free(LPVOID memory); HEAP_free(LPVOID memory);
VOID VOID
FASTCALL FASTCALL
FONT_TextMetricWToA( FONT_TextMetricWToA(
const TEXTMETRICW *ptmW, const TEXTMETRICW *ptmW,
LPTEXTMETRICA ptmA LPTEXTMETRICA ptmA
); );
@ -279,7 +279,7 @@ WINAPI
GdiSetLastError( DWORD dwErrCode ); GdiSetLastError( DWORD dwErrCode );
DWORD WINAPI GdiGetCodePage(HDC); DWORD WINAPI GdiGetCodePage(HDC);
UINT FASTCALL DIB_BitmapBitsSize( PBITMAPINFO ); UINT FASTCALL DIB_BitmapBitsSize( CONST BITMAPINFO* );
int int
WINAPI WINAPI

View file

@ -166,6 +166,10 @@ SetPixelFormat(HDC hdc,
INT iPixelFormat, INT iPixelFormat,
CONST PIXELFORMATDESCRIPTOR * ppfd) CONST PIXELFORMATDESCRIPTOR * ppfd)
{ {
/* Can only be set once */
INT current = GetPixelFormat(hdc);
if(current) return current == iPixelFormat ;
if (glSetPixelFormat == NULL) if (glSetPixelFormat == NULL)
if (OpenGLEnable() == FALSE) if (OpenGLEnable() == FALSE)
return(0); return(0);

View file

@ -34,7 +34,7 @@ DIB_BitmapMaxBitsSize( PBITMAPINFO Info, UINT ScanLines )
UINT UINT
FASTCALL FASTCALL
DIB_BitmapBitsSize( PBITMAPINFO Info ) DIB_BitmapBitsSize( CONST BITMAPINFO* Info )
{ {
UINT Ret; UINT Ret;
@ -43,16 +43,16 @@ DIB_BitmapBitsSize( PBITMAPINFO Info )
if ( Info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) if ( Info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
{ {
PBITMAPCOREHEADER Core = (PBITMAPCOREHEADER)Info; PBITMAPCOREHEADER Core = (PBITMAPCOREHEADER)Info;
Ret = Core->bcHeight * Ret = Core->bcHeight *
((Core->bcWidth * Core->bcPlanes * Core->bcBitCount + 31) & ~31 ) / 8; ((Core->bcWidth * Core->bcPlanes * Core->bcBitCount + 31) & ~31 ) / 8;
} }
else /* assume BITMAPINFOHEADER */ else /* assume BITMAPINFOHEADER */
{ {
if ((Info->bmiHeader.biCompression) && if ((Info->bmiHeader.biCompression) &&
(Info->bmiHeader.biCompression != BI_BITFIELDS)) (Info->bmiHeader.biCompression != BI_BITFIELDS))
return Info->bmiHeader.biSizeImage; return Info->bmiHeader.biSizeImage;
// Make Height positive always.... // 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; ((Info->bmiHeader.biWidth * Info->bmiHeader.biPlanes * Info->bmiHeader.biBitCount + 31) & ~31 ) / 8;
} }
return Ret; return Ret;
@ -132,12 +132,12 @@ WINAPI
GdiGetBitmapBitsSize(BITMAPINFO *lpbmi) GdiGetBitmapBitsSize(BITMAPINFO *lpbmi)
{ {
int retSize; int retSize;
if (lpbmi->bmiHeader.biSize == FIELD_OFFSET(BITMAPINFOHEADER, biPlanes)) if (lpbmi->bmiHeader.biSize == FIELD_OFFSET(BITMAPINFOHEADER, biPlanes))
{ {
/* Calc the bits Size and align it*/ /* Calc the bits Size and align it*/
retSize = HIWORD(lpbmi->bmiHeader.biWidth) * ((LOWORD(lpbmi->bmiHeader.biWidth) * retSize = HIWORD(lpbmi->bmiHeader.biWidth) * ((LOWORD(lpbmi->bmiHeader.biWidth) *
LOWORD(lpbmi->bmiHeader.biHeight) * HIWORD(lpbmi->bmiHeader.biHeight) + 31) LOWORD(lpbmi->bmiHeader.biHeight) * HIWORD(lpbmi->bmiHeader.biHeight) + 31)
& -32) / 8; & -32) / 8;
} }
else else
@ -148,13 +148,13 @@ GdiGetBitmapBitsSize(BITMAPINFO *lpbmi)
if (lpbmi->bmiHeader.biHeight >=0 ) if (lpbmi->bmiHeader.biHeight >=0 )
{ {
/* Calc the bits Size and align it*/ /* 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; lpbmi->bmiHeader.biPlanes * lpbmi->bmiHeader.biBitCount + 31) & -32) / 8;
} }
else else
{ {
/* Make height postiive if it negitve then calc the bits Size and align it*/ /* 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; lpbmi->bmiHeader.biPlanes * lpbmi->bmiHeader.biBitCount + 31) & -32) / 8;
} }
} }
@ -189,7 +189,7 @@ CreateDIBSection(
{ // Verify header due to converted may == info. { // Verify header due to converted may == info.
if ( pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) ) if ( pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) )
{ {
if ( pConvertedInfo->bmiHeader.biCompression == BI_JPEG || if ( pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
pConvertedInfo->bmiHeader.biCompression == BI_PNG ) pConvertedInfo->bmiHeader.biCompression == BI_PNG )
{ {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
@ -319,7 +319,7 @@ CreateBitmapIndirect(const BITMAP *pbm)
(!(pbm->bmWidthBytes & 1)) ) (!(pbm->bmWidthBytes & 1)) )
{ {
bitmap = CreateBitmap(pbm->bmWidth, bitmap = CreateBitmap(pbm->bmWidth,
pbm->bmHeight, pbm->bmHeight,
pbm->bmPlanes, pbm->bmPlanes,
@ -409,7 +409,7 @@ GetDIBits(
{ {
if ( lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) ) if ( lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) )
{ {
if ( lpbmi->bmiHeader.biCompression == BI_JPEG || if ( lpbmi->bmiHeader.biCompression == BI_JPEG ||
lpbmi->bmiHeader.biCompression == BI_PNG ) lpbmi->bmiHeader.biCompression == BI_PNG )
{ {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
@ -461,78 +461,61 @@ CreateDIBitmap( HDC hDC,
LONG width, height, compr, dibsize; LONG width, height, compr, dibsize;
WORD planes, bpp; WORD planes, bpp;
// PDC_ATTR pDc_Attr; // PDC_ATTR pDc_Attr;
PBITMAPINFO pConvertedInfo; UINT InfoSize = 0;
UINT ConvertedInfoSize; UINT cjBmpScanSize = 0;
UINT cjBmpScanSize;
PVOID pvSafeBits = NULL;
HBITMAP hBmp; HBITMAP hBmp;
NTSTATUS Status = STATUS_SUCCESS;
if (!Header) return 0; if (!Header) return 0;
pConvertedInfo = ConvertBitmapInfo(Data, ColorUse,
&ConvertedInfoSize, FALSE);
if (DIB_GetBitmapInfo(Header, &width, &height, &planes, &bpp, &compr, &dibsize) == -1) if (DIB_GetBitmapInfo(Header, &width, &height, &planes, &bpp, &compr, &dibsize) == -1)
{ {
GdiSetLastError(ERROR_INVALID_PARAMETER); GdiSetLastError(ERROR_INVALID_PARAMETER);
return NULL; 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. // For Icm support.
// GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) // GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
cjBmpScanSize = DIB_BitmapBitsSize((LPBITMAPINFO)pConvertedInfo); if(Data)
DPRINT("pBMI %x, Size bpp %d, dibsize %d, Conv %d, BSS %d\n", pConvertedInfo,bpp,dibsize,ConvertedInfoSize,cjBmpScanSize); {
_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 ) if ( !width || !height )
hBmp = GetStockObject(DEFAULT_BITMAP); hBmp = GetStockObject(DEFAULT_BITMAP);
else 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, hBmp = NtGdiCreateDIBitmapInternal(hDC,
width, width,
height, height,
Init, Init,
(LPBYTE)pvSafeBits, (LPBYTE)Bits,
(PBITMAPINFO)pConvertedInfo, (LPBITMAPINFO)Data,
ColorUse, ColorUse,
ConvertedInfoSize, InfoSize,
cjBmpScanSize, cjBmpScanSize,
0, 0,
0); 0);
if ( Bits && Init == CBM_INIT )
RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits);
} }
Exit:
if (Data != pConvertedInfo)
RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
return hBmp; return hBmp;
} }
@ -588,7 +571,7 @@ SetDIBits(HDC hDC,
if ( hOldBitmap ) if ( hOldBitmap )
{ {
if ( hDC ) if ( hDC )
hPal = SelectPalette(SavehDC, (HPALETTE)GetDCObject(hDC, GDI_OBJECT_TYPE_PALETTE), FALSE); hPal = SelectPalette(SavehDC, (HPALETTE)GetDCObject(hDC, GDI_OBJECT_TYPE_PALETTE), FALSE);
if ( lpbmi->bmiHeader.biSize < sizeof(BITMAPINFOHEADER)) if ( lpbmi->bmiHeader.biSize < sizeof(BITMAPINFOHEADER))
@ -782,7 +765,7 @@ SetDIBitsToDevice(
/* /*
if ( !pDc_Attr || if ( !pDc_Attr ||
((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) && ((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) &&
(pConvertedInfo->bmiHeader.biCompression == BI_JPEG || (pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
pConvertedInfo->bmiHeader.biCompression == BI_PNG )) )*/ pConvertedInfo->bmiHeader.biCompression == BI_PNG )) )*/
{ {
LinesCopied = NtGdiSetDIBitsToDeviceInternal( hdc, LinesCopied = NtGdiSetDIBitsToDeviceInternal( hdc,
@ -806,7 +789,7 @@ SetDIBitsToDevice(
RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits); RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits);
if (lpbmi != pConvertedInfo) if (lpbmi != pConvertedInfo)
RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo); RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
return LinesCopied; return LinesCopied;
} }
@ -886,17 +869,12 @@ StretchDIBits(HDC hdc,
} }
} }
#endif #endif
if ( iUsage ) // Save time, we only look at non RGB. pConvertedInfo = ConvertBitmapInfo(lpBitsInfo, iUsage,
{ &ConvertedInfoSize, FALSE);
pConvertedInfo = ConvertBitmapInfo(lpBitsInfo, iUsage, if (!pConvertedInfo)
&ConvertedInfoSize, FALSE); {
if (!pConvertedInfo)
{
return 0; return 0;
} }
}
else
pConvertedInfo = (PBITMAPINFO)lpBitsInfo;
cjBmpScanSize = DIB_BitmapBitsSize((LPBITMAPINFO)pConvertedInfo); cjBmpScanSize = DIB_BitmapBitsSize((LPBITMAPINFO)pConvertedInfo);
@ -933,7 +911,7 @@ StretchDIBits(HDC hdc,
/* /*
if ( !pDc_Attr || if ( !pDc_Attr ||
((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) && ((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) &&
(pConvertedInfo->bmiHeader.biCompression == BI_JPEG || (pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
pConvertedInfo->bmiHeader.biCompression == BI_PNG )) )*/ pConvertedInfo->bmiHeader.biCompression == BI_PNG )) )*/
{ {
LinesCopied = NtGdiStretchDIBitsInternal( hdc, LinesCopied = NtGdiStretchDIBitsInternal( hdc,

View file

@ -15,7 +15,7 @@ IntCreateDICW ( LPCWSTR lpwszDriver,
{ {
UNICODE_STRING Device, Output; UNICODE_STRING Device, Output;
HDC hDC = NULL; HDC hDC = NULL;
BOOL Display = FALSE, Default = TRUE; BOOL Display = FALSE, Default = FALSE;
ULONG UMdhpdev = 0; ULONG UMdhpdev = 0;
HANDLE hspool = NULL; HANDLE hspool = NULL;
@ -31,7 +31,7 @@ IntCreateDICW ( LPCWSTR lpwszDriver,
if ((!lpwszDevice) && (!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. Display = TRUE; // Most likely to be DISPLAY.
} }
else else
@ -60,7 +60,7 @@ IntCreateDICW ( LPCWSTR lpwszDriver,
DPRINT1("Not a DISPLAY device! %wZ\n", &Device); DPRINT1("Not a DISPLAY device! %wZ\n", &Device);
} }
hDC = NtGdiOpenDCW( (Default ? &Device : NULL), hDC = NtGdiOpenDCW( (Default ? NULL : &Device),
(PDEVMODEW) lpInitData, (PDEVMODEW) lpInitData,
(lpwszOutput ? &Output : NULL), (lpwszOutput ? &Output : NULL),
iType, // DCW 0 and ICW 1. iType, // DCW 0 and ICW 1.
@ -318,7 +318,7 @@ WINAPI
DeleteObject(HGDIOBJ hObject) DeleteObject(HGDIOBJ hObject)
{ {
UINT Type = 0; UINT Type = 0;
/* From Wine: DeleteObject does not SetLastError() on a null object */ /* From Wine: DeleteObject does not SetLastError() on a null object */
if(!hObject) return FALSE; if(!hObject) return FALSE;
@ -332,7 +332,7 @@ DeleteObject(HGDIOBJ hObject)
Type = GDI_HANDLE_GET_TYPE(hObject); Type = GDI_HANDLE_GET_TYPE(hObject);
if ((Type == GDI_OBJECT_TYPE_METAFILE) || if ((Type == GDI_OBJECT_TYPE_METAFILE) ||
(Type == GDI_OBJECT_TYPE_ENHMETAFILE)) (Type == GDI_OBJECT_TYPE_ENHMETAFILE))
return FALSE; return FALSE;
@ -348,7 +348,7 @@ DeleteObject(HGDIOBJ hObject)
case GDI_OBJECT_TYPE_METADC: case GDI_OBJECT_TYPE_METADC:
return MFDRV_DeleteObject( hObject ); return MFDRV_DeleteObject( hObject );
case GDI_OBJECT_TYPE_EMF: case GDI_OBJECT_TYPE_EMF:
{ {
PLDC pLDC = GdiGetLDC(hObject); PLDC pLDC = GdiGetLDC(hObject);
if ( !pLDC ) return FALSE; if ( !pLDC ) return FALSE;
return EMFDRV_DeleteObject( hObject ); return EMFDRV_DeleteObject( hObject );
@ -533,7 +533,7 @@ GetDeviceCaps(HDC hDC,
return NtGdiGetDeviceCaps(hDC,i); return NtGdiGetDeviceCaps(hDC,i);
} }
DPRINT("Device CAPS2\n"); DPRINT("Device CAPS2\n");
switch (i) switch (i)
{ {
case DRIVERVERSION: case DRIVERVERSION:
@ -1603,7 +1603,7 @@ SelectObject(HDC hDC,
#if 0 #if 0
case GDI_OBJECT_TYPE_METADC: case GDI_OBJECT_TYPE_METADC:
return MFDRV_SelectObject( hDC, hGdiObj); return MFDRV_SelectObject( hDC, hGdiObj);
case GDI_OBJECT_TYPE_EMF: case GDI_OBJECT_TYPE_EMF:
PLDC pLDC = GdiGetLDC(hDC); PLDC pLDC = GdiGetLDC(hDC);
if ( !pLDC ) return NULL; if ( !pLDC ) return NULL;

View file

@ -1,2 +1,12 @@
HCURSOR 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);

View file

@ -43,7 +43,8 @@
#include <pseh/pseh2.h> #include <pseh/pseh2.h>
#define HOOKID_TO_FLAG(HookId) (1 << ((HookId) + 1)) #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. */ /* Temporarily in here for now. */
typedef struct _USERAPIHOOKINFO typedef struct _USERAPIHOOKINFO
@ -168,7 +169,7 @@ SharedPtrToKernel(PVOID Ptr)
static __inline BOOL static __inline BOOL
IsThreadHooked(PCLIENTINFO pci) IsThreadHooked(PCLIENTINFO pci)
{ {
return pci->fsHooks != 0; return (pci->fsHooks|pci->pDeskInfo->fsHooks) != 0;
} }
static __inline PDESKTOPINFO static __inline PDESKTOPINFO
@ -194,3 +195,4 @@ VOID FASTCALL GetConnected(VOID);
BOOL FASTCALL DefSetText(HWND hWnd, PCWSTR String, BOOL Ansi); BOOL FASTCALL DefSetText(HWND hWnd, PCWSTR String, BOOL Ansi);
BOOL FASTCALL TestWindowProcess(PWND); BOOL FASTCALL TestWindowProcess(PWND);
VOID UserGetWindowBorders(DWORD, DWORD, SIZE *, BOOL); VOID UserGetWindowBorders(DWORD, DWORD, SIZE *, BOOL);
VOID FASTCALL IntNotifyWinEvent(DWORD, HWND, LONG, LONG, DWORD);

View file

@ -83,9 +83,6 @@
#define NtUserGetCursorPos(lpPoint) \ #define NtUserGetCursorPos(lpPoint) \
(BOOL)NtUserCallOneParam((DWORD_PTR)lpPoint, ONEPARAM_ROUTINE_GETCURSORPOSITION) (BOOL)NtUserCallOneParam((DWORD_PTR)lpPoint, ONEPARAM_ROUTINE_GETCURSORPOSITION)
#define NtUserIsWindowInDestroy(hWnd) \
(BOOL)NtUserCallOneParam((DWORD_PTR)hWnd, ONEPARAM_ROUTINE_ISWINDOWINDESTROY)
#define NtUserEnableProcessWindowGhosting(bEnable) \ #define NtUserEnableProcessWindowGhosting(bEnable) \
NtUserCallOneParam((DWORD_PTR)bEnable, ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING) NtUserCallOneParam((DWORD_PTR)bEnable, ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING)

View file

@ -457,7 +457,6 @@ ChangeDisplaySettingsExA(
LONG rc; LONG rc;
UNICODE_STRING DeviceName; UNICODE_STRING DeviceName;
PUNICODE_STRING pDeviceName = &DeviceName; PUNICODE_STRING pDeviceName = &DeviceName;
LPDEVMODEW pDevModeW;
if (lpszDeviceName != NULL) if (lpszDeviceName != NULL)
{ {
@ -471,14 +470,19 @@ ChangeDisplaySettingsExA(
pDeviceName = NULL; pDeviceName = NULL;
if (lpDevMode != NULL) if (lpDevMode != NULL)
{
LPDEVMODEW pDevModeW;
pDevModeW = GdiConvertToDevmodeW(lpDevMode); pDevModeW = GdiConvertToDevmodeW(lpDevMode);
if(pDevModeW)
{
rc = NtUserChangeDisplaySettings ( pDeviceName, pDevModeW, hwnd, dwflags, lParam );
RtlFreeHeap(GetProcessHeap(), 0, pDevModeW);
}
else
rc = DISP_CHANGE_SUCCESSFUL;
}
else else
pDevModeW = NULL; rc = NtUserChangeDisplaySettings ( pDeviceName, NULL, hwnd, dwflags, lParam );
rc = NtUserChangeDisplaySettings ( pDeviceName, pDevModeW, hwnd, dwflags, lParam );
if (pDevModeW != NULL)
RtlFreeHeap(GetProcessHeap(), 0, pDevModeW);
if (lpszDeviceName != NULL) if (lpszDeviceName != NULL)
RtlFreeUnicodeString ( &DeviceName ); RtlFreeUnicodeString ( &DeviceName );
@ -539,6 +543,6 @@ ChangeDisplaySettingsW(
DWORD dwflags) DWORD dwflags)
{ {
if(lpDevMode) if(lpDevMode)
lpDevMode->dmDriverExtra = 0; lpDevMode->dmDriverExtra = 0;
return ChangeDisplaySettingsExW ( NULL, lpDevMode, NULL, dwflags, 0 ); return ChangeDisplaySettingsExW ( NULL, lpDevMode, NULL, dwflags, 0 );
} }

View file

@ -304,13 +304,13 @@ GetUser32Handle(HANDLE handle)
static const BOOL g_ObjectHeapTypeShared[VALIDATE_TYPE_EVENT + 1] = static const BOOL g_ObjectHeapTypeShared[VALIDATE_TYPE_EVENT + 1] =
{ {
FALSE, /* VALIDATE_TYPE_FREE (not used) */ FALSE, /* VALIDATE_TYPE_FREE (not used) */
FALSE, /* VALIDATE_TYPE_WIN FALSE */ FALSE, /* VALIDATE_TYPE_WIN */
TRUE, /* VALIDATE_TYPE_MENU FALSE */ TRUE, /* VALIDATE_TYPE_MENU FALSE */
TRUE, /* VALIDATE_TYPE_CURSOR */ TRUE, /* VALIDATE_TYPE_CURSOR */
TRUE, /* VALIDATE_TYPE_MWPOS */ TRUE, /* VALIDATE_TYPE_MWPOS */
TRUE, /* VALIDATE_TYPE_HOOK FALSE */ FALSE, /* VALIDATE_TYPE_HOOK */
FALSE, /* (not used) */ FALSE, /* (not used) */
TRUE, /* VALIDATE_TYPE_CALLPROC FALSE */ FALSE, /* VALIDATE_TYPE_CALLPROC */
TRUE, /* VALIDATE_TYPE_ACCEL */ TRUE, /* VALIDATE_TYPE_ACCEL */
FALSE, /* (not used) */ FALSE, /* (not used) */
FALSE, /* (not used) */ FALSE, /* (not used) */

View file

@ -298,7 +298,7 @@ IntGetWndProc(PWND pWnd, BOOL Ansi)
} }
return Ret; return Ret;
} }
// Wine Class tests: // Wine Class tests:
/* Edit controls are special - they return a wndproc handle when /* Edit controls are special - they return a wndproc handle when
GetWindowLongPtr is called with a different A/W. GetWindowLongPtr is called with a different A/W.
On the other hand there is no W->A->W conversion so this control On the other hand there is no W->A->W conversion so this control
@ -831,7 +831,6 @@ CreateSmallIcon(HICON StdIcon)
int SmallIconWidth; int SmallIconWidth;
int SmallIconHeight; int SmallIconHeight;
BITMAP StdBitmapInfo; BITMAP StdBitmapInfo;
HDC hInfoDc = NULL;
HDC hSourceDc = NULL; HDC hSourceDc = NULL;
HDC hDestDc = NULL; HDC hDestDc = NULL;
ICONINFO SmallInfo; ICONINFO SmallInfo;
@ -867,15 +866,6 @@ CreateSmallIcon(HICON StdIcon)
return 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); hSourceDc = CreateCompatibleDC(NULL);
if (NULL == hSourceDc) if (NULL == hSourceDc)
{ {
@ -895,7 +885,7 @@ CreateSmallIcon(HICON StdIcon)
ERR("Failed to select source color bitmap\n"); ERR("Failed to select source color bitmap\n");
goto cleanup; goto cleanup;
} }
SmallInfo.hbmColor = CreateCompatibleBitmap(hInfoDc, SmallIconWidth, SmallInfo.hbmColor = CreateCompatibleBitmap(hSourceDc, SmallIconWidth,
SmallIconHeight); SmallIconHeight);
if (NULL == SmallInfo.hbmColor) if (NULL == SmallInfo.hbmColor)
{ {
@ -921,8 +911,7 @@ CreateSmallIcon(HICON StdIcon)
ERR("Failed to select source mask bitmap\n"); ERR("Failed to select source mask bitmap\n");
goto cleanup; goto cleanup;
} }
SmallInfo.hbmMask = CreateBitmap(SmallIconWidth, SmallIconHeight, 1, 1, SmallInfo.hbmMask = CreateCompatibleBitmap(hSourceDc, SmallIconWidth, SmallIconHeight);
NULL);
if (NULL == SmallInfo.hbmMask) if (NULL == SmallInfo.hbmMask)
{ {
ERR("Failed to create mask bitmap\n"); ERR("Failed to create mask bitmap\n");
@ -976,10 +965,6 @@ cleanup:
{ {
DeleteDC(hSourceDc); DeleteDC(hSourceDc);
} }
if (NULL != hInfoDc)
{
DeleteDC(hInfoDc);
}
return SmallIcon; return SmallIcon;
} }
@ -1070,9 +1055,9 @@ RegisterClassExWOWW(WNDCLASSEXW *lpwcx,
clsMenuName.pszClientAnsiMenuName = AnsiMenuName.Buffer; clsMenuName.pszClientAnsiMenuName = AnsiMenuName.Buffer;
clsMenuName.pwszClientUnicodeMenuName = MenuName.Buffer; clsMenuName.pwszClientUnicodeMenuName = MenuName.Buffer;
clsMenuName.pusMenuName = &MenuName; clsMenuName.pusMenuName = &MenuName;
Atom = NtUserRegisterClassExWOW( &WndClass, Atom = NtUserRegisterClassExWOW( &WndClass,
&ClassName, &ClassName,
NULL, //PUNICODE_STRING ClsNVersion, NULL, //PUNICODE_STRING ClsNVersion,
&clsMenuName, &clsMenuName,
fnID, fnID,

View file

@ -458,10 +458,16 @@ static BOOL create_icon_bitmaps( const BITMAPINFO *bmi, int width, int height,
void *color_bits, *mask_bits; void *color_bits, *mask_bits;
BOOL ret = FALSE; BOOL ret = FALSE;
HDC hdc = 0; HDC hdc = 0;
static HDC hScreenDC = 0;
if (!(info = HeapAlloc( GetProcessHeap(), 0, max( size, FIELD_OFFSET( BITMAPINFO, bmiColors[2] ))))) if (!(info = HeapAlloc( GetProcessHeap(), 0, max( size, FIELD_OFFSET( BITMAPINFO, bmiColors[2] )))))
return FALSE; 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 ); memcpy( info, bmi, size );
info->bmiHeader.biHeight /= 2; info->bmiHeader.biHeight /= 2;
@ -485,8 +491,8 @@ static BOOL create_icon_bitmaps( const BITMAPINFO *bmi, int width, int height,
else else
{ {
if (!(*mask = CreateBitmap( width, height, 1, 1, NULL ))) goto done; if (!(*mask = CreateBitmap( width, height, 1, 1, NULL ))) goto done;
if (!(*color = CreateBitmap( width, height, bmi->bmiHeader.biPlanes, if (!(*color = CreateBitmap( width, height, GetDeviceCaps(hScreenDC, PLANES),
bmi->bmiHeader.biBitCount, NULL ))) GetDeviceCaps(hScreenDC, BITSPIXEL), NULL )))
{ {
DeleteObject( *mask ); DeleteObject( *mask );
goto done; goto done;
@ -523,7 +529,7 @@ static BOOL create_icon_bitmaps( const BITMAPINFO *bmi, int width, int height,
ret = TRUE; ret = TRUE;
done: done:
DeleteDC( hdc ); if(hdc) DeleteDC( hdc );
HeapFree( GetProcessHeap(), 0, info ); HeapFree( GetProcessHeap(), 0, info );
return ret; return ret;
} }

View file

@ -103,6 +103,7 @@ BOOL
FASTCALL FASTCALL
DefSetText(HWND hWnd, PCWSTR String, BOOL Ansi) DefSetText(HWND hWnd, PCWSTR String, BOOL Ansi)
{ {
BOOL Ret;
LARGE_STRING lsString; LARGE_STRING lsString;
if ( String ) if ( String )
@ -112,7 +113,12 @@ DefSetText(HWND hWnd, PCWSTR String, BOOL Ansi)
else else
RtlInitLargeUnicodeString((PLARGE_UNICODE_STRING)&lsString, String, 0); 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 void
@ -1969,7 +1975,6 @@ RealDefWindowProcA(HWND hWnd,
{ {
DefWndNCPaint(hWnd, (HRGN)1, -1); DefWndNCPaint(hWnd, (HRGN)1, -1);
} }
Result = 1; Result = 1;
break; break;
} }

View file

@ -1373,9 +1373,9 @@ IntDrawState(HDC hdc, HBRUSH hbr, DRAWSTATEPROC func, LPARAM lp, WPARAM wp,
} }
if (flags & DSS_DISABLED) if (flags & DSS_DISABLED)
hbrtmp = CreateSolidBrush(GetSysColor(COLOR_3DHILIGHT)); hbrtmp = GetSysColorBrush(COLOR_3DHILIGHT);
else if (flags & DSS_DEFAULT) else if (flags & DSS_DEFAULT)
hbrtmp = CreateSolidBrush(GetSysColor(COLOR_3DSHADOW)); hbrtmp = GetSysColorBrush(COLOR_3DSHADOW);
/* Draw light or dark shadow */ /* Draw light or dark shadow */
if (flags & (DSS_DISABLED|DSS_DEFAULT)) 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)) if(!BitBlt(hdc, x+1, y+1, cx, cy, memdc, 0, 0, 0x00B8074A))
goto cleanup; goto cleanup;
SelectObject(hdc, hbsave); SelectObject(hdc, hbsave);
DeleteObject(hbrtmp);
hbrtmp = 0;
} }
if (flags & DSS_DISABLED) if (flags & DSS_DISABLED)
{ {
hbr = hbrtmp = CreateSolidBrush(GetSysColor(COLOR_3DSHADOW)); hbr = hbrtmp = GetSysColorBrush(COLOR_3DSHADOW);
if(!hbrtmp) if(!hbrtmp)
goto cleanup; goto cleanup;
} }
@ -1418,8 +1416,6 @@ cleanup:
SelectObject(hdc, hbsave); SelectObject(hdc, hbsave);
if(hbmsave) if(hbmsave)
SelectObject(memdc, hbmsave); SelectObject(memdc, hbmsave);
if(hbrtmp)
DeleteObject(hbrtmp);
if(hbm) if(hbm)
DeleteObject(hbm); DeleteObject(hbm);
if(memdc) if(memdc)

View file

@ -34,6 +34,14 @@
WINE_DEFAULT_DEBUG_CHANNEL(user32); WINE_DEFAULT_DEBUG_CHANNEL(user32);
typedef struct _NOTIFYEVENT
{
DWORD event;
LONG idObject;
LONG idChild;
DWORD flags;
} NOTIFYEVENT, *PNOTIFYEVENT;
/* PRIVATE FUNCTIONS *********************************************************/ /* PRIVATE FUNCTIONS *********************************************************/
static static
@ -99,6 +107,29 @@ IntSetWindowsHook(
return NtUserSetWindowsHookEx(hMod, &USModuleName, dwThreadId, idHook, lpfn, bAnsi); 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 *****************************************************************/ /* FUNCTIONS *****************************************************************/
@ -195,7 +226,7 @@ CallNextHookEx(
{ {
PCLIENTINFO ClientInfo; PCLIENTINFO ClientInfo;
DWORD Flags, Save; DWORD Flags, Save;
PHOOK pHook; PHOOK pHook, phkNext;
LRESULT lResult = 0; LRESULT lResult = 0;
GetConnected(); GetConnected();
@ -204,9 +235,14 @@ CallNextHookEx(
if (!ClientInfo->phkCurrent) return 0; 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; Save = ClientInfo->dwHookData;
Flags = ClientInfo->CI_flags & CI_CURTHPRHOOK; Flags = ClientInfo->CI_flags & CI_CURTHPRHOOK;
@ -215,7 +251,7 @@ CallNextHookEx(
if (wParam) ClientInfo->CI_flags |= CI_CURTHPRHOOK; if (wParam) ClientInfo->CI_flags |= CI_CURTHPRHOOK;
else 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; PCWPSTRUCT pCWP = (PCWPSTRUCT)lParam;
@ -225,7 +261,7 @@ CallNextHookEx(
pCWP->lParam, pCWP->lParam,
(ULONG_PTR)&lResult, (ULONG_PTR)&lResult,
FNID_CALLWNDPROC, FNID_CALLWNDPROC,
pHook->Ansi); phkNext->Ansi);
} }
else else
{ {
@ -239,7 +275,7 @@ CallNextHookEx(
pCWPR->lParam, pCWPR->lParam,
(ULONG_PTR)&lResult, (ULONG_PTR)&lResult,
FNID_CALLWNDPROCRET, FNID_CALLWNDPROCRET,
pHook->Ansi); phkNext->Ansi);
} }
ClientInfo->CI_flags ^= ((ClientInfo->CI_flags ^ Flags) & CI_CURTHPRHOOK); ClientInfo->CI_flags ^= ((ClientInfo->CI_flags ^ Flags) & CI_CURTHPRHOOK);
ClientInfo->dwHookData = Save; ClientInfo->dwHookData = Save;
@ -252,23 +288,27 @@ CallNextHookEx(
/* /*
* @unimplemented * @implemented
*/ */
HHOOK HHOOK
WINAPI WINAPI
SetWindowsHookW(int idHook, HOOKPROC lpfn) 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 HHOOK
WINAPI WINAPI
SetWindowsHookA(int idHook, HOOKPROC lpfn) 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 HHOOK
WINAPI WINAPI
@ -392,7 +432,7 @@ SetWindowsHookExA(
/* /*
* @unimplemented * @implemented
*/ */
HHOOK HHOOK
WINAPI WINAPI
@ -409,22 +449,21 @@ NTSTATUS WINAPI
User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
{ {
PHOOKPROC_CALLBACK_ARGUMENTS Common; PHOOKPROC_CALLBACK_ARGUMENTS Common;
LRESULT Result;
CREATESTRUCTW Csw; CREATESTRUCTW Csw;
CBT_CREATEWNDW CbtCreatewndw; CBT_CREATEWNDW CbtCreatewndw;
CREATESTRUCTA Csa;
CBT_CREATEWNDA CbtCreatewnda;
PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra = NULL; PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra = NULL;
WPARAM wParam = 0; KBDLLHOOKSTRUCT KeyboardLlData, *pKeyboardLlData;
LPARAM lParam = 0; MSLLHOOKSTRUCT MouseLlData, *pMouseLlData;
PKBDLLHOOKSTRUCT KeyboardLlData; MSG Msg, *pMsg;
PMSLLHOOKSTRUCT MouseLlData; PMOUSEHOOKSTRUCT pMHook;
PMSG Msg; CWPSTRUCT CWP, *pCWP;
PMOUSEHOOKSTRUCT MHook; CWPRETSTRUCT CWPR, *pCWPR;
PCWPSTRUCT CWP;
PCWPRETSTRUCT CWPR;
PRECTL prl; PRECTL prl;
LPCBTACTIVATESTRUCT pcbtas; LPCBTACTIVATESTRUCT pcbtas;
WPARAM wParam = 0;
LPARAM lParam = 0;
LRESULT Result = 0;
BOOL Hit = FALSE;
Common = (PHOOKPROC_CALLBACK_ARGUMENTS) Arguments; Common = (PHOOKPROC_CALLBACK_ARGUMENTS) Arguments;
@ -438,34 +477,16 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
CbtCreatewndExtra = (PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS) CbtCreatewndExtra = (PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS)
((PCHAR) Common + Common->lParam); ((PCHAR) Common + Common->lParam);
Csw = CbtCreatewndExtra->Cs; Csw = CbtCreatewndExtra->Cs;
if (NULL != CbtCreatewndExtra->Cs.lpszName) Csw.lpszName = CbtCreatewndExtra->Cs.lpszName;
{ Csw.lpszClass = CbtCreatewndExtra->Cs.lpszClass;
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));
}
wParam = Common->wParam; wParam = Common->wParam;
if (Common->Ansi) CbtCreatewndw.lpcs = &Csw;
{ CbtCreatewndw.hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter;
memcpy(&Csa, &Csw, sizeof(CREATESTRUCTW)); lParam = (LPARAM) &CbtCreatewndw;
CbtCreatewnda.lpcs = &Csa;
CbtCreatewnda.hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter;
lParam = (LPARAM) &CbtCreatewnda;
}
else
{
CbtCreatewndw.lpcs = &Csw;
CbtCreatewndw.hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter;
lParam = (LPARAM) &CbtCreatewndw;
}
break; break;
case HCBT_CLICKSKIPPED: case HCBT_CLICKSKIPPED:
MHook = (PMOUSEHOOKSTRUCT)((PCHAR) Common + Common->lParam); pMHook = (PMOUSEHOOKSTRUCT)((PCHAR) Common + Common->lParam);
lParam = (LPARAM) MHook; lParam = (LPARAM) pMHook;
break; break;
case HCBT_MOVESIZE: case HCBT_MOVESIZE:
prl = (PRECTL)((PCHAR) Common + Common->lParam); prl = (PRECTL)((PCHAR) Common + Common->lParam);
@ -475,7 +496,7 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
pcbtas = (LPCBTACTIVATESTRUCT)((PCHAR) Common + Common->lParam); pcbtas = (LPCBTACTIVATESTRUCT)((PCHAR) Common + Common->lParam);
lParam = (LPARAM) pcbtas; lParam = (LPARAM) pcbtas;
break; break;
case HCBT_KEYSKIPPED: case HCBT_KEYSKIPPED: /* The rest SEH support */
case HCBT_MINMAX: case HCBT_MINMAX:
case HCBT_SETFOCUS: case HCBT_SETFOCUS:
case HCBT_SYSCOMMAND: case HCBT_SYSCOMMAND:
@ -490,7 +511,17 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
} }
if (Common->Proc) 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 else
{ {
ERR("Common = 0x%x, Proc = 0x%x\n",Common,Common->Proc); ERR("Common = 0x%x, Proc = 0x%x\n",Common,Common->Proc);
@ -499,46 +530,86 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
{ {
case HCBT_CREATEWND: case HCBT_CREATEWND:
CbtCreatewndExtra->WndInsertAfter = CbtCreatewndw.hwndInsertAfter; 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;
} }
break; break;
} }
case WH_KEYBOARD_LL: case WH_KEYBOARD_LL:
KeyboardLlData = (PKBDLLHOOKSTRUCT)((PCHAR) Common + Common->lParam); ERR("WH_KEYBOARD_LL: Code %d, wParam %d\n",Common->Code,Common->wParam);
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) KeyboardLlData); pKeyboardLlData = (PKBDLLHOOKSTRUCT)((PCHAR) Common + Common->lParam);
RtlCopyMemory(&KeyboardLlData, pKeyboardLlData, sizeof(KBDLLHOOKSTRUCT));
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) &KeyboardLlData);
break; break;
case WH_MOUSE_LL: case WH_MOUSE_LL:
MouseLlData = (PMSLLHOOKSTRUCT)((PCHAR) Common + Common->lParam); pMouseLlData = (PMSLLHOOKSTRUCT)((PCHAR) Common + Common->lParam);
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) MouseLlData); RtlCopyMemory(&MouseLlData, pMouseLlData, sizeof(MSLLHOOKSTRUCT));
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) &MouseLlData);
break; break;
case WH_MOUSE: case WH_MOUSE: /* SEH support */
MHook = (PMOUSEHOOKSTRUCT)((PCHAR) Common + Common->lParam); pMHook = (PMOUSEHOOKSTRUCT)((PCHAR) Common + Common->lParam);
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) MHook); _SEH2_TRY
{
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) pMHook);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Hit = TRUE;
}
_SEH2_END;
break; break;
case WH_CALLWNDPROC: case WH_CALLWNDPROC:
CWP = (PCWPSTRUCT)((PCHAR) Common + Common->lParam); ERR("WH_CALLWNDPROC: Code %d, wParam %d\n",Common->Code,Common->wParam);
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) CWP); pCWP = (PCWPSTRUCT)((PCHAR) Common + Common->lParam);
RtlCopyMemory(&CWP, pCWP, sizeof(CWPSTRUCT));
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) &CWP);
break; break;
case WH_CALLWNDPROCRET: case WH_CALLWNDPROCRET:
CWPR = (PCWPRETSTRUCT)((PCHAR) Common + Common->lParam); pCWPR = (PCWPRETSTRUCT)((PCHAR) Common + Common->lParam);
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) CWPR); RtlCopyMemory(&CWPR, pCWPR, sizeof(CWPRETSTRUCT));
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) &CWPR);
break; 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_SYSMSGFILTER:
case WH_GETMESSAGE: case WH_GETMESSAGE:
Msg = (PMSG)((PCHAR) Common + Common->lParam); pMsg = (PMSG)((PCHAR) Common + Common->lParam);
// FIXME("UHOOK Memory: %x: %x\n",Common, Msg); RtlCopyMemory(&Msg, pMsg, sizeof(MSG));
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) 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; break;
case WH_FOREGROUNDIDLE: case WH_FOREGROUNDIDLE: /* <-- SEH support */
case WH_KEYBOARD: case WH_KEYBOARD:
case WH_SHELL: 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; break;
default: default:
return ZwCallbackReturn(NULL, 0, STATUS_NOT_SUPPORTED); 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); return ZwCallbackReturn(&Result, sizeof(LRESULT), STATUS_SUCCESS);
} }

View file

@ -138,6 +138,7 @@ EnableWindow(HWND hWnd,
if (Update) if (Update)
{ {
IntNotifyWinEvent(EVENT_OBJECT_STATECHANGE, hWnd, OBJID_WINDOW, CHILDID_SELF, 0);
SendMessageW(hWnd, WM_ENABLE, (LPARAM)bEnable, 0); SendMessageW(hWnd, WM_ENABLE, (LPARAM)bEnable, 0);
} }
// Return nonzero if it was disabled, or zero if it wasn't: // Return nonzero if it was disabled, or zero if it wasn't:

View file

@ -1636,6 +1636,8 @@ static BOOL FASTCALL MenuShowPopup(HWND hwndOwner, HMENU hmenu, UINT id, UINT fl
top_popup_hmenu = hmenu; top_popup_hmenu = hmenu;
} }
IntNotifyWinEvent(EVENT_SYSTEM_MENUPOPUPSTART, MenuInfo.Wnd, OBJID_CLIENT, CHILDID_SELF, 0);
/* Display the window */ /* Display the window */
SetWindowPos( MenuInfo.Wnd, HWND_TOPMOST, 0, 0, 0, 0, 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) if (MenuInfo.Flags & MF_POPUP)
{ {
IntNotifyWinEvent(EVENT_SYSTEM_MENUPOPUPEND, MenuInfo.Wnd, OBJID_CLIENT, CHILDID_SELF, 0);
DestroyWindow(MenuInfo.Wnd); DestroyWindow(MenuInfo.Wnd);
MenuInfo.Wnd = NULL; MenuInfo.Wnd = NULL;
@ -3518,7 +3521,11 @@ static BOOL FASTCALL MenuInitTracking(HWND hWnd, HMENU hMenu, BOOL bPopup, UINT
MenuInfo.Wnd = hWnd; MenuInfo.Wnd = hWnd;
MenuSetRosMenuInfo(&MenuInfo); MenuSetRosMenuInfo(&MenuInfo);
} }
IntNotifyWinEvent( EVENT_SYSTEM_MENUSTART,
hWnd,
MenuInfo.Flags & MF_SYSMENU ? OBJID_SYSMENU : OBJID_MENU,
CHILDID_SELF, 0);
return TRUE; return TRUE;
} }
/*********************************************************************** /***********************************************************************
@ -3528,6 +3535,7 @@ static BOOL FASTCALL MenuExitTracking(HWND hWnd, BOOL bPopup)
{ {
TRACE("hwnd=%p\n", hWnd); TRACE("hwnd=%p\n", hWnd);
IntNotifyWinEvent( EVENT_SYSTEM_MENUEND, hWnd, OBJID_WINDOW, CHILDID_SELF, 0);
SendMessageW( hWnd, WM_EXITMENULOOP, bPopup, 0 ); SendMessageW( hWnd, WM_EXITMENULOOP, bPopup, 0 );
ShowCaret(0); ShowCaret(0);
top_popup = 0; top_popup = 0;
@ -3645,7 +3653,7 @@ BOOL WINAPI TrackPopupMenuEx( HMENU Menu, UINT Flags, int x, int y,
{ {
BOOL ret = FALSE; BOOL ret = FALSE;
if (!IsMenu(Menu)) if (!IsMenu(Menu))
{ {
SetLastError( ERROR_INVALID_MENU_HANDLE ); SetLastError( ERROR_INVALID_MENU_HANDLE );
return FALSE; return FALSE;

View file

@ -2064,13 +2064,18 @@ SendMessageW(HWND Wnd,
if (Wnd != HWND_BROADCAST && (Msg < WM_DDE_FIRST || Msg > WM_DDE_LAST)) 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 /* NOTE: We can directly send messages to the window procedure
if *all* the following conditions are met: if *all* the following conditions are met:
* Window belongs to calling thread * Window belongs to calling thread
* The calling thread is not being hooked * 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); 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 (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 /* NOTE: We can directly send messages to the window procedure
if *all* the following conditions are met: if *all* the following conditions are met:
* Window belongs to calling thread * Window belongs to calling thread
* The calling thread is not being hooked * 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); return IntCallMessageProc(Window, Wnd, Msg, wParam, lParam, TRUE);

View file

@ -2060,7 +2060,11 @@ AnyPopup(VOID)
BOOL WINAPI BOOL WINAPI
IsWindowInDestroy(HWND hWnd) IsWindowInDestroy(HWND hWnd)
{ {
return NtUserIsWindowInDestroy(hWnd); PWND pwnd;
pwnd = ValidateHwnd(hWnd);
if (!pwnd)
return FALSE;
return ((pwnd->state2 & WNDS2_INDESTROY) == WNDS2_INDESTROY);
} }
/* /*

View file

@ -47,6 +47,25 @@ FindPropertyHandler(
IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinData; IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinData;
return STATUS_MORE_ENTRIES; 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) if (Property->Flags & KSPROPERTY_TYPE_BASICSUPPORT)
{ {
PULONG Flags; PULONG Flags;
@ -64,14 +83,21 @@ FindPropertyHandler(
/* clear flags */ /* clear flags */
*Flags = 0; *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) if (PropertySet[Index].PropertyItem[ItemIndex].GetSupported)
*Flags |= KSPROPERTY_TYPE_GET; *Flags |= KSPROPERTY_TYPE_GET;
if (PropertySet[Index].PropertyItem[ItemIndex].SetSupported) if (PropertySet[Index].PropertyItem[ItemIndex].SetSupported)
*Flags |= KSPROPERTY_TYPE_SET; *Flags |= KSPROPERTY_TYPE_SET;
IoStatus->Information = sizeof(ULONG);
if (OutputBufferLength >= sizeof(KSPROPERTY_DESCRIPTION)) if (OutputBufferLength >= sizeof(KSPROPERTY_DESCRIPTION))
{ {
/* get output buffer */ /* get output buffer */
@ -89,14 +115,6 @@ FindPropertyHandler(
} }
return STATUS_SUCCESS; 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 // store output size
Irp->IoStatus.Information = sizeof(GUID) * PropertySetsCount; Irp->IoStatus.Information = sizeof(GUID) * PropertySetsCount;
@ -189,7 +207,7 @@ KspPropertyHandler(
{ {
RtlMoveMemory(&Guid[Index], PropertySet[Index].Set, sizeof(GUID)); RtlMoveMemory(&Guid[Index], PropertySet[Index].Set, sizeof(GUID));
} }
return STATUS_SUCCESS; Status = STATUS_SUCCESS;
} }
/* done */ /* done */

View file

@ -327,7 +327,7 @@ CPortFilterWaveCyclic::Init(
NTSTATUS NTSTATUS
NTAPI NTAPI
CPortFilterWaveCyclic::FreePin( CPortFilterWaveCyclic::FreePin(
IN struct IPortPinWaveCyclic* Pin) IN PPORTPINWAVECYCLIC Pin)
{ {
ULONG Index; ULONG Index;

View file

@ -96,13 +96,14 @@ CPortFilterWavePci::NewIrpTarget(
return STATUS_UNSUCCESSFUL; 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 // no available instance
PC_ASSERT(0); return STATUS_UNSUCCESSFUL;
m_Pins[ConnectDetails->PinId]->Close(DeviceObject, NULL);
} }
// now create the pin // now create the pin
Status = NewPortPinWavePci(&Pin); Status = NewPortPinWavePci(&Pin);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -305,6 +306,26 @@ CPortFilterWavePci::Init(
return STATUS_SUCCESS; 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 NTSTATUS
NewPortFilterWavePci( NewPortFilterWavePci(
OUT IPortFilterWavePci ** OutFilter) OUT IPortFilterWavePci ** OutFilter)

View file

@ -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_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 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 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_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}}; const GUID KSEVENTSETID_Connection = {0x7f4bcbe0L, 0x9ea5, 0x11cf, {0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00}};

View file

@ -321,8 +321,7 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
STDMETHOD_(NTSTATUS, Init)(THIS_ STDMETHOD_(NTSTATUS, Init)(THIS_
IN KSPIN_CONNECT *ConnectDetails, IN KSPIN_CONNECT *ConnectDetails,
IN ULONG FrameSize, IN ULONG FrameSize,
IN ULONG Alignment, IN ULONG Alignment) PURE;
IN PVOID SilenceBuffer) PURE;
STDMETHOD_(NTSTATUS, AddMapping)(THIS_ STDMETHOD_(NTSTATUS, AddMapping)(THIS_
IN PIRP Irp, IN PIRP Irp,
@ -363,8 +362,7 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
STDMETHODIMP_(NTSTATUS) Init(THIS_ \ STDMETHODIMP_(NTSTATUS) Init(THIS_ \
IN KSPIN_CONNECT *ConnectDetails, \ IN KSPIN_CONNECT *ConnectDetails, \
IN ULONG FrameSize, \ IN ULONG FrameSize, \
IN ULONG Alignment, \ IN ULONG Alignment); \
IN PVOID SilenceBuffer); \
\ \
STDMETHODIMP_(NTSTATUS) AddMapping(THIS_ \ STDMETHODIMP_(NTSTATUS) AddMapping(THIS_ \
IN PIRP Irp, \ IN PIRP Irp, \
@ -599,6 +597,8 @@ DECLARE_INTERFACE_(IIrpStreamVirtual, IIrpStream)
#undef INTERFACE #undef INTERFACE
#define INTERFACE IPortFilterWavePci #define INTERFACE IPortFilterWavePci
struct IPortPinWavePci;
DECLARE_INTERFACE_(IPortFilterWavePci, IIrpTarget) DECLARE_INTERFACE_(IPortFilterWavePci, IIrpTarget)
{ {
DEFINE_ABSTRACT_UNKNOWN() DEFINE_ABSTRACT_UNKNOWN()
@ -607,6 +607,9 @@ DECLARE_INTERFACE_(IPortFilterWavePci, IIrpTarget)
STDMETHOD_(NTSTATUS, Init)(THIS_ STDMETHOD_(NTSTATUS, Init)(THIS_
IN PPORTWAVEPCI Port)PURE; IN PPORTWAVEPCI Port)PURE;
STDMETHOD_(NTSTATUS, FreePin)(THIS_
IN struct IPortPinWavePci* Pin)PURE;
}; };
typedef IPortFilterWavePci *PPORTFILTERWAVEPCI; typedef IPortFilterWavePci *PPORTFILTERWAVEPCI;
@ -614,7 +617,10 @@ typedef IPortFilterWavePci *PPORTFILTERWAVEPCI;
#define IMP_IPortFilterPci \ #define IMP_IPortFilterPci \
IMP_IIrpTarget; \ IMP_IIrpTarget; \
STDMETHODIMP_(NTSTATUS) Init(THIS_ \ STDMETHODIMP_(NTSTATUS) Init(THIS_ \
IN PPORTWAVEPCI Port) IN PPORTWAVEPCI Port); \
STDMETHODIMP_(NTSTATUS) FreePin(THIS_ \
IN struct IPortPinWavePci* Pin)
/***************************************************************************** /*****************************************************************************
* IPortPinWavePci * IPortPinWavePci

View file

@ -43,7 +43,6 @@ protected:
LIST_ENTRY m_IrpList; LIST_ENTRY m_IrpList;
LIST_ENTRY m_FreeIrpList; LIST_ENTRY m_FreeIrpList;
PIRP m_Irp; PIRP m_Irp;
PVOID m_SilenceBuffer;
ULONG m_OutOfMapping; ULONG m_OutOfMapping;
ULONG m_MaxFrameSize; ULONG m_MaxFrameSize;
@ -84,12 +83,10 @@ NTAPI
CIrpQueue::Init( CIrpQueue::Init(
IN KSPIN_CONNECT *ConnectDetails, IN KSPIN_CONNECT *ConnectDetails,
IN ULONG FrameSize, IN ULONG FrameSize,
IN ULONG Alignment, IN ULONG Alignment)
IN PVOID SilenceBuffer)
{ {
m_ConnectDetails = ConnectDetails; m_ConnectDetails = ConnectDetails;
m_MaxFrameSize = FrameSize; m_MaxFrameSize = FrameSize;
m_SilenceBuffer = SilenceBuffer;
m_Alignment = Alignment; m_Alignment = Alignment;
InitializeListHead(&m_IrpList); InitializeListHead(&m_IrpList);
@ -259,22 +256,13 @@ CIrpQueue::GetMapping(
m_CurrentOffset = Offset = 0; 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) if (!Irp)
{ {
// no irp buffer available // no irp buffer available
DPRINT("NoIrp\n");
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }
// get stream header // get stream header
StreamHeader = (PKSSTREAM_HEADER)Irp->Tail.Overlay.DriverContext[2]; StreamHeader = (PKSSTREAM_HEADER)Irp->Tail.Overlay.DriverContext[2];

View file

@ -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)) if (!NT_SUCCESS(Status))
{ {
DPRINT("IrpQueue_Init failed with %x\n", Status); DPRINT("IrpQueue_Init failed with %x\n", Status);

View file

@ -73,7 +73,7 @@ protected:
ULONG m_StopCount; ULONG m_StopCount;
KSAUDIO_POSITION m_Position; KSAUDIO_POSITION m_Position;
KSALLOCATOR_FRAMING m_AllocatorFraming; KSALLOCATOR_FRAMING m_AllocatorFraming;
SUBDEVICE_DESCRIPTOR m_Descriptor; PSUBDEVICE_DESCRIPTOR m_Descriptor;
KSPIN_LOCK m_EventListLock; KSPIN_LOCK m_EventListLock;
LIST_ENTRY m_EventList; 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 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 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 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_CONNECTIONSET(PinWaveCyclicConnectionSet, PinWaveCyclicState, PinWaveCyclicDataFormat, PinWaveCyclicAllocatorFraming);
DEFINE_KSPROPERTY_AUDIOSET(PinWaveCyclicAudioSet, PinWaveCyclicAudioPosition); DEFINE_KSPROPERTY_AUDIOSET(PinWaveCyclicAudioSet, PinWaveCyclicAudioPosition);
DEFINE_KSPROPERTY_DRMSET(PinWaveCyclicDRMSet, PinWaveCyclicDRMHandler);
KSEVENT_ITEM PinWaveCyclicConnectionEventSet = KSEVENT_ITEM PinWaveCyclicConnectionEventSet =
{ {
@ -146,6 +148,13 @@ KSPROPERTY_SET PinWaveCyclicPropertySet[] =
(const KSPROPERTY_ITEM*)&PinWaveCyclicAudioSet, (const KSPROPERTY_ITEM*)&PinWaveCyclicAudioSet,
0, 0,
NULL NULL
},
{
&KSPROPSETID_DrmAudioStream,
sizeof(PinWaveCyclicDRMSet) / sizeof(KSPROPERTY_ITEM),
(const KSPROPERTY_ITEM*)&PinWaveCyclicDRMSet,
0,
NULL
} }
}; };
@ -192,6 +201,19 @@ CPortPinWaveCyclic::QueryInterface(
return STATUS_UNSUCCESSFUL; 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 NTSTATUS
NTAPI NTAPI
PinWaveCyclicAddEndOfStreamEvent( PinWaveCyclicAddEndOfStreamEvent(
@ -448,12 +470,14 @@ PinWaveCyclicState(
{ {
// FIXME // FIXME
// complete with successful state // complete with successful state
Pin->m_Stream->Silence(Pin->m_CommonBuffer, Pin->m_CommonBufferSize);
Pin->m_IrpQueue->CancelBuffers(); Pin->m_IrpQueue->CancelBuffers();
Pin->m_Position.PlayOffset = 0; Pin->m_Position.PlayOffset = 0;
Pin->m_Position.WriteOffset = 0; Pin->m_Position.WriteOffset = 0;
} }
else if (Pin->m_State == KSSTATE_STOP) else if (Pin->m_State == KSSTATE_STOP)
{ {
Pin->m_Stream->Silence(Pin->m_CommonBuffer, Pin->m_CommonBufferSize);
Pin->m_IrpQueue->CancelBuffers(); Pin->m_IrpQueue->CancelBuffers();
Pin->m_Position.PlayOffset = 0; Pin->m_Position.PlayOffset = 0;
Pin->m_Position.WriteOffset = 0; Pin->m_Position.WriteOffset = 0;
@ -662,6 +686,7 @@ CPortPinWaveCyclic::UpdateCommonBuffer(
ULONG BufferLength; ULONG BufferLength;
ULONG BytesToCopy; ULONG BytesToCopy;
ULONG BufferSize; ULONG BufferSize;
ULONG Gap;
PUCHAR Buffer; PUCHAR Buffer;
NTSTATUS Status; NTSTATUS Status;
@ -672,7 +697,18 @@ CPortPinWaveCyclic::UpdateCommonBuffer(
{ {
Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize); Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
if (!NT_SUCCESS(Status)) 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); BytesToCopy = min(BufferLength, BufferSize);
@ -688,7 +724,7 @@ CPortPinWaveCyclic::UpdateCommonBuffer(
m_IrpQueue->UpdateMapping(BytesToCopy); m_IrpQueue->UpdateMapping(BytesToCopy);
m_CommonBufferOffset += BytesToCopy; m_CommonBufferOffset += BytesToCopy;
BufferLength = Position - m_CommonBufferOffset; BufferLength -= BytesToCopy;
m_Position.PlayOffset += BytesToCopy; m_Position.PlayOffset += BytesToCopy;
if (m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING) if (m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING)
@ -720,7 +756,18 @@ CPortPinWaveCyclic::UpdateCommonBufferOverlap(
{ {
Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize); Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
if (!NT_SUCCESS(Status)) 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); BytesToCopy = min(BufferLength, BufferSize);
@ -741,7 +788,7 @@ CPortPinWaveCyclic::UpdateCommonBufferOverlap(
m_CommonBufferOffset += BytesToCopy; m_CommonBufferOffset += BytesToCopy;
m_Position.PlayOffset += BytesToCopy; m_Position.PlayOffset += BytesToCopy;
BufferLength = m_CommonBufferSize - m_CommonBufferOffset; BufferLength -=BytesToCopy;
if (m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING) if (m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING)
{ {
@ -751,7 +798,6 @@ CPortPinWaveCyclic::UpdateCommonBufferOverlap(
m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset; m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset;
} }
} }
} }
if (Gap == Length) if (Gap == Length)
@ -773,22 +819,13 @@ CPortPinWaveCyclic::RequestService()
{ {
ULONG Position; ULONG Position;
NTSTATUS Status; NTSTATUS Status;
PUCHAR Buffer;
ULONG BufferSize;
ULONGLONG OldOffset, NewOffset; ULONGLONG OldOffset, NewOffset;
PC_ASSERT_IRQL(DISPATCH_LEVEL); PC_ASSERT_IRQL(DISPATCH_LEVEL);
if (m_State == KSSTATE_RUN) if (m_State == KSSTATE_RUN)
{ {
Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
if (!NT_SUCCESS(Status))
{
return;
}
Status = m_Stream->GetPosition(&Position); 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; OldOffset = m_Position.PlayOffset;
@ -841,7 +878,7 @@ CPortPinWaveCyclic::DeviceIoControl(
if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY) if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY)
{ {
/* handle property with subdevice descriptor */ /* 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) if (Status == STATUS_NOT_FOUND)
{ {
@ -854,11 +891,11 @@ CPortPinWaveCyclic::DeviceIoControl(
} }
else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_ENABLE_EVENT) 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) 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) else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_RESET_STATE)
{ {
@ -960,27 +997,29 @@ CPortPinWaveCyclic::Close(
{ {
// free format // free format
FreeItem(m_Format, TAG_PORTCLASS); FreeItem(m_Format, TAG_PORTCLASS);
// format is freed
m_Format = NULL; m_Format = NULL;
} }
if (m_IrpQueue) if (m_IrpQueue)
{ {
// fixme cancel irps // cancel remaining irps
m_IrpQueue->CancelBuffers();
// release irp queue
m_IrpQueue->Release(); m_IrpQueue->Release();
}
// queue is freed
if (m_Port) m_IrpQueue = NULL;
{
// release reference to port driver
m_Port->Release();
m_Port = NULL;
} }
if (m_ServiceGroup) if (m_ServiceGroup)
{ {
// remove member from service group // remove member from service group
m_ServiceGroup->RemoveMember(PSERVICESINK(this)); m_ServiceGroup->RemoveMember(PSERVICESINK(this));
// do not release service group, it is released by the miniport object
m_ServiceGroup = NULL; m_ServiceGroup = NULL;
} }
@ -999,22 +1038,37 @@ CPortPinWaveCyclic::Close(
// set state to stop // set state to stop
m_State = KSSTATE_STOP; m_State = KSSTATE_STOP;
DPRINT("Closing stream at Irql %u\n", KeGetCurrentIrql()); DPRINT("Closing stream at Irql %u\n", KeGetCurrentIrql());
// release stream // release stream
m_Stream->Release(); m_Stream->Release();
// stream is now freed
m_Stream = NULL;
} }
if (m_Filter) if (m_Filter)
{ {
// release reference to filter instance // disconnect pin from filter
m_Filter->FreePin((PPORTPINWAVECYCLIC)this); m_Filter->FreePin((PPORTPINWAVECYCLIC)this);
// release filter reference
m_Filter->Release(); m_Filter->Release();
// pin is done with filter
m_Filter = NULL; 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.Information = 0;
Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT); IoCompleteRequest(Irp, IO_NO_INCREMENT);
@ -1103,7 +1157,6 @@ CPortPinWaveCyclic::Init(
PKSDATAFORMAT DataFormat; PKSDATAFORMAT DataFormat;
PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT DeviceObject;
BOOLEAN Capture; BOOLEAN Capture;
PVOID SilenceBuffer;
PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor = NULL; PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor = NULL;
//IDrmAudioStream * DrmAudio = NULL; //IDrmAudioStream * DrmAudio = NULL;
@ -1162,7 +1215,6 @@ CPortPinWaveCyclic::Init(
#endif #endif
DPRINT1("CPortPinWaveCyclic::Init Status %x PinId %u Capture %u\n", Status, ConnectDetails->PinId, Capture); 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)) if (!NT_SUCCESS(Status))
return Status; return Status;
@ -1186,18 +1238,26 @@ CPortPinWaveCyclic::Init(
InitializeListHead(&m_EventList); InitializeListHead(&m_EventList);
KeInitializeSpinLock(&m_EventListLock); KeInitializeSpinLock(&m_EventListLock);
/* set up subdevice descriptor */ Status = PcCreateSubdeviceDescriptor(&m_Descriptor,
RtlZeroMemory(&m_Descriptor, sizeof(SUBDEVICE_DESCRIPTOR)); SubDeviceDescriptor->InterfaceCount,
m_Descriptor.FilterPropertySet = PinWaveCyclicPropertySet; SubDeviceDescriptor->Interfaces,
m_Descriptor.FilterPropertySetCount = sizeof(PinWaveCyclicPropertySet) / sizeof(KSPROPERTY_SET); 0, /* FIXME KSINTERFACE_STANDARD with KSINTERFACE_STANDARD_STREAMING / KSINTERFACE_STANDARD_LOOPED_STREAMING */
m_Descriptor.UnknownStream = (PUNKNOWN)m_Stream; NULL,
m_Descriptor.DeviceDescriptor = SubDeviceDescriptor->DeviceDescriptor; sizeof(PinWaveCyclicPropertySet) / sizeof(KSPROPERTY_SET),
m_Descriptor.UnknownMiniport = SubDeviceDescriptor->UnknownMiniport; PinWaveCyclicPropertySet,
m_Descriptor.PortPin = (PVOID)this; 0,
m_Descriptor.EventSetCount = sizeof(PinWaveCyclicEventSet) / sizeof(KSEVENT_SET); 0,
m_Descriptor.EventSet = PinWaveCyclicEventSet; 0,
m_Descriptor.EventList = &m_EventList; NULL,
m_Descriptor.EventListLock = &m_EventListLock; 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 // initialize reset state
m_ResetState = KSRESET_END; m_ResetState = KSRESET_END;
@ -1230,9 +1290,7 @@ CPortPinWaveCyclic::Init(
PC_ASSERT(NT_SUCCESS(Status)); PC_ASSERT(NT_SUCCESS(Status));
PC_ASSERT(m_FrameSize); PC_ASSERT(m_FrameSize);
SilenceBuffer = AllocateItem(NonPagedPool, m_FrameSize, TAG_PORTCLASS); 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);
if (!SilenceBuffer)
return STATUS_INSUFFICIENT_RESOURCES;
/* set up allocator framing */ /* set up allocator framing */
@ -1243,10 +1301,9 @@ CPortPinWaveCyclic::Init(
m_AllocatorFraming.Reserved = 0; m_AllocatorFraming.Reserved = 0;
m_AllocatorFraming.FrameSize = m_FrameSize; m_AllocatorFraming.FrameSize = m_FrameSize;
m_Stream->Silence(SilenceBuffer, m_FrameSize);
m_Stream->Silence(m_CommonBuffer, m_CommonBufferSize); 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)) if (!NT_SUCCESS(Status))
{ {
m_IrpQueue->Release(); m_IrpQueue->Release();
@ -1265,9 +1322,6 @@ CPortPinWaveCyclic::Init(
m_Port = Port; m_Port = Port;
m_Filter = Filter; 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; return STATUS_SUCCESS;
} }

View file

@ -62,8 +62,6 @@ protected:
KSAUDIO_POSITION m_Position; KSAUDIO_POSITION m_Position;
ULONG m_StopCount; ULONG m_StopCount;
ULONG m_Delay;
BOOL m_bUsePrefetch; BOOL m_bUsePrefetch;
ULONG m_PrefetchOffset; ULONG m_PrefetchOffset;
SUBDEVICE_DESCRIPTOR m_Descriptor; SUBDEVICE_DESCRIPTOR m_Descriptor;
@ -637,41 +635,85 @@ CPortPinWavePci::Close(
IN PDEVICE_OBJECT DeviceObject, IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp) IN PIRP Irp)
{ {
ISubdevice *SubDevice;
NTSTATUS Status; 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) if (m_ServiceGroup)
{ {
// remove member from service group
m_ServiceGroup->RemoveMember(PSERVICESINK(this)); 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_Stream)
{ {
if (m_State != KSSTATE_STOP) 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(); m_Stream->Release();
// stream is now freed
m_Stream = NULL;
} }
Status = m_Port->QueryInterface(IID_ISubdevice, (PVOID*)&SubDevice); if (m_Filter)
if (NT_SUCCESS(Status))
{ {
Status = SubDevice->GetDescriptor(&Descriptor); // disconnect pin from filter
if (NT_SUCCESS(Status)) m_Filter->FreePin((PPORTPINWAVEPCI)this);
{
Descriptor->Factory.Instances[m_ConnectDetails->PinId].CurrentPinInstanceCount--; // release filter reference
} m_Filter->Release();
SubDevice->Release();
// pin is done with filter
m_Filter = NULL;
} }
if (m_Format) if (m_Port)
{ {
FreeItem(m_Format, TAG_PORTCLASS); // release reference to port driver
m_Format = NULL; m_Port->Release();
// work is done for port
m_Port = NULL;
} }
// successfully complete irp
Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0; Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT); IoCompleteRequest(Irp, IO_NO_INCREMENT);
@ -756,33 +798,18 @@ CPortPinWavePci::Init(
NTSTATUS Status; NTSTATUS Status;
PKSDATAFORMAT DataFormat; PKSDATAFORMAT DataFormat;
BOOLEAN Capture; BOOLEAN Capture;
ISubdevice * Subdevice = NULL;
PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor = NULL;
Port->AddRef(); // check if it is a source / sink pin
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);
if (KsPinDescriptor->Communication == KSPIN_COMMUNICATION_SINK && KsPinDescriptor->DataFlow == KSPIN_DATAFLOW_IN) if (KsPinDescriptor->Communication == KSPIN_COMMUNICATION_SINK && KsPinDescriptor->DataFlow == KSPIN_DATAFLOW_IN)
{ {
// sink pin
Capture = FALSE; Capture = FALSE;
} }
else if (KsPinDescriptor->Communication == KSPIN_COMMUNICATION_SINK && KsPinDescriptor->DataFlow == KSPIN_DATAFLOW_OUT) else if (KsPinDescriptor->Communication == KSPIN_COMMUNICATION_SINK && KsPinDescriptor->DataFlow == KSPIN_DATAFLOW_OUT)
{ {
// source pin
Capture = TRUE; Capture = TRUE;
} }
else else
@ -792,6 +819,45 @@ CPortPinWavePci::Init(
while(TRUE); 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, Status = m_Miniport->NewStream(&m_Stream,
NULL, NULL,
NonPagedPool, NonPagedPool,
@ -805,47 +871,81 @@ CPortPinWavePci::Init(
DPRINT("IPortPinWavePci_fnInit Status %x\n", Status); DPRINT("IPortPinWavePci_fnInit Status %x\n", Status);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
return Status;
if (m_ServiceGroup)
{ {
Status = m_ServiceGroup->AddMember(PSERVICESINK(this)); // free references
if (!NT_SUCCESS(Status)) Port->Release();
{ Filter->Release();
DPRINT("Failed to add pin to service group\n");
return Status; // 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 // get allocator requirements for pin
m_Delay = Int32x32To64(10, -10000);
Status = m_Stream->GetAllocatorFraming(&m_AllocatorFraming); 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)) 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", // initialize irp queue
m_AllocatorFraming.OptionsFlags, m_AllocatorFraming.RequirementsFlags, m_AllocatorFraming.PoolType, m_AllocatorFraming.Frames, m_AllocatorFraming.FrameSize, m_AllocatorFraming.FileAlignment); 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 // get subdevice interface
Status = Port->QueryInterface(IID_ISubdevice, (PVOID*)&Subdevice); Status = Port->QueryInterface(IID_ISubdevice, (PVOID*)&Subdevice);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
return Status; {
// this function should never fail
PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor = NULL; ASSERT(0);
}
// get subdevice descriptor
Status = Subdevice->GetDescriptor(&SubDeviceDescriptor); Status = Subdevice->GetDescriptor(&SubDeviceDescriptor);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
// failed to get descriptor // this function should never fail
Subdevice->Release(); ASSERT(0);
return Status;
} }
// release subdevice
Subdevice->Release();
/* set up subdevice descriptor */ /* set up subdevice descriptor */
RtlZeroMemory(&m_Descriptor, sizeof(SUBDEVICE_DESCRIPTOR)); RtlZeroMemory(&m_Descriptor, sizeof(SUBDEVICE_DESCRIPTOR));
m_Descriptor.FilterPropertySet = PinWavePciPropertySet; m_Descriptor.FilterPropertySet = PinWavePciPropertySet;
@ -855,21 +955,30 @@ CPortPinWavePci::Init(
m_Descriptor.UnknownMiniport = SubDeviceDescriptor->UnknownMiniport; m_Descriptor.UnknownMiniport = SubDeviceDescriptor->UnknownMiniport;
m_Descriptor.PortPin = (PVOID)this; m_Descriptor.PortPin = (PVOID)this;
if (m_ServiceGroup)
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))
{ {
DPRINT("IrpQueue_Init failed with %x\n", Status); Status = m_ServiceGroup->AddMember(PSERVICESINK(this));
return Status; 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; return STATUS_SUCCESS;
} }

View file

@ -587,7 +587,7 @@ CPortPinWaveRT::Init(
goto cleanup; goto cleanup;
} }
Status = m_IrpQueue->Init(ConnectDetails, 0, 0, NULL); Status = m_IrpQueue->Init(ConnectDetails, 0, 0);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
goto cleanup; goto cleanup;

View file

@ -275,12 +275,12 @@ CPortWaveCyclic::Init(
} }
// create the subdevice descriptor // create the subdevice descriptor
Status = PcCreateSubdeviceDescriptor(&m_SubDeviceDescriptor, Status = PcCreateSubdeviceDescriptor(&m_SubDeviceDescriptor,
4, 4,
InterfaceGuids, InterfaceGuids,
0, 0,
NULL, NULL,
2, 2,
WaveCyclicPropertySet, WaveCyclicPropertySet,
0, 0,
0, 0,

View file

@ -356,6 +356,22 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\
DEFINE_KSPROPERTY_ITEM_AUDIO_POSITION(PropPositionHandler, PropPositionHandler)\ 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,\ #define DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PinSet,\
PropGeneral, PropInstances, PropIntersection)\ PropGeneral, PropInstances, PropIntersection)\
DEFINE_KSPROPERTY_TABLE(PinSet) {\ DEFINE_KSPROPERTY_TABLE(PinSet) {\

File diff suppressed because it is too large Load diff

View file

@ -235,8 +235,9 @@ HalpReportResourceUsage(IN PUNICODE_STRING HalName,
if (!HalpGetInfoFromACPI) if (!HalpGetInfoFromACPI)
{ {
/* No, so use our local table */ /* No, so use our local table */
Port = HalpComPortIrqMapping[0][0]; for (i = 0, Port = HalpComPortIrqMapping[i][0];
for (i = 0; Port; i++) Port;
i++, Port = HalpComPortIrqMapping[i][0])
{ {
/* Is this the port we want? */ /* Is this the port we want? */
if (Port == (ULONG_PTR)KdComPortInUse) if (Port == (ULONG_PTR)KdComPortInUse)
@ -248,9 +249,6 @@ HalpReportResourceUsage(IN PUNICODE_STRING HalName,
PRIMARY_VECTOR_BASE, PRIMARY_VECTOR_BASE,
HIGH_LEVEL); HIGH_LEVEL);
} }
/* Next port */
Port = HalpComPortIrqMapping[i][0];
} }
} }
} }
@ -509,6 +507,9 @@ HalpEnableInterruptHandler(IN UCHAR Flags,
IN PVOID Handler, IN PVOID Handler,
IN KINTERRUPT_MODE Mode) IN KINTERRUPT_MODE Mode)
{ {
/* Set the IDT_LATCHED flag for latched interrupts */
if (Mode == Latched) Flags |= IDT_LATCHED;
/* Register the vector */ /* Register the vector */
HalpRegisterVector(Flags, BusVector, SystemVector, Irql); HalpRegisterVector(Flags, BusVector, SystemVector, Irql);

View file

@ -1005,11 +1005,6 @@ DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000", KSPROPTYPESETID_Genera
KSPROPERTY_DIRECTSOUND3DLISTENER_VELOCITY KSPROPERTY_DIRECTSOUND3DLISTENER_VELOCITY
*/ */
#define KSPROPSETID_DrmAudioStream
/*
KSPROPERTY_DRMAUDIOSTREAM_CONTENTID
*/
#define KSPROPSETID_Hrtf3d #define KSPROPSETID_Hrtf3d
/* /*
KSPROPERTY_HRTF3D_FILTER_FORMAT KSPROPERTY_HRTF3D_FILTER_FORMAT

View file

@ -565,6 +565,15 @@ typedef struct {
#endif // !_NTDDK_ #endif // !_NTDDK_
} LOOPEDSTREAMING_POSITION_EVENT_DATA, *PLOOPEDSTREAMING_POSITION_EVENT_DATA ; } 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 SysAudio Properties

View file

@ -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); VOID NTAPI RtlInitLargeUnicodeString(IN OUT PLARGE_UNICODE_STRING,IN PCWSTR,IN INT);
BOOL NTAPI RtlLargeStringToUnicodeString( PUNICODE_STRING, PLARGE_STRING); BOOL NTAPI RtlLargeStringToUnicodeString( PUNICODE_STRING, PLARGE_STRING);
#define NB_HOOKS (WH_MAXHOOK-WH_MINHOOK+1)
typedef struct _DESKTOPINFO typedef struct _DESKTOPINFO
{ {
PVOID pvDesktopBase; PVOID pvDesktopBase;
PVOID pvDesktopLimit; PVOID pvDesktopLimit;
struct _WND *spwnd; struct _WND *spwnd;
DWORD fsHooks; DWORD fsHooks;
struct tagHOOK * aphkStart[16]; LIST_ENTRY aphkStart[NB_HOOKS];
HWND hTaskManWindow; HWND hTaskManWindow;
HWND hProgmanWindow; HWND hProgmanWindow;
@ -127,15 +129,23 @@ typedef struct _PROCMARKHEAD
/* Window Client Information structure */ /* Window Client Information structure */
struct _ETHREAD; struct _ETHREAD;
#define WEF_SETBYWNDPTI 0x0001
typedef struct tagHOOK typedef struct tagHOOK
{ {
THRDESKHEAD head; 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 */ LIST_ENTRY Chain; /* Hook chain entry */
struct _ETHREAD* Thread; /* Thread owning the hook */ struct _ETHREAD* Thread; /* Thread owning the hook */
int HookId; /* Hook table index */
HOOKPROC Proc; /* Hook function */ HOOKPROC Proc; /* Hook function */
BOOLEAN Ansi; /* Is it an Ansi hook? */ BOOLEAN Ansi; /* Is it an Ansi hook? */
ULONG Flags; /* Some internal flags */
UNICODE_STRING ModuleName; /* Module name for global hooks */ UNICODE_STRING ModuleName; /* Module name for global hooks */
} HOOK, *PHOOK; } HOOK, *PHOOK;
@ -3149,7 +3159,6 @@ typedef struct tagKMDDELPARAM
#define NOPARAM_ROUTINE_ANYPOPUP 0xffff0006 #define NOPARAM_ROUTINE_ANYPOPUP 0xffff0006
#define ONEPARAM_ROUTINE_CSRSS_GUICHECK 0xffff0008 #define ONEPARAM_ROUTINE_CSRSS_GUICHECK 0xffff0008
#define ONEPARAM_ROUTINE_SWITCHCARETSHOWING 0xfffe0008 #define ONEPARAM_ROUTINE_SWITCHCARETSHOWING 0xfffe0008
#define ONEPARAM_ROUTINE_ISWINDOWINDESTROY 0xfffe000c
#define ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING 0xfffe000d #define ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING 0xfffe000d
#define ONEPARAM_ROUTINE_GETDESKTOPMAPPING 0xfffe000e #define ONEPARAM_ROUTINE_GETDESKTOPMAPPING 0xfffe000e
#define ONEPARAM_ROUTINE_MSQSETWAKEMASK 0xfffe0027 #define ONEPARAM_ROUTINE_MSQSETWAKEMASK 0xfffe0027
@ -3167,6 +3176,7 @@ typedef struct tagKMDDELPARAM
#define TWOPARAM_ROUTINE_SETCARETPOS 0xfffd0060 #define TWOPARAM_ROUTINE_SETCARETPOS 0xfffd0060
#define TWOPARAM_ROUTINE_REGISTERLOGONPROC 0xfffd0062 #define TWOPARAM_ROUTINE_REGISTERLOGONPROC 0xfffd0062
#define TWOPARAM_ROUTINE_ROS_UPDATEUISTATE 0x1004 #define TWOPARAM_ROUTINE_ROS_UPDATEUISTATE 0x1004
#define HWNDPARAM_ROUTINE_ROS_NOTIFYWINEVENT 0x1005
DWORD DWORD
NTAPI NTAPI

View file

@ -514,6 +514,21 @@ IopAssignDeviceResources(
IN PDEVICE_NODE DeviceNode 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 // PNP Routines
// //

View file

@ -841,7 +841,7 @@ IoGetConfigurationInformation(VOID)
} }
/* /*
* @unimplemented * @halfplemented
*/ */
NTSTATUS NTAPI NTSTATUS NTAPI
IoReportResourceUsage(PUNICODE_STRING DriverClassName, IoReportResourceUsage(PUNICODE_STRING DriverClassName,
@ -876,13 +876,48 @@ IoReportResourceUsage(PUNICODE_STRING DriverClassName,
* a conflict is detected with another driver. * a conflict is detected with another driver.
*/ */
{ {
UNIMPLEMENTED; NTSTATUS Status;
*ConflictDetected = FALSE; PCM_RESOURCE_LIST ResourceList;
return STATUS_SUCCESS;
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 NTSTATUS NTAPI
IoAssignResources(PUNICODE_STRING RegistryPath, IoAssignResources(PUNICODE_STRING RegistryPath,
@ -892,8 +927,23 @@ IoAssignResources(PUNICODE_STRING RegistryPath,
PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources, PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
PCM_RESOURCE_LIST* AllocatedResources) PCM_RESOURCE_LIST* AllocatedResources)
{ {
UNIMPLEMENTED; NTSTATUS Status;
return(STATUS_NOT_IMPLEMENTED);
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;
} }
/* /*

View file

@ -38,9 +38,6 @@ NTSTATUS
IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode,
PVOID Context); PVOID Context);
NTSTATUS
IopDetectResourceConflict(IN PCM_RESOURCE_LIST ResourceList);
NTSTATUS NTSTATUS
PpSetCustomTargetEvent(IN PDEVICE_OBJECT DeviceObject, PpSetCustomTargetEvent(IN PDEVICE_OBJECT DeviceObject,
IN OUT PKEVENT SyncEvent OPTIONAL, IN OUT PKEVENT SyncEvent OPTIONAL,
@ -379,7 +376,7 @@ IoReportResourceForDetection(IN PDRIVER_OBJECT DriverObject,
ResourceList = DriverList; ResourceList = DriverList;
/* Look for a resource conflict */ /* Look for a resource conflict */
Status = IopDetectResourceConflict(ResourceList); Status = IopDetectResourceConflict(ResourceList, FALSE, NULL);
if (Status == STATUS_CONFLICTING_ADDRESSES) if (Status == STATUS_CONFLICTING_ADDRESSES)
{ {
/* Oh noes */ /* Oh noes */

View file

@ -12,12 +12,6 @@
#define NDEBUG #define NDEBUG
#include <debug.h> #include <debug.h>
NTSTATUS
IopDetectResourceConflict(
IN PCM_RESOURCE_LIST ResourceList,
IN BOOLEAN Silent,
OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor);
static static
BOOLEAN BOOLEAN
IopCheckDescriptorForConflict(PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc, OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) IopCheckDescriptorForConflict(PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc, OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor)
@ -187,8 +181,8 @@ IopFindInterruptResource(
return FALSE; return FALSE;
} }
static
NTSTATUS NTSTATUS NTAPI
IopCreateResourceListFromRequirements( IopCreateResourceListFromRequirements(
IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList, IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList,
OUT PCM_RESOURCE_LIST *ResourceList) OUT PCM_RESOURCE_LIST *ResourceList)
@ -336,9 +330,6 @@ IopCheckResourceDescriptor(
ULONG i, ii; ULONG i, ii;
BOOLEAN Result = FALSE; BOOLEAN Result = FALSE;
if (ResDesc->ShareDisposition == CmResourceShareShared)
return FALSE;
for (i = 0; i < ResourceList->Count; i++) for (i = 0; i < ResourceList->Count; i++)
{ {
PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList->List[i].PartialResourceList; 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) if (DeviceNode->ResourceList)
{ {
PWCHAR DeviceName = NULL;
UNICODE_STRING NameU; UNICODE_STRING NameU;
UNICODE_STRING Suffix; UNICODE_STRING RawSuffix, TranslatedSuffix;
ULONG OldLength = 0; ULONG OldLength = 0;
ASSERT(DeviceNode->ResourceListTranslated); ASSERT(DeviceNode->ResourceListTranslated);
RtlInitUnicodeString(&TranslatedSuffix, L".Translated");
RtlInitUnicodeString(&RawSuffix, L".Raw");
Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject, Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject,
DevicePropertyPhysicalDeviceObjectName, DevicePropertyPhysicalDeviceObjectName,
0, 0,
NULL, NULL,
&OldLength); &OldLength);
if ((OldLength != 0) && (Status == STATUS_BUFFER_TOO_SMALL)) if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL)
{ {
DeviceName = ExAllocatePool(NonPagedPool, OldLength); ASSERT(OldLength);
ASSERT(DeviceName);
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, RtlAppendUnicodeStringToString(&NameU, &RawSuffix);
DevicePropertyPhysicalDeviceObjectName,
OldLength,
DeviceName,
&OldLength);
RtlInitUnicodeString(&NameU, DeviceName);
}
else
{
/* Some failure */
ASSERT(!NT_SUCCESS(Status));
return Status;
}
RtlInitUnicodeString(&Suffix, L".Raw");
RtlAppendUnicodeStringToString(&NameU, &Suffix);
Status = ZwSetValueKey(PnpMgrLevel2, Status = ZwSetValueKey(PnpMgrLevel2,
&NameU, &NameU,
@ -659,14 +671,14 @@ IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
ZwClose(PnpMgrLevel2); ZwClose(PnpMgrLevel2);
ExFreePool(NameU.Buffer);
return Status; return Status;
} }
/* "Remove" the suffix by setting the length back to what it used to be */ /* "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, &TranslatedSuffix);
RtlAppendUnicodeStringToString(&NameU, &Suffix);
Status = ZwSetValueKey(PnpMgrLevel2, Status = ZwSetValueKey(PnpMgrLevel2,
&NameU, &NameU,
@ -675,8 +687,8 @@ IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2
DeviceNode->ResourceListTranslated, DeviceNode->ResourceListTranslated,
PnpDetermineResourceListSize(DeviceNode->ResourceListTranslated)); PnpDetermineResourceListSize(DeviceNode->ResourceListTranslated));
ZwClose(PnpMgrLevel2); ZwClose(PnpMgrLevel2);
ASSERT(DeviceName); ExFreePool(NameU.Buffer);
ExFreePool(DeviceName);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
return Status; return Status;
} }
@ -718,7 +730,7 @@ IopTranslateDeviceResources(
DeviceNode->ResourceListTranslated = ExAllocatePool(PagedPool, ListSize); DeviceNode->ResourceListTranslated = ExAllocatePool(PagedPool, ListSize);
if (!DeviceNode->ResourceListTranslated) if (!DeviceNode->ResourceListTranslated)
{ {
Status =STATUS_NO_MEMORY; Status = STATUS_NO_MEMORY;
goto cleanup; goto cleanup;
} }
RtlCopyMemory(DeviceNode->ResourceListTranslated, DeviceNode->ResourceList, ListSize); RtlCopyMemory(DeviceNode->ResourceListTranslated, DeviceNode->ResourceList, ListSize);
@ -743,6 +755,7 @@ IopTranslateDeviceResources(
&DescriptorTranslated->u.Port.Start)) &DescriptorTranslated->u.Port.Start))
{ {
Status = STATUS_UNSUCCESSFUL; Status = STATUS_UNSUCCESSFUL;
DPRINT1("Failed to translate port resource (Start: 0xI64x)\n", DescriptorRaw->u.Port.Start.QuadPart);
goto cleanup; goto cleanup;
} }
break; break;
@ -756,6 +769,14 @@ IopTranslateDeviceResources(
DescriptorRaw->u.Interrupt.Vector, DescriptorRaw->u.Interrupt.Vector,
(PKIRQL)&DescriptorTranslated->u.Interrupt.Level, (PKIRQL)&DescriptorTranslated->u.Interrupt.Level,
&DescriptorTranslated->u.Interrupt.Affinity); &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; break;
} }
case CmResourceTypeMemory: case CmResourceTypeMemory:
@ -769,6 +790,7 @@ IopTranslateDeviceResources(
&DescriptorTranslated->u.Memory.Start)) &DescriptorTranslated->u.Memory.Start))
{ {
Status = STATUS_UNSUCCESSFUL; Status = STATUS_UNSUCCESSFUL;
DPRINT1("Failed to translate memory resource (Start: 0xI64x)\n", DescriptorRaw->u.Memory.Start.QuadPart);
goto cleanup; goto cleanup;
} }
} }
@ -864,16 +886,21 @@ IopAssignDeviceResources(
Status = IopCreateResourceListFromRequirements(DeviceNode->ResourceRequirements, Status = IopCreateResourceListFromRequirements(DeviceNode->ResourceRequirements,
&DeviceNode->ResourceList); &DeviceNode->ResourceList);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to create a resource list from supplied resources for %wZ\n", &DeviceNode->InstancePath);
goto ByeBye; goto ByeBye;
}
Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); /* IopCreateResourceListFromRequirements should NEVER succeed with a conflicting list */
if (!NT_SUCCESS(Status)) ASSERT(IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL) != STATUS_CONFLICTING_ADDRESSES);
goto ByeBye;
Finish: Finish:
Status = IopTranslateDeviceResources(DeviceNode); Status = IopTranslateDeviceResources(DeviceNode);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to translate resources for %wZ\n", &DeviceNode->InstancePath);
goto ByeBye; goto ByeBye;
}
Status = IopUpdateResourceMapForPnPDevice(DeviceNode); Status = IopUpdateResourceMapForPnPDevice(DeviceNode);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -935,7 +962,7 @@ ByeBye:
return Result; return Result;
} }
NTSTATUS NTSTATUS NTAPI
IopDetectResourceConflict( IopDetectResourceConflict(
IN PCM_RESOURCE_LIST ResourceList, IN PCM_RESOURCE_LIST ResourceList,
IN BOOLEAN Silent, IN BOOLEAN Silent,

View file

@ -1048,6 +1048,48 @@ MmFlushVirtualMemory(IN PEPROCESS Process,
return STATUS_SUCCESS; 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 ULONG
NTAPI NTAPI
MiQueryAddressState(IN PVOID Va, MiQueryAddressState(IN PVOID Va,
@ -1119,9 +1161,9 @@ MiQueryAddressState(IN PVOID Va,
{ {
/* This means it's committed */ /* This means it's committed */
State = MEM_COMMIT; State = MEM_COMMIT;
/* For now, we lie about the protection */ /* Get protection state of this page */
Protect = PAGE_EXECUTE_READWRITE; Protect = MiGetPageProtection(PointerPte);
} }
else else
{ {
@ -2306,7 +2348,7 @@ NtQueryVirtualMemory(IN HANDLE ProcessHandle,
NTSTATUS Status; NTSTATUS Status;
PMMVAD Vad = NULL; PMMVAD Vad = NULL;
PVOID Address, NextAddress; PVOID Address, NextAddress;
BOOLEAN Found; BOOLEAN Found = FALSE;
ULONG NewProtect, NewState, BaseVpn; ULONG NewProtect, NewState, BaseVpn;
MEMORY_BASIC_INFORMATION MemoryInfo; MEMORY_BASIC_INFORMATION MemoryInfo;
KAPC_STATE ApcState; KAPC_STATE ApcState;
@ -2329,9 +2371,34 @@ NtQueryVirtualMemory(IN HANDLE ProcessHandle,
if ((BaseAddress > MM_HIGHEST_VAD_ADDRESS) || if ((BaseAddress > MM_HIGHEST_VAD_ADDRESS) ||
(PAGE_ALIGN(BaseAddress) == (PVOID)USER_SHARED_DATA)) (PAGE_ALIGN(BaseAddress) == (PVOID)USER_SHARED_DATA))
{ {
/* FIXME: We should return some bogus info structure */ Address = PAGE_ALIGN(BaseAddress);
UNIMPLEMENTED;
while (TRUE); /* 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 */ /* Check if this is for a local or remote process */
@ -2390,11 +2457,61 @@ NtQueryVirtualMemory(IN HANDLE ProcessHandle,
/* Was a VAD found? */ /* Was a VAD found? */
if (!Found) if (!Found)
{ {
/* We don't handle this yet */ Address = PAGE_ALIGN(BaseAddress);
UNIMPLEMENTED;
while (TRUE); /* 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 */ /* This must be a VM VAD */
ASSERT(Vad->u.VadFlags.PrivateMemory); ASSERT(Vad->u.VadFlags.PrivateMemory);

View file

@ -68,6 +68,10 @@ DtbgWindowProc(HWND Wnd,
case WM_CLOSE: case WM_CLOSE:
return 0; return 0;
case WM_DISPLAYCHANGE:
MoveWindow(Wnd, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
break;
case WM_NOTIFY: case WM_NOTIFY:
{ {
PPRIVATE_NOTIFY_DESKTOP nmh = (PPRIVATE_NOTIFY_DESKTOP)lParam; PPRIVATE_NOTIFY_DESKTOP nmh = (PPRIVATE_NOTIFY_DESKTOP)lParam;

View file

@ -12,7 +12,8 @@ add_definitions(-DLANGPACK)
add_definitions(-D_WIN32K_) add_definitions(-D_WIN32K_)
list(APPEND SOURCE list(APPEND SOURCE
dib/dib1bpp.c dib/alphablend.c
dib/dib1bpp.c
dib/dib4bpp.c dib/dib4bpp.c
dib/dib8bpp.c dib/dib8bpp.c
dib/dib16bpp.c dib/dib16bpp.c
@ -34,12 +35,15 @@ list(APPEND SOURCE
eng/float.c eng/float.c
eng/gradient.c eng/gradient.c
eng/lineto.c eng/lineto.c
eng/ldevobj.c
eng/mapping.c eng/mapping.c
eng/mem.c eng/mem.c
eng/engmisc.c eng/engmisc.c
eng/mouse.c eng/mouse.c
eng/paint.c eng/paint.c
eng/pdevobj.c
eng/perfcnt.c eng/perfcnt.c
eng/rlecomp.c
eng/semaphor.c eng/semaphor.c
eng/sort.c eng/sort.c
eng/string.c eng/string.c
@ -48,7 +52,6 @@ list(APPEND SOURCE
eng/transblt.c eng/transblt.c
eng/engwindow.c eng/engwindow.c
eng/xlate.c eng/xlate.c
ldr/loader.c
main/dllmain.c main/dllmain.c
misc/driver.c misc/driver.c
misc/err.c misc/err.c

View 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;
}

View file

@ -29,25 +29,25 @@ DIB_FUNCTIONS DibFunctionsForBitmapFormat[] =
{ {
DIB_1BPP_PutPixel, DIB_1BPP_GetPixel, DIB_1BPP_HLine, DIB_1BPP_VLine, DIB_1BPP_PutPixel, DIB_1BPP_GetPixel, DIB_1BPP_HLine, DIB_1BPP_VLine,
DIB_1BPP_BitBlt, DIB_1BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt, 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 */ /* BMF_4BPP */
{ {
DIB_4BPP_PutPixel, DIB_4BPP_GetPixel, DIB_4BPP_HLine, DIB_4BPP_VLine, DIB_4BPP_PutPixel, DIB_4BPP_GetPixel, DIB_4BPP_HLine, DIB_4BPP_VLine,
DIB_4BPP_BitBlt, DIB_4BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt, 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 */ /* BMF_8BPP */
{ {
DIB_8BPP_PutPixel, DIB_8BPP_GetPixel, DIB_8BPP_HLine, DIB_8BPP_VLine, DIB_8BPP_PutPixel, DIB_8BPP_GetPixel, DIB_8BPP_HLine, DIB_8BPP_VLine,
DIB_8BPP_BitBlt, DIB_8BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt, 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 */ /* BMF_16BPP */
{ {
DIB_16BPP_PutPixel, DIB_16BPP_GetPixel, DIB_16BPP_HLine, DIB_16BPP_VLine, DIB_16BPP_PutPixel, DIB_16BPP_GetPixel, DIB_16BPP_HLine, DIB_16BPP_VLine,
DIB_16BPP_BitBlt, DIB_16BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt, 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 */ /* BMF_24BPP */
{ {

View file

@ -78,7 +78,6 @@ BOOLEAN DIB_1BPP_BitBlt(PBLTINFO);
BOOLEAN DIB_1BPP_BitBltSrcCopy(PBLTINFO); BOOLEAN DIB_1BPP_BitBltSrcCopy(PBLTINFO);
BOOLEAN DIB_1BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,XLATEOBJ*,ULONG); BOOLEAN DIB_1BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,XLATEOBJ*,ULONG);
BOOLEAN DIB_1BPP_ColorFill(SURFOBJ*, RECTL*, 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); VOID DIB_4BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
ULONG DIB_4BPP_GetPixel(SURFOBJ*,LONG,LONG); ULONG DIB_4BPP_GetPixel(SURFOBJ*,LONG,LONG);
@ -88,7 +87,6 @@ BOOLEAN DIB_4BPP_BitBlt(PBLTINFO);
BOOLEAN DIB_4BPP_BitBltSrcCopy(PBLTINFO); BOOLEAN DIB_4BPP_BitBltSrcCopy(PBLTINFO);
BOOLEAN DIB_4BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,XLATEOBJ*,ULONG); BOOLEAN DIB_4BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,XLATEOBJ*,ULONG);
BOOLEAN DIB_4BPP_ColorFill(SURFOBJ*, RECTL*, 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); VOID DIB_8BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
ULONG DIB_8BPP_GetPixel(SURFOBJ*,LONG,LONG); ULONG DIB_8BPP_GetPixel(SURFOBJ*,LONG,LONG);
@ -98,7 +96,6 @@ BOOLEAN DIB_8BPP_BitBlt(PBLTINFO);
BOOLEAN DIB_8BPP_BitBltSrcCopy(PBLTINFO); BOOLEAN DIB_8BPP_BitBltSrcCopy(PBLTINFO);
BOOLEAN DIB_8BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,XLATEOBJ*,ULONG); BOOLEAN DIB_8BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,XLATEOBJ*,ULONG);
BOOLEAN DIB_8BPP_ColorFill(SURFOBJ*, RECTL*, 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); VOID DIB_16BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
ULONG DIB_16BPP_GetPixel(SURFOBJ*,LONG,LONG); ULONG DIB_16BPP_GetPixel(SURFOBJ*,LONG,LONG);
@ -108,7 +105,6 @@ BOOLEAN DIB_16BPP_BitBlt(PBLTINFO);
BOOLEAN DIB_16BPP_BitBltSrcCopy(PBLTINFO); BOOLEAN DIB_16BPP_BitBltSrcCopy(PBLTINFO);
BOOLEAN DIB_16BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,XLATEOBJ*,ULONG); BOOLEAN DIB_16BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,XLATEOBJ*,ULONG);
BOOLEAN DIB_16BPP_ColorFill(SURFOBJ*, RECTL*, 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); VOID DIB_24BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
ULONG DIB_24BPP_GetPixel(SURFOBJ*,LONG,LONG); 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_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_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 notmask[2];
extern unsigned char altnotmask[2]; extern unsigned char altnotmask[2];

View file

@ -525,174 +525,4 @@ DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
return TRUE; 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 */ /* EOF */

View file

@ -33,7 +33,7 @@ DIB_1BPP_GetPixel(SURFOBJ *SurfObj, LONG x, LONG y)
VOID VOID
DIB_1BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c) 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); DIB_1BPP_PutPixel(SurfObj, x1, y, c);
x1++; x1++;
@ -43,7 +43,7 @@ DIB_1BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c)
VOID VOID
DIB_1BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) 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); DIB_1BPP_PutPixel(SurfObj, x, y1, c);
y1++; y1++;
@ -474,13 +474,4 @@ DIB_1BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
return FALSE; return FALSE;
} }
BOOLEAN
DIB_1BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
RECTL* SourceRect, CLIPOBJ* ClipRegion,
XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj)
{
UNIMPLEMENTED;
return FALSE;
}
/* EOF */ /* EOF */

View file

@ -37,7 +37,7 @@ DIB_24BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c)
LONG lDelta = SurfObj->lDelta; LONG lDelta = SurfObj->lDelta;
c &= 0xFFFFFF; c &= 0xFFFFFF;
while(y1++ < y2) while(y1++ < y2)
{ {
*(PUSHORT)(addr) = c & 0xFFFF; *(PUSHORT)(addr) = c & 0xFFFF;
*(addr + 2) = c >> 16; *(addr + 2) = c >> 16;
@ -466,7 +466,6 @@ DIB_24BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
{ {
INT Rows, Cols, SrcX, SrcY; INT Rows, Cols, SrcX, SrcY;
register PUCHAR Dst; register PUCHAR Dst;
ULONG DstDelta;
BLENDFUNCTION BlendFunc; BLENDFUNCTION BlendFunc;
register NICEPIXEL32 DstPixel, SrcPixel; register NICEPIXEL32 DstPixel, SrcPixel;
UCHAR Alpha, SrcBpp; UCHAR Alpha, SrcBpp;
@ -475,9 +474,6 @@ DIB_24BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom, SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom,
DestRect->left, DestRect->top, DestRect->right, DestRect->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; BlendFunc = BlendObj->BlendFunction;
if (BlendFunc.BlendOp != AC_SRC_OVER) 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) + Dst = (PUCHAR)((ULONG_PTR)Dest->pvScan0 + (DestRect->top * Dest->lDelta) +
(DestRect->left * 3)); (DestRect->left * 3));
DstDelta = Dest->lDelta - ((DestRect->right - DestRect->left) * 3);
SrcBpp = BitsPerFormat(Source->iBitmapFormat); SrcBpp = BitsPerFormat(Source->iBitmapFormat);
Rows = DestRect->bottom - DestRect->top; Rows = 0;
SrcY = SourceRect->top; SrcY = SourceRect->top;
while (--Rows >= 0) while (++Rows <= DestRect->bottom - DestRect->top)
{ {
Cols = DestRect->right - DestRect->left; Cols = 0;
SrcX = SourceRect->left; 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;
if (!(BlendFunc.AlphaFormat & AC_SRC_ALPHA))
{ {
SrcPixel.ul = DIB_GetSource(Source, SrcX++, SrcY, ColorTranslation); Alpha = BlendFunc.SourceConstantAlpha ;
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);
} }
Dst = (PUCHAR)((ULONG_PTR)Dst + DstDelta); else
SrcY++; {
} 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; return TRUE;
} }

View file

@ -54,8 +54,8 @@ DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo)
PBYTE SourceBits_4BPP, SourceLine_4BPP; PBYTE SourceBits_4BPP, SourceLine_4BPP;
PDWORD Source32, Dest32; PDWORD Source32, Dest32;
DestBits = (PBYTE)BltInfo->DestSurface->pvScan0 DestBits = (PBYTE)BltInfo->DestSurface->pvScan0
+ (BltInfo->DestRect.top * BltInfo->DestSurface->lDelta) + (BltInfo->DestRect.top * BltInfo->DestSurface->lDelta)
+ 4 * BltInfo->DestRect.left; + 4 * BltInfo->DestRect.left;
switch (BltInfo->SourceSurface->iBitmapFormat) switch (BltInfo->SourceSurface->iBitmapFormat)
@ -83,8 +83,8 @@ DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo)
break; break;
case BMF_4BPP: case BMF_4BPP:
SourceBits_4BPP = (PBYTE)BltInfo->SourceSurface->pvScan0 SourceBits_4BPP = (PBYTE)BltInfo->SourceSurface->pvScan0
+ (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta)
+ (BltInfo->SourcePoint.x >> 1); + (BltInfo->SourcePoint.x >> 1);
for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++) for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++)
@ -156,8 +156,8 @@ DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo)
break; break;
case BMF_24BPP: case BMF_24BPP:
SourceLine = (PBYTE)BltInfo->SourceSurface->pvScan0 SourceLine = (PBYTE)BltInfo->SourceSurface->pvScan0
+ (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta)
+ 3 * BltInfo->SourcePoint.x; + 3 * BltInfo->SourcePoint.x;
DestLine = DestBits; DestLine = DestBits;
@ -182,7 +182,7 @@ DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo)
break; break;
case BMF_32BPP: case BMF_32BPP:
if (NULL == BltInfo->XlateSourceToDest || if (NULL == BltInfo->XlateSourceToDest ||
0 != (BltInfo->XlateSourceToDest->flXlate & XO_TRIVIAL)) 0 != (BltInfo->XlateSourceToDest->flXlate & XO_TRIVIAL))
{ {
if (BltInfo->DestRect.top < BltInfo->SourcePoint.y) if (BltInfo->DestRect.top < BltInfo->SourcePoint.y)
@ -197,10 +197,10 @@ DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo)
} }
else else
{ {
SourceBits = (PBYTE)BltInfo->SourceSurface->pvScan0 SourceBits = (PBYTE)BltInfo->SourceSurface->pvScan0
+ ((BltInfo->SourcePoint.y + ((BltInfo->SourcePoint.y
+ BltInfo->DestRect.bottom + BltInfo->DestRect.bottom
- BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta) - BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta)
+ 4 * BltInfo->SourcePoint.x; + 4 * BltInfo->SourcePoint.x;
DestBits = (PBYTE)BltInfo->DestSurface->pvScan0 + ((BltInfo->DestRect.bottom - 1) * BltInfo->DestSurface->lDelta) + 4 * BltInfo->DestRect.left; 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--) 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; INT Rows, Cols, SrcX, SrcY;
register PULONG Dst; register PULONG Dst;
ULONG DstDelta;
BLENDFUNCTION BlendFunc; BLENDFUNCTION BlendFunc;
register NICEPIXEL32 DstPixel, SrcPixel; register NICEPIXEL32 DstPixel, SrcPixel;
UCHAR Alpha, SrcBpp; UCHAR Alpha, SrcBpp;
@ -357,9 +356,6 @@ DIB_32BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom, SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom,
DestRect->left, DestRect->top, DestRect->right, DestRect->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; BlendFunc = BlendObj->BlendFunction;
if (BlendFunc.BlendOp != AC_SRC_OVER) 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) + Dst = (PULONG)((ULONG_PTR)Dest->pvScan0 + (DestRect->top * Dest->lDelta) +
(DestRect->left << 2)); (DestRect->left << 2));
DstDelta = Dest->lDelta - ((DestRect->right - DestRect->left) << 2);
SrcBpp = BitsPerFormat(Source->iBitmapFormat); SrcBpp = BitsPerFormat(Source->iBitmapFormat);
Rows = DestRect->bottom - DestRect->top; Rows = 0;
SrcY = SourceRect->top; SrcY = SourceRect->top;
while (--Rows >= 0) while (++Rows <= DestRect->bottom - DestRect->top)
{ {
Cols = DestRect->right - DestRect->left; Cols = 0;
SrcX = SourceRect->left; SrcX = SourceRect->left;
while (--Cols >= 0) while (++Cols <= DestRect->right - DestRect->left)
{ {
SrcPixel.ul = DIB_GetSource(Source, SrcX++, SrcY, ColorTranslation); SrcPixel.ul = DIB_GetSource(Source, SrcX, SrcY, ColorTranslation);
SrcPixel.col.red = SrcPixel.col.red * BlendFunc.SourceConstantAlpha / 255; SrcPixel.col.red = (SrcPixel.col.red * BlendFunc.SourceConstantAlpha) / 255;
SrcPixel.col.green = SrcPixel.col.green * BlendFunc.SourceConstantAlpha / 255; SrcPixel.col.green = (SrcPixel.col.green * BlendFunc.SourceConstantAlpha) / 255;
SrcPixel.col.blue = SrcPixel.col.blue * 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.col.alpha = (32 == SrcBpp) ?
(SrcPixel.col.alpha * BlendFunc.SourceConstantAlpha) / 255 :
BlendFunc.SourceConstantAlpha ;
Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ? Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ?
SrcPixel.col.alpha : BlendFunc.SourceConstantAlpha; SrcPixel.col.alpha : BlendFunc.SourceConstantAlpha ;
DstPixel.ul = *Dst; DstPixel.ul = *Dst;
DstPixel.col.red = Clamp8(DstPixel.col.red * (255 - Alpha) / 255 + SrcPixel.col.red); 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.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.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.alpha = Clamp8((DstPixel.col.alpha * (255 - Alpha)) / 255 + SrcPixel.col.alpha) ;
*Dst++ = DstPixel.ul; *Dst++ = DstPixel.ul;
SrcX = SourceRect->left + (Cols*(SourceRect->right - SourceRect->left))/(DestRect->right - DestRect->left);
} }
Dst = (PULONG)((ULONG_PTR)Dst + DstDelta); Dst = (PULONG)((ULONG_PTR)Dest->pvScan0 + ((DestRect->top + Rows) * Dest->lDelta) +
SrcY++; (DestRect->left << 2));
SrcY = SourceRect->top + (Rows*(SourceRect->bottom - SourceRect->top))/(DestRect->bottom - DestRect->top);
} }
return TRUE; return TRUE;

View file

@ -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; PBYTE addr = (PBYTE)SurfObj->pvScan0 + (x1>>1) + y * SurfObj->lDelta;
LONG cx = x1; LONG cx = x1;
while(cx < x2) while(cx < x2)
{ {
*addr = (*addr & notmask[x1&1]) | (c << ((1-(x1&1))<<2)); *addr = (*addr & notmask[x1&1]) | (c << ((1-(x1&1))<<2));
if((++x1 & 1) == 0) 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; int lDelta = SurfObj->lDelta;
addr += (x>>1) + y1 * lDelta; addr += (x>>1) + y1 * lDelta;
while(y1++ < y2) while(y1++ < y2)
{ {
*addr = (*addr & notmask[x&1]) | (c << ((1-(x&1))<<2)); *addr = (*addr & notmask[x&1]) | (c << ((1-(x&1))<<2));
addr += lDelta; addr += lDelta;
@ -81,8 +81,8 @@ DIB_4BPP_BitBltSrcCopy(PBLTINFO BltInfo)
if(DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0) if(DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0)
{ {
DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 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)); 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; return FALSE;
} }
BOOLEAN
DIB_4BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
RECTL* SourceRect, CLIPOBJ* ClipRegion,
XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj)
{
UNIMPLEMENTED;
return FALSE;
}
/* EOF */ /* EOF */

View file

@ -43,7 +43,7 @@ DIB_8BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c)
LONG lDelta = SurfObj->lDelta; LONG lDelta = SurfObj->lDelta;
byteaddr = addr; byteaddr = addr;
while(y1++ < y2) while(y1++ < y2)
{ {
*addr = c; *addr = c;
@ -74,8 +74,8 @@ DIB_8BPP_BitBltSrcCopy(PBLTINFO BltInfo)
if(DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0) if(DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0)
{ {
DIB_8BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 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)); 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; 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 */ /* EOF */

View file

@ -1,4 +1,4 @@
/* /*
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* PURPOSE: GDI alpha blending functions * PURPOSE: GDI alpha blending functions
@ -25,10 +25,6 @@ EngAlphaBlend(IN SURFOBJ *psoDest,
IN PRECTL SourceRect, IN PRECTL SourceRect,
IN BLENDOBJ *BlendObj) IN BLENDOBJ *BlendObj)
{ {
RECTL SourceStretchedRect;
SIZEL SourceStretchedSize;
HBITMAP SourceStretchedBitmap = 0;
SURFOBJ* SourceStretchedObj = NULL;
RECTL InputRect; RECTL InputRect;
RECTL OutputRect; RECTL OutputRect;
RECTL ClipRect; RECTL ClipRect;
@ -39,7 +35,6 @@ EngAlphaBlend(IN SURFOBJ *psoDest,
INTENG_ENTER_LEAVE EnterLeaveDest; INTENG_ENTER_LEAVE EnterLeaveDest;
SURFOBJ* InputObj; SURFOBJ* InputObj;
SURFOBJ* OutputObj; SURFOBJ* OutputObj;
LONG Width;
LONG ClippingType; LONG ClippingType;
RECT_ENUM RectEnum; RECT_ENUM RectEnum;
BOOL EnumMore; BOOL EnumMore;
@ -71,7 +66,7 @@ EngAlphaBlend(IN SURFOBJ *psoDest,
InputRect = *SourceRect; InputRect = *SourceRect;
if ( (InputRect.top < 0) || (InputRect.bottom < 0) || if ( (InputRect.top < 0) || (InputRect.bottom < 0) ||
(InputRect.left < 0) || (InputRect.right < 0) || (InputRect.left < 0) || (InputRect.right < 0) ||
InputRect.right > psoSource->sizlBitmap.cx || InputRect.right > psoSource->sizlBitmap.cx ||
InputRect.bottom > psoSource->sizlBitmap.cy ) InputRect.bottom > psoSource->sizlBitmap.cy )
{ {
SetLastWin32Error(ERROR_INVALID_PARAMETER); SetLastWin32Error(ERROR_INVALID_PARAMETER);
@ -111,68 +106,9 @@ EngAlphaBlend(IN SURFOBJ *psoDest,
return TRUE; 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 */ /* Now call the DIB function */
if (!IntEngEnter(&EnterLeaveSource, psoSource, &InputRect, TRUE, &Translate, &InputObj)) if (!IntEngEnter(&EnterLeaveSource, psoSource, &InputRect, TRUE, &Translate, &InputObj))
{ {
if (SourceStretchedObj != NULL)
{
EngFreeMem(SourceStretchedObj->pvBits);
EngUnlockSurface(SourceStretchedObj);
}
if (SourceStretchedBitmap != 0)
{
EngDeleteSurface((HSURF)SourceStretchedBitmap);
}
return FALSE; return FALSE;
} }
InputRect.left += Translate.x; InputRect.left += Translate.x;
@ -182,16 +118,6 @@ EngAlphaBlend(IN SURFOBJ *psoDest,
if (!IntEngEnter(&EnterLeaveDest, psoDest, &OutputRect, FALSE, &Translate, &OutputObj)) 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; return FALSE;
} }
OutputRect.left += Translate.x; OutputRect.left += Translate.x;
@ -261,16 +187,6 @@ EngAlphaBlend(IN SURFOBJ *psoDest,
IntEngLeave(&EnterLeaveDest); IntEngLeave(&EnterLeaveDest);
IntEngLeave(&EnterLeaveSource); IntEngLeave(&EnterLeaveSource);
if (SourceStretchedObj != NULL)
{
EngFreeMem(SourceStretchedObj->pvBits);
EngUnlockSurface(SourceStretchedObj);
}
if (SourceStretchedBitmap != 0)
{
EngDeleteSurface((HSURF)SourceStretchedBitmap);
}
return Ret; return Ret;
} }
@ -305,17 +221,8 @@ IntEngAlphaBlend(IN SURFOBJ *psoDest,
return TRUE; 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 */ /* Call the driver's DrvAlphaBlend if available */
if (psurfDest->flHooks & HOOK_ALPHABLEND) if (psurfDest->flags & HOOK_ALPHABLEND)
{ {
ret = GDIDEVFUNCS(psoDest).AlphaBlend( ret = GDIDEVFUNCS(psoDest).AlphaBlend(
psoDest, psoSource, ClipRegion, ColorTranslation, psoDest, psoSource, ClipRegion, ColorTranslation,
@ -328,12 +235,6 @@ IntEngAlphaBlend(IN SURFOBJ *psoDest,
DestRect, SourceRect, BlendObj); DestRect, SourceRect, BlendObj);
} }
MouseSafetyOnDrawEnd(psoSource);
if (psoSource != psoDest)
SURFACE_UnlockBitmapBits(psurfSource);
MouseSafetyOnDrawEnd(psoDest);
SURFACE_UnlockBitmapBits(psurfDest);
return ret; return ret;
} }

View file

@ -522,7 +522,7 @@ EngBitBlt(SURFOBJ *DestObj,
} }
BOOL APIENTRY BOOL APIENTRY
IntEngBitBltEx( IntEngBitBlt(
SURFOBJ *psoTrg, SURFOBJ *psoTrg,
SURFOBJ *psoSrc, SURFOBJ *psoSrc,
SURFOBJ *psoMask, SURFOBJ *psoMask,
@ -533,8 +533,7 @@ IntEngBitBltEx(
POINTL *pptlMask, POINTL *pptlMask,
BRUSHOBJ *pbo, BRUSHOBJ *pbo,
POINTL *pptlBrush, POINTL *pptlBrush,
ROP4 rop4, ROP4 rop4)
BOOL bRemoveMouse)
{ {
SURFACE *psurfTrg; SURFACE *psurfTrg;
SURFACE *psurfSrc = NULL; SURFACE *psurfSrc = NULL;
@ -583,28 +582,11 @@ IntEngBitBltEx(
psurfSrc = NULL; 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? */ /* Is the target surface device managed? */
if (psurfTrg->flHooks & HOOK_BITBLT) if (psurfTrg->flags & HOOK_BITBLT)
{ {
/* Is the source a different device managed surface? */ /* 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"); DPRINT1("Need to copy to standard bitmap format!\n");
ASSERT(FALSE); ASSERT(FALSE);
@ -614,7 +596,7 @@ IntEngBitBltEx(
} }
/* Is the source surface device managed? */ /* Is the source surface device managed? */
else if (psoSrc && psurfSrc->flHooks & HOOK_BITBLT) else if (psoSrc && psurfSrc->flags & HOOK_BITBLT)
{ {
pfnBitBlt = GDIDEVFUNCS(psoSrc).BitBlt; pfnBitBlt = GDIDEVFUNCS(psoSrc).BitBlt;
} }
@ -637,21 +619,6 @@ IntEngBitBltEx(
// FIXME: cleanup temp surface! // FIXME: cleanup temp surface!
if (bRemoveMouse)
{
MouseSafetyOnDrawEnd(psoTrg);
if (psoSrc)
{
MouseSafetyOnDrawEnd(psoSrc);
if (psoSrc != psoTrg)
{
SURFACE_UnlockBitmapBits(psurfSrc);
}
}
SURFACE_UnlockBitmapBits(psurfTrg);
}
return bResult; return bResult;
} }
@ -983,27 +950,20 @@ IntEngMaskBlt(SURFOBJ *psoDest,
ASSERT(psoDest); ASSERT(psoDest);
psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj); 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. /* Dummy BitBlt to let driver know that it should flush its changes.
This should really be done using a call to DrvSynchronizeSurface, This should really be done using a call to DrvSynchronizeSurface,
but the VMware driver doesn't hook that call. */ 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, DestRect, pptlMask, pptlMask, pbo, BrushOrigin,
R4_NOOP, FALSE); R4_NOOP);
ret = EngMaskBitBlt(psoDest, psoMask, ClipRegion, DestColorTranslation, SourceColorTranslation, ret = EngMaskBitBlt(psoDest, psoMask, ClipRegion, DestColorTranslation, SourceColorTranslation,
&OutputRect, &InputPoint, pbo, BrushOrigin); &OutputRect, &InputPoint, pbo, BrushOrigin);
/* Dummy BitBlt to let driver know that something has changed. */ /* 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, DestRect, pptlMask, pptlMask, pbo, BrushOrigin,
R4_NOOP, FALSE); R4_NOOP);
MouseSafetyOnDrawEnd(psoDest);
SURFACE_UnlockBitmapBits(psurfDest);
return ret; return ret;
} }

View file

@ -53,13 +53,7 @@ EngCopyBits(SURFOBJ *psoDest,
ASSERT(psoDest != NULL && psoSource != NULL && DestRect != NULL && SourcePoint != NULL); ASSERT(psoDest != NULL && psoSource != NULL && DestRect != NULL && SourcePoint != NULL);
psurfSource = CONTAINING_RECORD(psoSource, SURFACE, SurfObj); psurfSource = CONTAINING_RECORD(psoSource, SURFACE, SurfObj);
SURFACE_LockBitmapBits(psurfSource);
psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj); psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj);
if (psoDest != psoSource)
{
SURFACE_LockBitmapBits(psurfDest);
}
// FIXME: Don't punt to the driver's DrvCopyBits immediately. Instead, // FIXME: Don't punt to the driver's DrvCopyBits immediately. Instead,
// mark the copy block function to be DrvCopyBits instead of the // mark the copy block function to be DrvCopyBits instead of the
@ -73,7 +67,7 @@ EngCopyBits(SURFOBJ *psoDest,
if (psoDest->iType!=STYPE_BITMAP) if (psoDest->iType!=STYPE_BITMAP)
{ {
/* FIXME: Eng* functions shouldn't call Drv* functions. ? */ /* FIXME: Eng* functions shouldn't call Drv* functions. ? */
if (psurfDest->flHooks & HOOK_COPYBITS) if (psurfDest->flags & HOOK_COPYBITS)
{ {
ret = GDIDEVFUNCS(psoDest).CopyBits( ret = GDIDEVFUNCS(psoDest).CopyBits(
psoDest, psoSource, Clip, ColorTranslation, DestRect, SourcePoint); psoDest, psoSource, Clip, ColorTranslation, DestRect, SourcePoint);
@ -86,7 +80,7 @@ EngCopyBits(SURFOBJ *psoDest,
if (psoSource->iType!=STYPE_BITMAP) if (psoSource->iType!=STYPE_BITMAP)
{ {
/* FIXME: Eng* functions shouldn't call Drv* functions. ? */ /* FIXME: Eng* functions shouldn't call Drv* functions. ? */
if (psurfSource->flHooks & HOOK_COPYBITS) if (psurfSource->flags & HOOK_COPYBITS)
{ {
ret = GDIDEVFUNCS(psoSource).CopyBits( ret = GDIDEVFUNCS(psoSource).CopyBits(
psoDest, psoSource, Clip, ColorTranslation, DestRect, SourcePoint); psoDest, psoSource, Clip, ColorTranslation, DestRect, SourcePoint);
@ -180,12 +174,6 @@ EngCopyBits(SURFOBJ *psoDest,
} }
cleanup: cleanup:
if (psoDest != psoSource)
{
SURFACE_UnlockBitmapBits(psurfDest);
}
SURFACE_UnlockBitmapBits(psurfSource);
return ret; return ret;
} }
@ -198,20 +186,7 @@ IntEngCopyBits(
RECTL *prclDest, RECTL *prclDest,
POINTL *ptlSource) POINTL *ptlSource)
{ {
BOOL bResult; return EngCopyBits(psoDest, psoSource, pco, pxlo, prclDest, ptlSource);
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;
} }

View file

@ -12,6 +12,264 @@
#define NDEBUG #define NDEBUG
#include <debug.h> #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 static
NTSTATUS NTSTATUS
EngpFileIoRequest( EngpFileIoRequest(
@ -39,7 +297,7 @@ EngpFileIoRequest(
/* Initialize an event */ /* Initialize an event */
KeInitializeEvent(&Event, SynchronizationEvent, FALSE); KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
/* Build IPR */ /* Build IRP */
liStartOffset.QuadPart = ullStartOffset; liStartOffset.QuadPart = ullStartOffset;
pIrp = IoBuildSynchronousFsdRequest(ulMajorFunction, pIrp = IoBuildSynchronousFsdRequest(ulMajorFunction,
pDeviceObject, pDeviceObject,
@ -113,7 +371,7 @@ EngFileIoControl(
/* Initialize an event */ /* Initialize an event */
KeInitializeEvent(&Event, SynchronizationEvent, FALSE); KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
/* Build IO control IPR */ /* Build IO control IRP */
pIrp = IoBuildDeviceIoControlRequest(dwIoControlCode, pIrp = IoBuildDeviceIoControlRequest(dwIoControlCode,
pDeviceObject, pDeviceObject,
lpInBuffer, lpInBuffer,

View file

@ -18,8 +18,6 @@ VOID
NTAPI NTAPI
EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc) EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
{ {
HPALETTE hpal = NULL;
ASSERT(pebo); ASSERT(pebo);
ASSERT(pbrush); ASSERT(pbrush);
ASSERT(pdc); ASSERT(pdc);
@ -35,14 +33,11 @@ EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
pebo->crCurrentText = pdc->pdcattr->crForegroundClr; pebo->crCurrentText = pdc->pdcattr->crForegroundClr;
pebo->psurfTrg = pdc->dclevel.pSurface; 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) pebo->ppalSurf = pebo->psurfTrg->ppal;
hpal = pebo->psurfTrg->hDIBPalette; GDIOBJ_IncrementShareCount(&pebo->ppalSurf->BaseObject);
if (!hpal) hpal = pPrimarySurface->devinfo.hpalDefault;
pebo->ppalSurf = PALETTE_ShareLockPalette(hpal);
if (!pebo->ppalSurf)
pebo->ppalSurf = &gpalRGB;
if (pbrush->flAttrs & GDIBRUSH_IS_NULL) if (pbrush->flAttrs & GDIBRUSH_IS_NULL)
{ {
@ -80,7 +75,12 @@ EBRUSHOBJ_vSetSolidBrushColor(EBRUSHOBJ *pebo, COLORREF crColor)
pebo->ulRGBColor = crColor; pebo->ulRGBColor = crColor;
/* Initialize an XLATEOBJ RGB -> surface */ /* 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 */ /* Translate the brush color to the target format */
iSolidColor = XLATEOBJ_iXlate(&exlo.xlo, crColor); iSolidColor = XLATEOBJ_iXlate(&exlo.xlo, crColor);
@ -109,8 +109,7 @@ EBRUSHOBJ_vCleanup(EBRUSHOBJ *pebo)
pebo->BrushObject.pvRbrush = NULL; pebo->BrushObject.pvRbrush = NULL;
} }
if (pebo->ppalSurf != &gpalRGB) PALETTE_ShareUnlockPalette(pebo->ppalSurf);
PALETTE_ShareUnlockPalette(pebo->ppalSurf);
} }
VOID VOID
@ -145,7 +144,7 @@ EngRealizeBrush(
ULONG lWidth; ULONG lWidth;
/* Calculate width in bytes of the realized brush */ /* Calculate width in bytes of the realized brush */
lWidth = DIB_GetDIBWidthBytes(psoPattern->sizlBitmap.cx, lWidth = WIDTH_BYTES_ALIGN32(psoPattern->sizlBitmap.cx,
BitsPerFormat(psoDst->iBitmapFormat)); BitsPerFormat(psoDst->iBitmapFormat));
/* Allocate a bitmap */ /* Allocate a bitmap */
@ -192,12 +191,8 @@ EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ *pebo, BOOL bCallDriver)
PPDEVOBJ ppdev = NULL; PPDEVOBJ ppdev = NULL;
EXLATEOBJ exlo; EXLATEOBJ exlo;
// FIXME: all EBRUSHOBJs need a surface, see EBRUSHOBJ_vInit /* All EBRUSHOBJs have a surface, see EBRUSHOBJ_vInit */
if (!pebo->psurfTrg) ASSERT(pebo->psurfTrg);
{
DPRINT1("Pattern brush has no target surface!\n");
return FALSE;
}
ppdev = (PPDEVOBJ)pebo->psurfTrg->SurfObj.hdev; ppdev = (PPDEVOBJ)pebo->psurfTrg->SurfObj.hdev;
@ -210,16 +205,18 @@ EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ *pebo, BOOL bCallDriver)
psurfPattern = SURFACE_ShareLockSurface(pebo->pbrush->hbmPattern); psurfPattern = SURFACE_ShareLockSurface(pebo->pbrush->hbmPattern);
ASSERT(psurfPattern); ASSERT(psurfPattern);
ASSERT(psurfPattern->ppal);
/* FIXME: implement mask */ /* FIXME: implement mask */
psurfMask = NULL; psurfMask = NULL;
/* Initialize XLATEOBJ for the brush */ /* Initialize XLATEOBJ for the brush */
EXLATEOBJ_vInitBrushXlate(&exlo, EXLATEOBJ_vInitialize(&exlo,
pebo->pbrush, psurfPattern->ppal,
pebo->psurfTrg, pebo->psurfTrg->ppal,
pebo->crCurrentText, 0,
pebo->crCurrentBack); pebo->crCurrentBack,
pebo->crCurrentText);
/* Create the realization */ /* Create the realization */
bResult = pfnRealzizeBrush(&pebo->BrushObject, bResult = pfnRealzizeBrush(&pebo->BrushObject,

View file

@ -56,7 +56,7 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
{ {
/* Driver needs to support DrvCopyBits, else we can't do anything */ /* Driver needs to support DrvCopyBits, else we can't do anything */
SURFACE *psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj); SURFACE *psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj);
if (!(psurfDest->flHooks & HOOK_COPYBITS)) if (!(psurfDest->flags & HOOK_COPYBITS))
{ {
return FALSE; return FALSE;
} }
@ -64,7 +64,7 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
/* Allocate a temporary bitmap */ /* Allocate a temporary bitmap */
BitmapSize.cx = DestRect->right - DestRect->left; BitmapSize.cx = DestRect->right - DestRect->left;
BitmapSize.cy = DestRect->bottom - DestRect->top; 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, EnterLeave->OutputBitmap = EngCreateBitmap(BitmapSize, Width,
psoDest->iBitmapFormat, psoDest->iBitmapFormat,
BMF_TOPDOWN | BMF_NOZEROINIT, NULL); BMF_TOPDOWN | BMF_NOZEROINIT, NULL);
@ -127,7 +127,6 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
&ClippedDestRect, &SrcPoint)) &ClippedDestRect, &SrcPoint))
{ {
EngDeleteClip(EnterLeave->TrivialClipObj); EngDeleteClip(EnterLeave->TrivialClipObj);
EngFreeMem((*ppsoOutput)->pvBits);
EngUnlockSurface(*ppsoOutput); EngUnlockSurface(*ppsoOutput);
EngDeleteSurface((HSURF)EnterLeave->OutputBitmap); EngDeleteSurface((HSURF)EnterLeave->OutputBitmap);
return FALSE; return FALSE;
@ -149,7 +148,7 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
if (NULL != *ppsoOutput) if (NULL != *ppsoOutput)
{ {
SURFACE* psurfOutput = CONTAINING_RECORD(*ppsoOutput, SURFACE, SurfObj); SURFACE* psurfOutput = CONTAINING_RECORD(*ppsoOutput, SURFACE, SurfObj);
if (0 != (psurfOutput->flHooks & HOOK_SYNCHRONIZE)) if (0 != (psurfOutput->flags & HOOK_SYNCHRONIZE))
{ {
if (NULL != GDIDEVFUNCS(*ppsoOutput).SynchronizeSurface) if (NULL != GDIDEVFUNCS(*ppsoOutput).SynchronizeSurface)
{ {
@ -219,7 +218,6 @@ IntEngLeave(PINTENG_ENTER_LEAVE EnterLeave)
Result = TRUE; Result = TRUE;
} }
} }
EngFreeMem(EnterLeave->OutputObj->pvBits);
EngUnlockSurface(EnterLeave->OutputObj); EngUnlockSurface(EnterLeave->OutputObj);
EngDeleteSurface((HSURF)EnterLeave->OutputBitmap); EngDeleteSurface((HSURF)EnterLeave->OutputBitmap);
EngDeleteClip(EnterLeave->TrivialClipObj); EngDeleteClip(EnterLeave->TrivialClipObj);

View file

@ -548,14 +548,7 @@ IntEngGradientFill(
psurf = CONTAINING_RECORD(psoDest, SURFACE, SurfObj); psurf = CONTAINING_RECORD(psoDest, SURFACE, SurfObj);
ASSERT(psurf); ASSERT(psurf);
SURFACE_LockBitmapBits(psurf); if(psurf->flags & HOOK_GRADIENTFILL)
MouseSafetyOnDrawStart(
psoDest,
pco->rclBounds.left,
pco->rclBounds.top,
pco->rclBounds.right,
pco->rclBounds.bottom);
if(psurf->flHooks & HOOK_GRADIENTFILL)
{ {
Ret = GDIDEVFUNCS(psoDest).GradientFill( Ret = GDIDEVFUNCS(psoDest).GradientFill(
psoDest, pco, pxlo, pVertex, nVertex, pMesh, nMesh, psoDest, pco, pxlo, pVertex, nVertex, pMesh, nMesh,
@ -566,8 +559,6 @@ IntEngGradientFill(
Ret = EngGradientFill(psoDest, pco, pxlo, pVertex, nVertex, pMesh, nMesh, prclExtents, Ret = EngGradientFill(psoDest, pco, pxlo, pVertex, nVertex, pMesh, nMesh, prclExtents,
pptlDitherOrg, ulMode); pptlDitherOrg, ulMode);
} }
MouseSafetyOnDrawEnd(psoDest);
SURFACE_UnlockBitmapBits(psurf);
return Ret; return Ret;
} }

View 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);
}

View file

@ -565,10 +565,7 @@ IntEngLineTo(SURFOBJ *psoDest,
if (b.left == b.right) b.right++; if (b.left == b.right) b.right++;
if (b.top == b.bottom) b.bottom++; if (b.top == b.bottom) b.bottom++;
SURFACE_LockBitmapBits(psurfDest); if (psurfDest->flags & HOOK_LINETO)
MouseSafetyOnDrawStart(psoDest, x1, y1, x2, y2);
if (psurfDest->flHooks & HOOK_LINETO)
{ {
/* Call the driver's DrvLineTo */ /* Call the driver's DrvLineTo */
ret = GDIDEVFUNCS(psoDest).LineTo( ret = GDIDEVFUNCS(psoDest).LineTo(
@ -576,7 +573,7 @@ IntEngLineTo(SURFOBJ *psoDest,
} }
#if 0 #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 */ /* 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); ret = EngLineTo(psoDest, ClipObj, pbo, x1, y1, x2, y2, RectBounds, Mix);
} }
MouseSafetyOnDrawEnd(psoDest);
SURFACE_UnlockBitmapBits(psurfDest);
return ret; return ret;
} }

View file

@ -3,7 +3,7 @@
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* PURPOSE: Functions for mapping files and sections * PURPOSE: Functions for mapping files and sections
* FILE: subsys/win32k/eng/device.c * FILE: subsys/win32k/eng/device.c
* PROGRAMER: * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org)
*/ */
#include <win32k.h> #include <win32k.h>
@ -11,12 +11,348 @@
#define NDEBUG #define NDEBUG
#include <debug.h> #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 HANDLE
APIENTRY APIENTRY
EngLoadModule(LPWSTR pwsz) EngLoadModule(LPWSTR pwsz)
{ {
UNIMPLEMENTED; /* Forward to EngLoadModuleEx */
return NULL; return (HANDLE)EngLoadModuleEx(pwsz, 0, FVF_READONLY | FVF_SYSTEMROOT);
} }
HANDLE HANDLE
@ -25,9 +361,8 @@ EngLoadModuleForWrite(
IN LPWSTR pwsz, IN LPWSTR pwsz,
IN ULONG cjSizeOfModule) IN ULONG cjSizeOfModule)
{ {
// www.osr.com/ddk/graphics/gdifncs_98rr.htm /* Forward to EngLoadModuleEx */
UNIMPLEMENTED; return (HANDLE)EngLoadModuleEx(pwsz, cjSizeOfModule, FVF_SYSTEMROOT);
return NULL;
} }
PVOID PVOID
@ -36,17 +371,46 @@ EngMapModule(
IN HANDLE h, IN HANDLE h,
OUT PULONG pulSize) OUT PULONG pulSize)
{ {
// www.osr.com/ddk/graphics/gdifncs_9b1j.htm PFILEVIEW pFileView = (PFILEVIEW)h;
UNIMPLEMENTED; NTSTATUS Status;
return NULL;
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 VOID
APIENTRY APIENTRY
EngFreeModule (IN HANDLE h) EngFreeModule(IN HANDLE h)
{ {
// www.osr.com/ddk/graphics/gdifncs_9fzb.htm PFILEVIEW pFileView = (PFILEVIEW)h;
UNIMPLEMENTED; 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 PVOID
@ -56,8 +420,28 @@ EngMapFile(
IN ULONG cjSize, IN ULONG cjSize,
OUT ULONG_PTR *piFile) OUT ULONG_PTR *piFile)
{ {
UNIMPLEMENTED; HANDLE hModule;
return NULL; 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 BOOL
@ -65,8 +449,11 @@ APIENTRY
EngUnmapFile( EngUnmapFile(
IN ULONG_PTR iFile) IN ULONG_PTR iFile)
{ {
UNIMPLEMENTED; HANDLE hModule = (HANDLE)iFile;
return FALSE;
EngFreeModule(hModule);
return TRUE;
} }
@ -110,36 +497,3 @@ EngUnmapFontFile(
// www.osr.com/ddk/graphics/gdifncs_09wn.htm // www.osr.com/ddk/graphics/gdifncs_09wn.htm
EngUnmapFontFileFD(iFile); 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;
}

View file

@ -79,6 +79,7 @@ EngAllocUserMem(SIZE_T cj, ULONG Tag)
} }
/* TODO: Add allocation info to AVL tree (stored inside W32PROCESS structure) */ /* TODO: Add allocation info to AVL tree (stored inside W32PROCESS structure) */
//hSecure = EngSecureMem(NewMem, cj);
return NewMem; return NewMem;
} }
@ -166,6 +167,7 @@ HackUnsecureVirtualMemory(
HANDLE APIENTRY HANDLE APIENTRY
EngSecureMem(PVOID Address, ULONG Length) EngSecureMem(PVOID Address, ULONG Length)
{ {
return (HANDLE)-1; // HACK!!!
return MmSecureVirtualMemory(Address, Length, PAGE_READWRITE); return MmSecureVirtualMemory(Address, Length, PAGE_READWRITE);
} }
@ -175,6 +177,7 @@ EngSecureMem(PVOID Address, ULONG Length)
VOID APIENTRY VOID APIENTRY
EngUnsecureMem(HANDLE Mem) EngUnsecureMem(HANDLE Mem)
{ {
if (Mem == (HANDLE)-1) return; // HACK!!!
MmUnsecureVirtualMemory((PVOID) Mem); MmUnsecureVirtualMemory((PVOID) Mem);
} }

View file

@ -37,23 +37,17 @@ EngSetPointerTag(
*/ */
INT INTERNAL_CALL INT INTERNAL_CALL
MouseSafetyOnDrawStart( MouseSafetyOnDrawStart(
SURFOBJ *pso, PPDEVOBJ ppdev,
LONG HazardX1, LONG HazardX1,
LONG HazardY1, LONG HazardY1,
LONG HazardX2, LONG HazardX2,
LONG HazardY2) LONG HazardY2)
{ {
LONG tmp; LONG tmp;
PDEVOBJ *ppdev;
GDIPOINTER *pgp; GDIPOINTER *pgp;
ASSERT(pso != NULL); ASSERT(ppdev != NULL);
ASSERT(ppdev->pSurface != NULL);
ppdev = GDIDEV(pso);
if (ppdev == NULL)
{
return FALSE;
}
pgp = &ppdev->Pointer; pgp = &ppdev->Pointer;
@ -83,12 +77,12 @@ MouseSafetyOnDrawStart(
} }
if (pgp->Exclude.right >= HazardX1 if (pgp->Exclude.right >= HazardX1
&& pgp->Exclude.left <= HazardX2 && pgp->Exclude.left <= HazardX2
&& pgp->Exclude.bottom >= HazardY1 && pgp->Exclude.bottom >= HazardY1
&& pgp->Exclude.top <= HazardY2) && pgp->Exclude.top <= HazardY2)
{ {
ppdev->SafetyRemoveLevel = ppdev->SafetyRemoveCount; ppdev->SafetyRemoveLevel = ppdev->SafetyRemoveCount;
ppdev->pfnMovePointer(pso, -1, -1, NULL); ppdev->pfnMovePointer(&ppdev->pSurface->SurfObj, -1, -1, NULL);
} }
return(TRUE); return(TRUE);
@ -99,19 +93,12 @@ MouseSafetyOnDrawStart(
*/ */
INT INTERNAL_CALL INT INTERNAL_CALL
MouseSafetyOnDrawEnd( MouseSafetyOnDrawEnd(
SURFOBJ *pso) PPDEVOBJ ppdev)
{ {
PDEVOBJ *ppdev;
GDIPOINTER *pgp; GDIPOINTER *pgp;
ASSERT(pso != NULL); ASSERT(ppdev != NULL);
ASSERT(ppdev->pSurface != NULL);
ppdev = (PDEVOBJ*)pso->hdev;
if (ppdev == NULL)
{
return(FALSE);
}
pgp = &ppdev->Pointer; pgp = &ppdev->Pointer;
@ -125,7 +112,10 @@ MouseSafetyOnDrawEnd(
return FALSE; 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; ppdev->SafetyRemoveLevel = 0;
@ -175,18 +165,17 @@ IntHideMousePointer(
ptlSave.x = rclDest.left - pt.x; ptlSave.x = rclDest.left - pt.x;
ptlSave.y = rclDest.top - pt.y; ptlSave.y = rclDest.top - pt.y;
IntEngBitBltEx(psoDest, IntEngBitBlt(psoDest,
&pgp->psurfSave->SurfObj, &pgp->psurfSave->SurfObj,
NULL, NULL,
NULL, NULL,
NULL, NULL,
&rclDest, &rclDest,
&ptlSave, &ptlSave,
&ptlSave, &ptlSave,
NULL, NULL,
NULL, NULL,
ROP3_TO_ROP4(SRCCOPY), ROP3_TO_ROP4(SRCCOPY));
FALSE);
} }
VOID VOID
@ -229,77 +218,72 @@ IntShowMousePointer(PDEVOBJ *ppdev, SURFOBJ *psoDest)
rclPointer.bottom = min(pgp->Size.cy, psoDest->sizlBitmap.cy - pt.y); rclPointer.bottom = min(pgp->Size.cy, psoDest->sizlBitmap.cy - pt.y);
/* Copy the pixels under the cursor to temporary surface. */ /* Copy the pixels under the cursor to temporary surface. */
IntEngBitBltEx(&pgp->psurfSave->SurfObj, IntEngBitBlt(&pgp->psurfSave->SurfObj,
psoDest, psoDest,
NULL, NULL,
NULL, NULL,
NULL, NULL,
&rclPointer, &rclPointer,
(POINTL*)&rclSurf, (POINTL*)&rclSurf,
NULL, NULL,
NULL, NULL,
NULL, NULL,
ROP3_TO_ROP4(SRCCOPY), ROP3_TO_ROP4(SRCCOPY));
FALSE);
/* Blt the pointer on the screen. */ /* Blt the pointer on the screen. */
if (pgp->psurfColor) if (pgp->psurfColor)
{ {
IntEngBitBltEx(psoDest, IntEngBitBlt(psoDest,
&pgp->psurfMask->SurfObj, &pgp->psurfMask->SurfObj,
NULL, NULL,
NULL, NULL,
NULL, NULL,
&rclSurf, &rclSurf,
(POINTL*)&rclPointer, (POINTL*)&rclPointer,
NULL, NULL,
NULL, NULL,
NULL, NULL,
ROP3_TO_ROP4(SRCAND), ROP3_TO_ROP4(SRCAND));
FALSE);
IntEngBitBltEx(psoDest, IntEngBitBlt(psoDest,
&pgp->psurfColor->SurfObj, &pgp->psurfColor->SurfObj,
NULL, NULL,
NULL, NULL,
NULL, NULL,
&rclSurf, &rclSurf,
(POINTL*)&rclPointer, (POINTL*)&rclPointer,
NULL, NULL,
NULL, NULL,
NULL, NULL,
ROP3_TO_ROP4(SRCINVERT), ROP3_TO_ROP4(SRCINVERT));
FALSE);
} }
else else
{ {
IntEngBitBltEx(psoDest, IntEngBitBlt(psoDest,
&pgp->psurfMask->SurfObj, &pgp->psurfMask->SurfObj,
NULL, NULL,
NULL, NULL,
NULL, NULL,
&rclSurf, &rclSurf,
(POINTL*)&rclPointer, (POINTL*)&rclPointer,
NULL, NULL,
NULL, NULL,
NULL, NULL,
ROP3_TO_ROP4(SRCAND), ROP3_TO_ROP4(SRCAND));
FALSE);
rclPointer.top += pgp->Size.cy; rclPointer.top += pgp->Size.cy;
IntEngBitBltEx(psoDest, IntEngBitBlt(psoDest,
&pgp->psurfMask->SurfObj, &pgp->psurfMask->SurfObj,
NULL, NULL,
NULL, NULL,
NULL, NULL,
&rclSurf, &rclSurf,
(POINTL*)&rclPointer, (POINTL*)&rclPointer,
NULL, NULL,
NULL, NULL,
NULL, NULL,
ROP3_TO_ROP4(SRCINVERT), ROP3_TO_ROP4(SRCINVERT));
FALSE);
} }
} }
@ -353,7 +337,7 @@ EngSetPointerShape(
rectl.bottom = sizel.cy; rectl.bottom = sizel.cy;
/* Calculate lDelta for our surfaces. */ /* Calculate lDelta for our surfaces. */
lDelta = DIB_GetDIBWidthBytes(sizel.cx, lDelta = WIDTH_BYTES_ALIGN32(sizel.cx,
BitsPerFormat(pso->iBitmapFormat)); BitsPerFormat(pso->iBitmapFormat));
/* Create a bitmap for saving the pixels under the cursor. */ /* Create a bitmap for saving the pixels under the cursor. */
@ -373,10 +357,10 @@ EngSetPointerShape(
/* Create a bitmap to copy the color bitmap to */ /* Create a bitmap to copy the color bitmap to */
hbmColor = EngCreateBitmap(psoColor->sizlBitmap, hbmColor = EngCreateBitmap(psoColor->sizlBitmap,
lDelta, lDelta,
pso->iBitmapFormat, pso->iBitmapFormat,
BMF_TOPDOWN | BMF_NOZEROINIT, BMF_TOPDOWN | BMF_NOZEROINIT,
NULL); NULL);
psurfColor = SURFACE_ShareLockSurface(hbmColor); psurfColor = SURFACE_ShareLockSurface(hbmColor);
if (!psurfColor) goto failure; if (!psurfColor) goto failure;
@ -540,28 +524,13 @@ EngMovePointer(
prcl->right = prcl->left + pgp->Size.cx; prcl->right = prcl->left + pgp->Size.cx;
prcl->bottom = prcl->top + pgp->Size.cy; prcl->bottom = prcl->top + pgp->Size.cy;
} }
} }
else if (prcl != NULL) else if (prcl != NULL)
{ {
prcl->left = prcl->top = prcl->right = prcl->bottom = -1; 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 ULONG APIENTRY
IntEngSetPointerShape( IntEngSetPointerShape(
IN SURFOBJ *pso, IN SURFOBJ *pso,
@ -576,13 +545,11 @@ IntEngSetPointerShape(
IN FLONG fl) IN FLONG fl)
{ {
ULONG ulResult = SPS_DECLINE; ULONG ulResult = SPS_DECLINE;
SURFACE *psurf = CONTAINING_RECORD(pso, SURFACE, SurfObj);
PFN_DrvSetPointerShape pfnSetPointerShape; PFN_DrvSetPointerShape pfnSetPointerShape;
PPDEVOBJ ppdev = GDIDEV(pso); PPDEVOBJ ppdev = GDIDEV(pso);
pfnSetPointerShape = GDIDEVFUNCS(pso).SetPointerShape; pfnSetPointerShape = GDIDEVFUNCS(pso).SetPointerShape;
SURFACE_LockBitmapBits(psurf);
if (pfnSetPointerShape) if (pfnSetPointerShape)
{ {
ulResult = pfnSetPointerShape(pso, ulResult = pfnSetPointerShape(pso,
@ -620,8 +587,6 @@ IntEngSetPointerShape(
ppdev->pfnMovePointer = EngMovePointer; ppdev->pfnMovePointer = EngMovePointer;
} }
SURFACE_UnlockBitmapBits(psurf);
return ulResult; return ulResult;
} }
@ -649,10 +614,14 @@ GreSetPointerShape(
return 0; 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) if (!psurf)
{ {
DPRINT1("DC has no surface.\n"); DPRINT1("DC has no surface.\n");
EngReleaseSemaphore(pdc->ppdev->hsemDevLock);
DC_UnlockDc(pdc); DC_UnlockDc(pdc);
return 0; return 0;
} }
@ -668,7 +637,7 @@ GreSetPointerShape(
{ {
/* We have one, lock it */ /* We have one, lock it */
psurfColor = SURFACE_ShareLockSurface(hbmColor); psurfColor = SURFACE_ShareLockSurface(hbmColor);
if (psurfColor) if (psurfColor)
{ {
/* Create an XLATEOBJ, no mono support */ /* Create an XLATEOBJ, no mono support */
@ -700,6 +669,8 @@ GreSetPointerShape(
if (psurfMask) if (psurfMask)
SURFACE_ShareUnlockSurface(psurfMask); SURFACE_ShareUnlockSurface(psurfMask);
EngReleaseSemaphore(pdc->ppdev->hsemDevLock);
/* Unlock the DC */ /* Unlock the DC */
DC_UnlockDc(pdc); DC_UnlockDc(pdc);
@ -724,12 +695,23 @@ GreMovePointer(
DPRINT1("Failed to lock the DC.\n"); DPRINT1("Failed to lock the DC.\n");
return; return;
} }
ASSERT(pdc->dctype == DCTYPE_DIRECT);
/* Store the cursor exclude position in the PDEV */ /* Acquire PDEV lock */
prcl = &pdc->ppdev->Pointer.Exclude; EngAcquireSemaphore(pdc->ppdev->hsemDevLock);
/* Call Eng/Drv function */ /* Check if we need to move it */
IntEngMovePointer(&pdc->dclevel.pSurface->SurfObj, x, y, prcl); 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 */ /* Unlock the DC */
DC_UnlockDc(pdc); DC_UnlockDc(pdc);

View file

@ -32,14 +32,13 @@
#define NDEBUG #define NDEBUG
#include <debug.h> #include <debug.h>
static BOOL APIENTRY FillSolidUnlocked(SURFOBJ *pso, PRECTL pRect, ULONG iColor) BOOL APIENTRY FillSolid(SURFOBJ *pso, PRECTL pRect, ULONG iColor)
{ {
LONG y; LONG y;
ULONG LineWidth; ULONG LineWidth;
ASSERT(pso); ASSERT(pso);
ASSERT(pRect); ASSERT(pRect);
MouseSafetyOnDrawStart(pso, pRect->left, pRect->top, pRect->right, pRect->bottom);
LineWidth = pRect->right - pRect->left; LineWidth = pRect->right - pRect->left;
DPRINT(" LineWidth: %d, top: %d, bottom: %d\n", LineWidth, pRect->top, pRect->bottom); DPRINT(" LineWidth: %d, top: %d, bottom: %d\n", LineWidth, pRect->top, pRect->bottom);
for (y = pRect->top; y < pRect->bottom; y++) 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( DibFunctionsForBitmapFormat[pso->iBitmapFormat].DIB_HLine(
pso, pRect->left, pRect->right, y, iColor); pso, pRect->left, pRect->right, y, iColor);
} }
MouseSafetyOnDrawEnd(pso);
return TRUE; 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 BOOL APIENTRY
EngPaintRgn(SURFOBJ *pso, CLIPOBJ *ClipRegion, ULONG iColor, MIX Mix, EngPaintRgn(SURFOBJ *pso, CLIPOBJ *ClipRegion, ULONG iColor, MIX Mix,
BRUSHOBJ *BrushObj, POINTL *BrushPoint) BRUSHOBJ *BrushObj, POINTL *BrushPoint)
@ -85,7 +71,7 @@ EngPaintRgn(SURFOBJ *pso, CLIPOBJ *ClipRegion, ULONG iColor, MIX Mix,
if (ClipRegion->iDComplexity == DC_RECT) if (ClipRegion->iDComplexity == DC_RECT)
{ {
FillSolidUnlocked(pso, &(ClipRegion->rclBounds), iColor); FillSolid(pso, &(ClipRegion->rclBounds), iColor);
} else { } else {
/* Enumerate all the rectangles and draw them */ /* Enumerate all the rectangles and draw them */
@ -94,7 +80,7 @@ EngPaintRgn(SURFOBJ *pso, CLIPOBJ *ClipRegion, ULONG iColor, MIX Mix,
do { do {
EnumMore = CLIPOBJ_bEnum(ClipRegion, sizeof(RectEnum), (PVOID) &RectEnum); EnumMore = CLIPOBJ_bEnum(ClipRegion, sizeof(RectEnum), (PVOID) &RectEnum);
for (i = 0; i < RectEnum.c; i++) { for (i = 0; i < RectEnum.c; i++) {
FillSolidUnlocked(pso, RectEnum.arcl + i, iColor); FillSolid(pso, RectEnum.arcl + i, iColor);
} }
} while (EnumMore); } while (EnumMore);
} }
@ -136,18 +122,11 @@ IntEngPaint(IN SURFOBJ *pso,
DPRINT("pso->iType == %d\n", pso->iType); DPRINT("pso->iType == %d\n", pso->iType);
/* Is the surface's Paint function hooked? */ /* 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 // 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( ret = GDIDEVFUNCS(pso).Paint(
pso, ClipRegion, Brush, BrushOrigin, Mix); pso, ClipRegion, Brush, BrushOrigin, Mix);
MouseSafetyOnDrawEnd(pso);
SURFACE_UnlockBitmapBits(psurf);
return ret; return ret;
} }
return EngPaint(pso, ClipRegion, Brush, BrushOrigin, Mix ); return EngPaint(pso, ClipRegion, Brush, BrushOrigin, Mix );

View 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;
}

View 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;
}

View file

@ -69,6 +69,19 @@ EngReleaseSemaphore ( IN HSEMAPHORE hsem )
IntGdiReleaseSemaphore ( hsem ); IntGdiReleaseSemaphore ( hsem );
} }
VOID
NTAPI
EngAcquireSemaphoreShared(
IN HSEMAPHORE hsem)
{
PTHREADINFO pti;
ASSERT(hsem);
ExEnterCriticalRegionAndAcquireResourceShared((PERESOURCE)hsem);
pti = PsGetThreadWin32Thread(PsGetCurrentThread());
if (pti) ++pti->dwEngAcquireCount;
}
/* /*
* @implemented * @implemented
*/ */

View file

@ -462,25 +462,16 @@ IntEngStretchBlt(SURFOBJ *psoDest,
/* No success yet */ /* No success yet */
ret = FALSE; ret = FALSE;
SURFACE_LockBitmapBits(psurfDest);
MouseSafetyOnDrawStart(psoDest, OutputRect.left, OutputRect.top,
OutputRect.right, OutputRect.bottom);
if (UsesSource) if (UsesSource)
{ {
psurfSource = CONTAINING_RECORD(psoSource, SURFACE, SurfObj); 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 */ /* Prepare color adjustment */
/* Call the driver's DrvStretchBlt if available */ /* 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 ) */ /* Drv->StretchBltROP (look at http://www.osronline.com/ddkx/graphics/ddifncs_0z3b.htm ) */
ret = GDIDEVFUNCS(psoDest).StretchBltROP(psoDest, ret = GDIDEVFUNCS(psoDest).StretchBltROP(psoDest,
@ -514,17 +505,6 @@ IntEngStretchBlt(SURFOBJ *psoDest,
ROP); ROP);
} }
if (UsesSource)
{
MouseSafetyOnDrawEnd(psoSource);
if (psoSource != psoDest)
{
SURFACE_UnlockBitmapBits(psurfSource);
}
}
MouseSafetyOnDrawEnd(psoDest);
SURFACE_UnlockBitmapBits(psurfDest);
return ret; return ret;
} }

File diff suppressed because it is too large Load diff

View file

@ -76,7 +76,7 @@ EngTransparentBlt(SURFOBJ *psoDest,
OutputRect.top = DestRect->bottom; OutputRect.top = DestRect->bottom;
OutputRect.bottom = DestRect->top; OutputRect.bottom = DestRect->top;
} }
if(Clip) if(Clip)
{ {
if(OutputRect.left < Clip->rclBounds.left) if(OutputRect.left < Clip->rclBounds.left)
@ -284,17 +284,7 @@ IntEngTransparentBlt(SURFOBJ *psoDest,
OutputRect = InputClippedRect; OutputRect = InputClippedRect;
} }
if(psoSource != psoDest) if(psurfDest->flags & HOOK_TRANSPARENTBLT)
{
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)
{ {
Ret = GDIDEVFUNCS(psoDest).TransparentBlt( Ret = GDIDEVFUNCS(psoDest).TransparentBlt(
psoDest, psoSource, Clip, ColorTranslation, &OutputRect, psoDest, psoSource, Clip, ColorTranslation, &OutputRect,
@ -309,14 +299,6 @@ IntEngTransparentBlt(SURFOBJ *psoDest,
&OutputRect, &InputRect, iTransColor, Reserved); &OutputRect, &InputRect, iTransColor, Reserved);
} }
MouseSafetyOnDrawEnd(psoDest);
SURFACE_UnlockBitmapBits(psurfDest);
if(psoSource != psoDest)
{
MouseSafetyOnDrawEnd(psoSource);
SURFACE_UnlockBitmapBits(psurfSource);
}
return Ret; return Ret;
} }

View file

@ -64,7 +64,7 @@ EXLATEOBJ_iXlateRGBtoBGR(PEXLATEOBJ pxlo, ULONG iColor)
{ {
ULONG iNewColor; ULONG iNewColor;
/* Copy green and alpha */ /* Copy green */
iNewColor = iColor & 0xff00ff00; iNewColor = iColor & 0xff00ff00;
/* Mask red and blue */ /* Mask red and blue */
@ -362,19 +362,19 @@ EXLATEOBJ_vInitialize(
EXLATEOBJ_vInitTrivial(pexlo); EXLATEOBJ_vInitTrivial(pexlo);
if (ppalDst == ppalSrc || !ppalSrc || !ppalDst || if (ppalDst == ppalSrc || !ppalSrc || !ppalDst ||
((ppalDst->Mode == PAL_RGB || ppalDst->Mode == PAL_BGR) && ((ppalDst->flFlags == PAL_RGB || ppalDst->flFlags == PAL_BGR) &&
ppalDst->Mode == ppalSrc->Mode)) ppalDst->flFlags == ppalSrc->flFlags))
{ {
return; return;
} }
pexlo->ppalSrc = ppalSrc; pexlo->ppalSrc = ppalSrc;
pexlo->ppalDst = ppalDst; pexlo->ppalDst = ppalDst;
pexlo->xlo.iSrcType = ppalSrc->Mode; pexlo->xlo.iSrcType = ppalSrc->flFlags;
pexlo->xlo.iDstType = ppalDst->Mode; pexlo->xlo.iDstType = ppalDst->flFlags;
/* Chack if both of the pallettes are indexed */ /* 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 */ /* At least one palette is not indexed, calculate shifts/masks */
ULONG aulMasksSrc[3], aulMasksDst[3]; ULONG aulMasksSrc[3], aulMasksDst[3];
@ -391,10 +391,10 @@ EXLATEOBJ_vInitialize(
pexlo->ulBlueShift = CalculateShift(aulMasksSrc[2], aulMasksDst[2]); pexlo->ulBlueShift = CalculateShift(aulMasksSrc[2], aulMasksDst[2]);
} }
if (ppalSrc->Mode & PAL_MONOCHROME) if (ppalSrc->flFlags & PAL_MONOCHROME)
{ {
/* This is a monochrome palette */ /* 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 */ /* Mono to color, use the dest DC's fore and back color */
pexlo->pfnXlate = EXLATEOBJ_iXlateTable; pexlo->pfnXlate = EXLATEOBJ_iXlateTable;
@ -406,28 +406,28 @@ EXLATEOBJ_vInitialize(
PALETTE_ulGetNearestIndex(ppalDst, crDstBackColor); PALETTE_ulGetNearestIndex(ppalDst, crDstBackColor);
} }
} }
else if (ppalDst->Mode & PAL_MONOCHROME) else if (ppalDst->flFlags & PAL_MONOCHROME)
{ {
pexlo->pfnXlate = EXLATEOBJ_iXlateToMono; pexlo->pfnXlate = EXLATEOBJ_iXlateToMono;
pexlo->xlo.flXlate |= XO_TO_MONO; pexlo->xlo.flXlate |= XO_TO_MONO;
pexlo->xlo.cEntries = 1; pexlo->xlo.cEntries = 1;
if (ppalSrc->Mode & PAL_INDEXED) if (ppalSrc->flFlags & PAL_INDEXED)
{ {
pexlo->aulXlate[0] = pexlo->aulXlate[0] =
PALETTE_ulGetNearestPaletteIndex(ppalSrc, crSrcBackColor); PALETTE_ulGetNearestPaletteIndex(ppalSrc, crSrcBackColor);
} }
else if (ppalSrc->Mode & PAL_BGR) else if (ppalSrc->flFlags & PAL_BGR)
{ {
pexlo->aulXlate[0] = crSrcBackColor; pexlo->aulXlate[0] = crSrcBackColor;
} }
else if (ppalSrc->Mode & PAL_RGB) else if (ppalSrc->flFlags & PAL_RGB)
{ {
pexlo->aulXlate[0] = RGB(GetBValue(crSrcBackColor), pexlo->aulXlate[0] = RGB(GetBValue(crSrcBackColor),
GetGValue(crSrcBackColor), GetGValue(crSrcBackColor),
GetRValue(crSrcBackColor)); GetRValue(crSrcBackColor));
} }
else if (ppalSrc->Mode & PAL_BITFIELDS) else if (ppalSrc->flFlags & PAL_BITFIELDS)
{ {
PALETTE_vGetBitMasks(ppalSrc, &pexlo->ulRedMask); PALETTE_vGetBitMasks(ppalSrc, &pexlo->ulRedMask);
pexlo->ulRedShift = CalculateShift(0xFF, pexlo->ulRedMask); pexlo->ulRedShift = CalculateShift(0xFF, pexlo->ulRedMask);
@ -437,7 +437,7 @@ EXLATEOBJ_vInitialize(
pexlo->aulXlate[0] = EXLATEOBJ_iXlateShiftAndMask(pexlo, crSrcBackColor); pexlo->aulXlate[0] = EXLATEOBJ_iXlateShiftAndMask(pexlo, crSrcBackColor);
} }
} }
else if (ppalSrc->Mode & PAL_INDEXED) else if (ppalSrc->flFlags & PAL_INDEXED)
{ {
cEntries = ppalSrc->NumColors; cEntries = ppalSrc->NumColors;
@ -458,7 +458,7 @@ EXLATEOBJ_vInitialize(
pexlo->xlo.cEntries = cEntries; pexlo->xlo.cEntries = cEntries;
pexlo->pfnXlate = EXLATEOBJ_iXlateTable; pexlo->pfnXlate = EXLATEOBJ_iXlateTable;
if (ppalDst->Mode & PAL_INDEXED) if (ppalDst->flFlags & PAL_INDEXED)
{ {
pexlo->xlo.flXlate |= XO_TABLE; 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; pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoPal;
else if (ppalDst->Mode & PAL_BGR) else if (ppalDst->flFlags & PAL_BGR)
pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR; pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR;
else if (ppalDst->Mode & PAL_RGB16_555) else if (ppalDst->flFlags & PAL_RGB16_555)
pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto555; pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto555;
else if (ppalDst->Mode & PAL_RGB16_565) else if (ppalDst->flFlags & PAL_RGB16_565)
pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto565; pexlo->pfnXlate = EXLATEOBJ_iXlateRGBto565;
else if (ppalDst->Mode & PAL_BITFIELDS) else if (ppalDst->flFlags & PAL_BITFIELDS)
pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask; 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; pexlo->pfnXlate = EXLATEOBJ_iXlateBitfieldsToPal;
else if (ppalDst->Mode & PAL_RGB) else if (ppalDst->flFlags & PAL_RGB)
/* The inverse function works the same */ /* The inverse function works the same */
pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR; pexlo->pfnXlate = EXLATEOBJ_iXlateRGBtoBGR;
else if (ppalDst->Mode & PAL_RGB16_555) else if (ppalDst->flFlags & PAL_RGB16_555)
pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto555; pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto555;
else if (ppalDst->Mode & PAL_RGB16_565) else if (ppalDst->flFlags & PAL_RGB16_565)
pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto565; pexlo->pfnXlate = EXLATEOBJ_iXlateBGRto565;
else if (ppalDst->Mode & PAL_BITFIELDS) else if (ppalDst->flFlags & PAL_BITFIELDS)
pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask; 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; pexlo->pfnXlate = EXLATEOBJ_iXlate555toPal;
else if (ppalDst->Mode & PAL_RGB) else if (ppalDst->flFlags & PAL_RGB)
pexlo->pfnXlate = EXLATEOBJ_iXlate555toRGB; pexlo->pfnXlate = EXLATEOBJ_iXlate555toRGB;
else if (ppalDst->Mode & PAL_BGR) else if (ppalDst->flFlags & PAL_BGR)
pexlo->pfnXlate = EXLATEOBJ_iXlate555toBGR; pexlo->pfnXlate = EXLATEOBJ_iXlate555toBGR;
else if (ppalDst->Mode & PAL_RGB16_565) else if (ppalDst->flFlags & PAL_RGB16_565)
pexlo->pfnXlate = EXLATEOBJ_iXlate555to565; pexlo->pfnXlate = EXLATEOBJ_iXlate555to565;
else if (ppalDst->Mode & PAL_BITFIELDS) else if (ppalDst->flFlags & PAL_BITFIELDS)
pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask; 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; pexlo->pfnXlate = EXLATEOBJ_iXlate565toPal;
else if (ppalDst->Mode & PAL_RGB) else if (ppalDst->flFlags & PAL_RGB)
pexlo->pfnXlate = EXLATEOBJ_iXlate565toRGB; pexlo->pfnXlate = EXLATEOBJ_iXlate565toRGB;
else if (ppalDst->Mode & PAL_BGR) else if (ppalDst->flFlags & PAL_BGR)
pexlo->pfnXlate = EXLATEOBJ_iXlate565toBGR; pexlo->pfnXlate = EXLATEOBJ_iXlate565toBGR;
else if (ppalDst->Mode & PAL_RGB16_555) else if (ppalDst->flFlags & PAL_RGB16_555)
pexlo->pfnXlate = EXLATEOBJ_iXlate565to555; pexlo->pfnXlate = EXLATEOBJ_iXlate565to555;
else if (ppalDst->Mode & PAL_BITFIELDS) else if (ppalDst->flFlags & PAL_BITFIELDS)
pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask; 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; pexlo->pfnXlate = EXLATEOBJ_iXlateBitfieldsToPal;
else else
pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask; pexlo->pfnXlate = EXLATEOBJ_iXlateShiftAndMask;
@ -603,157 +603,24 @@ EXLATEOBJ_vInitXlateFromDCs(
PDC pdcDst) PDC pdcDst)
{ {
PSURFACE psurfDst, psurfSrc; 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; psurfDst = pdcDst->dclevel.pSurface;
psurfSrc = pdcSrc->dclevel.pSurface; psurfSrc = pdcSrc->dclevel.pSurface;
/* Check for trivial color translation */
if (psurfDst == psurfSrc) if (psurfDst == psurfSrc)
{ {
EXLATEOBJ_vInitTrivial(pexlo);
return; return;
} }
hpalSrc = psurfSrc->hDIBPalette; /* Normal initialisation. No surface means DEFAULT_BITMAP */
if (!hpalSrc) EXLATEOBJ_vInitialize(pexlo,
hpalSrc = pPrimarySurface->devinfo.hpalDefault; psurfSrc ? psurfSrc->ppal : &gpalMono,
psurfDst ? psurfDst->ppal : &gpalMono,
ppalSrc = PALETTE_ShareLockPalette(hpalSrc); pdcSrc->pdcattr->crBackgroundClr,
if (!ppalSrc) pdcDst->pdcattr->crBackgroundClr,
return; pdcDst->pdcattr->crForegroundClr);
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);
} }
VOID VOID
@ -827,9 +694,9 @@ XLATEOBJ_cGetPalette(XLATEOBJ *pxlo, ULONG iPal, ULONG cPal, ULONG *pPalOut)
/* Verify palette type match */ /* Verify palette type match */
if (!ppal || if (!ppal ||
((iPal == XO_SRCPALETTE || iPal == XO_DESTPALETTE) ((iPal == XO_SRCPALETTE || iPal == XO_DESTPALETTE)
&& !(ppal->Mode & PAL_INDEXED)) || && !(ppal->flFlags & PAL_INDEXED)) ||
((iPal == XO_SRCBITFIELDS || iPal == XO_DESTBITFIELDS) ((iPal == XO_SRCBITFIELDS || iPal == XO_DESTBITFIELDS)
&& !(ppal->Mode & PAL_BITFIELDS))) && !(ppal->flFlags & PAL_BITFIELDS)))
{ {
return 0; return 0;
} }
@ -840,7 +707,7 @@ XLATEOBJ_cGetPalette(XLATEOBJ *pxlo, ULONG iPal, ULONG cPal, ULONG *pPalOut)
} }
/* Copy the values into the buffer */ /* Copy the values into the buffer */
if (ppal->Mode & PAL_INDEXED) if (ppal->flFlags & PAL_INDEXED)
{ {
cPal = min(cPal, ppal->NumColors); cPal = min(cPal, ppal->NumColors);
for (i = 0; i < cPal; i++) for (i = 0; i < cPal; i++)

View file

@ -2,11 +2,47 @@
#include "surface.h" #include "surface.h"
INT FASTCALL DIB_GetDIBWidthBytes (INT width, INT depth); typedef struct tagBITMAPV5INFO
int APIENTRY DIB_GetDIBImageBytes (INT width, INT height, INT depth); {
INT FASTCALL DIB_BitmapInfoSize (const BITMAPINFO * info, WORD coloruse); BITMAPV5HEADER bmiHeader;
RGBQUAD bmiColors[256];
} BITMAPV5INFO, *PBITMAPV5INFO;
INT APIENTRY BITMAP_GetObject(SURFACE * bmp, INT count, LPVOID buffer); 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 IntCreateBitmap(IN SIZEL Size, IN LONG Width, IN ULONG Format, IN ULONG Flags, IN PVOID Bits);
HBITMAP FASTCALL BITMAP_CopyBitmap (HBITMAP hBitmap); HBITMAP FASTCALL BITMAP_CopyBitmap (HBITMAP hBitmap);
UINT FASTCALL BITMAP_GetRealBitsPixel(UINT nBitsPixel); 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);

View file

@ -1,4 +1,5 @@
#pragma once #ifndef __WIN32K_DC_H
#define __WIN32K_DC_H
typedef struct _DC *PDC; typedef struct _DC *PDC;
@ -22,6 +23,30 @@ typedef struct _DC *PDC;
/* fl */ /* fl */
#define DC_FL_PAL_BACK 1 #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 ***********************************************************/ /* Type definitions ***********************************************************/
typedef struct _ROS_DC_INFO typedef struct _ROS_DC_INFO
@ -29,7 +54,7 @@ typedef struct _ROS_DC_INFO
HRGN hClipRgn; /* Clip region (may be 0) */ HRGN hClipRgn; /* Clip region (may be 0) */
HRGN hGCClipRgn; /* GC clip region (ClipRgn AND VisRgn) */ HRGN hGCClipRgn; /* GC clip region (ClipRgn AND VisRgn) */
CLIPOBJ *CombinedClip; /* Use XCLIPOBJ in DC. */ CLIPOBJ *CombinedClip;
UNICODE_STRING DriverName; UNICODE_STRING DriverName;
@ -136,13 +161,12 @@ extern PDC defaultDCstate;
NTSTATUS FASTCALL InitDcImpl(VOID); NTSTATUS FASTCALL InitDcImpl(VOID);
PPDEVOBJ FASTCALL IntEnumHDev(VOID); PPDEVOBJ FASTCALL IntEnumHDev(VOID);
HDC FASTCALL DC_AllocDC(PUNICODE_STRING Driver); PDC NTAPI DC_AllocDcWithHandle();
VOID FASTCALL DC_InitDC(HDC DCToInit); VOID FASTCALL DC_InitDC(HDC DCToInit);
HDC FASTCALL DC_FindOpenDC(PUNICODE_STRING Driver);
VOID FASTCALL DC_AllocateDcAttr(HDC); VOID FASTCALL DC_AllocateDcAttr(HDC);
VOID FASTCALL DC_FreeDcAttr(HDC); VOID FASTCALL DC_FreeDcAttr(HDC);
BOOL INTERNAL_CALL DC_Cleanup(PVOID ObjectBody); 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_LockDisplay(HDC);
VOID FASTCALL DC_UnlockDisplay(HDC); VOID FASTCALL DC_UnlockDisplay(HDC);
BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL); BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL);
@ -155,10 +179,16 @@ VOID FASTCALL DC_vUpdateFillBrush(PDC pdc);
VOID FASTCALL DC_vUpdateLineBrush(PDC pdc); VOID FASTCALL DC_vUpdateLineBrush(PDC pdc);
VOID FASTCALL DC_vUpdateTextBrush(PDC pdc); VOID FASTCALL DC_vUpdateTextBrush(PDC pdc);
VOID FASTCALL DC_vUpdateBackgroundBrush(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_SyncDcAttrtoUser(PDC);
BOOL FASTCALL DCU_SynchDcAttrtoUser(HDC); BOOL FASTCALL DCU_SynchDcAttrtoUser(HDC);
VOID FASTCALL DCU_SetDcUndeletable(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); COLORREF FASTCALL IntGdiSetBkColor (HDC hDC, COLORREF Color);
INT FASTCALL IntGdiSetBkMode(HDC hDC, INT backgroundMode); 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); HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC);
BOOL FASTCALL IntGdiCleanDC(HDC hDC); BOOL FASTCALL IntGdiCleanDC(HDC hDC);
VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS); VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS);
INT FASTCALL IntGdiGetDeviceCaps(PDC,INT);
BOOL FASTCALL MakeInfoDC(PDC,BOOL); BOOL FASTCALL MakeInfoDC(PDC,BOOL);
BOOL FASTCALL IntSetDefaultRegion(PDC); BOOL FASTCALL IntSetDefaultRegion(PDC);
extern PPDEVOBJ pPrimarySurface;
VOID VOID
FORCEINLINE FORCEINLINE
DC_vSelectSurface(PDC pdc, PSURFACE psurfNew) DC_vSelectSurface(PDC pdc, PSURFACE psurfNew)
@ -228,5 +255,6 @@ DC_vSelectPalette(PDC pdc, PPALETTE ppal)
pdc->dclevel.ppal = ppal; pdc->dclevel.ppal = ppal;
} }
BOOL FASTCALL IntPrepareDriverIfNeeded(VOID); extern PBRUSH pbrDefaultBrush ;
extern PDEVOBJ PrimarySurface;
#endif /* not __WIN32K_DC_H */

View 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;

View file

@ -5,15 +5,17 @@
INT FASTCALL INT FASTCALL
DIB_BitmapInfoSize (const BITMAPINFO * info, WORD coloruse); DIB_BitmapInfoSize (const BITMAPINFO * info, WORD coloruse);
HBITMAP APIENTRY HBITMAP APIENTRY
DIB_CreateDIBSection (PDC dc, PBITMAPINFO bmi, UINT usage, LPVOID *bits, HANDLE section, DWORD offset, DWORD ovr_pitch); DIB_CreateDIBSection (PDC dc, CONST BITMAPINFO *bmi, UINT usage, LPVOID *bits, HANDLE section, DWORD offset, DWORD ovr_pitch);
INT APIENTRY int FASTCALL
DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, PLONG width, PLONG height, PWORD planes, PWORD bpp, PLONG compr, PLONG size ); DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, LONG *width,
LONG *height, WORD *planes, WORD *bpp, DWORD *compr, DWORD *size );
INT APIENTRY INT APIENTRY
DIB_GetDIBImageBytes (INT width, INT height, INT depth); DIB_GetDIBImageBytes (INT width, INT height, INT depth);
INT FASTCALL HPALETTE FASTCALL
DIB_GetDIBWidthBytes (INT width, INT depth); DIB_MapPaletteColors(PPALETTE ppal, CONST BITMAPINFO* lpbmi);
RGBQUAD * FASTCALL
DIB_MapPaletteColors(PDC dc, CONST BITMAPINFO* lpbmi);
HPALETTE FASTCALL 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);

View file

@ -21,3 +21,19 @@ IntEngWindowChanged(
VOID FASTCALL IntGdiAcquireSemaphore ( HSEMAPHORE hsem ); VOID FASTCALL IntGdiAcquireSemaphore ( HSEMAPHORE hsem );
VOID FASTCALL IntGdiReleaseSemaphore ( HSEMAPHORE hsem ); VOID FASTCALL IntGdiReleaseSemaphore ( HSEMAPHORE hsem );
ULONGLONG APIENTRY EngGetTickCount(VOID); 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);

View file

@ -71,6 +71,7 @@ VOID INTERNAL_CALL GDIOBJ_FreeObj (POBJ pObj, UCHAR ObjectType);
BOOL INTERNAL_CALL GDIOBJ_FreeObjByHandle (HGDIOBJ hObj, DWORD ObjectType); BOOL INTERNAL_CALL GDIOBJ_FreeObjByHandle (HGDIOBJ hObj, DWORD ObjectType);
PGDIOBJ INTERNAL_CALL GDIOBJ_LockObj (HGDIOBJ hObj, DWORD ObjectType); PGDIOBJ INTERNAL_CALL GDIOBJ_LockObj (HGDIOBJ hObj, DWORD ObjectType);
PGDIOBJ INTERNAL_CALL GDIOBJ_ShareLockObj (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); PVOID INTERNAL_CALL GDI_MapHandleTable(PSECTION_OBJECT SectionObject, PEPROCESS Process);

View file

@ -1,17 +1,10 @@
#pragma once #pragma once
#define HOOK_THREAD_REFERENCED (0x1) #define HOOK_THREAD_REFERENCED (0x1)
#define NB_HOOKS (WH_MAXHOOK-WH_MINHOOK+1)
#define HOOKID_TO_INDEX(HookId) (HookId - WH_MINHOOK) #define HOOKID_TO_INDEX(HookId) (HookId - WH_MINHOOK)
#define HOOKID_TO_FLAG(HookId) (1 << ((HookId) + 1)) #define HOOKID_TO_FLAG(HookId) (1 << ((HookId) + 1))
#define ISITHOOKED(HookId) (((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks & HOOKID_TO_FLAG(HookId)) #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 typedef struct tagEVENTHOOK
{ {
THROBJHEAD head; THROBJHEAD head;
@ -32,11 +25,22 @@ typedef struct tagEVENTTABLE
UINT Counts; UINT Counts;
} EVENTTABLE, *PEVENTTABLE; } 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_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam);
LRESULT FASTCALL co_EVENT_CallEvents(DWORD, HWND, UINT_PTR, LONG_PTR); LRESULT FASTCALL co_EVENT_CallEvents(DWORD, HWND, UINT_PTR, LONG_PTR);
VOID FASTCALL HOOK_DestroyThreadHooks(PETHREAD Thread); VOID FASTCALL HOOK_DestroyThreadHooks(PETHREAD Thread);
VOID FASTCALL EVENT_DestroyThreadEvents(PETHREAD Thread);
PHOOK FASTCALL IntGetHookObject(HHOOK); PHOOK FASTCALL IntGetHookObject(HHOOK);
PHOOK FASTCALL IntGetNextHook(PHOOK Hook); PHOOK FASTCALL IntGetNextHook(PHOOK Hook);
LRESULT FASTCALL UserCallNextHookEx( PHOOK pHook, int Code, WPARAM wParam, LPARAM lParam, BOOL Ansi); LRESULT FASTCALL UserCallNextHookEx( PHOOK pHook, int Code, WPARAM wParam, LPARAM lParam, BOOL Ansi);
BOOL FASTCALL IntUnhookWindowsHook(int,HOOKPROC);
/* EOF */ /* EOF */

View file

@ -45,7 +45,7 @@ IntEngLineTo(SURFOBJ *Surface,
MIX mix); MIX mix);
BOOL APIENTRY BOOL APIENTRY
IntEngBitBltEx(SURFOBJ *DestObj, IntEngBitBlt(SURFOBJ *DestObj,
SURFOBJ *SourceObj, SURFOBJ *SourceObj,
SURFOBJ *Mask, SURFOBJ *Mask,
CLIPOBJ *ClipRegion, CLIPOBJ *ClipRegion,
@ -55,14 +55,7 @@ IntEngBitBltEx(SURFOBJ *DestObj,
POINTL *MaskOrigin, POINTL *MaskOrigin,
BRUSHOBJ *Brush, BRUSHOBJ *Brush,
POINTL *BrushOrigin, POINTL *BrushOrigin,
ROP4 Rop4, 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)
BOOL APIENTRY BOOL APIENTRY
IntEngStretchBlt(SURFOBJ *DestObj, IntEngStretchBlt(SURFOBJ *DestObj,

View file

@ -167,9 +167,6 @@ IntGetSysColor(INT nIndex);
/* Other Stuff */ /* Other Stuff */
INT FASTCALL
IntGdiGetDeviceCaps(PDC dc, INT Index);
INT INT
FASTCALL FASTCALL
IntGdiEscape(PDC dc, IntGdiEscape(PDC dc,
@ -186,14 +183,6 @@ IntEnumDisplaySettings(
IN OUT LPDEVMODEW pDevMode, IN OUT LPDEVMODEW pDevMode,
IN DWORD dwFlags); IN DWORD dwFlags);
LONG
FASTCALL
IntChangeDisplaySettings(
IN PUNICODE_STRING pDeviceName OPTIONAL,
IN LPDEVMODEW pDevMode,
IN DWORD dwflags,
IN PVOID lParam OPTIONAL);
HBITMAP HBITMAP
FASTCALL FASTCALL
IntCreateCompatibleBitmap(PDC Dc, IntCreateCompatibleBitmap(PDC Dc,

View 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);

View file

@ -29,6 +29,33 @@ VOID FASTCALL IntUserManualGuiCheck(LONG Check);
PVOID APIENTRY HackSecureVirtualMemory(IN PVOID,IN SIZE_T,IN ULONG,OUT PVOID *); PVOID APIENTRY HackSecureVirtualMemory(IN PVOID,IN SIZE_T,IN ULONG,OUT PVOID *);
VOID APIENTRY HackUnsecureVirtualMemory(IN 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 BOOL
NTAPI NTAPI
RegReadUserSetting( RegReadUserSetting(

View file

@ -2,8 +2,8 @@
#include <include/winsta.h> #include <include/winsta.h>
INT INTERNAL_CALL MouseSafetyOnDrawStart(SURFOBJ *SurfObj, LONG HazardX1, LONG HazardY1, LONG HazardX2, LONG HazardY2); INT INTERNAL_CALL MouseSafetyOnDrawStart(PPDEVOBJ ppdev, LONG HazardX1, LONG HazardY1, LONG HazardX2, LONG HazardY2);
INT INTERNAL_CALL MouseSafetyOnDrawEnd(SURFOBJ *SurfObj); INT INTERNAL_CALL MouseSafetyOnDrawEnd(PPDEVOBJ ppdev);
#ifndef XBUTTON1 #ifndef XBUTTON1
#define XBUTTON1 (0x01) #define XBUTTON1 (0x01)

View file

@ -87,9 +87,6 @@ typedef struct _USER_MESSAGE_QUEUE
/* Caret information for this queue */ /* Caret information for this queue */
PTHRDCARETINFO CaretInfo; PTHRDCARETINFO CaretInfo;
/* Window hooks */
PHOOKTABLE Hooks;
/* queue state tracking */ /* queue state tracking */
WORD WakeMask; WORD WakeMask;
WORD QueueBits; WORD QueueBits;
@ -212,9 +209,6 @@ BOOL APIENTRY IntInitMessagePumpHook();
BOOL APIENTRY IntUninitMessagePumpHook(); BOOL APIENTRY IntUninitMessagePumpHook();
#define MAKE_LONG(x, y) ((((y) & 0xFFFF) << 16) | ((x) & 0xFFFF)) #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 MsqSetMessageExtraInfo(LPARAM lParam);
LPARAM FASTCALL MsqGetMessageExtraInfo(VOID); LPARAM FASTCALL MsqGetMessageExtraInfo(VOID);
VOID APIENTRY MsqRemoveWindowMessagesFromQueue(PVOID pWindow); /* F*(&$ headers, will be gone in the rewrite! */ VOID APIENTRY MsqRemoveWindowMessagesFromQueue(PVOID pWindow); /* F*(&$ headers, will be gone in the rewrite! */

View file

@ -40,7 +40,7 @@ typedef struct _PALETTE
PALOBJ PalObj; PALOBJ PalObj;
XLATEOBJ *logicalToSystem; XLATEOBJ *logicalToSystem;
HPALETTE Self; HPALETTE Self;
ULONG Mode; // PAL_INDEXED, PAL_BITFIELDS, PAL_RGB, PAL_BGR FLONG flFlags; // PAL_INDEXED, PAL_BITFIELDS, PAL_RGB, PAL_BGR
ULONG NumColors; ULONG NumColors;
PALETTEENTRY *IndexedColors; PALETTEENTRY *IndexedColors;
ULONG RedMask; ULONG RedMask;
@ -52,8 +52,8 @@ typedef struct _PALETTE
HDEV hPDev; HDEV hPDev;
} PALETTE, *PPALETTE; } PALETTE, *PPALETTE;
extern PALETTE gpalRGB, gpalBGR, gpalMono; extern PALETTE gpalRGB, gpalBGR, gpalMono, gpalRGB555, gpalRGB565, *gppalDefault;
extern PPALETTE appalSurfaceDefault[];
HPALETTE FASTCALL PALETTE_AllocPalette(ULONG Mode, HPALETTE FASTCALL PALETTE_AllocPalette(ULONG Mode,
ULONG NumColors, ULONG NumColors,

View file

@ -1,6 +1,5 @@
#pragma once #ifndef __WIN32K_PDEVOBJ_H
#define __WIN32K_PDEVOBJ_H
#include <drivers/directx/directxint.h>
/* PDEVOBJ flags */ /* PDEVOBJ flags */
#define PDEV_DISPLAY 0x00000001 /* Display device */ #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 */ RECTL Exclude; /* required publicly for SPS_ACCEPT_EXCLUDE */
} GDIPOINTER, *PGDIPOINTER; } 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 typedef struct _GRAPHICS_DEVICE
{ {
WCHAR szNtDeviceName[CCHDEVICENAME/2]; WCHAR szNtDeviceName[CCHDEVICENAME/2];
@ -48,15 +62,17 @@ typedef struct _GRAPHICS_DEVICE
DWORD hkClassDriverConfig; DWORD hkClassDriverConfig;
DWORD StateFlags; /* See DISPLAY_DEVICE_* */ DWORD StateFlags; /* See DISPLAY_DEVICE_* */
ULONG cbdevmodeInfo; ULONG cbdevmodeInfo;
PVOID devmodeInfo; PDEVMODEINFO pdevmodeInfo;
DWORD cbdevmodeInfo1; ULONG cDevModes;
PVOID devmodeInfo1; PDEVMODEENTRY pDevModeList;
LPWSTR pwszDeviceNames; LPWSTR pDiplayDrivers;
LPWSTR pwszDescription; LPWSTR pwszDescription;
DWORD dwUnknown; DWORD dwUnknown;
PVOID pUnknown; PVOID pUnknown;
PFILE_OBJECT FileObject; PFILE_OBJECT FileObject;
DWORD ProtocolType; DWORD ProtocolType;
ULONG iDefaultMode;
ULONG iCurrentMode;
} GRAPHICS_DEVICE, *PGRAPHICS_DEVICE; } GRAPHICS_DEVICE, *PGRAPHICS_DEVICE;
typedef struct _PDEVOBJ typedef struct _PDEVOBJ
@ -64,8 +80,8 @@ typedef struct _PDEVOBJ
BASEOBJECT BaseObject; BASEOBJECT BaseObject;
struct _PDEVOBJ * ppdevNext; struct _PDEVOBJ * ppdevNext;
INT cPdevRefs; LONG cPdevRefs;
INT cPdevOpenRefs; LONG cPdevOpenRefs;
struct _PDEVOBJ * ppdevParent; struct _PDEVOBJ * ppdevParent;
FLONG flFlags; // flags FLONG flFlags; // flags
// FLONG flAccelerated; // FLONG flAccelerated;
@ -98,17 +114,17 @@ typedef struct _PDEVOBJ
// PFN_DrvSetPalette pfnDrvSetPalette; // PFN_DrvSetPalette pfnDrvSetPalette;
// PFN_DrvNotify pfnDrvNotify; // PFN_DrvNotify pfnDrvNotify;
// ULONG TagSig; // ULONG TagSig;
// PLDEVOBJ pldev; struct _LDEVOBJ * pldev;
DHPDEV dhpdev; /* DHPDEV for device. */ DHPDEV dhpdev; /* DHPDEV for device. */
PVOID ppalSurf; /* PEPALOBJ/PPALETTE for this device. */ struct _PALETTE* ppalSurf; /* PEPALOBJ/PPALETTE for this device. */
DEVINFO devinfo; DEVINFO devinfo;
GDIINFO gdiinfo; 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. */ // HANDLE hSpooler; /* Handle to spooler, if spooler dev driver. */
// PVOID pDesktopId; // PVOID pDesktopId;
PGRAPHICS_DEVICE pGraphicsDevice; PGRAPHICS_DEVICE pGraphicsDevice;
POINTL ptlOrigion; POINTL ptlOrigion;
PVOID pdmwDev; /* Ptr->DEVMODEW.dmSize + dmDriverExtra == alloc size. */ PDEVMODEW pdmwDev; /* Ptr->DEVMODEW.dmSize + dmDriverExtra == alloc size. */
// DWORD Unknown3; // DWORD Unknown3;
FLONG DxDd_Flags; /* DxDD active status flags. */ FLONG DxDd_Flags; /* DxDD active status flags. */
// LONG devAttr; // LONG devAttr;
@ -117,15 +133,12 @@ typedef struct _PDEVOBJ
union union
{ {
DRIVER_FUNCTIONS DriverFunctions; DRIVER_FUNCTIONS DriverFunctions;
DRIVER_FUNCTIONS pfn;
PVOID apfn[INDEX_LAST]; // B8C 0x0598 PVOID apfn[INDEX_LAST]; // B8C 0x0598
}; };
/* ros specific */ /* ros specific */
ULONG DxDd_nCount; ULONG DxDd_nCount;
ULONG DisplayNumber;
DEVMODEW DMW;
PFILE_OBJECT VideoFileObject;
BOOLEAN PreparedDriver;
GDIPOINTER Pointer; GDIPOINTER Pointer;
/* Stuff to keep track of software cursors; win32k gdi part */ /* Stuff to keep track of software cursors; win32k gdi part */
UINT SafetyRemoveLevel; /* at what level was the cursor removed? UINT SafetyRemoveLevel; /* at what level was the cursor removed?
@ -134,13 +147,47 @@ typedef struct _PDEVOBJ
struct _EDD_DIRECTDRAW_GLOBAL * pEDDgpl; struct _EDD_DIRECTDRAW_GLOBAL * pEDDgpl;
} PDEVOBJ, *PPDEVOBJ; } PDEVOBJ, *PPDEVOBJ;
/* PDEV and EDDX extra data container.*/ /* Globals ********************************************************************/
typedef struct _PDEVEDD
{
PDEVOBJ pdevobj;
EDD_DIRECTDRAW_GLOBAL EDDgpl;
} PDEVEDD, *PPDEVEDD;
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 */

View file

@ -14,7 +14,7 @@ typedef struct _ROSRGNDATA
RGNDATAHEADER rdh; RGNDATAHEADER rdh;
RECTL *Buffer; RECTL *Buffer;
} ROSRGNDATA, *PROSRGNDATA, *LPROSRGNDATA; } ROSRGNDATA, *PROSRGNDATA, *LPROSRGNDATA, REGION, *PREGION;
/* Functions ******************************************************************/ /* Functions ******************************************************************/

View file

@ -8,48 +8,88 @@
/* GDI surface object */ /* GDI surface object */
typedef struct _SURFACE typedef struct _SURFACE
{ {
BASEOBJECT BaseObject; BASEOBJECT BaseObject;
SURFOBJ SurfObj; SURFOBJ SurfObj;
FLONG flHooks; //XDCOBJ * pdcoAA;
FLONG flFlags; FLONG flags;
struct _PALETTE *ppal; struct _PALETTE *ppal;
//UINT unk_050;
union union
{ {
HANDLE hSecureUMPD; // if UMPD_SURFACE set HANDLE hSecureUMPD; // if UMPD_SURFACE set
HANDLE hMirrorParent;// if MIRROR_SURFACE set HANDLE hMirrorParent;// if MIRROR_SURFACE set
HANDLE hDDSurface; // if DIRECTDRAW_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 to get width/height of bitmap, use
bitmap.bmWidth/bitmap.bmHeight for bitmap.bmWidth/bitmap.bmHeight for
that */ that */
HDC hDC; // Doc in "Undocumented Windows", page 546, seems to be supported with XP.
ULONG cRef; // 0x064
HPALETTE hpalHint;
/* For device-independent bitmaps: */ HDC hdc; // Doc in "Undocumented Windows", page 546, seems to be supported with XP.
HANDLE hDIBSection; ULONG cRef;
HANDLE hSecure; HPALETTE hpalHint;
DWORD dwOffset;
/* For device-independent bitmaps: */
HANDLE hDIBSection;
HANDLE hSecure;
DWORD dwOffset;
//UINT unk_078;
/* reactos specific */ /* reactos specific */
PFAST_MUTEX BitsLock; /* You need to hold this lock before you touch DWORD biClrImportant;
the actual bits in the bitmap */
HPALETTE hDIBPalette;
DWORD dsBitfields[3]; // hack, should probably use palette instead
DWORD biClrUsed;
DWORD biClrImportant;
} SURFACE, *PSURFACE; } 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 */ /* Internal interface */
#define SURFACE_AllocSurface() ((PSURFACE) GDIOBJ_AllocObj(GDIObjType_SURF_TYPE))
#define SURFACE_AllocSurfaceWithHandle() ((PSURFACE) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP)) #define SURFACE_AllocSurfaceWithHandle() ((PSURFACE) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP))
#define SURFACE_FreeSurface(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDIObjType_SURF_TYPE) #define SURFACE_FreeSurface(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDIObjType_SURF_TYPE)
#define SURFACE_FreeSurfaceByHandle(hBMObj) GDIOBJ_FreeObjByHandle((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP) #define SURFACE_FreeSurfaceByHandle(hBMObj) GDIOBJ_FreeObjByHandle((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP)
@ -64,15 +104,31 @@ typedef struct _SURFACE
#define SURFACE_ShareUnlockSurface(pBMObj) \ #define SURFACE_ShareUnlockSurface(pBMObj) \
GDIOBJ_ShareUnlockObjByPtr ((POBJ)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_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 GDIDEV(SurfObj) ((PDEVOBJ *)((SurfObj)->hdev))
#define GDIDEVFUNCS(SurfObj) ((PDEVOBJ *)((SurfObj)->hdev))->DriverFunctions #define GDIDEVFUNCS(SurfObj) ((PDEVOBJ *)((SurfObj)->hdev))->DriverFunctions
INT FASTCALL BitsPerFormat (ULONG Format);
ULONG FASTCALL BitmapFormat (WORD Bits, DWORD Compression); 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