diff --git a/ReactOS-amd64.rbuild b/ReactOS-amd64.rbuild
index 9d299caafb8..0da944fd749 100644
--- a/ReactOS-amd64.rbuild
+++ b/ReactOS-amd64.rbuild
@@ -42,6 +42,9 @@
-section-alignment=0x1000
--unique=.eh_frame
-static
+ -fno-leading-underscore
+ -shared
+ --exclude-all-symbols
diff --git a/ReactOS-i386.rbuild b/ReactOS-i386.rbuild
index 44e3511c28a..5bfd52a6177 100644
--- a/ReactOS-i386.rbuild
+++ b/ReactOS-i386.rbuild
@@ -28,6 +28,8 @@
-mpreferred-stack-boundary=2
-m32 --win32
-gstabs+
+ -fno-set-stack-executable
+ -fno-optimize-sibling-calls
-gstabs+
diff --git a/base/applications/paint/rsrc.rc b/base/applications/paint/rsrc.rc
index 49b981acd2f..a1e776d6720 100644
--- a/base/applications/paint/rsrc.rc
+++ b/base/applications/paint/rsrc.rc
@@ -42,4 +42,9 @@
// THIS WILL MAKE THE PROGRAM USE THE COMMON CONTROLS
// LIBRARY VERSION 6.0 (IF IT IS AVAILABLE)
//
+#ifdef _AMD64_
+1 24 "paint.exe.amd64.manifest"
+#elif _X86_
1 24 "paint.exe.manifest"
+#endif
+
diff --git a/base/applications/rapps/rapps/firefox3.txt b/base/applications/rapps/rapps/firefox3.txt
index 072eee6407b..e6051802e00 100644
--- a/base/applications/rapps/rapps/firefox3.txt
+++ b/base/applications/rapps/rapps/firefox3.txt
@@ -2,10 +2,10 @@
[Section]
Name = Mozilla Firefox 3.0
-Version = 3.0.17
+Version = 3.0.18
Licence = MPL/GPL/LGPL
Description = The most popular and one of the best free Web Browsers out there.
-Size = 7.1M
+Size = 7.2M
Category = 5
URLSite = http://www.mozilla.com/en-US/
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/en-US/Firefox%20Setup%203.0.18.exe
@@ -13,7 +13,7 @@ CDPath = none
[Section.0407]
Description = Der populärste und einer der besten freien Webbrowser.
-Size = 6.9M
+Size = 7.0M
URLSite = http://www.mozilla-europe.org/de/
URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/de/Firefox%20Setup%203.0.18.exe
diff --git a/base/applications/rapps/rapps/mirandaim.txt b/base/applications/rapps/rapps/mirandaim.txt
index 5b817e16f37..0fff6a4ea04 100644
--- a/base/applications/rapps/rapps/mirandaim.txt
+++ b/base/applications/rapps/rapps/mirandaim.txt
@@ -2,13 +2,13 @@
[Section]
Name = Miranda IM
-Version = 0.8.13
+Version = 0.8.18
Licence = GPL
Description = Open source multiprotocol instant messaging application - May not work completely.
Size = 1.6MB
Category = 5
URLSite = http://www.miranda-im.org/
-URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.13-unicode.exe
+URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.18-unicode.exe
CDPath = none
[Section.0407]
diff --git a/base/applications/rapps/rapps/openttd.txt b/base/applications/rapps/rapps/openttd.txt
index 6220e8ada93..dfc94a95e43 100644
--- a/base/applications/rapps/rapps/openttd.txt
+++ b/base/applications/rapps/rapps/openttd.txt
@@ -2,13 +2,13 @@
[Section]
Name = OpenTTD
-Version = 0.7.3
+Version = 0.7.5
Licence = GPL v2
Description = Open Source clone of the "Transport Tycoon Deluxe" game engine. You need a copy of Transport Tycoon.
Size = 2.9MB
Category = 4
URLSite = http://www.openttd.org/
-URLDownload = http://ovh.dl.sourceforge.net/sourceforge/openttd/openttd-0.7.3-windows-win32.exe
+URLDownload = http://binaries.openttd.org/releases/0.7.5/openttd-0.7.5-windows-win32.exe
CDPath = none
[Section.0407]
diff --git a/base/applications/rapps/rapps/opera.txt b/base/applications/rapps/rapps/opera.txt
index 148e79bc9e4..44e49cc61ac 100644
--- a/base/applications/rapps/rapps/opera.txt
+++ b/base/applications/rapps/rapps/opera.txt
@@ -2,13 +2,13 @@
[Section]
Name = Opera
-Version = 10.10
+Version = 10.51
Licence = Freeware
Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client.
Size = 11.0M
Category = 5
URLSite = http://www.opera.com/
-URLDownload = http://ftp.opera.com/pub/opera/win/1010/int/Opera_1010_in_Setup.exe
+URLDownload = http://get4.opera.com/pub/opera/win/1051/int/Opera_1051_int_Setup.exe
CDPath = none
[Section.0407]
diff --git a/base/applications/rapps/rapps/sambatng.txt b/base/applications/rapps/rapps/sambatng.txt
index 4377863c7ac..6cf579a9372 100644
--- a/base/applications/rapps/rapps/sambatng.txt
+++ b/base/applications/rapps/rapps/sambatng.txt
@@ -2,10 +2,10 @@
[Section]
Name = Samba TNG
-Version = 0.4.99cvs
+Version = 0.5-RC1
Licence = GPL
Description = This tool allows you to access your Windows shared folders/printers with ReactOS.
-Size = 1MB
+Size = 2.1MB
Category = 5
URLSite = http://samba-tng.org/
URLDownload = http://svn.reactos.org/packages/samba-tng.exe
diff --git a/base/applications/rapps/rapps/seamonkey.txt b/base/applications/rapps/rapps/seamonkey.txt
index 69a43d51e90..9c980d30b65 100644
--- a/base/applications/rapps/rapps/seamonkey.txt
+++ b/base/applications/rapps/rapps/seamonkey.txt
@@ -2,31 +2,31 @@
[Section]
Name = Mozilla SeaMonkey
-Version = 2.0.2
+Version = 2.0.3
Licence = MPL/GPL/LGPL
Description = Mozilla Suite is alive. This is the one and only Browser, Mail, Chat, and Composer bundle you will ever need.
-Size = 10.1MB
+Size = 10.0MB
Category = 5
URLSite = http://www.seamonkey-project.org/
-URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.2/win32/en-US/SeaMonkey%20Setup%202.0.2.exe
+URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/en-US/SeaMonkey%20Setup%202.0.3.exe
CDPath = none
[Section.0407]
Description = Mozilla Suite lebt. Dies ist das einzige Browser-, Mail-, Chat- and Composerwerkzeug-Bundle welches Sie benötigen.
-Size = 10.0MB
-URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.2/win32/de/SeaMonkey%20Setup%202.0.2.exe
+Size = 10.1MB
+URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/de/SeaMonkey%20Setup%202.0.3.exe
[Section.040a]
Description = La suite de Mozilla está viva. Es el primero y único navegador web, gestor de correo, lector de noticias, Chat y editor HTML que necesitarás.
Size = 10.0MB
-URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.2/win32/es-ES/SeaMonkey%20Setup%202.0.2.exe
+URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/es-ES/SeaMonkey%20Setup%202.0.3.exe
[Section.0415]
Description = Pakiet Mozilla żyje. W zestawie: przeglądarka, klient poczty, IRC oraz Edytor HTML - wszystko, czego potrzebujesz.
Size = 10.8MB
-URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.2/win32/pl/SeaMonkey%20Setup%202.0.2.exe
+URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/pl/SeaMonkey%20Setup%202.0.3.exe
[Section.0419]
Description = Продолжение Mozilla Suite. Включает браузер, почтовый клиент, IRC-клиент и HTML-редактор.
Size = 10.4MB
-URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.2/win32/ru/SeaMonkey%20Setup%202.0.2.exe
+URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/ru/SeaMonkey%20Setup%202.0.3.exe
diff --git a/base/applications/rapps/rapps/smplayer.txt b/base/applications/rapps/rapps/smplayer.txt
index b3071703a1e..a2e47d3acff 100644
--- a/base/applications/rapps/rapps/smplayer.txt
+++ b/base/applications/rapps/rapps/smplayer.txt
@@ -2,13 +2,13 @@
[Section]
Name = SMPlayer
-Version = 0.6.8
+Version = 0.6.9
Licence = GPL
Description = SMPlayer.
-Size = 13.38MB
+Size = 14.2MB
Category = 1
URLSite = http://smplayer.sourceforge.net/
-URLDownload = http://downloads.sourceforge.net/project/smplayer/SMPlayer/0.6.8/smplayer-0.6.8-win32.exe
+URLDownload = http://downloads.sourceforge.net/project/smplayer/SMPlayer/0.6.9/smplayer-0.6.9-win32.exe
CDPath = none
[Section.0407]
diff --git a/base/applications/rapps/rapps/thunderbird.txt b/base/applications/rapps/rapps/thunderbird.txt
index ca8fd86bdf9..9f0cd328d89 100644
--- a/base/applications/rapps/rapps/thunderbird.txt
+++ b/base/applications/rapps/rapps/thunderbird.txt
@@ -2,35 +2,35 @@
[Section]
Name = Mozilla Thunderbird
-Version = 3.0.1
+Version = 3.0.3
Licence = MPL/GPL/LGPL
Description = The most popular and one of the best free Mail Clients out there.
Size = 8.6M
Category = 5
URLSite = http://www.mozilla-europe.org/en/products/thunderbird/
-URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.1/win32/en-US/Thunderbird%20Setup%203.0.1.exe
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/en-US/Thunderbird%20Setup%203.0.3.exe
CDPath = none
[Section.0407]
Description = Der populärste und einer der besten freien Mail-Clients.
Size = 8.4M
URLSite = http://www.mozilla-europe.org/de/products/thunderbird/
-URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.1/win32/de/Thunderbird%20Setup%203.0.1.exe
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/de/Thunderbird%20Setup%203.0.3.exe
[Section.040a]
Description = El más popular y uno de los mejores clientes mail que hay.
Size = 8.4M
URLSite = http://www.mozilla-europe.org/es/products/thunderbird/
-URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.1/win32/es-ES/Thunderbird%20Setup%203.0.1.exe
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/es-ES/Thunderbird%20Setup%203.0.3.exe
[Section.0415]
Description = Najpopularniejszy i jeden z najlepszych darmowych klientów poczty.
-Size = 9.2M
+Size = 9.3M
URLSite = http://www.mozilla-europe.org/pl/products/thunderbird/
-URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.1/win32/pl/Thunderbird%20Setup%203.0.1.exe
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/pl/Thunderbird%20Setup%203.0.3.exe
[Section.0419]
Description = Один из самых популярных и лучших бесплатных почтовых клиентов.
Size = 8.8M
URLSite = http://www.mozilla-europe.org/ru/products/thunderbird/
-URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.1/win32/ru/Thunderbird%20Setup%203.0.1.exe
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/ru/Thunderbird%20Setup%203.0.3.exe
diff --git a/base/applications/sndrec32/audio_wavein.hpp b/base/applications/sndrec32/audio_wavein.hpp
index 0288ea6824e..7f9285b6b65 100644
--- a/base/applications/sndrec32/audio_wavein.hpp
+++ b/base/applications/sndrec32/audio_wavein.hpp
@@ -305,7 +305,7 @@ class audio_wavein
if ( aud_info.bits() == 16 )
svalue = ( unsigned int ) abs( *(( short * ) (main_buffer + aud_info.bytes_in_samples( nsamp ))));
else if ( aud_info.bits() == 8 )
- svalue = (unsigned int)(( unsigned char * ) *(main_buffer + aud_info.bytes_in_samples( nsamp )));
+ svalue = (unsigned int)(( ptrdiff_t ) *(main_buffer + aud_info.bytes_in_samples( nsamp )));
else
svalue = 0;
diff --git a/base/applications/sndrec32/audio_waveout.hpp b/base/applications/sndrec32/audio_waveout.hpp
index a36518dc3f3..0e22afdad7e 100644
--- a/base/applications/sndrec32/audio_waveout.hpp
+++ b/base/applications/sndrec32/audio_waveout.hpp
@@ -229,7 +229,7 @@ class audio_waveout
if ( aud_info.bits() == 16 )
svalue = ( unsigned int ) abs( *(( short * ) (main_buffer + aud_info.bytes_in_samples( nsamp ))));
else if ( aud_info.bits() == 8 )
- svalue = (unsigned int)(( unsigned char * ) *(main_buffer + aud_info.bytes_in_samples( nsamp )));
+ svalue = (unsigned int)(( ptrdiff_t ) *(main_buffer + aud_info.bytes_in_samples( nsamp )));
else
svalue = 0;
diff --git a/base/setup/usetup/partlist.c b/base/setup/usetup/partlist.c
index ca0bdf7ae6a..5c553c2f537 100644
--- a/base/setup/usetup/partlist.c
+++ b/base/setup/usetup/partlist.c
@@ -846,10 +846,10 @@ AddDiskToList (HANDLE FileHandle,
DiskEntry->SectorsPerTrack = DiskGeometry.SectorsPerTrack;
DiskEntry->BytesPerSector = DiskGeometry.BytesPerSector;
- DPRINT ("Cylinders %d\n", DiskEntry->Cylinders);
- DPRINT ("TracksPerCylinder %d\n", DiskEntry->TracksPerCylinder);
- DPRINT ("SectorsPerTrack %d\n", DiskEntry->SectorsPerTrack);
- DPRINT ("BytesPerSector %d\n", DiskEntry->BytesPerSector);
+ DPRINT ("Cylinders %I64u\n", DiskEntry->Cylinders);
+ DPRINT ("TracksPerCylinder %I64u\n", DiskEntry->TracksPerCylinder);
+ DPRINT ("SectorsPerTrack %I64u\n", DiskEntry->SectorsPerTrack);
+ DPRINT ("BytesPerSector %I64u\n", DiskEntry->BytesPerSector);
DiskEntry->TrackSize =
(ULONGLONG)DiskGeometry.SectorsPerTrack *
diff --git a/base/shell/cmd/cmd.c b/base/shell/cmd/cmd.c
index 233cffa8931..59f00eada0a 100644
--- a/base/shell/cmd/cmd.c
+++ b/base/shell/cmd/cmd.c
@@ -244,7 +244,7 @@ static BOOL IsConsoleProcess(HANDLE Process)
return TRUE;
}
- return IMAGE_SUBSYSTEM_WINDOWS_CUI == ProcessPeb.ImageSubSystem;
+ return IMAGE_SUBSYSTEM_WINDOWS_CUI == ProcessPeb.ImageSubsystem;
}
diff --git a/baseaddress.rbuild b/baseaddress.rbuild
index cacc80f77f3..80401c1db46 100644
--- a/baseaddress.rbuild
+++ b/baseaddress.rbuild
@@ -118,6 +118,7 @@
+
diff --git a/boot/bootdata/bootcd/bootcd.rbuild b/boot/bootdata/bootcd/bootcd.rbuild
index 0cadb1b56a9..471a7f4863e 100644
--- a/boot/bootdata/bootcd/bootcd.rbuild
+++ b/boot/bootdata/bootcd/bootcd.rbuild
@@ -1,5 +1,12 @@
-
- isoboot
-
+
+ isoboot
+
+
+
+ isoboot
+
+
diff --git a/boot/bootdata/livecd/livecd.rbuild b/boot/bootdata/livecd/livecd.rbuild
index 9c95cc54d56..e92deca42ce 100644
--- a/boot/bootdata/livecd/livecd.rbuild
+++ b/boot/bootdata/livecd/livecd.rbuild
@@ -1,5 +1,12 @@
-
- isoboot
-
+
+ isoboot
+
+
+
+ isoboot
+
+
diff --git a/boot/bootdata/packages/reactos.dff b/boot/bootdata/packages/reactos.dff
index 71f53defee6..1a37bcc6c45 100644
--- a/boot/bootdata/packages/reactos.dff
+++ b/boot/bootdata/packages/reactos.dff
@@ -262,6 +262,7 @@ dll\win32\atl\atl.dll 1
dll\win32\authz\authz.dll 1
dll\win32\avicap32\avicap32.dll 1
dll\win32\avifil32\avifil32.dll 1
+dll\win32\batt\batt.dll 1
dll\win32\bcrypt\bcrypt.dll 1
dll\win32\beepmidi\beepmidi.dll 1
dll\win32\browseui\browseui.dll 1
diff --git a/boot/freeldr/freeldr/debug.c b/boot/freeldr/freeldr/debug.c
index 0de49f52320..4ab90966192 100644
--- a/boot/freeldr/freeldr/debug.c
+++ b/boot/freeldr/freeldr/debug.c
@@ -351,7 +351,7 @@ KeBugCheckEx(
IN ULONG_PTR BugCheckParameter3,
IN ULONG_PTR BugCheckParameter4)
{
- char Buffer[64];
+ char Buffer[70];
sprintf(Buffer, "*** STOP: 0x%08lX (0x%08lX, 0x%08lX, 0x%08lX, 0x%08lX)",
BugCheckCode, BugCheckParameter1, BugCheckParameter2,
BugCheckParameter3, BugCheckParameter4);
diff --git a/dll/cpl/sysdm/general.c b/dll/cpl/sysdm/general.c
index 7c2eea6ff69..72b87de1154 100644
--- a/dll/cpl/sysdm/general.c
+++ b/dll/cpl/sysdm/general.c
@@ -96,7 +96,16 @@ LRESULT CALLBACK RosImageProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam
// build new bitmap
GetObject(pImgInfo->hBitmap, sizeof(BITMAP), &bitmap);
dc = CreateCompatibleDC(GetDC(NULL));
+ if (dc == NULL)
+ {
+ break;
+ }
sdc = CreateCompatibleDC(dc);
+ if (sdc == NULL)
+ {
+ DeleteDC(dc);
+ break;
+ }
ncm.cbSize = sizeof(NONCLIENTMETRICS);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0);
diff --git a/dll/cpl/usrmgr/lang/de-DE.rc b/dll/cpl/usrmgr/lang/de-DE.rc
index c8fa221989d..e3c7c31959c 100644
--- a/dll/cpl/usrmgr/lang/de-DE.rc
+++ b/dll/cpl/usrmgr/lang/de-DE.rc
@@ -46,9 +46,9 @@ BEGIN
EDITTEXT IDC_USER_GENERAL_FULL_NAME,77,43,168,13,ES_AUTOHSCROLL
LTEXT "Beschreibung:", -1, 7, 64, 63, 8
EDITTEXT IDC_USER_GENERAL_DESCRIPTION,77,61,168,13,ES_AUTOHSCROLL
- AUTOCHECKBOX "Benutzer muss das Passwort bei der ersten Anmeldung ändern",IDC_USER_GENERAL_FORCE_CHANGE,7,82,210,10
- AUTOCHECKBOX "Benutzer kann das Passwort nicht ändern",IDC_USER_GENERAL_CANNOT_CHANGE,7,95,210,10
- AUTOCHECKBOX "Passwort läuft nie ab",IDC_USER_GENERAL_NEVER_EXPIRES,7,108,210,10
+ AUTOCHECKBOX "Benutzer muss das Passwort bei der ersten Anmeldung ndern",IDC_USER_GENERAL_FORCE_CHANGE,7,82,230,10
+ AUTOCHECKBOX "Benutzer kann das Passwort nicht ndern",IDC_USER_GENERAL_CANNOT_CHANGE,7,95,210,10
+ AUTOCHECKBOX "Passwort luft nie ab",IDC_USER_GENERAL_NEVER_EXPIRES,7,108,210,10
AUTOCHECKBOX "Konto ist deativiert",IDC_USER_GENERAL_DISABLED,7,121,210,10
AUTOCHECKBOX "Konto ist gesperrt",IDC_USER_GENERAL_LOCKED,7,134,210,10
END
@@ -106,7 +106,7 @@ END
IDD_CHANGE_PASSWORD DIALOGEX DISCARDABLE 0, 0, 267, 74
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
-CAPTION "Passwort ändern"
+CAPTION "Passwort ndern"
FONT 8, "MS Shell Dlg"
BEGIN
EDITTEXT IDC_EDIT_PASSWORD1,107,7,153,14,ES_AUTOHSCROLL | ES_PASSWORD
@@ -126,16 +126,16 @@ BEGIN
EDITTEXT IDC_USER_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL
RTEXT "Benutzername:", -1,7,10,96,8
EDITTEXT IDC_USER_NEW_FULL_NAME,107,25,153,14,ES_AUTOHSCROLL
- RTEXT "Vollständiger Name:", -1,7,28,96,8
+ RTEXT "Vollstndiger Name:", -1,7,28,96,8
EDITTEXT IDC_USER_NEW_DESCRIPTION,107,43,153,14,ES_AUTOHSCROLL
RTEXT "Beschreibung:", -1,7,46,96,8
EDITTEXT IDC_USER_NEW_PASSWORD1,107,67,153,14,ES_AUTOHSCROLL | ES_PASSWORD
RTEXT "Passwort:", -1,7,70,96,8
EDITTEXT IDC_USER_NEW_PASSWORD2,107,85,153,14,ES_AUTOHSCROLL | ES_PASSWORD
RTEXT "Passwort wiederholen:", -1,7,88,96,8
- AUTOCHECKBOX "Benutzer muss das Passwort bei der ersten Anmeldung ändern",IDC_USER_NEW_FORCE_CHANGE,7,109,200,10
- AUTOCHECKBOX "Benutzer kann das Passwort nicht ändern",IDC_USER_NEW_CANNOT_CHANGE,7,123,200,10,WS_DISABLED
- AUTOCHECKBOX "Passwort läuft nie ab",IDC_USER_NEW_NEVER_EXPIRES,7,137,200,10,WS_DISABLED
+ AUTOCHECKBOX "Benutzer muss das Passwort bei der ersten Anmeldung ndern",IDC_USER_NEW_FORCE_CHANGE,7,109,230,10
+ AUTOCHECKBOX "Benutzer kann das Passwort nicht ndern",IDC_USER_NEW_CANNOT_CHANGE,7,123,200,10,WS_DISABLED
+ AUTOCHECKBOX "Passwort luft nie ab",IDC_USER_NEW_NEVER_EXPIRES,7,137,200,10,WS_DISABLED
AUTOCHECKBOX "Konto ist deaktiviert",IDC_USER_NEW_DISABLED,7,151,200,10
DEFPUSHBUTTON "OK",IDOK,156,179,50,14,WS_DISABLED
PUSHBUTTON "Abbrechen",IDCANCEL,210,179,50,14
@@ -179,9 +179,9 @@ BEGIN
END
POPUP ""
BEGIN
- MENUITEM "Mitglied hinzufügen", IDM_GROUP_ADD_MEMBER, GRAYED
+ MENUITEM "Mitglied hinzufgen", IDM_GROUP_ADD_MEMBER, GRAYED
MENUITEM SEPARATOR
- MENUITEM "Löschen", IDM_GROUP_DELETE
+ MENUITEM "Lschen", IDM_GROUP_DELETE
MENUITEM "Umbenennen", IDM_GROUP_RENAME
MENUITEM SEPARATOR
MENUITEM "Eigenschaften", IDM_GROUP_PROPERTIES
@@ -197,9 +197,9 @@ BEGIN
END
POPUP ""
BEGIN
- MENUITEM "Passwort ändern", IDM_USER_CHANGE_PASSWORD
+ MENUITEM "Passwort ndern", IDM_USER_CHANGE_PASSWORD
MENUITEM SEPARATOR
- MENUITEM "Löschen", IDM_USER_DELETE
+ MENUITEM "Lschen", IDM_USER_DELETE
MENUITEM "Umbenennen", IDM_USER_RENAME
MENUITEM SEPARATOR
MENUITEM "Eigenschaften", IDM_USER_PROPERTIES
diff --git a/dll/directx/bdaplgin/controlnode.cpp b/dll/directx/bdaplgin/controlnode.cpp
index 5cd98ccbdcb..40ec853ee3d 100644
--- a/dll/directx/bdaplgin/controlnode.cpp
+++ b/dll/directx/bdaplgin/controlnode.cpp
@@ -9,7 +9,9 @@
#include "precomp.h"
+#ifndef _MSC_VER
const GUID IID_IKsPropertySet = {0x31efac30, 0x515c, 0x11d0, {0xa9,0xaa, 0x00,0xaa,0x00,0x61,0xbe,0x93}};
+#endif
class CControlNode : public IUnknown
{
@@ -32,12 +34,12 @@ public:
return m_Ref;
}
- CControlNode(HANDLE hFile, ULONG NodeType, ULONG PinId) : m_Ref(0), m_hFile(hFile), m_NodeType(NodeType), m_PinId(PinId){};
+ CControlNode(IKsPropertySet * pProperty, ULONG NodeType, ULONG PinId) : m_Ref(0), m_pKsProperty(pProperty), m_NodeType(NodeType), m_PinId(PinId){};
virtual ~CControlNode(){};
protected:
LONG m_Ref;
- HANDLE m_hFile;
+ IKsPropertySet * m_pKsProperty;
ULONG m_NodeType;
ULONG m_PinId;
};
@@ -58,19 +60,19 @@ CControlNode::QueryInterface(
}
else if(IsEqualGUID(refiid, IID_IBDA_FrequencyFilter))
{
- return CBDAFrequencyFilter_fnConstructor(m_hFile, m_NodeType, refiid, Output);
+ return CBDAFrequencyFilter_fnConstructor(m_pKsProperty, m_NodeType, refiid, Output);
}
else if(IsEqualGUID(refiid, IID_IBDA_SignalStatistics))
{
- return CBDASignalStatistics_fnConstructor(m_hFile, m_NodeType, refiid, Output);
+ return CBDASignalStatistics_fnConstructor(m_pKsProperty, m_NodeType, refiid, Output);
}
else if(IsEqualGUID(refiid, IID_IBDA_LNBInfo))
{
- return CBDALNBInfo_fnConstructor(m_hFile, m_NodeType, refiid, Output);
+ return CBDALNBInfo_fnConstructor(m_pKsProperty, m_NodeType, refiid, Output);
}
else if(IsEqualGUID(refiid, IID_IBDA_DigitalDemodulator))
{
- return CBDADigitalDemodulator_fnConstructor(m_hFile, m_NodeType, refiid, Output);
+ return CBDADigitalDemodulator_fnConstructor(m_pKsProperty, m_NodeType, refiid, Output);
}
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[MAX_PATH];
@@ -88,7 +90,6 @@ CControlNode::QueryInterface(
HRESULT
WINAPI
CControlNode_fnConstructor(
- HANDLE hFile,
IBaseFilter * pFilter,
ULONG NodeType,
ULONG PinId,
@@ -98,7 +99,7 @@ CControlNode_fnConstructor(
WCHAR Buffer[100];
HRESULT hr;
IPin * pPin = NULL;
- IKsObject * pObject = NULL;
+ IKsPropertySet * pProperty;
// store pin id
swprintf(Buffer, L"%u", PinId);
@@ -115,26 +116,21 @@ CControlNode_fnConstructor(
return hr;
}
- // query IKsObject interface
- hr = pPin->QueryInterface(IID_IKsObject, (void**)&pObject);
+ // query for IKsPropertySet interface
+ hr = pPin->QueryInterface(IID_IKsPropertySet, (void**)&pProperty);
+ if (FAILED(hr))
+ return hr;
#ifdef BDAPLGIN_TRACE
swprintf(Buffer, L"CControlNode_fnConstructor get IID_IKsObject status %lx\n", hr);
OutputDebugStringW(Buffer);
#endif
- if (SUCCEEDED(hr))
- {
- // get pin handle
- hFile = pObject->KsGetObjectHandle();
- // release IKsObject interface
- pObject->Release();
- }
// release IPin interface
pPin->Release();
// construct device control
- CControlNode * handler = new CControlNode(hFile, NodeType, PinId);
+ CControlNode * handler = new CControlNode(pProperty, NodeType, PinId);
#ifdef BDAPLGIN_TRACE
OutputDebugStringW(L"CControlNode_fnConstructor\n");
diff --git a/dll/directx/bdaplgin/devicecontrol.cpp b/dll/directx/bdaplgin/devicecontrol.cpp
index 661eba547a0..5d0e50121d2 100644
--- a/dll/directx/bdaplgin/devicecontrol.cpp
+++ b/dll/directx/bdaplgin/devicecontrol.cpp
@@ -9,20 +9,24 @@
#include "precomp.h"
-const GUID CLSID_DVBTNetworkProvider = {0x216c62df, 0x6d7f, 0x4e9a, {0x85, 0x71, 0x5, 0xf1, 0x4e, 0xdb, 0x76, 0x6a}};
-const GUID IID_IAC3Filter = {0xe4539501, 0xc609, 0x46ea, {0xad, 0x2a, 0x0e, 0x97, 0x00, 0x24, 0x56, 0x83}};
-const GUID IID_IAsyncReader = {0x56A868AA, 0x0AD4, 0x11CE, {0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}};
-const GUID IID_IMatrixMixer = {0xafc57835, 0x2fd1, 0x4541, {0xa6, 0xd9, 0x0d, 0xb7, 0x18, 0x56, 0xe5, 0x89}};
-const GUID IID_IBDA_NetworkProvider = {0xfd501041, 0x8ebe, 0x11ce, {0x81, 0x83, 0x00, 0xaa, 0x00, 0x57, 0x7d, 0xa2}};
-const GUID IID_IAMOpenProgress = {0x8E1C39A1, 0xDE53, 0x11cf, {0xAA, 0x63, 0x00, 0x80, 0xC7, 0x44, 0x52, 0x8D}};
-const GUID IID_IDistributorNotify = {0x56a868af, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}};
-const GUID IID_IBDA_DeviceControl = {0xFD0A5AF3, 0xB41D, 0x11d2, {0x9C, 0x95, 0x00, 0xC0, 0x4F, 0x79, 0x71, 0xE0}};
-const GUID IID_IBDA_Topology = {0x79B56888, 0x7FEA, 0x4690, {0xB4, 0x5D, 0x38, 0xFD, 0x3C, 0x78, 0x49, 0xBE}};
const GUID IID_IKsObject = {0x423c13a2, 0x2070, 0x11d0, {0x9e, 0xf7, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1}};
+
+#ifndef _MSC_VER
+const GUID CLSID_DVBTNetworkProvider = {0x216c62df, 0x6d7f, 0x4e9a, {0x85, 0x71, 0x5, 0xf1, 0x4e, 0xdb, 0x76, 0x6a}};
+
const GUID KSPROPSETID_BdaTopology = {0xa14ee835, 0x0a23, 0x11d3, {0x9c, 0xc7, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
const GUID KSMETHODSETID_BdaDeviceConfiguration = {0x71985f45, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
-const GUID IID_IBaseFilter = {0x56a86895, 0x0ad4, 0x11ce, {0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70}};
const GUID KSMETHODSETID_BdaChangeSync = {0xfd0a5af3, 0xb41d, 0x11d2, {0x9c, 0x95, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
+const GUID IID_IBaseFilter = {0x56a86895, 0x0ad4, 0x11ce, {0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70}};
+const GUID IID_IAsyncReader = {0x56A868AA, 0x0AD4, 0x11CE, {0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}};
+const GUID IID_IAMOpenProgress = {0x8E1C39A1, 0xDE53, 0x11cf, {0xAA, 0x63, 0x00, 0x80, 0xC7, 0x44, 0x52, 0x8D}};
+const GUID IID_IBDA_Topology = {0x79B56888, 0x7FEA, 0x4690, {0xB4, 0x5D, 0x38, 0xFD, 0x3C, 0x78, 0x49, 0xBE}};
+const GUID IID_IBDA_NetworkProvider = {0xfd501041, 0x8ebe, 0x11ce, {0x81, 0x83, 0x00, 0xaa, 0x00, 0x57, 0x7d, 0xa2}};
+const GUID IID_IBDA_DeviceControl = {0xFD0A5AF3, 0xB41D, 0x11d2, {0x9C, 0x95, 0x00, 0xC0, 0x4F, 0x79, 0x71, 0xE0}};
+
+const GUID IID_IDistributorNotify = {0x56a868af, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}};
+
+#endif
class CBDADeviceControl : public IBDA_DeviceControl,
public IBDA_Topology
@@ -468,15 +472,15 @@ CBDADeviceControl::GetControlNode(ULONG ulInputPinId, ULONG ulOutputPinId, ULONG
hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_BDA_NODE_PIN) + sizeof(ULONG), &PinId, sizeof(ULONG), &BytesReturned);
#ifdef BDAPLGIN_TRACE
- WCHAR Buffer[100];
- swprintf(Buffer, L"CBDADeviceControl::GetControlNode: hr %lx, BytesReturned %lu PinId %lu\n", hr, BytesReturned, PinId);
+ WCHAR Buffer[200];
+ swprintf(Buffer, L"CBDADeviceControl::GetControlNode: hr %lx, BytesReturned %lu PinId %lu ulInputPinId %lu ulOutputPinId %lu ulNodeType %lu\n", hr, BytesReturned, PinId, ulInputPinId, ulOutputPinId, ulNodeType);
OutputDebugStringW(Buffer);
#endif
if (FAILED(hr))
return hr;
- hr = CControlNode_fnConstructor(m_Handle, m_pFilter, ulNodeType, PinId, IID_IUnknown, (LPVOID*)ppControlNode);
+ hr = CControlNode_fnConstructor(m_pFilter, ulNodeType, PinId, IID_IUnknown, (LPVOID*)ppControlNode);
#ifdef BDAPLGIN_TRACE
swprintf(Buffer, L"CBDADeviceControl::GetControlNode: hr %lx\n", hr);
diff --git a/dll/directx/bdaplgin/digitaldemo.cpp b/dll/directx/bdaplgin/digitaldemo.cpp
index 2d1b7ed62d6..311ddeeb47b 100644
--- a/dll/directx/bdaplgin/digitaldemo.cpp
+++ b/dll/directx/bdaplgin/digitaldemo.cpp
@@ -9,8 +9,10 @@
#include "precomp.h"
+#ifndef _MSC_VER
const GUID IID_IBDA_DigitalDemodulator = {0xef30f379, 0x985b, 0x4d10, {0xb6, 0x40, 0xa7, 0x9d, 0x5e, 0x04, 0xe1, 0xe0}};
const GUID KSPROPSETID_BdaDigitalDemodulator = {0xef30f379, 0x985b, 0x4d10, {0xb6, 0x40, 0xa7, 0x9d, 0x5e, 0x4, 0xe1, 0xe0}};
+#endif
class CBDADigitalDemodulator : public IBDA_DigitalDemodulator
{
@@ -48,12 +50,12 @@ public:
HRESULT STDMETHODCALLTYPE put_SpectralInversion(SpectralInversion *pSpectralInversion);
HRESULT STDMETHODCALLTYPE get_SpectralInversion(SpectralInversion *pSpectralInversion);
- CBDADigitalDemodulator(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){};
+ CBDADigitalDemodulator(IKsPropertySet * pProperty, ULONG NodeId) : m_Ref(0), m_pProperty(pProperty), m_NodeId(NodeId){};
~CBDADigitalDemodulator(){};
protected:
LONG m_Ref;
- HANDLE m_hFile;
+ IKsPropertySet * m_pProperty;
ULONG m_NodeId;
};
@@ -86,6 +88,7 @@ CBDADigitalDemodulator::QueryInterface(
swprintf(Buffer, L"CBDADigitalDemodulator::QueryInterface: NoInterface for %s", lpstr);
OutputDebugStringW(Buffer);
CoTaskMemFree(lpstr);
+DebugBreak();
#endif
return E_NOINTERFACE;
@@ -98,20 +101,17 @@ CBDADigitalDemodulator::put_ModulationType(ModulationType *pModulationType)
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
-
// setup request
- Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
- Node.Property.Id = KSPROPERTY_BDA_MODULATION_TYPE;
- Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pModulationType, sizeof(ModulationType), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_MODULATION_TYPE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pModulationType, sizeof(ModulationType));
+
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDADigitalDemodulator::put_ModulationType: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+ swprintf(Buffer, L"CBDADigitalDemodulator::put_ModulationType: pModulationType %lu hr %lx\n", *pModulationType, hr);
OutputDebugStringW(Buffer);
#endif
@@ -131,20 +131,18 @@ CBDADigitalDemodulator::put_InnerFECMethod(FECMethod *pFECMethod)
{
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
- Node.Property.Id = KSPROPERTY_BDA_INNER_FEC_TYPE;
- Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECMethod, sizeof(FECMethod), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_INNER_FEC_TYPE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pFECMethod, sizeof(FECMethod));
+
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECMethod: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+ swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECMethod: pFECMethod %lu hr %lx\n", *pFECMethod, hr);
OutputDebugStringW(Buffer);
#endif
@@ -165,20 +163,16 @@ CBDADigitalDemodulator::put_InnerFECRate(BinaryConvolutionCodeRate *pFECRate)
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
-
// setup request
- Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
- Node.Property.Id = KSPROPERTY_BDA_INNER_FEC_RATE;
- Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECRate, sizeof(BinaryConvolutionCodeRate), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_INNER_FEC_RATE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pFECRate, sizeof(BinaryConvolutionCodeRate));
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+ swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECRate: pFECRate %lu hr %lx\n", *pFECRate, hr);
OutputDebugStringW(Buffer);
#endif
@@ -198,20 +192,17 @@ CBDADigitalDemodulator::put_OuterFECMethod(FECMethod *pFECMethod)
{
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
- Node.Property.Id = KSPROPERTY_BDA_OUTER_FEC_TYPE;
- Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECMethod, sizeof(FECMethod), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_OUTER_FEC_TYPE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pFECMethod, sizeof(FECMethod));
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECMethod: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+ swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECMethod: pFECMethod %lu hr %lx\n", *pFECMethod, hr);
OutputDebugStringW(Buffer);
#endif
@@ -232,20 +223,16 @@ CBDADigitalDemodulator::put_OuterFECRate(BinaryConvolutionCodeRate *pFECRate)
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
-
// setup request
- Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
- Node.Property.Id = KSPROPERTY_BDA_OUTER_FEC_RATE;
- Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECRate, sizeof(BinaryConvolutionCodeRate), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_OUTER_FEC_RATE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pFECRate, sizeof(BinaryConvolutionCodeRate));
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+ swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECRate: pFECRate %lu hr %lx\n", *pFECRate, hr);
OutputDebugStringW(Buffer);
#endif
@@ -265,20 +252,17 @@ CBDADigitalDemodulator::put_SymbolRate(ULONG *pSymbolRate)
{
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
- Node.Property.Id = KSPROPERTY_BDA_SYMBOL_RATE;
- Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pSymbolRate, sizeof(ULONG), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_SYMBOL_RATE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pSymbolRate, sizeof(ULONG));
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDADigitalDemodulator::put_SymbolRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+ swprintf(Buffer, L"CBDADigitalDemodulator::put_SymbolRate: pSymbolRate %lu hr %lx\n", *pSymbolRate, hr);
OutputDebugStringW(Buffer);
#endif
@@ -298,20 +282,17 @@ CBDADigitalDemodulator::put_SpectralInversion(SpectralInversion *pSpectralInvers
{
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
- Node.Property.Id = KSPROPERTY_BDA_SPECTRAL_INVERSION;
- Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pSpectralInversion, sizeof(SpectralInversion), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaDigitalDemodulator, KSPROPERTY_BDA_SPECTRAL_INVERSION, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), pSpectralInversion, sizeof(SpectralInversion));
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDADigitalDemodulator::put_SpectralInversion: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+ swprintf(Buffer, L"CBDADigitalDemodulator::put_SpectralInversion: pSpectralInversion %lu hr %lx\n", *pSpectralInversion, hr);
OutputDebugStringW(Buffer);
#endif
@@ -329,13 +310,13 @@ CBDADigitalDemodulator::get_SpectralInversion(SpectralInversion *pSpectralInvers
HRESULT
WINAPI
CBDADigitalDemodulator_fnConstructor(
- HANDLE hFile,
+ IKsPropertySet * pProperty,
ULONG NodeId,
REFIID riid,
LPVOID * ppv)
{
// construct device control
- CBDADigitalDemodulator * handler = new CBDADigitalDemodulator(hFile, NodeId);
+ CBDADigitalDemodulator * handler = new CBDADigitalDemodulator(pProperty, NodeId);
#ifdef BDAPLGIN_TRACE
OutputDebugStringW(L"CBDADigitalDemodulator_fnConstructor\n");
diff --git a/dll/directx/bdaplgin/frequencyfilter.cpp b/dll/directx/bdaplgin/frequencyfilter.cpp
index 90d1e6a24fa..ca3bc46282f 100644
--- a/dll/directx/bdaplgin/frequencyfilter.cpp
+++ b/dll/directx/bdaplgin/frequencyfilter.cpp
@@ -9,8 +9,10 @@
#include "precomp.h"
+#ifndef _MSC_VER
const GUID IID_IBDA_FrequencyFilter = {0x71985f47, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x00, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
const GUID KSPROPSETID_BdaFrequencyFilter = {0x71985f47, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
+#endif
class CBDAFrequencyFilter : public IBDA_FrequencyFilter
{
@@ -46,12 +48,12 @@ public:
HRESULT STDMETHODCALLTYPE put_FrequencyMultiplier(ULONG ulMultiplier);
HRESULT STDMETHODCALLTYPE get_FrequencyMultiplier(ULONG *pulMultiplier);
- CBDAFrequencyFilter(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){};
+ CBDAFrequencyFilter(IKsPropertySet * pProperty, ULONG NodeId) : m_Ref(0), m_pProperty(pProperty), m_NodeId(NodeId){};
virtual ~CBDAFrequencyFilter(){};
protected:
LONG m_Ref;
- HANDLE m_hFile;
+ IKsPropertySet * m_pProperty;
ULONG m_NodeId;
};
@@ -84,6 +86,7 @@ CBDAFrequencyFilter::QueryInterface(
swprintf(Buffer, L"CControlNode::QueryInterface: NoInterface for %s", lpstr);
OutputDebugStringW(Buffer);
CoTaskMemFree(lpstr);
+DebugBreak();
#endif
return E_NOINTERFACE;
@@ -110,20 +113,16 @@ CBDAFrequencyFilter::put_Frequency(ULONG ulFrequency)
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
-
// setup request
- Node.Property.Set = KSPROPSETID_BdaFrequencyFilter;
- Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_FREQUENCY;
- Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulFrequency, sizeof(ULONG), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_FREQUENCY, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulFrequency, sizeof(ULONG));
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDAFrequencyFilter::put_Frequency: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+ swprintf(Buffer, L"CBDAFrequencyFilter::put_Frequency: m_NodeId %lu ulFrequency %lu hr %lx\n", m_NodeId, ulFrequency, hr);
OutputDebugStringW(Buffer);
#endif
@@ -143,20 +142,17 @@ CBDAFrequencyFilter::put_Polarity(Polarisation Polarity)
{
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaFrequencyFilter;
- Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_POLARITY;
- Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &Polarity, sizeof(Polarisation), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_POLARITY, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &Polarity, sizeof(Polarisation));
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDAFrequencyFilter::put_Polarity: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+ swprintf(Buffer, L"CBDAFrequencyFilter::put_Polarity: m_NodeId %lu Polarity %lu hr %lx\n", m_NodeId, Polarity, hr);
OutputDebugStringW(Buffer);
#endif
@@ -176,20 +172,17 @@ CBDAFrequencyFilter::put_Range(ULONG ulRange)
{
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaFrequencyFilter;
- Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_RANGE;
- Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulRange, sizeof(ULONG), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_RANGE, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulRange, sizeof(ULONG));
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDAFrequencyFilter::put_Polarity: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+ swprintf(Buffer, L"CBDAFrequencyFilter::put_Range: m_NodeId %lu ulRange %lu hr %lx\n", m_NodeId, ulRange, hr);
OutputDebugStringW(Buffer);
#endif
@@ -209,20 +202,17 @@ CBDAFrequencyFilter::put_Bandwidth(ULONG ulBandwidth)
{
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaFrequencyFilter;
- Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_BANDWIDTH;
- Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulBandwidth, sizeof(ULONG), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_BANDWIDTH, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulBandwidth, sizeof(ULONG));
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDAFrequencyFilter::put_Bandwidth: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+ swprintf(Buffer, L"CBDAFrequencyFilter::put_Bandwidth: m_NodeId %lu ulBandwidth %lu hr %lx\n", m_NodeId, ulBandwidth, hr);
OutputDebugStringW(Buffer);
#endif
@@ -241,20 +231,17 @@ CBDAFrequencyFilter::put_FrequencyMultiplier(ULONG ulMultiplier)
{
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaFrequencyFilter;
- Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER;
- Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulMultiplier, sizeof(ULONG), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaFrequencyFilter, KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulMultiplier, sizeof(ULONG));
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDAFrequencyFilter::put_FrequencyMultiplier: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+ swprintf(Buffer, L"CBDAFrequencyFilter::put_FrequencyMultiplier: m_NodeId %lu ulMultiplier %lu hr %lx\n", m_NodeId, ulMultiplier, hr);
OutputDebugStringW(Buffer);
#endif
@@ -271,13 +258,13 @@ CBDAFrequencyFilter::get_FrequencyMultiplier(ULONG *pulMultiplier)
HRESULT
WINAPI
CBDAFrequencyFilter_fnConstructor(
- HANDLE hFile,
+ IKsPropertySet* pProperty,
ULONG NodeId,
REFIID riid,
LPVOID * ppv)
{
// construct device control
- CBDAFrequencyFilter * handler = new CBDAFrequencyFilter(hFile, NodeId);
+ CBDAFrequencyFilter * handler = new CBDAFrequencyFilter(pProperty, NodeId);
#ifdef BDAPLGIN_TRACE
OutputDebugStringW(L"CBDAFrequencyFilter_fnConstructor\n");
diff --git a/dll/directx/bdaplgin/lnbinfo.cpp b/dll/directx/bdaplgin/lnbinfo.cpp
index a6638839289..689443d43cd 100644
--- a/dll/directx/bdaplgin/lnbinfo.cpp
+++ b/dll/directx/bdaplgin/lnbinfo.cpp
@@ -9,8 +9,10 @@
#include "precomp.h"
+#ifndef _MSC_VER
const GUID IID_IBDA_LNBInfo = {0x992cf102, 0x49f9, 0x4719, {0xa6, 0x64, 0xc4, 0xf2, 0x3e, 0x24, 0x08, 0xf4}};
const GUID KSPROPSETID_BdaLNBInfo = {0x992cf102, 0x49f9, 0x4719, {0xa6, 0x64, 0xc4, 0xf2, 0x3e, 0x24, 0x8, 0xf4}};
+#endif
class CBDALNBInfo : public IBDA_LNBInfo
{
@@ -41,12 +43,12 @@ public:
HRESULT STDMETHODCALLTYPE put_HighLowSwitchFrequency(ULONG ulSwitchFrequency);
HRESULT STDMETHODCALLTYPE get_HighLowSwitchFrequency(ULONG *pulSwitchFrequency);
- CBDALNBInfo(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){};
+ CBDALNBInfo(IKsPropertySet *pProperty, ULONG NodeId) : m_Ref(0), m_pProperty(pProperty), m_NodeId(NodeId){};
~CBDALNBInfo(){};
protected:
LONG m_Ref;
- HANDLE m_hFile;
+ IKsPropertySet * m_pProperty;
ULONG m_NodeId;
};
@@ -90,20 +92,17 @@ CBDALNBInfo::put_LocalOscilatorFrequencyLowBand(ULONG ulLOFLow)
{
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaLNBInfo;
- Node.Property.Id = KSPROPERTY_BDA_LNB_LOF_LOW_BAND;
- Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulLOFLow, sizeof(ULONG), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaLNBInfo, KSPROPERTY_BDA_LNB_LOF_LOW_BAND, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulLOFLow, sizeof(LONG));
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDALNBInfo::put_LocalOscilatorFrequencyLowBand: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+ swprintf(Buffer, L"CBDALNBInfo::put_LocalOscilatorFrequencyLowBand: m_NodeId %lu ulLOFLow %lu hr %lx\n", m_NodeId, ulLOFLow, hr);
OutputDebugStringW(Buffer);
#endif
@@ -123,20 +122,17 @@ CBDALNBInfo::put_LocalOscilatorFrequencyHighBand(ULONG ulLOFHigh)
{
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaLNBInfo;
- Node.Property.Id = KSPROPERTY_BDA_LNB_LOF_HIGH_BAND;
- Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulLOFHigh, sizeof(ULONG), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaLNBInfo, KSPROPERTY_BDA_LNB_LOF_HIGH_BAND, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulLOFHigh, sizeof(ULONG));
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDALNBInfo::put_LocalOscilatorFrequencyHighBand: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+ swprintf(Buffer, L"CBDALNBInfo::put_LocalOscilatorFrequencyHighBand: m_NodeId %lu ulLOFHigh %lu hr %lx\n", m_NodeId, ulLOFHigh, hr);
OutputDebugStringW(Buffer);
#endif
@@ -156,20 +152,17 @@ CBDALNBInfo::put_HighLowSwitchFrequency(ULONG ulSwitchFrequency)
{
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaLNBInfo;
- Node.Property.Id = KSPROPERTY_BDA_LNB_SWITCH_FREQUENCY;
- Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
Node.NodeId = m_NodeId;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulSwitchFrequency, sizeof(ULONG), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaLNBInfo, KSPROPERTY_BDA_LNB_SWITCH_FREQUENCY, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &ulSwitchFrequency, sizeof(ULONG));
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDALNBInfo::put_HighLowSwitchFrequency: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+ swprintf(Buffer, L"CBDALNBInfo::put_HighLowSwitchFrequency: m_NodeId %lu ulSwitchFrequency %lu hr %lx\n", m_NodeId, ulSwitchFrequency, hr);
OutputDebugStringW(Buffer);
#endif
@@ -186,13 +179,13 @@ CBDALNBInfo::get_HighLowSwitchFrequency(ULONG *pulSwitchFrequency)
HRESULT
WINAPI
CBDALNBInfo_fnConstructor(
- HANDLE hFile,
+ IKsPropertySet *pProperty,
ULONG NodeId,
REFIID riid,
LPVOID * ppv)
{
// construct device control
- CBDALNBInfo * handler = new CBDALNBInfo(hFile, NodeId);
+ CBDALNBInfo * handler = new CBDALNBInfo(pProperty, NodeId);
#ifdef BDAPLGIN_TRACE
OutputDebugStringW(L"CBDALNBInfo_fnConstructor\n");
diff --git a/dll/directx/bdaplgin/pincontrol.cpp b/dll/directx/bdaplgin/pincontrol.cpp
index a5b99128b16..4420b76e16b 100644
--- a/dll/directx/bdaplgin/pincontrol.cpp
+++ b/dll/directx/bdaplgin/pincontrol.cpp
@@ -9,9 +9,12 @@
#include "precomp.h"
-const GUID IID_IBDA_PinControl = {0x0DED49D5, 0xA8B7, 0x4d5d, {0x97, 0xA1, 0x12, 0xB0, 0xC1, 0x95, 0x87, 0x4D}};
+#ifndef _MSC_VER
const GUID KSPROPSETID_BdaPinControl = {0x0ded49d5, 0xa8b7, 0x4d5d, {0x97, 0xa1, 0x12, 0xb0, 0xc1, 0x95, 0x87, 0x4d}};
+const GUID IID_IBDA_PinControl = {0x0DED49D5, 0xA8B7, 0x4d5d, {0x97, 0xA1, 0x12, 0xB0, 0xC1, 0x95, 0x87, 0x4D}};
const GUID IID_IPin = {0x56a86891, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}};
+#endif
+
class CBDAPinControl : public IBDA_PinControl
{
@@ -39,7 +42,7 @@ public:
HRESULT STDMETHODCALLTYPE RegistrationContext(ULONG *pulRegistrationCtx);
- CBDAPinControl(HANDLE hFile, IBDA_NetworkProvider * pProvider, IPin * pConnectedPin) : m_Ref(0), m_Handle(hFile), m_pProvider(pProvider), m_pConnectedPin(pConnectedPin){};
+ CBDAPinControl(HANDLE hFile, IBDA_NetworkProvider * pProvider, IPin * pConnectedPin, ULONG RegistrationCtx) : m_Ref(0), m_Handle(hFile), m_pProvider(pProvider), m_pConnectedPin(pConnectedPin), m_RegistrationCtx(RegistrationCtx){};
virtual ~CBDAPinControl()
{
//m_pConnectedPin->Release();
@@ -51,6 +54,7 @@ protected:
HANDLE m_Handle;
IBDA_NetworkProvider * m_pProvider;
IPin * m_pConnectedPin;
+ ULONG m_RegistrationCtx;
};
HRESULT
@@ -72,16 +76,7 @@ CBDAPinControl::QueryInterface(
reinterpret_cast(*Output)->AddRef();
return NOERROR;
}
-
-#ifdef BDAPLGIN_TRACE
- WCHAR Buffer[MAX_PATH];
- LPOLESTR lpstr;
- StringFromCLSID(refiid, &lpstr);
- swprintf(Buffer, L"CBDAPinControl::QueryInterface: NoInterface for %s", lpstr);
- OutputDebugStringW(Buffer);
- CoTaskMemFree(lpstr);
-#endif
-
+DebugBreak();
return E_NOINTERFACE;
}
//-------------------------------------------------------------------
@@ -142,10 +137,98 @@ STDMETHODCALLTYPE
CBDAPinControl::RegistrationContext(ULONG *pulRegistrationCtx)
{
#ifdef BDAPLGIN_TRACE
- OutputDebugStringW(L"CBDAPinControl::RegistrationContext: NotImplemented\n");
+ OutputDebugStringW(L"CBDAPinControl::RegistrationContext\n");
#endif
- return E_NOTIMPL;
+ if (!pulRegistrationCtx)
+ {
+ // invalid argument
+ return E_POINTER;
+ }
+
+ if (m_RegistrationCtx)
+ {
+ // is registered
+ *pulRegistrationCtx = m_RegistrationCtx;
+ return NOERROR;
+ }
+
+ //pin not registered
+ return E_FAIL;
+}
+
+//-------------------------------------------------------------------
+HRESULT
+GetNetworkProviderFromGraph(
+ IFilterGraph * pGraph,
+ IBDA_NetworkProvider ** pOutNetworkProvider)
+{
+ IEnumFilters *pEnumFilters = NULL;
+ IBaseFilter * ppFilter[1];
+ IBDA_NetworkProvider * pNetworkProvider = NULL;
+ HRESULT hr;
+
+ // get IEnumFilters interface
+ hr = pGraph->EnumFilters(&pEnumFilters);
+
+ if (FAILED(hr))
+ {
+ //clean up
+ *pOutNetworkProvider = NULL;
+ return hr;
+ }
+
+ while(pEnumFilters->Next(1, ppFilter, NULL) == S_OK)
+ {
+ // check if that filter supports the IBDA_NetworkProvider interface
+ hr = ppFilter[0]->QueryInterface(IID_IBDA_NetworkProvider, (void**)&pNetworkProvider);
+
+ // release IBaseFilter
+ ppFilter[0]->Release();
+
+ if (SUCCEEDED(hr))
+ break;
+ }
+
+ // release IEnumFilters interface
+ pEnumFilters->Release();
+
+ //store result
+ *pOutNetworkProvider = pNetworkProvider;
+
+ if (pNetworkProvider)
+ return S_OK;
+ else
+ return E_FAIL;
+}
+
+HRESULT
+CBDAPinControl_RealConstructor(
+ HANDLE hPin,
+ IBDA_NetworkProvider *pNetworkProvider,
+ IPin * pConnectedPin,
+ ULONG RegistrationCtx,
+ IUnknown * pUnkOuter,
+ REFIID riid,
+ LPVOID * ppv)
+{
+ CBDAPinControl * handler = new CBDAPinControl(hPin, pNetworkProvider, pConnectedPin, RegistrationCtx);
+
+#ifdef BDAPLGIN_TRACE
+ OutputDebugStringW(L"CBDAPinControl_fnConstructor\n");
+#endif
+
+ if (!handler)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(handler->QueryInterface(riid, ppv)))
+ {
+ /* not supported */
+ delete handler;
+ return E_NOINTERFACE;
+ }
+
+ return NOERROR;
}
HRESULT
@@ -158,30 +241,20 @@ CBDAPinControl_fnConstructor(
IPin * pConnectedPin = NULL;
IBDA_NetworkProvider * pNetworkProvider = NULL;
HANDLE hFile = INVALID_HANDLE_VALUE;
-
-#if 0
- if (!IsEqualGUID(riid, IID_IUnknown))
- {
-#ifdef BDAPLGIN_TRACE
- OutputDebugStringW(L"CBDAPinControl_fnConstructor: Expected IUnknown\n");
-#endif
- return REGDB_E_CLASSNOTREG;
- }
-
-
HRESULT hr;
IKsObject * pObject = NULL;
IPin * pPin = NULL;
- IEnumFilters *pEnumFilters = NULL;
-
- IBaseFilter * ppFilter[1];
+ IUnknown * pUnknown = NULL;
PIN_INFO PinInfo;
FILTER_INFO FilterInfo;
-
+ ULONG RegistrationCtx = 0;
if (!pUnkOuter)
return E_POINTER;
+ OutputDebugStringW(L"CBDAPinControl_fnConstructor\n");
+ //DebugBreak();
+
// query for IKsObject interface
hr = pUnkOuter->QueryInterface(IID_IKsObject, (void**)&pObject);
@@ -209,8 +282,15 @@ CBDAPinControl_fnConstructor(
return hr;
}
+ if (!PinInfo.pFilter)
+ {
+ //clean up
+ pObject->Release();
+ pPin->Release();
+ return hr;
+ }
+
// sanity checks
- assert(PinInfo.dir == PINDIR_OUTPUT);
assert(PinInfo.pFilter != NULL);
// query filter info
@@ -219,57 +299,80 @@ CBDAPinControl_fnConstructor(
// sanity check
assert(FilterInfo.pGraph != NULL);
- // get IEnumFilters interface
- hr = FilterInfo.pGraph->EnumFilters(&pEnumFilters);
+ // get network provider interface
+ hr = GetNetworkProviderFromGraph(FilterInfo.pGraph, &pNetworkProvider);
- if (FAILED(hr))
+ if (SUCCEEDED(hr))
{
- //clean up
- FilterInfo.pGraph->Release();
- PinInfo.pFilter->Release();
- pObject->Release();
- pPin->Release();
- return hr;
+ if (PinInfo.dir == PINDIR_OUTPUT)
+ {
+ // get connected pin handle
+ hr = pPin->ConnectedTo(&pConnectedPin);
+ if (SUCCEEDED(hr))
+ {
+ // get file handle
+ hFile = pObject->KsGetObjectHandle();
+ if (hFile)
+ {
+ hr = CBDAPinControl_RealConstructor(hFile, pNetworkProvider, pConnectedPin, 0, pUnkOuter, riid, ppv);
+ if (SUCCEEDED(hr))
+ {
+ // set to null to prevent releasing
+ pNetworkProvider = NULL;
+ pConnectedPin = NULL;
+ }
+ }
+ else
+ {
+ // expected file handle
+ hr = E_UNEXPECTED;
+ }
+ }
+ }
+ else
+ {
+ // get IUnknown from base filter
+ hr = PinInfo.pFilter->QueryInterface(IID_IUnknown, (void**)&pUnknown);
+ if (SUCCEEDED(hr))
+ {
+ // register device filter
+ hr = pNetworkProvider->RegisterDeviceFilter(pUnknown, &RegistrationCtx);
+ if (SUCCEEDED(hr))
+ {
+ // get file handle
+ hFile = pObject->KsGetObjectHandle();
+ if (hFile)
+ {
+ hr = CBDAPinControl_RealConstructor(hFile, pNetworkProvider, NULL, RegistrationCtx, pUnkOuter, riid, ppv);
+ if (SUCCEEDED(hr))
+ {
+ // set to null to prevent releasing
+ pNetworkProvider = NULL;
+ }
+ }
+ else
+ {
+ // expected file handle
+ hr = E_UNEXPECTED;
+ }
+ }
+ else
+ {
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CBDAPinControl_fnConstructor failed to register filter with %lx\n", hr);
+ OutputDebugStringW(Buffer);
+ DebugBreak();
+ }
+ }
+ }
}
- while(pEnumFilters->Next(1, ppFilter, NULL) == S_OK)
- {
- // check if that filter supports the IBDA_NetworkProvider interface
- hr = ppFilter[0]->QueryInterface(IID_IBDA_NetworkProvider, (void**)&pNetworkProvider);
-
- // release IBaseFilter
- ppFilter[0]->Release();
-
- if (SUCCEEDED(hr))
- break;
- }
-
- // release IEnumFilters interface
- pEnumFilters->Release();
-
// release IFilterGraph interface
FilterInfo.pGraph->Release();
// release IBaseFilter interface
PinInfo.pFilter->Release();
- if (pNetworkProvider)
- {
- // get connected pin handle
- hr = pPin->ConnectedTo(&pConnectedPin);
-
- // get file handle
- hFile = pObject->KsGetObjectHandle();
-
- if (FAILED(hr) || hFile == INVALID_HANDLE_VALUE)
- {
- // pin not connected
- pNetworkProvider->Release();
- // set zero
- pNetworkProvider = NULL;
- }
- }
-
// release IPin
pPin->Release();
@@ -277,30 +380,23 @@ CBDAPinControl_fnConstructor(
pObject->Release();
- if (pNetworkProvider == NULL)
+ if (pNetworkProvider)
{
- // no network provider interface in graph
- return E_NOINTERFACE;
- }
-#endif
-
- CBDAPinControl * handler = new CBDAPinControl(hFile, pNetworkProvider, pConnectedPin);
-
-#ifdef BDAPLGIN_TRACE
- OutputDebugStringW(L"CBDAPinControl_fnConstructor");
-#endif
-
- DebugBreak();
-
- if (!handler)
- return E_OUTOFMEMORY;
-
- if (FAILED(handler->QueryInterface(riid, ppv)))
- {
- /* not supported */
- delete handler;
- return E_NOINTERFACE;
+ // release network provider
+ pNetworkProvider->Release();
}
- return NOERROR;
+ if (pConnectedPin)
+ {
+ // release connected pin
+ pConnectedPin->Release();
+ }
+
+ if (pUnknown)
+ {
+ // release filter
+ pUnknown->Release();
+ }
+
+ return hr;
}
diff --git a/dll/directx/bdaplgin/precomp.h b/dll/directx/bdaplgin/precomp.h
index 771a798f2c3..1bc98363329 100644
--- a/dll/directx/bdaplgin/precomp.h
+++ b/dll/directx/bdaplgin/precomp.h
@@ -1,7 +1,7 @@
#ifndef PRECOMP_H__
#define PRECOMP_H__
-//#define BDAPLGIN_TRACE
+#define BDAPLGIN_TRACE
#define BUILDING_KS
#define _KSDDK_
#include
@@ -9,6 +9,7 @@
#include
#define __STREAMS__
#include
+#include
#include
#include
#include
@@ -55,7 +56,6 @@ CBDAPinControl_fnConstructor(
HRESULT
WINAPI
CControlNode_fnConstructor(
- HANDLE hFile,
IBaseFilter * pFilter,
ULONG NodeType,
ULONG PinId,
@@ -67,7 +67,7 @@ CControlNode_fnConstructor(
HRESULT
WINAPI
CBDAFrequencyFilter_fnConstructor(
- HANDLE hFile,
+ IKsPropertySet * pProperty,
ULONG NodeId,
REFIID riid,
LPVOID * ppv);
@@ -77,7 +77,7 @@ CBDAFrequencyFilter_fnConstructor(
HRESULT
WINAPI
CBDASignalStatistics_fnConstructor(
- HANDLE hFile,
+ IKsPropertySet * pProperty,
ULONG NodeId,
REFIID riid,
LPVOID * ppv);
@@ -87,7 +87,7 @@ CBDASignalStatistics_fnConstructor(
HRESULT
WINAPI
CBDALNBInfo_fnConstructor(
- HANDLE hFile,
+ IKsPropertySet * pProperty,
ULONG NodeId,
REFIID riid,
LPVOID * ppv);
@@ -96,9 +96,11 @@ CBDALNBInfo_fnConstructor(
HRESULT
WINAPI
CBDADigitalDemodulator_fnConstructor(
- HANDLE hFile,
+ IKsPropertySet * pProperty,
ULONG NodeId,
REFIID riid,
LPVOID * ppv);
+extern const GUID IID_IKsObject;
+
#endif
diff --git a/dll/directx/bdaplgin/signalstatistics.cpp b/dll/directx/bdaplgin/signalstatistics.cpp
index ae6079e5b23..230ab8b34f4 100644
--- a/dll/directx/bdaplgin/signalstatistics.cpp
+++ b/dll/directx/bdaplgin/signalstatistics.cpp
@@ -9,8 +9,10 @@
#include "precomp.h"
+#ifndef _MSC_VER
const GUID IID_IBDA_SignalStatistics = {0x1347d106, 0xcf3a, 0x428a, {0xa5, 0xcb, 0xac, 0x0d, 0x9a, 0x2a, 0x43, 0x38}};
const GUID KSPROPSETID_BdaSignalStats = {0x1347d106, 0xcf3a, 0x428a, {0xa5, 0xcb, 0xac, 0xd, 0x9a, 0x2a, 0x43, 0x38}};
+#endif
class CBDASignalStatistics : public IBDA_SignalStatistics
{
@@ -45,12 +47,12 @@ public:
HRESULT STDMETHODCALLTYPE put_SampleTime(LONG lmsSampleTime);
HRESULT STDMETHODCALLTYPE get_SampleTime(LONG *plmsSampleTime);
- CBDASignalStatistics(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){};
+ CBDASignalStatistics(IKsPropertySet * pProperty, ULONG NodeId) : m_Ref(0), m_pProperty(pProperty), m_NodeId(NodeId){};
~CBDASignalStatistics(){};
protected:
LONG m_Ref;
- HANDLE m_hFile;
+ IKsPropertySet * m_pProperty;
ULONG m_NodeId;
};
@@ -75,7 +77,6 @@ CBDASignalStatistics::QueryInterface(
reinterpret_cast(*Output)->AddRef();
return NOERROR;
}
-
return E_NOINTERFACE;
}
@@ -95,13 +96,13 @@ CBDASignalStatistics::get_SignalStrength(LONG *plDbStrength)
ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaSignalStats;
- Node.Property.Id = KSPROPERTY_BDA_SIGNAL_STRENGTH;
- Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
Node.NodeId = (ULONG)-1;
+ Node.Reserved = 0;
+
+ assert(m_pProperty);
+
+ hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SIGNAL_STRENGTH, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), plDbStrength, sizeof(LONG), &BytesReturned);
- // perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plDbStrength, sizeof(LONG), &BytesReturned);
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
@@ -128,13 +129,11 @@ CBDASignalStatistics::get_SignalQuality(LONG *plPercentQuality)
ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaSignalStats;
- Node.Property.Id = KSPROPERTY_BDA_SIGNAL_QUALITY;
- Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
Node.NodeId = (ULONG)-1;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plPercentQuality, sizeof(LONG), &BytesReturned);
+ hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SIGNAL_QUALITY, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), plPercentQuality, sizeof(LONG), &BytesReturned);
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
@@ -162,13 +161,12 @@ CBDASignalStatistics::get_SignalPresent(BOOLEAN *pfPresent)
ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaSignalStats;
- Node.Property.Id = KSPROPERTY_BDA_SIGNAL_PRESENT;
- Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
Node.NodeId = (ULONG)-1;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &Present, sizeof(ULONG), &BytesReturned);
+ hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SIGNAL_PRESENT, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &Present, sizeof(ULONG), &BytesReturned);
+
// store result
*pfPresent = Present;
@@ -198,13 +196,12 @@ CBDASignalStatistics::get_SignalLocked(BOOLEAN *pfLocked)
ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaSignalStats;
- Node.Property.Id = KSPROPERTY_BDA_SIGNAL_LOCKED;
- Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
Node.NodeId = (ULONG)-1;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &Locked, sizeof(ULONG), &BytesReturned);
+ hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SIGNAL_LOCKED, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &Locked, sizeof(ULONG), &BytesReturned);
+
*pfLocked = Locked;
#ifdef BDAPLGIN_TRACE
@@ -222,20 +219,17 @@ CBDASignalStatistics::put_SampleTime(LONG lmsSampleTime)
{
KSP_NODE Node;
HRESULT hr;
- ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaSignalStats;
- Node.Property.Id = KSPROPERTY_BDA_SAMPLE_TIME;
- Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
Node.NodeId = (ULONG)-1;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &lmsSampleTime, sizeof(LONG), &BytesReturned);
+ hr = m_pProperty->Set(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SAMPLE_TIME, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &lmsSampleTime, sizeof(LONG));
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
- swprintf(Buffer, L"CBDASignalStatistics::put_SampleTime: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+ swprintf(Buffer, L"CBDASignalStatistics::put_SampleTime: m_NodeId %lu hr %lx\n", m_NodeId, hr);
OutputDebugStringW(Buffer);
#endif
@@ -251,13 +245,11 @@ CBDASignalStatistics::get_SampleTime(LONG *plmsSampleTime)
ULONG BytesReturned;
// setup request
- Node.Property.Set = KSPROPSETID_BdaSignalStats;
- Node.Property.Id = KSPROPERTY_BDA_SAMPLE_TIME;
- Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
Node.NodeId = (ULONG)-1;
+ Node.Reserved = 0;
// perform request
- hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plmsSampleTime, sizeof(LONG), &BytesReturned);
+ hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SAMPLE_TIME, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), plmsSampleTime, sizeof(LONG), &BytesReturned);
#ifdef BDAPLGIN_TRACE
WCHAR Buffer[100];
@@ -271,13 +263,13 @@ CBDASignalStatistics::get_SampleTime(LONG *plmsSampleTime)
HRESULT
WINAPI
CBDASignalStatistics_fnConstructor(
- HANDLE hFile,
+ IKsPropertySet * pProperty,
ULONG NodeId,
REFIID riid,
LPVOID * ppv)
{
// construct device control
- CBDASignalStatistics * handler = new CBDASignalStatistics(hFile, NodeId);
+ CBDASignalStatistics * handler = new CBDASignalStatistics(pProperty, NodeId);
#ifdef BDAPLGIN_TRACE
OutputDebugStringW(L"CBDASignalStatistics_fnConstructor\n");
diff --git a/dll/directx/ksproxy/allocator.cpp b/dll/directx/ksproxy/allocator.cpp
index 2b5cd1ada15..e7c4b1f2436 100644
--- a/dll/directx/ksproxy/allocator.cpp
+++ b/dll/directx/ksproxy/allocator.cpp
@@ -15,6 +15,9 @@ class CKsAllocator : public IKsAllocatorEx,
public IMemAllocatorCallbackTemp
{
public:
+ typedef std::stackMediaSampleStack;
+ typedef std::listMediaSampleList;
+
STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
STDMETHODIMP_(ULONG) AddRef()
@@ -58,9 +61,9 @@ public:
HRESULT STDMETHODCALLTYPE GetFreeCount(LONG *plBuffersFree);
- CKsAllocator() : m_Ref(0), m_hAllocator(0), m_Mode(KsAllocatorMode_User), m_Notify(0), m_Allocated(0), m_FreeCount(0), m_cbBuffer(0), m_cBuffers(0), m_cbAlign(0), m_cbPrefix(0){}
+ CKsAllocator();
virtual ~CKsAllocator(){}
-
+ VOID STDMETHODCALLTYPE FreeMediaSamples();
protected:
LONG m_Ref;
HANDLE m_hAllocator;
@@ -68,11 +71,16 @@ protected:
ALLOCATOR_PROPERTIES_EX m_Properties;
IMemAllocatorNotifyCallbackTemp *m_Notify;
ULONG m_Allocated;
- ULONG m_FreeCount;
- ULONG m_cbBuffer;
- ULONG m_cBuffers;
- ULONG m_cbAlign;
- ULONG m_cbPrefix;
+ LONG m_cbBuffer;
+ LONG m_cBuffers;
+ LONG m_cbAlign;
+ LONG m_cbPrefix;
+ BOOL m_Commited;
+ CRITICAL_SECTION m_CriticalSection;
+ MediaSampleStack m_FreeList;
+ MediaSampleList m_UsedList;
+ LPVOID m_Buffer;
+ BOOL m_FreeSamples;
};
@@ -93,14 +101,33 @@ CKsAllocator::QueryInterface(
if (IsEqualGUID(refiid, IID_IMemAllocator) ||
IsEqualGUID(refiid, IID_IMemAllocatorCallbackTemp))
{
- *Output = (IDistributorNotify*)(this);
- reinterpret_cast(*Output)->AddRef();
+ *Output = (IMemAllocatorCallbackTemp*)(this);
+ reinterpret_cast(*Output)->AddRef();
return NOERROR;
}
return E_NOINTERFACE;
}
+CKsAllocator::CKsAllocator() : m_Ref(0),
+ m_hAllocator(0),
+ m_Mode(KsAllocatorMode_User),
+ m_Notify(0),
+ m_Allocated(0),
+ m_cbBuffer(0),
+ m_cBuffers(0),
+ m_cbAlign(0),
+ m_cbPrefix(0),
+ m_Commited(FALSE),
+ m_FreeList(),
+ m_UsedList(),
+ m_Buffer(0),
+ m_FreeSamples(FALSE)
+{
+ InitializeCriticalSection(&m_CriticalSection);
+
+}
+
//-------------------------------------------------------------------
// IMemAllocator
//
@@ -112,7 +139,11 @@ CKsAllocator::SetProperties(
{
SYSTEM_INFO SystemInfo;
- OutputDebugStringW(L"CKsAllocator::SetProperties Stub\n");
+ EnterCriticalSection(&m_CriticalSection);
+
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"CKsAllocator::SetProperties\n");
+#endif
if (!pRequest || !pActual)
return E_POINTER;
@@ -126,18 +157,28 @@ CKsAllocator::SetProperties(
if (!pRequest->cbAlign || (pRequest->cbAlign - 1) & SystemInfo.dwAllocationGranularity)
{
// bad alignment
+ LeaveCriticalSection(&m_CriticalSection);
return VFW_E_BADALIGN;
}
if (m_Mode == KsAllocatorMode_Kernel)
{
- // u cannt change a kernel allocator
+ // u can't change a kernel allocator
+ LeaveCriticalSection(&m_CriticalSection);
return VFW_E_ALREADY_COMMITTED;
}
- if (m_Allocated != m_FreeCount)
+ if (m_Commited)
+ {
+ // need to decommit first
+ LeaveCriticalSection(&m_CriticalSection);
+ return VFW_E_ALREADY_COMMITTED;
+ }
+
+ if (m_Allocated != m_FreeList.size())
{
// outstanding buffers
+ LeaveCriticalSection(&m_CriticalSection);
return VFW_E_BUFFERS_OUTSTANDING;
}
@@ -146,6 +187,7 @@ CKsAllocator::SetProperties(
pActual->cbPrefix = m_cbPrefix = pRequest->cbPrefix;
pActual->cBuffers = m_cBuffers = pRequest->cBuffers;
+ LeaveCriticalSection(&m_CriticalSection);
return NOERROR;
}
@@ -169,28 +211,130 @@ HRESULT
STDMETHODCALLTYPE
CKsAllocator::Commit()
{
+ LONG Index;
+ PUCHAR CurrentBuffer;
+ IMediaSample * Sample;
+ HRESULT hr;
+
+ //TODO integer overflow checks
+ EnterCriticalSection(&m_CriticalSection);
+
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"CKsAllocator::Commit\n");
+#endif
+
if (m_Mode == KsAllocatorMode_Kernel)
{
/* no-op for kernel allocator */
+ LeaveCriticalSection(&m_CriticalSection);
return NOERROR;
}
- OutputDebugStringW(L"CKsAllocator::Commit NotImplemented\n");
- return E_NOTIMPL;
+ if (m_Commited)
+ {
+ // already commited
+ LeaveCriticalSection(&m_CriticalSection);
+ return NOERROR;
+ }
+
+ if (m_cbBuffer < 0 || m_cBuffers < 0 || m_cbPrefix < 0)
+ {
+ // invalid parameter
+ LeaveCriticalSection(&m_CriticalSection);
+ return E_OUTOFMEMORY;
+ }
+
+ LONG Size = m_cbBuffer + m_cbPrefix;
+
+ if (m_cbAlign > 1)
+ {
+ //check alignment
+ LONG Mod = Size % m_cbAlign;
+ if (Mod)
+ {
+ // calculate aligned size
+ Size += m_cbAlign - Mod;
+ }
+ }
+
+ LONG TotalSize = Size * m_cBuffers;
+
+ assert(TotalSize);
+ assert(m_cBuffers);
+ assert(Size);
+
+ // now allocate buffer
+ m_Buffer = VirtualAlloc(NULL, TotalSize, MEM_COMMIT, PAGE_READWRITE);
+ if (!m_Buffer)
+ {
+ LeaveCriticalSection(&m_CriticalSection);
+ return E_OUTOFMEMORY;
+ }
+
+ ZeroMemory(m_Buffer, TotalSize);
+
+ CurrentBuffer = (PUCHAR)m_Buffer;
+
+ for (Index = 0; Index < m_cBuffers; Index++)
+ {
+ // construct media sample
+ hr = CMediaSample_Constructor((IMemAllocator*)this, CurrentBuffer + m_cbPrefix, m_cbBuffer, IID_IMediaSample, (void**)&Sample);
+ if (FAILED(hr))
+ {
+ LeaveCriticalSection(&m_CriticalSection);
+ return E_OUTOFMEMORY;
+ }
+
+ // add to free list
+ m_FreeList.push(Sample);
+ m_Allocated++;
+
+ //next sample buffer
+ CurrentBuffer += Size;
+ }
+
+ // we are now commited
+ m_Commited = true;
+
+ LeaveCriticalSection(&m_CriticalSection);
+ return S_OK;
}
HRESULT
STDMETHODCALLTYPE
CKsAllocator::Decommit()
{
+ EnterCriticalSection(&m_CriticalSection);
+
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"CKsAllocator::Decommit\n");
+#endif
+
if (m_Mode == KsAllocatorMode_Kernel)
{
/* no-op for kernel allocator */
- return NOERROR;
+ LeaveCriticalSection(&m_CriticalSection);
+ return NOERROR;
}
- OutputDebugStringW(L"CKsAllocator::Decommit NotImplemented\n");
- return E_NOTIMPL;
+ m_Commited = false;
+
+ if (m_Allocated != m_FreeList.size())
+ {
+ // outstanding buffers
+ m_FreeSamples = true;
+ LeaveCriticalSection(&m_CriticalSection);
+ return NOERROR;
+ }
+ else
+ {
+ // no outstanding buffers
+ // free to free them
+ FreeMediaSamples();
+ }
+
+ LeaveCriticalSection(&m_CriticalSection);
+ return NOERROR;
}
@@ -202,8 +346,50 @@ CKsAllocator::GetBuffer(
REFERENCE_TIME *pEndTime,
DWORD dwFlags)
{
- OutputDebugStringW(L"CKsAllocator::GetBuffer NotImplemented\n");
- return E_NOTIMPL;
+ IMediaSample * Sample = NULL;
+
+ if (!m_Commited)
+ return VFW_E_NOT_COMMITTED;
+
+ do
+ {
+ EnterCriticalSection(&m_CriticalSection);
+
+ if (!m_FreeList.empty())
+ {
+ Sample = m_FreeList.top();
+ m_FreeList.pop();
+ }
+
+ LeaveCriticalSection(&m_CriticalSection);
+
+ if (dwFlags & AM_GBF_NOWAIT)
+ {
+ // never wait untill a buffer becomes available
+ break;
+ }
+ }
+ while(Sample == NULL);
+
+ if (!Sample)
+ {
+ // no sample acquired
+ //HACKKKKKKK
+ Sample = m_UsedList.back();
+ m_UsedList.pop_back();
+
+ if (!Sample)
+ return VFW_E_TIMEOUT;
+ }
+
+ // store result
+ *ppBuffer = Sample;
+
+ // store sample in used list
+ m_UsedList.push_front(Sample);
+
+ // done
+ return NOERROR;
}
HRESULT
@@ -211,8 +397,36 @@ STDMETHODCALLTYPE
CKsAllocator::ReleaseBuffer(
IMediaSample *pBuffer)
{
- OutputDebugStringW(L"CKsAllocator::ReleaseBuffer NotImplemented\n");
- return E_NOTIMPL;
+ EnterCriticalSection(&m_CriticalSection);
+
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"CKsAllocator::ReleaseBuffer\n");
+#endif
+
+ // media sample always 1 ref count in free list
+ pBuffer->AddRef();
+
+ // add the sample to the free list
+ m_FreeList.push(pBuffer);
+
+
+ if (m_FreeSamples)
+ {
+ // pending de-commit
+ if (m_FreeList.size () == m_Allocated)
+ {
+ FreeMediaSamples();
+ }
+ }
+
+ if (m_Notify)
+ {
+ //notify caller of an available buffer
+ m_Notify->NotifyRelease();
+ }
+
+ LeaveCriticalSection(&m_CriticalSection);
+ return S_OK;
}
//-------------------------------------------------------------------
@@ -223,7 +437,11 @@ STDMETHODCALLTYPE
CKsAllocator::SetNotify(
IMemAllocatorNotifyCallbackTemp *pNotify)
{
+ EnterCriticalSection(&m_CriticalSection);
+
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsAllocator::SetNotify\n");
+#endif
if (pNotify)
pNotify->AddRef();
@@ -232,6 +450,8 @@ CKsAllocator::SetNotify(
m_Notify->Release();
m_Notify = pNotify;
+
+ LeaveCriticalSection(&m_CriticalSection);
return NOERROR;
}
@@ -240,8 +460,8 @@ STDMETHODCALLTYPE
CKsAllocator::GetFreeCount(
LONG *plBuffersFree)
{
- OutputDebugStringW(L"CKsAllocator::GetFreeCount NotImplemented\n");
- return E_NOTIMPL;
+ *plBuffersFree = m_Allocated - m_FreeList.size();
+ return S_OK;
}
//-------------------------------------------------------------------
@@ -313,7 +533,9 @@ CKsAllocator::KsCreateAllocatorAndGetHandle(
KSALLOCATOR_FRAMING AllocatorFraming;
HANDLE hPin;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsAllocator::KsCreateAllocatorAndGetHandle\n");
+#endif
if (m_hAllocator)
{
@@ -349,6 +571,32 @@ CKsAllocator::KsCreateAllocatorAndGetHandle(
return m_hAllocator;
}
+//-------------------------------------------------------------------
+VOID
+STDMETHODCALLTYPE
+CKsAllocator::FreeMediaSamples()
+{
+ ULONG Index;
+
+ for(Index = 0; Index < m_FreeList.size(); Index++)
+ {
+ IMediaSample * Sample = m_FreeList.top();
+ m_FreeList.pop();
+ delete Sample;
+ }
+
+ m_FreeSamples = false;
+ m_Allocated = 0;
+
+ if (m_Buffer)
+ {
+ // release buffer
+ VirtualFree(m_Buffer, 0, MEM_RELEASE);
+
+ m_Buffer = NULL;
+ }
+}
+
HRESULT
WINAPI
CKsAllocator_Constructor(
@@ -356,7 +604,9 @@ CKsAllocator_Constructor(
REFIID riid,
LPVOID * ppv)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsAllocator_Constructor\n");
+#endif
CKsAllocator * handler = new CKsAllocator();
diff --git a/dll/directx/ksproxy/basicaudio.cpp b/dll/directx/ksproxy/basicaudio.cpp
index 7fec05f2140..04c53b345a0 100644
--- a/dll/directx/ksproxy/basicaudio.cpp
+++ b/dll/directx/ksproxy/basicaudio.cpp
@@ -97,7 +97,9 @@ HRESULT
STDMETHODCALLTYPE
CKsBasicAudio::Stop()
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -105,7 +107,10 @@ HRESULT
STDMETHODCALLTYPE
CKsBasicAudio::Pause()
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
+
return E_NOTIMPL;
}
@@ -114,7 +119,10 @@ STDMETHODCALLTYPE
CKsBasicAudio::Run(
REFERENCE_TIME tStart)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
+
return E_NOTIMPL;
}
@@ -123,7 +131,9 @@ STDMETHODCALLTYPE
CKsBasicAudio::SetSyncSource(
IReferenceClock *pClock)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -131,7 +141,10 @@ HRESULT
STDMETHODCALLTYPE
CKsBasicAudio::NotifyGraphChange()
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
+
return E_NOTIMPL;
}
@@ -144,7 +157,10 @@ STDMETHODCALLTYPE
CKsBasicAudio::GetTypeInfoCount(
UINT *pctinfo)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
+
return E_NOTIMPL;
}
@@ -155,7 +171,9 @@ CKsBasicAudio::GetTypeInfo(
LCID lcid,
ITypeInfo **ppTInfo)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -168,7 +186,10 @@ CKsBasicAudio::GetIDsOfNames(
LCID lcid,
DISPID *rgDispId)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
+
return E_NOTIMPL;
}
@@ -184,7 +205,10 @@ CKsBasicAudio::Invoke(
EXCEPINFO *pExcepInfo,
UINT *puArgErr)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
+
return E_NOTIMPL;
}
@@ -197,7 +221,10 @@ STDMETHODCALLTYPE
CKsBasicAudio::put_Volume(
long lVolume)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
+
return E_NOTIMPL;
}
@@ -207,7 +234,10 @@ STDMETHODCALLTYPE
CKsBasicAudio::get_Volume(
long *plVolume)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
+
return E_NOTIMPL;
}
@@ -217,7 +247,10 @@ STDMETHODCALLTYPE
CKsBasicAudio::put_Balance(
long lBalance)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
+
return E_NOTIMPL;
}
@@ -227,7 +260,10 @@ STDMETHODCALLTYPE
CKsBasicAudio::get_Balance(
long *plBalance)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
+
return E_NOTIMPL;
}
@@ -238,7 +274,9 @@ CKsBasicAudio_Constructor(
REFIID riid,
LPVOID * ppv)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsBasicAudio_Constructor\n");
+#endif
CKsBasicAudio * handler = new CKsBasicAudio();
diff --git a/dll/directx/ksproxy/clockforward.cpp b/dll/directx/ksproxy/clockforward.cpp
index 80bf00fe421..868633edf0e 100644
--- a/dll/directx/ksproxy/clockforward.cpp
+++ b/dll/directx/ksproxy/clockforward.cpp
@@ -12,6 +12,10 @@
const GUID KSCATEGORY_CLOCK = {0x53172480, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
#endif
+const GUID IID_IKsClockForwarder = {0x877e4352, 0x6fea, 0x11d0, {0xb8, 0x63, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1}};
+
+DWORD WINAPI CKsClockForwarder_ThreadStartup(LPVOID lpParameter);
+
class CKsClockForwarder : public IDistributorNotify,
public IKsObject
{
@@ -45,14 +49,38 @@ public:
// IKsObject interface
HANDLE STDMETHODCALLTYPE KsGetObjectHandle();
- CKsClockForwarder(HANDLE handle) : m_Ref(0), m_Handle(handle){}
- virtual ~CKsClockForwarder(){ if (m_Handle) CloseHandle(m_Handle);}
-
+ CKsClockForwarder(HANDLE handle);
+ virtual ~CKsClockForwarder(){};
+ HRESULT STDMETHODCALLTYPE SetClockState(KSSTATE State);
protected:
LONG m_Ref;
HANDLE m_Handle;
+ IReferenceClock * m_Clock;
+ HANDLE m_hEvent;
+ HANDLE m_hThread;
+ BOOL m_ThreadStarted;
+ BOOL m_PendingStop;
+ BOOL m_ForceStart;
+ KSSTATE m_State;
+ REFERENCE_TIME m_Time;
+
+ friend DWORD WINAPI CKsClockForwarder_ThreadStartup(LPVOID lpParameter);
};
+CKsClockForwarder::CKsClockForwarder(
+ HANDLE handle) : m_Ref(0),
+ m_Handle(handle),
+ m_Clock(0),
+ m_hEvent(NULL),
+ m_hThread(NULL),
+ m_ThreadStarted(FALSE),
+ m_PendingStop(FALSE),
+ m_ForceStart(FALSE),
+ m_State(KSSTATE_STOP),
+ m_Time(0)
+{
+}
+
HRESULT
STDMETHODCALLTYPE
CKsClockForwarder::QueryInterface(
@@ -65,7 +93,8 @@ CKsClockForwarder::QueryInterface(
reinterpret_cast(*Output)->AddRef();
return NOERROR;
}
- if (IsEqualGUID(refiid, IID_IKsObject))
+ if (IsEqualGUID(refiid, IID_IKsObject) ||
+ IsEqualGUID(refiid, IID_IKsClockForwarder))
{
*Output = (IKsObject*)(this);
reinterpret_cast(*Output)->AddRef();
@@ -79,15 +108,6 @@ CKsClockForwarder::QueryInterface(
return NOERROR;
}
-#if 0
- if (IsEqualGUID(refiid, IID_IKsClockForwarder))
- {
- *Output = PVOID(this);
- reinterpret_cast(*Output)->AddRef();
- return NOERROR;
- }
-#endif
-
return E_NOINTERFACE;
}
@@ -100,16 +120,86 @@ HRESULT
STDMETHODCALLTYPE
CKsClockForwarder::Stop()
{
- OutputDebugString("UNIMPLEMENTED\n");
- return E_NOTIMPL;
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[200];
+ swprintf(Buffer, L"CKsClockForwarder::Stop m_ThreadStarted %u m_PendingStop %u m_hThread %p m_hEvent %p m_Handle %p\n", m_ThreadStarted, m_PendingStop, m_hThread, m_hEvent, m_Handle);
+ OutputDebugStringW(Buffer);
+#endif
+
+ m_Time = 0;
+ if (m_ThreadStarted)
+ {
+ // signal pending stop
+ m_PendingStop = true;
+
+ assert(m_hThread);
+ assert(m_hEvent);
+
+ // set stop event
+ SetEvent(m_hEvent);
+
+ // wait untill the thread has finished
+ WaitForSingleObject(m_hThread, INFINITE);
+
+ // close thread handle
+ CloseHandle(m_hThread);
+
+ // zero handle
+ m_hThread = NULL;
+ }
+
+ if (m_hEvent)
+ {
+ // close stop event
+ CloseHandle(m_hEvent);
+ m_hEvent = NULL;
+ }
+
+ m_PendingStop = false;
+
+ SetClockState(KSSTATE_STOP);
+ return NOERROR;
}
HRESULT
STDMETHODCALLTYPE
CKsClockForwarder::Pause()
{
- OutputDebugString("UNIMPLEMENTED\n");
- return E_NOTIMPL;
+#ifdef KSPROXY_TRACE
+ OutputDebugString("CKsClockForwarder::Pause\n");
+#endif
+
+ if (!m_hEvent)
+ {
+ m_hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+ if (!m_hEvent)
+ return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+ }
+
+ if (m_State <= KSSTATE_PAUSE)
+ {
+ if (m_State == KSSTATE_STOP)
+ SetClockState(KSSTATE_ACQUIRE);
+
+ if (m_State == KSSTATE_ACQUIRE)
+ SetClockState(KSSTATE_PAUSE);
+ }
+ else
+ {
+ if (!m_ForceStart)
+ {
+ SetClockState(KSSTATE_PAUSE);
+ }
+ }
+
+ if (!m_hThread)
+ {
+ m_hThread = CreateThread(NULL, 0, CKsClockForwarder_ThreadStartup, (LPVOID)this, 0, NULL);
+ if (!m_hThread)
+ return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+ }
+
+ return NOERROR;
}
HRESULT
@@ -117,8 +207,28 @@ STDMETHODCALLTYPE
CKsClockForwarder::Run(
REFERENCE_TIME tStart)
{
- OutputDebugString("UNIMPLEMENTED\n");
- return E_NOTIMPL;
+#ifdef KSPROXY_TRACE
+ OutputDebugString("CKsClockForwarder::Run\n");
+#endif
+
+ m_Time = tStart;
+
+ if (!m_hEvent || !m_hThread)
+ {
+ m_ForceStart = TRUE;
+ HRESULT hr = Pause();
+ m_ForceStart = FALSE;
+
+ if (FAILED(hr))
+ return hr;
+ }
+
+ assert(m_hThread);
+
+ SetClockState(KSSTATE_RUN);
+ SetEvent(m_hEvent);
+
+ return NOERROR;
}
HRESULT
@@ -126,16 +236,30 @@ STDMETHODCALLTYPE
CKsClockForwarder::SetSyncSource(
IReferenceClock *pClock)
{
- OutputDebugString("UNIMPLEMENTED\n");
- return E_NOTIMPL;
+#ifdef KSPROXY_TRACE
+ OutputDebugString("CKsClockForwarder::SetSyncSource\n");
+#endif
+
+ if (pClock)
+ pClock->AddRef();
+
+ if (m_Clock)
+ m_Clock->Release();
+
+
+ m_Clock = pClock;
+ return NOERROR;
}
HRESULT
STDMETHODCALLTYPE
CKsClockForwarder::NotifyGraphChange()
{
- OutputDebugString("UNIMPLEMENTED\n");
- return E_NOTIMPL;
+#ifdef KSPROXY_TRACE
+ OutputDebugString("CKsClockForwarder::NotifyGraphChange\n");
+#endif
+
+ return NOERROR;
}
//-------------------------------------------------------------------
@@ -149,6 +273,66 @@ CKsClockForwarder::KsGetObjectHandle()
return m_Handle;
}
+//-------------------------------------------------------------------
+HRESULT
+STDMETHODCALLTYPE
+CKsClockForwarder::SetClockState(KSSTATE State)
+{
+ KSPROPERTY Property;
+ ULONG BytesReturned;
+
+ Property.Set = KSPROPSETID_Clock;
+ Property.Id = KSPROPERTY_CLOCK_STATE;
+ Property.Flags = KSPROPERTY_TYPE_SET;
+
+ HRESULT hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), &State, sizeof(KSSTATE), &BytesReturned);
+ if (SUCCEEDED(hr))
+ m_State = State;
+
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CKsClockForwarder::SetClockState m_State %u State %u hr %lx\n", m_State, State, hr);
+ OutputDebugStringW(Buffer);
+#endif
+
+ return hr;
+}
+
+DWORD
+WINAPI
+CKsClockForwarder_ThreadStartup(LPVOID lpParameter)
+{
+ REFERENCE_TIME Time;
+ ULONG BytesReturned;
+
+ CKsClockForwarder * Fwd = (CKsClockForwarder*)lpParameter;
+
+ Fwd->m_ThreadStarted = TRUE;
+
+ do
+ {
+ if (Fwd->m_PendingStop)
+ break;
+
+ if (Fwd->m_State != KSSTATE_RUN)
+ WaitForSingleObject(Fwd->m_hEvent, INFINITE);
+
+ KSPROPERTY Property;
+ Property.Set = KSPROPSETID_Clock;
+ Property.Id = KSPROPERTY_CLOCK_TIME;
+ Property.Flags = KSPROPERTY_TYPE_SET;
+
+ Fwd->m_Clock->GetTime(&Time);
+ Time -= Fwd->m_Time;
+
+ KsSynchronousDeviceControl(Fwd->m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), &Time, sizeof(REFERENCE_TIME), &BytesReturned);
+ }
+ while(TRUE);
+
+ Fwd->m_ThreadStarted = FALSE;
+ return NOERROR;
+}
+
HRESULT
WINAPI
CKsClockForwarder_Constructor(
@@ -159,14 +343,18 @@ CKsClockForwarder_Constructor(
HRESULT hr;
HANDLE handle;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsClockForwarder_Constructor\n");
+#endif
// open default clock
hr = KsOpenDefaultDevice(KSCATEGORY_CLOCK, GENERIC_READ | GENERIC_WRITE, &handle);
if (hr != NOERROR)
{
+#ifdef KSPROXY_TRACE
OutputDebugString("CKsClockForwarder_Constructor failed to open device\n");
+#endif
return hr;
}
diff --git a/dll/directx/ksproxy/cvpconfig.cpp b/dll/directx/ksproxy/cvpconfig.cpp
index 91d2006ad49..1333263e003 100644
--- a/dll/directx/ksproxy/cvpconfig.cpp
+++ b/dll/directx/ksproxy/cvpconfig.cpp
@@ -102,7 +102,9 @@ HRESULT
STDMETHODCALLTYPE
CVPConfig::Stop()
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -110,7 +112,9 @@ HRESULT
STDMETHODCALLTYPE
CVPConfig::Pause()
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -119,7 +123,9 @@ STDMETHODCALLTYPE
CVPConfig::Run(
REFERENCE_TIME tStart)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -128,7 +134,9 @@ STDMETHODCALLTYPE
CVPConfig::SetSyncSource(
IReferenceClock *pClock)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -136,7 +144,9 @@ HRESULT
STDMETHODCALLTYPE
CVPConfig::NotifyGraphChange()
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -149,7 +159,9 @@ CVPConfig::GetConnectInfo(
LPDWORD pdwNumConnectInfo,
IN OUT LPDDVIDEOPORTCONNECT pddVPConnectInfo)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -158,7 +170,9 @@ STDMETHODCALLTYPE
CVPConfig::SetConnectInfo(
DWORD dwChosenEntry)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -167,7 +181,9 @@ STDMETHODCALLTYPE
CVPConfig::GetVPDataInfo(
LPAMVPDATAINFO pamvpDataInfo)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -177,7 +193,9 @@ CVPConfig::GetMaxPixelRate(
LPAMVPSIZE pamvpSize,
OUT LPDWORD pdwMaxPixelsPerSecond)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -187,7 +205,9 @@ CVPConfig::InformVPInputFormats(
DWORD dwNumFormats,
IN LPDDPIXELFORMAT pDDPixelFormats)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -197,7 +217,9 @@ CVPConfig::GetVideoFormats(
LPDWORD pdwNumFormats,
IN OUT LPDDPIXELFORMAT pddPixelFormats)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -206,7 +228,9 @@ STDMETHODCALLTYPE
CVPConfig::SetVideoFormat(
DWORD dwChosenEntry)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -214,7 +238,9 @@ HRESULT
STDMETHODCALLTYPE
CVPConfig::SetInvertPolarity()
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -223,7 +249,9 @@ STDMETHODCALLTYPE
CVPConfig::GetOverlaySurface(
LPDIRECTDRAWSURFACE* ppddOverlaySurface)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -232,7 +260,9 @@ STDMETHODCALLTYPE
CVPConfig::SetDirectDrawKernelHandle(
ULONG_PTR dwDDKernelHandle)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -241,7 +271,9 @@ STDMETHODCALLTYPE
CVPConfig::SetVideoPortID(
IN DWORD dwVideoPortID)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -252,7 +284,9 @@ CVPConfig::SetDDSurfaceKernelHandles(
DWORD cHandles,
IN ULONG_PTR *rgDDKernelHandles)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -264,7 +298,9 @@ CVPConfig::SetSurfaceParameters(
IN DWORD dwXOrigin,
IN DWORD dwYOrigin)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -277,7 +313,9 @@ STDMETHODCALLTYPE
CVPConfig::IsVPDecimationAllowed(
LPBOOL pbIsDecimationAllowed)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -286,13 +324,13 @@ STDMETHODCALLTYPE
CVPConfig::SetScalingFactors(
LPAMVPSIZE pamvpSize)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
-
-
HRESULT
WINAPI
CVPConfig_Constructor(
@@ -300,7 +338,9 @@ CVPConfig_Constructor(
REFIID riid,
LPVOID * ppv)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CVPConfig_Constructor\n");
+#endif
CVPConfig * handler = new CVPConfig();
diff --git a/dll/directx/ksproxy/cvpvbiconfig.cpp b/dll/directx/ksproxy/cvpvbiconfig.cpp
index 016d060aa24..b7b7130b471 100644
--- a/dll/directx/ksproxy/cvpvbiconfig.cpp
+++ b/dll/directx/ksproxy/cvpvbiconfig.cpp
@@ -98,7 +98,9 @@ HRESULT
STDMETHODCALLTYPE
CVPVBIConfig::Stop()
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -106,7 +108,9 @@ HRESULT
STDMETHODCALLTYPE
CVPVBIConfig::Pause()
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -115,7 +119,9 @@ STDMETHODCALLTYPE
CVPVBIConfig::Run(
REFERENCE_TIME tStart)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -124,7 +130,9 @@ STDMETHODCALLTYPE
CVPVBIConfig::SetSyncSource(
IReferenceClock *pClock)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -132,7 +140,9 @@ HRESULT
STDMETHODCALLTYPE
CVPVBIConfig::NotifyGraphChange()
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -145,7 +155,9 @@ CVPVBIConfig::GetConnectInfo(
LPDWORD pdwNumConnectInfo,
IN OUT LPDDVIDEOPORTCONNECT pddVPConnectInfo)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -154,7 +166,9 @@ STDMETHODCALLTYPE
CVPVBIConfig::SetConnectInfo(
DWORD dwChosenEntry)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -163,7 +177,9 @@ STDMETHODCALLTYPE
CVPVBIConfig::GetVPDataInfo(
LPAMVPDATAINFO pamvpDataInfo)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -173,7 +189,9 @@ CVPVBIConfig::GetMaxPixelRate(
LPAMVPSIZE pamvpSize,
OUT LPDWORD pdwMaxPixelsPerSecond)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -183,7 +201,9 @@ CVPVBIConfig::InformVPInputFormats(
DWORD dwNumFormats,
IN LPDDPIXELFORMAT pDDPixelFormats)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -193,7 +213,9 @@ CVPVBIConfig::GetVideoFormats(
LPDWORD pdwNumFormats,
IN OUT LPDDPIXELFORMAT pddPixelFormats)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -202,7 +224,9 @@ STDMETHODCALLTYPE
CVPVBIConfig::SetVideoFormat(
DWORD dwChosenEntry)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -210,7 +234,9 @@ HRESULT
STDMETHODCALLTYPE
CVPVBIConfig::SetInvertPolarity()
{
- OutputDebugString("UNIMPLEMENTED\n");
+ #ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -219,7 +245,9 @@ STDMETHODCALLTYPE
CVPVBIConfig::GetOverlaySurface(
LPDIRECTDRAWSURFACE* ppddOverlaySurface)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -228,7 +256,9 @@ STDMETHODCALLTYPE
CVPVBIConfig::SetDirectDrawKernelHandle(
ULONG_PTR dwDDKernelHandle)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -237,7 +267,9 @@ STDMETHODCALLTYPE
CVPVBIConfig::SetVideoPortID(
IN DWORD dwVideoPortID)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -248,7 +280,9 @@ CVPVBIConfig::SetDDSurfaceKernelHandles(
DWORD cHandles,
IN ULONG_PTR *rgDDKernelHandles)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -260,7 +294,9 @@ CVPVBIConfig::SetSurfaceParameters(
IN DWORD dwXOrigin,
IN DWORD dwYOrigin)
{
- OutputDebugString("UNIMPLEMENTED\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"UNIMPLEMENTED\n");
+#endif
return E_NOTIMPL;
}
@@ -272,7 +308,9 @@ CVPVBIConfig_Constructor(
REFIID riid,
LPVOID * ppv)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CVPVBIConfig_Constructor\n");
+#endif
CVPVBIConfig * handler = new CVPVBIConfig();
diff --git a/dll/directx/ksproxy/datatype.cpp b/dll/directx/ksproxy/datatype.cpp
index 5006b68a121..965e847b55b 100644
--- a/dll/directx/ksproxy/datatype.cpp
+++ b/dll/directx/ksproxy/datatype.cpp
@@ -103,7 +103,9 @@ CKsDataTypeHandler::KsIsMediaTypeInRanges(
ULONG Index;
HRESULT hr = S_FALSE;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsDataTypeHandler::KsIsMediaTypeInRanges\n");
+#endif
DataList = (PKSMULTIPLE_ITEM)DataRanges;
DataRange = (PKSDATARANGE)(DataList + 1);
@@ -187,7 +189,9 @@ STDMETHODCALLTYPE
CKsDataTypeHandler::KsSetMediaType(
IN const AM_MEDIA_TYPE* AmMediaType)
{
+#ifdef KSPROXY_TRACE
OutputDebugString("CKsDataTypeHandler::KsSetMediaType\n");
+#endif
if (m_Type)
{
@@ -228,7 +232,10 @@ CKsDataTypeHandler_Constructor (
REFIID riid,
LPVOID * ppv)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsDataTypeHandler_Constructor\n");
+#endif
+
CKsDataTypeHandler * handler = new CKsDataTypeHandler();
if (!handler)
diff --git a/dll/directx/ksproxy/enum_mediatypes.cpp b/dll/directx/ksproxy/enum_mediatypes.cpp
index 462ffda24fc..db2c7a0298e 100644
--- a/dll/directx/ksproxy/enum_mediatypes.cpp
+++ b/dll/directx/ksproxy/enum_mediatypes.cpp
@@ -64,13 +64,6 @@ CEnumMediaTypes::QueryInterface(
return NOERROR;
}
- WCHAR Buffer[MAX_PATH];
- LPOLESTR lpstr;
- StringFromCLSID(refiid, &lpstr);
- swprintf(Buffer, L"CEnumMediaTypes::QueryInterface: NoInterface for %s\n", lpstr);
- OutputDebugStringW(Buffer);
- CoTaskMemFree(lpstr);
-
return E_NOINTERFACE;
}
@@ -171,7 +164,9 @@ STDMETHODCALLTYPE
CEnumMediaTypes::Clone(
IEnumMediaTypes **ppEnum)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CEnumMediaTypes::Clone : NotImplemented\n");
+#endif
return E_NOTIMPL;
}
@@ -189,7 +184,7 @@ CEnumMediaTypes_fnConstructor(
WCHAR Buffer[MAX_PATH];
LPOLESTR lpstr;
StringFromCLSID(riid, &lpstr);
- swprintf(Buffer, L"CEnumMediaTypes_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+ swprintf(Buffer, L"CEnumMediaTypes_fnConstructor riid %s\n", lpstr);
OutputDebugStringW(Buffer);
#endif
diff --git a/dll/directx/ksproxy/enumpins.cpp b/dll/directx/ksproxy/enumpins.cpp
index 5c0f0ecd7bd..a6c3bdfbd16 100644
--- a/dll/directx/ksproxy/enumpins.cpp
+++ b/dll/directx/ksproxy/enumpins.cpp
@@ -64,6 +64,14 @@ CEnumPins::QueryInterface(
return NOERROR;
}
+ WCHAR Buffer[100];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CEnumPins::QueryInterface: NoInterface for %s\n", lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+
+DebugBreak();
return E_NOINTERFACE;
}
@@ -132,7 +140,10 @@ STDMETHODCALLTYPE
CEnumPins::Clone(
IEnumPins **ppEnum)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CEnumPins::Clone : NotImplemented\n");
+#endif
+
return E_NOTIMPL;
}
diff --git a/dll/directx/ksproxy/input_pin.cpp b/dll/directx/ksproxy/input_pin.cpp
index ef1cb544563..51b78726ccb 100644
--- a/dll/directx/ksproxy/input_pin.cpp
+++ b/dll/directx/ksproxy/input_pin.cpp
@@ -62,6 +62,8 @@ class CInputPin : public IPin,
public ISpecifyPropertyPages
{
public:
+ typedef std::vectorProxyPluginVector;
+
STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
STDMETHODIMP_(ULONG) AddRef()
@@ -170,14 +172,15 @@ public:
HRESULT STDMETHODCALLTYPE CheckFormat(const AM_MEDIA_TYPE *pmt);
HRESULT STDMETHODCALLTYPE CreatePin(const AM_MEDIA_TYPE *pmt);
HRESULT STDMETHODCALLTYPE CreatePinHandle(PKSPIN_MEDIUM Medium, PKSPIN_INTERFACE Interface, const AM_MEDIA_TYPE *pmt);
- CInputPin(IBaseFilter * ParentFilter, LPCWSTR PinName, HANDLE hFilter, ULONG PinId, KSPIN_COMMUNICATION Communication);
+ HRESULT STDMETHODCALLTYPE GetSupportedSets(LPGUID * pOutGuid, PULONG NumGuids);
+ HRESULT STDMETHODCALLTYPE LoadProxyPlugins(LPGUID pGuids, ULONG NumGuids);
+ CInputPin(IBaseFilter * ParentFilter, LPCWSTR PinName, ULONG PinId, KSPIN_COMMUNICATION Communication);
virtual ~CInputPin(){};
protected:
LONG m_Ref;
IBaseFilter * m_ParentFilter;
LPCWSTR m_PinName;
- HANDLE m_hFilter;
HANDLE m_hPin;
ULONG m_PinId;
IMemAllocator * m_MemAllocator;
@@ -196,17 +199,16 @@ protected:
LPWSTR m_FilterName;
FRAMING_PROP m_FramingProp[4];
PKSALLOCATOR_FRAMING_EX m_FramingEx[4];
+ ProxyPluginVector m_Plugins;
};
CInputPin::CInputPin(
- IBaseFilter * ParentFilter,
+ IBaseFilter * ParentFilter,
LPCWSTR PinName,
- HANDLE hFilter,
ULONG PinId,
KSPIN_COMMUNICATION Communication) : m_Ref(0),
m_ParentFilter(ParentFilter),
m_PinName(PinName),
- m_hFilter(hFilter),
m_hPin(INVALID_HANDLE_VALUE),
m_PinId(PinId),
m_MemAllocator(0),
@@ -218,13 +220,27 @@ CInputPin::CInputPin(
m_KsAllocatorEx(0),
m_PipeAllocatorFlag(0),
m_bPinBusCacheInitialized(0),
- m_FilterName(0)
+ m_FilterName(0),
+ m_Plugins()
{
ZeroMemory(m_FramingProp, sizeof(m_FramingProp));
ZeroMemory(m_FramingEx, sizeof(m_FramingEx));
+ HRESULT hr;
+ IKsObject * KsObjectParent;
+ HANDLE hFilter;
+
+ hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent);
+ assert(hr == S_OK);
+
+ hFilter = KsObjectParent->KsGetObjectHandle();
+ assert(hFilter);
+
+ KsObjectParent->Release();
+
+
ZeroMemory(&m_MediaFormat, sizeof(AM_MEDIA_TYPE));
- HRESULT hr = KsGetMediaType(0, &m_MediaFormat, m_hFilter, m_PinId);
+ hr = KsGetMediaType(0, &m_MediaFormat, hFilter, m_PinId);
assert(hr == S_OK);
}
@@ -346,7 +362,10 @@ CInputPin::Notify(
IBaseFilter *pSelf,
Quality q)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::Notify NotImplemented\n");
+#endif
+
return E_NOTIMPL;
}
@@ -355,7 +374,10 @@ STDMETHODCALLTYPE
CInputPin::SetSink(
IQualityControl *piqc)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::SetSink NotImplemented\n");
+#endif
+
return E_NOTIMPL;
}
@@ -368,7 +390,10 @@ STDMETHODCALLTYPE
CInputPin::KsAddAggregate(
IN REFGUID AggregateClass)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::KsAddAggregate NotImplemented\n");
+#endif
+
return E_NOTIMPL;
}
@@ -377,7 +402,10 @@ STDMETHODCALLTYPE
CInputPin::KsRemoveAggregate(
REFGUID AggregateClass)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::KsRemoveAggregate NotImplemented\n");
+#endif
+
return E_NOTIMPL;
}
@@ -401,7 +429,10 @@ CInputPin::Backout(
IPin *ppinOut,
IGraphBuilder *pGraph)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::Backout\n");
+#endif
+
return S_OK;
}
@@ -414,7 +445,10 @@ STDMETHODCALLTYPE
CInputPin::KsPinFactory(
ULONG* PinFactory)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::KsPinFactory\n");
+#endif
+
*PinFactory = m_PinId;
return S_OK;
}
@@ -590,7 +624,10 @@ HRESULT
STDMETHODCALLTYPE
CInputPin::GetAllocator(IMemAllocator **ppAllocator)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::GetAllocator\n");
+#endif
+
return VFW_E_NO_ALLOCATOR;
}
@@ -598,13 +635,16 @@ HRESULT
STDMETHODCALLTYPE
CInputPin::NotifyAllocator(IMemAllocator *pAllocator, BOOL bReadOnly)
{
- WCHAR Buffer[100];
HRESULT hr;
ALLOCATOR_PROPERTIES Properties;
hr = pAllocator->GetProperties(&Properties);
+
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[100];
swprintf(Buffer, L"CInputPin::NotifyAllocator hr %lx bReadOnly, %u cbAlign %u cbBuffer %u cbPrefix %u cBuffers %u\n", hr, bReadOnly, Properties.cbAlign, Properties.cbBuffer, Properties.cbPrefix, Properties.cBuffers);
OutputDebugStringW(Buffer);
+#endif
if (pAllocator)
{
@@ -645,9 +685,11 @@ CInputPin::GetAllocatorRequirements(ALLOCATOR_PROPERTIES *pProps)
else
hr = E_NOTIMPL;
+#ifdef KSPROXY_TRACE
WCHAR Buffer[100];
swprintf(Buffer, L"CInputPin::GetAllocatorRequirements hr %lx m_hPin %p cBuffers %u cbBuffer %u cbAlign %u cbPrefix %u\n", hr, m_hPin, pProps->cBuffers, pProps->cbBuffer, pProps->cbAlign, pProps->cbPrefix);
OutputDebugStringW(Buffer);
+#endif
return hr;
}
@@ -656,7 +698,11 @@ HRESULT
STDMETHODCALLTYPE
CInputPin::Receive(IMediaSample *pSample)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::Receive NotImplemented\n");
+ DebugBreak();
+#endif
+
return E_NOTIMPL;
}
@@ -664,7 +710,11 @@ HRESULT
STDMETHODCALLTYPE
CInputPin::ReceiveMultiple(IMediaSample **pSamples, long nSamples, long *nSamplesProcessed)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::ReceiveMultiple NotImplemented\n");
+ DebugBreak();
+#endif
+
return E_NOTIMPL;
}
@@ -672,7 +722,11 @@ HRESULT
STDMETHODCALLTYPE
CInputPin::ReceiveCanBlock( void)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::ReceiveCanBlock NotImplemented\n");
+ DebugBreak();
+#endif
+
return S_FALSE;
}
@@ -685,7 +739,22 @@ STDMETHODCALLTYPE
CInputPin::KsQueryMediums(
PKSMULTIPLE_ITEM* MediumList)
{
- return KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_MEDIUMS, (PVOID*)MediumList);
+ HRESULT hr;
+ IKsObject * KsObjectParent;
+ HANDLE hFilter;
+
+ hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent);
+ if (FAILED(hr))
+ return hr;
+
+ hFilter = KsObjectParent->KsGetObjectHandle();
+
+ KsObjectParent->Release();
+
+ if (!hFilter)
+ return E_HANDLE;
+
+ return KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_MEDIUMS, (PVOID*)MediumList);
}
HRESULT
@@ -693,7 +762,22 @@ STDMETHODCALLTYPE
CInputPin::KsQueryInterfaces(
PKSMULTIPLE_ITEM* InterfaceList)
{
- return KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_INTERFACES, (PVOID*)InterfaceList);
+ HRESULT hr;
+ IKsObject * KsObjectParent;
+ HANDLE hFilter;
+
+ hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent);
+ if (FAILED(hr))
+ return hr;
+
+ hFilter = KsObjectParent->KsGetObjectHandle();
+
+ KsObjectParent->Release();
+
+ if (!hFilter)
+ return E_HANDLE;
+
+ return KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_INTERFACES, (PVOID*)InterfaceList);
}
HRESULT
@@ -744,8 +828,6 @@ CInputPin::KsPropagateAcquire()
ULONG BytesReturned;
HRESULT hr;
- OutputDebugStringW(L"CInputPin::KsPropagateAcquire\n");
-
assert(m_hPin != INVALID_HANDLE_VALUE);
Property.Set = KSPROPSETID_Connection;
@@ -837,7 +919,11 @@ CInputPin::KsQualityNotify(
ULONG Proportion,
REFERENCE_TIME TimeDelta)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::KsQualityNotify NotImplemented\n");
+#endif
+
+ DebugBreak();
return E_NOTIMPL;
}
@@ -851,7 +937,9 @@ CInputPin::KsNotifyError(
IMediaSample* Sample,
HRESULT hr)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::KsNotifyError NotImplemented\n");
+#endif
}
@@ -1024,7 +1112,10 @@ HRESULT
STDMETHODCALLTYPE
CInputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::Connect NotImplemented\n");
+ DebugBreak();
+#endif
return NOERROR;
}
@@ -1075,7 +1166,10 @@ CInputPin::Disconnect( void)
m_Pin->Release();
m_Pin = NULL;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::Disconnect\n");
+#endif
+
return S_OK;
}
HRESULT
@@ -1103,7 +1197,11 @@ CInputPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt)
if (!m_Pin)
return VFW_E_NOT_CONNECTED;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::ConnectionMediaType NotImplemented\n");
+ DebugBreak();
+#endif
+
return E_NOTIMPL;
}
HRESULT
@@ -1155,9 +1253,23 @@ CInputPin::EnumMediaTypes(IEnumMediaTypes **ppEnum)
HRESULT hr;
ULONG MediaTypeCount = 0, Index;
AM_MEDIA_TYPE * MediaTypes;
+ IKsObject * KsObjectParent;
+ HANDLE hFilter;
+
+ hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent);
+ if (FAILED(hr))
+ return hr;
+
+ hFilter = KsObjectParent->KsGetObjectHandle();
+
+ KsObjectParent->Release();
+
+ if (!hFilter)
+ return E_HANDLE;
+
// query media type count
- hr = KsGetMediaTypeCount(m_hFilter, m_PinId, &MediaTypeCount);
+ hr = KsGetMediaTypeCount(hFilter, m_PinId, &MediaTypeCount);
if (FAILED(hr) || !MediaTypeCount)
return hr;
@@ -1175,7 +1287,7 @@ CInputPin::EnumMediaTypes(IEnumMediaTypes **ppEnum)
for(Index = 0; Index < MediaTypeCount; Index++)
{
// get media type
- hr = KsGetMediaType(Index, &MediaTypes[Index], m_hFilter, m_PinId);
+ hr = KsGetMediaType(Index, &MediaTypes[Index], hFilter, m_PinId);
if (FAILED(hr))
{
// failed
@@ -1191,35 +1303,45 @@ HRESULT
STDMETHODCALLTYPE
CInputPin::QueryInternalConnections(IPin **apPin, ULONG *nPin)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::QueryInternalConnections NotImplemented\n");
+#endif
return E_NOTIMPL;
}
HRESULT
STDMETHODCALLTYPE
CInputPin::EndOfStream( void)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::EndOfStream NotImplemented\n");
+#endif
return E_NOTIMPL;
}
HRESULT
STDMETHODCALLTYPE
CInputPin::BeginFlush( void)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::BeginFlush NotImplemented\n");
+#endif
return E_NOTIMPL;
}
HRESULT
STDMETHODCALLTYPE
CInputPin::EndFlush( void)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::EndFlush NotImplemented\n");
+#endif
return E_NOTIMPL;
}
HRESULT
STDMETHODCALLTYPE
CInputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::NewSegment NotImplemented\n");
+#endif
return E_NOTIMPL;
}
@@ -1233,11 +1355,25 @@ CInputPin::CheckFormat(
PKSMULTIPLE_ITEM MultipleItem;
PKSDATAFORMAT DataFormat;
HRESULT hr;
+ IKsObject * KsObjectParent;
+ HANDLE hFilter;
if (!pmt)
return E_POINTER;
- hr = KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&MultipleItem);
+ hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent);
+ if (FAILED(hr))
+ return hr;
+
+ hFilter = KsObjectParent->KsGetObjectHandle();
+
+ KsObjectParent->Release();
+
+ if (!hFilter)
+ return E_HANDLE;
+
+
+ hr = KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&MultipleItem);
if (FAILED(hr))
return S_FALSE;
@@ -1250,7 +1386,9 @@ CInputPin::CheckFormat(
{
// format is supported
CoTaskMemFree(MultipleItem);
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::CheckFormat format OK\n");
+#endif
return S_OK;
}
DataFormat = (PKSDATAFORMAT)((ULONG_PTR)DataFormat + DataFormat->FormatSize);
@@ -1317,7 +1455,9 @@ CInputPin::CreatePin(
if (FAILED(hr))
{
// failed to load interface handler plugin
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::CreatePin failed to load InterfaceHandlerPlugin\n");
+#endif
CoTaskMemFree(MediumList);
CoTaskMemFree(InterfaceList);
@@ -1329,7 +1469,9 @@ CInputPin::CreatePin(
if (FAILED(hr))
{
// failed to load interface handler plugin
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CInputPin::CreatePin failed to initialize InterfaceHandlerPlugin\n");
+#endif
InterfaceHandler->Release();
CoTaskMemFree(MediumList);
CoTaskMemFree(InterfaceList);
@@ -1350,10 +1492,12 @@ CInputPin::CreatePin(
}
else
{
+#ifdef KSPROXY_TRACE
WCHAR Buffer[100];
swprintf(Buffer, L"CInputPin::CreatePin unexpected communication %u %s\n", m_Communication, m_PinName);
OutputDebugStringW(Buffer);
DebugBreak();
+#endif
hr = E_FAIL;
}
@@ -1375,6 +1519,23 @@ CInputPin::CreatePinHandle(
PKSDATAFORMAT DataFormat;
ULONG Length;
HRESULT hr;
+ IKsObject * KsObjectParent;
+ HANDLE hFilter;
+
+ if (!pmt)
+ return E_POINTER;
+
+ hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent);
+ if (FAILED(hr))
+ return hr;
+
+ hFilter = KsObjectParent->KsGetObjectHandle();
+
+ KsObjectParent->Release();
+
+ if (!hFilter)
+ return E_HANDLE;
+
if (m_hPin != INVALID_HANDLE_VALUE)
{
@@ -1423,7 +1584,7 @@ CInputPin::CreatePinHandle(
}
// create pin
- hr = KsCreatePin(m_hFilter, PinConnect, GENERIC_WRITE, &m_hPin);
+ hr = KsCreatePin(hFilter, PinConnect, GENERIC_WRITE, &m_hPin);
if (SUCCEEDED(hr))
{
@@ -1432,16 +1593,19 @@ CInputPin::CreatePinHandle(
CopyMemory(&m_Interface, Interface, sizeof(KSPIN_INTERFACE));
CopyMemory(&m_MediaFormat, pmt, sizeof(AM_MEDIA_TYPE));
+#ifdef KSPROXY_TRACE
LPOLESTR pMajor, pSub, pFormat;
StringFromIID(m_MediaFormat.majortype, &pMajor);
StringFromIID(m_MediaFormat.subtype , &pSub);
StringFromIID(m_MediaFormat.formattype, &pFormat);
+
WCHAR Buffer[200];
swprintf(Buffer, L"CInputPin::CreatePinHandle Major %s SubType %s Format %s pbFormat %p cbFormat %u\n", pMajor, pSub, pFormat, pmt->pbFormat, pmt->cbFormat);
CoTaskMemFree(pMajor);
CoTaskMemFree(pSub);
CoTaskMemFree(pFormat);
OutputDebugStringW(Buffer);
+#endif
if (pmt->cbFormat)
{
@@ -1456,6 +1620,35 @@ CInputPin::CreatePinHandle(
CopyMemory(m_MediaFormat.pbFormat, pmt->pbFormat, pmt->cbFormat);
}
+ LPGUID pGuid;
+ ULONG NumGuids = 0;
+
+ // get all supported sets
+ hr = GetSupportedSets(&pGuid, &NumGuids);
+ if (FAILED(hr))
+ {
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"CInputPin::CreatePinHandle GetSupportedSets failed\n");
+ DebugBreak();
+#endif
+ return hr;
+ }
+
+ // load all proxy plugins
+ hr = LoadProxyPlugins(pGuid, NumGuids);
+ if (FAILED(hr))
+ {
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"CInputPin::CreatePinHandle LoadProxyPlugins failed\n");
+ DebugBreak();
+#endif
+ return hr;
+ }
+
+ // free sets
+ CoTaskMemFree(pGuid);
+
+
//TODO
// connect pin pipes
@@ -1467,6 +1660,140 @@ CInputPin::CreatePinHandle(
return hr;
}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::GetSupportedSets(
+ LPGUID * pOutGuid,
+ PULONG NumGuids)
+{
+ KSPROPERTY Property;
+ LPGUID pGuid;
+ ULONG NumProperty = 0;
+ ULONG NumMethods = 0;
+ ULONG NumEvents = 0;
+ ULONG Length;
+ ULONG BytesReturned;
+ HRESULT hr;
+
+ Property.Set = GUID_NULL;
+ Property.Id = 0;
+ Property.Flags = KSPROPERTY_TYPE_SETSUPPORT;
+
+ KsSynchronousDeviceControl(m_hPin, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumProperty);
+ KsSynchronousDeviceControl(m_hPin, IOCTL_KS_METHOD, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumMethods);
+ KsSynchronousDeviceControl(m_hPin, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumEvents);
+
+ Length = NumProperty + NumMethods + NumEvents;
+
+ assert(Length);
+
+ // allocate guid buffer
+ pGuid = (LPGUID)CoTaskMemAlloc(Length);
+ if (!pGuid)
+ {
+ // failed
+ return E_OUTOFMEMORY;
+ }
+
+ NumProperty /= sizeof(GUID);
+ NumMethods /= sizeof(GUID);
+ NumEvents /= sizeof(GUID);
+
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[200];
+ swprintf(Buffer, L"CInputPin::GetSupportedSets NumProperty %lu NumMethods %lu NumEvents %lu\n", NumProperty, NumMethods, NumEvents);
+ OutputDebugStringW(Buffer);
+#endif
+
+ // get all properties
+ hr = KsSynchronousDeviceControl(m_hPin, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pGuid, Length, &BytesReturned);
+ if (FAILED(hr))
+ {
+ CoTaskMemFree(pGuid);
+ return E_FAIL;
+ }
+ Length -= BytesReturned;
+
+ // get all methods
+ if (Length && NumMethods)
+ {
+ hr = KsSynchronousDeviceControl(m_hPin, IOCTL_KS_METHOD, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&pGuid[NumProperty], Length, &BytesReturned);
+ if (FAILED(hr))
+ {
+ CoTaskMemFree(pGuid);
+ return E_FAIL;
+ }
+ Length -= BytesReturned;
+ }
+
+ // get all events
+ if (Length && NumEvents)
+ {
+ hr = KsSynchronousDeviceControl(m_hPin, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&pGuid[NumProperty+NumMethods], Length, &BytesReturned);
+ if (FAILED(hr))
+ {
+ CoTaskMemFree(pGuid);
+ return E_FAIL;
+ }
+ Length -= BytesReturned;
+ }
+
+ *pOutGuid = pGuid;
+ *NumGuids = NumProperty+NumEvents+NumMethods;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::LoadProxyPlugins(
+ LPGUID pGuids,
+ ULONG NumGuids)
+{
+ ULONG Index;
+ LPOLESTR pStr;
+ HKEY hKey, hSubKey;
+ HRESULT hr;
+ IUnknown * pUnknown;
+
+ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\MediaInterfaces", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
+ {
+ OutputDebugStringW(L"CInputPin::LoadProxyPlugins failed to open MediaInterfaces key\n");
+ return E_FAIL;
+ }
+
+ // enumerate all sets
+ for(Index = 0; Index < NumGuids; Index++)
+ {
+ // convert to string
+ hr = StringFromCLSID(pGuids[Index], &pStr);
+ if (FAILED(hr))
+ return E_FAIL;
+
+ // now try open class key
+ if (RegOpenKeyExW(hKey, pStr, 0, KEY_READ, &hSubKey) != ERROR_SUCCESS)
+ {
+ // no plugin for that set exists
+ CoTaskMemFree(pStr);
+ continue;
+ }
+
+ // try load plugin
+ hr = CoCreateInstance(pGuids[Index], (IBaseFilter*)this, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnknown);
+ if (SUCCEEDED(hr))
+ {
+ // store plugin
+ m_Plugins.push_back(pUnknown);
+DebugBreak();
+ }
+ // close key
+ RegCloseKey(hSubKey);
+ }
+
+ // close media interfaces key
+ RegCloseKey(hKey);
+ return S_OK;
+}
+
HRESULT
WINAPI
CInputPin_Constructor(
@@ -1478,7 +1805,7 @@ CInputPin_Constructor(
REFIID riid,
LPVOID * ppv)
{
- CInputPin * handler = new CInputPin(ParentFilter, PinName, hFilter, PinId, Communication);
+ CInputPin * handler = new CInputPin(ParentFilter, PinName, PinId, Communication);
if (!handler)
return E_OUTOFMEMORY;
diff --git a/dll/directx/ksproxy/interface.cpp b/dll/directx/ksproxy/interface.cpp
index 930f7e00b73..7eb0fd284d5 100644
--- a/dll/directx/ksproxy/interface.cpp
+++ b/dll/directx/ksproxy/interface.cpp
@@ -35,24 +35,25 @@ public:
HRESULT STDMETHODCALLTYPE KsProcessMediaSamples(IKsDataTypeHandler *KsDataTypeHandler, IMediaSample** SampleList, PLONG SampleCount, KSIOOPERATION IoOperation, PKSSTREAM_SEGMENT *StreamSegment);
HRESULT STDMETHODCALLTYPE KsCompleteIo(PKSSTREAM_SEGMENT StreamSegment);
- CKsInterfaceHandler() : m_Ref(0), m_Handle(NULL), m_Pin(0){};
+ CKsInterfaceHandler() : m_Ref(0), m_Handle(NULL), m_Pin(0) {m_PinName[0] = L'\0';};
virtual ~CKsInterfaceHandler(){};
protected:
LONG m_Ref;
HANDLE m_Handle;
IKsPinEx * m_Pin;
+ WCHAR m_PinName[129];
};
typedef struct
{
KSSTREAM_SEGMENT StreamSegment;
+ OVERLAPPED Overlapped;
IMediaSample * MediaSample[64];
ULONG SampleCount;
ULONG ExtendedSize;
PKSSTREAM_HEADER StreamHeader;
- OVERLAPPED Overlapped;
}KSSTREAM_SEGMENT_EXT, *PKSSTREAM_SEGMENT_EXT;
@@ -118,6 +119,22 @@ CKsInterfaceHandler::KsSetPin(
Pin->Release();
}
}
+#if 1
+ //DBG code
+ PIN_INFO PinInfo;
+ IPin * pPin;
+ if (SUCCEEDED(KsPin->QueryInterface(IID_IPin, (void**)&pPin)))
+ {
+ if (SUCCEEDED(pPin->QueryPinInfo(&PinInfo)))
+ {
+ if (PinInfo.pFilter)
+ PinInfo.pFilter->Release();
+
+ wcscpy(m_PinName, PinInfo.achName);
+ }
+ pPin->Release();
+ }
+#endif
// done
return hr;
@@ -136,8 +153,6 @@ CKsInterfaceHandler::KsProcessMediaSamples(
ULONG ExtendedSize, Index, BytesReturned;
HRESULT hr = S_OK;
- OutputDebugString("CKsInterfaceHandler::KsProcessMediaSamples\n");
-
// sanity check
assert(*SampleCount);
@@ -237,6 +252,7 @@ CKsInterfaceHandler::KsProcessMediaSamples(
// query for IMediaSample2 interface
IMediaSample2 * MediaSample;
AM_SAMPLE2_PROPERTIES Properties;
+ ZeroMemory(&Properties, sizeof(AM_SAMPLE2_PROPERTIES));
hr = SampleList[Index]->QueryInterface(IID_IMediaSample2, (void**)&MediaSample);
if (SUCCEEDED(hr))
@@ -254,7 +270,9 @@ CKsInterfaceHandler::KsProcessMediaSamples(
hr = SampleList[Index]->GetPointer((BYTE**)&Properties.pbBuffer);
assert(hr == NOERROR);
hr = SampleList[Index]->GetTime(&Properties.tStart, &Properties.tStop);
- assert(hr == NOERROR);
+
+ Properties.cbBuffer = SampleList[Index]->GetSize();
+ assert(Properties.cbBuffer);
Properties.dwSampleFlags = 0;
@@ -267,10 +285,11 @@ CKsInterfaceHandler::KsProcessMediaSamples(
if (SampleList[Index]->IsSyncPoint() == S_OK)
Properties.dwSampleFlags |= AM_SAMPLE_SPLICEPOINT;
}
-
- WCHAR Buffer[100];
- swprintf(Buffer, L"BufferLength %lu Property Buffer %p ExtendedSize %u lActual %u\n", Properties.cbBuffer, Properties.pbBuffer, ExtendedSize, Properties.lActual);
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[200];
+ swprintf(Buffer, L"CKsInterfaceHandler::KsProcessMediaSamples PinName %s BufferLength %lu Property Buffer %p ExtendedSize %u lActual %u dwSampleFlags %lx\n", m_PinName, Properties.cbBuffer, Properties.pbBuffer, ExtendedSize, Properties.lActual, Properties.dwSampleFlags);
OutputDebugStringW(Buffer);
+#endif
CurStreamHeader->Size = sizeof(KSSTREAM_HEADER) + ExtendedSize;
CurStreamHeader->PresentationTime.Denominator = 1;
@@ -336,8 +355,6 @@ CKsInterfaceHandler::KsCompleteIo(
AM_SAMPLE2_PROPERTIES Properties;
REFERENCE_TIME Start, Stop;
- OutputDebugStringW(L"CKsInterfaceHandler::KsCompleteIo\n");
-
// get private stream segment
StreamSegment = (PKSSTREAM_SEGMENT_EXT)InStreamSegment;
@@ -463,7 +480,9 @@ CKsInterfaceHandler_Constructor(
REFIID riid,
LPVOID * ppv)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsInterfaceHandler_Constructor\n");
+#endif
CKsInterfaceHandler * handler = new CKsInterfaceHandler();
diff --git a/dll/directx/ksproxy/ksproxy.cpp b/dll/directx/ksproxy/ksproxy.cpp
index f79a154574b..f1e17c96922 100644
--- a/dll/directx/ksproxy/ksproxy.cpp
+++ b/dll/directx/ksproxy/ksproxy.cpp
@@ -117,7 +117,7 @@ KsOpenDefaultDevice(
WCHAR Path[MAX_PATH+sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W)];
/* open device list */
- hList = SetupDiGetClassDevsW(&Category, NULL, NULL, DIGCF_DEVICEINTERFACE /* | DIGCF_PRESENT*/);
+ hList = SetupDiGetClassDevsW(&Category, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
if (hList == INVALID_HANDLE_VALUE)
{
@@ -129,7 +129,7 @@ KsOpenDefaultDevice(
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
- if (SetupDiEnumDeviceInterfaces(hList, &DeviceInfoData, &Category, 0, &DeviceInterfaceData))
+ if (SetupDiEnumDeviceInterfaces(hList, NULL, &Category, 0, &DeviceInterfaceData))
{
/* setup interface data struct */
DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA_W)Path;
diff --git a/dll/directx/ksproxy/ksproxy.rbuild b/dll/directx/ksproxy/ksproxy.rbuild
index 269d986fc41..86cd50a2c1d 100644
--- a/dll/directx/ksproxy/ksproxy.rbuild
+++ b/dll/directx/ksproxy/ksproxy.rbuild
@@ -33,6 +33,7 @@
interface.cpp
ksproxy.cpp
ksproxy.rc
+ mediasample.cpp
node.cpp
output_pin.cpp
proxy.cpp
diff --git a/dll/directx/ksproxy/node.cpp b/dll/directx/ksproxy/node.cpp
index d2686bb96a4..d3082255346 100644
--- a/dll/directx/ksproxy/node.cpp
+++ b/dll/directx/ksproxy/node.cpp
@@ -124,7 +124,9 @@ CKsNode_Constructor(
HANDLE handle;
KSNODE_CREATE NodeCreate;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsNode_Constructor\n");
+#endif
//setup request
NodeCreate.CreateFlags = 0;
diff --git a/dll/directx/ksproxy/output_pin.cpp b/dll/directx/ksproxy/output_pin.cpp
index c5d897c6bcf..17f07804a20 100644
--- a/dll/directx/ksproxy/output_pin.cpp
+++ b/dll/directx/ksproxy/output_pin.cpp
@@ -26,6 +26,8 @@ class COutputPin : public IPin,
{
public:
+ typedef std::vectorProxyPluginVector;
+
STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
STDMETHODIMP_(ULONG) AddRef()
@@ -160,6 +162,13 @@ public:
HRESULT STDMETHODCALLTYPE CheckFormat(const AM_MEDIA_TYPE *pmt);
HRESULT STDMETHODCALLTYPE CreatePin(const AM_MEDIA_TYPE *pmt);
HRESULT STDMETHODCALLTYPE CreatePinHandle(PKSPIN_MEDIUM Medium, PKSPIN_INTERFACE Interface, const AM_MEDIA_TYPE *pmt);
+ HRESULT WINAPI IoProcessRoutine();
+ HRESULT WINAPI InitializeIOThread();
+ HRESULT STDMETHODCALLTYPE GetSupportedSets(LPGUID * pOutGuid, PULONG NumGuids);
+ HRESULT STDMETHODCALLTYPE LoadProxyPlugins(LPGUID pGuids, ULONG NumGuids);
+
+ friend DWORD WINAPI COutputPin_IoThreadStartup(LPVOID lpParameter);
+ friend HRESULT STDMETHODCALLTYPE COutputPin_SetState(IPin * Pin, KSSTATE State);
protected:
LONG m_Ref;
@@ -167,7 +176,6 @@ protected:
LPCWSTR m_PinName;
HANDLE m_hPin;
ULONG m_PinId;
- IKsObject * m_KsObjectParent;
IPin * m_Pin;
IKsAllocatorEx * m_KsAllocatorEx;
ULONG m_PipeAllocatorFlag;
@@ -178,21 +186,29 @@ protected:
PKSALLOCATOR_FRAMING_EX m_FramingEx[4];
IMemAllocator * m_MemAllocator;
+ IMemInputPin * m_MemInputPin;
LONG m_IoCount;
KSPIN_COMMUNICATION m_Communication;
KSPIN_INTERFACE m_Interface;
KSPIN_MEDIUM m_Medium;
AM_MEDIA_TYPE m_MediaFormat;
-
- IMediaSeeking * m_FilterMediaSeeking;
ALLOCATOR_PROPERTIES m_Properties;
IKsInterfaceHandler * m_InterfaceHandler;
+
+ HANDLE m_hStartEvent;
+ HANDLE m_hBufferAvailable;
+ HANDLE m_hStopEvent;
+ BOOL m_StopInProgress;
+ BOOL m_IoThreadStarted;
+
+ KSSTATE m_State;
+ CRITICAL_SECTION m_Lock;
+
+ ProxyPluginVector m_Plugins;
};
COutputPin::~COutputPin()
{
- if (m_KsObjectParent)
- m_KsObjectParent->Release();
}
COutputPin::COutputPin(
@@ -204,31 +220,39 @@ COutputPin::COutputPin(
m_PinName(PinName),
m_hPin(INVALID_HANDLE_VALUE),
m_PinId(PinId),
- m_KsObjectParent(0),
m_Pin(0),
m_KsAllocatorEx(0),
m_PipeAllocatorFlag(0),
m_bPinBusCacheInitialized(0),
m_FilterName(0),
m_MemAllocator(0),
+ m_MemInputPin(0),
m_IoCount(0),
m_Communication(Communication),
- m_FilterMediaSeeking(0),
- m_InterfaceHandler(0)
+ m_InterfaceHandler(0),
+ m_hStartEvent(0),
+ m_hBufferAvailable(0),
+ m_hStopEvent(0),
+ m_StopInProgress(0),
+ m_IoThreadStarted(0),
+ m_State(KSSTATE_STOP),
+ m_Plugins()
{
HRESULT hr;
+ IKsObject * KsObjectParent;
- hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&m_KsObjectParent);
- assert(hr == S_OK);
-
- hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&m_FilterMediaSeeking);
+ hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent);
assert(hr == S_OK);
ZeroMemory(m_FramingProp, sizeof(m_FramingProp));
ZeroMemory(m_FramingEx, sizeof(m_FramingEx));
- hr = KsGetMediaType(0, &m_MediaFormat, m_KsObjectParent->KsGetObjectHandle(), m_PinId);
+ hr = KsGetMediaType(0, &m_MediaFormat, KsObjectParent->KsGetObjectHandle(), m_PinId);
assert(hr == S_OK);
+
+ InitializeCriticalSection(&m_Lock);
+
+ KsObjectParent->Release();
};
HRESULT
@@ -241,7 +265,9 @@ COutputPin::QueryInterface(
if (IsEqualGUID(refiid, IID_IUnknown) ||
IsEqualGUID(refiid, IID_IPin))
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::QueryInterface IID_IPin\n");
+#endif
*Output = PVOID(this);
reinterpret_cast(*Output)->AddRef();
return NOERROR;
@@ -254,8 +280,9 @@ COutputPin::QueryInterface(
if (FAILED(hr))
return hr;
}
-
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsObject\n");
+#endif
*Output = (IKsObject*)(this);
reinterpret_cast(*Output)->AddRef();
return NOERROR;
@@ -292,14 +319,18 @@ COutputPin::QueryInterface(
if (FAILED(hr))
return hr;
}
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsPropertySet\n");
+#endif
*Output = (IKsPropertySet*)(this);
reinterpret_cast(*Output)->AddRef();
return NOERROR;
}
else if (IsEqualGUID(refiid, IID_IKsControl))
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsControl\n");
+#endif
*Output = (IKsControl*)(this);
reinterpret_cast(*Output)->AddRef();
return NOERROR;
@@ -314,14 +345,18 @@ COutputPin::QueryInterface(
#endif
else if (IsEqualGUID(refiid, IID_IKsPinFactory))
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsPinFactory\n");
+#endif
*Output = (IKsPinFactory*)(this);
reinterpret_cast(*Output)->AddRef();
return NOERROR;
}
else if (IsEqualGUID(refiid, IID_ISpecifyPropertyPages))
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::QueryInterface IID_ISpecifyPropertyPages\n");
+#endif
*Output = (ISpecifyPropertyPages*)(this);
reinterpret_cast(*Output)->AddRef();
return NOERROR;
@@ -351,12 +386,14 @@ COutputPin::QueryInterface(
return NOERROR;
}
+#ifdef KSPROXY_TRACE
WCHAR Buffer[MAX_PATH];
LPOLESTR lpstr;
StringFromCLSID(refiid, &lpstr);
swprintf(Buffer, L"COutputPin::QueryInterface: NoInterface for %s PinId %u PinName %s\n", lpstr, m_PinId, m_PinName);
OutputDebugStringW(Buffer);
CoTaskMemFree(lpstr);
+#endif
return E_NOINTERFACE;
}
@@ -369,7 +406,9 @@ STDMETHODCALLTYPE
COutputPin::SuggestAllocatorProperties(
const ALLOCATOR_PROPERTIES *pprop)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::SuggestAllocatorProperties\n");
+#endif
if (m_Pin)
{
@@ -386,7 +425,9 @@ STDMETHODCALLTYPE
COutputPin::GetAllocatorProperties(
ALLOCATOR_PROPERTIES *pprop)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::GetAllocatorProperties\n");
+#endif
if (!m_Pin)
{
@@ -412,7 +453,9 @@ STDMETHODCALLTYPE
COutputPin::SetFormat(
AM_MEDIA_TYPE *pmt)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::SetFormat NotImplemented\n");
+#endif
return E_NOTIMPL;
}
@@ -420,7 +463,9 @@ HRESULT
STDMETHODCALLTYPE
COutputPin::GetFormat(AM_MEDIA_TYPE **ppmt)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::GetFormat NotImplemented\n");
+#endif
return E_NOTIMPL;
}
@@ -430,7 +475,9 @@ COutputPin::GetNumberOfCapabilities(
int *piCount,
int *piSize)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::GetNumberOfCapabilities NotImplemented\n");
+#endif
return E_NOTIMPL;
}
@@ -441,7 +488,9 @@ COutputPin::GetStreamCaps(
AM_MEDIA_TYPE **ppmt,
BYTE *pSCC)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::GetStreamCaps NotImplemented\n");
+#endif
return E_NOTIMPL;
}
@@ -452,8 +501,14 @@ HRESULT
STDMETHODCALLTYPE
COutputPin::NotifyRelease()
{
- OutputDebugStringW(L"COutputPin::NotifyRelease NotImplemented\n");
- return E_NOTIMPL;
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"COutputPin::NotifyRelease\n");
+#endif
+
+ // notify thread of new available sample
+ SetEvent(m_hBufferAvailable);
+
+ return NOERROR;
}
//-------------------------------------------------------------------
@@ -464,7 +519,17 @@ STDMETHODCALLTYPE
COutputPin::GetCapabilities(
DWORD *pCapabilities)
{
- return m_FilterMediaSeeking->GetCapabilities(pCapabilities);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->GetCapabilities(pCapabilities);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -472,7 +537,17 @@ STDMETHODCALLTYPE
COutputPin::CheckCapabilities(
DWORD *pCapabilities)
{
- return m_FilterMediaSeeking->CheckCapabilities(pCapabilities);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->CheckCapabilities(pCapabilities);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -480,7 +555,17 @@ STDMETHODCALLTYPE
COutputPin::IsFormatSupported(
const GUID *pFormat)
{
- return m_FilterMediaSeeking->IsFormatSupported(pFormat);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->IsFormatSupported(pFormat);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -488,7 +573,17 @@ STDMETHODCALLTYPE
COutputPin::QueryPreferredFormat(
GUID *pFormat)
{
- return m_FilterMediaSeeking->QueryPreferredFormat(pFormat);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->QueryPreferredFormat(pFormat);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -496,7 +591,17 @@ STDMETHODCALLTYPE
COutputPin::GetTimeFormat(
GUID *pFormat)
{
- return m_FilterMediaSeeking->GetTimeFormat(pFormat);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->GetTimeFormat(pFormat);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -504,7 +609,17 @@ STDMETHODCALLTYPE
COutputPin::IsUsingTimeFormat(
const GUID *pFormat)
{
- return m_FilterMediaSeeking->IsUsingTimeFormat(pFormat);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->IsUsingTimeFormat(pFormat);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -512,7 +627,17 @@ STDMETHODCALLTYPE
COutputPin::SetTimeFormat(
const GUID *pFormat)
{
- return m_FilterMediaSeeking->SetTimeFormat(pFormat);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->SetTimeFormat(pFormat);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -520,7 +645,17 @@ STDMETHODCALLTYPE
COutputPin::GetDuration(
LONGLONG *pDuration)
{
- return m_FilterMediaSeeking->GetDuration(pDuration);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->GetDuration(pDuration);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -528,7 +663,17 @@ STDMETHODCALLTYPE
COutputPin::GetStopPosition(
LONGLONG *pStop)
{
- return m_FilterMediaSeeking->GetStopPosition(pStop);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->GetStopPosition(pStop);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
@@ -537,7 +682,17 @@ STDMETHODCALLTYPE
COutputPin::GetCurrentPosition(
LONGLONG *pCurrent)
{
- return m_FilterMediaSeeking->GetCurrentPosition(pCurrent);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->GetCurrentPosition(pCurrent);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -548,7 +703,17 @@ COutputPin::ConvertTimeFormat(
LONGLONG Source,
const GUID *pSourceFormat)
{
- return m_FilterMediaSeeking->ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -559,7 +724,17 @@ COutputPin::SetPositions(
LONGLONG *pStop,
DWORD dwStopFlags)
{
- return m_FilterMediaSeeking->SetPositions(pCurrent, dwCurrentFlags, pStop, dwStopFlags);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->SetPositions(pCurrent, dwCurrentFlags, pStop, dwStopFlags);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -568,7 +743,17 @@ COutputPin::GetPositions(
LONGLONG *pCurrent,
LONGLONG *pStop)
{
- return m_FilterMediaSeeking->GetPositions(pCurrent, pStop);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->GetPositions(pCurrent, pStop);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -577,7 +762,17 @@ COutputPin::GetAvailable(
LONGLONG *pEarliest,
LONGLONG *pLatest)
{
- return m_FilterMediaSeeking->GetAvailable(pEarliest, pLatest);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->GetAvailable(pEarliest, pLatest);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -585,7 +780,17 @@ STDMETHODCALLTYPE
COutputPin::SetRate(
double dRate)
{
- return m_FilterMediaSeeking->SetRate(dRate);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->SetRate(dRate);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -593,7 +798,17 @@ STDMETHODCALLTYPE
COutputPin::GetRate(
double *pdRate)
{
- return m_FilterMediaSeeking->GetRate(pdRate);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->GetRate(pdRate);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
HRESULT
@@ -601,7 +816,17 @@ STDMETHODCALLTYPE
COutputPin::GetPreroll(
LONGLONG *pllPreroll)
{
- return m_FilterMediaSeeking->GetPreroll(pllPreroll);
+ IMediaSeeking * FilterMediaSeeking;
+ HRESULT hr;
+
+ hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&FilterMediaSeeking);
+ if (FAILED(hr))
+ return hr;
+
+ hr = FilterMediaSeeking->GetPreroll(pllPreroll);
+
+ FilterMediaSeeking->Release();
+ return hr;
}
//-------------------------------------------------------------------
@@ -613,7 +838,9 @@ COutputPin::Notify(
IBaseFilter *pSelf,
Quality q)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::Notify NotImplemented\n");
+#endif
return E_NOTIMPL;
}
@@ -622,7 +849,9 @@ STDMETHODCALLTYPE
COutputPin::SetSink(
IQualityControl *piqc)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::SetSink NotImplemented\n");
+#endif
return E_NOTIMPL;
}
@@ -635,7 +864,9 @@ STDMETHODCALLTYPE
COutputPin::KsAddAggregate(
IN REFGUID AggregateClass)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::KsAddAggregate NotImplemented\n");
+#endif
return E_NOTIMPL;
}
@@ -644,7 +875,9 @@ STDMETHODCALLTYPE
COutputPin::KsRemoveAggregate(
REFGUID AggregateClass)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::KsRemoveAggregate NotImplemented\n");
+#endif
return E_NOTIMPL;
}
@@ -658,8 +891,24 @@ STDMETHODCALLTYPE
COutputPin::KsQueryMediums(
PKSMULTIPLE_ITEM* MediumList)
{
- HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle();
- return KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_MEDIUMS, (PVOID*)MediumList);
+ HRESULT hr;
+ HANDLE hFilter;
+ IKsObject * KsObjectParent;
+
+ hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent);
+ if (FAILED(hr))
+ return E_NOINTERFACE;
+
+ hFilter = KsObjectParent->KsGetObjectHandle();
+
+ if (hFilter)
+ hr = KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_MEDIUMS, (PVOID*)MediumList);
+ else
+ hr = E_HANDLE;
+
+ KsObjectParent->Release();
+
+ return hr;
}
HRESULT
@@ -667,9 +916,24 @@ STDMETHODCALLTYPE
COutputPin::KsQueryInterfaces(
PKSMULTIPLE_ITEM* InterfaceList)
{
- HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle();
+ HRESULT hr;
+ HANDLE hFilter;
+ IKsObject * KsObjectParent;
- return KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_INTERFACES, (PVOID*)InterfaceList);
+ hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent);
+ if (FAILED(hr))
+ return hr;
+
+ hFilter = KsObjectParent->KsGetObjectHandle();
+
+ if (hFilter)
+ hr = KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_INTERFACES, (PVOID*)InterfaceList);
+ else
+ hr = E_HANDLE;
+
+ KsObjectParent->Release();
+
+ return hr;
}
HRESULT
@@ -678,7 +942,9 @@ COutputPin::KsCreateSinkPinHandle(
KSPIN_INTERFACE& Interface,
KSPIN_MEDIUM& Medium)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::KsCreateSinkPinHandle NotImplemented\n");
+#endif
return E_NOTIMPL;
}
@@ -721,7 +987,9 @@ COutputPin::KsPropagateAcquire()
ULONG BytesReturned;
HRESULT hr;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::KsPropagateAcquire\n");
+#endif
assert(m_hPin != INVALID_HANDLE_VALUE);
@@ -732,6 +1000,10 @@ COutputPin::KsPropagateAcquire()
State = KSSTATE_ACQUIRE;
hr = KsProperty(&Property, sizeof(KSPROPERTY), (LPVOID)&State, sizeof(KSSTATE), &BytesReturned);
+ if (SUCCEEDED(hr))
+ {
+ m_State = State;
+ }
//TODO
//propagate to connected pin on the pipe
@@ -813,7 +1085,9 @@ COutputPin::KsQualityNotify(
ULONG Proportion,
REFERENCE_TIME TimeDelta)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::KsQualityNotify NotImplemented\n");
+#endif
return E_NOTIMPL;
}
@@ -827,7 +1101,9 @@ COutputPin::KsNotifyError(
IMediaSample* Sample,
HRESULT hr)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::KsNotifyError NotImplemented\n");
+#endif
}
@@ -984,7 +1260,9 @@ HRESULT
STDMETHODCALLTYPE
COutputPin::GetPages(CAUUID *pPages)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::GetPages NotImplemented\n");
+#endif
if (!pPages)
return E_POINTER;
@@ -1004,7 +1282,10 @@ STDMETHODCALLTYPE
COutputPin::KsPinFactory(
ULONG* PinFactory)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::KsPinFactory\n");
+#endif
+
*PinFactory = m_PinId;
return S_OK;
}
@@ -1020,7 +1301,9 @@ COutputPin::Render(
IPin *ppinOut,
IGraphBuilder *pGraph)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::Render\n");
+#endif
return S_OK;
}
@@ -1030,7 +1313,10 @@ COutputPin::Backout(
IPin *ppinOut,
IGraphBuilder *pGraph)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::Backout\n");
+#endif
+
return S_OK;
}
//-------------------------------------------------------------------
@@ -1040,7 +1326,10 @@ HANDLE
STDMETHODCALLTYPE
COutputPin::KsGetObjectHandle()
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::KsGetObjectHandle\n");
+#endif
+
assert(m_hPin != INVALID_HANDLE_VALUE);
return m_hPin;
}
@@ -1058,16 +1347,17 @@ COutputPin::KsProperty(
ULONG* BytesReturned)
{
HRESULT hr;
- WCHAR Buffer[100];
- LPOLESTR pstr;
assert(m_hPin != INVALID_HANDLE_VALUE);
hr = KsSynchronousDeviceControl(m_hPin, IOCTL_KS_PROPERTY, (PVOID)Property, PropertyLength, (PVOID)PropertyData, DataLength, BytesReturned);
-
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[100];
+ LPOLESTR pstr;
StringFromCLSID(Property->Set, &pstr);
swprintf(Buffer, L"COutputPin::KsProperty Set %s Id %lu Flags %x hr %x\n", pstr, Property->Id, Property->Flags, hr);
OutputDebugStringW(Buffer);
+#endif
return hr;
}
@@ -1082,7 +1372,9 @@ COutputPin::KsMethod(
ULONG* BytesReturned)
{
assert(m_hPin != INVALID_HANDLE_VALUE);
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::KsMethod\n");
+#endif
return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_METHOD, (PVOID)Method, MethodLength, (PVOID)MethodData, DataLength, BytesReturned);
}
@@ -1097,7 +1389,9 @@ COutputPin::KsEvent(
{
assert(m_hPin != INVALID_HANDLE_VALUE);
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::KsEvent\n");
+#endif
if (EventLength)
return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_ENABLE_EVENT, (PVOID)Event, EventLength, (PVOID)EventData, DataLength, BytesReturned);
@@ -1202,7 +1496,9 @@ COutputPin::QuerySupported(
KSPROPERTY Property;
ULONG BytesReturned;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::QuerySupported\n");
+#endif
Property.Set = guidPropSet;
Property.Id = dwPropID;
@@ -1220,8 +1516,14 @@ STDMETHODCALLTYPE
COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
{
HRESULT hr;
+ ALLOCATOR_PROPERTIES Properties;
+ IMemAllocatorCallbackTemp *pMemCallback;
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[200];
OutputDebugStringW(L"COutputPin::Connect called\n");
+#endif
+
if (pmt)
{
hr = pReceivePin->QueryAccept(pmt);
@@ -1238,7 +1540,120 @@ COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
pmt = &m_MediaFormat;
}
- //FIXME create pin handle
+ // query for IMemInput interface
+ hr = pReceivePin->QueryInterface(IID_IMemInputPin, (void**)&m_MemInputPin);
+ if (FAILED(hr))
+ {
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"COutputPin::Connect no IMemInputPin interface\n");
+#endif
+
+ DebugBreak();
+ return hr;
+ }
+
+ // get input pin allocator properties
+ ZeroMemory(&Properties, sizeof(ALLOCATOR_PROPERTIES));
+ m_MemInputPin->GetAllocatorRequirements(&Properties);
+
+ //FIXME determine allocator properties
+ Properties.cBuffers = 32;
+ Properties.cbBuffer = 2048 * 188; //2048 frames * MPEG2 TS Payload size
+ Properties.cbAlign = 4;
+
+ // get input pin allocator
+#if 0
+ hr = m_MemInputPin->GetAllocator(&m_MemAllocator);
+ if (SUCCEEDED(hr))
+ {
+ // set allocator properties
+ hr = m_MemAllocator->SetProperties(&Properties, &m_Properties);
+ if (FAILED(hr))
+ m_MemAllocator->Release();
+ }
+#endif
+
+ if (1)
+ {
+ hr = CKsAllocator_Constructor(NULL, IID_IMemAllocator, (void**)&m_MemAllocator);
+ if (FAILED(hr))
+ return hr;
+
+ // set allocator properties
+ hr = m_MemAllocator->SetProperties(&Properties, &m_Properties);
+ if (FAILED(hr))
+ {
+#ifdef KSPROXY_TRACE
+ swprintf(Buffer, L"COutputPin::Connect IMemAllocator::SetProperties failed with hr %lx\n", hr);
+ OutputDebugStringW(Buffer);
+#endif
+ m_MemAllocator->Release();
+ m_MemInputPin->Release();
+ return hr;
+ }
+ }
+
+ // commit property changes
+ hr = m_MemAllocator->Commit();
+ if (FAILED(hr))
+ {
+#ifdef KSPROXY_TRACE
+ swprintf(Buffer, L"COutputPin::Connect IMemAllocator::Commit failed with hr %lx\n", hr);
+ OutputDebugStringW(Buffer);
+#endif
+ m_MemAllocator->Release();
+ m_MemInputPin->Release();
+ return hr;
+ }
+
+ // get callback interface
+ hr = m_MemAllocator->QueryInterface(IID_IMemAllocatorCallbackTemp, (void**)&pMemCallback);
+ if (FAILED(hr))
+ {
+#ifdef KSPROXY_TRACE
+ swprintf(Buffer, L"COutputPin::Connect No IMemAllocatorCallbackTemp interface hr %lx\n", hr);
+ OutputDebugStringW(Buffer);
+#endif
+ m_MemAllocator->Release();
+ m_MemInputPin->Release();
+ return hr;
+ }
+
+ // set notification routine
+ hr = pMemCallback->SetNotify((IMemAllocatorNotifyCallbackTemp*)this);
+
+ // release IMemAllocatorNotifyCallbackTemp interface
+ pMemCallback->Release();
+
+ if (FAILED(hr))
+ {
+#ifdef KSPROXY_TRACE
+ swprintf(Buffer, L"COutputPin::Connect IMemAllocatorNotifyCallbackTemp::SetNotify failed hr %lx\n", hr);
+ OutputDebugStringW(Buffer);
+#endif
+ m_MemAllocator->Release();
+ m_MemInputPin->Release();
+ return hr;
+ }
+
+ // now set allocator
+ hr = m_MemInputPin->NotifyAllocator(m_MemAllocator, TRUE);
+ if (FAILED(hr))
+ {
+#ifdef KSPROXY_TRACE
+ swprintf(Buffer, L"COutputPin::Connect IMemInputPin::NotifyAllocator failed with hr %lx\n", hr);
+ OutputDebugStringW(Buffer);
+#endif
+ m_MemAllocator->Release();
+ m_MemInputPin->Release();
+ return hr;
+ }
+
+ if (!m_hPin)
+ {
+ //FIXME create pin handle
+ assert(0);
+ }
// receive connection;
hr = pReceivePin->ReceiveConnection((IPin*)this, pmt);
@@ -1247,7 +1662,14 @@ COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
// increment reference count
pReceivePin->AddRef();
m_Pin = pReceivePin;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::Connect success\n");
+#endif
+ }
+ else
+ {
+ m_MemInputPin->Release();
+ m_MemAllocator->Release();
}
return hr;
@@ -1257,14 +1679,15 @@ HRESULT
STDMETHODCALLTYPE
COutputPin::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt)
{
- OutputDebugStringW(L"COutputPin::ReceiveConnection\n");
return E_UNEXPECTED;
}
HRESULT
STDMETHODCALLTYPE
COutputPin::Disconnect( void)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::Disconnect\n");
+#endif
if (!m_Pin)
{
@@ -1277,15 +1700,24 @@ COutputPin::Disconnect( void)
m_Pin->Release();
m_Pin = NULL;
+ m_MemInputPin->Release();
+ m_MemAllocator->Release();
+ CloseHandle(m_hPin);
+ m_hPin = INVALID_HANDLE_VALUE;
+
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::Disconnect\n");
+#endif
return S_OK;
}
HRESULT
STDMETHODCALLTYPE
COutputPin::ConnectedTo(IPin **pPin)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::ConnectedTo\n");
+#endif
if (!pPin)
return E_POINTER;
@@ -1305,15 +1737,16 @@ HRESULT
STDMETHODCALLTYPE
COutputPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::ConnectionMediaType called\n");
+#endif
+
return E_NOTIMPL;
}
HRESULT
STDMETHODCALLTYPE
COutputPin::QueryPinInfo(PIN_INFO *pInfo)
{
- OutputDebugStringW(L"COutputPin::QueryPinInfo\n");
-
wcscpy(pInfo->achName, m_PinName);
pInfo->dir = PINDIR_OUTPUT;
pInfo->pFilter = m_ParentFilter;
@@ -1325,8 +1758,6 @@ HRESULT
STDMETHODCALLTYPE
COutputPin::QueryDirection(PIN_DIRECTION *pPinDir)
{
- OutputDebugStringW(L"COutputPin::QueryDirection\n");
-
if (pPinDir)
{
*pPinDir = PINDIR_OUTPUT;
@@ -1339,8 +1770,6 @@ HRESULT
STDMETHODCALLTYPE
COutputPin::QueryId(LPWSTR *Id)
{
- OutputDebugStringW(L"COutputPin::QueryId\n");
-
*Id = (LPWSTR)CoTaskMemAlloc((wcslen(m_PinName)+1)*sizeof(WCHAR));
if (!*Id)
return E_OUTOFMEMORY;
@@ -1352,7 +1781,10 @@ HRESULT
STDMETHODCALLTYPE
COutputPin::QueryAccept(const AM_MEDIA_TYPE *pmt)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::QueryAccept called\n");
+#endif
+
return E_NOTIMPL;
}
HRESULT
@@ -1363,23 +1795,22 @@ COutputPin::EnumMediaTypes(IEnumMediaTypes **ppEnum)
ULONG MediaTypeCount = 0, Index;
AM_MEDIA_TYPE * MediaTypes;
HANDLE hFilter;
+ IKsObject * KsObjectParent;
- OutputDebugStringW(L"COutputPin::EnumMediaTypes called\n");
-
- if (!m_KsObjectParent)
- {
- // no interface
- return E_NOINTERFACE;
- }
+ hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent);
+ if (FAILED(hr))
+ return hr;
// get parent filter handle
- hFilter = m_KsObjectParent->KsGetObjectHandle();
+ hFilter = KsObjectParent->KsGetObjectHandle();
+
+ // release IKsObject
+ KsObjectParent->Release();
// query media type count
hr = KsGetMediaTypeCount(hFilter, m_PinId, &MediaTypeCount);
if (FAILED(hr) || !MediaTypeCount)
{
- OutputDebugStringW(L"COutputPin::EnumMediaTypes failed1\n");
return hr;
}
@@ -1388,7 +1819,6 @@ COutputPin::EnumMediaTypes(IEnumMediaTypes **ppEnum)
if (!MediaTypes)
{
// not enough memory
- OutputDebugStringW(L"COutputPin::EnumMediaTypes CoTaskMemAlloc\n");
return E_OUTOFMEMORY;
}
@@ -1403,7 +1833,6 @@ COutputPin::EnumMediaTypes(IEnumMediaTypes **ppEnum)
{
// failed
CoTaskMemFree(MediaTypes);
- OutputDebugStringW(L"COutputPin::EnumMediaTypes failed\n");
return hr;
}
}
@@ -1414,36 +1843,40 @@ HRESULT
STDMETHODCALLTYPE
COutputPin::QueryInternalConnections(IPin **apPin, ULONG *nPin)
{
- OutputDebugStringW(L"COutputPin::QueryInternalConnections called\n");
return E_NOTIMPL;
}
HRESULT
STDMETHODCALLTYPE
COutputPin::EndOfStream( void)
{
- OutputDebugStringW(L"COutputPin::EndOfStream called\n");
- return E_NOTIMPL;
+ /* should be called only on input pins */
+ return E_UNEXPECTED;
}
HRESULT
STDMETHODCALLTYPE
COutputPin::BeginFlush( void)
{
- OutputDebugStringW(L"COutputPin::BeginFlush called\n");
- return E_NOTIMPL;
+ /* should be called only on input pins */
+ return E_UNEXPECTED;
}
HRESULT
STDMETHODCALLTYPE
COutputPin::EndFlush( void)
{
- OutputDebugStringW(L"COutputPin::EndFlush called\n");
- return E_NOTIMPL;
+ /* should be called only on input pins */
+ return E_UNEXPECTED;
}
HRESULT
STDMETHODCALLTYPE
COutputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- OutputDebugStringW(L"COutputPin::NewSegment called\n");
- return E_NOTIMPL;
+ if (!m_Pin)
+ {
+ // we are not connected
+ return VFW_E_NOT_CONNECTED;
+ }
+
+ return m_Pin->NewSegment(tStart, tStop, dRate);
}
//-------------------------------------------------------------------
@@ -1455,12 +1888,26 @@ COutputPin::CheckFormat(
PKSMULTIPLE_ITEM MultipleItem;
PKSDATAFORMAT DataFormat;
HRESULT hr;
+ IKsObject * KsObjectParent;
+ HANDLE hFilter;
if (!pmt)
return E_POINTER;
- HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle();
- assert(hFilter != NULL);
+ // get IKsObject interface
+ hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent);
+ if (FAILED(hr))
+ return hr;
+
+ // get parent filter handle
+ hFilter = KsObjectParent->KsGetObjectHandle();
+
+ // release IKsObject
+ KsObjectParent->Release();
+
+ if (!hFilter)
+ return E_HANDLE;
+
hr = KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&MultipleItem);
if (FAILED(hr))
@@ -1475,7 +1922,6 @@ COutputPin::CheckFormat(
{
// format is supported
CoTaskMemFree(MultipleItem);
- OutputDebugStringW(L"COutputPin::CheckFormat format OK\n");
return S_OK;
}
DataFormat = (PKSDATAFORMAT)((ULONG_PTR)DataFormat + DataFormat->FormatSize);
@@ -1539,8 +1985,12 @@ COutputPin::CreatePin(
hr = CreatePinHandle(Medium, Interface, pmt);
if (FAILED(hr))
{
- m_InterfaceHandler->Release();
- m_InterfaceHandler = InterfaceHandler;
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"COutputPin::CreatePinHandle failed with %lx\n", hr);
+ OutputDebugStringW(Buffer);
+#endif
+ return hr;
}
if (!m_InterfaceHandler)
@@ -1550,7 +2000,6 @@ COutputPin::CreatePin(
if (FAILED(hr))
{
// failed to load interface handler plugin
- OutputDebugStringW(L"COutputPin::CreatePin failed to load InterfaceHandlerPlugin\n");
CoTaskMemFree(MediumList);
CoTaskMemFree(InterfaceList);
@@ -1562,7 +2011,6 @@ COutputPin::CreatePin(
if (FAILED(hr))
{
// failed to load interface handler plugin
- OutputDebugStringW(L"COutputPin::CreatePin failed to initialize InterfaceHandlerPlugin\n");
InterfaceHandler->Release();
CoTaskMemFree(MediumList);
CoTaskMemFree(InterfaceList);
@@ -1575,10 +2023,13 @@ COutputPin::CreatePin(
}
else
{
+#ifdef KSPROXY_TRACE
WCHAR Buffer[100];
swprintf(Buffer, L"COutputPin::CreatePin unexpected communication %u %s\n", m_Communication, m_PinName);
OutputDebugStringW(Buffer);
DebugBreak();
+#endif
+
hr = E_FAIL;
}
@@ -1600,6 +2051,12 @@ COutputPin::CreatePinHandle(
PKSDATAFORMAT DataFormat;
ULONG Length;
HRESULT hr;
+ HANDLE hFilter;
+ IKsObject * KsObjectParent;
+
+ //KSALLOCATOR_FRAMING Framing;
+ //KSPROPERTY Property;
+ //ULONG BytesReturned;
if (m_hPin != INVALID_HANDLE_VALUE)
{
@@ -1647,11 +2104,22 @@ COutputPin::CreatePinHandle(
CopyMemory((DataFormat + 1), pmt->pbFormat, pmt->cbFormat);
}
- HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle();
- assert(hFilter != NULL);
+ // get IKsObject interface
+ hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent);
+ if (FAILED(hr))
+ return hr;
+
+ // get parent filter handle
+ hFilter = KsObjectParent->KsGetObjectHandle();
+
+ // release IKsObject
+ KsObjectParent->Release();
+
+ if (!hFilter)
+ return E_HANDLE;
// create pin
- hr = KsCreatePin(hFilter, PinConnect, GENERIC_WRITE, &m_hPin);
+ hr = KsCreatePin(hFilter, PinConnect, GENERIC_READ, &m_hPin);
if (SUCCEEDED(hr))
{
@@ -1660,6 +2128,7 @@ COutputPin::CreatePinHandle(
CopyMemory(&m_Interface, Interface, sizeof(KSPIN_INTERFACE));
CopyMemory(&m_MediaFormat, pmt, sizeof(AM_MEDIA_TYPE));
+#ifdef KSPROXY_TRACE
LPOLESTR pMajor, pSub, pFormat;
StringFromIID(m_MediaFormat.majortype, &pMajor);
StringFromIID(m_MediaFormat.subtype , &pSub);
@@ -1670,6 +2139,7 @@ COutputPin::CreatePinHandle(
CoTaskMemFree(pSub);
CoTaskMemFree(pFormat);
OutputDebugStringW(Buffer);
+#endif
if (pmt->cbFormat)
{
@@ -1683,6 +2153,57 @@ COutputPin::CreatePinHandle(
}
CopyMemory(m_MediaFormat.pbFormat, pmt->pbFormat, pmt->cbFormat);
}
+#if 0
+ Property.Set = KSPROPSETID_Connection;
+ Property.Id = KSPROPERTY_CONNECTION_ALLOCATORFRAMING;
+ Property.Flags = KSPROPERTY_TYPE_GET;
+
+ ZeroMemory(&Framing, sizeof(KSALLOCATOR_FRAMING));
+ hr = KsProperty(&Property, sizeof(KSPROPERTY), (PVOID)&Framing, sizeof(KSALLOCATOR_FRAMING), &BytesReturned);
+ if (SUCCEEDED(hr))
+ {
+ m_Properties.cbAlign = (Framing.FileAlignment + 1);
+ m_Properties.cbBuffer = Framing.FrameSize;
+ m_Properties.cbPrefix = 0; //FIXME
+ m_Properties.cBuffers = Framing.Frames;
+ }
+ hr = S_OK;
+#endif
+
+ if (FAILED(InitializeIOThread()))
+ {
+ OutputDebugStringW(L"COutputPin::CreatePinHandle failed to initialize i/o thread\n");
+ DebugBreak();
+ }
+
+ LPGUID pGuid;
+ ULONG NumGuids = 0;
+
+ // get all supported sets
+ hr = GetSupportedSets(&pGuid, &NumGuids);
+ if (FAILED(hr))
+ {
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"CInputPin::CreatePinHandle GetSupportedSets failed\n");
+ DebugBreak();
+#endif
+ return hr;
+ }
+
+ // load all proxy plugins
+ hr = LoadProxyPlugins(pGuid, NumGuids);
+ if (FAILED(hr))
+ {
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"CInputPin::CreatePinHandle LoadProxyPlugins failed\n");
+ DebugBreak();
+#endif
+ return hr;
+ }
+
+ // free sets
+ CoTaskMemFree(pGuid);
+
//TODO
// connect pin pipes
@@ -1694,6 +2215,486 @@ COutputPin::CreatePinHandle(
return hr;
}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetSupportedSets(
+ LPGUID * pOutGuid,
+ PULONG NumGuids)
+{
+ KSPROPERTY Property;
+ LPGUID pGuid;
+ ULONG NumProperty = 0;
+ ULONG NumMethods = 0;
+ ULONG NumEvents = 0;
+ ULONG Length;
+ ULONG BytesReturned;
+ HRESULT hr;
+
+ Property.Set = GUID_NULL;
+ Property.Id = 0;
+ Property.Flags = KSPROPERTY_TYPE_SETSUPPORT;
+
+ KsSynchronousDeviceControl(m_hPin, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumProperty);
+ KsSynchronousDeviceControl(m_hPin, IOCTL_KS_METHOD, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumMethods);
+ KsSynchronousDeviceControl(m_hPin, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumEvents);
+
+ Length = NumProperty + NumMethods + NumEvents;
+
+ assert(Length);
+
+ // allocate guid buffer
+ pGuid = (LPGUID)CoTaskMemAlloc(Length);
+ if (!pGuid)
+ {
+ // failed
+ return E_OUTOFMEMORY;
+ }
+
+ NumProperty /= sizeof(GUID);
+ NumMethods /= sizeof(GUID);
+ NumEvents /= sizeof(GUID);
+
+ // get all properties
+ hr = KsSynchronousDeviceControl(m_hPin, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pGuid, Length, &BytesReturned);
+ if (FAILED(hr))
+ {
+ CoTaskMemFree(pGuid);
+ return E_FAIL;
+ }
+ Length -= BytesReturned;
+
+ // get all methods
+ if (Length && NumMethods)
+ {
+ hr = KsSynchronousDeviceControl(m_hPin, IOCTL_KS_METHOD, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&pGuid[NumProperty], Length, &BytesReturned);
+ if (FAILED(hr))
+ {
+ CoTaskMemFree(pGuid);
+ return E_FAIL;
+ }
+ Length -= BytesReturned;
+ }
+
+ // get all events
+ if (Length && NumEvents)
+ {
+ hr = KsSynchronousDeviceControl(m_hPin, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&pGuid[NumProperty+NumMethods], Length, &BytesReturned);
+ if (FAILED(hr))
+ {
+ CoTaskMemFree(pGuid);
+ return E_FAIL;
+ }
+ Length -= BytesReturned;
+ }
+
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[200];
+ swprintf(Buffer, L"NumProperty %lu NumMethods %lu NumEvents %lu\n", NumProperty, NumMethods, NumEvents);
+ OutputDebugStringW(Buffer);
+#endif
+
+ *pOutGuid = pGuid;
+ *NumGuids = NumProperty+NumEvents+NumMethods;
+ return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::LoadProxyPlugins(
+ LPGUID pGuids,
+ ULONG NumGuids)
+{
+ ULONG Index;
+ LPOLESTR pStr;
+ HKEY hKey, hSubKey;
+ HRESULT hr;
+ IUnknown * pUnknown;
+
+ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\MediaInterfaces", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
+ {
+ OutputDebugStringW(L"CKsProxy::LoadProxyPlugins failed to open MediaInterfaces key\n");
+ return E_FAIL;
+ }
+
+ // enumerate all sets
+ for(Index = 0; Index < NumGuids; Index++)
+ {
+ // convert to string
+ hr = StringFromCLSID(pGuids[Index], &pStr);
+ if (FAILED(hr))
+ return E_FAIL;
+
+ // now try open class key
+ if (RegOpenKeyExW(hKey, pStr, 0, KEY_READ, &hSubKey) != ERROR_SUCCESS)
+ {
+ // no plugin for that set exists
+ CoTaskMemFree(pStr);
+ continue;
+ }
+
+ // try load plugin
+ hr = CoCreateInstance(pGuids[Index], (IBaseFilter*)this, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnknown);
+ if (SUCCEEDED(hr))
+ {
+ // store plugin
+ m_Plugins.push_back(pUnknown);
+DebugBreak();
+ }
+ // close key
+ RegCloseKey(hSubKey);
+ }
+
+ // close media interfaces key
+ RegCloseKey(hKey);
+ return S_OK;
+}
+
+
+HRESULT
+WINAPI
+COutputPin::IoProcessRoutine()
+{
+ IMediaSample *Sample;
+ LONG SampleCount;
+ HRESULT hr;
+ PKSSTREAM_SEGMENT StreamSegment;
+ HANDLE hEvent;
+ IMediaSample * Samples[1];
+
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[200];
+#endif
+
+ // first wait for the start event to signal
+ WaitForSingleObject(m_hStartEvent, INFINITE);
+
+ assert(m_InterfaceHandler);
+ do
+ {
+ if (m_StopInProgress)
+ {
+ // stop io thread
+ break;
+ }
+
+ assert(m_State == KSSTATE_RUN);
+ assert(m_MemAllocator);
+
+ // get buffer
+ hr = m_MemAllocator->GetBuffer(&Sample, NULL, NULL, AM_GBF_NOWAIT);
+
+ if (FAILED(hr))
+ {
+ WaitForSingleObject(m_hBufferAvailable, INFINITE);
+ // now retry again
+ continue;
+ }
+
+ // fill buffer
+ SampleCount = 1;
+ Samples[0] = Sample;
+
+ Sample->SetTime(NULL, NULL);
+ hr = m_InterfaceHandler->KsProcessMediaSamples(NULL, /* FIXME */
+ Samples,
+ &SampleCount,
+ KsIoOperation_Read,
+ &StreamSegment);
+ if (FAILED(hr) || !StreamSegment)
+ {
+#ifdef KSPROXY_TRACE
+ swprintf(Buffer, L"COutputPin::IoProcessRoutine KsProcessMediaSamples FAILED PinName %s hr %lx\n", m_PinName, hr);
+ OutputDebugStringW(Buffer);
+#endif
+ break;
+ }
+
+ // get completion event
+ hEvent = StreamSegment->CompletionEvent;
+
+ // wait for i/o completion
+ WaitForSingleObject(hEvent, INFINITE);
+
+ // perform completion
+ m_InterfaceHandler->KsCompleteIo(StreamSegment);
+
+ // close completion event
+ CloseHandle(hEvent);
+
+ if (SUCCEEDED(hr))
+ {
+ assert(m_MemInputPin);
+
+ // now deliver the sample
+ hr = m_MemInputPin->Receive(Sample);
+
+#ifdef KSPROXY_TRACE
+ swprintf(Buffer, L"COutputPin::IoProcessRoutine PinName %s IMemInputPin::Receive hr %lx Sample %p m_MemAllocator %p\n", m_PinName, hr, Sample, m_MemAllocator);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (FAILED(hr))
+ break;
+
+ Sample = NULL;
+ }
+ }while(TRUE);
+
+ // signal end of i/o thread
+ SetEvent(m_hStopEvent);
+
+ m_IoThreadStarted = false;
+
+ return NOERROR;
+}
+
+DWORD
+WINAPI
+COutputPin_IoThreadStartup(
+ LPVOID lpParameter)
+{
+ COutputPin * Pin = (COutputPin*)lpParameter;
+ assert(Pin);
+
+ return Pin->IoProcessRoutine();
+}
+
+
+HRESULT
+WINAPI
+COutputPin::InitializeIOThread()
+{
+ HANDLE hThread;
+
+ if (m_IoThreadStarted)
+ return NOERROR;
+
+ if (!m_hStartEvent)
+ m_hStartEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+
+ if (!m_hStartEvent)
+ return E_OUTOFMEMORY;
+
+ if (!m_hStopEvent)
+ m_hStopEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+
+ if (!m_hStopEvent)
+ return E_OUTOFMEMORY;
+
+ if (!m_hBufferAvailable)
+ m_hBufferAvailable = CreateEventW(NULL, FALSE, FALSE, NULL);
+
+ if (!m_hBufferAvailable)
+ return E_OUTOFMEMORY;
+
+ m_StopInProgress = false;
+ m_IoThreadStarted = true;
+
+ // now create the startup thread
+ hThread = CreateThread(NULL, 0, COutputPin_IoThreadStartup, (LPVOID)this, 0, NULL);
+ if (!hThread)
+ return E_OUTOFMEMORY;
+
+
+ // close thread handle
+ CloseHandle(hThread);
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin_SetState(
+ IPin * Pin,
+ KSSTATE State)
+{
+ HRESULT hr = S_OK;
+ KSPROPERTY Property;
+ KSSTATE CurState;
+ ULONG BytesReturned;
+ COutputPin * pPin = (COutputPin*)Pin;
+
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[200];
+#endif
+
+ Property.Set = KSPROPSETID_Connection;
+ Property.Id = KSPROPERTY_CONNECTION_STATE;
+ Property.Flags = KSPROPERTY_TYPE_SET;
+
+ EnterCriticalSection(&pPin->m_Lock);
+
+ if (pPin->m_State <= State)
+ {
+ if (pPin->m_State == KSSTATE_STOP)
+ {
+ hr = pPin->InitializeIOThread();
+ if (FAILED(hr))
+ {
+ // failed to initialize I/O thread
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"Failed to initialize I/O Thread\n");
+#endif
+ LeaveCriticalSection(&pPin->m_Lock);
+ return hr;
+ }
+ CurState = KSSTATE_ACQUIRE;
+ hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned);
+
+#ifdef KSPROXY_TRACE
+ swprintf(Buffer, L"COutputPin_SetState Setting State CurState: KSSTATE_STOP KSSTATE_ACQUIRE PinName %s hr %lx\n", pPin->m_PinName, hr);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (FAILED(hr))
+ {
+ LeaveCriticalSection(&pPin->m_Lock);
+ return hr;
+ }
+
+ pPin->m_State = CurState;
+
+ if (pPin->m_State == State)
+ {
+ LeaveCriticalSection(&pPin->m_Lock);
+ return hr;
+ }
+ }
+ if (pPin->m_State == KSSTATE_ACQUIRE)
+ {
+ CurState = KSSTATE_PAUSE;
+ hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned);
+
+#ifdef KSPROXY_TRACE
+ swprintf(Buffer, L"COutputPin_SetState Setting State CurState KSSTATE_ACQUIRE KSSTATE_PAUSE PinName %s hr %lx\n", pPin->m_PinName, hr);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (FAILED(hr))
+ {
+ LeaveCriticalSection(&pPin->m_Lock);
+ return hr;
+ }
+
+ pPin->m_State = CurState;
+
+ if (pPin->m_State == State)
+ {
+ LeaveCriticalSection(&pPin->m_Lock);
+ return hr;
+ }
+ }
+ if (State == KSSTATE_RUN && pPin->m_State == KSSTATE_PAUSE)
+ {
+ CurState = KSSTATE_RUN;
+ hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned);
+
+#ifdef KSPROXY_TRACE
+ swprintf(Buffer, L"COutputPin_SetState Setting State CurState: KSSTATE_PAUSE KSSTATE_RUN PinName %s hr %lx\n", pPin->m_PinName, hr);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (SUCCEEDED(hr))
+ {
+ pPin->m_State = CurState;
+ // signal start event
+ SetEvent(pPin->m_hStartEvent);
+ }
+ }
+
+ LeaveCriticalSection(&pPin->m_Lock);
+ return hr;
+ }
+ else
+ {
+ if (pPin->m_State == KSSTATE_RUN)
+ {
+ // setting pending stop flag
+ pPin->m_StopInProgress = true;
+
+ // release any waiting threads
+ SetEvent(pPin->m_hBufferAvailable);
+
+ // wait until i/o thread is done
+ WaitForSingleObject(pPin->m_hStopEvent, INFINITE);
+
+ CurState = KSSTATE_PAUSE;
+ hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned);
+
+#ifdef KSPROXY_TRACE
+ swprintf(Buffer, L"COutputPin_SetState Setting State CurState: KSSTATE_RUN KSSTATE_PAUSE PinName %s hr %lx\n", pPin->m_PinName, hr);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (FAILED(hr))
+ {
+ LeaveCriticalSection(&pPin->m_Lock);
+ return hr;
+ }
+
+ pPin->m_State = CurState;
+
+ if (FAILED(hr))
+ {
+ LeaveCriticalSection(&pPin->m_Lock);
+ return hr;
+ }
+ }
+ if (pPin->m_State == KSSTATE_PAUSE)
+ {
+ CurState = KSSTATE_ACQUIRE;
+ hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned);
+
+#ifdef KSPROXY_TRACE
+ swprintf(Buffer, L"COutputPin_SetState Setting State CurState: KSSTATE_PAUSE KSSTATE_ACQUIRE PinName %s hr %lx\n", pPin->m_PinName, hr);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (FAILED(hr))
+ {
+ LeaveCriticalSection(&pPin->m_Lock);
+ return hr;
+ }
+
+ pPin->m_State = CurState;
+
+ if (pPin->m_State == State)
+ {
+ LeaveCriticalSection(&pPin->m_Lock);
+ return hr;
+ }
+ }
+
+ CloseHandle(pPin->m_hStopEvent);
+ CloseHandle(pPin->m_hStartEvent);
+ CloseHandle(pPin->m_hBufferAvailable);
+
+ /* close event handles */
+ pPin->m_hStopEvent = NULL;
+ pPin->m_hStartEvent = NULL;
+ pPin->m_hBufferAvailable = NULL;
+
+ CurState = KSSTATE_STOP;
+ hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned);
+
+#ifdef KSPROXY_TRACE
+ swprintf(Buffer, L"COutputPin_SetState Setting State CurState: KSSTATE_ACQUIRE KSSTATE_STOP PinName %s hr %lx\n", pPin->m_PinName, hr);
+ OutputDebugStringW(Buffer);
+#endif
+
+ if (SUCCEEDED(hr))
+ {
+ // store state
+ pPin->m_State = CurState;
+ }
+
+ // unset pending stop flag
+ pPin->m_StopInProgress = false;
+
+ LeaveCriticalSection(&pPin->m_Lock);
+ return hr;
+ }
+}
+
HRESULT
WINAPI
COutputPin_Constructor(
diff --git a/dll/directx/ksproxy/precomp.h b/dll/directx/ksproxy/precomp.h
index 6df3ddfc597..eae5de0f1aa 100644
--- a/dll/directx/ksproxy/precomp.h
+++ b/dll/directx/ksproxy/precomp.h
@@ -3,6 +3,7 @@
#define _FORCENAMELESSUNION
#define BUILDING_KS
#define _KSDDK_
+//#define KSPROXY_TRACE
#include
//#include
#include
@@ -18,6 +19,8 @@
#include
#include
#include
+#include
+#include
#include
#include
//#include
@@ -138,6 +141,12 @@ COutputPin_Constructor(
REFIID riid,
LPVOID * ppv);
+HRESULT
+STDMETHODCALLTYPE
+COutputPin_SetState(
+ IPin * Pin,
+ KSSTATE State);
+
/* enumpins.cpp */
HRESULT
WINAPI
@@ -166,10 +175,30 @@ CKsNode_Constructor(
REFIID riid,
LPVOID * ppv);
+/* allocator.cpp */
+HRESULT
+WINAPI
+CKsAllocator_Constructor(
+ IUnknown * pUnkOuter,
+ REFIID riid,
+ LPVOID * ppv);
+
+/* mediasample.cpp */
+HRESULT
+WINAPI
+CMediaSample_Constructor(
+ IMemAllocator* Allocator,
+ BYTE* pBuffer,
+ ULONG BufferSize,
+ REFIID riid,
+ LPVOID * ppv);
+
+
extern const GUID IID_IKsObject;
extern const GUID IID_IKsPinEx;
extern const GUID IID_IKsAggregateControl;
extern const GUID IID_IKsPinPipe;
extern const GUID IID_IKsPinFactory;
+extern const GUID IID_IKsAllocatorEx;
extern KSPIN_INTERFACE StandardPinInterface;
extern KSPIN_MEDIUM StandardPinMedium;
diff --git a/dll/directx/ksproxy/proxy.cpp b/dll/directx/ksproxy/proxy.cpp
index 39d63863119..bd34ec8184b 100644
--- a/dll/directx/ksproxy/proxy.cpp
+++ b/dll/directx/ksproxy/proxy.cpp
@@ -63,7 +63,7 @@ public:
InterlockedDecrement(&m_Ref);
if (!m_Ref)
{
- delete this;
+ //delete this;
return 0;
}
return m_Ref;
@@ -171,7 +171,7 @@ public:
HRESULT STDMETHODCALLTYPE GetPages(CAUUID *pPages);
- CKsProxy() : m_Ref(0), m_pGraph(0), m_ReferenceClock((IReferenceClock*)this), m_FilterState(State_Stopped), m_hDevice(0), m_Plugins(), m_Pins(), m_DevicePath(0), m_hClock(0) {};
+ CKsProxy();
~CKsProxy()
{
if (m_hDevice)
@@ -203,8 +203,23 @@ protected:
LPWSTR m_DevicePath;
CLSID m_DeviceInterfaceGUID;
HANDLE m_hClock;
+ CRITICAL_SECTION m_Lock;
};
+CKsProxy::CKsProxy() : m_Ref(0),
+ m_pGraph(0),
+ m_ReferenceClock((IReferenceClock*)this),
+ m_FilterState(State_Stopped),
+ m_hDevice(0),
+ m_Plugins(),
+ m_Pins(),
+ m_DevicePath(0),
+ m_hClock(0)
+{
+ InitializeCriticalSection(&m_Lock);
+}
+
+
HRESULT
STDMETHODCALLTYPE
CKsProxy::QueryInterface(
@@ -332,24 +347,26 @@ CKsProxy::QueryInterface(
HRESULT hr = m_Plugins[Index]->QueryInterface(refiid, Output);
if (SUCCEEDED(hr))
{
+#ifdef KSPROXY_TRACE
WCHAR Buffer[100];
LPOLESTR lpstr;
StringFromCLSID(refiid, &lpstr);
swprintf(Buffer, L"CKsProxy::QueryInterface plugin %lu supports interface %s\n", Index, lpstr);
OutputDebugStringW(Buffer);
CoTaskMemFree(lpstr);
+#endif
return hr;
}
}
}
-
+#ifdef KSPROXY_TRACE
WCHAR Buffer[MAX_PATH];
LPOLESTR lpstr;
StringFromCLSID(refiid, &lpstr);
swprintf(Buffer, L"CKsProxy::QueryInterface: NoInterface for %s !!!\n", lpstr);
OutputDebugStringW(Buffer);
CoTaskMemFree(lpstr);
-
+#endif
return E_NOINTERFACE;
}
@@ -362,7 +379,9 @@ HRESULT
STDMETHODCALLTYPE
CKsProxy::GetPages(CAUUID *pPages)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::GetPages NotImplemented\n");
+#endif
if (!pPages)
return E_POINTER;
@@ -478,7 +497,10 @@ STDMETHODCALLTYPE
CKsProxy::KsGetTime(
LONGLONG* Time)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsGetTime\n");
+#endif
+
return PerformClockProperty(KSPROPERTY_CLOCK_TIME, KSPROPERTY_TYPE_GET, (PVOID)Time, sizeof(LONGLONG));
}
@@ -487,7 +509,10 @@ STDMETHODCALLTYPE
CKsProxy::KsSetTime(
LONGLONG Time)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsSetTime\n");
+#endif
+
return PerformClockProperty(KSPROPERTY_CLOCK_TIME, KSPROPERTY_TYPE_SET, (PVOID)&Time, sizeof(LONGLONG));
}
@@ -496,7 +521,10 @@ STDMETHODCALLTYPE
CKsProxy::KsGetPhysicalTime(
LONGLONG* Time)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsGetPhysicalTime\n");
+#endif
+
return PerformClockProperty(KSPROPERTY_CLOCK_PHYSICALTIME, KSPROPERTY_TYPE_GET, (PVOID)Time, sizeof(LONGLONG));
}
@@ -505,7 +533,10 @@ STDMETHODCALLTYPE
CKsProxy::KsSetPhysicalTime(
LONGLONG Time)
{
- OutputDebugStringW(L"CKsProxy::KsSetPhysicalTime NotImplemented\n");
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"CKsProxy::KsSetPhysicalTime\n");
+#endif
+
return PerformClockProperty(KSPROPERTY_CLOCK_PHYSICALTIME, KSPROPERTY_TYPE_SET, (PVOID)&Time, sizeof(LONGLONG));
}
@@ -514,7 +545,10 @@ STDMETHODCALLTYPE
CKsProxy::KsGetCorrelatedTime(
KSCORRELATED_TIME* CorrelatedTime)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsGetCorrelatedTime\n");
+#endif
+
return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDTIME, KSPROPERTY_TYPE_GET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME));
}
@@ -523,7 +557,9 @@ STDMETHODCALLTYPE
CKsProxy::KsSetCorrelatedTime(
KSCORRELATED_TIME* CorrelatedTime)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsSetCorrelatedTime\n");
+#endif
return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDTIME, KSPROPERTY_TYPE_SET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME));
}
@@ -532,7 +568,9 @@ STDMETHODCALLTYPE
CKsProxy::KsGetCorrelatedPhysicalTime(
KSCORRELATED_TIME* CorrelatedTime)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsGetCorrelatedPhysicalTime\n");
+#endif
return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, KSPROPERTY_TYPE_GET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME));
}
@@ -541,7 +579,10 @@ STDMETHODCALLTYPE
CKsProxy::KsSetCorrelatedPhysicalTime(
KSCORRELATED_TIME* CorrelatedTime)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsSetCorrelatedPhysicalTime\n");
+#endif
+
return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, KSPROPERTY_TYPE_SET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME));
}
@@ -550,7 +591,9 @@ STDMETHODCALLTYPE
CKsProxy::KsGetResolution(
KSRESOLUTION* Resolution)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsGetResolution\n");
+#endif
return PerformClockProperty(KSPROPERTY_CLOCK_RESOLUTION, KSPROPERTY_TYPE_GET, (PVOID)Resolution, sizeof(KSRESOLUTION));
}
@@ -559,7 +602,9 @@ STDMETHODCALLTYPE
CKsProxy::KsGetState(
KSSTATE* State)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsGetState\n");
+#endif
return PerformClockProperty(KSPROPERTY_CLOCK_STATE, KSPROPERTY_TYPE_GET, (PVOID)State, sizeof(KSSTATE));
}
@@ -575,7 +620,9 @@ CKsProxy::GetTime(
KSPROPERTY Property;
ULONG BytesReturned;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::GetTime\n");
+#endif
if (!pTime)
return E_POINTER;
@@ -620,7 +667,9 @@ CKsProxy::AdviseTime(
ULONG BytesReturned;
PKSEVENT_TIME_MARK Event;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::AdviseTime\n");
+#endif
//
//FIXME locks
@@ -686,7 +735,9 @@ CKsProxy::AdvisePeriodic(
ULONG BytesReturned;
PKSEVENT_TIME_INTERVAL Event;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::AdvisePeriodic\n");
+#endif
//
//FIXME locks
@@ -748,7 +799,9 @@ CKsProxy::Unadvise(
HRESULT hr;
ULONG BytesReturned;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::Unadvise\n");
+#endif
if (m_hClock)
{
@@ -786,7 +839,10 @@ CKsProxy::GetCapabilities(
Property.Id = KSPROPERTY_MEDIASEEKING_CAPABILITIES;
Property.Flags = KSPROPERTY_TYPE_GET;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::GetCapabilities\n");
+#endif
+
if (!pCapabilities)
return E_POINTER;
@@ -836,7 +892,9 @@ CKsProxy::CheckCapabilities(
DWORD Capabilities;
HRESULT hr;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::CheckCapabilities\n");
+#endif
if (!pCapabilities)
return E_POINTER;
@@ -914,11 +972,13 @@ CKsProxy::IsFormatSupported(
ULONG Index;
HRESULT hr = S_FALSE;
+#ifdef KSPROXY_TRACE
WCHAR Buffer[100];
LPOLESTR pstr;
StringFromCLSID(*pFormat, &pstr);
swprintf(Buffer, L"CKsProxy::IsFormatSupported %s\n",pstr);
OutputDebugStringW(Buffer);
+#endif
if (!pFormat)
return E_POINTER;
@@ -927,8 +987,10 @@ CKsProxy::IsFormatSupported(
hr = GetMediaSeekingFormats(&FormatList);
if (SUCCEEDED(hr))
{
+#ifdef KSPROXY_TRACE
swprintf(Buffer, L"CKsProxy::IsFormatSupported NumFormat %lu\n",FormatList->Count);
OutputDebugStringW(Buffer);
+#endif
//iterate through format list
pGuid = (LPGUID)(FormatList + 1);
@@ -961,7 +1023,9 @@ CKsProxy::IsFormatSupported(
{
// plugin does not support interface
hr = S_FALSE;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::IsFormatSupported plugin does not support IMediaSeeking interface\n");
+#endif
break;
}
@@ -986,7 +1050,9 @@ CKsProxy::QueryPreferredFormat(
HRESULT hr;
ULONG Index;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::QueryPreferredFormat\n");
+#endif
if (!pFormat)
return E_POINTER;
@@ -1046,7 +1112,9 @@ CKsProxy::GetTimeFormat(
Property.Id = KSPROPERTY_MEDIASEEKING_TIMEFORMAT;
Property.Flags = KSPROPERTY_TYPE_GET;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::GetTimeFormat\n");
+#endif
hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pFormat, sizeof(GUID), &BytesReturned);
if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
@@ -1086,7 +1154,9 @@ CKsProxy::IsUsingTimeFormat(
{
GUID Format;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::IsUsingTimeFormat\n");
+#endif
if (FAILED(QueryPreferredFormat(&Format)))
return S_FALSE;
@@ -1110,7 +1180,9 @@ CKsProxy::SetTimeFormat(
Property.Id = KSPROPERTY_MEDIASEEKING_TIMEFORMAT;
Property.Flags = KSPROPERTY_TYPE_SET;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::SetTimeFormat\n");
+#endif
hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pFormat, sizeof(GUID), &BytesReturned);
if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
@@ -1158,7 +1230,9 @@ CKsProxy::GetDuration(
Property.Id = KSPROPERTY_MEDIASEEKING_DURATION;
Property.Flags = KSPROPERTY_TYPE_GET;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::GetDuration\n");
+#endif
hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pDuration, sizeof(LONGLONG), &BytesReturned);
if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
@@ -1204,7 +1278,9 @@ CKsProxy::GetStopPosition(
Property.Id = KSPROPERTY_MEDIASEEKING_STOPPOSITION;
Property.Flags = KSPROPERTY_TYPE_GET;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::GetStopPosition\n");
+#endif
hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pStop, sizeof(LONGLONG), &BytesReturned);
if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
@@ -1250,7 +1326,9 @@ CKsProxy::GetCurrentPosition(
Property.Id = KSPROPERTY_MEDIASEEKING_POSITION;
Property.Flags = KSPROPERTY_TYPE_GET;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::GetCurrentPosition\n");
+#endif
hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pCurrent, sizeof(LONGLONG), &BytesReturned);
if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
@@ -1300,7 +1378,9 @@ CKsProxy::ConvertTimeFormat(
Property.Property.Id = KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT;
Property.Property.Flags = KSPROPERTY_TYPE_GET;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::ConvertTimeFormat\n");
+#endif
if (!pTargetFormat)
{
@@ -1383,7 +1463,9 @@ CKsProxy::SetPositions(
Positions.Stop = *pStop;
Positions.StopFlags = (KS_SEEKING_FLAGS)dwStopFlags;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::SetPositions\n");
+#endif
hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&Positions, sizeof(KSPROPERTY_POSITIONS), &BytesReturned);
if (SUCCEEDED(hr))
@@ -1444,7 +1526,9 @@ CKsProxy::GetPositions(
{
HRESULT hr;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::GetPositions\n");
+#endif
hr = GetCurrentPosition(pCurrent);
if (SUCCEEDED(hr))
@@ -1468,7 +1552,9 @@ CKsProxy::GetAvailable(
Property.Id = KSPROPERTY_MEDIASEEKING_AVAILABLE;
Property.Flags = KSPROPERTY_TYPE_GET;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::GetAvailable\n");
+#endif
hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&Media, sizeof(KSPROPERTY_MEDIAAVAILABLE), &BytesReturned);
if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
@@ -1512,7 +1598,9 @@ STDMETHODCALLTYPE
CKsProxy::SetRate(
double dRate)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::SetRate\n");
+#endif
return E_NOTIMPL;
}
@@ -1521,7 +1609,9 @@ STDMETHODCALLTYPE
CKsProxy::GetRate(
double *pdRate)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::GetRate\n");
+#endif
return E_NOTIMPL;
}
@@ -1538,7 +1628,9 @@ CKsProxy::GetPreroll(
Property.Id = KSPROPERTY_MEDIASEEKING_PREROLL;
Property.Flags = KSPROPERTY_TYPE_GET;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::GetPreroll\n");
+#endif
hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pllPreroll, sizeof(LONGLONG), &BytesReturned);
if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
@@ -1584,7 +1676,7 @@ CKsProxy::GetMiscFlags()
HRESULT hr;
PIN_DIRECTION PinDirection;
KSPIN_COMMUNICATION Communication;
- WCHAR Buffer[100];
+
for(Index = 0; Index < m_Pins.size(); Index++)
{
@@ -1599,7 +1691,7 @@ CKsProxy::GetMiscFlags()
if (SUCCEEDED(GetPinCommunication(Index, //FIXME verify PinId
&Communication)))
{
- if (Communication == KSPIN_COMMUNICATION_NONE || Communication == KSPIN_COMMUNICATION_BRIDGE)
+ if (Communication != KSPIN_COMMUNICATION_NONE && Communication != KSPIN_COMMUNICATION_BRIDGE)
{
Flags |= AM_FILTER_MISC_FLAGS_IS_SOURCE;
}
@@ -1608,8 +1700,12 @@ CKsProxy::GetMiscFlags()
}
}
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[100];
swprintf(Buffer, L"CKsProxy::GetMiscFlags stub Flags %x\n", Flags);
OutputDebugStringW(Buffer);
+#endif
+
return Flags;
}
@@ -1625,8 +1721,11 @@ CKsProxy::KsProperty(
ULONG DataLength,
ULONG* BytesReturned)
{
- assert(m_hDevice != 0);
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsProperty\n");
+#endif
+
+ assert(m_hDevice != 0);
return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)Property, PropertyLength, (PVOID)PropertyData, DataLength, BytesReturned);
}
@@ -1639,8 +1738,11 @@ CKsProxy::KsMethod(
ULONG DataLength,
ULONG* BytesReturned)
{
- assert(m_hDevice != 0);
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsMethod\n");
+#endif
+
+ assert(m_hDevice != 0);
return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_METHOD, (PVOID)Method, MethodLength, (PVOID)MethodData, DataLength, BytesReturned);
}
@@ -1653,8 +1755,11 @@ CKsProxy::KsEvent(
ULONG DataLength,
ULONG* BytesReturned)
{
- assert(m_hDevice != 0);
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsEvent\n");
+#endif
+
+ assert(m_hDevice != 0);
if (EventLength)
return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_ENABLE_EVENT, (PVOID)Event, EventLength, (PVOID)EventData, DataLength, BytesReturned);
else
@@ -1677,7 +1782,9 @@ CKsProxy::Set(
{
ULONG BytesReturned;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::Set\n");
+#endif
if (cbInstanceData)
{
@@ -1721,7 +1828,9 @@ CKsProxy::Get(
{
ULONG BytesReturned;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::Get\n");
+#endif
if (cbInstanceData)
{
@@ -1762,7 +1871,9 @@ CKsProxy::QuerySupported(
KSPROPERTY Property;
ULONG BytesReturned;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::QuerySupported\n");
+#endif
Property.Set = guidPropSet;
Property.Id = dwPropID;
@@ -1787,7 +1898,9 @@ CKsProxy::CreateNodeInstance(
{
HRESULT hr;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::CreateNodeInstance\n");
+#endif
*Interface = NULL;
@@ -1812,7 +1925,9 @@ STDMETHODCALLTYPE
CKsProxy::KsAddAggregate(
IN REFGUID AggregateClass)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsAddAggregate NotImplemented\n");
+#endif
return E_NOTIMPL;
}
@@ -1821,7 +1936,10 @@ STDMETHODCALLTYPE
CKsProxy::KsRemoveAggregate(
REFGUID AggregateClass)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsRemoveAggregate NotImplemented\n");
+#endif
+
return E_NOTIMPL;
}
@@ -1834,8 +1952,10 @@ HRESULT
STDMETHODCALLTYPE
CKsProxy::IsDirty()
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::IsDirty Notimplemented\n");
DebugBreak();
+#endif
return E_NOTIMPL;
}
@@ -1853,7 +1973,9 @@ CKsProxy::Load(
ULONG PinId;
LPOLESTR pMajor, pSub, pFormat;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::Load\n");
+#endif
#if 0
ULONG Version = ReadInt(pStm, hr);
@@ -1923,7 +2045,10 @@ CKsProxy::Save(
IStream *pStm,
BOOL fClearDirty)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::Save Notimplemented\n");
+#endif
+
return E_NOTIMPL;
}
@@ -1932,8 +2057,11 @@ STDMETHODCALLTYPE
CKsProxy::GetSizeMax(
ULARGE_INTEGER *pcbSize)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::GetSizeMax Notimplemented\n");
DebugBreak();
+#endif
+
return E_NOTIMPL;
}
@@ -1945,8 +2073,9 @@ HRESULT
STDMETHODCALLTYPE
CKsProxy::DeviceInfo(CLSID *pclsidInterfaceClass, LPWSTR *pwszSymbolicLink)
{
-
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::DeviceInfo\n");
+#endif
if (!m_DevicePath)
{
@@ -1971,7 +2100,9 @@ HRESULT
STDMETHODCALLTYPE
CKsProxy::Reassociate(void)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::Reassociate\n");
+#endif
if (!m_DevicePath || m_hDevice)
{
@@ -1994,7 +2125,9 @@ HRESULT
STDMETHODCALLTYPE
CKsProxy::Disassociate(void)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::Disassociate\n");
+#endif
if (!m_hDevice)
return E_HANDLE;
@@ -2012,7 +2145,10 @@ HANDLE
STDMETHODCALLTYPE
CKsProxy::KsGetClockHandle()
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsGetClockHandle\n");
+#endif
+
return m_hClock;
}
@@ -2025,7 +2161,10 @@ HANDLE
STDMETHODCALLTYPE
CKsProxy::KsGetObjectHandle()
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::KsGetObjectHandle\n");
+#endif
+
return m_hDevice;
}
@@ -2036,7 +2175,10 @@ HRESULT
STDMETHODCALLTYPE
CKsProxy::InitNew( void)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::InitNew\n");
+#endif
+
return S_OK;
}
@@ -2323,7 +2465,6 @@ CKsProxy::CreatePins()
KSPIN_DATAFLOW DataFlow;
KSPIN_COMMUNICATION Communication;
HRESULT hr;
- WCHAR Buffer[100];
LPWSTR PinName;
IPin * pPin;
ULONG InputPin = 0;
@@ -2390,8 +2531,12 @@ CKsProxy::CreatePins()
// store pins
m_Pins.push_back(pPin);
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[100];
swprintf(Buffer, L"Index %lu DataFlow %lu Name %s\n", Index, DataFlow, PinName);
OutputDebugStringW(Buffer);
+#endif
+
}
return S_OK;
@@ -2402,14 +2547,16 @@ STDMETHODCALLTYPE
CKsProxy::Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog)
{
HRESULT hr;
- WCHAR Buffer[100];
VARIANT varName;
LPGUID pGuid;
ULONG NumGuids = 0;
HDEVINFO hList;
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[100];
OutputDebugStringW(L"CKsProxy::Load\n");
+#endif
// read device path
varName.vt = VT_BSTR;
@@ -2417,14 +2564,18 @@ CKsProxy::Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog)
if (FAILED(hr))
{
+#ifdef KSPROXY_TRACE
swprintf(Buffer, L"CKsProxy::Load Read %lx\n", hr);
OutputDebugStringW(Buffer);
+#endif
return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
}
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"DevicePath: ");
OutputDebugStringW(varName.bstrVal);
OutputDebugStringW(L"\n");
+#endif
// create device list
hList = SetupDiCreateDeviceInfoListExW(NULL, NULL, NULL, NULL);
@@ -2453,9 +2604,10 @@ CKsProxy::Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog)
if (m_hDevice == INVALID_HANDLE_VALUE)
{
// failed to open device
+#ifdef KSPROXY_TRACE
swprintf(Buffer, L"CKsProxy:: failed to open device with %lx\n", GetLastError());
OutputDebugStringW(Buffer);
-
+#endif
return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
}
@@ -2493,7 +2645,9 @@ HRESULT
STDMETHODCALLTYPE
CKsProxy::Save(IPropertyBag *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::Save\n");
+#endif
return E_NOTIMPL;
}
@@ -2506,7 +2660,9 @@ STDMETHODCALLTYPE
CKsProxy::GetClassID(
CLSID *pClassID)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::GetClassID\n");
+#endif
CopyMemory(pClassID, &CLSID_Proxy, sizeof(GUID));
return S_OK;
@@ -2516,8 +2672,21 @@ HRESULT
STDMETHODCALLTYPE
CKsProxy::Stop()
{
- OutputDebugStringW(L"CKsProxy::Stop : NotImplemented\n");
- return E_NOTIMPL;
+ HRESULT hr;
+
+#ifdef KSPROXY_TRACE
+ OutputDebugStringW(L"CKsProxy::Stop\n");
+#endif
+
+ EnterCriticalSection(&m_Lock);
+
+ hr = SetPinState(KSSTATE_STOP);
+ if (SUCCEEDED(hr))
+ m_FilterState = State_Stopped;
+
+ LeaveCriticalSection(&m_Lock);
+
+ return hr;
}
HRESULT
@@ -2526,17 +2695,28 @@ CKsProxy::Pause()
{
HRESULT hr = S_OK;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::Pause\n");
+#endif
- if (m_FilterState == State_Stopped)
+ EnterCriticalSection(&m_Lock);
+
+ if (m_FilterState == State_Running)
{
- hr = SetPinState(KSSTATE_PAUSE);
- if (FAILED(hr))
- return hr;
-
+ hr = SetPinState(KSSTATE_STOP);
+ }
+ if (SUCCEEDED(hr))
+ {
+ if (m_FilterState == State_Stopped)
+ {
+ hr = SetPinState(KSSTATE_PAUSE);
+ }
}
- m_FilterState = State_Paused;
+ if (SUCCEEDED(hr))
+ m_FilterState = State_Paused;
+
+ LeaveCriticalSection(&m_Lock);
return hr;
}
@@ -2548,23 +2728,32 @@ CKsProxy::Run(
{
HRESULT hr;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::Run\n");
+#endif
+
+ EnterCriticalSection(&m_Lock);
if (m_FilterState == State_Stopped)
{
+ LeaveCriticalSection(&m_Lock);
// setting filter state to pause
hr = Pause();
if (FAILED(hr))
return hr;
+ EnterCriticalSection(&m_Lock);
assert(m_FilterState == State_Paused);
}
hr = SetPinState(KSSTATE_RUN);
- if (FAILED(hr))
- return hr;
- m_FilterState = State_Running;
+ if (SUCCEEDED(hr))
+ {
+ m_FilterState = State_Running;
+ }
+
+ LeaveCriticalSection(&m_Lock);
return hr;
}
@@ -2578,6 +2767,7 @@ CKsProxy::SetPinState(
IKsObject *pObject;
ULONG BytesReturned;
KSPROPERTY Property;
+ PIN_INFO PinInfo;
Property.Set = KSPROPSETID_Connection;
Property.Id = KSPROPERTY_CONNECTION_STATE;
@@ -2602,6 +2792,22 @@ CKsProxy::SetPinState(
// release connected pin
TempPin->Release();
+ // query for the pin info
+ hr = Pin->QueryPinInfo(&PinInfo);
+
+ if (SUCCEEDED(hr))
+ {
+ if (PinInfo.pFilter)
+ PinInfo.pFilter->Release();
+
+ if (PinInfo.dir == PINDIR_OUTPUT)
+ {
+ hr = COutputPin_SetState(Pin, State);
+ if (SUCCEEDED(hr))
+ continue;
+ }
+ }
+
//query IKsObject interface
hr = Pin->QueryInterface(IID_IKsObject, (void**)&pObject);
@@ -2614,9 +2820,11 @@ CKsProxy::SetPinState(
// now set state
hr = KsSynchronousDeviceControl(hPin, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&State, sizeof(KSSTATE), &BytesReturned);
+#ifdef KSPROXY_TRACE
WCHAR Buffer[100];
swprintf(Buffer, L"CKsProxy::SetPinState Index %u State %u hr %lx\n", Index, State, hr);
OutputDebugStringW(Buffer);
+#endif
if (FAILED(hr))
return hr;
@@ -2630,6 +2838,9 @@ CKsProxy::GetState(
DWORD dwMilliSecsTimeout,
FILTER_STATE *State)
{
+ if (!State)
+ return E_POINTER;
+
*State = m_FilterState;
return S_OK;
}
@@ -2649,8 +2860,9 @@ CKsProxy::SetSyncSource(
ULONG BytesReturned;
PIN_DIRECTION PinDir;
-// Plug In Distributor: IKsClock
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::SetSyncSource\n");
+#endif
// FIXME
// need locks
@@ -2744,7 +2956,9 @@ CKsProxy::SetSyncSource(
}
m_ReferenceClock = pClock;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::SetSyncSource done\n");
+#endif
return S_OK;
}
@@ -2753,7 +2967,9 @@ STDMETHODCALLTYPE
CKsProxy::GetSyncSource(
IReferenceClock **pClock)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::GetSyncSource\n");
+#endif
if (!pClock)
return E_POINTER;
@@ -2770,7 +2986,10 @@ STDMETHODCALLTYPE
CKsProxy::EnumPins(
IEnumPins **ppEnum)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::EnumPins\n");
+#endif
+
return CEnumPins_fnConstructor(m_Pins, IID_IEnumPins, (void**)ppEnum);
}
@@ -2781,7 +3000,9 @@ CKsProxy::FindPin(
{
ULONG PinId;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::FindPin\n");
+#endif
if (!ppPin)
return E_POINTER;
@@ -2817,7 +3038,9 @@ CKsProxy::QueryFilterInfo(
if (!pInfo)
return E_POINTER;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::QueryFilterInfo\n");
+#endif
pInfo->achName[0] = L'\0';
pInfo->pGraph = m_pGraph;
@@ -2834,7 +3057,11 @@ CKsProxy::JoinFilterGraph(
IFilterGraph *pGraph,
LPCWSTR pName)
{
- OutputDebugStringW(L"CKsProxy::JoinFilterGraph\n");
+#ifdef KSPROXY_TRACE
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CKsProxy::JoinFilterGraph pName %s pGraph %p m_Ref %u\n", pName, pGraph, m_Ref);
+ OutputDebugStringW(Buffer);
+#endif
if (pGraph)
{
@@ -2856,7 +3083,9 @@ STDMETHODCALLTYPE
CKsProxy::QueryVendorInfo(
LPWSTR *pVendorInfo)
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::QueryVendorInfo\n");
+#endif
return StringFromCLSID(CLSID_Proxy, pVendorInfo);
}
@@ -2868,7 +3097,10 @@ HRESULT
STDMETHODCALLTYPE
CKsProxy::Register()
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::Register : NotImplemented\n");
+#endif
+
return E_NOTIMPL;
}
@@ -2876,7 +3108,9 @@ HRESULT
STDMETHODCALLTYPE
CKsProxy::Unregister()
{
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsProxy::Unregister : NotImplemented\n");
+#endif
return E_NOTIMPL;
}
@@ -2887,11 +3121,13 @@ CKsProxy_Constructor(
REFIID riid,
LPVOID * ppv)
{
+#ifdef KSPROXY_TRACE
WCHAR Buffer[100];
LPOLESTR pstr;
StringFromCLSID(riid, &pstr);
swprintf(Buffer, L"CKsProxy_Constructor pUnkOuter %p riid %s\n", pUnkOuter, pstr);
OutputDebugStringW(Buffer);
+#endif
CKsProxy * handler = new CKsProxy();
diff --git a/dll/directx/ksproxy/qualityforward.cpp b/dll/directx/ksproxy/qualityforward.cpp
index 88459d8275d..df693b20e3a 100644
--- a/dll/directx/ksproxy/qualityforward.cpp
+++ b/dll/directx/ksproxy/qualityforward.cpp
@@ -88,7 +88,9 @@ STDMETHODCALLTYPE
CKsQualityForwarder::KsFlushClient(
IN IKsPin *Pin)
{
+#ifdef KSPROXY_TRACE
OutputDebugString("UNIMPLEMENTED\n");
+#endif
}
HRESULT
@@ -101,14 +103,18 @@ CKsQualityForwarder_Constructor(
HRESULT hr;
HANDLE handle;
+#ifdef KSPROXY_TRACE
OutputDebugStringW(L"CKsQualityForwarder_Constructor\n");
+#endif
// open default clock
hr = KsOpenDefaultDevice(KSCATEGORY_QUALITY, GENERIC_READ | GENERIC_WRITE, &handle);
if (hr != NOERROR)
{
+#ifdef KSPROXY_TRACE
OutputDebugString("CKsClockForwarder_Constructor failed to open device\n");
+#endif
return hr;
}
diff --git a/dll/directx/msdvbnp/msdvbnp.cpp b/dll/directx/msdvbnp/msdvbnp.cpp
index 037a67ef717..2b80a7717bc 100644
--- a/dll/directx/msdvbnp/msdvbnp.cpp
+++ b/dll/directx/msdvbnp/msdvbnp.cpp
@@ -9,8 +9,6 @@
#include "precomp.h"
-const GUID CLSID_DVBTNetworkProvider = {0x216c62df, 0x6d7f, 0x4e9a, {0x85, 0x71, 0x5, 0xf1, 0x4e, 0xdb, 0x76, 0x6a}};
-
static INTERFACE_TABLE InterfaceTable[] =
{
{&CLSID_DVBTNetworkProvider, CNetworkProvider_fnConstructor},
diff --git a/dll/directx/msdvbnp/networkprovider.cpp b/dll/directx/msdvbnp/networkprovider.cpp
index c69c2336e48..be7fee28cc5 100644
--- a/dll/directx/msdvbnp/networkprovider.cpp
+++ b/dll/directx/msdvbnp/networkprovider.cpp
@@ -8,11 +8,15 @@
*/
#include "precomp.h"
+#define DEVICE_FILTER_MASK (0x80000000)
+
class CNetworkProvider : public IBaseFilter,
public IAMovieSetup,
public IBDA_NetworkProvider
{
public:
+ typedef std::vectorDeviceFilterStack;
+
STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
STDMETHODIMP_(ULONG) AddRef()
@@ -58,7 +62,7 @@ public:
HRESULT STDMETHODCALLTYPE RegisterDeviceFilter(IUnknown *pUnkFilterControl, ULONG *ppvRegisitrationContext);
HRESULT STDMETHODCALLTYPE UnRegisterDeviceFilter(ULONG pvRegistrationContext);
- CNetworkProvider() : m_Ref(0), m_pGraph(0), m_ReferenceClock(0), m_FilterState(State_Stopped) {m_Pins[0] = 0;};
+ CNetworkProvider(LPCGUID ClassID);
virtual ~CNetworkProvider(){};
protected:
@@ -67,6 +71,9 @@ protected:
IReferenceClock * m_ReferenceClock;
FILTER_STATE m_FilterState;
IPin * m_Pins[1];
+ GUID m_ClassID;
+ DeviceFilterStack m_DeviceFilters;
+ IScanningTuner * m_Tuner;
};
HRESULT
@@ -75,6 +82,9 @@ CNetworkProvider::QueryInterface(
IN REFIID refiid,
OUT PVOID* Output)
{
+ ULONG Index;
+ HRESULT hr;
+
*Output = NULL;
if (IsEqualGUID(refiid, IID_IUnknown))
@@ -94,7 +104,47 @@ CNetworkProvider::QueryInterface(
IsEqualGUID(refiid, IID_IScanningTuner))
{
// construct scanning tuner
- return CScanningTunner_fnConstructor(NULL, refiid, Output);
+ if (!m_Tuner)
+ {
+ HRESULT hr = CScanningTunner_fnConstructor(m_DeviceFilters, refiid, (void**)&m_Tuner);
+ if (FAILED(hr))
+ return hr;
+ }
+ m_Tuner->AddRef();
+ *Output = (IUnknown*)m_Tuner;
+
+ return NOERROR;
+ }
+
+ if (IsEqualGUID(refiid, IID_IBDA_NetworkProvider))
+ {
+ *Output = (IBDA_NetworkProvider*)(this);
+ reinterpret_cast(*Output)->AddRef();
+ return NOERROR;
+ }
+
+ for(Index = 0; Index < m_DeviceFilters.size(); Index++)
+ {
+ // get device filter
+ IUnknown *pFilter = m_DeviceFilters[Index];
+
+ if (!pFilter)
+ continue;
+
+ // query for requested interface
+ hr = pFilter->QueryInterface(refiid, Output);
+ if (SUCCEEDED(hr))
+ {
+#ifdef MSDVBNP_TRACE
+ WCHAR Buffer[MAX_PATH];
+ LPOLESTR lpstr;
+ StringFromCLSID(refiid, &lpstr);
+ swprintf(Buffer, L"CNetworkProvider::QueryInterface: DeviceFilter %lu supports %s !!!\n", Index, lpstr);
+ OutputDebugStringW(Buffer);
+ CoTaskMemFree(lpstr);
+#endif
+ return hr;
+ }
}
WCHAR Buffer[MAX_PATH];
@@ -103,11 +153,23 @@ CNetworkProvider::QueryInterface(
swprintf(Buffer, L"CNetworkProvider::QueryInterface: NoInterface for %s !!!\n", lpstr);
OutputDebugStringW(Buffer);
CoTaskMemFree(lpstr);
-
+ DebugBreak();
return E_NOINTERFACE;
}
+CNetworkProvider::CNetworkProvider(LPCGUID ClassID) : m_Ref(0),
+ m_pGraph(0),
+ m_ReferenceClock(0),
+ m_FilterState(State_Stopped),
+ m_DeviceFilters(),
+ m_Tuner(0)
+{
+ m_Pins[0] = 0;
+
+ CopyMemory(&m_ClassID, ClassID, sizeof(GUID));
+};
+
//-------------------------------------------------------------------
// IBaseFilter interface
//
@@ -117,24 +179,29 @@ STDMETHODCALLTYPE
CNetworkProvider::GetClassID(
CLSID *pClassID)
{
- OutputDebugStringW(L"CNetworkProvider::GetClassID : NotImplemented\n");
- return E_NOTIMPL;
+ OutputDebugStringW(L"CNetworkProvider::GetClassID\n");
+ CopyMemory(&pClassID, &m_ClassID, sizeof(GUID));
+
+ return S_OK;
}
HRESULT
STDMETHODCALLTYPE
CNetworkProvider::Stop()
{
- OutputDebugStringW(L"CNetworkProvider::Stop : NotImplemented\n");
- return E_NOTIMPL;
+ OutputDebugStringW(L"CNetworkProvider::Stop\n");
+ m_FilterState = State_Stopped;
+ return S_OK;
}
HRESULT
STDMETHODCALLTYPE
CNetworkProvider::Pause()
{
- OutputDebugStringW(L"CNetworkProvider::Pause : NotImplemented\n");
- return E_NOTIMPL;
+ OutputDebugStringW(L"CNetworkProvider::Pause\n");
+
+ m_FilterState = State_Paused;
+ return S_OK;
}
HRESULT
@@ -142,8 +209,10 @@ STDMETHODCALLTYPE
CNetworkProvider::Run(
REFERENCE_TIME tStart)
{
- OutputDebugStringW(L"CNetworkProvider::Run : NotImplemented\n");
- return E_NOTIMPL;
+ OutputDebugStringW(L"CNetworkProvider::Run\n");
+
+ m_FilterState = State_Running;
+ return S_OK;
}
HRESULT
@@ -166,7 +235,6 @@ CNetworkProvider::SetSyncSource(
pClock->AddRef();
}
-
if (m_ReferenceClock)
{
m_ReferenceClock->Release();
@@ -227,6 +295,9 @@ CNetworkProvider::QueryFilterInfo(
pInfo->achName[0] = L'\0';
pInfo->pGraph = m_pGraph;
+ if (m_pGraph)
+ m_pGraph->AddRef();
+
return S_OK;
}
@@ -257,7 +328,6 @@ STDMETHODCALLTYPE
CNetworkProvider::QueryVendorInfo(
LPWSTR *pVendorInfo)
{
- OutputDebugStringW(L"CNetworkProvider::QueryVendorInfo : NotImplemented\n");
return E_NOTIMPL;
}
@@ -336,16 +406,95 @@ CNetworkProvider::RegisterDeviceFilter(
IUnknown *pUnkFilterControl,
ULONG *ppvRegisitrationContext)
{
- OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter : NotImplemented\n");
- return E_NOTIMPL;
+ HRESULT hr;
+ IBDA_DeviceControl * pDeviceControl = NULL;
+ IBDA_Topology *pTopology = NULL;
+
+ OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter\n");
+
+ if (!pUnkFilterControl || !ppvRegisitrationContext)
+ {
+ //invalid argument
+ return E_POINTER;
+ }
+
+ // the filter must support IBDA_DeviceControl and IBDA_Topology
+ hr = pUnkFilterControl->QueryInterface(IID_IBDA_DeviceControl, (void**)&pDeviceControl);
+ if (FAILED(hr))
+ {
+ OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter Filter does not support IBDA_DeviceControl\n");
+ return hr;
+ }
+
+ hr = pUnkFilterControl->QueryInterface(IID_IBDA_Topology, (void**)&pTopology);
+ if (FAILED(hr))
+ {
+ pDeviceControl->Release();
+ OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter Filter does not support IID_IBDA_Topology\n");
+ return hr;
+ }
+
+ //TODO
+ // analyize device filter
+
+ // increment reference
+ pUnkFilterControl->AddRef();
+
+ // release IBDA_DeviceControl interface
+ pDeviceControl->Release();
+
+ // release IBDA_Topology interface
+ pTopology->Release();
+
+ // store registration ctx
+ *ppvRegisitrationContext = (m_DeviceFilters.size() | DEVICE_FILTER_MASK);
+
+ // store filter
+ m_DeviceFilters.push_back(pUnkFilterControl);
+
+ OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter complete\n");
+
+ return S_OK;
}
HRESULT
STDMETHODCALLTYPE
CNetworkProvider::UnRegisterDeviceFilter(ULONG pvRegistrationContext)
{
- OutputDebugStringW(L"CNetworkProvider::UnRegisterDeviceFilter : NotImplemented\n");
- return E_NOTIMPL;
+ ULONG Index;
+ IUnknown * pUnknown;
+
+ OutputDebugStringW(L"CNetworkProvider::UnRegisterDeviceFilter\n");
+
+ if (!(pvRegistrationContext & DEVICE_FILTER_MASK))
+ {
+ // invalid argument
+ return E_INVALIDARG;
+ }
+
+ // get real index
+ Index = pvRegistrationContext & ~DEVICE_FILTER_MASK;
+
+ if (Index >= m_DeviceFilters.size())
+ {
+ // invalid argument
+ return E_INVALIDARG;
+ }
+
+ pUnknown = m_DeviceFilters[Index];
+ if (!pUnknown)
+ {
+ // filter was already de-registered
+ return E_INVALIDARG;
+ }
+
+ // remove from vector
+ m_DeviceFilters[Index] = NULL;
+
+ // release extra reference
+ pUnknown->Release();
+
+ return NOERROR;
}
HRESULT
@@ -355,7 +504,7 @@ CNetworkProvider_fnConstructor(
REFIID riid,
LPVOID * ppv)
{
- CNetworkProvider * handler = new CNetworkProvider();
+ CNetworkProvider * handler = new CNetworkProvider(&CLSID_DVBTNetworkProvider);
#ifdef MSDVBNP_TRACE
WCHAR Buffer[MAX_PATH];
diff --git a/dll/directx/msdvbnp/pin.cpp b/dll/directx/msdvbnp/pin.cpp
index 9662f809133..e2acef06a43 100644
--- a/dll/directx/msdvbnp/pin.cpp
+++ b/dll/directx/msdvbnp/pin.cpp
@@ -8,8 +8,10 @@
*/
#include "precomp.h"
+#ifndef _MSC_VER
const GUID KSDATAFORMAT_TYPE_BDA_ANTENNA = {0x71985f41, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
const GUID GUID_NULL = {0x00000000L, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
+#endif
class CPin : public IPin
{
diff --git a/dll/directx/msdvbnp/precomp.h b/dll/directx/msdvbnp/precomp.h
index d20b9ac9d81..4294d42d198 100644
--- a/dll/directx/msdvbnp/precomp.h
+++ b/dll/directx/msdvbnp/precomp.h
@@ -9,15 +9,18 @@
#include
#define __STREAMS__
#include
+#include
#include
#include
#include
#include
#include
#include
+#include
#include
#include
#include
+#include
typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject);
@@ -46,7 +49,7 @@ CNetworkProvider_fnConstructor(
HRESULT
WINAPI
CScanningTunner_fnConstructor(
- IUnknown *pUnknown,
+ std::vector & m_DeviceFilter,
REFIID riid,
LPVOID * ppv);
@@ -79,4 +82,8 @@ CEnumMediaTypes_fnConstructor(
REFIID riid,
LPVOID * ppv);
+#ifndef _MSC_VER
+extern const GUID CLSID_DVBTNetworkProvider;
+#endif
+
#endif
diff --git a/dll/directx/msdvbnp/scanningtuner.cpp b/dll/directx/msdvbnp/scanningtuner.cpp
index 0c9b7782d2b..76665f66a28 100644
--- a/dll/directx/msdvbnp/scanningtuner.cpp
+++ b/dll/directx/msdvbnp/scanningtuner.cpp
@@ -48,12 +48,19 @@ public:
HRESULT STDMETHODCALLTYPE ScanDown(long MillisecondsPause);
HRESULT STDMETHODCALLTYPE AutoProgram();
- CScanningTunner() : m_Ref(0), m_TuningSpace(0){};
- virtual ~CScanningTunner(){};
-
+ CScanningTunner(std::vector & DeviceFilters) : m_Ref(0), m_TuningSpace(0), m_DeviceFilters(DeviceFilters){};
+ virtual ~CScanningTunner() {};
+ HRESULT STDMETHODCALLTYPE StartChanges();
+ HRESULT STDMETHODCALLTYPE CommitChanges();
+ HRESULT STDMETHODCALLTYPE CheckChanges();
+ HRESULT STDMETHODCALLTYPE SetLnbInfo(IBDA_LNBInfo * pLnbInfo, ULONG ulLOFLow, ULONG ulLOFHigh, ULONG ulSwitchFrequency);
+ HRESULT STDMETHODCALLTYPE SetDigitalDemodulator(IBDA_DigitalDemodulator * pDigitalDemo, ModulationType ModType, FECMethod InnerFEC, BinaryConvolutionCodeRate InnerFECRate, FECMethod OuterFEC, BinaryConvolutionCodeRate OuterFECRate, ULONG SymbolRate);
+ HRESULT SetFrequency(IBDA_FrequencyFilter * pFrequency, ULONG FrequencyMultiplier, ULONG Frequency, Polarisation Polarity, ULONG Range, ULONG Bandwidth);
+ HRESULT STDMETHODCALLTYPE performDVBTTune(IDVBTuneRequest * pDVBTRequest, IDVBTLocator *pDVBTLocator);
protected:
LONG m_Ref;
ITuningSpace * m_TuningSpace;
+ std::vector & m_DeviceFilters;
};
HRESULT
@@ -140,8 +147,48 @@ STDMETHODCALLTYPE
CScanningTunner::put_TuneRequest(
ITuneRequest *TuneRequest)
{
- OutputDebugStringW(L"CScanningTunner::put_TuneRequest : NotImplemented\n");
- return E_NOTIMPL;
+ IDVBTuneRequest * pDVBTRequest;
+ ILocator *pLocator;
+ IDVBTLocator *pDVBTLocator;
+ HRESULT hr;
+
+
+ OutputDebugStringW(L"CScanningTunner::put_TuneRequest\n");
+
+ // query for IDVBTuneRequest interface
+ hr = TuneRequest->QueryInterface(IID_IDVBTuneRequest, (void**)&pDVBTRequest);
+
+ // sanity check
+ assert(hr == NOERROR);
+
+ // get the IDVBTLocator
+ hr = pDVBTRequest->get_Locator((ILocator**)&pLocator);
+
+ // sanity check
+ assert(hr == NOERROR);
+ assert(pLocator);
+
+ hr = pLocator->QueryInterface(IID_ILocator, (void**)&pDVBTLocator);
+
+ // sanity check
+ assert(hr == NOERROR);
+
+
+ StartChanges();
+ CommitChanges();
+ StartChanges();
+
+ hr = performDVBTTune(pDVBTRequest, pDVBTLocator);
+
+
+ pDVBTLocator->Release();
+ pDVBTRequest->Release();
+
+ CheckChanges();
+ CommitChanges();
+ StartChanges();
+
+ return NOERROR;
}
HRESULT
@@ -233,20 +280,431 @@ CScanningTunner::AutoProgram()
return E_NOTIMPL;
}
+//-------------------------------------------------------------------
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::performDVBTTune(
+ IDVBTuneRequest * pDVBTRequest,
+ IDVBTLocator *pDVBTLocator)
+{
+ HRESULT hr;
+ ULONG Index;
+ IBDA_Topology *pTopo;
+ IUnknown *pNode;
+ IBDA_FrequencyFilter * pFrequency;
+ IBDA_LNBInfo * pLnbInfo;
+ IBDA_DigitalDemodulator *pDigitalDemo;
+ LONG BandWidth;
+ LONG Frequency;
+ LONG SymbolRate;
+ FECMethod InnerFEC, OuterFEC;
+ BinaryConvolutionCodeRate InnerFECRate, OuterFECRate;
+ ModulationType Modulation;
+
+ pDVBTLocator->get_Bandwidth(&BandWidth);
+ pDVBTLocator->get_CarrierFrequency(&Frequency);
+ pDVBTLocator->get_InnerFEC(&InnerFEC);
+ pDVBTLocator->get_InnerFECRate(&InnerFECRate);
+ pDVBTLocator->get_Modulation(&Modulation);
+ pDVBTLocator->get_OuterFEC(&OuterFEC);
+ pDVBTLocator->get_OuterFECRate(&OuterFECRate);
+ pDVBTLocator->get_SymbolRate(&SymbolRate);
+
+
+ WCHAR Buffer[1000];
+ swprintf(Buffer, L"BandWidth %lu Frequency %lu Rate %lu InnerFEC %ld OuterFEC %ld InnerFECRate %ld OuterFECRate %ld Modulation %lu\n",
+ BandWidth, Frequency, SymbolRate, InnerFEC, OuterFEC, InnerFECRate, OuterFECRate, Modulation);
+
+ OutputDebugStringW(Buffer);
+
+
+
+ for(Index = 0; Index < m_DeviceFilters.size(); Index++)
+ {
+ // get device filter
+ IUnknown * pFilter = m_DeviceFilters[Index];
+
+ if (!pFilter)
+ continue;
+
+ hr = pFilter->QueryInterface(IID_IBDA_Topology, (void**)&pTopo);
+ // sanity check
+ assert(hr == NOERROR);
+
+ pNode = NULL;
+ hr = pTopo->GetControlNode(0, 1, 0, &pNode); //HACK
+
+ WCHAR Buffer[100];
+ swprintf(Buffer, L"CScanningTunner::performDVBTTune GetControlNode %lx\n", hr);
+ OutputDebugStringW(Buffer);
+
+ if (FAILED(hr))
+ continue;
+
+ // sanity check
+ assert(hr == NOERROR);
+ assert(pNode);
+
+ hr = pNode->QueryInterface(IID_IBDA_FrequencyFilter, (void**)&pFrequency);
+
+ swprintf(Buffer, L"CScanningTunner::performDVBTTune IID_IBDA_FrequencyFilter hr %lx\n", hr);
+ OutputDebugStringW(Buffer);
+
+ // sanity check
+ assert(hr == NOERROR);
+
+ hr = SetFrequency(pFrequency, 1000 /* FIXME */, Frequency, BDA_POLARISATION_NOT_DEFINED /* FIXME */, BDA_RANGE_NOT_SET /* FIXME */, BandWidth);
+
+ swprintf(Buffer, L"CScanningTunner::performDVBTTune SetFrequency hr %lx\n", hr);
+ OutputDebugStringW(Buffer);
+
+ //sanity check
+ assert(hr == NOERROR);
+
+ // release interface
+ pFrequency->Release();
+
+
+ hr = pNode->QueryInterface(IID_IBDA_LNBInfo, (void**)&pLnbInfo);
+
+ swprintf(Buffer, L"CScanningTunner::performDVBTTune IID_IBDA_LNBInfo hr %lx\n", hr);
+ OutputDebugStringW(Buffer);
+
+ // sanity check
+ assert(hr == NOERROR);
+
+ hr = SetLnbInfo(pLnbInfo, ULONG_MAX /* FIXME */, ULONG_MAX /* FIXME*/, ULONG_MAX /*FIXME*/);
+
+
+ swprintf(Buffer, L"CScanningTunner::performDVBTTune SetLnbInfo hr %lx\n", hr);
+ OutputDebugStringW(Buffer);
+
+ // sanity check
+ assert(hr == NOERROR);
+
+ // release interface
+ pLnbInfo->Release();
+
+ hr = pNode->QueryInterface(IID_IBDA_DigitalDemodulator, (void**)&pDigitalDemo);
+
+ swprintf(Buffer, L"CScanningTunner::performDVBTTune IID_IBDA_DigitalDemodulator hr %lx\n", hr);
+ OutputDebugStringW(Buffer);
+
+ // sanity check
+ assert(hr == NOERROR);
+
+ hr = SetDigitalDemodulator(pDigitalDemo, Modulation, InnerFEC, InnerFECRate, OuterFEC, OuterFECRate, SymbolRate);
+
+ swprintf(Buffer, L"CScanningTunner::performDVBTTune SetDigitalDemodulator hr %lx\n", hr);
+ OutputDebugStringW(Buffer);
+
+ // sanity check
+ assert(hr == NOERROR);
+
+ // release interface
+ pDigitalDemo->Release();
+
+ // release control node
+ pNode->Release();
+
+ // release IBDA_Topology;
+ pTopo->Release();
+
+ }
+ return hr;
+}
+
+
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::CheckChanges()
+{
+ ULONG Index;
+ HRESULT hResult = NOERROR;
+ IBDA_DeviceControl * pDeviceControl;
+
+ for(Index = 0; Index < m_DeviceFilters.size(); Index++)
+ {
+ // get filter
+ IUnknown * pFilter = m_DeviceFilters[Index];
+
+ if (!pFilter)
+ continue;
+
+ // query for IBDA_DeviceControl interface
+ hResult = pFilter->QueryInterface(IID_IBDA_DeviceControl, (void**)&pDeviceControl);
+
+ // sanity check
+ assert(hResult == NOERROR);
+
+ //start changes
+ hResult = pDeviceControl->CheckChanges();
+
+ // fix for unimplemented
+ if (hResult == E_NOTIMPL)
+ hResult = NOERROR;
+
+ // release interface
+ pDeviceControl->Release();
+
+ if (FAILED(hResult))
+ {
+ //shouldnt happen
+ break;
+ }
+ }
+ // done
+ return hResult;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::CommitChanges()
+{
+ ULONG Index;
+ HRESULT hResult = NOERROR;
+ IBDA_DeviceControl * pDeviceControl;
+
+ for(Index = 0; Index < m_DeviceFilters.size(); Index++)
+ {
+ // get filter
+ IUnknown * pFilter = m_DeviceFilters[Index];
+
+ if (!pFilter)
+ continue;
+
+ // query for IBDA_DeviceControl interface
+ HRESULT hr = pFilter->QueryInterface(IID_IBDA_DeviceControl, (void**)&pDeviceControl);
+
+ // sanity check
+ assert(hr == NOERROR);
+
+ //start changes
+ hr = pDeviceControl->CommitChanges();
+
+ // fix for unimplemented
+ if (hr == E_NOTIMPL)
+ hr = NOERROR;
+
+ if (FAILED(hr))
+ {
+ pDeviceControl->StartChanges();
+ pDeviceControl->CommitChanges();
+ hResult = E_UNEXPECTED;
+ }
+
+ // release interface
+ pDeviceControl->Release();
+
+ }
+
+ //done
+ return hResult;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::StartChanges()
+{
+ ULONG Index;
+ IBDA_DeviceControl * pDeviceControl;
+
+ for(Index = 0; Index < m_DeviceFilters.size(); Index++)
+ {
+ // get filter
+ IUnknown * pFilter = m_DeviceFilters[Index];
+
+ if (!pFilter)
+ continue;
+
+ // query for IBDA_DeviceControl interface
+ HRESULT hr = pFilter->QueryInterface(IID_IBDA_DeviceControl, (void**)&pDeviceControl);
+
+ // sanity check
+ assert(hr == NOERROR);
+
+ //start changes
+ hr = pDeviceControl->StartChanges();
+
+ // release interface
+ pDeviceControl->Release();
+
+ // fix for unimplemented
+ if (hr == E_NOTIMPL)
+ hr = NOERROR;
+
+ if (FAILED(hr))
+ return hr;
+
+ }
+
+ // now commit the changes
+ for(Index = 0; Index < m_DeviceFilters.size(); Index++)
+ {
+ // get filter
+ IUnknown * pFilter = m_DeviceFilters[Index];
+
+ if (!pFilter)
+ continue;
+
+ // query for IBDA_DeviceControl interface
+ HRESULT hr = pFilter->QueryInterface(IID_IBDA_DeviceControl, (void**)&pDeviceControl);
+
+ // sanity check
+ assert(hr == NOERROR);
+
+ hr = pDeviceControl->CommitChanges();
+
+ // release interface
+ pDeviceControl->Release();
+ }
+
+ // done
+ return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::SetLnbInfo(
+ IBDA_LNBInfo * pLnbInfo,
+ ULONG ulLOFLow,
+ ULONG ulLOFHigh,
+ ULONG ulSwitchFrequency)
+{
+ HRESULT hr;
+
+ hr = pLnbInfo->put_LocalOscilatorFrequencyLowBand(ulLOFLow);
+ if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+ hr = NOERROR;
+
+ if (FAILED(hr))
+ return hr;
+
+ hr = pLnbInfo->put_LocalOscilatorFrequencyHighBand(ulLOFHigh);
+ if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+ hr = NOERROR;
+
+ if (FAILED(hr))
+ return hr;
+
+ hr = pLnbInfo->put_HighLowSwitchFrequency(ulSwitchFrequency);
+ if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+ hr = NOERROR;
+
+ return hr;
+}
+
+HRESULT
+CScanningTunner::SetFrequency(
+ IBDA_FrequencyFilter * pFrequency,
+ ULONG FrequencyMultiplier,
+ ULONG Frequency,
+ Polarisation Polarity,
+ ULONG Range,
+ ULONG Bandwidth)
+{
+ HRESULT hr;
+
+ hr = pFrequency->put_FrequencyMultiplier(FrequencyMultiplier);
+ if (FAILED(hr))
+ return hr;
+
+ hr = pFrequency->put_Frequency(Frequency);
+ if (FAILED(hr))
+ return hr;
+
+ hr = pFrequency->put_Polarity(Polarity);
+ if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND))
+ hr = NOERROR;
+
+ if (FAILED(hr))
+ return hr;
+
+ hr = pFrequency->put_Range(Range);
+ if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND))
+ hr = NOERROR;
+
+ if (FAILED(hr))
+ return hr;
+
+ hr = pFrequency->put_Bandwidth(Bandwidth);
+ return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::SetDigitalDemodulator(
+ IBDA_DigitalDemodulator * pDigitalDemo,
+ ModulationType ModType,
+ FECMethod InnerFEC,
+ BinaryConvolutionCodeRate InnerFECRate,
+ FECMethod OuterFEC,
+ BinaryConvolutionCodeRate OuterFECRate,
+ ULONG SymbolRate)
+{
+ HRESULT hr;
+
+ hr = pDigitalDemo->put_ModulationType(&ModType);
+ if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+ hr = NOERROR;
+
+ if (FAILED(hr))
+ return hr;
+
+ hr = pDigitalDemo->put_InnerFECMethod(&InnerFEC);
+ if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+ hr = NOERROR;
+ if (FAILED(hr))
+ return hr;
+
+ hr = pDigitalDemo->put_InnerFECRate(&InnerFECRate);
+ if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+ hr = NOERROR;
+ if (FAILED(hr))
+ return hr;
+
+ hr = pDigitalDemo->put_OuterFECMethod(&OuterFEC);
+ if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+ hr = NOERROR;
+ if (FAILED(hr))
+ return hr;
+
+ hr = pDigitalDemo->put_OuterFECRate(&OuterFECRate);
+ if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+ hr = NOERROR;
+ if (FAILED(hr))
+ return hr;
+
+ hr = pDigitalDemo->put_SymbolRate(&SymbolRate);
+ if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+ hr = NOERROR;
+ if (FAILED(hr))
+ return hr;
+
+ SpectralInversion Inversion = BDA_SPECTRAL_INVERSION_NOT_DEFINED;
+ hr = pDigitalDemo->put_SpectralInversion(&Inversion);
+ if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+ hr = NOERROR;
+
+ return hr;
+}
+
+
HRESULT
WINAPI
CScanningTunner_fnConstructor(
- IUnknown *pUnknown,
+ std::vector & DeviceFilter,
REFIID riid,
LPVOID * ppv)
{
- CScanningTunner * handler = new CScanningTunner();
+ CScanningTunner * handler = new CScanningTunner(DeviceFilter);
#ifdef MSDVBNP_TRACE
WCHAR Buffer[MAX_PATH];
LPOLESTR lpstr;
StringFromCLSID(riid, &lpstr);
- swprintf(Buffer, L"CScanningTunner_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+ swprintf(Buffer, L"CScanningTunner_fnConstructor riid %s\n", lpstr);
OutputDebugStringW(Buffer);
#endif
diff --git a/dll/directx/qedit/samplegrabber.c b/dll/directx/qedit/samplegrabber.c
index d09d5546b19..1875c51c49e 100644
--- a/dll/directx/qedit/samplegrabber.c
+++ b/dll/directx/qedit/samplegrabber.c
@@ -37,7 +37,7 @@ static WCHAR const pin_in_name[] = { 'I', 'n', 0 };
static WCHAR const pin_out_name[] = { 'O', 'u', 't', 0 };
IEnumPins *pinsenum_create(IBaseFilter *filter, IPin **pins, ULONG pinCount);
-IEnumMediaTypes *mediaenum_create(AM_MEDIA_TYPE *mtype);
+IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype);
/* Fixed pins enumerator, holds filter referenced */
typedef struct _PE_Impl {
@@ -258,7 +258,7 @@ Single_IEnumMediaTypes_Next(IEnumMediaTypes *iface, ULONG nTypes, AM_MEDIA_TYPE
return E_INVALIDARG;
if (!types || ((nTypes != 1) && !fetched))
return E_POINTER;
- if (!This->past) {
+ if (!This->past && !IsEqualGUID(&This->mtype.majortype,&GUID_NULL)) {
AM_MEDIA_TYPE *mtype = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
*mtype = This->mtype;
if (mtype->cbFormat) {
@@ -324,7 +324,7 @@ static const IEnumMediaTypesVtbl IEnumMediaTypes_VTable =
Single_IEnumMediaTypes_Clone,
};
-IEnumMediaTypes *mediaenum_create(AM_MEDIA_TYPE *mtype)
+IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype)
{
ME_Impl *obj = CoTaskMemAlloc(sizeof(ME_Impl));
if (obj) {
@@ -332,14 +332,18 @@ IEnumMediaTypes *mediaenum_create(AM_MEDIA_TYPE *mtype)
obj->me.lpVtbl = &IEnumMediaTypes_VTable;
obj->refCount = 1;
obj->past = FALSE;
- obj->mtype = *mtype;
- obj->mtype.pUnk = NULL;
- if (mtype->cbFormat) {
- obj->mtype.pbFormat = CoTaskMemAlloc(mtype->cbFormat);
- CopyMemory(obj->mtype.pbFormat, mtype->pbFormat, mtype->cbFormat);
+ if (mtype) {
+ obj->mtype = *mtype;
+ obj->mtype.pUnk = NULL;
+ if (mtype->cbFormat) {
+ obj->mtype.pbFormat = CoTaskMemAlloc(mtype->cbFormat);
+ CopyMemory(obj->mtype.pbFormat, mtype->pbFormat, mtype->cbFormat);
+ }
+ else
+ obj->mtype.pbFormat = NULL;
}
else
- obj->mtype.pbFormat = NULL;
+ obj->mtype.majortype = GUID_NULL;
}
return &obj->me;
}
@@ -361,6 +365,7 @@ typedef struct _SG_Impl {
const IMemInputPinVtbl* IMemInputPin_Vtbl;
/* TODO: IMediaPosition, IMediaSeeking, IQualityControl */
LONG refCount;
+ CRITICAL_SECTION critSect;
FILTER_INFO info;
FILTER_STATE state;
AM_MEDIA_TYPE mtype;
@@ -372,6 +377,8 @@ typedef struct _SG_Impl {
ISampleGrabberCB *grabberIface;
LONG grabberMethod;
LONG oneShot;
+ LONG bufferLen;
+ void* bufferData;
} SG_Impl;
enum {
@@ -413,6 +420,10 @@ static void SampleGrabber_cleanup(SG_Impl *This)
ISampleGrabberCB_Release(This->grabberIface);
if (This->mtype.pbFormat)
CoTaskMemFree(This->mtype.pbFormat);
+ if (This->bufferData)
+ CoTaskMemFree(This->bufferData);
+ This->critSect.DebugInfo->Spare[0] = 0;
+ DeleteCriticalSection(&This->critSect);
}
/* Common helper AddRef called from all interfaces */
@@ -471,11 +482,31 @@ static HRESULT SampleGrabber_query(SG_Impl *This, REFIID riid, void **ppvObject)
return E_NOINTERFACE;
}
-/* Helper that calls installed sample callbacks */
+/* Helper that buffers data and/or calls installed sample callbacks */
static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
{
double time = 0.0;
REFERENCE_TIME tStart, tEnd;
+ if (This->bufferLen >= 0) {
+ BYTE *data = 0;
+ long size = IMediaSample_GetActualDataLength(sample);
+ if (size >= 0 && SUCCEEDED(IMediaSample_GetPointer(sample, &data))) {
+ if (!data)
+ size = 0;
+ EnterCriticalSection(&This->critSect);
+ if (This->bufferLen != size) {
+ if (This->bufferData)
+ CoTaskMemFree(This->bufferData);
+ This->bufferData = size ? CoTaskMemAlloc(size) : NULL;
+ This->bufferLen = size;
+ }
+ if (size)
+ CopyMemory(This->bufferData, data, size);
+ LeaveCriticalSection(&This->critSect);
+ }
+ }
+ if (!This->grabberIface)
+ return;
if (SUCCEEDED(IMediaSample_GetTime(sample, &tStart, &tEnd)))
time = 1e-7 * tStart;
switch (This->grabberMethod) {
@@ -777,11 +808,16 @@ SampleGrabber_ISampleGrabber_GetConnectedMediaType(ISampleGrabber *iface, AM_MED
static HRESULT WINAPI
SampleGrabber_ISampleGrabber_SetBufferSamples(ISampleGrabber *iface, BOOL bufferEm)
{
- TRACE("(%u)\n", bufferEm);
+ SG_Impl *This = impl_from_ISampleGrabber(iface);
+ TRACE("(%p)->(%u)\n", This, bufferEm);
+ EnterCriticalSection(&This->critSect);
if (bufferEm) {
- FIXME("buffering not implemented\n");
- return E_NOTIMPL;
+ if (This->bufferLen < 0)
+ This->bufferLen = 0;
}
+ else
+ This->bufferLen = -1;
+ LeaveCriticalSection(&This->critSect);
return S_OK;
}
@@ -789,10 +825,29 @@ SampleGrabber_ISampleGrabber_SetBufferSamples(ISampleGrabber *iface, BOOL buffer
static HRESULT WINAPI
SampleGrabber_ISampleGrabber_GetCurrentBuffer(ISampleGrabber *iface, LONG *bufSize, LONG *buffer)
{
- FIXME("(%p, %p): stub\n", bufSize, buffer);
+ SG_Impl *This = impl_from_ISampleGrabber(iface);
+ HRESULT ret = S_OK;
+ TRACE("(%p)->(%p, %p)\n", This, bufSize, buffer);
if (!bufSize)
return E_POINTER;
- return E_INVALIDARG;
+ EnterCriticalSection(&This->critSect);
+ if (!This->pin_in.pair)
+ ret = VFW_E_NOT_CONNECTED;
+ else if (This->bufferLen < 0)
+ ret = E_INVALIDARG;
+ else if (This->bufferLen == 0)
+ ret = VFW_E_WRONG_STATE;
+ else {
+ if (buffer) {
+ if (*bufSize >= This->bufferLen)
+ CopyMemory(buffer, This->bufferData, This->bufferLen);
+ else
+ ret = E_OUTOFMEMORY;
+ }
+ *bufSize = This->bufferLen;
+ }
+ LeaveCriticalSection(&This->critSect);
+ return ret;
}
/* ISampleGrabber */
@@ -896,8 +951,7 @@ SampleGrabber_IMemInputPin_Receive(IMemInputPin *iface, IMediaSample *sample)
return E_POINTER;
if ((This->state != State_Running) || (This->oneShot == OneShot_Past))
return S_FALSE;
- if (This->grabberIface)
- SampleGrabber_callback(This, sample);
+ SampleGrabber_callback(This, sample);
hr = This->memOutput ? IMemInputPin_Receive(This->memOutput, sample) : S_OK;
if (This->oneShot == OneShot_Wait) {
This->oneShot = OneShot_Past;
@@ -913,16 +967,14 @@ static HRESULT WINAPI
SampleGrabber_IMemInputPin_ReceiveMultiple(IMemInputPin *iface, IMediaSample **samples, LONG nSamples, LONG *nProcessed)
{
SG_Impl *This = impl_from_IMemInputPin(iface);
+ LONG idx;
TRACE("(%p)->(%p, %u, %p) output = %p, grabber = %p\n", This, samples, nSamples, nProcessed, This->memOutput, This->grabberIface);
if (!samples || !nProcessed)
return E_POINTER;
if ((This->state != State_Running) || (This->oneShot == OneShot_Past))
return S_FALSE;
- if (This->grabberIface) {
- LONG idx;
- for (idx = 0; idx < nSamples; idx++)
- SampleGrabber_callback(This, samples[idx]);
- }
+ for (idx = 0; idx < nSamples; idx++)
+ SampleGrabber_callback(This, samples[idx]);
return This->memOutput ? IMemInputPin_ReceiveMultiple(This->memOutput, samples, nSamples, nProcessed) : S_OK;
}
@@ -1048,6 +1100,10 @@ SampleGrabber_In_IPin_ReceiveConnection(IPin *iface, IPin *connector, const AM_M
debugstr_guid(&type->majortype), debugstr_guid(&type->subtype),
type->lSampleSize,
debugstr_guid(&type->formattype), type->cbFormat);
+ if (!IsEqualGUID(&type->formattype, &FORMAT_None) &&
+ !IsEqualGUID(&type->formattype, &GUID_NULL) &&
+ !type->pbFormat)
+ return VFW_E_INVALIDMEDIATYPE;
if (!IsEqualGUID(&This->sg->mtype.majortype,&GUID_NULL) &&
!IsEqualGUID(&This->sg->mtype.majortype,&type->majortype))
return VFW_E_TYPE_NOT_ACCEPTED;
@@ -1058,10 +1114,6 @@ SampleGrabber_In_IPin_ReceiveConnection(IPin *iface, IPin *connector, const AM_M
!IsEqualGUID(&This->sg->mtype.formattype,&FORMAT_None) &&
!IsEqualGUID(&This->sg->mtype.formattype,&type->formattype))
return VFW_E_TYPE_NOT_ACCEPTED;
- if (!IsEqualGUID(&type->formattype, &FORMAT_None) &&
- !IsEqualGUID(&type->formattype, &GUID_NULL) &&
- !type->pbFormat)
- return VFW_E_TYPE_NOT_ACCEPTED;
if (This->sg->mtype.pbFormat)
CoTaskMemFree(This->sg->mtype.pbFormat);
This->sg->mtype = *type;
@@ -1212,7 +1264,7 @@ SampleGrabber_IPin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **mtypes)
TRACE("(%p)->(%p)\n", This, mtypes);
if (!mtypes)
return E_POINTER;
- *mtypes = mediaenum_create(&This->sg->mtype);
+ *mtypes = mediaenum_create(This->sg->pin_in.pair ? &This->sg->mtype : (const AM_MEDIA_TYPE *)NULL);
return *mtypes ? S_OK : E_OUTOFMEMORY;
}
@@ -1401,6 +1453,8 @@ HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
obj->pin_out.name = pin_out_name;
obj->pin_out.sg = obj;
obj->pin_out.pair = NULL;
+ InitializeCriticalSection(&obj->critSect);
+ obj->critSect.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": SG_Impl.critSect");
obj->info.achName[0] = 0;
obj->info.pGraph = NULL;
obj->state = State_Stopped;
@@ -1413,6 +1467,8 @@ HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
obj->grabberIface = NULL;
obj->grabberMethod = -1;
obj->oneShot = OneShot_None;
+ obj->bufferLen = -1;
+ obj->bufferData = NULL;
*ppv = obj;
return S_OK;
diff --git a/dll/directx/quartz/filtermapper.c b/dll/directx/quartz/filtermapper.c
index 7b8d95430bf..bacb72950d6 100644
--- a/dll/directx/quartz/filtermapper.c
+++ b/dll/directx/quartz/filtermapper.c
@@ -479,11 +479,16 @@ static HRESULT WINAPI FilterMapper2_UnregisterFilter(
static HRESULT FM2_WriteFriendlyName(IPropertyBag * pPropBag, LPCWSTR szName)
{
VARIANT var;
+ HRESULT ret;
+ BSTR value;
V_VT(&var) = VT_BSTR;
- V_UNION(&var, bstrVal) = (BSTR)szName;
+ V_UNION(&var, bstrVal) = value = SysAllocString(szName);
- return IPropertyBag_Write(pPropBag, wszFriendlyName, &var);
+ ret = IPropertyBag_Write(pPropBag, wszFriendlyName, &var);
+ SysFreeString(value);
+
+ return ret;
}
static HRESULT FM2_WriteClsid(IPropertyBag * pPropBag, REFCLSID clsid)
diff --git a/dll/nls/idndl/idndl.def b/dll/nls/idndl/idndl.def
deleted file mode 100644
index 921d731a72c..00000000000
--- a/dll/nls/idndl/idndl.def
+++ /dev/null
@@ -1,6 +0,0 @@
-LIBRARY "idndl.dll"
-
-EXPORTS
- DownlevelGetLocaleScripts = DownlevelGetLocaleScripts@12 @1
- DownlevelGetStringScripts@20 = kernel32.GetStringScripts @2
- DownlevelVerifyScripts@20 = kernel32.VerifyScripts @3
diff --git a/dll/nls/idndl/idndl.rbuild b/dll/nls/idndl/idndl.rbuild
index 31f7545f2bd..e1303771eab 100644
--- a/dll/nls/idndl/idndl.rbuild
+++ b/dll/nls/idndl/idndl.rbuild
@@ -7,5 +7,5 @@
0x600
idndl.cpp
-
+
diff --git a/dll/ntdll/dbg/dbgui.c b/dll/ntdll/dbg/dbgui.c
index b27a5e2cc3e..b65e06c5d70 100644
--- a/dll/ntdll/dbg/dbgui.c
+++ b/dll/ntdll/dbg/dbgui.c
@@ -259,7 +259,7 @@ DbgUiConvertStateChangeStructure(IN PDBGUI_WAIT_STATE_CHANGE WaitStateChange,
/* Save the image name from the TIB */
DebugEvent->u.LoadDll.lpImageName =
((PTEB)ThreadBasicInfo.TebBaseAddress)->
- Tib.ArbitraryUserPointer;
+ NtTib.ArbitraryUserPointer;
}
else
{
diff --git a/dll/ntdll/dispatch/dispatch.c b/dll/ntdll/dispatch/dispatch.c
index 4fb3c43a9ca..50a9ee88f67 100644
--- a/dll/ntdll/dispatch/dispatch.c
+++ b/dll/ntdll/dispatch/dispatch.c
@@ -79,8 +79,8 @@ KiUserCallbackDispatcher(ULONG Index,
ULONG ArgumentLength)
{
/* Return with the result of the callback function */
+ USER_CALL *KernelCallbackTable = NtCurrentPeb()->KernelCallbackTable;
ZwCallbackReturn(NULL,
0,
- ((USER_CALL)(NtCurrentPeb()->KernelCallbackTable[Index]))
- (Argument, ArgumentLength));
+ KernelCallbackTable[Index](Argument, ArgumentLength));
}
diff --git a/dll/ntdll/ldr/startup.c b/dll/ntdll/ldr/startup.c
index 33353e78517..49a4a2c8527 100644
--- a/dll/ntdll/ldr/startup.c
+++ b/dll/ntdll/ldr/startup.c
@@ -343,8 +343,6 @@ LdrpInit2(PCONTEXT Context,
/* initalize peb lock support */
RtlInitializeCriticalSection(&PebLock);
Peb->FastPebLock = &PebLock;
- Peb->FastPebLockRoutine = (PPEBLOCKROUTINE)RtlEnterCriticalSection;
- Peb->FastPebUnlockRoutine = (PPEBLOCKROUTINE)RtlLeaveCriticalSection;
/* initialize tls bitmaps */
RtlInitializeBitMap(&TlsBitMap, Peb->TlsBitmapBits, TLS_MINIMUM_AVAILABLE);
diff --git a/dll/ntdll/ldr/utils.c b/dll/ntdll/ldr/utils.c
index 1fc0adfc066..9dcb99960ef 100644
--- a/dll/ntdll/ldr/utils.c
+++ b/dll/ntdll/ldr/utils.c
@@ -2299,8 +2299,8 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
/* Map the dll into the process */
ViewSize = 0;
ImageBase = 0;
- ArbitraryUserPointer = NtCurrentTeb()->Tib.ArbitraryUserPointer;
- NtCurrentTeb()->Tib.ArbitraryUserPointer = FullDosName.Buffer;
+ ArbitraryUserPointer = NtCurrentTeb()->NtTib.ArbitraryUserPointer;
+ NtCurrentTeb()->NtTib.ArbitraryUserPointer = FullDosName.Buffer;
Status = NtMapViewOfSection(SectionHandle,
NtCurrentProcess(),
&ImageBase,
@@ -2311,7 +2311,7 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
ViewShare,
0,
PAGE_READONLY);
- NtCurrentTeb()->Tib.ArbitraryUserPointer = ArbitraryUserPointer;
+ NtCurrentTeb()->NtTib.ArbitraryUserPointer = ArbitraryUserPointer;
if (!NT_SUCCESS(Status))
{
DPRINT1("map view of section failed (Status 0x%08lx)\n", Status);
diff --git a/dll/ntdll/rtl/libsupp.c b/dll/ntdll/rtl/libsupp.c
index e37e44405fa..90c3ce322fc 100644
--- a/dll/ntdll/rtl/libsupp.c
+++ b/dll/ntdll/rtl/libsupp.c
@@ -83,7 +83,7 @@ VOID NTAPI
RtlAcquirePebLock(VOID)
{
PPEB Peb = NtCurrentPeb ();
- Peb->FastPebLockRoutine (Peb->FastPebLock);
+ RtlEnterCriticalSection(Peb->FastPebLock);
}
/*
@@ -93,7 +93,7 @@ VOID NTAPI
RtlReleasePebLock(VOID)
{
PPEB Peb = NtCurrentPeb ();
- Peb->FastPebUnlockRoutine (Peb->FastPebLock);
+ RtlLeaveCriticalSection(Peb->FastPebLock);
}
/*
@@ -201,11 +201,24 @@ RtlpCaptureStackLimits(IN ULONG_PTR Ebp,
IN ULONG_PTR *StackEnd)
{
/* FIXME: Verify */
- *StackBegin = (ULONG_PTR)NtCurrentTeb()->Tib.StackLimit;
- *StackEnd = (ULONG_PTR)NtCurrentTeb()->Tib.StackBase;
+ *StackBegin = (ULONG_PTR)NtCurrentTeb()->NtTib.StackLimit;
+ *StackEnd = (ULONG_PTR)NtCurrentTeb()->NtTib.StackBase;
return TRUE;
}
+#ifdef _AMD64_
+VOID
+NTAPI
+RtlpGetStackLimits(
+ OUT PULONG_PTR LowLimit,
+ OUT PULONG_PTR HighLimit)
+{
+ *LowLimit = (ULONG_PTR)NtCurrentTeb()->NtTib.StackLimit;
+ *HighLimit = (ULONG_PTR)NtCurrentTeb()->NtTib.StackBase;
+ return;
+}
+#endif
+
BOOLEAN
NTAPI
RtlIsThreadWithinLoaderCallout(VOID)
diff --git a/dll/win32/acledit/acledit.c b/dll/win32/acledit/acledit.c
index aae903ef93e..4b16cddb403 100644
--- a/dll/win32/acledit/acledit.c
+++ b/dll/win32/acledit/acledit.c
@@ -16,8 +16,7 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-/* $Id: acledit.c 35011 2008-08-01 16:29:40Z sginsberg $
- *
+/*
* PROJECT: ReactOS Access Control List Editor
* FILE: lib/acledit/acledit.c
* PURPOSE: Access Control List Editor
diff --git a/dll/win32/acledit/stubs.c b/dll/win32/acledit/stubs.c
index 0948892b9d9..45d23c78652 100644
--- a/dll/win32/acledit/stubs.c
+++ b/dll/win32/acledit/stubs.c
@@ -1,5 +1,4 @@
-/* $Id: stubs.c 35011 2008-08-01 16:29:40Z sginsberg $
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Access Control List Editor
* FILE: lib/acledit/stubs.c
diff --git a/dll/win32/advapi32/reg/reg.c b/dll/win32/advapi32/reg/reg.c
index 686101e7f1b..e131cf2e43b 100644
--- a/dll/win32/advapi32/reg/reg.c
+++ b/dll/win32/advapi32/reg/reg.c
@@ -42,9 +42,9 @@ static VOID CloseDefaultKeys(VOID);
NtClose(Handle); \
}
#define IsPredefKey(HKey) \
- (((ULONG)(HKey) & 0xF0000000) == 0x80000000)
+ (((ULONG_PTR)(HKey) & 0xF0000000) == 0x80000000)
#define GetPredefKeyIndex(HKey) \
- ((ULONG)(HKey) & 0x0FFFFFFF)
+ ((ULONG_PTR)(HKey) & 0x0FFFFFFF)
static NTSTATUS OpenClassesRootKey(PHANDLE KeyHandle);
static NTSTATUS OpenLocalMachineKey (PHANDLE KeyHandle);
diff --git a/dll/win32/advapi32/sec/misc.c b/dll/win32/advapi32/sec/misc.c
index 51cf09e1512..d5976974c58 100644
--- a/dll/win32/advapi32/sec/misc.c
+++ b/dll/win32/advapi32/sec/misc.c
@@ -289,7 +289,7 @@ CheckNtMartaPresent(VOID)
{
DWORD ErrorCode;
- if (InterlockedCompareExchangePointer(&NtMarta,
+ if (InterlockedCompareExchangePointer((PVOID)&NtMarta,
NULL,
NULL) == NULL)
{
@@ -300,7 +300,7 @@ CheckNtMartaPresent(VOID)
if (ErrorCode == ERROR_SUCCESS)
{
/* try change the NtMarta pointer */
- if (InterlockedCompareExchangePointer(&NtMarta,
+ if (InterlockedCompareExchangePointer((PVOID)&NtMarta,
&NtMartaStatic,
NULL) != NULL)
{
@@ -329,7 +329,7 @@ CheckNtMartaPresent(VOID)
VOID
UnloadNtMarta(VOID)
{
- if (InterlockedExchangePointer(&NtMarta,
+ if (InterlockedExchangePointer((PVOID)&NtMarta,
NULL) != NULL)
{
FreeLibrary(NtMartaStatic.hDllInstance);
diff --git a/dll/win32/avicap32/avicap32.c b/dll/win32/avicap32/avicap32.c
index 7220f7a2e6d..f4ed19b6e11 100644
--- a/dll/win32/avicap32/avicap32.c
+++ b/dll/win32/avicap32/avicap32.c
@@ -86,7 +86,7 @@ capCreateCaptureWindowW(LPCWSTR lpszWindowName,
nWidth,
nHeight,
hWnd,
- (HMENU)nID,
+ ULongToHandle(nID),
hInstance,
NULL);
}
diff --git a/dll/win32/avifil32/api.c b/dll/win32/avifil32/api.c
index dd1c2e23488..ac3c35e5a99 100644
--- a/dll/win32/avifil32/api.c
+++ b/dll/win32/avifil32/api.c
@@ -1030,14 +1030,14 @@ HRESULT WINAPI AVIBuildFilterW(LPWSTR szFilter, LONG cbFilter, BOOL fSaving)
* First filter is named "All multimedia files" and its filter is a
* collection of all possible extensions except "*.*".
*/
- if (RegOpenKeyW(HKEY_CLASSES_ROOT, szAVIFileExtensions, &hKey) != S_OK) {
+ if (RegOpenKeyW(HKEY_CLASSES_ROOT, szAVIFileExtensions, &hKey) != ERROR_SUCCESS) {
HeapFree(GetProcessHeap(), 0, lp);
return AVIERR_ERROR;
}
- for (n = 0;RegEnumKeyW(hKey, n, szFileExt, sizeof(szFileExt)/sizeof(szFileExt[0])) == S_OK;n++) {
+ for (n = 0;RegEnumKeyW(hKey, n, szFileExt, sizeof(szFileExt)/sizeof(szFileExt[0])) == ERROR_SUCCESS;n++) {
/* get CLSID to extension */
size = sizeof(szValue);
- if (RegQueryValueW(hKey, szFileExt, szValue, &size) != S_OK)
+ if (RegQueryValueW(hKey, szFileExt, szValue, &size) != ERROR_SUCCESS)
break;
/* search if the CLSID is already known */
@@ -1078,7 +1078,7 @@ HRESULT WINAPI AVIBuildFilterW(LPWSTR szFilter, LONG cbFilter, BOOL fSaving)
RegCloseKey(hKey);
/* 2. get descriptions for the CLSIDs and fill out szFilter */
- if (RegOpenKeyW(HKEY_CLASSES_ROOT, szClsid, &hKey) != S_OK) {
+ if (RegOpenKeyW(HKEY_CLASSES_ROOT, szClsid, &hKey) != ERROR_SUCCESS) {
HeapFree(GetProcessHeap(), 0, lp);
return AVIERR_ERROR;
}
@@ -1086,7 +1086,7 @@ HRESULT WINAPI AVIBuildFilterW(LPWSTR szFilter, LONG cbFilter, BOOL fSaving)
/* first the description */
if (n != 0) {
size = sizeof(szValue);
- if (RegQueryValueW(hKey, lp[n].szClsid, szValue, &size) == S_OK) {
+ if (RegQueryValueW(hKey, lp[n].szClsid, szValue, &size) == ERROR_SUCCESS) {
size = lstrlenW(szValue);
lstrcpynW(szFilter, szValue, cbFilter);
}
diff --git a/dll/win32/batt/batt.c b/dll/win32/batt/batt.c
new file mode 100644
index 00000000000..0a46a395cd0
--- /dev/null
+++ b/dll/win32/batt/batt.c
@@ -0,0 +1,66 @@
+/*
+ * PROJECT: ReactOS system libraries
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: dll\win32\batt\batt.c
+ * PURPOSE: Battery Class installers
+ * PROGRAMMERS: Copyright 2010 Eric Kohl
+ */
+
+
+#include
+#include
+
+#define NDEBUG
+#include
+
+
+BOOL
+WINAPI
+DllMain(HINSTANCE hinstDll,
+ DWORD dwReason,
+ LPVOID reserved)
+{
+ switch (dwReason)
+ {
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(hinstDll);
+ break;
+
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+
+ return TRUE;
+}
+
+
+DWORD
+WINAPI
+BatteryClassCoInstaller(IN DI_FUNCTION InstallFunction,
+ IN HDEVINFO DeviceInfoSet,
+ IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
+{
+ switch (InstallFunction)
+ {
+ default:
+ DPRINT("Install function %u ignored\n", InstallFunction);
+ return ERROR_DI_DO_DEFAULT;
+ }
+}
+
+
+DWORD
+WINAPI
+BatteryClassInstall(IN DI_FUNCTION InstallFunction,
+ IN HDEVINFO DeviceInfoSet,
+ IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
+{
+ switch (InstallFunction)
+ {
+ default:
+ DPRINT("Install function %u ignored\n", InstallFunction);
+ return ERROR_DI_DO_DEFAULT;
+ }
+}
+
+/* EOF */
diff --git a/dll/win32/batt/batt.rbuild b/dll/win32/batt/batt.rbuild
new file mode 100644
index 00000000000..221bc3dc9e3
--- /dev/null
+++ b/dll/win32/batt/batt.rbuild
@@ -0,0 +1,9 @@
+
+
+ .
+ setupapi
+ kernel32
+ ntdll
+ batt.c
+ batt.rc
+
diff --git a/dll/win32/batt/batt.rc b/dll/win32/batt/batt.rc
new file mode 100644
index 00000000000..5d3f1c71eff
--- /dev/null
+++ b/dll/win32/batt/batt.rc
@@ -0,0 +1,13 @@
+#include
+#include "resource.h"
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION "Battery Class Installer\0"
+#define REACTOS_STR_INTERNAL_NAME "batt\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "batt.dll\0"
+#include
+
+
+IDI_BATTERY ICON "resources/battery.ico"
diff --git a/dll/win32/batt/batt.spec b/dll/win32/batt/batt.spec
new file mode 100644
index 00000000000..efb53f5578a
--- /dev/null
+++ b/dll/win32/batt/batt.spec
@@ -0,0 +1,3 @@
+@ stdcall BatteryClassCoInstaller(long ptr ptr)
+@ stdcall BatteryClassInstall(long ptr ptr)
+
diff --git a/dll/win32/batt/resource.h b/dll/win32/batt/resource.h
new file mode 100644
index 00000000000..d506679737b
--- /dev/null
+++ b/dll/win32/batt/resource.h
@@ -0,0 +1 @@
+#define IDI_BATTERY 2
\ No newline at end of file
diff --git a/dll/win32/batt/resources/battery.ico b/dll/win32/batt/resources/battery.ico
new file mode 100644
index 00000000000..fae101788e4
Binary files /dev/null and b/dll/win32/batt/resources/battery.ico differ
diff --git a/dll/win32/beepmidi/beepmidi.c b/dll/win32/beepmidi/beepmidi.c
index 696a359f742..6365d05e65c 100644
--- a/dll/win32/beepmidi/beepmidi.c
+++ b/dll/win32/beepmidi/beepmidi.c
@@ -244,7 +244,7 @@ CallClient(
DWORD_PTR parameter1,
DWORD_PTR parameter2)
{
- DPRINT("Calling client - callback 0x%x mmhandle 0x%x\n", (int) device_info->callback, device_info->mme_handle);
+ DPRINT("Calling client - callback 0x%x mmhandle 0x%x\n", device_info->callback, device_info->mme_handle);
return DriverCallback(device_info->callback,
HIWORD(device_info->flags),
device_info->mme_handle,
diff --git a/dll/win32/browseui/internettoolbar.cpp b/dll/win32/browseui/internettoolbar.cpp
index f64fcf353ba..c4f6bd004af 100644
--- a/dll/win32/browseui/internettoolbar.cpp
+++ b/dll/win32/browseui/internettoolbar.cpp
@@ -416,8 +416,8 @@ HRESULT STDMETHODCALLTYPE CMenuCallback::CallbackSM(LPSMDATA psmd, UINT uMsg, WP
if ((infoPtr->dwMask & SMIM_FLAGS) != 0)
if (psmd->uId == FCIDM_MENU_FAVORITES)
infoPtr->dwFlags |= SMIF_DROPCASCADE;
- else
- infoPtr->dwFlags |= SMIF_TRACKPOPUP;
+ else{
+ infoPtr->dwFlags |= SMIF_TRACKPOPUP;}
if ((infoPtr->dwMask & SMIM_ICON) != 0)
infoPtr->iIcon = -1;
}
diff --git a/dll/win32/crypt32/chain.c b/dll/win32/crypt32/chain.c
index 6cdd103e666..1724f4254fe 100644
--- a/dll/win32/crypt32/chain.c
+++ b/dll/win32/crypt32/chain.c
@@ -1306,6 +1306,78 @@ static void CRYPT_CheckChainNameConstraints(PCERT_SIMPLE_CHAIN chain)
}
}
+/* Gets cert's policies info, if any. Free with LocalFree. */
+static CERT_POLICIES_INFO *CRYPT_GetPolicies(PCCERT_CONTEXT cert)
+{
+ PCERT_EXTENSION ext;
+ CERT_POLICIES_INFO *policies = NULL;
+
+ ext = CertFindExtension(szOID_KEY_USAGE, cert->pCertInfo->cExtension,
+ cert->pCertInfo->rgExtension);
+ if (ext)
+ {
+ DWORD size;
+
+ CryptDecodeObjectEx(X509_ASN_ENCODING, X509_CERT_POLICIES,
+ ext->Value.pbData, ext->Value.cbData, CRYPT_DECODE_ALLOC_FLAG, NULL,
+ &policies, &size);
+ }
+ return policies;
+}
+
+static void CRYPT_CheckPolicies(CERT_POLICIES_INFO *policies, CERT_INFO *cert,
+ DWORD *errorStatus)
+{
+ DWORD i;
+
+ for (i = 0; i < policies->cPolicyInfo; i++)
+ {
+ /* For now, the only accepted policy identifier is the anyPolicy
+ * identifier.
+ * FIXME: the policy identifiers should be compared against the
+ * cert's certificate policies extension, subject to the policy
+ * mappings extension, and the policy constraints extension.
+ * See RFC 5280, sections 4.2.1.4, 4.2.1.5, and 4.2.1.11.
+ */
+ if (strcmp(policies->rgPolicyInfo[i].pszPolicyIdentifier,
+ szOID_ANY_CERT_POLICY))
+ {
+ FIXME("unsupported policy %s\n",
+ policies->rgPolicyInfo[i].pszPolicyIdentifier);
+ *errorStatus |= CERT_TRUST_INVALID_POLICY_CONSTRAINTS;
+ }
+ }
+}
+
+static void CRYPT_CheckChainPolicies(PCERT_SIMPLE_CHAIN chain)
+{
+ int i, j;
+
+ for (i = chain->cElement - 1; i > 0; i--)
+ {
+ CERT_POLICIES_INFO *policies;
+
+ if ((policies = CRYPT_GetPolicies(chain->rgpElement[i]->pCertContext)))
+ {
+ for (j = i - 1; j >= 0; j--)
+ {
+ DWORD errorStatus = 0;
+
+ CRYPT_CheckPolicies(policies,
+ chain->rgpElement[j]->pCertContext->pCertInfo, &errorStatus);
+ if (errorStatus)
+ {
+ chain->rgpElement[i]->TrustStatus.dwErrorStatus |=
+ errorStatus;
+ CRYPT_CombineTrustStatus(&chain->TrustStatus,
+ &chain->rgpElement[i]->TrustStatus);
+ }
+ }
+ LocalFree(policies);
+ }
+ }
+}
+
static LPWSTR name_value_to_str(const CERT_NAME_BLOB *name)
{
DWORD len = cert_name_to_str_with_indent(X509_ASN_ENCODING, 0, name,
@@ -1739,6 +1811,8 @@ static BOOL CRYPT_CriticalExtensionsSupported(PCCERT_CONTEXT cert)
ret = TRUE;
else if (!strcmp(oid, szOID_SUBJECT_ALT_NAME2))
ret = TRUE;
+ else if (!strcmp(oid, szOID_CERT_POLICIES))
+ ret = TRUE;
else if (!strcmp(oid, szOID_ENHANCED_KEY_USAGE))
ret = TRUE;
else
@@ -1883,6 +1957,7 @@ static void CRYPT_CheckSimpleChain(PCertificateChainEngine engine,
&chain->rgpElement[i]->TrustStatus);
}
CRYPT_CheckChainNameConstraints(chain);
+ CRYPT_CheckChainPolicies(chain);
if (CRYPT_IsCertificateSelfSigned(rootElement->pCertContext))
{
rootElement->TrustStatus.dwInfoStatus |=
diff --git a/dll/win32/crypt32/main.c b/dll/win32/crypt32/main.c
index 5844b1841e5..db9dc1a946a 100644
--- a/dll/win32/crypt32/main.c
+++ b/dll/win32/crypt32/main.c
@@ -64,8 +64,8 @@ HCRYPTPROV CRYPT_GetDefaultProvider(void)
{
HCRYPTPROV prov;
- if (!CryptAcquireContextW(&prov, NULL, MS_ENHANCED_PROV_W, PROV_RSA_FULL,
- CRYPT_VERIFYCONTEXT))
+ if (!CryptAcquireContextW(&prov, NULL, MS_ENH_RSA_AES_PROV_W,
+ PROV_RSA_AES, CRYPT_VERIFYCONTEXT))
return hDefProv;
InterlockedCompareExchangePointer((PVOID *)&hDefProv, (PVOID)prov,
NULL);
diff --git a/dll/win32/crypt32/oid.c b/dll/win32/crypt32/oid.c
index ea30d9ccd45..ea7b539208b 100644
--- a/dll/win32/crypt32/oid.c
+++ b/dll/win32/crypt32/oid.c
@@ -1067,6 +1067,9 @@ static const WCHAR rc2[] = { 'r','c','2',0 };
static const WCHAR rc4[] = { 'r','c','4',0 };
static const WCHAR sha[] = { 's','h','a',0 };
static const WCHAR sha1[] = { 's','h','a','1',0 };
+static const WCHAR sha256[] = { 's','h','a','2','5','6',0 };
+static const WCHAR sha384[] = { 's','h','a','3','8','4',0 };
+static const WCHAR sha512[] = { 's','h','a','5','1','2',0 };
static const WCHAR RSA[] = { 'R','S','A',0 };
static const WCHAR RSA_KEYX[] = { 'R','S','A','_','K','E','Y','X',0 };
static const WCHAR RSA_SIGN[] = { 'R','S','A','_','S','I','G','N',0 };
@@ -1086,6 +1089,9 @@ static const WCHAR shaDSA[] = { 's','h','a','D','S','A',0 };
static const WCHAR sha1DSA[] = { 's','h','a','1','D','S','A',0 };
static const WCHAR shaRSA[] = { 's','h','a','R','S','A',0 };
static const WCHAR sha1RSA[] = { 's','h','a','1','R','S','A',0 };
+static const WCHAR sha256RSA[] = { 's','h','a','2','5','6','R','S','A',0 };
+static const WCHAR sha384RSA[] = { 's','h','a','3','8','4','R','S','A',0 };
+static const WCHAR sha512RSA[] = { 's','h','a','5','1','2','R','S','A',0 };
static const WCHAR mosaicUpdatedSig[] =
{ 'm','o','s','a','i','c','U','p','d','a','t','e','d','S','i','g',0 };
static const WCHAR CN[] = { 'C','N',0 };
@@ -1189,6 +1195,9 @@ static const struct OIDInfoConstructor {
{ 3, szOID_PKIX_NO_SIGNATURE, CALG_NO_SIGN, NO_SIGN, NULL },
{ 4, szOID_RSA_SHA1RSA, CALG_SHA1, sha1RSA, &rsaSignBlob },
+ { 4, szOID_RSA_SHA256RSA, CALG_SHA_256, sha256RSA, &rsaSignBlob },
+ { 4, szOID_RSA_SHA384RSA, CALG_SHA_384, sha384RSA, &rsaSignBlob },
+ { 4, szOID_RSA_SHA512RSA, CALG_SHA_512, sha512RSA, &rsaSignBlob },
{ 4, szOID_RSA_MD5RSA, CALG_MD5, md5RSA, &rsaSignBlob },
{ 4, szOID_X957_SHA1DSA, CALG_SHA1, sha1DSA, &dssSignBlob },
{ 4, szOID_OIWSEC_sha1RSASign, CALG_SHA1, sha1RSA, &rsaSignBlob },
diff --git a/dll/win32/dbghelp/dbghelp_private.h b/dll/win32/dbghelp/dbghelp_private.h
index e7e3c7c3c37..5ea2e824b6e 100644
--- a/dll/win32/dbghelp/dbghelp_private.h
+++ b/dll/win32/dbghelp/dbghelp_private.h
@@ -313,6 +313,36 @@ enum module_type
};
struct process;
+struct module;
+
+/* a module can be made of several debug information formats, so we have to
+ * support them all
+ */
+enum format_info
+{
+ DFI_ELF,
+ DFI_PE,
+ DFI_MACHO,
+ DFI_DWARF,
+ DFI_LAST
+};
+
+struct module_format
+{
+ struct module* module;
+ void (*remove)(struct process* pcs, struct module_format* modfmt);
+ void (*loc_compute)(struct process* pcs,
+ const struct module_format* modfmt,
+ const struct symt_function* func,
+ struct location* loc);
+ union
+ {
+ struct elf_module_info* elf_info;
+ struct dwarf2_module_info_s* dwarf2_info;
+ struct pe_module_info* pe_info;
+ struct macho_module_info* macho_info;
+ } u;
+};
struct module
{
@@ -324,10 +354,7 @@ struct module
unsigned short is_virtual : 1;
/* specific information for debug types */
- struct elf_module_info* elf_info;
- struct dwarf2_module_info_s*dwarf2_info;
-
- struct macho_module_info* macho_info;
+ struct module_format* format_info[DFI_LAST];
/* memory allocation pool */
struct pool pool;
@@ -340,10 +367,6 @@ struct module
unsigned sorttab_size;
struct symt_ht** addr_sorttab;
struct hash_table ht_symbols;
- void (*loc_compute)(struct process* pcs,
- const struct module* module,
- const struct symt_function* func,
- struct location* loc);
/* types */
struct hash_table ht_types;
@@ -471,11 +494,10 @@ extern DWORD calc_crc32(int fd);
typedef BOOL (*enum_modules_cb)(const WCHAR*, unsigned long addr, void* user);
/* elf_module.c */
-#define ELF_NO_MAP ((const void*)-1)
extern BOOL elf_enum_modules(HANDLE hProc, enum_modules_cb, void*);
extern BOOL elf_fetch_file_info(const WCHAR* name, DWORD* base, DWORD* size, DWORD* checksum);
-struct elf_file_map;
-extern BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap);
+struct image_file_map;
+extern BOOL elf_load_debug_info(struct module* module, struct image_file_map* fmap);
extern struct module*
elf_load_module(struct process* pcs, const WCHAR* name, unsigned long);
extern BOOL elf_read_wine_loader_dbg_info(struct process* pcs);
@@ -565,11 +587,7 @@ extern BOOL stabs_parse(struct module* module, unsigned long load_offset
/* dwarf.c */
extern BOOL dwarf2_parse(struct module* module, unsigned long load_offset,
const struct elf_thunk_area* thunks,
- const unsigned char* debug, unsigned int debug_size,
- const unsigned char* abbrev, unsigned int abbrev_size,
- const unsigned char* str, unsigned int str_size,
- const unsigned char* line, unsigned int line_size,
- const unsigned char* loclist, unsigned int loclist_size);
+ struct image_file_map* fmap);
/* stack.c */
extern BOOL sw_read_mem(struct cpu_stack_walk* csw, DWORD64 addr, void* ptr, DWORD sz);
diff --git a/dll/win32/dbghelp/dwarf.c b/dll/win32/dbghelp/dwarf.c
index 433dca88ff4..199b3bb4b8a 100644
--- a/dll/win32/dbghelp/dwarf.c
+++ b/dll/win32/dbghelp/dwarf.c
@@ -51,6 +51,7 @@
#include "oleauto.h"
#include "dbghelp_private.h"
+#include "image_private.h"
#include "wine/debug.h"
@@ -139,6 +140,7 @@ struct attribute
union
{
unsigned long uvalue;
+ ULONGLONG lluvalue;
long svalue;
const char* string;
struct dwarf2_block block;
@@ -157,6 +159,7 @@ typedef struct dwarf2_section_s
{
const unsigned char* address;
unsigned size;
+ DWORD_PTR rva;
} dwarf2_section_t;
enum dwarf2_sections {section_debug, section_string, section_abbrev, section_line, section_max};
@@ -512,9 +515,8 @@ static void dwarf2_fill_attr(const dwarf2_parse_context_t* ctx,
break;
case DW_FORM_data8:
- attr->u.block.size = 8;
- attr->u.block.ptr = data;
- data += 8;
+ attr->u.lluvalue = dwarf2_get_u8(data);
+ TRACE("data8<%s>\n", wine_dbgstr_longlong(attr->u.uvalue));
break;
case DW_FORM_ref1:
@@ -1480,6 +1482,11 @@ static void dwarf2_parse_variable(dwarf2_subprogram_t* subpgm,
v.n1.n2.n3.lVal = value.u.uvalue;
break;
+ case DW_FORM_data8:
+ v.n1.n2.vt = VT_UI8;
+ v.n1.n2.n3.llVal = value.u.lluvalue;
+ break;
+
case DW_FORM_sdata:
v.n1.n2.vt = VT_I4;
v.n1.n2.n3.lVal = value.u.svalue;
@@ -1511,12 +1518,6 @@ static void dwarf2_parse_variable(dwarf2_subprogram_t* subpgm,
}
break;
- case DW_FORM_data8:
- v.n1.n2.vt = VT_I1 | VT_BYREF;
- v.n1.n2.n3.byref = pool_alloc(&subpgm->ctx->module->pool, value.u.block.size);
- memcpy(v.n1.n2.n3.byref, value.u.block.ptr, value.u.block.size);
- break;
-
default:
FIXME("Unsupported form for const value %s (%lx)\n",
name.u.string, value.form);
@@ -1952,7 +1953,7 @@ static BOOL dwarf2_parse_line_numbers(const dwarf2_section_t* sections,
const char** p;
/* section with line numbers stripped */
- if (sections[section_line].address == ELF_NO_MAP)
+ if (sections[section_line].address == IMAGE_NO_MAP)
return FALSE;
traverse.data = sections[section_line].address + offset;
@@ -2211,7 +2212,7 @@ static BOOL dwarf2_parse_compilation_unit(const dwarf2_section_t* sections,
return ret;
}
-static BOOL dwarf2_lookup_loclist(const struct module* module, const BYTE* start,
+static BOOL dwarf2_lookup_loclist(const struct module_format* modfmt, const BYTE* start,
unsigned long ip,
dwarf2_traverse_context_t* lctx)
{
@@ -2219,7 +2220,7 @@ static BOOL dwarf2_lookup_loclist(const struct module* module, const BYTE* start
const BYTE* ptr = start;
DWORD len;
- while (ptr < module->dwarf2_info->debug_loc.address + module->dwarf2_info->debug_loc.size)
+ while (ptr < modfmt->u.dwarf2_info->debug_loc.address + modfmt->u.dwarf2_info->debug_loc.size)
{
beg = dwarf2_get_u4(ptr); ptr += 4;
end = dwarf2_get_u4(ptr); ptr += 4;
@@ -2240,7 +2241,7 @@ static BOOL dwarf2_lookup_loclist(const struct module* module, const BYTE* start
}
static enum location_error loc_compute_frame(struct process* pcs,
- const struct module* module,
+ const struct module_format* modfmt,
const struct symt_function* func,
DWORD ip, struct location* frame)
{
@@ -2266,8 +2267,8 @@ static enum location_error loc_compute_frame(struct process* pcs,
break;
case loc_dwarf2_location_list:
WARN("Searching loclist for %s\n", func->hash_elt.name);
- if (!dwarf2_lookup_loclist(module,
- module->dwarf2_info->debug_loc.address + pframe->offset,
+ if (!dwarf2_lookup_loclist(modfmt,
+ modfmt->u.dwarf2_info->debug_loc.address + pframe->offset,
ip, &lctx))
return loc_err_out_of_scope;
if ((err = compute_location(&lctx, frame, pcs->handle, NULL)) < 0) return err;
@@ -2289,7 +2290,7 @@ static enum location_error loc_compute_frame(struct process* pcs,
}
static void dwarf2_location_compute(struct process* pcs,
- const struct module* module,
+ const struct module_format* modfmt,
const struct symt_function* func,
struct location* loc)
{
@@ -2308,14 +2309,14 @@ static void dwarf2_location_compute(struct process* pcs,
/* instruction pointer relative to compiland's start */
ip = pcs->ctx_frame.InstructionOffset - ((struct symt_compiland*)func->container)->address;
- if ((err = loc_compute_frame(pcs, module, func, ip, &frame)) == 0)
+ if ((err = loc_compute_frame(pcs, modfmt, func, ip, &frame)) == 0)
{
switch (loc->kind)
{
case loc_dwarf2_location_list:
/* Then, if the variable has a location list, find it !! */
- if (dwarf2_lookup_loclist(module,
- module->dwarf2_info->debug_loc.address + loc->offset,
+ if (dwarf2_lookup_loclist(modfmt,
+ modfmt->u.dwarf2_info->debug_loc.address + loc->offset,
ip, &lctx))
goto do_compute;
err = loc_err_out_of_scope;
@@ -2350,56 +2351,115 @@ static void dwarf2_location_compute(struct process* pcs,
}
}
+static void dwarf2_module_remove(struct process* pcs, struct module_format* modfmt)
+{
+ HeapFree(GetProcessHeap(), 0, modfmt->u.dwarf2_info);
+ HeapFree(GetProcessHeap(), 0, modfmt);
+}
+
+static inline BOOL dwarf2_init_section(dwarf2_section_t* section, struct image_file_map* fmap,
+ const char* sectname, struct image_section_map* ism)
+{
+ struct image_section_map local_ism;
+
+ if (!ism) ism = &local_ism;
+ if (!image_find_section(fmap, sectname, ism))
+ {
+ section->address = NULL;
+ section->size = 0;
+ section->rva = 0;
+ return FALSE;
+ }
+
+ section->address = (const BYTE*)image_map_section(ism);
+ section->size = image_get_map_size(ism);
+ section->rva = image_get_map_rva(ism);
+ return TRUE;
+}
+
BOOL dwarf2_parse(struct module* module, unsigned long load_offset,
const struct elf_thunk_area* thunks,
- const unsigned char* debug, unsigned int debug_size,
- const unsigned char* abbrev, unsigned int abbrev_size,
- const unsigned char* str, unsigned int str_size,
- const unsigned char* line, unsigned int line_size,
- const unsigned char* loclist, unsigned int loclist_size)
+ struct image_file_map* fmap)
{
dwarf2_section_t section[section_max];
- unsigned char* ptr;
dwarf2_traverse_context_t mod_ctx;
+ struct image_section_map debug_sect, debug_str_sect, debug_abbrev_sect,
+ debug_line_sect, debug_loclist_sect;
+ BOOL ret = TRUE;
+ struct module_format* dwarf2_modfmt;
- mod_ctx.start_data = mod_ctx.data = debug;
- mod_ctx.end_data = debug + debug_size;
+ if (!dwarf2_init_section(§ion[section_debug], fmap, ".debug_info", &debug_sect))
+ {
+ /* no Dwarf debug info here, so there's no error */
+ return TRUE;
+ }
+ dwarf2_init_section(§ion[section_abbrev], fmap, ".debug_abbrev", &debug_abbrev_sect);
+ dwarf2_init_section(§ion[section_string], fmap, ".debug_str", &debug_str_sect);
+ dwarf2_init_section(§ion[section_line], fmap, ".debug_line", &debug_line_sect);
- module->loc_compute = dwarf2_location_compute;
+ if (section[section_debug].address == IMAGE_NO_MAP ||
+ section[section_abbrev].address == IMAGE_NO_MAP ||
+ section[section_string].address == IMAGE_NO_MAP)
+ {
+ ret = FALSE;
+ goto leave;
+ }
- section[section_debug].address = debug;
- section[section_debug].size = debug_size;
- section[section_abbrev].address = abbrev;
- section[section_abbrev].size = abbrev_size;
- section[section_string].address = str;
- section[section_string].size = str_size;
- section[section_line].address = line;
- section[section_line].size = line_size;
+ if (fmap->modtype == DMT_ELF)
+ {
+ /* debug info might have a different base address than .so file
+ * when elf file is prelinked after splitting off debug info
+ * adjust symbol base addresses accordingly
+ */
+ load_offset += fmap->u.elf.elf_start - debug_sect.fmap->u.elf.elf_start;
+ }
- if (loclist_size)
+ TRACE("Loading Dwarf2 information for %s\n", debugstr_w(module->module.ModuleName));
+
+ mod_ctx.start_data = mod_ctx.data = section[section_debug].address;
+ mod_ctx.end_data = mod_ctx.data + section[section_debug].size;
+
+
+ dwarf2_modfmt = HeapAlloc(GetProcessHeap(), 0, sizeof(*dwarf2_modfmt));
+ if (!dwarf2_modfmt) return FALSE;
+ dwarf2_modfmt->module = module;
+ dwarf2_modfmt->remove = dwarf2_module_remove;
+ dwarf2_modfmt->loc_compute = dwarf2_location_compute;
+ dwarf2_modfmt->u.dwarf2_info = NULL;
+ dwarf2_modfmt->module->format_info[DFI_DWARF] = dwarf2_modfmt;
+
+ image_find_section(fmap, ".debug_loc", &debug_loclist_sect);
+ if (image_get_map_size(&debug_loclist_sect))
{
/* initialize the dwarf2 specific info block for this module.
- * As we'll need later on the .debug_loc section content, we copy it in
- * the module structure for later reuse
+ * As we'll need later the .debug_loc section content, we won't unmap this
+ * section upon existing this function
*/
- module->dwarf2_info = HeapAlloc(GetProcessHeap(), 0, sizeof(*module->dwarf2_info) + loclist_size);
- if (!module->dwarf2_info) return FALSE;
- ptr = (unsigned char*)(module->dwarf2_info + 1);
- memcpy(ptr, loclist, loclist_size);
- module->dwarf2_info->debug_loc.address = ptr;
- module->dwarf2_info->debug_loc.size = loclist_size;
+ dwarf2_modfmt->u.dwarf2_info = HeapAlloc(GetProcessHeap(), 0,
+ sizeof(*dwarf2_modfmt->u.dwarf2_info));
+ if (!dwarf2_modfmt->u.dwarf2_info) goto leave;
+ dwarf2_modfmt->u.dwarf2_info->debug_loc.address = (const BYTE*)image_map_section(&debug_loclist_sect);
+ dwarf2_modfmt->u.dwarf2_info->debug_loc.size = image_get_map_size(&debug_loclist_sect);
}
+ else image_unmap_section(&debug_loclist_sect);
while (mod_ctx.data < mod_ctx.end_data)
{
- dwarf2_parse_compilation_unit(section, module, thunks, &mod_ctx, load_offset);
+ dwarf2_parse_compilation_unit(section, dwarf2_modfmt->module, thunks, &mod_ctx, load_offset);
}
- module->module.SymType = SymDia;
- module->module.CVSig = 'D' | ('W' << 8) | ('A' << 16) | ('R' << 24);
+ dwarf2_modfmt->module->module.SymType = SymDia;
+ dwarf2_modfmt->module->module.CVSig = 'D' | ('W' << 8) | ('A' << 16) | ('R' << 24);
/* FIXME: we could have a finer grain here */
- module->module.GlobalSymbols = TRUE;
- module->module.TypeInfo = TRUE;
- module->module.SourceIndexed = TRUE;
- module->module.Publics = TRUE;
- return TRUE;
+ dwarf2_modfmt->module->module.GlobalSymbols = TRUE;
+ dwarf2_modfmt->module->module.TypeInfo = TRUE;
+ dwarf2_modfmt->module->module.SourceIndexed = TRUE;
+ dwarf2_modfmt->module->module.Publics = TRUE;
+
+leave:
+ image_unmap_section(&debug_sect);
+ image_unmap_section(&debug_abbrev_sect);
+ image_unmap_section(&debug_str_sect);
+ image_unmap_section(&debug_line_sect);
+
+ return ret;
}
diff --git a/dll/win32/dbghelp/elf_module.c b/dll/win32/dbghelp/elf_module.c
index 6a8a1515f9d..573a04065c3 100644
--- a/dll/win32/dbghelp/elf_module.c
+++ b/dll/win32/dbghelp/elf_module.c
@@ -48,40 +48,11 @@
#include "dbghelp_private.h"
-#ifdef HAVE_ELF_H
-# include
-#endif
-#ifdef HAVE_SYS_ELF32_H
-# include
-#endif
-#ifdef HAVE_SYS_EXEC_ELF_H
-# include
-#endif
-#if !defined(DT_NUM)
-# if defined(DT_COUNT)
-# define DT_NUM DT_COUNT
-# else
-/* this seems to be a satisfactory value on Solaris, which doesn't support this AFAICT */
-# define DT_NUM 24
-# endif
-#endif
-#ifdef HAVE_LINK_H
-# include
-#endif
-#ifdef HAVE_SYS_LINK_H
-# include
-#endif
+#include "image_private.h"
#include "wine/library.h"
#include "wine/debug.h"
-struct elf_module_info
-{
- DWORD_PTR elf_addr;
- unsigned short elf_mark : 1,
- elf_loader : 1;
-};
-
#ifdef __ELF__
#define ELF_INFO_DEBUG_HEADER 0x0001
@@ -98,44 +69,6 @@ struct elf_info
const WCHAR* module_name; /* OUT found module name (if ELF_INFO_NAME is set) */
};
-#ifdef _WIN64
-#define Elf_Ehdr Elf64_Ehdr
-#define Elf_Shdr Elf64_Shdr
-#define Elf_Phdr Elf64_Phdr
-#define Elf_Dyn Elf64_Dyn
-#define Elf_Sym Elf64_Sym
-#else
-#define Elf_Ehdr Elf32_Ehdr
-#define Elf_Shdr Elf32_Shdr
-#define Elf_Phdr Elf32_Phdr
-#define Elf_Dyn Elf32_Dyn
-#define Elf_Sym Elf32_Sym
-#endif
-
-/* structure holding information while handling an ELF image
- * allows one by one section mapping for memory savings
- */
-struct elf_file_map
-{
- Elf_Ehdr elfhdr;
- size_t elf_size;
- size_t elf_start;
- struct
- {
- Elf_Shdr shdr;
- const char* mapped;
- }* sect;
- int fd;
- const char* shstrtab;
- struct elf_file_map* alternate; /* another ELF file (linked to this one) */
-};
-
-struct elf_section_map
-{
- struct elf_file_map* fmap;
- long sidx;
-};
-
struct symtab_elt
{
struct hash_table_elt ht_elt;
@@ -152,28 +85,39 @@ struct elf_thunk_area
unsigned long rva_end;
};
+struct elf_module_info
+{
+ unsigned long elf_addr;
+ unsigned short elf_mark : 1,
+ elf_loader : 1;
+ struct image_file_map file_map;
+};
+
/******************************************************************
* elf_map_section
*
* Maps a single section into memory from an ELF file
*/
-static const char* elf_map_section(struct elf_section_map* esm)
+const char* elf_map_section(struct image_section_map* ism)
{
+ struct elf_file_map* fmap = &ism->fmap->u.elf;
+
unsigned pgsz = getpagesize();
unsigned ofst, size;
- if (esm->sidx < 0 || esm->sidx >= esm->fmap->elfhdr.e_shnum ||
- esm->fmap->sect[esm->sidx].shdr.sh_type == SHT_NOBITS)
- return ELF_NO_MAP;
+ assert(ism->fmap->modtype == DMT_ELF);
+ if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.elf.elfhdr.e_shnum ||
+ fmap->sect[ism->sidx].shdr.sh_type == SHT_NOBITS)
+ return IMAGE_NO_MAP;
/* align required information on page size (we assume pagesize is a power of 2) */
- ofst = esm->fmap->sect[esm->sidx].shdr.sh_offset & ~(pgsz - 1);
- size = ((esm->fmap->sect[esm->sidx].shdr.sh_offset +
- esm->fmap->sect[esm->sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1)) - ofst;
- esm->fmap->sect[esm->sidx].mapped = mmap(NULL, size, PROT_READ, MAP_PRIVATE,
- esm->fmap->fd, ofst);
- if (esm->fmap->sect[esm->sidx].mapped == ELF_NO_MAP) return ELF_NO_MAP;
- return esm->fmap->sect[esm->sidx].mapped + (esm->fmap->sect[esm->sidx].shdr.sh_offset & (pgsz - 1));
+ ofst = fmap->sect[ism->sidx].shdr.sh_offset & ~(pgsz - 1);
+ size = ((fmap->sect[ism->sidx].shdr.sh_offset +
+ fmap->sect[ism->sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1)) - ofst;
+ fmap->sect[ism->sidx].mapped = mmap(NULL, size, PROT_READ, MAP_PRIVATE,
+ fmap->fd, ofst);
+ if (fmap->sect[ism->sidx].mapped == IMAGE_NO_MAP) return IMAGE_NO_MAP;
+ return fmap->sect[ism->sidx].mapped + (fmap->sect[ism->sidx].shdr.sh_offset & (pgsz - 1));
}
/******************************************************************
@@ -182,32 +126,34 @@ static const char* elf_map_section(struct elf_section_map* esm)
* Finds a section by name (and type) into memory from an ELF file
* or its alternate if any
*/
-static BOOL elf_find_section(struct elf_file_map* fmap, const char* name,
- unsigned sht, struct elf_section_map* esm)
+BOOL elf_find_section(struct image_file_map* _fmap, const char* name,
+ unsigned sht, struct image_section_map* ism)
{
+ struct elf_file_map* fmap;
unsigned i;
- while (fmap)
+ while (_fmap)
{
- if (fmap->shstrtab == ELF_NO_MAP)
+ fmap = &_fmap->u.elf;
+ if (fmap->shstrtab == IMAGE_NO_MAP)
{
- struct elf_section_map hdr_esm = {fmap, fmap->elfhdr.e_shstrndx};
- if ((fmap->shstrtab = elf_map_section(&hdr_esm)) == ELF_NO_MAP) break;
+ struct image_section_map hdr_ism = {_fmap, fmap->elfhdr.e_shstrndx};
+ if ((fmap->shstrtab = elf_map_section(&hdr_ism)) == IMAGE_NO_MAP) break;
}
for (i = 0; i < fmap->elfhdr.e_shnum; i++)
{
if (strcmp(fmap->shstrtab + fmap->sect[i].shdr.sh_name, name) == 0 &&
(sht == SHT_NULL || sht == fmap->sect[i].shdr.sh_type))
{
- esm->fmap = fmap;
- esm->sidx = i;
+ ism->fmap = _fmap;
+ ism->sidx = i;
return TRUE;
}
}
- fmap = fmap->alternate;
+ _fmap = fmap->alternate;
}
- esm->fmap = NULL;
- esm->sidx = -1;
+ ism->fmap = NULL;
+ ism->sidx = -1;
return FALSE;
}
@@ -216,46 +162,67 @@ static BOOL elf_find_section(struct elf_file_map* fmap, const char* name,
*
* Unmaps a single section from memory
*/
-static void elf_unmap_section(struct elf_section_map* esm)
+void elf_unmap_section(struct image_section_map* ism)
{
- if (esm->sidx >= 0 && esm->sidx < esm->fmap->elfhdr.e_shnum && esm->fmap->sect[esm->sidx].mapped != ELF_NO_MAP)
+ struct elf_file_map* fmap = &ism->fmap->u.elf;
+
+ if (ism->sidx >= 0 && ism->sidx < fmap->elfhdr.e_shnum && fmap->sect[ism->sidx].mapped != IMAGE_NO_MAP)
{
unsigned pgsz = getpagesize();
unsigned ofst, size;
- ofst = esm->fmap->sect[esm->sidx].shdr.sh_offset & ~(pgsz - 1);
- size = ((esm->fmap->sect[esm->sidx].shdr.sh_offset +
- esm->fmap->sect[esm->sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1)) - ofst;
- if (munmap((char*)esm->fmap->sect[esm->sidx].mapped, size) < 0)
+ ofst = fmap->sect[ism->sidx].shdr.sh_offset & ~(pgsz - 1);
+ size = ((fmap->sect[ism->sidx].shdr.sh_offset +
+ fmap->sect[ism->sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1)) - ofst;
+ if (munmap((char*)fmap->sect[ism->sidx].mapped, size) < 0)
WARN("Couldn't unmap the section\n");
- esm->fmap->sect[esm->sidx].mapped = ELF_NO_MAP;
+ fmap->sect[ism->sidx].mapped = IMAGE_NO_MAP;
}
}
-static void elf_end_find(struct elf_file_map* fmap)
+static void elf_end_find(struct image_file_map* fmap)
{
- struct elf_section_map esm;
+ struct image_section_map ism;
while (fmap)
{
- esm.fmap = fmap;
- esm.sidx = fmap->elfhdr.e_shstrndx;
- elf_unmap_section(&esm);
- fmap->shstrtab = ELF_NO_MAP;
- fmap = fmap->alternate;
+ ism.fmap = fmap;
+ ism.sidx = fmap->u.elf.elfhdr.e_shstrndx;
+ elf_unmap_section(&ism);
+ fmap->u.elf.shstrtab = IMAGE_NO_MAP;
+ fmap = fmap->u.elf.alternate;
}
}
+/******************************************************************
+ * elf_get_map_rva
+ *
+ * Get the RVA of an ELF section
+ */
+DWORD_PTR elf_get_map_rva(const struct image_section_map* ism)
+{
+ if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.elf.elfhdr.e_shnum)
+ return 0;
+ return ism->fmap->u.elf.sect[ism->sidx].shdr.sh_addr - ism->fmap->u.elf.elf_start;
+}
+
/******************************************************************
* elf_get_map_size
*
* Get the size of an ELF section
*/
-static inline unsigned elf_get_map_size(const struct elf_section_map* esm)
+unsigned elf_get_map_size(const struct image_section_map* ism)
{
- if (esm->sidx < 0 || esm->sidx >= esm->fmap->elfhdr.e_shnum)
+ if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.elf.elfhdr.e_shnum)
return 0;
- return esm->fmap->sect[esm->sidx].shdr.sh_size;
+ return ism->fmap->u.elf.sect[ism->sidx].shdr.sh_size;
+}
+
+static inline void elf_reset_file_map(struct image_file_map* fmap)
+{
+ fmap->u.elf.fd = -1;
+ fmap->u.elf.shstrtab = IMAGE_NO_MAP;
+ fmap->u.elf.alternate = NULL;
}
/******************************************************************
@@ -263,7 +230,7 @@ static inline unsigned elf_get_map_size(const struct elf_section_map* esm)
*
* Maps an ELF file into memory (and checks it's a real ELF file)
*/
-static BOOL elf_map_file(const WCHAR* filenameW, struct elf_file_map* fmap)
+static BOOL elf_map_file(const WCHAR* filenameW, struct image_file_map* fmap)
{
static const BYTE elf_signature[4] = { ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3 };
struct stat statbuf;
@@ -278,56 +245,55 @@ static BOOL elf_map_file(const WCHAR* filenameW, struct elf_file_map* fmap)
if (!(filename = HeapAlloc(GetProcessHeap(), 0, len))) return FALSE;
WideCharToMultiByte(CP_UNIXCP, 0, filenameW, -1, filename, len, NULL, NULL);
- fmap->fd = -1;
- fmap->shstrtab = ELF_NO_MAP;
- fmap->alternate = NULL;
+ elf_reset_file_map(fmap);
+ fmap->modtype = DMT_ELF;
/* check that the file exists, and that the module hasn't been loaded yet */
if (stat(filename, &statbuf) == -1 || S_ISDIR(statbuf.st_mode)) goto done;
/* Now open the file, so that we can mmap() it. */
- if ((fmap->fd = open(filename, O_RDONLY)) == -1) goto done;
+ if ((fmap->u.elf.fd = open(filename, O_RDONLY)) == -1) goto done;
- if (read(fmap->fd, &fmap->elfhdr, sizeof(fmap->elfhdr)) != sizeof(fmap->elfhdr))
+ if (read(fmap->u.elf.fd, &fmap->u.elf.elfhdr, sizeof(fmap->u.elf.elfhdr)) != sizeof(fmap->u.elf.elfhdr))
goto done;
/* and check for an ELF header */
- if (memcmp(fmap->elfhdr.e_ident,
+ if (memcmp(fmap->u.elf.elfhdr.e_ident,
elf_signature, sizeof(elf_signature))) goto done;
/* and check 32 vs 64 size according to current machine */
#ifdef _WIN64
- if (fmap->elfhdr.e_ident[EI_CLASS] != ELFCLASS64) goto done;
+ if (fmap->u.elf.elfhdr.e_ident[EI_CLASS] != ELFCLASS64) goto done;
#else
- if (fmap->elfhdr.e_ident[EI_CLASS] != ELFCLASS32) goto done;
+ if (fmap->u.elf.elfhdr.e_ident[EI_CLASS] != ELFCLASS32) goto done;
#endif
- fmap->sect = HeapAlloc(GetProcessHeap(), 0,
- fmap->elfhdr.e_shnum * sizeof(fmap->sect[0]));
- if (!fmap->sect) goto done;
+ fmap->u.elf.sect = HeapAlloc(GetProcessHeap(), 0,
+ fmap->u.elf.elfhdr.e_shnum * sizeof(fmap->u.elf.sect[0]));
+ if (!fmap->u.elf.sect) goto done;
- lseek(fmap->fd, fmap->elfhdr.e_shoff, SEEK_SET);
- for (i = 0; i < fmap->elfhdr.e_shnum; i++)
+ lseek(fmap->u.elf.fd, fmap->u.elf.elfhdr.e_shoff, SEEK_SET);
+ for (i = 0; i < fmap->u.elf.elfhdr.e_shnum; i++)
{
- read(fmap->fd, &fmap->sect[i].shdr, sizeof(fmap->sect[i].shdr));
- fmap->sect[i].mapped = ELF_NO_MAP;
+ read(fmap->u.elf.fd, &fmap->u.elf.sect[i].shdr, sizeof(fmap->u.elf.sect[i].shdr));
+ fmap->u.elf.sect[i].mapped = IMAGE_NO_MAP;
}
/* grab size of module once loaded in memory */
- lseek(fmap->fd, fmap->elfhdr.e_phoff, SEEK_SET);
- fmap->elf_size = 0;
- fmap->elf_start = ~0L;
- for (i = 0; i < fmap->elfhdr.e_phnum; i++)
+ lseek(fmap->u.elf.fd, fmap->u.elf.elfhdr.e_phoff, SEEK_SET);
+ fmap->u.elf.elf_size = 0;
+ fmap->u.elf.elf_start = ~0L;
+ for (i = 0; i < fmap->u.elf.elfhdr.e_phnum; i++)
{
- if (read(fmap->fd, &phdr, sizeof(phdr)) == sizeof(phdr) &&
+ if (read(fmap->u.elf.fd, &phdr, sizeof(phdr)) == sizeof(phdr) &&
phdr.p_type == PT_LOAD)
{
tmp = (phdr.p_vaddr + phdr.p_memsz + page_mask) & ~page_mask;
- if (fmap->elf_size < tmp) fmap->elf_size = tmp;
- if (phdr.p_vaddr < fmap->elf_start) fmap->elf_start = phdr.p_vaddr;
+ if (fmap->u.elf.elf_size < tmp) fmap->u.elf.elf_size = tmp;
+ if (phdr.p_vaddr < fmap->u.elf.elf_start) fmap->u.elf.elf_start = phdr.p_vaddr;
}
}
/* if non relocatable ELF, then remove fixed address from computation
* otherwise, all addresses are zero based and start has no effect
*/
- fmap->elf_size -= fmap->elf_start;
+ fmap->u.elf.elf_size -= fmap->u.elf.elf_start;
ret = TRUE;
done:
HeapFree(GetProcessHeap(), 0, filename);
@@ -339,25 +305,31 @@ done:
*
* Unmaps an ELF file from memory (previously mapped with elf_map_file)
*/
-static void elf_unmap_file(struct elf_file_map* fmap)
+static void elf_unmap_file(struct image_file_map* fmap)
{
while (fmap)
{
- if (fmap->fd != -1)
+ if (fmap->u.elf.fd != -1)
{
- struct elf_section_map esm;
- esm.fmap = fmap;
- for (esm.sidx = 0; esm.sidx < fmap->elfhdr.e_shnum; esm.sidx++)
+ struct image_section_map ism;
+ ism.fmap = fmap;
+ for (ism.sidx = 0; ism.sidx < fmap->u.elf.elfhdr.e_shnum; ism.sidx++)
{
- elf_unmap_section(&esm);
+ elf_unmap_section(&ism);
}
- HeapFree(GetProcessHeap(), 0, fmap->sect);
- close(fmap->fd);
+ HeapFree(GetProcessHeap(), 0, fmap->u.elf.sect);
+ close(fmap->u.elf.fd);
}
- fmap = fmap->alternate;
+ fmap = fmap->u.elf.alternate;
}
}
+static void elf_module_remove(struct process* pcs, struct module_format* modfmt)
+{
+ elf_unmap_file(&modfmt->u.elf_info->file_map);
+ HeapFree(GetProcessHeap(), 0, modfmt);
+}
+
/******************************************************************
* elf_is_in_thunk_area
*
@@ -382,8 +354,8 @@ int elf_is_in_thunk_area(unsigned long addr,
*
* creating an internal hash table to ease use ELF symtab information lookup
*/
-static void elf_hash_symtab(struct module* module, struct pool* pool,
- struct hash_table* ht_symtab, struct elf_file_map* fmap,
+static void elf_hash_symtab(struct module* module, struct pool* pool,
+ struct hash_table* ht_symtab, struct image_file_map* fmap,
struct elf_thunk_area* thunks)
{
int i, j, nsym;
@@ -393,16 +365,20 @@ static void elf_hash_symtab(struct module* module, struct pool* pool,
const char* ptr;
const Elf_Sym* symp;
struct symtab_elt* ste;
- struct elf_section_map esm, esm_str;
+ struct image_section_map ism, ism_str;
- if (!elf_find_section(fmap, ".symtab", SHT_SYMTAB, &esm) &&
- !elf_find_section(fmap, ".dynsym", SHT_DYNSYM, &esm)) return;
- if ((symp = (const Elf_Sym*)elf_map_section(&esm)) == ELF_NO_MAP) return;
- esm_str.fmap = fmap;
- esm_str.sidx = fmap->sect[esm.sidx].shdr.sh_link;
- if ((strp = elf_map_section(&esm_str)) == ELF_NO_MAP) return;
+ if (!elf_find_section(fmap, ".symtab", SHT_SYMTAB, &ism) &&
+ !elf_find_section(fmap, ".dynsym", SHT_DYNSYM, &ism)) return;
+ if ((symp = (const Elf_Sym*)image_map_section(&ism)) == IMAGE_NO_MAP) return;
+ ism_str.fmap = ism.fmap;
+ ism_str.sidx = fmap->u.elf.sect[ism.sidx].shdr.sh_link;
+ if ((strp = image_map_section(&ism_str)) == IMAGE_NO_MAP)
+ {
+ image_unmap_section(&ism);
+ return;
+ }
- nsym = elf_get_map_size(&esm) / sizeof(*symp);
+ nsym = image_get_map_size(&ism) / sizeof(*symp);
for (j = 0; thunks[j].symname; j++)
thunks[j].rva_start = thunks[j].rva_end = 0;
@@ -567,6 +543,7 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table
void* ptr;
struct symt_ht* sym;
const Elf_Sym* symp;
+ struct elf_module_info* elf_info = module->format_info[DFI_ELF]->u.elf_info;
hash_table_iter_init(&module->ht_symbols, &hti, NULL);
while ((ptr = hash_table_iter_up(&hti)))
@@ -575,7 +552,7 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table
switch (sym->symt.tag)
{
case SymTagFunction:
- if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
+ if (((struct symt_function*)sym)->address != elf_info->elf_addr &&
((struct symt_function*)sym)->size)
{
break;
@@ -584,18 +561,17 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table
((struct symt_function*)sym)->container);
if (symp)
{
- if (((struct symt_function*)sym)->address != module->elf_info->elf_addr &&
- ((struct symt_function*)sym)->address != module->elf_info->elf_addr + symp->st_value)
+ if (((struct symt_function*)sym)->address != elf_info->elf_addr &&
+ ((struct symt_function*)sym)->address != elf_info->elf_addr + symp->st_value)
FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
sym, debugstr_w(module->module.ModuleName), sym->hash_elt.name,
- ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
+ ((struct symt_function*)sym)->address, elf_info->elf_addr + symp->st_value);
if (((struct symt_function*)sym)->size && ((struct symt_function*)sym)->size != symp->st_size)
FIXME("Changing size for %p/%s!%s from %08lx to %08x\n",
sym, debugstr_w(module->module.ModuleName), sym->hash_elt.name,
((struct symt_function*)sym)->size, (unsigned int)symp->st_size);
- ((struct symt_function*)sym)->address = module->elf_info->elf_addr +
- symp->st_value;
+ ((struct symt_function*)sym)->address = elf_info->elf_addr + symp->st_value;
((struct symt_function*)sym)->size = symp->st_size;
} else
FIXME("Couldn't find %s!%s\n",
@@ -606,19 +582,18 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table
{
case DataIsGlobal:
case DataIsFileStatic:
- if (((struct symt_data*)sym)->u.var.offset != module->elf_info->elf_addr)
+ if (((struct symt_data*)sym)->u.var.offset != elf_info->elf_addr)
break;
symp = elf_lookup_symtab(module, symtab, sym->hash_elt.name,
((struct symt_data*)sym)->container);
if (symp)
{
- if (((struct symt_data*)sym)->u.var.offset != module->elf_info->elf_addr &&
- ((struct symt_data*)sym)->u.var.offset != module->elf_info->elf_addr + symp->st_value)
+ if (((struct symt_data*)sym)->u.var.offset != elf_info->elf_addr &&
+ ((struct symt_data*)sym)->u.var.offset != elf_info->elf_addr + symp->st_value)
FIXME("Changing address for %p/%s!%s from %08lx to %08lx\n",
sym, debugstr_w(module->module.ModuleName), sym->hash_elt.name,
- ((struct symt_function*)sym)->address, module->elf_info->elf_addr + symp->st_value);
- ((struct symt_data*)sym)->u.var.offset = module->elf_info->elf_addr +
- symp->st_value;
+ ((struct symt_function*)sym)->address, elf_info->elf_addr + symp->st_value);
+ ((struct symt_data*)sym)->u.var.offset = elf_info->elf_addr + symp->st_value;
((struct symt_data*)sym)->kind = (ELF32_ST_BIND(symp->st_info) == STB_LOCAL) ?
DataIsFileStatic : DataIsGlobal;
} else
@@ -656,7 +631,7 @@ static int elf_new_wine_thunks(struct module* module, const struct hash_table* h
{
if (ste->used) continue;
- addr = module->elf_info->elf_addr + ste->symp->st_value;
+ addr = module->format_info[DFI_ELF]->u.elf_info->elf_addr + ste->symp->st_value;
j = elf_is_in_thunk_area(ste->symp->st_value, thunks);
if (j >= 0) /* thunk found */
@@ -748,20 +723,20 @@ static int elf_new_public_symbols(struct module* module, const struct hash_table
while ((ste = hash_table_iter_up(&hti)))
{
symt_new_public(module, ste->compiland, ste->ht_elt.name,
- module->elf_info->elf_addr + ste->symp->st_value,
+ module->format_info[DFI_ELF]->u.elf_info->elf_addr + ste->symp->st_value,
ste->symp->st_size);
}
return TRUE;
}
-static BOOL elf_check_debug_link(const WCHAR* file, struct elf_file_map* fmap, DWORD crc)
+static BOOL elf_check_debug_link(const WCHAR* file, struct image_file_map* fmap, DWORD crc)
{
BOOL ret;
if (!elf_map_file(file, fmap)) return FALSE;
- if (!(ret = crc == calc_crc32(fmap->fd)))
+ if (!(ret = crc == calc_crc32(fmap->u.elf.fd)))
{
WARN("Bad CRC for file %s (got %08x while expecting %08x)\n",
- debugstr_w(file), calc_crc32(fmap->fd), crc);
+ debugstr_w(file), calc_crc32(fmap->u.elf.fd), crc);
elf_unmap_file(fmap);
}
return ret;
@@ -786,7 +761,7 @@ static BOOL elf_check_debug_link(const WCHAR* file, struct elf_file_map* fmap, D
* is the global debug file directory, and execdir has been turned
* into a relative path)." (from GDB manual)
*/
-static BOOL elf_locate_debug_link(struct elf_file_map* fmap, const char* filename,
+static BOOL elf_locate_debug_link(struct image_file_map* fmap, const char* filename,
const WCHAR* loaded_file, DWORD crc)
{
static const WCHAR globalDebugDirW[] = {'/','u','s','r','/','l','i','b','/','d','e','b','u','g','/'};
@@ -795,7 +770,7 @@ static BOOL elf_locate_debug_link(struct elf_file_map* fmap, const char* filenam
size_t filename_len;
WCHAR* p = NULL;
WCHAR* slash;
- struct elf_file_map* fmap_link = NULL;
+ struct image_file_map* fmap_link = NULL;
fmap_link = HeapAlloc(GetProcessHeap(), 0, sizeof(*fmap_link));
if (!fmap_link) return FALSE;
@@ -838,7 +813,7 @@ static BOOL elf_locate_debug_link(struct elf_file_map* fmap, const char* filenam
found:
TRACE("Located debug information file %s at %s\n", filename, debugstr_w(p));
HeapFree(GetProcessHeap(), 0, p);
- fmap->alternate = fmap_link;
+ fmap->u.elf.alternate = fmap_link;
return TRUE;
}
@@ -848,7 +823,7 @@ found:
* Parses a .gnu_debuglink section and loads the debug info from
* the external file specified there.
*/
-static BOOL elf_debuglink_parse(struct elf_file_map* fmap, const struct module* module,
+static BOOL elf_debuglink_parse(struct image_file_map* fmap, const struct module* module,
const BYTE* debuglink)
{
/* The content of a debug link section is:
@@ -877,8 +852,8 @@ static BOOL elf_debuglink_parse(struct elf_file_map* fmap, const struct module*
* read or parsed)
* 1 on success
*/
-static BOOL elf_load_debug_info_from_map(struct module* module,
- struct elf_file_map* fmap,
+static BOOL elf_load_debug_info_from_map(struct module* module,
+ struct image_file_map* fmap,
struct pool* pool,
struct hash_table* ht_symtab)
{
@@ -901,18 +876,16 @@ static BOOL elf_load_debug_info_from_map(struct module* module,
if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
{
- struct elf_section_map stab_sect, stabstr_sect;
- struct elf_section_map debug_sect, debug_str_sect, debug_abbrev_sect,
- debug_line_sect, debug_loclist_sect;
- struct elf_section_map debuglink_sect;
+ struct image_section_map stab_sect, stabstr_sect;
+ struct image_section_map debuglink_sect;
/* if present, add the .gnu_debuglink file as an alternate to current one */
if (elf_find_section(fmap, ".gnu_debuglink", SHT_NULL, &debuglink_sect))
{
const BYTE* dbg_link;
- dbg_link = (const BYTE*)elf_map_section(&debuglink_sect);
- if (dbg_link != ELF_NO_MAP)
+ dbg_link = (const BYTE*)image_map_section(&debuglink_sect);
+ if (dbg_link != IMAGE_NO_MAP)
{
lret = elf_debuglink_parse(fmap, module, dbg_link);
if (!lret)
@@ -920,7 +893,7 @@ static BOOL elf_load_debug_info_from_map(struct module* module,
debugstr_w(module->module.ModuleName));
ret = ret || lret;
}
- elf_unmap_section(&debuglink_sect);
+ image_unmap_section(&debuglink_sect);
}
if (elf_find_section(fmap, ".stab", SHT_NULL, &stab_sect) &&
elf_find_section(fmap, ".stabstr", SHT_NULL, &stabstr_sect))
@@ -928,14 +901,14 @@ static BOOL elf_load_debug_info_from_map(struct module* module,
const char* stab;
const char* stabstr;
- stab = elf_map_section(&stab_sect);
- stabstr = elf_map_section(&stabstr_sect);
- if (stab != ELF_NO_MAP && stabstr != ELF_NO_MAP)
+ stab = image_map_section(&stab_sect);
+ stabstr = image_map_section(&stabstr_sect);
+ if (stab != IMAGE_NO_MAP && stabstr != IMAGE_NO_MAP)
{
/* OK, now just parse all of the stabs. */
- lret = stabs_parse(module, module->elf_info->elf_addr,
- stab, elf_get_map_size(&stab_sect),
- stabstr, elf_get_map_size(&stabstr_sect),
+ lret = stabs_parse(module, module->format_info[DFI_ELF]->u.elf_info->elf_addr,
+ stab, image_get_map_size(&stab_sect),
+ stabstr, image_get_map_size(&stabstr_sect),
NULL, NULL);
if (lret)
/* and fill in the missing information for stabs */
@@ -945,57 +918,12 @@ static BOOL elf_load_debug_info_from_map(struct module* module,
ret = ret || lret;
}
else lret = FALSE;
- elf_unmap_section(&stab_sect);
- elf_unmap_section(&stabstr_sect);
- }
- if (elf_find_section(fmap, ".debug_info", SHT_NULL, &debug_sect))
- {
- /* Dwarf 2 debug information */
- const BYTE* dw2_debug;
- const BYTE* dw2_debug_abbrev;
- const BYTE* dw2_debug_str;
- const BYTE* dw2_debug_line;
- const BYTE* dw2_debug_loclist;
-
- /* debug info might have a different base address than .so file
- * when elf file is prelinked after splitting off debug info
- * adjust symbol base addresses accordingly
- */
- unsigned long load_offset = module->elf_info->elf_addr +
- fmap->elf_start - debug_sect.fmap->elf_start;
-
- TRACE("Loading Dwarf2 information for %s\n", debugstr_w(module->module.ModuleName));
-
- elf_find_section(fmap, ".debug_str", SHT_NULL, &debug_str_sect);
- elf_find_section(fmap, ".debug_abbrev", SHT_NULL, &debug_abbrev_sect);
- elf_find_section(fmap, ".debug_line", SHT_NULL, &debug_line_sect);
- elf_find_section(fmap, ".debug_loc", SHT_NULL, &debug_loclist_sect);
-
- dw2_debug = (const BYTE*)elf_map_section(&debug_sect);
- dw2_debug_abbrev = (const BYTE*)elf_map_section(&debug_abbrev_sect);
- dw2_debug_str = (const BYTE*)elf_map_section(&debug_str_sect);
- dw2_debug_line = (const BYTE*)elf_map_section(&debug_line_sect);
- dw2_debug_loclist = (const BYTE*)elf_map_section(&debug_loclist_sect);
- if (dw2_debug != ELF_NO_MAP && dw2_debug_abbrev != ELF_NO_MAP && dw2_debug_str != ELF_NO_MAP)
- {
- /* OK, now just parse dwarf2 debug infos. */
- lret = dwarf2_parse(module, load_offset, thunks,
- dw2_debug, elf_get_map_size(&debug_sect),
- dw2_debug_abbrev, elf_get_map_size(&debug_abbrev_sect),
- dw2_debug_str, elf_get_map_size(&debug_str_sect),
- dw2_debug_line, elf_get_map_size(&debug_line_sect),
- dw2_debug_loclist, elf_get_map_size(&debug_loclist_sect));
-
- if (!lret)
- WARN("Couldn't correctly read dwarf2\n");
- ret = ret || lret;
- }
- elf_unmap_section(&debug_sect);
- elf_unmap_section(&debug_abbrev_sect);
- elf_unmap_section(&debug_str_sect);
- elf_unmap_section(&debug_line_sect);
- elf_unmap_section(&debug_loclist_sect);
+ image_unmap_section(&stab_sect);
+ image_unmap_section(&stabstr_sect);
}
+ lret = dwarf2_parse(module, module->format_info[DFI_ELF]->u.elf_info->elf_addr,
+ thunks, fmap);
+ ret = ret || lret;
}
if (strstrW(module->module.ModuleName, S_ElfW) ||
!strcmpW(module->module.ModuleName, S_WineLoaderW))
@@ -1015,14 +943,15 @@ static BOOL elf_load_debug_info_from_map(struct module* module,
*
* Loads ELF debugging information from the module image file.
*/
-BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
+BOOL elf_load_debug_info(struct module* module, struct image_file_map* fmap)
{
- BOOL ret = TRUE;
- struct pool pool;
- struct hash_table ht_symtab;
- struct elf_file_map my_fmap;
+ BOOL ret = TRUE;
+ struct pool pool;
+ struct hash_table ht_symtab;
+ struct image_file_map my_fmap;
+ struct module_format* modfmt;
- if (module->type != DMT_ELF || !module->elf_info)
+ if (module->type != DMT_ELF || !(modfmt = module->format_info[DFI_ELF]) || !modfmt->u.elf_info)
{
ERR("Bad elf module '%s'\n", debugstr_w(module->module.LoadedImageName));
return FALSE;
@@ -1039,6 +968,12 @@ BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
if (ret)
ret = elf_load_debug_info_from_map(module, fmap, &pool, &ht_symtab);
+ if (ret)
+ {
+ modfmt->u.elf_info->file_map = *fmap;
+ elf_reset_file_map(fmap);
+ }
+
pool_destroy(&pool);
if (fmap == &my_fmap) elf_unmap_file(fmap);
return ret;
@@ -1052,12 +987,12 @@ BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
BOOL elf_fetch_file_info(const WCHAR* name, DWORD* base,
DWORD* size, DWORD* checksum)
{
- struct elf_file_map fmap;
+ struct image_file_map fmap;
if (!elf_map_file(name, &fmap)) return FALSE;
- if (base) *base = fmap.elf_start;
- *size = fmap.elf_size;
- *checksum = calc_crc32(fmap.fd);
+ if (base) *base = fmap.u.elf.elf_start;
+ *size = fmap.u.elf.elf_size;
+ *checksum = calc_crc32(fmap.u.elf.fd);
elf_unmap_file(&fmap);
return TRUE;
}
@@ -1076,8 +1011,8 @@ BOOL elf_fetch_file_info(const WCHAR* name, DWORD* base,
static BOOL elf_load_file(struct process* pcs, const WCHAR* filename,
unsigned long load_offset, struct elf_info* elf_info)
{
- BOOL ret = FALSE;
- struct elf_file_map fmap;
+ BOOL ret = FALSE;
+ struct image_file_map fmap;
TRACE("Processing elf file '%s' at %08lx\n", debugstr_w(filename), load_offset);
@@ -1087,10 +1022,10 @@ static BOOL elf_load_file(struct process* pcs, const WCHAR* filename,
* this thing. We need the main executable header, and the section
* table.
*/
- if (!fmap.elf_start && !load_offset)
+ if (!fmap.u.elf.elf_start && !load_offset)
ERR("Relocatable ELF %s, but no load address. Loading at 0x0000000\n",
debugstr_w(filename));
- if (fmap.elf_start && load_offset)
+ if (fmap.u.elf.elf_start && load_offset)
{
WARN("Non-relocatable ELF %s, but load address of 0x%08lx supplied. "
"Assuming load address is corrupt\n", debugstr_w(filename), load_offset);
@@ -1099,12 +1034,12 @@ static BOOL elf_load_file(struct process* pcs, const WCHAR* filename,
if (elf_info->flags & ELF_INFO_DEBUG_HEADER)
{
- struct elf_section_map esm;
+ struct image_section_map ism;
- if (elf_find_section(&fmap, ".dynamic", SHT_DYNAMIC, &esm))
+ if (elf_find_section(&fmap, ".dynamic", SHT_DYNAMIC, &ism))
{
Elf_Dyn dyn;
- char* ptr = (char*)fmap.sect[esm.sidx].shdr.sh_addr;
+ char* ptr = (char*)fmap.u.elf.sect[ism.sidx].shdr.sh_addr;
unsigned long len;
do
@@ -1126,29 +1061,40 @@ static BOOL elf_load_file(struct process* pcs, const WCHAR* filename,
if (elf_info->flags & ELF_INFO_MODULE)
{
- struct elf_module_info *elf_module_info =
- HeapAlloc(GetProcessHeap(), 0, sizeof(struct elf_module_info));
- if (!elf_module_info) goto leave;
+ struct elf_module_info *elf_module_info;
+ struct module_format* modfmt;
+
+ modfmt = HeapAlloc(GetProcessHeap(), 0,
+ sizeof(struct module_format) + sizeof(struct elf_module_info));
+ if (!modfmt) goto leave;
elf_info->module = module_new(pcs, filename, DMT_ELF, FALSE,
- (load_offset) ? load_offset : fmap.elf_start,
- fmap.elf_size, 0, calc_crc32(fmap.fd));
+ (load_offset) ? load_offset : fmap.u.elf.elf_start,
+ fmap.u.elf.elf_size, 0, calc_crc32(fmap.u.elf.fd));
if (!elf_info->module)
{
- HeapFree(GetProcessHeap(), 0, elf_module_info);
+ HeapFree(GetProcessHeap(), 0, modfmt);
goto leave;
}
- elf_info->module->elf_info = elf_module_info;
- elf_info->module->elf_info->elf_addr = load_offset;
+ elf_module_info = (void*)(modfmt + 1);
+ elf_info->module->format_info[DFI_ELF] = modfmt;
+ modfmt->module = elf_info->module;
+ modfmt->remove = elf_module_remove;
+ modfmt->loc_compute = NULL;
+ modfmt->u.elf_info = elf_module_info;
+
+ elf_module_info->elf_addr = load_offset;
if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
{
elf_info->module->module.SymType = SymDeferred;
+ elf_module_info->file_map = fmap;
+ elf_reset_file_map(&fmap);
ret = TRUE;
}
else ret = elf_load_debug_info(elf_info->module, &fmap);
- elf_info->module->elf_info->elf_mark = 1;
- elf_info->module->elf_info->elf_loader = 0;
+ elf_module_info->elf_mark = 1;
+ elf_module_info->elf_loader = 0;
} else ret = TRUE;
if (elf_info->flags & ELF_INFO_NAME)
@@ -1260,7 +1206,7 @@ static BOOL elf_search_and_load_file(struct process* pcs, const WCHAR* filename,
if ((module = module_is_already_loaded(pcs, filename)))
{
elf_info->module = module;
- module->elf_info->elf_mark = 1;
+ elf_info->module->format_info[DFI_ELF]->u.elf_info->elf_mark = 1;
return module->module.SymType;
}
@@ -1352,7 +1298,7 @@ BOOL elf_synchronize_module_list(struct process* pcs)
for (module = pcs->lmodules; module; module = module->next)
{
if (module->type == DMT_ELF && !module->is_virtual)
- module->elf_info->elf_mark = 0;
+ module->format_info[DFI_ELF]->u.elf_info->elf_mark = 0;
}
es.pcs = pcs;
@@ -1363,14 +1309,19 @@ BOOL elf_synchronize_module_list(struct process* pcs)
module = pcs->lmodules;
while (module)
{
- if (module->type == DMT_ELF && !module->is_virtual &&
- !module->elf_info->elf_mark && !module->elf_info->elf_loader)
+ if (module->type == DMT_ELF && !module->is_virtual)
{
- module_remove(pcs, module);
- /* restart all over */
- module = pcs->lmodules;
+ struct elf_module_info* elf_info = module->format_info[DFI_ELF]->u.elf_info;
+
+ if (!elf_info->elf_mark && !elf_info->elf_loader)
+ {
+ module_remove(pcs, module);
+ /* restart all over */
+ module = pcs->lmodules;
+ continue;
+ }
}
- else module = module->next;
+ module = module->next;
}
return TRUE;
}
@@ -1415,7 +1366,7 @@ BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_MODULE;
if (!elf_search_loader(pcs, &elf_info)) return FALSE;
- elf_info.module->elf_info->elf_loader = 1;
+ elf_info.module->format_info[DFI_ELF]->u.elf_info->elf_loader = 1;
module_set_module(elf_info.module, S_WineLoaderW);
return (pcs->dbg_hdr_addr = elf_info.dbg_hdr_addr) != 0;
}
@@ -1516,6 +1467,30 @@ struct module* elf_load_module(struct process* pcs, const WCHAR* name, unsigned
#else /* !__ELF__ */
+BOOL elf_find_section(struct image_file_map* fmap, const char* name,
+ unsigned sht, struct image_section_map* ism)
+{
+ return FALSE;
+}
+
+const char* elf_map_section(struct image_section_map* ism)
+{
+ return NULL;
+}
+
+void elf_unmap_section(struct image_section_map* ism)
+{}
+
+unsigned elf_get_map_size(const struct image_section_map* ism)
+{
+ return 0;
+}
+
+DWORD_PTR elf_get_map_rva(const struct image_section_map* ism)
+{
+ return 0;
+}
+
BOOL elf_synchronize_module_list(struct process* pcs)
{
return FALSE;
@@ -1542,7 +1517,7 @@ struct module* elf_load_module(struct process* pcs, const WCHAR* name, unsigned
return NULL;
}
-BOOL elf_load_debug_info(struct module* module, struct elf_file_map* fmap)
+BOOL elf_load_debug_info(struct module* module, struct image_file_map* fmap)
{
return FALSE;
}
diff --git a/dll/win32/dbghelp/macho_module.c b/dll/win32/dbghelp/macho_module.c
index 379596b2f58..44fa4f2da1c 100644
--- a/dll/win32/dbghelp/macho_module.c
+++ b/dll/win32/dbghelp/macho_module.c
@@ -655,9 +655,10 @@ static int macho_parse_symtab(struct macho_file_map* fmap,
sc->stroff, sc->strsize, (const void**)&stab, (const void**)&stabstr))
return 0;
- if (!stabs_parse(mdi->module, mdi->module->macho_info->load_addr - fmap->segs_start,
- stab, sc->nsyms * sizeof(struct nlist),
- stabstr, sc->strsize, macho_stabs_def_cb, mdi))
+ if (!stabs_parse(mdi->module,
+ mdi->module->format_info[DFI_MACHO]->u.macho_info->load_addr - fmap->segs_start,
+ stab, sc->nsyms * sizeof(struct nlist),
+ stabstr, sc->strsize, macho_stabs_def_cb, mdi))
ret = -1;
macho_unmap_ranges(fmap, sc->symoff, sc->nsyms * sizeof(struct nlist),
@@ -703,7 +704,7 @@ static void macho_finish_stabs(struct module* module, struct hash_table* ht_symt
{
case SymTagFunction:
func = (struct symt_function*)sym;
- if (func->address == module->macho_info->load_addr)
+ if (func->address == module->format_info[DFI_MACHO]->u.macho_info->load_addr)
{
TRACE("Adjusting function %p/%s!%s from 0x%08lx to 0x%08lx\n", func,
debugstr_w(module->module.ModuleName), sym->hash_elt.name,
@@ -720,7 +721,7 @@ static void macho_finish_stabs(struct module* module, struct hash_table* ht_symt
{
case DataIsGlobal:
case DataIsFileStatic:
- if (data->u.var.offset == module->macho_info->load_addr)
+ if (data->u.var.offset == module->format_info[DFI_MACHO]->u.macho_info->load_addr)
{
TRACE("Adjusting data symbol %p/%s!%s from 0x%08lx to 0x%08lx\n",
data, debugstr_w(module->module.ModuleName), sym->hash_elt.name,
@@ -879,7 +880,7 @@ BOOL macho_load_debug_info(struct module* module, struct macho_file_map* fmap)
TRACE("(%p, %p/%d)\n", module, fmap, fmap ? fmap->fd : -1);
- if (module->type != DMT_MACHO || !module->macho_info)
+ if (module->type != DMT_MACHO || !module->format_info[DFI_MACHO]->u.macho_info)
{
ERR("Bad Mach-O module '%s'\n", debugstr_w(module->module.LoadedImageName));
return FALSE;
@@ -963,26 +964,34 @@ static BOOL macho_load_file(struct process* pcs, const WCHAR* filename,
if (macho_info->flags & MACHO_INFO_MODULE)
{
- struct macho_module_info *macho_module_info =
- HeapAlloc(GetProcessHeap(), 0, sizeof(struct macho_module_info));
- if (!macho_module_info) goto leave;
+ struct macho_module_info *macho_module_info;
+ struct module_format* modfmt =
+ HeapAlloc(GetProcessHeap(), 0, sizeof(struct module_format) + sizeof(struct macho_module_info));
+ if (!modfmt) goto leave;
macho_info->module = module_new(pcs, filename, DMT_MACHO, FALSE, load_addr,
fmap.segs_size, 0, calc_crc32(fmap.fd));
if (!macho_info->module)
{
- HeapFree(GetProcessHeap(), 0, macho_module_info);
+ HeapFree(GetProcessHeap(), 0, modfmt);
goto leave;
}
- macho_info->module->macho_info = macho_module_info;
- macho_info->module->macho_info->load_addr = load_addr;
+ macho_module_info = (void*)(modfmt + 1);
+ macho_info->module->format_info[DFI_MACHO] = modfmt;
+
+ modfmt->module = macho_info->module;
+ modfmt->remove = NULL;
+ modfmt->loc_compute = NULL;
+ modfmt->u.macho_info = macho_module_info;
+
+ macho_module_info->load_addr = load_addr;
if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
macho_info->module->module.SymType = SymDeferred;
else if (!macho_load_debug_info(macho_info->module, &fmap))
ret = FALSE;
- macho_info->module->macho_info->in_use = 1;
- macho_info->module->macho_info->is_loader = 0;
+ macho_info->module->format_info[DFI_MACHO]->u.macho_info->in_use = 1;
+ macho_info->module->format_info[DFI_MACHO]->u.macho_info->is_loader = 0;
TRACE("module = %p\n", macho_info->module);
}
@@ -1109,7 +1118,7 @@ static BOOL macho_search_and_load_file(struct process* pcs, const WCHAR* filenam
if ((module = module_is_already_loaded(pcs, filename)))
{
macho_info->module = module;
- module->macho_info->in_use = 1;
+ module->format_info[DFI_MACHO]->u.macho_info->in_use = 1;
return module->module.SymType;
}
@@ -1231,7 +1240,7 @@ BOOL macho_synchronize_module_list(struct process* pcs)
for (module = pcs->lmodules; module; module = module->next)
{
if (module->type == DMT_MACHO && !module->is_virtual)
- module->macho_info->in_use = 0;
+ module->format_info[DFI_MACHO]->u.macho_info->in_use = 0;
}
ms.pcs = pcs;
@@ -1243,7 +1252,8 @@ BOOL macho_synchronize_module_list(struct process* pcs)
while (module)
{
if (module->type == DMT_MACHO && !module->is_virtual &&
- !module->macho_info->in_use && !module->macho_info->is_loader)
+ !module->format_info[DFI_MACHO]->u.macho_info->in_use &&
+ !module->format_info[DFI_MACHO]->u.macho_info->is_loader)
{
module_remove(pcs, module);
/* restart all over */
@@ -1297,7 +1307,7 @@ BOOL macho_read_wine_loader_dbg_info(struct process* pcs)
TRACE("(%p/%p)\n", pcs, pcs->handle);
macho_info.flags = MACHO_INFO_DEBUG_HEADER | MACHO_INFO_MODULE;
if (!macho_search_loader(pcs, &macho_info)) return FALSE;
- macho_info.module->macho_info->is_loader = 1;
+ macho_info.module->format_info[DFI_MACHO]->u.macho_info->is_loader = 1;
module_set_module(macho_info.module, S_WineLoaderW);
return (pcs->dbg_hdr_addr = macho_info.dbg_hdr_addr) != 0;
}
diff --git a/dll/win32/dbghelp/module.c b/dll/win32/dbghelp/module.c
index 53f56c25129..250c5a5854a 100644
--- a/dll/win32/dbghelp/module.c
+++ b/dll/win32/dbghelp/module.c
@@ -126,6 +126,7 @@ struct module* module_new(struct process* pcs, const WCHAR* name,
unsigned long stamp, unsigned long checksum)
{
struct module* module;
+ unsigned i;
assert(type == DMT_ELF || type == DMT_PE || type == DMT_MACHO);
if (!(module = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*module))))
@@ -168,6 +169,7 @@ struct module* module_new(struct process* pcs, const WCHAR* name,
module->type = type;
module->is_virtual = virtual ? TRUE : FALSE;
+ for (i = 0; i < DFI_LAST; i++) module->format_info[i] = NULL;
module->sortlist_valid = FALSE;
module->sorttab_size = 0;
module->addr_sorttab = NULL;
@@ -621,14 +623,21 @@ DWORD64 WINAPI SymLoadModule64(HANDLE hProcess, HANDLE hFile, PCSTR ImageName,
*/
BOOL module_remove(struct process* pcs, struct module* module)
{
+ struct module_format*modfmt;
struct module** p;
+ unsigned i;
TRACE("%s (%p)\n", debugstr_w(module->module.ModuleName), module);
+
+ for (i = 0; i < DFI_LAST; i++)
+ {
+ if ((modfmt = module->format_info[i]) && modfmt->remove)
+ modfmt->remove(pcs, module->format_info[i]);
+ }
hash_table_destroy(&module->ht_symbols);
hash_table_destroy(&module->ht_types);
HeapFree(GetProcessHeap(), 0, module->sources);
HeapFree(GetProcessHeap(), 0, module->addr_sorttab);
- HeapFree(GetProcessHeap(), 0, module->dwarf2_info);
pool_destroy(&module->pool);
/* native dbghelp doesn't invoke registered callback(,CBA_SYMBOLS_UNLOADED,) here
* so do we
diff --git a/dll/win32/dbghelp/pe_module.c b/dll/win32/dbghelp/pe_module.c
index 76d81ee5512..63a2b9a9e4e 100644
--- a/dll/win32/dbghelp/pe_module.c
+++ b/dll/win32/dbghelp/pe_module.c
@@ -30,11 +30,239 @@
#include
#include "dbghelp_private.h"
+#include "image_private.h"
#include "winternl.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
+struct pe_module_info
+{
+ struct image_file_map fmap;
+};
+
+static void* pe_map_full(struct image_file_map* fmap, IMAGE_NT_HEADERS** nth)
+{
+ if (!fmap->u.pe.full_map)
+ {
+ fmap->u.pe.full_map = MapViewOfFile(fmap->u.pe.hMap, FILE_MAP_READ, 0, 0, 0);
+ }
+ if (fmap->u.pe.full_map)
+ {
+ if (nth) *nth = RtlImageNtHeader(fmap->u.pe.full_map);
+ fmap->u.pe.full_count++;
+ return fmap->u.pe.full_map;
+ }
+ return IMAGE_NO_MAP;
+}
+
+static void pe_unmap_full(struct image_file_map* fmap)
+{
+ if (fmap->u.pe.full_count && !--fmap->u.pe.full_count)
+ {
+ UnmapViewOfFile(fmap->u.pe.full_map);
+ fmap->u.pe.full_map = NULL;
+ }
+}
+
+/******************************************************************
+ * pe_map_section
+ *
+ * Maps a single section into memory from an PE file
+ */
+const char* pe_map_section(struct image_section_map* ism)
+{
+ void* mapping;
+ struct pe_file_map* fmap = &ism->fmap->u.pe;
+
+ if (ism->sidx >= 0 && ism->sidx < fmap->ntheader.FileHeader.NumberOfSections &&
+ fmap->sect[ism->sidx].mapped == IMAGE_NO_MAP)
+ {
+ IMAGE_NT_HEADERS* nth;
+ /* FIXME: that's rather drastic, but that will do for now
+ * that's ok if the full file map exists, but we could be less agressive otherwise and
+ * only map the relevant section
+ */
+ if ((mapping = pe_map_full(ism->fmap, &nth)))
+ {
+ fmap->sect[ism->sidx].mapped = RtlImageRvaToVa(nth, mapping,
+ fmap->sect[ism->sidx].shdr.VirtualAddress,
+ NULL);
+ return fmap->sect[ism->sidx].mapped;
+ }
+ }
+ return IMAGE_NO_MAP;
+}
+
+/******************************************************************
+ * pe_find_section
+ *
+ * Finds a section by name (and type) into memory from an PE file
+ * or its alternate if any
+ */
+BOOL pe_find_section(struct image_file_map* fmap, const char* name,
+ struct image_section_map* ism)
+{
+ const char* sectname;
+ unsigned i;
+ char tmp[IMAGE_SIZEOF_SHORT_NAME + 1];
+
+ for (i = 0; i < fmap->u.pe.ntheader.FileHeader.NumberOfSections; i++)
+ {
+ sectname = (const char*)fmap->u.pe.sect[i].shdr.Name;
+ /* long section names start with a '/' (at least on MinGW32) */
+ if (sectname[0] == '/' && fmap->u.pe.strtable)
+ sectname = fmap->u.pe.strtable + atoi(sectname + 1);
+ else
+ {
+ /* the section name may not be null terminated */
+ sectname = memcpy(tmp, sectname, IMAGE_SIZEOF_SHORT_NAME);
+ tmp[IMAGE_SIZEOF_SHORT_NAME] = '\0';
+ }
+ if (!strcasecmp(sectname, name))
+ {
+ ism->fmap = fmap;
+ ism->sidx = i;
+ return TRUE;
+ }
+ }
+ ism->fmap = NULL;
+ ism->sidx = -1;
+
+ return FALSE;
+}
+
+/******************************************************************
+ * pe_unmap_section
+ *
+ * Unmaps a single section from memory
+ */
+void pe_unmap_section(struct image_section_map* ism)
+{
+ if (ism->sidx >= 0 && ism->sidx < ism->fmap->u.pe.ntheader.FileHeader.NumberOfSections &&
+ ism->fmap->u.pe.sect[ism->sidx].mapped != IMAGE_NO_MAP)
+ {
+ pe_unmap_full(ism->fmap);
+ ism->fmap->u.pe.sect[ism->sidx].mapped = IMAGE_NO_MAP;
+ }
+}
+
+/******************************************************************
+ * pe_get_map_rva
+ *
+ * Get the RVA of an PE section
+ */
+DWORD_PTR pe_get_map_rva(const struct image_section_map* ism)
+{
+ if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.pe.ntheader.FileHeader.NumberOfSections)
+ return 0;
+ return ism->fmap->u.pe.sect[ism->sidx].shdr.VirtualAddress;
+}
+
+/******************************************************************
+ * pe_get_map_size
+ *
+ * Get the size of an PE section
+ */
+unsigned pe_get_map_size(const struct image_section_map* ism)
+{
+ if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.pe.ntheader.FileHeader.NumberOfSections)
+ return 0;
+ return ism->fmap->u.pe.sect[ism->sidx].shdr.SizeOfRawData;
+}
+
+/******************************************************************
+ * pe_map_file
+ *
+ * Maps an PE file into memory (and checks it's a real PE file)
+ */
+static BOOL pe_map_file(HANDLE file, struct image_file_map* fmap, enum module_type mt)
+{
+ void* mapping;
+
+ fmap->modtype = mt;
+ fmap->u.pe.hMap = CreateFileMappingW(file, NULL, PAGE_READONLY, 0, 0, NULL);
+ if (fmap->u.pe.hMap == 0) return FALSE;
+ fmap->u.pe.full_count = 0;
+ fmap->u.pe.full_map = NULL;
+ if (!(mapping = pe_map_full(fmap, NULL))) goto error;
+
+ switch (mt)
+ {
+ case DMT_PE:
+ {
+ IMAGE_NT_HEADERS* nthdr;
+ IMAGE_SECTION_HEADER* section;
+ unsigned i;
+
+ if (!(nthdr = RtlImageNtHeader(mapping))) goto error;
+ memcpy(&fmap->u.pe.ntheader, nthdr, sizeof(fmap->u.pe.ntheader));
+ section = (IMAGE_SECTION_HEADER*)
+ ((char*)&nthdr->OptionalHeader + nthdr->FileHeader.SizeOfOptionalHeader);
+ fmap->u.pe.sect = HeapAlloc(GetProcessHeap(), 0,
+ nthdr->FileHeader.NumberOfSections * sizeof(fmap->u.pe.sect[0]));
+ if (!fmap->u.pe.sect) goto error;
+ for (i = 0; i < nthdr->FileHeader.NumberOfSections; i++)
+ {
+ memcpy(&fmap->u.pe.sect[i].shdr, section + i, sizeof(IMAGE_SECTION_HEADER));
+ fmap->u.pe.sect[i].mapped = IMAGE_NO_MAP;
+ }
+ if (nthdr->FileHeader.PointerToSymbolTable && nthdr->FileHeader.NumberOfSymbols)
+ {
+ /* FIXME ugly: should rather map the relevant content instead of copying it */
+ const char* src = (const char*)mapping +
+ nthdr->FileHeader.PointerToSymbolTable +
+ nthdr->FileHeader.NumberOfSymbols * sizeof(IMAGE_SYMBOL);
+ char* dst;
+ DWORD sz = *(DWORD*)src;
+
+ if ((dst = HeapAlloc(GetProcessHeap(), 0, sz)))
+ memcpy(dst, src, sz);
+ fmap->u.pe.strtable = dst;
+ }
+ else fmap->u.pe.strtable = NULL;
+ }
+ break;
+ default: assert(0); goto error;
+ }
+ pe_unmap_full(fmap);
+
+ return TRUE;
+error:
+ pe_unmap_full(fmap);
+ CloseHandle(fmap->u.pe.hMap);
+ return FALSE;
+}
+
+/******************************************************************
+ * pe_unmap_file
+ *
+ * Unmaps an PE file from memory (previously mapped with pe_map_file)
+ */
+static void pe_unmap_file(struct image_file_map* fmap)
+{
+ if (fmap->u.pe.hMap != 0)
+ {
+ struct image_section_map ism;
+ ism.fmap = fmap;
+ for (ism.sidx = 0; ism.sidx < fmap->u.pe.ntheader.FileHeader.NumberOfSections; ism.sidx++)
+ {
+ pe_unmap_section(&ism);
+ }
+ while (fmap->u.pe.full_count) pe_unmap_full(fmap);
+ HeapFree(GetProcessHeap(), 0, fmap->u.pe.sect);
+ HeapFree(GetProcessHeap(), 0, (void*)fmap->u.pe.strtable); /* FIXME ugly (see pe_map_file) */
+ CloseHandle(fmap->u.pe.hMap);
+ fmap->u.pe.hMap = NULL;
+ }
+}
+
+static void pe_module_remove(struct process* pcs, struct module_format* modfmt)
+{
+ pe_unmap_file(&modfmt->u.pe_info->fmap);
+ HeapFree(GetProcessHeap(), 0, modfmt);
+}
+
/******************************************************************
* pe_locate_with_coff_symbol_table
*
@@ -43,37 +271,35 @@ WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
* Mingw32 requires this for stabs debug information as address for global variables isn't filled in
* (this is similar to what is done in elf_module.c when using the .symtab ELF section)
*/
-static BOOL pe_locate_with_coff_symbol_table(struct module* module, IMAGE_NT_HEADERS* nth, void* mapping)
+static BOOL pe_locate_with_coff_symbol_table(struct module* module)
{
+ struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap;
const IMAGE_SYMBOL* isym;
int i, numsym, naux;
- const char* strtable;
char tmp[9];
const char* name;
struct hash_table_iter hti;
void* ptr;
struct symt_data* sym;
- const IMAGE_SECTION_HEADER* sect;
+ const char* mapping;
- numsym = nth->FileHeader.NumberOfSymbols;
- if (!nth->FileHeader.PointerToSymbolTable || !numsym)
+ numsym = fmap->u.pe.ntheader.FileHeader.NumberOfSymbols;
+ if (!fmap->u.pe.ntheader.FileHeader.PointerToSymbolTable || !numsym)
return TRUE;
- isym = (const IMAGE_SYMBOL*)((char*)mapping + nth->FileHeader.PointerToSymbolTable);
- /* FIXME: no way to get strtable size */
- strtable = (const char*)&isym[numsym];
- sect = IMAGE_FIRST_SECTION(nth);
+ if (!(mapping = pe_map_full(fmap, NULL))) return FALSE;
+ isym = (const IMAGE_SYMBOL*)(mapping + fmap->u.pe.ntheader.FileHeader.PointerToSymbolTable);
for (i = 0; i < numsym; i+= naux, isym += naux)
{
if (isym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL &&
- isym->SectionNumber > 0 && isym->SectionNumber <= nth->FileHeader.NumberOfSections)
+ isym->SectionNumber > 0 && isym->SectionNumber <= fmap->u.pe.ntheader.FileHeader.NumberOfSections)
{
if (isym->N.Name.Short)
{
name = memcpy(tmp, isym->N.ShortName, 8);
tmp[8] = '\0';
}
- else name = strtable + isym->N.Name.Long;
+ else name = fmap->u.pe.strtable + isym->N.Name.Long;
if (name[0] == '_') name++;
hash_table_iter_init(&module->ht_symbols, &hti, name);
while ((ptr = hash_table_iter_up(&hti)))
@@ -86,15 +312,17 @@ static BOOL pe_locate_with_coff_symbol_table(struct module* module, IMAGE_NT_HEA
TRACE("Changing absolute address for %d.%s: %lx -> %s\n",
isym->SectionNumber, name, sym->u.var.offset,
wine_dbgstr_longlong(module->module.BaseOfImage +
- sect[isym->SectionNumber - 1].VirtualAddress + isym->Value));
+ fmap->u.pe.sect[isym->SectionNumber - 1].shdr.VirtualAddress +
+ isym->Value));
sym->u.var.offset = module->module.BaseOfImage +
- sect[isym->SectionNumber - 1].VirtualAddress + isym->Value;
+ fmap->u.pe.sect[isym->SectionNumber - 1].shdr.VirtualAddress + isym->Value;
break;
}
}
}
naux = isym->NumberOfAuxSymbols + 1;
}
+ pe_unmap_full(fmap);
return TRUE;
}
@@ -103,8 +331,9 @@ static BOOL pe_locate_with_coff_symbol_table(struct module* module, IMAGE_NT_HEA
*
* Load public symbols out of the COFF symbol table (if any).
*/
-static BOOL pe_load_coff_symbol_table(struct module* module, IMAGE_NT_HEADERS* nth, void* mapping)
+static BOOL pe_load_coff_symbol_table(struct module* module)
{
+ struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap;
const IMAGE_SYMBOL* isym;
int i, numsym, naux;
const char* strtable;
@@ -113,14 +342,16 @@ static BOOL pe_load_coff_symbol_table(struct module* module, IMAGE_NT_HEADERS* n
const char* lastfilename = NULL;
struct symt_compiland* compiland = NULL;
const IMAGE_SECTION_HEADER* sect;
+ const char* mapping;
- numsym = nth->FileHeader.NumberOfSymbols;
- if (!nth->FileHeader.PointerToSymbolTable || !numsym)
+ numsym = fmap->u.pe.ntheader.FileHeader.NumberOfSymbols;
+ if (!fmap->u.pe.ntheader.FileHeader.PointerToSymbolTable || !numsym)
return TRUE;
- isym = (const IMAGE_SYMBOL*)((char*)mapping + nth->FileHeader.PointerToSymbolTable);
+ if (!(mapping = pe_map_full(fmap, NULL))) return FALSE;
+ isym = (const IMAGE_SYMBOL*)((char*)mapping + fmap->u.pe.ntheader.FileHeader.PointerToSymbolTable);
/* FIXME: no way to get strtable size */
strtable = (const char*)&isym[numsym];
- sect = IMAGE_FIRST_SECTION(nth);
+ sect = IMAGE_FIRST_SECTION(&fmap->u.pe.ntheader);
for (i = 0; i < numsym; i+= naux, isym += naux)
{
@@ -130,7 +361,7 @@ static BOOL pe_load_coff_symbol_table(struct module* module, IMAGE_NT_HEADERS* n
compiland = NULL;
}
if (isym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL &&
- isym->SectionNumber > 0 && isym->SectionNumber <= nth->FileHeader.NumberOfSections)
+ isym->SectionNumber > 0 && isym->SectionNumber <= fmap->u.pe.ntheader.FileHeader.NumberOfSections)
{
if (isym->N.Name.Short)
{
@@ -143,9 +374,12 @@ static BOOL pe_load_coff_symbol_table(struct module* module, IMAGE_NT_HEADERS* n
if (!compiland && lastfilename)
compiland = symt_new_compiland(module, 0,
source_new(module, NULL, lastfilename));
- symt_new_public(module, compiland, name,
- module->module.BaseOfImage + sect[isym->SectionNumber - 1].VirtualAddress + isym->Value,
- 1);
+
+ if (!(dbghelp_options & SYMOPT_NO_PUBLICS))
+ symt_new_public(module, compiland, name,
+ module->module.BaseOfImage + sect[isym->SectionNumber - 1].VirtualAddress +
+ isym->Value,
+ 1);
}
naux = isym->NumberOfAuxSymbols + 1;
}
@@ -155,6 +389,7 @@ static BOOL pe_load_coff_symbol_table(struct module* module, IMAGE_NT_HEADERS* n
module->module.TypeInfo = FALSE;
module->module.SourceIndexed = FALSE;
module->module.Publics = TRUE;
+ pe_unmap_full(fmap);
return TRUE;
}
@@ -176,30 +411,30 @@ static inline DWORD pe_get_sect_size(IMAGE_SECTION_HEADER* sect)
* look for stabs information in PE header (it's how the mingw compiler provides
* its debugging information)
*/
-static BOOL pe_load_stabs(const struct process* pcs, struct module* module,
- void* mapping, IMAGE_NT_HEADERS* nth)
+static BOOL pe_load_stabs(const struct process* pcs, struct module* module)
{
- IMAGE_SECTION_HEADER* section;
- IMAGE_SECTION_HEADER* sect_stabs = NULL;
- IMAGE_SECTION_HEADER* sect_stabstr = NULL;
- int i;
+ struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap;
+ struct image_section_map sect_stabs, sect_stabstr;
BOOL ret = FALSE;
- section = (IMAGE_SECTION_HEADER*)
- ((char*)&nth->OptionalHeader + nth->FileHeader.SizeOfOptionalHeader);
- for (i = 0; i < nth->FileHeader.NumberOfSections; i++, section++)
+ if (pe_find_section(fmap, ".stab", §_stabs) && pe_find_section(fmap, ".stabstr", §_stabstr))
{
- if (!strcasecmp((const char*)section->Name, ".stab")) sect_stabs = section;
- else if (!strncasecmp((const char*)section->Name, ".stabstr", 8)) sect_stabstr = section;
- }
- if (sect_stabs && sect_stabstr)
- {
- ret = stabs_parse(module,
- module->module.BaseOfImage - nth->OptionalHeader.ImageBase,
- pe_get_sect(nth, mapping, sect_stabs), pe_get_sect_size(sect_stabs),
- pe_get_sect(nth, mapping, sect_stabstr), pe_get_sect_size(sect_stabstr),
- NULL, NULL);
- if (ret) pe_locate_with_coff_symbol_table(module, nth, mapping);
+ const char* stab;
+ const char* stabstr;
+
+ stab = image_map_section(§_stabs);
+ stabstr = image_map_section(§_stabstr);
+ if (stab != IMAGE_NO_MAP && stabstr != IMAGE_NO_MAP)
+ {
+ ret = stabs_parse(module,
+ module->module.BaseOfImage - fmap->u.pe.ntheader.OptionalHeader.ImageBase,
+ stab, image_get_map_size(§_stabs),
+ stabstr, image_get_map_size(§_stabstr),
+ NULL, NULL);
+ }
+ image_unmap_section(§_stabs);
+ image_unmap_section(§_stabstr);
+ if (ret) pe_locate_with_coff_symbol_table(module);
}
TRACE("%s the STABS debug info\n", ret ? "successfully loaded" : "failed to load");
@@ -212,51 +447,15 @@ static BOOL pe_load_stabs(const struct process* pcs, struct module* module,
* look for dwarf information in PE header (it's also a way for the mingw compiler
* to provide its debugging information)
*/
-static BOOL pe_load_dwarf(const struct process* pcs, struct module* module,
- void* mapping, IMAGE_NT_HEADERS* nth)
+static BOOL pe_load_dwarf(struct module* module)
{
- IMAGE_SECTION_HEADER* section;
- IMAGE_SECTION_HEADER* sect_debuginfo = NULL;
- IMAGE_SECTION_HEADER* sect_debugstr = NULL;
- IMAGE_SECTION_HEADER* sect_debugabbrev = NULL;
- IMAGE_SECTION_HEADER* sect_debugline = NULL;
- IMAGE_SECTION_HEADER* sect_debugloc = NULL;
- int i;
- const char* strtable;
- const char* sectname;
+ struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap;
BOOL ret = FALSE;
- if (nth->FileHeader.PointerToSymbolTable && nth->FileHeader.NumberOfSymbols)
- /* FIXME: no way to get strtable size */
- strtable = (const char*)mapping + nth->FileHeader.PointerToSymbolTable +
- nth->FileHeader.NumberOfSymbols * sizeof(IMAGE_SYMBOL);
- else strtable = NULL;
-
- section = (IMAGE_SECTION_HEADER*)
- ((char*)&nth->OptionalHeader + nth->FileHeader.SizeOfOptionalHeader);
- for (i = 0; i < nth->FileHeader.NumberOfSections; i++, section++)
- {
- sectname = (const char*)section->Name;
- /* long section names start with a '/' (at least on MinGW32) */
- if (*sectname == '/' && strtable)
- sectname = strtable + atoi(sectname + 1);
- if (!strcasecmp(sectname, ".debug_info")) sect_debuginfo = section;
- else if (!strcasecmp(sectname, ".debug_str")) sect_debugstr = section;
- else if (!strcasecmp(sectname, ".debug_abbrev")) sect_debugabbrev = section;
- else if (!strcasecmp(sectname, ".debug_line")) sect_debugline = section;
- else if (!strcasecmp(sectname, ".debug_loc")) sect_debugloc = section;
- }
- if (sect_debuginfo)
- {
- ret = dwarf2_parse(module,
- module->module.BaseOfImage - nth->OptionalHeader.ImageBase,
- NULL, /* FIXME: some thunks to deal with ? */
- pe_get_sect(nth, mapping, sect_debuginfo), pe_get_sect_size(sect_debuginfo),
- pe_get_sect(nth, mapping, sect_debugabbrev), pe_get_sect_size(sect_debugabbrev),
- pe_get_sect(nth, mapping, sect_debugstr), pe_get_sect_size(sect_debugstr),
- pe_get_sect(nth, mapping, sect_debugline), pe_get_sect_size(sect_debugline),
- pe_get_sect(nth, mapping, sect_debugloc), pe_get_sect_size(sect_debugloc));
- }
+ ret = dwarf2_parse(module,
+ module->module.BaseOfImage - fmap->u.pe.ntheader.OptionalHeader.ImageBase,
+ NULL, /* FIXME: some thunks to deal with ? */
+ fmap);
TRACE("%s the DWARF debug info\n", ret ? "successfully loaded" : "failed to load");
return ret;
@@ -314,19 +513,21 @@ static BOOL pe_load_dbg_file(const struct process* pcs, struct module* module,
*
* Process MSC debug information in PE file.
*/
-static BOOL pe_load_msc_debug_info(const struct process* pcs,
- struct module* module,
- void* mapping, const IMAGE_NT_HEADERS* nth)
+static BOOL pe_load_msc_debug_info(const struct process* pcs, struct module* module)
{
+ struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap;
BOOL ret = FALSE;
const IMAGE_DATA_DIRECTORY* dir;
const IMAGE_DEBUG_DIRECTORY*dbg = NULL;
int nDbg;
+ void* mapping;
+ IMAGE_NT_HEADERS* nth;
+ if (!(mapping = pe_map_full(fmap, &nth))) return FALSE;
/* Read in debug directory */
dir = nth->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_DEBUG;
nDbg = dir->Size / sizeof(IMAGE_DEBUG_DIRECTORY);
- if (!nDbg) return FALSE;
+ if (!nDbg) goto done;
dbg = RtlImageRvaToVa(nth, mapping, dir->VirtualAddress, NULL);
@@ -353,26 +554,29 @@ static BOOL pe_load_msc_debug_info(const struct process* pcs,
const IMAGE_SECTION_HEADER *sectp = (const IMAGE_SECTION_HEADER*)((const char*)&nth->OptionalHeader + nth->FileHeader.SizeOfOptionalHeader);
/* Debug info is embedded into PE module */
ret = pe_load_debug_directory(pcs, module, mapping, sectp,
- nth->FileHeader.NumberOfSections, dbg, nDbg);
+ nth->FileHeader.NumberOfSections, dbg, nDbg);
}
-
+done:
+ pe_unmap_full(fmap);
return ret;
}
/***********************************************************************
* pe_load_export_debug_info
*/
-static BOOL pe_load_export_debug_info(const struct process* pcs,
- struct module* module,
- void* mapping, const IMAGE_NT_HEADERS* nth)
+static BOOL pe_load_export_debug_info(const struct process* pcs, struct module* module)
{
+ struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap;
unsigned int i;
const IMAGE_EXPORT_DIRECTORY* exports;
DWORD base = module->module.BaseOfImage;
DWORD size;
+ IMAGE_NT_HEADERS* nth;
+ void* mapping;
if (dbghelp_options & SYMOPT_NO_PUBLICS) return TRUE;
+ if (!(mapping = pe_map_full(fmap, &nth))) return FALSE;
#if 0
/* Add start of DLL (better use the (yet unimplemented) Exe SymTag for this) */
/* FIXME: module.ModuleName isn't correctly set yet if it's passed in SymLoadModule */
@@ -435,6 +639,8 @@ static BOOL pe_load_export_debug_info(const struct process* pcs,
/* no real debug info, only entry points */
if (module->module.SymType == SymDeferred)
module->module.SymType = SymExport;
+ pe_unmap_full(fmap);
+
return TRUE;
}
@@ -445,39 +651,21 @@ static BOOL pe_load_export_debug_info(const struct process* pcs,
BOOL pe_load_debug_info(const struct process* pcs, struct module* module)
{
BOOL ret = FALSE;
- HANDLE hFile;
- HANDLE hMap;
- void* mapping;
- IMAGE_NT_HEADERS* nth;
- hFile = CreateFileW(module->module.LoadedImageName, GENERIC_READ, FILE_SHARE_READ,
- NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- if (hFile == INVALID_HANDLE_VALUE) return ret;
- if ((hMap = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL)) != 0)
+ if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
{
- if ((mapping = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0)) != NULL)
- {
- nth = RtlImageNtHeader(mapping);
-
- if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
- {
- ret = pe_load_stabs(pcs, module, mapping, nth) ||
- pe_load_dwarf(pcs, module, mapping, nth) ||
- pe_load_msc_debug_info(pcs, module, mapping, nth) ||
- pe_load_coff_symbol_table(module, nth, mapping);
- /* if we still have no debug info (we could only get SymExport at this
- * point), then do the SymExport except if we have an ELF container,
- * in which case we'll rely on the export's on the ELF side
- */
- }
-/* FIXME shouldn't we check that? if (!module_get_debug(pcs, module))l */
- if (pe_load_export_debug_info(pcs, module, mapping, nth) && !ret)
- ret = TRUE;
- UnmapViewOfFile(mapping);
- }
- CloseHandle(hMap);
+ ret = pe_load_stabs(pcs, module);
+ ret = pe_load_dwarf(module) || ret;
+ ret = pe_load_msc_debug_info(pcs, module) || ret;
+ ret = ret || pe_load_coff_symbol_table(module); /* FIXME */
+ /* if we still have no debug info (we could only get SymExport at this
+ * point), then do the SymExport except if we have an ELF container,
+ * in which case we'll rely on the export's on the ELF side
+ */
}
- CloseHandle(hFile);
+ /* FIXME shouldn't we check that? if (!module_get_debug(pcs, module)) */
+ if (pe_load_export_debug_info(pcs, module) && !ret)
+ ret = TRUE;
return ret;
}
@@ -489,15 +677,14 @@ BOOL pe_load_debug_info(const struct process* pcs, struct module* module)
struct module* pe_load_native_module(struct process* pcs, const WCHAR* name,
HANDLE hFile, DWORD base, DWORD size)
{
- struct module* module = NULL;
- BOOL opened = FALSE;
- HANDLE hMap;
- WCHAR loaded_name[MAX_PATH];
+ struct module* module = NULL;
+ BOOL opened = FALSE;
+ struct module_format* modfmt;
+ WCHAR loaded_name[MAX_PATH];
loaded_name[0] = '\0';
if (!hFile)
{
-
assert(name);
if ((hFile = FindExecutableImageExW(name, pcs->search_path, loaded_name, NULL, NULL)) == NULL)
@@ -507,37 +694,37 @@ struct module* pe_load_native_module(struct process* pcs, const WCHAR* name,
else if (name) strcpyW(loaded_name, name);
else if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
FIXME("Trouble ahead (no module name passed in deferred mode)\n");
-
- if ((hMap = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL)) != NULL)
+ if (!(modfmt = HeapAlloc(GetProcessHeap(), 0, sizeof(struct module_format) + sizeof(struct pe_module_info))))
+ return NULL;
+ modfmt->u.pe_info = (struct pe_module_info*)(modfmt + 1);
+ if (pe_map_file(hFile, &modfmt->u.pe_info->fmap, DMT_PE))
{
- void* mapping;
+ if (!base) base = modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.ImageBase;
+ if (!size) size = modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.SizeOfImage;
- if ((mapping = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0)) != NULL)
+ module = module_new(pcs, loaded_name, DMT_PE, FALSE, base, size,
+ modfmt->u.pe_info->fmap.u.pe.ntheader.FileHeader.TimeDateStamp,
+ modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.CheckSum);
+ if (module)
{
- IMAGE_NT_HEADERS* nth = RtlImageNtHeader(mapping);
+ modfmt->module = module;
+ modfmt->remove = pe_module_remove;
+ modfmt->loc_compute = NULL;
- if (nth)
- {
- if (!base) base = nth->OptionalHeader.ImageBase;
- if (!size) size = nth->OptionalHeader.SizeOfImage;
-
- module = module_new(pcs, loaded_name, DMT_PE, FALSE, base, size,
- nth->FileHeader.TimeDateStamp,
- nth->OptionalHeader.CheckSum);
- if (module)
- {
- if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
- module->module.SymType = SymDeferred;
- else
- pe_load_debug_info(pcs, module);
- }
- else
- ERR("could not load the module '%s'\n", debugstr_w(loaded_name));
- }
- UnmapViewOfFile(mapping);
+ module->format_info[DFI_PE] = modfmt;
+ if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
+ module->module.SymType = SymDeferred;
+ else
+ pe_load_debug_info(pcs, module);
+ }
+ else
+ {
+ ERR("could not load the module '%s'\n", debugstr_w(loaded_name));
+ pe_unmap_file(&modfmt->u.pe_info->fmap);
}
- CloseHandle(hMap);
}
+ if (!module) HeapFree(GetProcessHeap(), 0, modfmt);
+
if (opened) CloseHandle(hFile);
return module;
diff --git a/dll/win32/dbghelp/symbol.c b/dll/win32/dbghelp/symbol.c
index 07ba9a37cef..650f6a28086 100644
--- a/dll/win32/dbghelp/symbol.c
+++ b/dll/win32/dbghelp/symbol.c
@@ -693,8 +693,20 @@ static void symt_fill_sym_info(struct module_pair* pair,
struct location loc = data->u.var;
if (loc.kind >= loc_user)
- pair->effective->loc_compute(pair->pcs, pair->effective, func, &loc);
+ {
+ unsigned i;
+ struct module_format* modfmt;
+ for (i = 0; i < DFI_LAST; i++)
+ {
+ modfmt = pair->effective->format_info[i];
+ if (modfmt && modfmt->loc_compute)
+ {
+ modfmt->loc_compute(pair->pcs, modfmt, func, &loc);
+ break;
+ }
+ }
+ }
switch (loc.kind)
{
case loc_error:
diff --git a/dll/win32/fusion/fusion.c b/dll/win32/fusion/fusion.c
index 7c94100039d..ad772330487 100644
--- a/dll/win32/fusion/fusion.c
+++ b/dll/win32/fusion/fusion.c
@@ -52,6 +52,15 @@ HRESULT WINAPI CreateInstallReferenceEnum(IInstallReferenceEnum **ppRefEnum,
return E_NOTIMPL;
}
+/******************************************************************
+ * CreateApplicationContext (FUSION.@)
+ */
+HRESULT WINAPI CreateApplicationContext(IAssemblyName *name, void *ctx)
+{
+ FIXME("%p, %p\n", name, ctx);
+ return E_NOTIMPL;
+}
+
static HRESULT (WINAPI *pGetCORVersion)(LPWSTR pbuffer, DWORD cchBuffer,
DWORD *dwLength);
diff --git a/dll/win32/fusion/fusion.spec b/dll/win32/fusion/fusion.spec
index e589ad17e08..54e4eadd715 100644
--- a/dll/win32/fusion/fusion.spec
+++ b/dll/win32/fusion/fusion.spec
@@ -1,6 +1,6 @@
@ stub CopyPDBs
@ stdcall ClearDownloadCache()
-@ stub CreateApplicationContext
+@ stdcall CreateApplicationContext(ptr ptr)
@ stdcall CreateAssemblyCache(ptr long)
@ stdcall CreateAssemblyEnum(ptr ptr ptr long ptr)
@ stdcall CreateAssemblyNameObject(ptr wstr long ptr)
diff --git a/dll/win32/gdiplus/brush.c b/dll/win32/gdiplus/brush.c
index 2f2143dba58..2d28004c95d 100644
--- a/dll/win32/gdiplus/brush.c
+++ b/dll/win32/gdiplus/brush.c
@@ -865,7 +865,10 @@ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image,
(*texture)->brush.gdibrush = CreateBrushIndirect(&(*texture)->brush.lb);
(*texture)->brush.bt = BrushTypeTextureFill;
- (*texture)->wrap = imageattr->wrap;
+ if (imageattr)
+ (*texture)->wrap = imageattr->wrap;
+ else
+ (*texture)->wrap = WrapModeTile;
(*texture)->image = new_image;
exit:
diff --git a/dll/win32/gdiplus/image.c b/dll/win32/gdiplus/image.c
index d72d4cfbb8a..58f3c6570be 100644
--- a/dll/win32/gdiplus/image.c
+++ b/dll/win32/gdiplus/image.c
@@ -2108,6 +2108,8 @@ GpStatus WINGDIPAPI GdipGetMetafileHeaderFromMetafile(GpMetafile * metafile,
if(!(calls++))
FIXME("not implemented\n");
+ memset(header, 0, sizeof(MetafileHeader));
+
return Ok;
}
@@ -2194,6 +2196,7 @@ struct image_format_dimension image_format_dimensions[] =
{NULL}
};
+/* FIXME: Need to handle multi-framed images */
GpStatus WINGDIPAPI GdipImageGetFrameCount(GpImage *image,
GDIPCONST GUID* dimensionID, UINT* count)
{
@@ -2201,13 +2204,15 @@ GpStatus WINGDIPAPI GdipImageGetFrameCount(GpImage *image,
TRACE("(%p,%s,%p)\n", image, debugstr_guid(dimensionID), count);
- if(!image || !dimensionID || !count)
+ if(!image || !count)
return InvalidParameter;
if(!(calls++))
- FIXME("not implemented\n");
+ FIXME("returning frame count of 1\n");
- return NotImplemented;
+ *count = 1;
+
+ return Ok;
}
GpStatus WINGDIPAPI GdipImageGetFrameDimensionsCount(GpImage *image,
diff --git a/dll/win32/hlink/browse_ctx.c b/dll/win32/hlink/browse_ctx.c
index a5b73c10bc1..1e15c13a543 100644
--- a/dll/win32/hlink/browse_ctx.c
+++ b/dll/win32/hlink/browse_ctx.c
@@ -155,6 +155,9 @@ static HRESULT WINAPI IHlinkBC_SetBrowseWindowInfo(IHlinkBrowseContext* iface,
HlinkBCImpl *This = (HlinkBCImpl*)iface;
TRACE("(%p)->(%p)\n", This, phlbwi);
+ if(!phlbwi)
+ return E_INVALIDARG;
+
heap_free(This->BrowseWindowInfo);
This->BrowseWindowInfo = heap_alloc(phlbwi->cbSize);
memcpy(This->BrowseWindowInfo, phlbwi, phlbwi->cbSize);
@@ -165,8 +168,18 @@ static HRESULT WINAPI IHlinkBC_SetBrowseWindowInfo(IHlinkBrowseContext* iface,
static HRESULT WINAPI IHlinkBC_GetBrowseWindowInfo(IHlinkBrowseContext* iface,
HLBWINFO *phlbwi)
{
- FIXME("\n");
- return E_NOTIMPL;
+ HlinkBCImpl *This = (HlinkBCImpl*)iface;
+ TRACE("(%p)->(%p)\n", This, phlbwi);
+
+ if(!phlbwi)
+ return E_INVALIDARG;
+
+ if(!This->BrowseWindowInfo)
+ phlbwi->cbSize = 0;
+ else
+ memcpy(phlbwi, This->BrowseWindowInfo, This->BrowseWindowInfo->cbSize);
+
+ return S_OK;
}
static HRESULT WINAPI IHlinkBC_SetInitialHlink(IHlinkBrowseContext* iface,
diff --git a/dll/win32/hlink/hlink_main.c b/dll/win32/hlink/hlink_main.c
index d07901aea4a..e96f206645f 100644
--- a/dll/win32/hlink/hlink_main.c
+++ b/dll/win32/hlink/hlink_main.c
@@ -99,6 +99,8 @@ HRESULT WINAPI HlinkCreateFromString( LPCWSTR pwzTarget, LPCWSTR pwzLocation,
{
IHlink *hl = NULL;
HRESULT r = S_OK;
+ WCHAR *hash, *tgt;
+ const WCHAR *loc;
TRACE("%s %s %s %p %i %p %s %p\n", debugstr_w(pwzTarget),
debugstr_w(pwzLocation), debugstr_w(pwzFriendlyName), pihlsite,
@@ -108,8 +110,44 @@ HRESULT WINAPI HlinkCreateFromString( LPCWSTR pwzTarget, LPCWSTR pwzLocation,
if (FAILED(r))
return r;
- IHlink_SetStringReference(hl, HLINKSETF_TARGET | HLINKSETF_LOCATION,
- pwzTarget, pwzLocation);
+ if (pwzTarget)
+ {
+ hash = strchrW(pwzTarget, '#');
+ if (hash)
+ {
+ if (hash == pwzTarget)
+ tgt = NULL;
+ else
+ {
+ int tgt_len = hash - pwzTarget;
+ tgt = heap_alloc((tgt_len + 1) * sizeof(WCHAR));
+ if (!tgt)
+ return E_OUTOFMEMORY;
+ memcpy(tgt, pwzTarget, tgt_len * sizeof(WCHAR));
+ tgt[tgt_len] = 0;
+ }
+ if (!pwzLocation)
+ loc = hash + 1;
+ else
+ loc = pwzLocation;
+ }
+ else
+ {
+ tgt = hlink_strdupW(pwzTarget);
+ if (!tgt)
+ return E_OUTOFMEMORY;
+ loc = pwzLocation;
+ }
+ }
+ else
+ {
+ tgt = NULL;
+ loc = pwzLocation;
+ }
+
+ IHlink_SetStringReference(hl, HLINKSETF_TARGET | HLINKSETF_LOCATION, tgt, loc);
+
+ heap_free(tgt);
if (pwzFriendlyName)
IHlink_SetFriendlyName(hl, pwzFriendlyName);
diff --git a/dll/win32/hlink/link.c b/dll/win32/hlink/link.c
index 52197ccf6fd..ffd3cda854b 100644
--- a/dll/win32/hlink/link.c
+++ b/dll/win32/hlink/link.c
@@ -291,7 +291,9 @@ static HRESULT WINAPI IHlink_fnSetStringReference(IHlink* iface,
if (grfHLSETF & HLINKSETF_LOCATION)
{
heap_free(This->Location);
- This->Location = hlink_strdupW( pwzLocation );
+ This->Location = NULL;
+ if (pwzLocation && *pwzLocation)
+ This->Location = hlink_strdupW( pwzLocation );
}
return S_OK;
diff --git a/dll/win32/iphlpapi/iphlpapi_private.h b/dll/win32/iphlpapi/iphlpapi_private.h
index 90efff74da0..766f7f4e6ee 100644
--- a/dll/win32/iphlpapi/iphlpapi_private.h
+++ b/dll/win32/iphlpapi/iphlpapi_private.h
@@ -19,8 +19,6 @@
# include
#endif
-#undef _WIN32_WINNT
-#define _WIN32_WINNT 0x500
#define WIN32_NO_STATUS
#include
#include
diff --git a/dll/win32/iphlpapi/resinfo_reactos.c b/dll/win32/iphlpapi/resinfo_reactos.c
index 2b551949b57..02bcb3b9129 100644
--- a/dll/win32/iphlpapi/resinfo_reactos.c
+++ b/dll/win32/iphlpapi/resinfo_reactos.c
@@ -58,7 +58,7 @@ NTAPI
RtlAllocateHeap (
HANDLE Heap,
ULONG Flags,
- ULONG Size
+ SIZE_T Size
);
NTSYSAPI
diff --git a/dll/win32/kernel32/misc/dllmain.c b/dll/win32/kernel32/misc/dllmain.c
index a828f72ef5a..02199f9349d 100644
--- a/dll/win32/kernel32/misc/dllmain.c
+++ b/dll/win32/kernel32/misc/dllmain.c
@@ -402,6 +402,12 @@ DllMain(HANDLE hDll,
return TRUE;
}
+#undef InterlockedIncrement
+#undef InterlockedDecrement
+#undef InterlockedExchange
+#undef InterlockedExchangeAdd
+#undef InterlockedCompareExchange
+
LONG
WINAPI
InterlockedIncrement(IN OUT LONG volatile *lpAddend)
diff --git a/dll/win32/kernel32/misc/toolhelp.c b/dll/win32/kernel32/misc/toolhelp.c
index ad2f2b7db2a..ab591b1d9f9 100644
--- a/dll/win32/kernel32/misc/toolhelp.c
+++ b/dll/win32/kernel32/misc/toolhelp.c
@@ -400,11 +400,11 @@ TH32CreateSnapshotSectionInitialize(DWORD dwFlags,
ProcessListEntry->dwSize = sizeof(PROCESSENTRY32W);
ProcessListEntry->cntUsage = 0; /* no longer used */
- ProcessListEntry->th32ProcessID = (ULONG)ProcessInfo->UniqueProcessId;
+ ProcessListEntry->th32ProcessID = (ULONG_PTR)ProcessInfo->UniqueProcessId;
ProcessListEntry->th32DefaultHeapID = 0; /* no longer used */
ProcessListEntry->th32ModuleID = 0; /* no longer used */
ProcessListEntry->cntThreads = ProcessInfo->NumberOfThreads;
- ProcessListEntry->th32ParentProcessID = (ULONG)ProcessInfo->InheritedFromUniqueProcessId;
+ ProcessListEntry->th32ParentProcessID = (ULONG_PTR)ProcessInfo->InheritedFromUniqueProcessId;
ProcessListEntry->pcPriClassBase = ProcessInfo->BasePriority;
ProcessListEntry->dwFlags = 0; /* no longer used */
if(ProcessInfo->ImageName.Buffer != NULL)
@@ -447,8 +447,8 @@ TH32CreateSnapshotSectionInitialize(DWORD dwFlags,
{
ThreadListEntry->dwSize = sizeof(THREADENTRY32);
ThreadListEntry->cntUsage = 0; /* no longer used */
- ThreadListEntry->th32ThreadID = (ULONG)ThreadInfo->ClientId.UniqueThread;
- ThreadListEntry->th32OwnerProcessID = (ULONG)ThreadInfo->ClientId.UniqueProcess;
+ ThreadListEntry->th32ThreadID = (ULONG_PTR)ThreadInfo->ClientId.UniqueThread;
+ ThreadListEntry->th32OwnerProcessID = (ULONG_PTR)ThreadInfo->ClientId.UniqueProcess;
ThreadListEntry->tpBasePri = ThreadInfo->BasePriority;
ThreadListEntry->tpDeltaPri = 0; /* no longer used */
ThreadListEntry->dwFlags = 0; /* no longer used */
diff --git a/dll/win32/kernel32/synch/critical.c b/dll/win32/kernel32/synch/critical.c
index 474a5d6c543..ac5280a60bd 100644
--- a/dll/win32/kernel32/synch/critical.c
+++ b/dll/win32/kernel32/synch/critical.c
@@ -55,4 +55,30 @@ InitializeCriticalSectionAndSpinCount(OUT LPCRITICAL_SECTION lpCriticalSection,
return TRUE;
}
+/*
+ * @implemented
+ */
+BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection,
+ IN DWORD dwSpinCount,
+ IN DWORD flags )
+{
+ NTSTATUS Status;
+
+ /* FIXME: Flags ignored */
+
+ /* Initialize the critical section */
+ Status = RtlInitializeCriticalSectionAndSpinCount(
+ (PRTL_CRITICAL_SECTION)lpCriticalSection,
+ dwSpinCount);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Set failure code */
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ /* Success */
+ return TRUE;
+}
+
/* EOF */
diff --git a/dll/win32/kernel32/thread/fiber.c b/dll/win32/kernel32/thread/fiber.c
index 58aa6e9d4c6..656bc6ee19d 100644
--- a/dll/win32/kernel32/thread/fiber.c
+++ b/dll/win32/kernel32/thread/fiber.c
@@ -47,9 +47,9 @@ ConvertFiberToThread(VOID)
pTeb->HasFiberData = FALSE;
/* free the fiber */
- if (pTeb->Tib.FiberData != NULL)
+ if(pTeb->NtTib.FiberData != NULL)
{
- RtlFreeHeap(GetProcessHeap(), 0, pTeb->Tib.FiberData);
+ RtlFreeHeap(GetProcessHeap(), 0, pTeb->NtTib.FiberData);
}
/* success */
@@ -69,7 +69,7 @@ ConvertThreadToFiberEx(LPVOID lpParameter,
DPRINT1("Converting Thread to Fiber\n");
/* the current thread is already a fiber */
- if(pTeb->HasFiberData && pTeb->Tib.FiberData) return pTeb->Tib.FiberData;
+ if(pTeb->HasFiberData && pTeb->NtTib.FiberData) return pTeb->NtTib.FiberData;
/* allocate the fiber */
pfCurFiber = (PFIBER)RtlAllocateHeap(GetProcessHeap(),
@@ -85,9 +85,9 @@ ConvertThreadToFiberEx(LPVOID lpParameter,
/* copy some contextual data from the thread to the fiber */
pfCurFiber->Parameter = lpParameter;
- pfCurFiber->ExceptionList = pTeb->Tib.ExceptionList;
- pfCurFiber->StackBase = pTeb->Tib.StackBase;
- pfCurFiber->StackLimit = pTeb->Tib.StackLimit;
+ pfCurFiber->ExceptionList = pTeb->NtTib.ExceptionList;
+ pfCurFiber->StackBase = pTeb->NtTib.StackBase;
+ pfCurFiber->StackLimit = pTeb->NtTib.StackLimit;
pfCurFiber->DeallocationStack = pTeb->DeallocationStack;
pfCurFiber->FlsData = pTeb->FlsData;
pfCurFiber->GuaranteedStackBytes = pTeb->GuaranteedStackBytes;
@@ -101,7 +101,7 @@ ConvertThreadToFiberEx(LPVOID lpParameter,
}
/* associate the fiber to the current thread */
- pTeb->Tib.FiberData = pfCurFiber;
+ pTeb->NtTib.FiberData = pfCurFiber;
pTeb->HasFiberData = TRUE;
/* success */
@@ -227,7 +227,7 @@ DeleteFiber(LPVOID lpFiber)
RtlFreeHeap(GetProcessHeap(), 0, lpFiber);
/* the fiber is deleting itself: let the system deallocate the stack */
- if(NtCurrentTeb()->Tib.FiberData == lpFiber) ExitThread(1);
+ if(NtCurrentTeb()->NtTib.FiberData == lpFiber) ExitThread(1);
/* deallocate the stack */
NtFreeVirtualMemory(NtCurrentProcess(),
diff --git a/dll/win32/mshtml/De.rc b/dll/win32/mshtml/De.rc
index 43e0cfe85a5..50d519d70a7 100644
--- a/dll/win32/mshtml/De.rc
+++ b/dll/win32/mshtml/De.rc
@@ -72,4 +72,3 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Abbrechen", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
}
-#pragma code_page(default)
diff --git a/dll/win32/mshtml/Fr.rc b/dll/win32/mshtml/Fr.rc
index 84ee453128f..0d14f452e8b 100644
--- a/dll/win32/mshtml/Fr.rc
+++ b/dll/win32/mshtml/Fr.rc
@@ -72,4 +72,3 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Annuler", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
}
-#pragma code_page(default)
diff --git a/dll/win32/mshtml/It.rc b/dll/win32/mshtml/It.rc
index 4b262c56e3a..36660cca6bf 100644
--- a/dll/win32/mshtml/It.rc
+++ b/dll/win32/mshtml/It.rc
@@ -69,4 +69,3 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Annulla", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
}
-#pragma code_page(default)
diff --git a/dll/win32/mshtml/Ja.rc b/dll/win32/mshtml/Ja.rc
index 40db7b5f867..04fc32e785b 100644
--- a/dll/win32/mshtml/Ja.rc
+++ b/dll/win32/mshtml/Ja.rc
@@ -69,4 +69,3 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "キャンセル", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
}
-#pragma code_page(default)
diff --git a/dll/win32/mshtml/Lt.rc b/dll/win32/mshtml/Lt.rc
index 560cc08dd16..8f7e772a3a7 100644
--- a/dll/win32/mshtml/Lt.rc
+++ b/dll/win32/mshtml/Lt.rc
@@ -69,4 +69,3 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "Gerai", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Atsisakyti", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
}
-#pragma code_page(default)
diff --git a/dll/win32/mshtml/No.rc b/dll/win32/mshtml/No.rc
index 3a3b45d7a42..4592599edf3 100644
--- a/dll/win32/mshtml/No.rc
+++ b/dll/win32/mshtml/No.rc
@@ -70,4 +70,3 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Avbryt", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
}
-#pragma code_page(default)
diff --git a/dll/win32/mshtml/Si.rc b/dll/win32/mshtml/Si.rc
index 500081bc790..6881addcd5b 100644
--- a/dll/win32/mshtml/Si.rc
+++ b/dll/win32/mshtml/Si.rc
@@ -68,4 +68,3 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "V redu", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Prekliči", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
}
-#pragma code_page(default)
diff --git a/dll/win32/mshtml/htmldoc.c b/dll/win32/mshtml/htmldoc.c
index 8adfdb14b43..12aa8c002dc 100644
--- a/dll/win32/mshtml/htmldoc.c
+++ b/dll/win32/mshtml/htmldoc.c
@@ -554,9 +554,12 @@ static HRESULT WINAPI HTMLDocument_get_vlinkColor(IHTMLDocument2 *iface, VARIANT
static HRESULT WINAPI HTMLDocument_get_referrer(IHTMLDocument2 *iface, BSTR *p)
{
HTMLDocument *This = HTMLDOC_THIS(iface);
+
FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
-}
+
+ *p = NULL;
+ return S_OK;
+ }
static HRESULT WINAPI HTMLDocument_get_location(IHTMLDocument2 *iface, IHTMLLocation **p)
{
@@ -1474,7 +1477,7 @@ static void HTMLDocument_on_advise(IUnknown *iface, cp_static_data_t *cp)
HTMLDocument *This = HTMLDOC_THIS(iface);
if(This->window)
- update_cp_events(This->window, cp);
+ update_cp_events(This->window, &This->doc_node->node.event_target, cp, This->doc_node->node.nsnode);
}
#undef HTMLDOC_THIS
@@ -1596,6 +1599,11 @@ static HRESULT WINAPI DocDispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID
{
HTMLDocument *This = DISPEX_THIS(iface);
+ if(This->window && id == DISPID_IHTMLDOCUMENT2_LOCATION && (wFlags & DISPATCH_PROPERTYPUT))
+ return IDispatchEx_InvokeEx(DISPATCHEX(This->window), DISPID_IHTMLWINDOW2_LOCATION, lcid, wFlags,
+ pdp, pvarRes, pei, pspCaller);
+
+
return IDispatchEx_InvokeEx(This->dispex, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
}
diff --git a/dll/win32/mshtml/htmldoc3.c b/dll/win32/mshtml/htmldoc3.c
index 9079bbc79c7..e28297fce14 100644
--- a/dll/win32/mshtml/htmldoc3.c
+++ b/dll/win32/mshtml/htmldoc3.c
@@ -182,7 +182,7 @@ static HRESULT WINAPI HTMLDocument3_attachEvent(IHTMLDocument3 *iface, BSTR even
TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
- return attach_event(&This->doc_node->node.event_target, This, event, pDisp, pfResult);
+ return attach_event(&This->doc_node->node.event_target, This->doc_node->node.nsnode, This, event, pDisp, pfResult);
}
static HRESULT WINAPI HTMLDocument3_detachEvent(IHTMLDocument3 *iface, BSTR event,
diff --git a/dll/win32/mshtml/htmlelem2.c b/dll/win32/mshtml/htmlelem2.c
index cd877ceaf30..548bab8b2f5 100644
--- a/dll/win32/mshtml/htmlelem2.c
+++ b/dll/win32/mshtml/htmlelem2.c
@@ -649,7 +649,7 @@ static HRESULT WINAPI HTMLElement2_attachEvent(IHTMLElement2 *iface, BSTR event,
TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
- return attach_event(get_node_event_target(&This->node), &This->node.doc->basedoc, event, pDisp, pfResult);
+ return attach_event(get_node_event_target(&This->node), This->node.nsnode, &This->node.doc->basedoc, event, pDisp, pfResult);
}
static HRESULT WINAPI HTMLElement2_detachEvent(IHTMLElement2 *iface, BSTR event, IDispatch *pDisp)
diff --git a/dll/win32/mshtml/htmlevent.c b/dll/win32/mshtml/htmlevent.c
index 54429c34a20..eef006c962c 100644
--- a/dll/win32/mshtml/htmlevent.c
+++ b/dll/win32/mshtml/htmlevent.c
@@ -40,6 +40,7 @@ typedef struct {
} handler_vector_t;
struct event_target_t {
+ DWORD node_handlers_mask;
handler_vector_t *event_table[EVENTID_LAST];
};
@@ -129,6 +130,7 @@ typedef struct {
#define EVENT_DEFAULTLISTENER 0x0001
#define EVENT_BUBBLE 0x0002
#define EVENT_FORWARDBODY 0x0004
+#define EVENT_NODEHANDLER 0x0008
static const event_info_t event_info[] = {
{beforeunloadW, onbeforeunloadW, EVENTT_NONE, DISPID_EVMETH_ONBEFOREUNLOAD,
@@ -152,7 +154,7 @@ static const event_info_t event_info[] = {
{keyupW, onkeyupW, EVENTT_KEY, DISPID_EVMETH_ONKEYUP,
EVENT_DEFAULTLISTENER|EVENT_BUBBLE},
{loadW, onloadW, EVENTT_HTML, DISPID_EVMETH_ONLOAD,
- 0},
+ EVENT_NODEHANDLER},
{mousedownW, onmousedownW, EVENTT_MOUSE, DISPID_EVMETH_ONMOUSEDOWN,
EVENT_DEFAULTLISTENER|EVENT_BUBBLE},
{mouseoutW, onmouseoutW, EVENTT_MOUSE, DISPID_EVMETH_ONMOUSEOUT,
@@ -171,6 +173,8 @@ static const event_info_t event_info[] = {
0}
};
+static const eventid_t node_handled_list[] = { EVENTID_LOAD };
+
eventid_t str_to_eid(LPCWSTR str)
{
int i;
@@ -196,6 +200,19 @@ static eventid_t attr_to_eid(LPCWSTR str)
return EVENTID_LAST;
}
+static DWORD get_node_handler_mask(eventid_t eid)
+{
+ DWORD i;
+
+ for(i=0; ibasedoc.window->event;
- event_obj = doc->basedoc.window->event = create_event(get_node(doc, target, TRUE), eid, nsevent);
+ if(set_event)
+ event_obj = create_event(get_node(doc, target, TRUE), eid, nsevent);
+ doc->basedoc.window->event = event_obj;
nsIDOMNode_GetNodeType(target, &node_type);
nsnode = target;
@@ -949,7 +968,8 @@ void fire_event(HTMLDocumentNode *doc, eventid_t eid, nsIDOMNode *target, nsIDOM
if(nsnode)
nsIDOMNode_Release(nsnode);
- IHTMLEventObj_Release(event_obj);
+ if(event_obj)
+ IHTMLEventObj_Release(event_obj);
doc->basedoc.window->event = prev_event;
}
@@ -971,7 +991,7 @@ HRESULT dispatch_event(HTMLDOMNode *node, const WCHAR *event_name, VARIANT *even
return E_NOTIMPL;
}
- fire_event(node->doc, eid, node->nsnode, NULL);
+ fire_event(node->doc, eid, TRUE, node->nsnode, NULL);
*cancelled = VARIANT_TRUE; /* FIXME */
return S_OK;
@@ -989,7 +1009,7 @@ HRESULT call_event(HTMLDOMNode *node, eventid_t eid)
return hres;
}
- fire_event(node->doc, eid, node->nsnode, NULL);
+ fire_event(node->doc, eid, TRUE, node->nsnode, NULL);
return S_OK;
}
@@ -1021,9 +1041,24 @@ static BOOL alloc_handler_vector(event_target_t *event_target, eventid_t eid, in
return TRUE;
}
-static HRESULT ensure_nsevent_handler(HTMLDocumentNode *doc, eventid_t eid)
+static HRESULT ensure_nsevent_handler(HTMLDocumentNode *doc, event_target_t *event_target, nsIDOMNode *nsnode, eventid_t eid)
{
- if(!doc->nsdoc || !(event_info[eid].flags & EVENT_DEFAULTLISTENER))
+ if(!doc->nsdoc)
+ return S_OK;
+
+ if(event_info[eid].flags & EVENT_NODEHANDLER) {
+ DWORD mask;
+
+ mask = get_node_handler_mask(eid);
+ if(event_target->node_handlers_mask & mask)
+ return S_OK;
+
+ add_nsevent_listener(doc, nsnode, event_info[eid].name);
+ event_target->node_handlers_mask |= mask;
+ return S_OK;
+ }
+
+ if(!(event_info[eid].flags & EVENT_DEFAULTLISTENER))
return S_OK;
if(!doc->event_vector) {
@@ -1034,17 +1069,30 @@ static HRESULT ensure_nsevent_handler(HTMLDocumentNode *doc, eventid_t eid)
if(!doc->event_vector[eid]) {
doc->event_vector[eid] = TRUE;
- add_nsevent_listener(doc, event_info[eid].name);
+ add_nsevent_listener(doc, NULL, event_info[eid].name);
}
return S_OK;
}
-static HRESULT set_event_handler_disp(event_target_t **event_target_ptr, HTMLDocumentNode *doc,
+static HRESULT remove_event_handler(event_target_t **event_target, eventid_t eid)
+{
+ if(*event_target && (*event_target)->event_table[eid]->handler_prop) {
+ IDispatch_Release((*event_target)->event_table[eid]->handler_prop);
+ (*event_target)->event_table[eid]->handler_prop = NULL;
+ }
+
+ return S_OK;
+}
+
+static HRESULT set_event_handler_disp(event_target_t **event_target_ptr, nsIDOMNode *nsnode, HTMLDocumentNode *doc,
eventid_t eid, IDispatch *disp)
{
event_target_t *event_target;
+ if(!disp)
+ return remove_event_handler(event_target_ptr, eid);
+
event_target = get_event_target(event_target_ptr);
if(!event_target)
return E_OUTOFMEMORY;
@@ -1056,25 +1104,19 @@ static HRESULT set_event_handler_disp(event_target_t **event_target_ptr, HTMLDoc
IDispatch_Release(event_target->event_table[eid]->handler_prop);
event_target->event_table[eid]->handler_prop = disp;
- if(!disp)
- return S_OK;
IDispatch_AddRef(disp);
- return ensure_nsevent_handler(doc, eid);
+ return ensure_nsevent_handler(doc, event_target, nsnode, eid);
}
-HRESULT set_event_handler(event_target_t **event_target, HTMLDocumentNode *doc, eventid_t eid, VARIANT *var)
+HRESULT set_event_handler(event_target_t **event_target, nsIDOMNode *nsnode, HTMLDocumentNode *doc, eventid_t eid, VARIANT *var)
{
switch(V_VT(var)) {
case VT_NULL:
- if(*event_target && (*event_target)->event_table[eid] && (*event_target)->event_table[eid]->handler_prop) {
- IDispatch_Release((*event_target)->event_table[eid]->handler_prop);
- (*event_target)->event_table[eid]->handler_prop = NULL;
- }
- break;
+ return remove_event_handler(event_target, eid);
case VT_DISPATCH:
- return set_event_handler_disp(event_target, doc, eid, V_DISPATCH(var));
+ return set_event_handler_disp(event_target, nsnode, doc, eid, V_DISPATCH(var));
default:
FIXME("not supported vt=%d\n", V_VT(var));
@@ -1098,7 +1140,8 @@ HRESULT get_event_handler(event_target_t **event_target, eventid_t eid, VARIANT
return S_OK;
}
-HRESULT attach_event(event_target_t **event_target_ptr, HTMLDocument *doc, BSTR name, IDispatch *disp, VARIANT_BOOL *res)
+HRESULT attach_event(event_target_t **event_target_ptr, nsIDOMNode *nsnode, HTMLDocument *doc, BSTR name,
+ IDispatch *disp, VARIANT_BOOL *res)
{
event_target_t *event_target;
eventid_t eid;
@@ -1128,7 +1171,7 @@ HRESULT attach_event(event_target_t **event_target_ptr, HTMLDocument *doc, BSTR
event_target->event_table[eid]->handlers[i] = disp;
*res = VARIANT_TRUE;
- return ensure_nsevent_handler(doc->doc_node, eid);
+ return ensure_nsevent_handler(doc->doc_node, event_target, nsnode, eid);
}
HRESULT detach_event(event_target_t *event_target, HTMLDocument *doc, BSTR name, IDispatch *disp)
@@ -1159,13 +1202,18 @@ HRESULT detach_event(event_target_t *event_target, HTMLDocument *doc, BSTR name,
return S_OK;
}
-void update_cp_events(HTMLWindow *window, cp_static_data_t *cp)
+void update_cp_events(HTMLWindow *window, event_target_t **event_target_ptr, cp_static_data_t *cp, nsIDOMNode *nsnode)
{
+ event_target_t *event_target;
int i;
+ event_target = get_event_target(event_target_ptr);
+ if(!event_target)
+ return; /* FIXME */
+
for(i=0; i < EVENTID_LAST; i++) {
if((event_info[i].flags & EVENT_DEFAULTLISTENER) && is_cp_event(cp, event_info[i].dispid))
- ensure_nsevent_handler(window->doc, i);
+ ensure_nsevent_handler(window->doc, event_target, nsnode, i);
}
}
@@ -1194,7 +1242,7 @@ void check_event_attr(HTMLDocumentNode *doc, nsIDOMElement *nselem)
disp = script_parse_event(doc->basedoc.window, attr_value);
if(disp) {
node = get_node(doc, (nsIDOMNode*)nselem, TRUE);
- set_event_handler_disp(get_node_event_target(node), node->doc, i, disp);
+ set_event_handler_disp(get_node_event_target(node), node->nsnode, node->doc, i, disp);
IDispatch_Release(disp);
}
}
diff --git a/dll/win32/mshtml/htmlevent.h b/dll/win32/mshtml/htmlevent.h
index 96ff4cdab5b..6ba2fe29dc7 100644
--- a/dll/win32/mshtml/htmlevent.h
+++ b/dll/win32/mshtml/htmlevent.h
@@ -42,14 +42,14 @@ typedef enum {
eventid_t str_to_eid(LPCWSTR);
void check_event_attr(HTMLDocumentNode*,nsIDOMElement*);
void release_event_target(event_target_t*);
-void fire_event(HTMLDocumentNode*,eventid_t,nsIDOMNode*,nsIDOMEvent*);
-HRESULT set_event_handler(event_target_t**,HTMLDocumentNode*,eventid_t,VARIANT*);
+void fire_event(HTMLDocumentNode*,eventid_t,BOOL,nsIDOMNode*,nsIDOMEvent*);
+HRESULT set_event_handler(event_target_t**,nsIDOMNode*,HTMLDocumentNode*,eventid_t,VARIANT*);
HRESULT get_event_handler(event_target_t**,eventid_t,VARIANT*);
-HRESULT attach_event(event_target_t**,HTMLDocument*,BSTR,IDispatch*,VARIANT_BOOL*);
+HRESULT attach_event(event_target_t**,nsIDOMNode*,HTMLDocument*,BSTR,IDispatch*,VARIANT_BOOL*);
HRESULT detach_event(event_target_t*,HTMLDocument*,BSTR,IDispatch*);
HRESULT dispatch_event(HTMLDOMNode*,const WCHAR*,VARIANT*,VARIANT_BOOL*);
HRESULT call_event(HTMLDOMNode*,eventid_t);
-void update_cp_events(HTMLWindow*,cp_static_data_t*);
+void update_cp_events(HTMLWindow*,event_target_t**,cp_static_data_t*,nsIDOMNode*);
static inline event_target_t **get_node_event_target(HTMLDOMNode *node)
{
@@ -58,7 +58,7 @@ static inline event_target_t **get_node_event_target(HTMLDOMNode *node)
static inline HRESULT set_node_event(HTMLDOMNode *node, eventid_t eid, VARIANT *var)
{
- return set_event_handler(get_node_event_target(node), node->doc, eid, var);
+ return set_event_handler(get_node_event_target(node), node->nsnode, node->doc, eid, var);
}
static inline HRESULT get_node_event(HTMLDOMNode *node, eventid_t eid, VARIANT *var)
diff --git a/dll/win32/mshtml/htmlimg.c b/dll/win32/mshtml/htmlimg.c
index 17b6cceac95..a4448f9588f 100644
--- a/dll/win32/mshtml/htmlimg.c
+++ b/dll/win32/mshtml/htmlimg.c
@@ -28,6 +28,7 @@
#include "wine/debug.h"
#include "mshtml_private.h"
+#include "htmlevent.h"
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
@@ -388,15 +389,19 @@ static HRESULT WINAPI HTMLImgElement_get_align(IHTMLImgElement *iface, BSTR *p)
static HRESULT WINAPI HTMLImgElement_put_onload(IHTMLImgElement *iface, VARIANT v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
- FIXME("(%p)->()\n", This);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
+
+ return set_node_event(&This->element.node, EVENTID_LOAD, &v);
}
static HRESULT WINAPI HTMLImgElement_get_onload(IHTMLImgElement *iface, VARIANT *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ return get_node_event(&This->element.node, EVENTID_LOAD, p);
}
static HRESULT WINAPI HTMLImgElement_put_onerror(IHTMLImgElement *iface, VARIANT v)
diff --git a/dll/win32/mshtml/htmlwindow.c b/dll/win32/mshtml/htmlwindow.c
index 491625ed241..2aafaa3e4b4 100644
--- a/dll/win32/mshtml/htmlwindow.c
+++ b/dll/win32/mshtml/htmlwindow.c
@@ -126,7 +126,7 @@ static inline HRESULT set_window_event(HTMLWindow *window, eventid_t eid, VARIAN
return E_FAIL;
}
- return set_event_handler(&window->doc->body_event_target, window->doc, eid, var);
+ return set_event_handler(&window->doc->body_event_target, NULL, window->doc, eid, var);
}
static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
@@ -1419,7 +1419,7 @@ static HRESULT WINAPI HTMLWindow3_attachEvent(IHTMLWindow3 *iface, BSTR event, I
return E_FAIL;
}
- return attach_event(&This->doc->body_event_target, &This->doc->basedoc, event, pDisp, pfResult);
+ return attach_event(&This->doc->body_event_target, NULL, &This->doc->basedoc, event, pDisp, pfResult);
}
static HRESULT WINAPI HTMLWindow3_detachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp)
diff --git a/dll/win32/mshtml/mshtml_private.h b/dll/win32/mshtml/mshtml_private.h
index 5a409b3cae5..228be35864e 100644
--- a/dll/win32/mshtml/mshtml_private.h
+++ b/dll/win32/mshtml/mshtml_private.h
@@ -736,7 +736,7 @@ nsresult get_nsinterface(nsISupports*,REFIID,void**);
void init_nsevents(HTMLDocumentNode*);
void release_nsevents(HTMLDocumentNode*);
-void add_nsevent_listener(HTMLDocumentNode*,LPCWSTR);
+void add_nsevent_listener(HTMLDocumentNode*,nsIDOMNode*,LPCWSTR);
void set_window_bscallback(HTMLWindow*,nsChannelBSC*);
void set_current_mon(HTMLWindow*,IMoniker*);
diff --git a/dll/win32/mshtml/mutation.c b/dll/win32/mshtml/mutation.c
index 61ceca83525..a7942043557 100644
--- a/dll/win32/mshtml/mutation.c
+++ b/dll/win32/mshtml/mutation.c
@@ -338,6 +338,9 @@ static void handle_end_load(HTMLDocumentNode *This)
TRACE("\n");
+ if(!This->basedoc.doc_obj)
+ return;
+
if(This != This->basedoc.doc_obj->basedoc.doc_node) {
set_ready_state(This->basedoc.window, READYSTATE_INTERACTIVE);
return;
diff --git a/dll/win32/mshtml/navigate.c b/dll/win32/mshtml/navigate.c
index a09ea7f64d6..cc2aeb3f6c2 100644
--- a/dll/win32/mshtml/navigate.c
+++ b/dll/win32/mshtml/navigate.c
@@ -972,8 +972,11 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
on_start_nsrequest(This);
- if(This->window)
+ if(This->window) {
update_window_doc(This->window);
+ if(This->window->readystate != READYSTATE_LOADING)
+ set_ready_state(This->window, READYSTATE_LOADING);
+ }
}
This->bsc.readed += This->nsstream->buf_size;
diff --git a/dll/win32/mshtml/nsevents.c b/dll/win32/mshtml/nsevents.c
index 65bcae05c31..c491424fdd4 100644
--- a/dll/win32/mshtml/nsevents.c
+++ b/dll/win32/mshtml/nsevents.c
@@ -216,7 +216,7 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event
TRACE("(%p)\n", doc);
- if(!doc)
+ if(!doc || !doc->basedoc.window)
return NS_ERROR_FAILURE;
doc_obj = doc->basedoc.doc_obj;
@@ -254,7 +254,7 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event
nsIDOMHTMLDocument_GetBody(doc->nsdoc, &nsbody);
if(nsbody) {
- fire_event(doc, EVENTID_LOAD, (nsIDOMNode*)nsbody, event);
+ fire_event(doc, EVENTID_LOAD, TRUE, (nsIDOMNode*)nsbody, event);
nsIDOMHTMLElement_Release(nsbody);
}
@@ -271,6 +271,8 @@ static nsresult NSAPI handle_htmlevent(nsIDOMEventListener *iface, nsIDOMEvent *
eventid_t eid;
nsresult nsres;
+ TRACE("\n");
+
nsAString_Init(&type_str, NULL);
nsIDOMEvent_GetType(event, &type_str);
nsAString_GetData(&type_str, &type);
@@ -290,7 +292,7 @@ static nsresult NSAPI handle_htmlevent(nsIDOMEventListener *iface, nsIDOMEvent *
return NS_OK;
}
- fire_event(doc, eid, nsnode, event);
+ fire_event(doc, eid, TRUE, nsnode, event);
nsIDOMNode_Release(nsnode);
@@ -334,12 +336,15 @@ static void init_listener(nsEventListener *This, nsDocumentEventListener *listen
This->This = listener;
}
-void add_nsevent_listener(HTMLDocumentNode *doc, LPCWSTR type)
+void add_nsevent_listener(HTMLDocumentNode *doc, nsIDOMNode *nsnode, LPCWSTR type)
{
nsIDOMEventTarget *target;
nsresult nsres;
- nsres = nsIDOMWindow_QueryInterface(doc->basedoc.window->nswindow, &IID_nsIDOMEventTarget, (void**)&target);
+ if(nsnode)
+ nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMEventTarget, (void**)&target);
+ else
+ nsres = nsIDOMWindow_QueryInterface(doc->basedoc.window->nswindow, &IID_nsIDOMEventTarget, (void**)&target);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMEventTarget interface: %08x\n", nsres);
return;
diff --git a/dll/win32/mshtml/nsio.c b/dll/win32/mshtml/nsio.c
index f4e6f4bcb56..88a4e55254b 100644
--- a/dll/win32/mshtml/nsio.c
+++ b/dll/win32/mshtml/nsio.c
@@ -904,7 +904,7 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen
open = FALSE;
}else {
- open = before_async_open(This, window->doc_obj->nscontainer);
+ open = !before_async_open(This, window->doc_obj->nscontainer);
if(!open) {
TRACE("canceled\n");
nsres = NS_ERROR_UNEXPECTED;
diff --git a/dll/win32/mshtml/omnavigator.c b/dll/win32/mshtml/omnavigator.c
index dc0fb4a8ca4..d127eef57f7 100644
--- a/dll/win32/mshtml/omnavigator.c
+++ b/dll/win32/mshtml/omnavigator.c
@@ -160,19 +160,28 @@ static HRESULT WINAPI OmNavigator_get_appVersion(IOmNavigator *iface, BSTR *p)
{
OmNavigator *This = OMNAVIGATOR_THIS(iface);
- /* FIXME: Should we return something smarter? */
- static const WCHAR app_verW[] =
- {'4','.','0',' ','(','c','o','m','p','a','t','i','b','l','e',';',
- ' ','M','S','I','E',' ','7','.','0',';',
- ' ','W','i','n','d','o','w','s',' ','N','T',' ','5','.','1',';',
- ' ','M','o','z','i','l','l','a','/','4','.','0',')',0};
+ char user_agent[512];
+ DWORD size;
+ HRESULT hres;
TRACE("(%p)->(%p)\n", This, p);
- *p = SysAllocString(app_verW);
+ size = sizeof(user_agent);
+ hres = ObtainUserAgentString(0, user_agent, &size);
+ if(FAILED(hres))
+ return hres;
+
+ if(strncmp(user_agent, "Mozilla/", 8)) {
+ FIXME("Unsupported user agent\n");
+ return E_FAIL;
+ }
+
+ size = MultiByteToWideChar(CP_ACP, 0, user_agent+8, -1, NULL, 0);
+ *p = SysAllocStringLen(NULL, size-1);
if(!*p)
return E_OUTOFMEMORY;
+ MultiByteToWideChar(CP_ACP, 0, user_agent+8, -1, *p, size);
return S_OK;
}
diff --git a/dll/win32/mshtml/persist.c b/dll/win32/mshtml/persist.c
index 720a58edbf8..44ccd0f6b2c 100644
--- a/dll/win32/mshtml/persist.c
+++ b/dll/win32/mshtml/persist.c
@@ -108,6 +108,7 @@ static void set_progress_proc(task_t *_task)
V_I4(&progress) = 0; /* FIXME */
IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER,
&progress, NULL);
+ IOleCommandTarget_Release(olecmd);
}
if(doc->usermode == EDITMODE && doc->hostui) {
@@ -282,11 +283,15 @@ HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannel
void set_ready_state(HTMLWindow *window, READYSTATE readystate)
{
window->readystate = readystate;
+
if(window->doc_obj && window->doc_obj->basedoc.window == window)
call_property_onchanged(&window->doc_obj->basedoc.cp_propnotif, DISPID_READYSTATE);
+
+ fire_event(window->doc, EVENTID_READYSTATECHANGE, FALSE, window->doc->node.nsnode, NULL);
+
if(window->frame_element)
fire_event(window->frame_element->element.node.doc, EVENTID_READYSTATECHANGE,
- window->frame_element->element.node.nsnode, NULL);
+ TRUE, window->frame_element->element.node.nsnode, NULL);
}
static HRESULT get_doc_string(HTMLDocumentNode *This, char **str)
diff --git a/dll/win32/msi/database.c b/dll/win32/msi/database.c
index 8ec2411cb59..cfa11e97ed5 100644
--- a/dll/win32/msi/database.c
+++ b/dll/win32/msi/database.c
@@ -2057,7 +2057,7 @@ static ULONG WINAPI mrd_Release( IWineMsiRemoteDatabase *iface )
}
static HRESULT WINAPI mrd_IsTablePersistent( IWineMsiRemoteDatabase *iface,
- BSTR table, MSICONDITION *persistent )
+ LPCWSTR table, MSICONDITION *persistent )
{
msi_remote_database_impl *This = mrd_from_IWineMsiRemoteDatabase( iface );
*persistent = MsiDatabaseIsTablePersistentW(This->database, table);
@@ -2065,7 +2065,7 @@ static HRESULT WINAPI mrd_IsTablePersistent( IWineMsiRemoteDatabase *iface,
}
static HRESULT WINAPI mrd_GetPrimaryKeys( IWineMsiRemoteDatabase *iface,
- BSTR table, MSIHANDLE *keys )
+ LPCWSTR table, MSIHANDLE *keys )
{
msi_remote_database_impl *This = mrd_from_IWineMsiRemoteDatabase( iface );
UINT r = MsiDatabaseGetPrimaryKeysW(This->database, table, keys);
@@ -2081,7 +2081,7 @@ static HRESULT WINAPI mrd_GetSummaryInformation( IWineMsiRemoteDatabase *iface,
}
static HRESULT WINAPI mrd_OpenView( IWineMsiRemoteDatabase *iface,
- BSTR query, MSIHANDLE *view )
+ LPCWSTR query, MSIHANDLE *view )
{
msi_remote_database_impl *This = mrd_from_IWineMsiRemoteDatabase( iface );
UINT r = MsiDatabaseOpenViewW(This->database, query, view);
diff --git a/dll/win32/msi/msi_De.rc b/dll/win32/msi/msi_De.rc
index 7307621b768..e0cccf07806 100644
--- a/dll/win32/msi/msi_De.rc
+++ b/dll/win32/msi/msi_De.rc
@@ -36,4 +36,3 @@ STRINGTABLE DISCARDABLE
14 "Feature von:"
15 "Wählen Sie das Verzeichnis aus, dass %s enthält."
}
-#pragma code_page(default)
diff --git a/dll/win32/msi/msi_Fr.rc b/dll/win32/msi/msi_Fr.rc
index 08b90497745..f7f733803bc 100644
--- a/dll/win32/msi/msi_Fr.rc
+++ b/dll/win32/msi/msi_Fr.rc
@@ -37,4 +37,3 @@ STRINGTABLE DISCARDABLE
14 "fonctionnalité depuis :"
15 "sélectionnez le dossier contenant %s"
}
-#pragma code_page(default)
diff --git a/dll/win32/msi/msi_It.rc b/dll/win32/msi/msi_It.rc
index 11525add056..a40a7303425 100644
--- a/dll/win32/msi/msi_It.rc
+++ b/dll/win32/msi/msi_It.rc
@@ -37,4 +37,3 @@ STRINGTABLE DISCARDABLE
14 "funzionalità da:"
15 "selezionare la cartella che contiene %s"
}
-#pragma code_page(default)
diff --git a/dll/win32/msi/msi_Lt.rc b/dll/win32/msi/msi_Lt.rc
index 76602612bd5..1cf1c52924e 100644
--- a/dll/win32/msi/msi_Lt.rc
+++ b/dll/win32/msi/msi_Lt.rc
@@ -37,4 +37,3 @@ STRINGTABLE DISCARDABLE
14 "komponentas iš:"
15 "parinkite aplanką, kuris turi %s"
}
-#pragma code_page(default)
diff --git a/dll/win32/msi/msi_Ro.rc b/dll/win32/msi/msi_Ro.rc
index 436f83b491b..b877b42a34e 100644
--- a/dll/win32/msi/msi_Ro.rc
+++ b/dll/win32/msi/msi_Ro.rc
@@ -35,4 +35,3 @@ STRINGTABLE DISCARDABLE
14 "caracteristică de la:"
15 "selectați fișierul care conține %s"
}
-#pragma code_page(default)
diff --git a/dll/win32/msi/msi_Ru.rc b/dll/win32/msi/msi_Ru.rc
index 3e59873c228..8e7aafdda31 100644
--- a/dll/win32/msi/msi_Ru.rc
+++ b/dll/win32/msi/msi_Ru.rc
@@ -37,4 +37,3 @@ STRINGTABLE DISCARDABLE
14 "возможность из:"
15 "выберите каталог, содержащий %s"
}
-#pragma code_page(default)
diff --git a/dll/win32/msi/msi_Si.rc b/dll/win32/msi/msi_Si.rc
index df7a9f1dc04..75823390635 100644
--- a/dll/win32/msi/msi_Si.rc
+++ b/dll/win32/msi/msi_Si.rc
@@ -36,4 +36,3 @@ STRINGTABLE DISCARDABLE
14 "funkcija z:"
15 "izberite mapo, ki vsebuje %s"
}
-#pragma code_page(default)
diff --git a/dll/win32/msi/msiquery.c b/dll/win32/msi/msiquery.c
index b673832b0c4..f2723affca9 100644
--- a/dll/win32/msi/msiquery.c
+++ b/dll/win32/msi/msiquery.c
@@ -262,7 +262,7 @@ UINT WINAPI MsiDatabaseOpenViewW(MSIHANDLE hdb,
if ( !remote_database )
return ERROR_INVALID_HANDLE;
- hr = IWineMsiRemoteDatabase_OpenView( remote_database, (BSTR)szQuery, phView );
+ hr = IWineMsiRemoteDatabase_OpenView( remote_database, szQuery, phView );
IWineMsiRemoteDatabase_Release( remote_database );
if (FAILED(hr))
@@ -943,7 +943,7 @@ UINT WINAPI MsiDatabaseGetPrimaryKeysW( MSIHANDLE hdb,
if ( !remote_database )
return ERROR_INVALID_HANDLE;
- hr = IWineMsiRemoteDatabase_GetPrimaryKeys( remote_database, (BSTR)table, phRec );
+ hr = IWineMsiRemoteDatabase_GetPrimaryKeys( remote_database, table, phRec );
IWineMsiRemoteDatabase_Release( remote_database );
if (FAILED(hr))
@@ -1030,7 +1030,7 @@ MSICONDITION WINAPI MsiDatabaseIsTablePersistentW(
return MSICONDITION_ERROR;
hr = IWineMsiRemoteDatabase_IsTablePersistent( remote_database,
- (BSTR)szTableName, &condition );
+ szTableName, &condition );
IWineMsiRemoteDatabase_Release( remote_database );
if (FAILED(hr))
diff --git a/dll/win32/msi/msiserver.idl b/dll/win32/msi/msiserver.idl
index 25210fee155..e74c22c0b19 100644
--- a/dll/win32/msi/msiserver.idl
+++ b/dll/win32/msi/msiserver.idl
@@ -38,10 +38,10 @@ cpp_quote("#endif")
]
interface IWineMsiRemoteDatabase : IUnknown
{
- HRESULT IsTablePersistent( [in] BSTR table, [out] MSICONDITION *persistent );
- HRESULT GetPrimaryKeys( [in] BSTR table, [out] MSIHANDLE *keys );
+ HRESULT IsTablePersistent( [in] LPCWSTR table, [out] MSICONDITION *persistent );
+ HRESULT GetPrimaryKeys( [in] LPCWSTR table, [out] MSIHANDLE *keys );
HRESULT GetSummaryInformation( [in] UINT updatecount, [out] MSIHANDLE *suminfo );
- HRESULT OpenView( [in] BSTR query, [out] MSIHANDLE *view );
+ HRESULT OpenView( [in] LPCWSTR query, [out] MSIHANDLE *view );
HRESULT SetMsiHandle( [in] MSIHANDLE handle );
}
diff --git a/dll/win32/msvcrt/msvcrt.def b/dll/win32/msvcrt/msvcrt.def
index a78d2cc87ef..f7d9e100a2f 100644
--- a/dll/win32/msvcrt/msvcrt.def
+++ b/dll/win32/msvcrt/msvcrt.def
@@ -316,7 +316,7 @@ EXPORTS
; _getwche @310
_getws @311
_global_unwind2 @312
-; _gmtime64 @313
+ _gmtime64 @313
_heapadd @314
_heapchk @315
_heapmin @316
@@ -373,7 +373,7 @@ EXPORTS
_lfind @366
_loaddll @367
_local_unwind2 @368
-; _localtime64 @369
+ _localtime64 @369
_lock @370
_locking @371
_logb @372
@@ -539,7 +539,7 @@ EXPORTS
_tell @532
_telli64 @533
_tempnam @534
-; _time64 @535
+ _time64 @535
_timezone @536 DATA
_tolower @537
_toupper @538
diff --git a/dll/win32/msxml3/domdoc.c b/dll/win32/msxml3/domdoc.c
index a29e9b2fb3e..aae8a343500 100644
--- a/dll/win32/msxml3/domdoc.c
+++ b/dll/win32/msxml3/domdoc.c
@@ -1650,19 +1650,20 @@ static HRESULT WINAPI domdoc_abort(
static BOOL bstr_to_utf8( BSTR bstr, char **pstr, int *plen )
{
- UINT len, blen = SysStringLen( bstr );
+ UINT len;
LPSTR str;
- len = WideCharToMultiByte( CP_UTF8, 0, bstr, blen, NULL, 0, NULL, NULL );
+ len = WideCharToMultiByte( CP_UTF8, 0, bstr, -1, NULL, 0, NULL, NULL );
str = heap_alloc( len );
if ( !str )
return FALSE;
- WideCharToMultiByte( CP_UTF8, 0, bstr, blen, str, len, NULL, NULL );
+ WideCharToMultiByte( CP_UTF8, 0, bstr, -1, str, len, NULL, NULL );
*plen = len;
*pstr = str;
return TRUE;
}
+/* don't rely on data to be in BSTR format, treat it as WCHAR string */
static HRESULT WINAPI domdoc_loadXML(
IXMLDOMDocument2 *iface,
BSTR bstrXML,
diff --git a/dll/win32/ole32/compobj.c b/dll/win32/ole32/compobj.c
index 583a9cbcd00..12f83146113 100644
--- a/dll/win32/ole32/compobj.c
+++ b/dll/win32/ole32/compobj.c
@@ -2956,7 +2956,7 @@ HRESULT WINAPI CoGetTreatAsClass(REFCLSID clsidOld, LPCLSID clsidNew)
HRESULT res = S_OK;
LONG len = sizeof(szClsidNew);
- FIXME("(%s,%p)\n", debugstr_guid(clsidOld), clsidNew);
+ TRACE("(%s,%p)\n", debugstr_guid(clsidOld), clsidNew);
*clsidNew = *clsidOld; /* copy over old value */
res = COM_OpenKeyForCLSID(clsidOld, wszTreatAs, KEY_READ, &hkey);
diff --git a/dll/win32/ole32/ifs.h b/dll/win32/ole32/ifs.h
deleted file mode 100644
index 4c4287f319e..00000000000
--- a/dll/win32/ole32/ifs.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright 1997 Marcus Meissner
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#ifndef __WINE_OLE_IFS_H
-#define __WINE_OLE_IFS_H
-
-#include
-
-#include "windef.h"
-#include "winbase.h"
-#include "objbase.h"
-
-typedef CHAR OLECHAR16;
-typedef LPSTR LPOLESTR16;
-typedef LPCSTR LPCOLESTR16;
-
-#define STDMETHOD16CALLTYPE __cdecl
-#define STDMETHOD16(m) HRESULT (STDMETHOD16CALLTYPE *m)
-#define STDMETHOD16_(t,m) t (STDMETHOD16CALLTYPE *m)
-
-
-/***********************************************************************
- * IMalloc16 interface
- */
-
-typedef struct IMalloc16 *LPMALLOC16;
-
-#define INTERFACE IMalloc16
-DECLARE_INTERFACE_(IMalloc16,IUnknown)
-{
- /*** IUnknown methods ***/
- STDMETHOD16_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
- STDMETHOD16_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD16_(ULONG,Release)(THIS) PURE;
- /*** IMalloc16 methods ***/
- STDMETHOD16_(LPVOID,Alloc)(THIS_ DWORD cb) PURE;
- STDMETHOD16_(LPVOID,Realloc)(THIS_ LPVOID pv, DWORD cb) PURE;
- STDMETHOD16_(void,Free)(THIS_ LPVOID pv) PURE;
- STDMETHOD16_(DWORD,GetSize)(THIS_ LPVOID pv) PURE;
- STDMETHOD16_(INT16,DidAlloc)(THIS_ LPVOID pv) PURE;
- STDMETHOD16_(LPVOID,HeapMinimize)(THIS) PURE;
-};
-#undef INTERFACE
-
-/**********************************************************************/
-
-typedef struct ILockBytes16 *LPLOCKBYTES16;
-
-#define INTERFACE ILockBytes16
-DECLARE_INTERFACE_(ILockBytes16,IUnknown)
-{
- /*** IUnknown methods ***/
- STDMETHOD16_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
- STDMETHOD16_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD16_(ULONG,Release)(THIS) PURE;
- /*** ILockBytes16 methods ***/
- STDMETHOD16(ReadAt)(THIS_ ULARGE_INTEGER ulOffset, void *pv, ULONG cb, ULONG *pcbRead) PURE;
- STDMETHOD16(WriteAt)(THIS_ ULARGE_INTEGER ulOffset, const void *pv, ULONG cb, ULONG *pcbWritten) PURE;
- STDMETHOD16(Flush)(THIS) PURE;
- STDMETHOD16(SetSize)(THIS_ ULARGE_INTEGER cb) PURE;
- STDMETHOD16(LockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE;
- STDMETHOD16(UnlockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE;
- STDMETHOD16(Stat)(THIS_ STATSTG *pstatstg, DWORD grfStatFlag) PURE;
-};
-#undef INTERFACE
-
-/**********************************************************************/
-
-typedef struct tagSTATSTG16
-{
- LPOLESTR16 pwcsName;
- DWORD type;
- ULARGE_INTEGER cbSize;
- FILETIME mtime;
- FILETIME ctime;
- FILETIME atime;
- DWORD grfMode;
- DWORD grfLocksSupported;
- CLSID clsid;
- DWORD grfStateBits;
- DWORD reserved;
-} STATSTG16;
-
-typedef struct IStream16 *LPSTREAM16;
-
-#define INTERFACE IStream16
-DECLARE_INTERFACE_(IStream16,ISequentialStream)
-{
- /*** IUnknown methods ***/
- STDMETHOD16_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
- STDMETHOD16_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD16_(ULONG,Release)(THIS) PURE;
- /*** ISequentialStream methods ***/
- STDMETHOD16_(HRESULT,Read)(THIS_ void* pv, ULONG cb, ULONG* pcbRead) PURE;
- STDMETHOD16_(HRESULT,Write)(THIS_ const void* pv, ULONG cb, ULONG* pcbWritten) PURE;
- /*** IStream16 methods ***/
- STDMETHOD16(Seek)(THIS_ LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition) PURE;
- STDMETHOD16(SetSize)(THIS_ ULARGE_INTEGER libNewSize) PURE;
- STDMETHOD16(CopyTo)(THIS_ IStream16* pstm, ULARGE_INTEGER cb, ULARGE_INTEGER* pcbRead, ULARGE_INTEGER* pcbWritten) PURE;
- STDMETHOD16(Commit)(THIS_ DWORD grfCommitFlags) PURE;
- STDMETHOD16(Revert)(THIS) PURE;
- STDMETHOD16(LockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE;
- STDMETHOD16(UnlockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE;
- STDMETHOD16(Stat)(THIS_ STATSTG* pstatstg, DWORD grfStatFlag) PURE;
- STDMETHOD16(Clone)(THIS_ IStream16** ppstm) PURE;
-};
-#undef INTERFACE
-
-/**********************************************************************/
-
-typedef OLECHAR16 **SNB16;
-
-typedef struct IStorage16 *LPSTORAGE16;
-
-#define INTERFACE IStorage16
-DECLARE_INTERFACE_(IStorage16,IUnknown)
-{
- /*** IUnknown methods ***/
- STDMETHOD16_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
- STDMETHOD16_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD16_(ULONG,Release)(THIS) PURE;
- /*** IStorage16 methods ***/
- STDMETHOD16_(HRESULT,CreateStream)(THIS_ LPCOLESTR16 pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream16** ppstm) PURE;
- STDMETHOD16_(HRESULT,OpenStream)(THIS_ LPCOLESTR16 pwcsName, void* reserved1, DWORD grfMode, DWORD reserved2, IStream16** ppstm) PURE;
- STDMETHOD16_(HRESULT,CreateStorage)(THIS_ LPCOLESTR16 pwcsName, DWORD grfMode, DWORD dwStgFmt, DWORD reserved2, IStorage16** ppstg) PURE;
- STDMETHOD16_(HRESULT,OpenStorage)(THIS_ LPCOLESTR16 pwcsName, IStorage16* pstgPriority, DWORD grfMode, SNB16 snbExclude, DWORD reserved, IStorage16** ppstg) PURE;
- STDMETHOD16_(HRESULT,CopyTo)(THIS_ DWORD ciidExclude, const IID* rgiidExclude, SNB16 snbExclude, IStorage16* pstgDest) PURE;
- STDMETHOD16_(HRESULT,MoveElementTo)(THIS_ LPCOLESTR16 pwcsName, IStorage16* pstgDest, LPCOLESTR16 pwcsNewName, DWORD grfFlags) PURE;
- STDMETHOD16_(HRESULT,Commit)(THIS_ DWORD grfCommitFlags) PURE;
- STDMETHOD16_(HRESULT,Revert)(THIS) PURE;
- STDMETHOD16_(HRESULT,EnumElements)(THIS_ DWORD reserved1, void* reserved2, DWORD reserved3, IEnumSTATSTG** ppenum) PURE;
- STDMETHOD16_(HRESULT,DestroyElement)(THIS_ LPCOLESTR16 pwcsName) PURE;
- STDMETHOD16_(HRESULT,RenameElement)(THIS_ LPCOLESTR16 pwcsOldName, LPCOLESTR16 pwcsNewName) PURE;
- STDMETHOD16_(HRESULT,SetElementTimes)(THIS_ LPCOLESTR16 pwcsName, const FILETIME* pctime, const FILETIME* patime, const FILETIME* pmtime) PURE;
- STDMETHOD16_(HRESULT,SetClass)(THIS_ REFCLSID clsid) PURE;
- STDMETHOD16_(HRESULT,SetStateBits)(THIS_ DWORD grfStateBits, DWORD grfMask) PURE;
- STDMETHOD16_(HRESULT,Stat)(THIS_ STATSTG* pstatstg, DWORD grfStatFlag) PURE;
-};
-#undef INTERFACE
-
-#endif /* __WINE_OLE_IFS_H */
diff --git a/dll/win32/ole32/ole16.c b/dll/win32/ole32/ole16.c
deleted file mode 100644
index 1e1cf452f79..00000000000
--- a/dll/win32/ole32/ole16.c
+++ /dev/null
@@ -1,675 +0,0 @@
-/*
- * 16 bit ole functions
- *
- * Copyright 1995 Martin von Loewis
- * Copyright 1998 Justin Bradford
- * Copyright 1999 Francis Beaudet
- * Copyright 1999 Sylvain St-Germain
- * Copyright 2002 Marcus Meissner
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include "config.h"
-
-#include
-#include
-#include
-#include
-#include
-
-#include "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "objbase.h"
-#include "ole2.h"
-#include "rpc.h"
-#include "winerror.h"
-#include "winreg.h"
-#include "wownt32.h"
-#include "wtypes.h"
-#include "wine/unicode.h"
-#include "wine/winbase16.h"
-#include "compobj_private.h"
-#include "ifs.h"
-
-#include "wine/debug.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(ole);
-
-static HTASK16 hETask = 0;
-static WORD Table_ETask[62];
-
-static LPMALLOC16 currentMalloc16=NULL;
-
-/* --- IMalloc16 implementation */
-
-
-typedef struct
-{
- /* IUnknown fields */
- const IMalloc16Vtbl *lpVtbl;
- DWORD ref;
- /* IMalloc16 fields */
-} IMalloc16Impl;
-
-/******************************************************************************
- * IMalloc16_QueryInterface [COMPOBJ.500]
- */
-HRESULT CDECL IMalloc16_fnQueryInterface(IMalloc16* iface,REFIID refiid,LPVOID *obj) {
- IMalloc16Impl *This = (IMalloc16Impl *)iface;
-
- TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(refiid),obj);
- if ( !memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown)) ||
- !memcmp(&IID_IMalloc,refiid,sizeof(IID_IMalloc))
- ) {
- *obj = This;
- return 0;
- }
- return OLE_E_ENUM_NOMORE;
-}
-
-/******************************************************************************
- * IMalloc16_AddRef [COMPOBJ.501]
- */
-ULONG CDECL IMalloc16_fnAddRef(IMalloc16* iface) {
- IMalloc16Impl *This = (IMalloc16Impl *)iface;
- TRACE("(%p)->AddRef()\n",This);
- return 1; /* cannot be freed */
-}
-
-/******************************************************************************
- * IMalloc16_Release [COMPOBJ.502]
- */
-ULONG CDECL IMalloc16_fnRelease(IMalloc16* iface) {
- IMalloc16Impl *This = (IMalloc16Impl *)iface;
- TRACE("(%p)->Release()\n",This);
- return 1; /* cannot be freed */
-}
-
-/******************************************************************************
- * IMalloc16_Alloc [COMPOBJ.503]
- */
-SEGPTR CDECL IMalloc16_fnAlloc(IMalloc16* iface,DWORD cb) {
- IMalloc16Impl *This = (IMalloc16Impl *)iface;
- TRACE("(%p)->Alloc(%d)\n",This,cb);
- return MapLS( HeapAlloc( GetProcessHeap(), 0, cb ) );
-}
-
-/******************************************************************************
- * IMalloc16_Free [COMPOBJ.505]
- */
-VOID CDECL IMalloc16_fnFree(IMalloc16* iface,SEGPTR pv)
-{
- void *ptr = MapSL(pv);
- IMalloc16Impl *This = (IMalloc16Impl *)iface;
- TRACE("(%p)->Free(%08x)\n",This,pv);
- UnMapLS(pv);
- HeapFree( GetProcessHeap(), 0, ptr );
-}
-
-/******************************************************************************
- * IMalloc16_Realloc [COMPOBJ.504]
- */
-SEGPTR CDECL IMalloc16_fnRealloc(IMalloc16* iface,SEGPTR pv,DWORD cb)
-{
- SEGPTR ret;
- IMalloc16Impl *This = (IMalloc16Impl *)iface;
- TRACE("(%p)->Realloc(%08x,%d)\n",This,pv,cb);
- if (!pv)
- ret = IMalloc16_fnAlloc(iface, cb);
- else if (cb) {
- ret = MapLS( HeapReAlloc( GetProcessHeap(), 0, MapSL(pv), cb ) );
- UnMapLS(pv);
- } else {
- IMalloc16_fnFree(iface, pv);
- ret = 0;
- }
- return ret;
-}
-
-/******************************************************************************
- * IMalloc16_GetSize [COMPOBJ.506]
- */
-DWORD CDECL IMalloc16_fnGetSize(IMalloc16* iface,SEGPTR pv)
-{
- IMalloc16Impl *This = (IMalloc16Impl *)iface;
- TRACE("(%p)->GetSize(%08x)\n",This,pv);
- return HeapSize( GetProcessHeap(), 0, MapSL(pv) );
-}
-
-/******************************************************************************
- * IMalloc16_DidAlloc [COMPOBJ.507]
- */
-INT16 CDECL IMalloc16_fnDidAlloc(IMalloc16* iface,LPVOID pv) {
- IMalloc16 *This = iface;
- TRACE("(%p)->DidAlloc(%p)\n",This,pv);
- return (INT16)-1;
-}
-
-/******************************************************************************
- * IMalloc16_HeapMinimize [COMPOBJ.508]
- */
-LPVOID CDECL IMalloc16_fnHeapMinimize(IMalloc16* iface) {
- IMalloc16Impl *This = (IMalloc16Impl *)iface;
- TRACE("(%p)->HeapMinimize()\n",This);
- return NULL;
-}
-
-/******************************************************************************
- * IMalloc16_Constructor [VTABLE]
- */
-static LPMALLOC16
-IMalloc16_Constructor(void)
-{
- static IMalloc16Vtbl vt16;
- static SEGPTR msegvt16;
- IMalloc16Impl* This;
- HMODULE16 hcomp = GetModuleHandle16("COMPOBJ");
-
- This = HeapAlloc( GetProcessHeap(), 0, sizeof(IMalloc16Impl) );
- if (!msegvt16)
- {
-#define VTENT(x) vt16.x = (void*)GetProcAddress16(hcomp,"IMalloc16_"#x);assert(vt16.x)
- VTENT(QueryInterface);
- VTENT(AddRef);
- VTENT(Release);
- VTENT(Alloc);
- VTENT(Realloc);
- VTENT(Free);
- VTENT(GetSize);
- VTENT(DidAlloc);
- VTENT(HeapMinimize);
-#undef VTENT
- msegvt16 = MapLS( &vt16 );
- }
- This->lpVtbl = (const IMalloc16Vtbl*)msegvt16;
- This->ref = 1;
- return (LPMALLOC16)MapLS( This );
-}
-
-
-/***********************************************************************
- * CoGetMalloc [COMPOBJ.4]
- *
- * Retrieve the current win16 IMalloc interface.
- *
- * RETURNS
- * The current win16 IMalloc
- */
-HRESULT WINAPI CoGetMalloc16(
- DWORD dwMemContext, /* [in] unknown */
- LPMALLOC16 * lpMalloc /* [out] current win16 malloc interface */
-) {
- if(!currentMalloc16)
- currentMalloc16 = IMalloc16_Constructor();
- *lpMalloc = currentMalloc16;
- return S_OK;
-}
-
-/***********************************************************************
- * CoCreateStandardMalloc [COMPOBJ.71]
- */
-HRESULT WINAPI CoCreateStandardMalloc16(DWORD dwMemContext,
- LPMALLOC16 *lpMalloc)
-{
- /* FIXME: docu says we shouldn't return the same allocator as in
- * CoGetMalloc16 */
- *lpMalloc = IMalloc16_Constructor();
- return S_OK;
-}
-
-/******************************************************************************
- * CoInitialize [COMPOBJ.2]
- * Set the win16 IMalloc used for memory management
- */
-HRESULT WINAPI CoInitialize16(
- LPVOID lpReserved /* [in] pointer to win16 malloc interface */
-) {
- currentMalloc16 = (LPMALLOC16)lpReserved;
- return S_OK;
-}
-
-/***********************************************************************
- * CoUninitialize [COMPOBJ.3]
- * Don't know what it does.
- * 3-Nov-98 -- this was originally misspelled, I changed it to what I
- * believe is the correct spelling
- */
-void WINAPI CoUninitialize16(void)
-{
- TRACE("()\n");
- CoFreeAllLibraries();
-}
-
-/***********************************************************************
- * IsEqualGUID [COMPOBJ.18]
- *
- * Compares two Unique Identifiers.
- *
- * RETURNS
- * TRUE if equal
- */
-BOOL16 WINAPI IsEqualGUID16(
- GUID* g1, /* [in] unique id 1 */
- GUID* g2) /* [in] unique id 2 */
-{
- return !memcmp( g1, g2, sizeof(GUID) );
-}
-
-/******************************************************************************
- * CLSIDFromString [COMPOBJ.20]
- * Converts a unique identifier from its string representation into
- * the GUID struct.
- *
- * Class id: DWORD-WORD-WORD-BYTES[2]-BYTES[6]
- *
- * RETURNS
- * the converted GUID
- */
-HRESULT WINAPI CLSIDFromString16(
- LPCOLESTR16 idstr, /* [in] string representation of guid */
- CLSID *id) /* [out] GUID converted from string */
-{
- const BYTE *s;
- int i;
- BYTE table[256];
-
- if (!idstr) {
- memset( id, 0, sizeof (CLSID) );
- return S_OK;
- }
-
- /* validate the CLSID string */
- if (strlen(idstr) != 38)
- return CO_E_CLASSSTRING;
-
- s = (const BYTE *) idstr;
- if ((s[0]!='{') || (s[9]!='-') || (s[14]!='-') || (s[19]!='-') || (s[24]!='-') || (s[37]!='}'))
- return CO_E_CLASSSTRING;
-
- for (i=1; i<37; i++) {
- if ((i == 9)||(i == 14)||(i == 19)||(i == 24)) continue;
- if (!(((s[i] >= '0') && (s[i] <= '9')) ||
- ((s[i] >= 'a') && (s[i] <= 'f')) ||
- ((s[i] >= 'A') && (s[i] <= 'F'))))
- return CO_E_CLASSSTRING;
- }
-
- TRACE("%s -> %p\n", s, id);
-
- /* quick lookup table */
- memset(table, 0, 256);
-
- for (i = 0; i < 10; i++) {
- table['0' + i] = i;
- }
- for (i = 0; i < 6; i++) {
- table['A' + i] = i+10;
- table['a' + i] = i+10;
- }
-
- /* in form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */
-
- id->Data1 = (table[s[1]] << 28 | table[s[2]] << 24 | table[s[3]] << 20 | table[s[4]] << 16 |
- table[s[5]] << 12 | table[s[6]] << 8 | table[s[7]] << 4 | table[s[8]]);
- id->Data2 = table[s[10]] << 12 | table[s[11]] << 8 | table[s[12]] << 4 | table[s[13]];
- id->Data3 = table[s[15]] << 12 | table[s[16]] << 8 | table[s[17]] << 4 | table[s[18]];
-
- /* these are just sequential bytes */
- id->Data4[0] = table[s[20]] << 4 | table[s[21]];
- id->Data4[1] = table[s[22]] << 4 | table[s[23]];
- id->Data4[2] = table[s[25]] << 4 | table[s[26]];
- id->Data4[3] = table[s[27]] << 4 | table[s[28]];
- id->Data4[4] = table[s[29]] << 4 | table[s[30]];
- id->Data4[5] = table[s[31]] << 4 | table[s[32]];
- id->Data4[6] = table[s[33]] << 4 | table[s[34]];
- id->Data4[7] = table[s[35]] << 4 | table[s[36]];
-
- return S_OK;
-}
-
-/******************************************************************************
- * _xmalloc16 [internal]
- * Allocates size bytes from the standard ole16 allocator.
- *
- * RETURNS
- * the allocated segmented pointer and a HRESULT
- */
-static HRESULT
-_xmalloc16(DWORD size, SEGPTR *ptr) {
- LPMALLOC16 mllc;
- DWORD args[2];
-
- if (CoGetMalloc16(0,&mllc))
- return E_OUTOFMEMORY;
-
- args[0] = (DWORD)mllc;
- args[1] = size;
- /* No need for a Callback entry, we have WOWCallback16Ex which does
- * everything we need.
- */
- if (!WOWCallback16Ex(
- (DWORD)((const IMalloc16Vtbl*)MapSL(
- (SEGPTR)((LPMALLOC16)MapSL((SEGPTR)mllc))->lpVtbl )
- )->Alloc,
- WCB16_CDECL,
- 2*sizeof(DWORD),
- (LPVOID)args,
- (LPDWORD)ptr
- )) {
- ERR("CallTo16 IMalloc16 (%d) failed\n",size);
- return E_FAIL;
- }
- return S_OK;
-}
-
-/******************************************************************************
- * StringFromCLSID [COMPOBJ.19]
- * Converts a GUID into the respective string representation.
- * The target string is allocated using the OLE IMalloc.
- *
- * RETURNS
- * the string representation and HRESULT
- */
-
-HRESULT WINAPI StringFromCLSID16(
- REFCLSID id, /* [in] the GUID to be converted */
- LPOLESTR16 *idstr /* [out] a pointer to a to-be-allocated segmented pointer pointing to the resulting string */
-
-) {
- HRESULT ret;
-
- ret = _xmalloc16(40,(SEGPTR*)idstr);
- if (ret != S_OK)
- return ret;
- return WINE_StringFromCLSID(id,MapSL((SEGPTR)*idstr));
-}
-
-/******************************************************************************
- * ProgIDFromCLSID [COMPOBJ.62]
- *
- * Converts a class id into the respective Program ID. (By using a registry lookup)
- *
- * RETURNS
- * S_OK on success
- * riid associated with the progid
- */
-HRESULT WINAPI ProgIDFromCLSID16(
- REFCLSID clsid, /* [in] class id as found in registry */
- LPOLESTR16 *lplpszProgID/* [out] associated Program ID */
-) {
- static const WCHAR wszProgID[] = {'P','r','o','g','I','D',0};
- HKEY hkey;
- HRESULT ret;
- LONG len;
- char *buffer;
-
- ret = COM_OpenKeyForCLSID(clsid, wszProgID, KEY_READ, &hkey);
- if (FAILED(ret))
- return ret;
-
- if (RegQueryValueA(hkey, NULL, NULL, &len))
- ret = REGDB_E_READREGDB;
-
- if (ret == S_OK)
- {
- buffer = HeapAlloc(GetProcessHeap(), 0, len);
- if (RegQueryValueA(hkey, NULL, buffer, &len))
- ret = REGDB_E_READREGDB;
-
- if (ret == S_OK)
- {
- ret = _xmalloc16(len, (SEGPTR*)lplpszProgID);
- if (ret == S_OK)
- strcpy(MapSL((SEGPTR)*lplpszProgID),buffer);
- }
- HeapFree(GetProcessHeap(), 0, buffer);
- }
- RegCloseKey(hkey);
- return ret;
-}
-
-/***********************************************************************
- * LookupETask (COMPOBJ.94)
- */
-HRESULT WINAPI LookupETask16(HTASK16 *hTask,LPVOID p) {
- FIXME("(%p,%p),stub!\n",hTask,p);
- if ((*hTask = GetCurrentTask()) == hETask) {
- memcpy(p, Table_ETask, sizeof(Table_ETask));
- }
- return 0;
-}
-
-/***********************************************************************
- * SetETask (COMPOBJ.95)
- */
-HRESULT WINAPI SetETask16(HTASK16 hTask, LPVOID p) {
- FIXME("(%04x,%p),stub!\n",hTask,p);
- hETask = hTask;
- return 0;
-}
-
-/***********************************************************************
- * CALLOBJECTINWOW (COMPOBJ.201)
- */
-HRESULT WINAPI CallObjectInWOW(LPVOID p1,LPVOID p2) {
- FIXME("(%p,%p),stub!\n",p1,p2);
- return 0;
-}
-
-/******************************************************************************
- * CoRegisterClassObject [COMPOBJ.5]
- *
- * Don't know where it registers it ...
- */
-HRESULT WINAPI CoRegisterClassObject16(
- REFCLSID rclsid,
- LPUNKNOWN pUnk,
- DWORD dwClsContext, /* [in] CLSCTX flags indicating the context in which to run the executable */
- DWORD flags, /* [in] REGCLS flags indicating how connections are made */
- LPDWORD lpdwRegister
-) {
- FIXME("(%s,%p,0x%08x,0x%08x,%p),stub\n",
- debugstr_guid(rclsid),pUnk,dwClsContext,flags,lpdwRegister
- );
- return 0;
-}
-
-/******************************************************************************
- * CoRevokeClassObject [COMPOBJ.6]
- *
- */
-HRESULT WINAPI CoRevokeClassObject16(DWORD dwRegister) /* [in] token on class obj */
-{
- FIXME("(0x%08x),stub!\n", dwRegister);
- return 0;
-}
-
-/******************************************************************************
- * CoFileTimeToDosDateTime [COMPOBJ.30]
- */
-BOOL16 WINAPI CoFileTimeToDosDateTime16(const FILETIME *ft, LPWORD lpDosDate, LPWORD lpDosTime)
-{
- return FileTimeToDosDateTime(ft, lpDosDate, lpDosTime);
-}
-
-/******************************************************************************
- * CoDosDateTimeToFileTime [COMPOBJ.31]
- */
-BOOL16 WINAPI CoDosDateTimeToFileTime16(WORD wDosDate, WORD wDosTime, FILETIME *ft)
-{
- return DosDateTimeToFileTime(wDosDate, wDosTime, ft);
-}
-
-/******************************************************************************
- * CoRegisterMessageFilter [COMPOBJ.27]
- */
-HRESULT WINAPI CoRegisterMessageFilter16(
- LPMESSAGEFILTER lpMessageFilter,
- LPMESSAGEFILTER *lplpMessageFilter
-) {
- FIXME("(%p,%p),stub!\n",lpMessageFilter,lplpMessageFilter);
- return 0;
-}
-
-/******************************************************************************
- * CoLockObjectExternal [COMPOBJ.63]
- */
-HRESULT WINAPI CoLockObjectExternal16(
- LPUNKNOWN pUnk, /* [in] object to be locked */
- BOOL16 fLock, /* [in] do lock */
- BOOL16 fLastUnlockReleases /* [in] ? */
-) {
- FIXME("(%p,%d,%d),stub!\n",pUnk,fLock,fLastUnlockReleases);
- return S_OK;
-}
-
-/***********************************************************************
- * CoGetState [COMPOBJ.115]
- */
-HRESULT WINAPI CoGetState16(LPDWORD state)
-{
- FIXME("(%p),stub!\n", state);
-
- *state = 0;
- return S_OK;
-}
-
-/***********************************************************************
- * DllEntryPoint [COMPOBJ.116]
- *
- * Initialization code for the COMPOBJ DLL
- *
- * RETURNS:
- */
-BOOL WINAPI COMPOBJ_DllEntryPoint(DWORD Reason, HINSTANCE16 hInst, WORD ds, WORD HeapSize, DWORD res1, WORD res2)
-{
- TRACE("(%08x, %04x, %04x, %04x, %08x, %04x)\n", Reason, hInst, ds, HeapSize, res1, res2);
- return TRUE;
-}
-
-/***********************************************************************
- * CoMemAlloc [COMPOBJ.151]
- */
-SEGPTR WINAPI CoMemAlloc(DWORD size, DWORD dwMemContext, DWORD x) {
- HRESULT hres;
- SEGPTR segptr;
-
- /* FIXME: check context handling */
- TRACE("(%d, 0x%08x, 0x%08x)\n", size, dwMemContext, x);
- hres = _xmalloc16(size, &segptr);
- if (hres != S_OK)
- return 0;
- return segptr;
-}
-
-/******************************************************************************
- * CLSIDFromProgID [COMPOBJ.61]
- *
- * Converts a program ID into the respective GUID.
- *
- * PARAMS
- * progid [I] program id as found in registry
- * riid [O] associated CLSID
- *
- * RETURNS
- * Success: S_OK
- * Failure: CO_E_CLASSSTRING - the given ProgID cannot be found.
- */
-HRESULT WINAPI CLSIDFromProgID16(LPCOLESTR16 progid, LPCLSID riid)
-{
- char *buf,buf2[80];
- LONG buf2len;
- HRESULT err;
- HKEY xhkey;
-
- buf = HeapAlloc(GetProcessHeap(),0,strlen(progid)+8);
- sprintf(buf,"%s\\CLSID",progid);
- if ((err=RegOpenKeyA(HKEY_CLASSES_ROOT,buf,&xhkey))) {
- HeapFree(GetProcessHeap(),0,buf);
- return CO_E_CLASSSTRING;
- }
- HeapFree(GetProcessHeap(),0,buf);
- buf2len = sizeof(buf2);
- if ((err=RegQueryValueA(xhkey,NULL,buf2,&buf2len))) {
- RegCloseKey(xhkey);
- return CO_E_CLASSSTRING;
- }
- RegCloseKey(xhkey);
- return CLSIDFromString16(buf2,riid);
-}
-
-/***********************************************************************
- * CoGetClassObject [COMPOBJ.7]
- *
- */
-HRESULT WINAPI CoGetClassObject16(
- REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo,
- REFIID iid, LPVOID *ppv)
-{
- FIXME(", stub!\n\tCLSID:\t%s,\n\tIID:\t%s\n", debugstr_guid(rclsid), debugstr_guid(iid));
-
- if (pServerInfo) {
- FIXME("\tpServerInfo: name=%s\n",debugstr_w(pServerInfo->pwszName));
- FIXME("\t\tpAuthInfo=%p\n",pServerInfo->pAuthInfo);
- }
- return E_NOTIMPL;
-}
-
-/***********************************************************************
- * CoCreateInstance [COMPOBJ.13]
- */
-HRESULT WINAPI CoCreateInstance16(
- REFCLSID rclsid,
- LPUNKNOWN pUnkOuter,
- DWORD dwClsContext,
- REFIID iid,
- LPVOID *ppv)
-{
- FIXME("(%s, %p, %x, %s, %p), stub!\n",
- debugstr_guid(rclsid), pUnkOuter, dwClsContext, debugstr_guid(iid),
- ppv
- );
- return E_NOTIMPL;
-}
-
-/***********************************************************************
- * CoDisconnectObject [COMPOBJ.15]
- */
-HRESULT WINAPI CoDisconnectObject16( LPUNKNOWN lpUnk, DWORD reserved )
-{
- FIXME("(%p, 0x%08x): stub!\n", lpUnk, reserved);
- return E_NOTIMPL;
-}
-
-/***********************************************************************
- * DllGetClassObject [OLE2.4]
- */
-HRESULT WINAPI DllGetClassObject16(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
-{
- FIXME("(%s, %s, %p): stub\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
- return E_NOTIMPL;
-}
-
-/******************************************************************************
- * GetRunningObjectTable (OLE2.30)
- */
-HRESULT WINAPI
-GetRunningObjectTable16(DWORD reserved, LPRUNNINGOBJECTTABLE *pprot)
-{
- FIXME("(%d,%p),stub!\n",reserved,pprot);
- return E_NOTIMPL;
-}
diff --git a/dll/win32/ole32/stg_bigblockfile.c b/dll/win32/ole32/stg_bigblockfile.c
index 19151b96382..77abbf6286b 100644
--- a/dll/win32/ole32/stg_bigblockfile.c
+++ b/dll/win32/ole32/stg_bigblockfile.c
@@ -63,19 +63,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(storage);
/* We map in PAGE_SIZE-sized chunks. Must be a multiple of 4096. */
#define PAGE_SIZE 131072
-#define BLOCKS_PER_PAGE (PAGE_SIZE / BIG_BLOCK_SIZE)
-
/* We keep a list of recently-discarded pages. This controls the
* size of that list. */
#define MAX_VICTIM_PAGES 16
-/* This structure provides one bit for each block in a page.
- * Use BIGBLOCKFILE_{Test,Set,Clear}Bit to manipulate it. */
-typedef struct
-{
- unsigned int bits[BLOCKS_PER_PAGE / (CHAR_BIT * sizeof(unsigned int))];
-} BlockBits;
-
/***
* This structure identifies the paged that are mapped
* from the file and their position in memory. It is
@@ -96,16 +87,12 @@ struct MappedPage
DWORD mapped_bytes;
LPVOID lpBytes;
LONG refcnt;
-
- BlockBits readable_blocks;
- BlockBits writable_blocks;
};
struct BigBlockFile
{
BOOL fileBased;
ULARGE_INTEGER filesize;
- ULONG blocksize;
HANDLE hfile;
HANDLE hfilemap;
DWORD flProtect;
@@ -123,39 +110,6 @@ struct BigBlockFile
* pass expressions with side effects. */
#define ROUND_UP(a, b) ((((a) + (b) - 1)/(b))*(b))
-/***********************************************************
- * Blockbits functions.
- */
-static inline BOOL BIGBLOCKFILE_TestBit(const BlockBits *bb,
- unsigned int index)
-{
- unsigned int array_index = index / (CHAR_BIT * sizeof(unsigned int));
- unsigned int bit_index = index % (CHAR_BIT * sizeof(unsigned int));
-
- return bb->bits[array_index] & (1 << bit_index);
-}
-
-static inline void BIGBLOCKFILE_SetBit(BlockBits *bb, unsigned int index)
-{
- unsigned int array_index = index / (CHAR_BIT * sizeof(unsigned int));
- unsigned int bit_index = index % (CHAR_BIT * sizeof(unsigned int));
-
- bb->bits[array_index] |= (1 << bit_index);
-}
-
-static inline void BIGBLOCKFILE_ClearBit(BlockBits *bb, unsigned int index)
-{
- unsigned int array_index = index / (CHAR_BIT * sizeof(unsigned int));
- unsigned int bit_index = index % (CHAR_BIT * sizeof(unsigned int));
-
- bb->bits[array_index] &= ~(1 << bit_index);
-}
-
-static inline void BIGBLOCKFILE_Zero(BlockBits *bb)
-{
- memset(bb->bits, 0, sizeof(bb->bits));
-}
-
/******************************************************************************
* BIGBLOCKFILE_FileInit
*
@@ -302,9 +256,6 @@ static MappedPage *BIGBLOCKFILE_CreatePage(BigBlockFile *This, ULONG page_index)
return NULL;
}
- BIGBLOCKFILE_Zero(&page->readable_blocks);
- BIGBLOCKFILE_Zero(&page->writable_blocks);
-
return page;
}
@@ -328,9 +279,6 @@ static void * BIGBLOCKFILE_GetMappedView(
if (page)
{
This->num_victim_pages--;
-
- BIGBLOCKFILE_Zero(&page->readable_blocks);
- BIGBLOCKFILE_Zero(&page->writable_blocks);
}
}
@@ -709,7 +657,7 @@ static HRESULT ImplBIGBLOCKFILE_WriteAt(
* and the blocks in use list.
*/
BigBlockFile *BIGBLOCKFILE_Construct(HANDLE hFile, ILockBytes* pLkByt, DWORD openFlags,
- ULONG blocksize, BOOL fileBased)
+ BOOL fileBased)
{
BigBlockFile *This;
@@ -720,7 +668,6 @@ BigBlockFile *BIGBLOCKFILE_Construct(HANDLE hFile, ILockBytes* pLkByt, DWORD ope
This->fileBased = fileBased;
This->flProtect = BIGBLOCKFILE_GetProtectMode(openFlags);
- This->blocksize = blocksize;
This->maplist = NULL;
This->victimhead = NULL;
@@ -863,31 +810,19 @@ static HRESULT BIGBLOCKFILE_GetSize(BigBlockFile *This, ULARGE_INTEGER *size)
}
/******************************************************************************
- * BIGBLOCKFILE_EnsureExists
+ * BIGBLOCKFILE_Expand
*
- * Grows the file if necessary to make sure the block is valid.
+ * Grows the file to the specified size if necessary.
*/
-HRESULT BIGBLOCKFILE_EnsureExists(BigBlockFile *This, ULONG index)
+HRESULT BIGBLOCKFILE_Expand(BigBlockFile *This, ULARGE_INTEGER newSize)
{
ULARGE_INTEGER size;
HRESULT hr;
- /* Block index starts at -1 translate to zero based index */
- if (index == 0xffffffff)
- index = 0;
- else
- index++;
-
hr = BIGBLOCKFILE_GetSize(This, &size);
if(FAILED(hr)) return hr;
- /* make sure that the block physically exists */
- if ((This->blocksize * (index + 1)) > size.QuadPart)
- {
- ULARGE_INTEGER newSize;
-
- newSize.QuadPart = This->blocksize * (index + 1);
+ if (newSize.QuadPart > size.QuadPart)
hr = BIGBLOCKFILE_SetSize(This, newSize);
- }
return hr;
}
diff --git a/dll/win32/ole32/stg_prop.c b/dll/win32/ole32/stg_prop.c
index 52153a20d44..b3362bc21de 100644
--- a/dll/win32/ole32/stg_prop.c
+++ b/dll/win32/ole32/stg_prop.c
@@ -181,7 +181,9 @@ static HRESULT WINAPI IPropertyStorage_fnQueryInterface(
{
PropertyStorage_impl *This = (PropertyStorage_impl *)iface;
- if ( (This==0) || (ppvObject==0) )
+ TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppvObject);
+
+ if (!ppvObject)
return E_INVALIDARG;
*ppvObject = 0;
diff --git a/dll/win32/ole32/storage32.c b/dll/win32/ole32/storage32.c
index 837365bdb9d..f1706da72fb 100644
--- a/dll/win32/ole32/storage32.c
+++ b/dll/win32/ole32/storage32.c
@@ -269,14 +269,9 @@ static void IEnumSTATSTGImpl_Destroy(IEnumSTATSTGImpl* This);
** Block Functions
*/
-static ULONG BLOCK_GetBigBlockOffset(ULONG index)
+static ULONG StorageImpl_GetBigBlockOffset(StorageImpl* This, ULONG index)
{
- if (index == 0xffffffff)
- index = 0;
- else
- index ++;
-
- return index * BIG_BLOCK_SIZE;
+ return (index+1) * This->bigBlockSize;
}
/************************************************************************
@@ -1599,11 +1594,15 @@ static HRESULT WINAPI StorageBaseImpl_CopyTo(
SNB snbExclude, /* [unique][in] */
IStorage* pstgDest) /* [unique][in] */
{
+ StorageBaseImpl* const This=(StorageBaseImpl*)iface;
+
IEnumSTATSTG *elements = 0;
STATSTG curElement, strStat;
HRESULT hr;
IStorage *pstgTmp, *pstgChild;
IStream *pstrTmp, *pstrChild;
+ DirRef srcEntryRef;
+ DirEntry srcEntry;
BOOL skip = FALSE, skip_storage = FALSE, skip_stream = FALSE;
int i;
@@ -1728,11 +1727,25 @@ static HRESULT WINAPI StorageBaseImpl_CopyTo(
goto cleanup;
/*
- * open child stream storage
+ * open child stream storage. This operation must succeed even if the
+ * stream is already open, so we use internal functions to do it.
*/
- hr = IStorage_OpenStream( iface, curElement.pwcsName, NULL,
- STGM_READ|STGM_SHARE_EXCLUSIVE,
- 0, &pstrChild );
+ srcEntryRef = findElement( This, This->storageDirEntry, curElement.pwcsName,
+ &srcEntry);
+ if (!srcEntryRef)
+ {
+ ERR("source stream not found\n");
+ hr = STG_E_DOCFILECORRUPT;
+ }
+
+ if (hr == S_OK)
+ {
+ pstrChild = (IStream*)StgStreamImpl_Construct(This, STGM_READ|STGM_SHARE_EXCLUSIVE, srcEntryRef);
+ if (pstrChild)
+ IStream_AddRef(pstrChild);
+ else
+ hr = E_OUTOFMEMORY;
+ }
if (hr == S_OK)
{
@@ -2626,7 +2639,6 @@ static HRESULT StorageImpl_Construct(
This->bigBlockFile = BIGBLOCKFILE_Construct(hFile,
pLkbyt,
openFlags,
- This->bigBlockSize,
fileBased);
if (This->bigBlockFile == 0)
@@ -2638,7 +2650,7 @@ static HRESULT StorageImpl_Construct(
if (create)
{
ULARGE_INTEGER size;
- BYTE bigBlockBuffer[BIG_BLOCK_SIZE];
+ BYTE bigBlockBuffer[MAX_BIG_BLOCK_SIZE];
/*
* Initialize all header variables:
@@ -2835,13 +2847,14 @@ static ULONG StorageImpl_GetNextFreeBigBlock(
StorageImpl* This)
{
ULONG depotBlockIndexPos;
- BYTE depotBuffer[BIG_BLOCK_SIZE];
+ BYTE depotBuffer[MAX_BIG_BLOCK_SIZE];
BOOL success;
ULONG depotBlockOffset;
ULONG blocksPerDepot = This->bigBlockSize / sizeof(ULONG);
ULONG nextBlockIndex = BLOCK_SPECIAL;
int depotIndex = 0;
ULONG freeBlock = BLOCK_UNUSED;
+ ULARGE_INTEGER neededSize;
depotIndex = This->prevFreeBlock / blocksPerDepot;
depotBlockOffset = (This->prevFreeBlock % blocksPerDepot) * sizeof(ULONG);
@@ -2955,7 +2968,8 @@ static ULONG StorageImpl_GetNextFreeBigBlock(
/*
* make sure that the block physically exists before using it
*/
- BIGBLOCKFILE_EnsureExists(This->bigBlockFile, freeBlock);
+ neededSize.QuadPart = StorageImpl_GetBigBlockOffset(This, freeBlock)+This->bigBlockSize;
+ BIGBLOCKFILE_Expand(This->bigBlockFile, neededSize);
This->prevFreeBlock = freeBlock;
@@ -2970,7 +2984,7 @@ static ULONG StorageImpl_GetNextFreeBigBlock(
*/
static void Storage32Impl_AddBlockDepot(StorageImpl* This, ULONG blockIndex)
{
- BYTE blockBuffer[BIG_BLOCK_SIZE];
+ BYTE blockBuffer[MAX_BIG_BLOCK_SIZE];
/*
* Initialize blocks as free
@@ -3053,7 +3067,7 @@ static ULONG Storage32Impl_AddExtBlockDepot(StorageImpl* This)
{
ULONG numExtBlocks = This->extBigBlockDepotCount;
ULONG nextExtBlock = This->extBigBlockDepotStart;
- BYTE depotBuffer[BIG_BLOCK_SIZE];
+ BYTE depotBuffer[MAX_BIG_BLOCK_SIZE];
ULONG index = BLOCK_UNUSED;
ULONG nextBlockOffset = This->bigBlockSize - sizeof(ULONG);
ULONG blocksPerDepotBlock = This->bigBlockSize / sizeof(ULONG);
@@ -3143,10 +3157,10 @@ static HRESULT StorageImpl_GetNextBlockInChain(
ULONG offsetInDepot = blockIndex * sizeof (ULONG);
ULONG depotBlockCount = offsetInDepot / This->bigBlockSize;
ULONG depotBlockOffset = offsetInDepot % This->bigBlockSize;
- BYTE depotBuffer[BIG_BLOCK_SIZE];
+ BYTE depotBuffer[MAX_BIG_BLOCK_SIZE];
BOOL success;
ULONG depotBlockIndexPos;
- int index;
+ int index, num_blocks;
*nextBlockIndex = BLOCK_SPECIAL;
@@ -3181,7 +3195,9 @@ static HRESULT StorageImpl_GetNextBlockInChain(
if (!success)
return STG_E_READFAULT;
- for (index = 0; index < NUM_BLOCKS_PER_DEPOT_BLOCK; index++)
+ num_blocks = This->bigBlockSize / 4;
+
+ for (index = 0; index < num_blocks; index++)
{
StorageUtl_ReadDWord(depotBuffer, index*sizeof(ULONG), nextBlockIndex);
This->blockDepotCached[index] = *nextBlockIndex;
@@ -3272,26 +3288,31 @@ static void StorageImpl_SetNextBlockInChain(
/******************************************************************************
* Storage32Impl_LoadFileHeader
*
- * This method will read in the file header, i.e. big block index -1.
+ * This method will read in the file header
*/
static HRESULT StorageImpl_LoadFileHeader(
StorageImpl* This)
{
- HRESULT hr = STG_E_FILENOTFOUND;
- BYTE headerBigBlock[BIG_BLOCK_SIZE];
- BOOL success;
+ HRESULT hr;
+ BYTE headerBigBlock[HEADER_SIZE];
int index;
+ ULARGE_INTEGER offset;
+ DWORD bytes_read;
TRACE("\n");
/*
* Get a pointer to the big block of data containing the header.
*/
- success = StorageImpl_ReadBigBlock(This, -1, headerBigBlock);
+ offset.u.HighPart = 0;
+ offset.u.LowPart = 0;
+ hr = StorageImpl_ReadAt(This, offset, headerBigBlock, HEADER_SIZE, &bytes_read);
+ if (SUCCEEDED(hr) && bytes_read != HEADER_SIZE)
+ hr = STG_E_FILENOTFOUND;
/*
* Extract the information from the header.
*/
- if (success)
+ if (SUCCEEDED(hr))
{
/*
* Check for the "magic number" signature and return an error if it is not
@@ -3360,7 +3381,7 @@ static HRESULT StorageImpl_LoadFileHeader(
* Right now, the code is making some assumptions about the size of the
* blocks, just make sure they are what we're expecting.
*/
- if (This->bigBlockSize != DEF_BIG_BLOCK_SIZE ||
+ if ((This->bigBlockSize != MIN_BIG_BLOCK_SIZE && This->bigBlockSize != MAX_BIG_BLOCK_SIZE) ||
This->smallBlockSize != DEF_SMALL_BLOCK_SIZE)
{
WARN("Broken OLE storage file\n");
@@ -3376,29 +3397,35 @@ static HRESULT StorageImpl_LoadFileHeader(
/******************************************************************************
* Storage32Impl_SaveFileHeader
*
- * This method will save to the file the header, i.e. big block -1.
+ * This method will save to the file the header
*/
static void StorageImpl_SaveFileHeader(
StorageImpl* This)
{
- BYTE headerBigBlock[BIG_BLOCK_SIZE];
+ BYTE headerBigBlock[HEADER_SIZE];
int index;
- BOOL success;
+ HRESULT hr;
+ ULARGE_INTEGER offset;
+ DWORD bytes_read, bytes_written;
/*
* Get a pointer to the big block of data containing the header.
*/
- success = StorageImpl_ReadBigBlock(This, -1, headerBigBlock);
+ offset.u.HighPart = 0;
+ offset.u.LowPart = 0;
+ hr = StorageImpl_ReadAt(This, offset, headerBigBlock, HEADER_SIZE, &bytes_read);
+ if (SUCCEEDED(hr) && bytes_read != HEADER_SIZE)
+ hr = STG_E_FILENOTFOUND;
/*
* If the block read failed, the file is probably new.
*/
- if (!success)
+ if (FAILED(hr))
{
/*
* Initialize for all unknown fields.
*/
- memset(headerBigBlock, 0, BIG_BLOCK_SIZE);
+ memset(headerBigBlock, 0, HEADER_SIZE);
/*
* Initialize the magic number.
@@ -3469,7 +3496,7 @@ static void StorageImpl_SaveFileHeader(
/*
* Write the big block back to the file.
*/
- StorageImpl_WriteBigBlock(This, -1, headerBigBlock);
+ StorageImpl_WriteAt(This, offset, headerBigBlock, HEADER_SIZE, &bytes_written);
}
/******************************************************************************
@@ -3711,7 +3738,7 @@ static BOOL StorageImpl_ReadBigBlock(
DWORD read;
ulOffset.u.HighPart = 0;
- ulOffset.u.LowPart = BLOCK_GetBigBlockOffset(blockIndex);
+ ulOffset.u.LowPart = StorageImpl_GetBigBlockOffset(This, blockIndex);
StorageImpl_ReadAt(This, ulOffset, buffer, This->bigBlockSize, &read);
return (read == This->bigBlockSize);
@@ -3728,7 +3755,7 @@ static BOOL StorageImpl_ReadDWordFromBigBlock(
DWORD tmp;
ulOffset.u.HighPart = 0;
- ulOffset.u.LowPart = BLOCK_GetBigBlockOffset(blockIndex);
+ ulOffset.u.LowPart = StorageImpl_GetBigBlockOffset(This, blockIndex);
ulOffset.u.LowPart += offset;
StorageImpl_ReadAt(This, ulOffset, &tmp, sizeof(DWORD), &read);
@@ -3745,7 +3772,7 @@ static BOOL StorageImpl_WriteBigBlock(
DWORD wrote;
ulOffset.u.HighPart = 0;
- ulOffset.u.LowPart = BLOCK_GetBigBlockOffset(blockIndex);
+ ulOffset.u.LowPart = StorageImpl_GetBigBlockOffset(This, blockIndex);
StorageImpl_WriteAt(This, ulOffset, buffer, This->bigBlockSize, &wrote);
return (wrote == This->bigBlockSize);
@@ -3761,7 +3788,7 @@ static BOOL StorageImpl_WriteDWordToBigBlock(
DWORD wrote;
ulOffset.u.HighPart = 0;
- ulOffset.u.LowPart = BLOCK_GetBigBlockOffset(blockIndex);
+ ulOffset.u.LowPart = StorageImpl_GetBigBlockOffset(This, blockIndex);
ulOffset.u.LowPart += offset;
value = htole32(value);
@@ -5151,7 +5178,7 @@ HRESULT BlockChainStream_ReadAt(BlockChainStream* This,
TRACE("block %i\n",blockIndex);
ulOffset.u.HighPart = 0;
- ulOffset.u.LowPart = BLOCK_GetBigBlockOffset(blockIndex) +
+ ulOffset.u.LowPart = StorageImpl_GetBigBlockOffset(This->parentStorage, blockIndex) +
offsetInBlock;
StorageImpl_ReadAt(This->parentStorage,
@@ -5247,7 +5274,7 @@ HRESULT BlockChainStream_WriteAt(BlockChainStream* This,
TRACE("block %i\n",blockIndex);
ulOffset.u.HighPart = 0;
- ulOffset.u.LowPart = BLOCK_GetBigBlockOffset(blockIndex) +
+ ulOffset.u.LowPart = StorageImpl_GetBigBlockOffset(This->parentStorage, blockIndex) +
offsetInBlock;
StorageImpl_WriteAt(This->parentStorage,
@@ -5721,7 +5748,7 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock(
ULONG sbdIndex = This->parentStorage->smallBlockDepotStart;
ULONG nextBlock, newsbdIndex;
- BYTE smallBlockDepot[BIG_BLOCK_SIZE];
+ BYTE smallBlockDepot[MAX_BIG_BLOCK_SIZE];
nextBlock = sbdIndex;
while (nextBlock != BLOCK_END_OF_CHAIN)
diff --git a/dll/win32/ole32/storage32.h b/dll/win32/ole32/storage32.h
index 03328b29708..fad5d7766f7 100644
--- a/dll/win32/ole32/storage32.h
+++ b/dll/win32/ole32/storage32.h
@@ -79,6 +79,11 @@ static const ULONG DIRENTRY_NULL = 0xFFFFFFFF;
#define RAW_DIRENTRY_SIZE 0x00000080
+#define HEADER_SIZE 512
+
+#define MIN_BIG_BLOCK_SIZE 0x200
+#define MAX_BIG_BLOCK_SIZE 0x1000
+
/*
* Type of child entry link
*/
@@ -91,15 +96,8 @@ static const ULONG DIRENTRY_NULL = 0xFFFFFFFF;
*/
#define STGTY_ROOT 0x05
-/*
- * These defines assume a hardcoded blocksize. The code will assert
- * if the blocksize is different. Some changes will have to be done if it
- * becomes the case.
- */
-#define BIG_BLOCK_SIZE 0x200
#define COUNT_BBDEPOTINHEADER 109
#define LIMIT_TO_USE_SMALL_BLOCK 0x1000
-#define NUM_BLOCKS_PER_DEPOT_BLOCK 128
#define STGM_ACCESS_MODE(stgm) ((stgm)&0x0000f)
#define STGM_SHARE_MODE(stgm) ((stgm)&0x000f0)
@@ -163,10 +161,9 @@ typedef struct BigBlockFile BigBlockFile,*LPBIGBLOCKFILE;
BigBlockFile* BIGBLOCKFILE_Construct(HANDLE hFile,
ILockBytes* pLkByt,
DWORD openFlags,
- ULONG blocksize,
BOOL fileBased);
void BIGBLOCKFILE_Destructor(LPBIGBLOCKFILE This);
-HRESULT BIGBLOCKFILE_EnsureExists(LPBIGBLOCKFILE This, ULONG index);
+HRESULT BIGBLOCKFILE_Expand(LPBIGBLOCKFILE This, ULARGE_INTEGER newSize);
HRESULT BIGBLOCKFILE_SetSize(LPBIGBLOCKFILE This, ULARGE_INTEGER newSize);
HRESULT BIGBLOCKFILE_ReadAt(LPBIGBLOCKFILE This, ULARGE_INTEGER offset,
void* buffer, ULONG size, ULONG* bytesRead);
@@ -359,7 +356,7 @@ struct StorageImpl
ULONG extBigBlockDepotCount;
ULONG bigBlockDepotStart[COUNT_BBDEPOTINHEADER];
- ULONG blockDepotCached[NUM_BLOCKS_PER_DEPOT_BLOCK];
+ ULONG blockDepotCached[MAX_BIG_BLOCK_SIZE / 4];
ULONG indexBlockDepotCached;
ULONG prevFreeBlock;
diff --git a/dll/win32/oleaut32/typelib.c b/dll/win32/oleaut32/typelib.c
index 445eac5c51e..b09f7ab64d1 100644
--- a/dll/win32/oleaut32/typelib.c
+++ b/dll/win32/oleaut32/typelib.c
@@ -4722,6 +4722,7 @@ static HRESULT WINAPI ITypeLibComp_fnBind(
{
ITypeLibImpl *This = impl_from_ITypeComp(iface);
ITypeInfoImpl *pTypeInfo;
+ int typemismatch=0;
TRACE("(%s, 0x%x, 0x%x, %p, %p, %p)\n", debugstr_w(szName), lHash, wFlags, ppTInfo, pDescKind, pBindPtr);
@@ -4761,6 +4762,8 @@ static HRESULT WINAPI ITypeLibComp_fnBind(
TRACE("found in module or in enum: %s\n", debugstr_w(szName));
return S_OK;
}
+ else if (hr == TYPE_E_TYPEMISMATCH)
+ typemismatch = 1;
}
if ((pTypeInfo->TypeAttr.typekind == TKIND_COCLASS) &&
@@ -4833,11 +4836,21 @@ static HRESULT WINAPI ITypeLibComp_fnBind(
ITypeInfo_AddRef(*ppTInfo);
return S_OK;
}
+ else if (hr == TYPE_E_TYPEMISMATCH)
+ typemismatch = 1;
}
}
- TRACE("name not found %s\n", debugstr_w(szName));
- return S_OK;
+ if (typemismatch)
+ {
+ TRACE("type mismatch %s\n", debugstr_w(szName));
+ return TYPE_E_TYPEMISMATCH;
+ }
+ else
+ {
+ TRACE("name not found %s\n", debugstr_w(szName));
+ return S_OK;
+ }
}
static HRESULT WINAPI ITypeLibComp_fnBindType(
@@ -5568,6 +5581,11 @@ static HRESULT WINAPI ITypeInfo_fnGetImplTypeFlags( ITypeInfo2 *iface,
return S_OK;
}
*pImplTypeFlags=0;
+
+ if(This->TypeAttr.typekind==TKIND_DISPATCH && !index)
+ return S_OK;
+
+ WARN("ImplType %d not found\n", index);
return TYPE_E_ELEMENTNOTFOUND;
}
@@ -6052,9 +6070,6 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
hres = DISP_E_PARAMNOTFOUND;
goto func_fail;
}
- /* ignore the DISPID_PROPERTYPUT named argument from now on */
- cNamedArgs--;
- rgdispidNamedArgs++;
}
if (func_desc->cParamsOpt < 0 && cNamedArgs)
@@ -6092,7 +6107,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
USHORT j;
src_arg = NULL;
for (j = 0; j < cNamedArgs; j++)
- if (rgdispidNamedArgs[j] == i)
+ if (rgdispidNamedArgs[j] == i || (i == func_desc->cParams-1 && rgdispidNamedArgs[j] == DISPID_PROPERTYPUT))
{
src_arg = &pDispParams->rgvarg[j];
break;
@@ -6859,7 +6874,8 @@ static HRESULT WINAPI ITypeInfo_fnGetMops( ITypeInfo2 *iface, MEMBERID memid,
BSTR *pBstrMops)
{
ITypeInfoImpl *This = (ITypeInfoImpl *)iface;
- FIXME("(%p) stub!\n", This);
+ FIXME("(%p %d) stub!\n", This, memid);
+ *pBstrMops = NULL;
return S_OK;
}
diff --git a/dll/win32/oleaut32/typelib2.c b/dll/win32/oleaut32/typelib2.c
index 4544317a512..6b1aea062ba 100644
--- a/dll/win32/oleaut32/typelib2.c
+++ b/dll/win32/oleaut32/typelib2.c
@@ -199,9 +199,11 @@ typedef struct tagICreateTypeInfo2Impl
struct tagCyclicList *typedata; /* tail of cyclic list */
+ TYPEKIND typekind;
int datawidth;
struct tagICreateTypeInfo2Impl *next_typeinfo;
+ struct tagICreateTypeInfo2Impl *dual;
} ICreateTypeInfo2Impl;
static inline ICreateTypeInfo2Impl *impl_from_ITypeInfo2( ITypeInfo2 *iface )
@@ -1177,6 +1179,7 @@ static HRESULT ctl2_add_default_value(
{
VARIANT v;
HRESULT hres;
+ int mask = 0;
TRACE("%p %d %d\n", This, V_VT(value), arg_type);
@@ -1194,7 +1197,6 @@ static HRESULT ctl2_add_default_value(
/* Check if default value can be stored in encoded_value */
switch(arg_type) {
- int mask = 0;
case VT_I4:
case VT_UI4:
mask = 0x3ffffff;
@@ -1313,7 +1315,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnQueryInterface(
if(*ppvObject)
{
- ICreateTypeLib2_AddRef(iface);
+ ICreateTypeInfo2_AddRef(iface);
TRACE("-- Interface: (%p)->(%p)\n",ppvObject,*ppvObject);
return S_OK;
}
@@ -1333,6 +1335,9 @@ static ULONG WINAPI ICreateTypeInfo2_fnAddRef(ICreateTypeInfo2 *iface)
TRACE("(%p)->ref was %u\n",This, ref - 1);
+ if(ref==1 && This->typelib)
+ ICreateTypeLib2_AddRef((ICreateTypeLib2 *)This->typelib);
+
return ref;
}
@@ -1406,43 +1411,63 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetTypeFlags(ICreateTypeInfo2 *iface, U
TRACE("(%p,0x%x)\n", iface, uTypeFlags);
- This->typeinfo->flags = uTypeFlags;
+ if(uTypeFlags & TYPEFLAG_FDUAL) {
+ This->typeinfo->typekind |= 0x10;
+ This->typeinfo->typekind &= ~0x0f;
+ This->typeinfo->typekind |= TKIND_DISPATCH;
- if (uTypeFlags & TYPEFLAG_FDISPATCHABLE) {
- MSFT_GuidEntry foo;
- int guidoffset;
- int fileoffset;
- MSFT_ImpInfo impinfo;
- static const WCHAR stdole2tlb[] = { 's','t','d','o','l','e','2','.','t','l','b',0 };
+ if(!This->dual) {
+ This->dual = HeapAlloc(GetProcessHeap(), 0, sizeof(ICreateTypeInfo2Impl));
+ if(!This->dual)
+ return E_OUTOFMEMORY;
- foo.guid = IID_StdOle;
- foo.hreftype = 2;
- foo.next_hash = -1;
- guidoffset = ctl2_alloc_guid(This->typelib, &foo);
- if (guidoffset == -1) return E_OUTOFMEMORY;
+ memcpy(This->dual, This, sizeof(ICreateTypeInfo2Impl));
+ This->dual->ref = 0;
+ This->dual->typekind = This->typekind==TKIND_DISPATCH ?
+ TKIND_INTERFACE : TKIND_DISPATCH;
+ This->dual->dual = This;
+ }
- fileoffset = ctl2_alloc_importfile(This->typelib, guidoffset,
- This->typelib->typelib_header.lcid2, 2, 0, stdole2tlb);
- if (fileoffset == -1) return E_OUTOFMEMORY;
+ /* Make sure dispatch is in typeinfos queue */
+ if(This->typekind != TKIND_DISPATCH) {
+ if(This->typelib->last_typeinfo == This)
+ This->typelib->last_typeinfo = This->dual;
- foo.guid = IID_IDispatch;
- foo.hreftype = 1;
- foo.next_hash = -1;
- guidoffset = ctl2_alloc_guid(This->typelib, &foo);
- if (guidoffset == -1) return E_OUTOFMEMORY;
+ if(This->typelib->typeinfos == This)
+ This->typelib->typeinfos = This->dual;
+ else {
+ ICreateTypeInfo2Impl *iter;
- impinfo.flags = TKIND_INTERFACE << 24 | MSFT_IMPINFO_OFFSET_IS_GUID;
- impinfo.oImpFile = fileoffset;
- impinfo.oGuid = guidoffset;
- ctl2_alloc_importinfo(This->typelib, &impinfo);
-
- This->typelib->typelib_header.dispatchpos = 1;
-
- This->typeinfo->typekind |= 0x10;
- This->typeinfo->typekind &= ~0x0f;
- This->typeinfo->typekind |= TKIND_DISPATCH;
+ for(iter=This->typelib->typeinfos; iter->next_typeinfo!=This; iter=iter->next_typeinfo);
+ iter->next_typeinfo = This->dual;
+ }
+ } else
+ iface = (ICreateTypeInfo2*)&This->dual->lpVtbl;
}
+ if (uTypeFlags & (TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FDUAL)) {
+ static const WCHAR stdole2tlb[] = { 's','t','d','o','l','e','2','.','t','l','b',0 };
+ ITypeLib *stdole;
+ ITypeInfo *dispatch;
+ HREFTYPE hreftype;
+ HRESULT hres;
+
+ hres = LoadTypeLib(stdole2tlb, &stdole);
+ if(FAILED(hres))
+ return hres;
+
+ hres = ITypeLib_GetTypeInfoOfGuid(stdole, &IID_IDispatch, &dispatch);
+ ITypeLib_Release(stdole);
+ if(FAILED(hres))
+ return hres;
+
+ hres = ICreateTypeInfo2_AddRefTypeInfo(iface, dispatch, &hreftype);
+ ITypeInfo_Release(dispatch);
+ if(FAILED(hres))
+ return hres;
+ }
+
+ This->typeinfo->flags = uTypeFlags;
return S_OK;
}
@@ -1541,25 +1566,21 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddRefTypeInfo(
/* Process locally defined TypeInfo */
*phRefType = This->typelib->typelib_typeinfo_offsets[index];
} else {
- static const WCHAR regkey[] = {'T','y','p','e','L','i','b','\\','{',
- '%','0','8','x','-','%','0','4','x','-','%','0','4','x','-','%',
- '0','2','x','%','0','2','x','-','%','0','2','x','%','0','2','x',
- '%','0','2','x','%','0','2','x','%','0','2','x','%','0','2','x',
- '}','\\','%','d','.','%','d','\\','0','\\','w','i','n','3','2',0};
-
- WCHAR name[MAX_PATH], *p;
+ BSTR name;
TLIBATTR *tlibattr;
TYPEATTR *typeattr;
+ TYPEKIND typekind;
MSFT_GuidEntry guid, *check_guid;
MSFT_ImpInfo impinfo;
int guid_offset, import_offset;
- DWORD len;
HRESULT hres;
/* Allocate container GUID */
hres = ITypeLib_GetLibAttr(container, &tlibattr);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ ITypeLib_Release(container);
return hres;
+ }
guid.guid = tlibattr->guid;
guid.hreftype = This->typelib->typelib_guids*12+2;
@@ -1568,6 +1589,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddRefTypeInfo(
guid_offset = ctl2_alloc_guid(This->typelib, &guid);
if(guid_offset == -1) {
ITypeLib_ReleaseTLibAttr(container, tlibattr);
+ ITypeLib_Release(container);
return E_OUTOFMEMORY;
}
@@ -1576,50 +1598,50 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddRefTypeInfo(
This->typelib->typelib_guids++;
/* Get import file name */
- /* Check HKEY_CLASSES_ROOT\TypeLib\{GUID}\{Ver}\0\win32 */
- len = MAX_PATH;
- sprintfW(name, regkey, guid.guid.Data1, guid.guid.Data2,
- guid.guid.Data3, guid.guid.Data4[0], guid.guid.Data4[1],
- guid.guid.Data4[2], guid.guid.Data4[3], guid.guid.Data4[4],
- guid.guid.Data4[5], guid.guid.Data4[6], guid.guid.Data4[7],
- tlibattr->wMajorVerNum, tlibattr->wMinorVerNum);
-
- if(RegGetValueW(HKEY_CLASSES_ROOT, name, NULL, RRF_RT_REG_SZ, NULL, name, &len)!=ERROR_SUCCESS
- || (p=strrchrW(name, '\\'))==NULL) {
- ERR("Error guessing typelib filename\n");
+ hres = QueryPathOfRegTypeLib(&guid.guid, tlibattr->wMajorVerNum,
+ tlibattr->wMinorVerNum, tlibattr->lcid, &name);
+ if(FAILED(hres)) {
ITypeLib_ReleaseTLibAttr(container, tlibattr);
- return E_NOTIMPL;
+ ITypeLib_Release(container);
+ return hres;
}
- memmove(name, p+1, strlenW(p)*sizeof(WCHAR));
/* Import file */
- import_offset = ctl2_alloc_importfile(This->typelib, guid_offset,
- tlibattr->lcid, tlibattr->wMajorVerNum, tlibattr->wMinorVerNum, name);
+ import_offset = ctl2_alloc_importfile(This->typelib, guid_offset, tlibattr->lcid,
+ tlibattr->wMajorVerNum, tlibattr->wMinorVerNum, strrchrW(name, '\\')+1);
ITypeLib_ReleaseTLibAttr(container, tlibattr);
+ SysFreeString(name);
- if(import_offset == -1)
+ if(import_offset == -1) {
+ ITypeLib_Release(container);
return E_OUTOFMEMORY;
+ }
/* Allocate referenced guid */
hres = ITypeInfo_GetTypeAttr(pTInfo, &typeattr);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ ITypeLib_Release(container);
return hres;
+ }
guid.guid = typeattr->guid;
guid.hreftype = This->typelib->typeinfo_guids*12+1;
guid.next_hash = -1;
+ typekind = typeattr->typekind;
ITypeInfo_ReleaseTypeAttr(pTInfo, typeattr);
guid_offset = ctl2_alloc_guid(This->typelib, &guid);
- if(guid_offset == -1)
+ if(guid_offset == -1) {
+ ITypeLib_Release(container);
return E_OUTOFMEMORY;
+ }
check_guid = (MSFT_GuidEntry*)&This->typelib->typelib_segment_data[MSFT_SEG_GUID][guid_offset];
if(check_guid->hreftype == guid.hreftype)
This->typelib->typeinfo_guids++;
/* Allocate importinfo */
- impinfo.flags = ((This->typeinfo->typekind&0xf)<<24) | MSFT_IMPINFO_OFFSET_IS_GUID;
+ impinfo.flags = (typekind<<24) | MSFT_IMPINFO_OFFSET_IS_GUID;
impinfo.oImpFile = import_offset;
impinfo.oGuid = guid_offset;
*phRefType = ctl2_alloc_importinfo(This->typelib, &impinfo)+1;
@@ -1652,7 +1674,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc(
TRACE("(%p,%d,%p)\n", iface, index, pFuncDesc);
- if(!pFuncDesc || (pFuncDesc->memid>0x7fffffff && pFuncDesc->memid!=MEMBERID_NIL))
+ if(!pFuncDesc || pFuncDesc->oVft&3)
return E_INVALIDARG;
TRACE("{%d,%p,%p,%d,%d,%d,%d,%d,%d,%d,{%d},%d}\n", pFuncDesc->memid,
@@ -1661,7 +1683,10 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc(
pFuncDesc->cParamsOpt, pFuncDesc->oVft, pFuncDesc->cScodes,
pFuncDesc->elemdescFunc.tdesc.vt, pFuncDesc->wFuncFlags);
- switch(This->typeinfo->typekind&0xf) {
+ if(pFuncDesc->cParamsOpt || pFuncDesc->cScodes)
+ FIXME("Unimplemented parameter - created typelib will be incorrect\n");
+
+ switch(This->typekind) {
case TKIND_MODULE:
if(pFuncDesc->funckind != FUNC_STATIC)
return TYPE_E_BADMODULEKIND;
@@ -1688,12 +1713,15 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc(
num_defaults++;
if (!This->typedata) {
- This->typedata = HeapAlloc(GetProcessHeap(), 0, sizeof(CyclicList));
+ This->typedata = HeapAlloc(GetProcessHeap(), 0, sizeof(CyclicList));
if(!This->typedata)
return E_OUTOFMEMORY;
This->typedata->next = This->typedata;
- This->typedata->u.val = 0;
+ This->typedata->u.val = 0;
+
+ if(This->dual)
+ This->dual->typedata = This->typedata;
}
/* allocate type data space for us */
@@ -1711,7 +1739,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc(
typedata[0] = 0x18 + pFuncDesc->cParams*(num_defaults?16:12);
ctl2_encode_typedesc(This->typelib, &pFuncDesc->elemdescFunc.tdesc, &typedata[1], NULL, NULL, &decoded_size);
typedata[2] = pFuncDesc->wFuncFlags;
- typedata[3] = ((sizeof(FUNCDESC) + decoded_size) << 16) | This->typeinfo->cbSizeVft;
+ typedata[3] = ((sizeof(FUNCDESC) + decoded_size) << 16) | (unsigned short)(pFuncDesc->oVft?pFuncDesc->oVft+1:0);
typedata[4] = (pFuncDesc->callconv << 8) | (pFuncDesc->invkind << 3) | pFuncDesc->funckind;
if(num_defaults) typedata[4] |= 0x1000;
typedata[5] = pFuncDesc->cParams;
@@ -1758,6 +1786,9 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc(
insert->next = This->typedata->next;
This->typedata->next = insert;
This->typedata = insert;
+
+ if(This->dual)
+ This->dual->typedata = This->typedata;
} else {
iter = This->typedata->next;
for(i=0; itypeinfo->typekind & 15) == TKIND_COCLASS) {
+ if (This->typekind == TKIND_COCLASS) {
int offset;
MSFT_RefRecord *ref;
@@ -1822,21 +1853,26 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddImplType(
ref->flags = 0;
ref->oCustData = -1;
ref->onext = -1;
- } else if ((This->typeinfo->typekind & 15) == TKIND_DISPATCH) {
- FIXME("dispatch case unhandled.\n");
- } else if ((This->typeinfo->typekind & 15) == TKIND_INTERFACE) {
+ This->typeinfo->cImplTypes++;
+ } else if (This->typekind == TKIND_INTERFACE) {
if (This->typeinfo->cImplTypes && index==1)
return TYPE_E_BADMODULEKIND;
if( index != 0) return TYPE_E_ELEMENTNOTFOUND;
This->typeinfo->datatype1 = hRefType;
+ This->typeinfo->cImplTypes = 1;
+ } else if (This->typekind == TKIND_DISPATCH) {
+ if(index != 0) return TYPE_E_ELEMENTNOTFOUND;
+
+ /* FIXME: Check if referenced typeinfo is IDispatch */
+ This->typeinfo->flags |= TYPEFLAG_FDISPATCHABLE;
+ This->typeinfo->cImplTypes = 1;
} else {
- FIXME("AddImplType unsupported on typekind %d\n", This->typeinfo->typekind & 15);
+ FIXME("AddImplType unsupported on typekind %d\n", This->typekind);
return E_OUTOFMEMORY;
}
- This->typeinfo->cImplTypes++;
return S_OK;
}
@@ -1856,7 +1892,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetImplTypeFlags(
TRACE("(%p,%d,0x%x)\n", iface, index, implTypeFlags);
- if ((This->typeinfo->typekind & 15) != TKIND_COCLASS) {
+ if (This->typekind != TKIND_COCLASS) {
return TYPE_E_BADMODULEKIND;
}
@@ -1889,7 +1925,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetAlignment(
This->typeinfo->typekind |= cbAlignment << 6;
/* FIXME: There's probably some way to simplify this. */
- switch (This->typeinfo->typekind & 15) {
+ switch (This->typekind) {
case TKIND_ALIAS:
default:
break;
@@ -1963,6 +1999,9 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(
This->typedata->next = This->typedata;
This->typedata->u.val = 0;
+
+ if(This->dual)
+ This->dual->typedata = This->typedata;
}
/* allocate type data space for us */
@@ -1979,6 +2018,9 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(
This->typedata->next = insert;
This->typedata = insert;
+ if(This->dual)
+ This->dual->typedata = This->typedata;
+
This->typedata->next->u.val += 0x14;
typedata = This->typedata->u.data;
@@ -2003,6 +2045,8 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(
/* add the new variable to the total data width */
This->datawidth += var_datawidth;
+ if(This->dual)
+ This->dual->datawidth = This->datawidth;
/* add type description size to total required allocation */
typedata[3] += var_type_size << 16;
@@ -2125,7 +2169,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetVarName(
*((INT *)namedata) = This->typelib->typelib_typeinfo_offsets[This->typeinfo->typekind >> 16];
namedata[9] |= 0x10;
}
- if ((This->typeinfo->typekind & 15) == TKIND_ENUM) {
+ if (This->typekind == TKIND_ENUM) {
namedata[9] |= 0x20;
}
@@ -2151,7 +2195,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetTypeDescAlias(
int encoded_typedesc;
int width;
- if ((This->typeinfo->typekind & 15) != TKIND_ALIAS) {
+ if (This->typekind != TKIND_ALIAS) {
return TYPE_E_WRONGTYPEKIND;
}
@@ -2225,8 +2269,42 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncHelpContext(
UINT index,
DWORD dwHelpContext)
{
- FIXME("(%p,%d,%d), stub!\n", iface, index, dwHelpContext);
- return E_OUTOFMEMORY;
+ ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface;
+ CyclicList *func;
+ int *typedata;
+ int size;
+
+ TRACE("(%p,%d,%d)\n", iface, index, dwHelpContext);
+
+ if(This->typeinfo->cElementtypeinfo->cElement == index)
+ func = This->typedata;
+ else
+ for(func=This->typedata->next->next; func!=This->typedata; func=func->next)
+ if(index-- == 0)
+ break;
+
+ typedata = func->u.data;
+
+ /* Compute func size without arguments */
+ size = typedata[0] - typedata[5]*(typedata[4]&0x1000?16:12);
+
+ /* Allocate memory for HelpContext if needed */
+ if(size < 7*sizeof(int)) {
+ typedata = HeapReAlloc(GetProcessHeap(), 0, typedata, typedata[0]+sizeof(int));
+ if(!typedata)
+ return E_OUTOFMEMORY;
+
+ memmove(&typedata[7], &typedata[6], typedata[0]-sizeof(int)*6);
+ typedata[0] += sizeof(int);
+ This->typedata->next->u.val += sizeof(int);
+ func->u.data = typedata;
+ }
+
+ typedata[6] = dwHelpContext;
+ return S_OK;
}
/******************************************************************************
@@ -2282,11 +2360,13 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(
CyclicList *iter, *iter2, **typedata;
HREFTYPE hreftype;
HRESULT hres;
+ unsigned user_vft = 0;
int i;
TRACE("(%p)\n", iface);
- if((This->typeinfo->typekind&0xf) == TKIND_COCLASS)
+ /* FIXME: LayOut should be run on all ImplTypes */
+ if(This->typekind == TKIND_COCLASS)
return S_OK;
/* Validate inheritance */
@@ -2317,15 +2397,17 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(
return hres;
hres = ITypeInfo_GetRefTypeInfo(next, hreftype, &cur);
+ ITypeInfo_Release(next);
if(FAILED(hres))
return hres;
- ITypeInfo_Release(next);
while(1) {
hres = ITypeInfo_GetTypeAttr(cur, &typeattr);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ ITypeInfo_Release(cur);
return hres;
+ }
if(!memcmp(&typeattr->guid, &IID_IDispatch, sizeof(IDispatch)))
This->typeinfo->flags |= TYPEFLAG_FDISPATCHABLE;
@@ -2336,19 +2418,51 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(
hres = ITypeInfo_GetRefTypeOfImplType(cur, 0, &hreftype);
if(hres == TYPE_E_ELEMENTNOTFOUND)
break;
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ ITypeInfo_Release(cur);
return hres;
+ }
hres = ITypeInfo_GetRefTypeInfo(cur, hreftype, &next);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ ITypeInfo_Release(cur);
return hres;
+ }
ITypeInfo_Release(cur);
cur = next;
}
+ ITypeInfo_Release(cur);
}
- This->typeinfo->cbSizeVft = (This->typeinfo->datatype2>>16) * 4;
+ /* Get cbSizeVft of inherited interface */
+ /* Makes LayOut running recursively */
+ if(This->typeinfo->datatype1 != -1) {
+ ITypeInfo *cur, *inherited;
+ TYPEATTR *typeattr;
+
+ hres = ICreateTypeInfo_QueryInterface(iface, &IID_ITypeInfo, (void**)&cur);
+ if(FAILED(hres))
+ return hres;
+
+ hres = ITypeInfo_GetRefTypeInfo(cur, This->typeinfo->datatype1, &inherited);
+ ITypeInfo_Release(cur);
+ if(FAILED(hres))
+ return hres;
+
+ hres = ITypeInfo_GetTypeAttr(inherited, &typeattr);
+ if(FAILED(hres)) {
+ ITypeInfo_Release(inherited);
+ return hres;
+ }
+
+ This->typeinfo->cbSizeVft = typeattr->cbSizeVft;
+
+ ITypeInfo_ReleaseTypeAttr(inherited, typeattr);
+ ITypeInfo_Release(inherited);
+ } else
+ This->typeinfo->cbSizeVft = 0;
+
if(!This->typedata)
return S_OK;
@@ -2358,6 +2472,9 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(
/* Assign IDs and VTBL entries */
i = 0;
+ if(This->typedata->u.data[3]&1)
+ user_vft = This->typedata->u.data[3]&0xffff;
+
for(iter=This->typedata->next->next; iter!=This->typedata->next; iter=iter->next) {
/* Assign MEMBERID if MEMBERID_NIL was specified */
if(iter->indice == MEMBERID_NIL) {
@@ -2370,8 +2487,10 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(
for(iter2=This->typedata->next->next; iter2!=This->typedata->next; iter2=iter2->next) {
if(iter == iter2) continue;
- if(iter2->indice == iter->indice)
+ if(iter2->indice == iter->indice) {
+ HeapFree(GetProcessHeap(), 0, typedata);
return E_ACCESSDENIED;
+ }
}
break;
@@ -2383,7 +2502,20 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(
iter->u.data[0] = (iter->u.data[0]&0xffff) | (i<<16);
- if((This->typeinfo->typekind&0xf) != TKIND_MODULE) {
+ if((iter->u.data[3]&1) != (user_vft&1)) {
+ HeapFree(GetProcessHeap(), 0, typedata);
+ return TYPE_E_INVALIDID;
+ }
+
+ if(user_vft&1) {
+ if(user_vft < (iter->u.data[3]&0xffff))
+ user_vft = (iter->u.data[3]&0xffff);
+
+ if((iter->u.data[3]&0xffff) < This->typeinfo->cbSizeVft) {
+ HeapFree(GetProcessHeap(), 0, typedata);
+ return TYPE_E_INVALIDID;
+ }
+ } else if(This->typekind != TKIND_MODULE) {
iter->u.data[3] = (iter->u.data[3]&0xffff0000) | This->typeinfo->cbSizeVft;
This->typeinfo->cbSizeVft += 4;
}
@@ -2406,6 +2538,9 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(
i++;
}
+ if(user_vft)
+ This->typeinfo->cbSizeVft = user_vft+3;
+
for(i=0; i<(This->typeinfo->cElement&0xffff); i++) {
if(typedata[i]->u.data[4]>>16 > i) {
int inv;
@@ -2787,11 +2922,13 @@ static HRESULT WINAPI ITypeInfo2_fnGetTypeAttr(
(*ppTypeAttr)->lcid = This->typelib->typelib_header.lcid;
(*ppTypeAttr)->cbSizeInstance = This->typeinfo->size;
- (*ppTypeAttr)->typekind = This->typeinfo->typekind&0xf;
+ (*ppTypeAttr)->typekind = This->typekind;
(*ppTypeAttr)->cFuncs = This->typeinfo->cElement&0xffff;
+ if(This->typeinfo->flags&TYPEFLAG_FDUAL && This->typekind==TKIND_DISPATCH)
+ (*ppTypeAttr)->cFuncs += 7;
(*ppTypeAttr)->cVars = This->typeinfo->cElement>>16;
(*ppTypeAttr)->cImplTypes = This->typeinfo->cImplTypes;
- (*ppTypeAttr)->cbSizeVft = This->typeinfo->cbSizeVft;
+ (*ppTypeAttr)->cbSizeVft = This->typekind==TKIND_DISPATCH ? 28 : This->typeinfo->cbSizeVft;
(*ppTypeAttr)->cbAlignment = (This->typeinfo->typekind>>11) & 0x1f;
(*ppTypeAttr)->wTypeFlags = This->typeinfo->flags;
(*ppTypeAttr)->wMajorVerNum = This->typeinfo->version&0xffff;
@@ -2879,15 +3016,21 @@ static HRESULT WINAPI ITypeInfo2_fnGetRefTypeOfImplType(
if(!pRefType)
return E_INVALIDARG;
- if(index == -1) {
- FIXME("Dual interfaces not handled yet\n");
- return E_NOTIMPL;
+ if(This->typeinfo->flags&TYPEFLAG_FDUAL) {
+ if(index == -1) {
+ *pRefType = -2;
+ return S_OK;
+ }
+
+ if(This->typekind == TKIND_DISPATCH)
+ return ITypeInfo2_GetRefTypeOfImplType((ITypeInfo2*)&This->dual->lpVtblTypeInfo2,
+ index, pRefType);
}
- if(index >= This->typeinfo->cImplTypes)
+ if(index>=This->typeinfo->cImplTypes)
return TYPE_E_ELEMENTNOTFOUND;
- if((This->typeinfo->typekind&0xf) == TKIND_INTERFACE) {
+ if(This->typekind == TKIND_INTERFACE) {
*pRefType = This->typeinfo->datatype1 + 2;
return S_OK;
}
@@ -2923,7 +3066,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetImplTypeFlags(
if(index >= This->typeinfo->cImplTypes)
return TYPE_E_ELEMENTNOTFOUND;
- if((This->typeinfo->typekind&0xf) != TKIND_COCLASS) {
+ if(This->typekind != TKIND_COCLASS) {
*pImplTypeFlags = 0;
return S_OK;
}
@@ -3022,6 +3165,12 @@ static HRESULT WINAPI ITypeInfo2_fnGetRefTypeInfo(
if(!ppTInfo)
return E_INVALIDARG;
+ if(hRefType==-2 && This->dual) {
+ *ppTInfo = (ITypeInfo*)&This->dual->lpVtblTypeInfo2;
+ ITypeInfo_AddRef(*ppTInfo);
+ return S_OK;
+ }
+
if(hRefType&1) {
ITypeLib *tl;
MSFT_ImpInfo *impinfo;
@@ -3124,7 +3273,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetContainingTypeLib(
TRACE("(%p,%p,%p)\n", iface, ppTLib, pIndex);
*ppTLib = (ITypeLib *)&This->typelib->lpVtblTypeLib2;
- This->typelib->ref++;
+ ICreateTypeLib_AddRef((ICreateTypeLib*)This->typelib);
*pIndex = This->typeinfo->typekind >> 16;
return S_OK;
@@ -3573,7 +3722,7 @@ static ICreateTypeInfo2 *ICreateTypeInfo2_Constructor(ICreateTypeLib2Impl *typel
pCreateTypeInfo2Impl->ref = 1;
pCreateTypeInfo2Impl->typelib = typelib;
- typelib->ref++;
+ ICreateTypeLib_AddRef((ICreateTypeLib*)typelib);
nameoffset = ctl2_alloc_name(typelib, szName);
typeinfo_offset = ctl2_alloc_typeinfo(typelib, nameoffset);
@@ -3584,6 +3733,7 @@ static ICreateTypeInfo2 *ICreateTypeInfo2_Constructor(ICreateTypeLib2Impl *typel
pCreateTypeInfo2Impl->typeinfo = typeinfo;
+ pCreateTypeInfo2Impl->typekind = tkind;
typeinfo->typekind |= tkind | 0x20;
ICreateTypeInfo2_SetAlignment((ICreateTypeInfo2 *)pCreateTypeInfo2Impl, 4);
@@ -3717,7 +3867,9 @@ static ULONG WINAPI ICreateTypeLib2_fnRelease(ICreateTypeLib2 *iface)
HeapFree(GetProcessHeap(), 0, rem);
}
}
- HeapFree(GetProcessHeap(), 0, typeinfo);
+
+ HeapFree(GetProcessHeap(), 0, typeinfo->dual);
+ HeapFree(GetProcessHeap(), 0, typeinfo);
}
HeapFree(GetProcessHeap(),0,This);
diff --git a/dll/win32/oledlg/oledlg_De.rc b/dll/win32/oledlg/oledlg_De.rc
index 498fa80196b..9aad9ba52f8 100644
--- a/dll/win32/oledlg/oledlg_De.rc
+++ b/dll/win32/oledlg/oledlg_De.rc
@@ -97,4 +97,3 @@ STRINGTABLE DISCARDABLE
IDS_PS_UNKNOWN_SRC "Unbekannte Quelle"
IDS_PS_UNKNOWN_APP "dem Erzeugerprogramm"
}
-#pragma code_page(default)
diff --git a/dll/win32/oledlg/oledlg_Fr.rc b/dll/win32/oledlg/oledlg_Fr.rc
index 5a64ab09b88..176cc87f70f 100644
--- a/dll/win32/oledlg/oledlg_Fr.rc
+++ b/dll/win32/oledlg/oledlg_Fr.rc
@@ -102,4 +102,3 @@ STRINGTABLE DISCARDABLE
IDS_PS_UNKNOWN_SRC "Source inconnue"
IDS_PS_UNKNOWN_APP "le programme avec lequel il a été créé"
}
-#pragma code_page(default)
diff --git a/dll/win32/oledlg/oledlg_Ja.rc b/dll/win32/oledlg/oledlg_Ja.rc
index e6680dd7f21..0029ff35f11 100644
--- a/dll/win32/oledlg/oledlg_Ja.rc
+++ b/dll/win32/oledlg/oledlg_Ja.rc
@@ -58,4 +58,3 @@ STRINGTABLE DISCARDABLE
IDS_NOTOLEMOD "ファイルは有効なOLEモジュールではないようです。OLEコントロールを登録できません。"
IDS_NOTOLEMODCAPTION "コントロールを追加"
}
-#pragma code_page(default)
diff --git a/dll/win32/oledlg/oledlg_Lt.rc b/dll/win32/oledlg/oledlg_Lt.rc
index 02451c470cf..961fd1d996f 100644
--- a/dll/win32/oledlg/oledlg_Lt.rc
+++ b/dll/win32/oledlg/oledlg_Lt.rc
@@ -98,4 +98,3 @@ STRINGTABLE DISCARDABLE
IDS_PS_UNKNOWN_SRC "Nežinomas šaltinis"
IDS_PS_UNKNOWN_APP "programa, kuri jį sukūrė"
}
-#pragma code_page(default)
diff --git a/dll/win32/oledlg/oledlg_Si.rc b/dll/win32/oledlg/oledlg_Si.rc
index 55af95ec373..0f737af2d61 100644
--- a/dll/win32/oledlg/oledlg_Si.rc
+++ b/dll/win32/oledlg/oledlg_Si.rc
@@ -97,4 +97,3 @@ STRINGTABLE DISCARDABLE
IDS_PS_UNKNOWN_SRC "Neznan vir"
IDS_PS_UNKNOWN_APP "Neznan program"
}
-#pragma code_page(default)
diff --git a/dll/win32/riched20/caret.c b/dll/win32/riched20/caret.c
index 1cb44bcdbcd..a72a42b0937 100644
--- a/dll/win32/riched20/caret.c
+++ b/dll/win32/riched20/caret.c
@@ -24,27 +24,55 @@
WINE_DEFAULT_DEBUG_CHANNEL(richedit);
-static BOOL
-ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *pCursor, int nRelOfs);
-
-void ME_GetSelection(ME_TextEditor *editor, int *from, int *to)
+void ME_SetCursorToStart(ME_TextEditor *editor, ME_Cursor *cursor)
{
- *from = ME_GetCursorOfs(editor, 0);
- *to = ME_GetCursorOfs(editor, 1);
-
+ cursor->pPara = editor->pBuffer->pFirst->member.para.next_para;
+ cursor->pRun = ME_FindItemFwd(cursor->pPara, diRun);
+ cursor->nOffset = 0;
+}
+
+static void ME_SetCursorToEnd(ME_TextEditor *editor, ME_Cursor *cursor)
+{
+ cursor->pPara = editor->pBuffer->pLast->member.para.prev_para;
+ cursor->pRun = ME_FindItemBack(editor->pBuffer->pLast, diRun);
+ cursor->nOffset = 0;
+}
+
+
+int ME_GetSelectionOfs(ME_TextEditor *editor, int *from, int *to)
+{
+ *from = ME_GetCursorOfs(&editor->pCursors[0]);
+ *to = ME_GetCursorOfs(&editor->pCursors[1]);
+
if (*from > *to)
{
int tmp = *from;
*from = *to;
- *to = tmp;
+ *to = tmp;
+ return 1;
+ }
+ return 0;
+}
+
+int ME_GetSelection(ME_TextEditor *editor, ME_Cursor **from, ME_Cursor **to)
+{
+ if (ME_GetCursorOfs(&editor->pCursors[0]) < ME_GetCursorOfs(&editor->pCursors[1]))
+ {
+ *from = &editor->pCursors[0];
+ *to = &editor->pCursors[1];
+ return 0;
+ } else {
+ *from = &editor->pCursors[1];
+ *to = &editor->pCursors[0];
+ return 1;
}
}
int ME_GetTextLength(ME_TextEditor *editor)
{
- ME_DisplayItem *pLast = editor->pBuffer->pLast;
- return ME_CharOfsFromRunOfs(editor, pLast->member.para.prev_para,
- ME_FindItemBack(pLast, diRun), 0);
+ ME_Cursor cursor;
+ ME_SetCursorToEnd(editor, &cursor);
+ return ME_GetCursorOfs(&cursor);
}
@@ -63,8 +91,10 @@ int ME_GetTextLengthEx(ME_TextEditor *editor, const GETTEXTLENGTHEX *how)
&& (how->flags & GTL_USECRLF)
&& !editor->bEmulateVersion10) /* Ignore GTL_USECRLF flag in 1.0 emulation */
length += editor->nParagraphs - 1;
-
- if (how->flags & GTL_NUMBYTES)
+
+ if (how->flags & GTL_NUMBYTES ||
+ (how->flags & GTL_PRECISE && /* GTL_PRECISE seems to imply GTL_NUMBYTES */
+ !(how->flags & GTL_NUMCHARS))) /* unless GTL_NUMCHARS is given */
{
CPINFO cpinfo;
@@ -95,12 +125,8 @@ int ME_SetSelection(ME_TextEditor *editor, int from, int to)
/* select all */
if (from == 0 && to == -1)
{
- editor->pCursors[1].pPara = editor->pBuffer->pFirst->member.para.next_para;
- editor->pCursors[1].pRun = ME_FindItemFwd(editor->pCursors[1].pPara, diRun);
- editor->pCursors[1].nOffset = 0;
- editor->pCursors[0].pPara = editor->pBuffer->pLast->member.para.prev_para;
- editor->pCursors[0].pRun = ME_FindItemBack(editor->pBuffer->pLast, diRun);
- editor->pCursors[0].nOffset = 0;
+ ME_SetCursorToStart(editor, &editor->pCursors[1]);
+ ME_SetCursorToEnd(editor, &editor->pCursors[0]);
ME_InvalidateSelection(editor);
ME_ClearTempStyle(editor);
return len + 1;
@@ -119,7 +145,7 @@ int ME_SetSelection(ME_TextEditor *editor, int from, int to)
if (from < 0)
{
int start, end;
- ME_GetSelection(editor, &start, &end);
+ ME_GetSelectionOfs(editor, &start, &end);
editor->pCursors[1] = editor->pCursors[0];
ME_Repaint(editor);
ME_ClearTempStyle(editor);
@@ -148,9 +174,7 @@ int ME_SetSelection(ME_TextEditor *editor, int from, int to)
if (selectionEnd)
{
- editor->pCursors[0].pPara = editor->pBuffer->pLast->member.para.prev_para;
- editor->pCursors[0].pRun = ME_FindItemBack(editor->pBuffer->pLast, diRun);
- editor->pCursors[0].nOffset = 0;
+ ME_SetCursorToEnd(editor, &editor->pCursors[0]);
editor->pCursors[1] = editor->pCursors[0];
ME_InvalidateSelection(editor);
ME_ClearTempStyle(editor);
@@ -158,7 +182,8 @@ int ME_SetSelection(ME_TextEditor *editor, int from, int to)
}
ME_CursorFromCharOfs(editor, from, &editor->pCursors[1]);
- ME_CursorFromCharOfs(editor, to, &editor->pCursors[0]);
+ editor->pCursors[0] = editor->pCursors[1];
+ ME_MoveCursorChars(editor, &editor->pCursors[0], to - from);
/* Selection is not allowed in the middle of an end paragraph run. */
if (editor->pCursors[1].pRun->member.run.nFlags & MERF_ENDPARA)
editor->pCursors[1].nOffset = 0;
@@ -258,23 +283,22 @@ void ME_HideCaret(ME_TextEditor *ed)
}
}
-BOOL ME_InternalDeleteText(ME_TextEditor *editor, int nOfs, int nChars,
- BOOL bForce)
+BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start,
+ int nChars, BOOL bForce)
{
- ME_Cursor c;
+ ME_Cursor c = *start;
+ int nOfs = ME_GetCursorOfs(start);
int shift = 0;
int totalChars = nChars;
ME_DisplayItem *start_para;
/* Prevent deletion past last end of paragraph run. */
nChars = min(nChars, ME_GetTextLength(editor) - nOfs);
-
- ME_CursorFromCharOfs(editor, nOfs, &c);
start_para = c.pPara;
if (!bForce)
{
- ME_ProtectPartialTableDeletion(editor, nOfs, &nChars);
+ ME_ProtectPartialTableDeletion(editor, &c, &nChars);
if (nChars == 0)
return FALSE;
}
@@ -289,8 +313,7 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, int nOfs, int nChars,
{
/* We aren't deleting anything in this run, so we will go back to the
* last run we are deleting text in. */
- c.pRun = ME_FindItemBack(c.pRun, diRun);
- c.pPara = ME_GetParagraph(c.pRun);
+ ME_PrevRun(&c.pPara, &c.pRun);
c.nOffset = c.pRun->member.run.strText->nLen;
}
run = &c.pRun->member.run;
@@ -422,12 +445,12 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, int nOfs, int nChars,
}
BOOL ME_DeleteTextAtCursor(ME_TextEditor *editor, int nCursor, int nChars)
-{
+{
assert(nCursor>=0 && nCursornCursors);
/* text operations set modified state */
editor->nModifyStep = 1;
- return ME_InternalDeleteText(editor, ME_GetCursorOfs(editor, nCursor), nChars,
- FALSE);
+ return ME_InternalDeleteText(editor, &editor->pCursors[nCursor],
+ nChars, FALSE);
}
static ME_DisplayItem *
@@ -459,7 +482,7 @@ void ME_InsertOLEFromCursor(ME_TextEditor *editor, const REOBJECT* reo, int nCur
MERF_GRAPHICS);
di->member.run.ole_obj = ALLOC_OBJ(*reo);
ME_CopyReObject(di->member.run.ole_obj, reo);
- ME_SendSelChange(editor);
+ ME_ReleaseStyle(pStyle);
}
@@ -475,7 +498,7 @@ void ME_InsertEndRowFromCursor(ME_TextEditor *editor, int nCursor)
di = ME_InternalInsertTextFromCursor(editor, nCursor, &space, 1, pStyle,
MERF_ENDROW);
- ME_SendSelChange(editor);
+ ME_ReleaseStyle(pStyle);
}
@@ -565,7 +588,7 @@ void ME_InsertTextFromCursor(ME_TextEditor *editor, int nCursor,
/* ME_SplitParagraph increases style refcount */
tp = ME_SplitParagraph(editor, p->pRun, p->pRun->member.run.style, eol_str, 0);
p->pRun = ME_FindItemFwd(tp, diRun);
- p->pPara = ME_GetParagraph(p->pRun);
+ p->pPara = tp;
end_run = ME_FindItemBack(tp, diRun);
ME_ReleaseStyle(end_run->member.run.style);
end_run->member.run.style = tmp_style;
@@ -577,77 +600,85 @@ void ME_InsertTextFromCursor(ME_TextEditor *editor, int nCursor,
}
}
-
-static BOOL
-ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *pCursor, int nRelOfs)
+/* Move the cursor nRelOfs characters (either forwards or backwards)
+ *
+ * returns the actual number of characters moved.
+ **/
+int ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
{
- ME_DisplayItem *pRun = pCursor->pRun;
-
- if (nRelOfs == -1)
+ cursor->nOffset += nRelOfs;
+ if (cursor->nOffset < 0)
{
- if (!pCursor->nOffset)
+ cursor->nOffset += cursor->pRun->member.run.nCharOfs;
+ if (cursor->nOffset >= 0)
{
- ME_DisplayItem *pPara = pCursor->pPara;
+ /* new offset in the same paragraph */
do {
- pRun = ME_FindItemBack(pRun, diRunOrParagraph);
- assert(pRun);
- switch (pRun->type)
- {
- case diRun:
- break;
- case diParagraph:
- pPara = pRun;
- if (pPara->member.para.prev_para->type == diTextStart)
- return FALSE;
- pRun = ME_FindItemBack(pPara, diRunOrParagraph);
- pPara = pPara->member.para.prev_para;
- /* every paragraph ought to have at least one run */
- assert(pRun && pRun->type == diRun);
- assert(pRun->member.run.nFlags & MERF_ENDPARA);
- break;
- default:
- assert(pRun->type != diRun && pRun->type != diParagraph);
- return FALSE;
- }
- } while (RUN_IS_HIDDEN(&pRun->member.run) ||
- pRun->member.run.nFlags & MERF_HIDDEN);
- pCursor->pPara = pPara;
- pCursor->pRun = pRun;
- if (pRun->member.run.nFlags & MERF_ENDPARA)
- pCursor->nOffset = 0;
- else
- pCursor->nOffset = pRun->member.run.strText->nLen;
+ cursor->pRun = ME_FindItemBack(cursor->pRun, diRun);
+ } while (cursor->nOffset < cursor->pRun->member.run.nCharOfs);
+ cursor->nOffset -= cursor->pRun->member.run.nCharOfs;
+ return nRelOfs;
}
- if (pCursor->nOffset)
- pCursor->nOffset = pCursor->nOffset + nRelOfs;
- return TRUE;
- }
- else
- {
- if (!(pRun->member.run.nFlags & MERF_ENDPARA))
+ cursor->nOffset += cursor->pPara->member.para.nCharOfs;
+ if (cursor->nOffset <= 0)
{
- int new_ofs = pCursor->nOffset + nRelOfs;
-
- if (new_ofs < pRun->member.run.strText->nLen)
- {
- pCursor->nOffset = new_ofs;
- return TRUE;
- }
+ /* moved to the start of the text */
+ nRelOfs -= cursor->nOffset;
+ ME_SetCursorToStart(editor, cursor);
+ return nRelOfs;
}
+
+ /* new offset in a previous paragraph */
do {
- pRun = ME_FindItemFwd(pRun, diRun);
- } while (pRun && (RUN_IS_HIDDEN(&pRun->member.run) ||
- pRun->member.run.nFlags & MERF_HIDDEN));
- if (pRun)
- {
- pCursor->pPara = ME_GetParagraph(pRun);
- pCursor->pRun = pRun;
- pCursor->nOffset = 0;
- return TRUE;
+ cursor->pPara = cursor->pPara->member.para.prev_para;
+ } while (cursor->nOffset < cursor->pPara->member.para.nCharOfs);
+ cursor->nOffset -= cursor->pPara->member.para.nCharOfs;
+
+ cursor->pRun = ME_FindItemBack(cursor->pPara->member.para.next_para, diRun);
+ while (cursor->nOffset < cursor->pRun->member.run.nCharOfs) {
+ cursor->pRun = ME_FindItemBack(cursor->pRun, diRun);
}
- }
- return FALSE;
+ cursor->nOffset -= cursor->pRun->member.run.nCharOfs;
+ } else if (cursor->nOffset >= cursor->pRun->member.run.strText->nLen) {
+ ME_DisplayItem *next_para;
+ int new_offset;
+
+ new_offset = ME_GetCursorOfs(cursor);
+ next_para = cursor->pPara->member.para.next_para;
+ if (new_offset < next_para->member.para.nCharOfs)
+ {
+ /* new offset in the same paragraph */
+ do {
+ cursor->nOffset -= cursor->pRun->member.run.strText->nLen;
+ cursor->pRun = ME_FindItemFwd(cursor->pRun, diRun);
+ } while (cursor->nOffset >= cursor->pRun->member.run.strText->nLen);
+ return nRelOfs;
+ }
+
+ if (new_offset >= ME_GetTextLength(editor))
+ {
+ /* new offset at the end of the text */
+ ME_SetCursorToEnd(editor, cursor);
+ nRelOfs -= new_offset - ME_GetTextLength(editor);
+ return nRelOfs;
+ }
+
+ /* new offset in a following paragraph */
+ do {
+ cursor->pPara = next_para;
+ next_para = next_para->member.para.next_para;
+ } while (new_offset >= next_para->member.para.nCharOfs);
+
+ cursor->nOffset = new_offset - cursor->pPara->member.para.nCharOfs;
+ cursor->pRun = ME_FindItemFwd(cursor->pPara, diRun);
+ while (cursor->nOffset >= cursor->pRun->member.run.strText->nLen)
+ {
+ cursor->nOffset -= cursor->pRun->member.run.strText->nLen;
+ cursor->pRun = ME_FindItemFwd(cursor->pRun, diRun);
+ }
+ } /* else new offset is in the same run */
+ return nRelOfs;
}
@@ -655,8 +686,9 @@ static BOOL
ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
{
ME_DisplayItem *pRun = cursor->pRun, *pOtherRun;
+ ME_DisplayItem *pPara = cursor->pPara;
int nOffset = cursor->nOffset;
-
+
if (nRelOfs == -1)
{
/* Backward movement */
@@ -684,14 +716,16 @@ ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
{
if (cursor->pRun == pRun && cursor->nOffset == 0)
{
+ pPara = pOtherRun;
/* Skip empty start of table row paragraph */
- if (pOtherRun->member.para.prev_para->member.para.nFlags & MEPF_ROWSTART)
- pOtherRun = pOtherRun->member.para.prev_para;
+ if (pPara->member.para.prev_para->member.para.nFlags & MEPF_ROWSTART)
+ pPara = pPara->member.para.prev_para;
/* Paragraph breaks are treated as separate words */
- if (pOtherRun->member.para.prev_para->type == diTextStart)
+ if (pPara->member.para.prev_para->type == diTextStart)
return FALSE;
- pRun = ME_FindItemBack(pOtherRun, diRun);
+ pRun = ME_FindItemBack(pPara, diRun);
+ pPara = pPara->member.para.prev_para;
}
break;
}
@@ -723,8 +757,10 @@ ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
{
if (pOtherRun->member.para.nFlags & MEPF_ROWSTART)
pOtherRun = pOtherRun->member.para.next_para;
- if (cursor->pRun == pRun)
- pRun = ME_FindItemFwd(pOtherRun, diRun);
+ if (cursor->pRun == pRun) {
+ pPara = pOtherRun;
+ pRun = ME_FindItemFwd(pPara, diRun);
+ }
nOffset = 0;
break;
}
@@ -737,7 +773,7 @@ ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
}
}
}
- cursor->pPara = ME_GetParagraph(pRun);
+ cursor->pPara = pPara;
cursor->pRun = pRun;
cursor->nOffset = nOffset;
return TRUE;
@@ -793,12 +829,8 @@ ME_SelectByType(ME_TextEditor *editor, ME_SelectionType selectionType)
case stDocument:
/* Select everything with cursor anchored from the start of the text */
editor->nSelectionType = stDocument;
- editor->pCursors[1].pPara = editor->pBuffer->pFirst->member.para.next_para;
- editor->pCursors[1].pRun = ME_FindItemFwd(editor->pCursors[1].pPara, diRun);
- editor->pCursors[1].nOffset = 0;
- editor->pCursors[0].pPara = editor->pBuffer->pLast->member.para.prev_para;
- editor->pCursors[0].pRun = ME_FindItemBack(editor->pBuffer->pLast, diRun);
- editor->pCursors[0].nOffset = 0;
+ ME_SetCursorToStart(editor, &editor->pCursors[1]);
+ ME_SetCursorToEnd(editor, &editor->pCursors[0]);
break;
default: assert(0);
}
@@ -807,11 +839,10 @@ ME_SelectByType(ME_TextEditor *editor, ME_SelectionType selectionType)
editor->pCursors[3] = editor->pCursors[1];
}
-int ME_GetCursorOfs(ME_TextEditor *editor, int nCursor)
+int ME_GetCursorOfs(const ME_Cursor *cursor)
{
- ME_Cursor *pCursor = &editor->pCursors[nCursor];
- return pCursor->pPara->member.para.nCharOfs
- + pCursor->pRun->member.run.nCharOfs + pCursor->nOffset;
+ return cursor->pPara->member.para.nCharOfs
+ + cursor->pRun->member.run.nCharOfs + cursor->nOffset;
}
/* Helper function for ME_FindPixelPos to find paragraph within tables */
@@ -862,9 +893,9 @@ static BOOL ME_ReturnFoundPos(ME_TextEditor *editor, ME_DisplayItem *found,
rx = 0;
result->pRun = found;
result->nOffset = ME_CharFromPointCursor(editor, rx, &found->member.run);
- if (editor->pCursors[0].nOffset == found->member.run.strText->nLen && rx)
+ if (result->nOffset == found->member.run.strText->nLen && rx)
{
- result->pRun = ME_FindItemFwd(editor->pCursors[0].pRun, diRun);
+ result->pRun = ME_FindItemFwd(result->pRun, diRun);
result->nOffset = 0;
}
result->pPara = ME_GetParagraph(result->pRun);
@@ -975,30 +1006,32 @@ static BOOL ME_FindPixelPos(ME_TextEditor *editor, int x, int y,
}
-/* Returns the character offset closest to the pixel position
+/* Sets the cursor to the position closest to the pixel position
*
* x & y are pixel positions in client coordinates.
*
* isExact will be set to TRUE if the run is directly under the pixel
* position, FALSE if it not, unless isExact is set to NULL.
+ *
+ * return FALSE if outside client area and the cursor is not set,
+ * otherwise TRUE is returned.
*/
-int ME_CharFromPos(ME_TextEditor *editor, int x, int y, BOOL *isExact)
+BOOL ME_CharFromPos(ME_TextEditor *editor, int x, int y,
+ ME_Cursor *cursor, BOOL *isExact)
{
- ME_Cursor cursor;
RECT rc;
BOOL bResult;
ITextHost_TxGetClientRect(editor->texthost, &rc);
if (x < 0 || y < 0 || x >= rc.right || y >= rc.bottom) {
if (isExact) *isExact = FALSE;
- return -1;
+ return FALSE;
}
x += editor->horz_si.nPos;
y += editor->vert_si.nPos;
- bResult = ME_FindPixelPos(editor, x, y, &cursor, NULL);
+ bResult = ME_FindPixelPos(editor, x, y, cursor, NULL);
if (isExact) *isExact = bResult;
- return cursor.pPara->member.para.nCharOfs
- + cursor.pRun->member.run.nCharOfs + cursor.nOffset;
+ return TRUE;
}
@@ -1019,9 +1052,9 @@ static void ME_ExtendAnchorSelection(ME_TextEditor *editor)
int curOfs, anchorStartOfs, anchorEndOfs;
if (editor->nSelectionType == stPosition || editor->nSelectionType == stDocument)
return;
- curOfs = ME_GetCursorOfs(editor, 0);
- anchorStartOfs = ME_GetCursorOfs(editor, 3);
- anchorEndOfs = ME_GetCursorOfs(editor, 2);
+ curOfs = ME_GetCursorOfs(&editor->pCursors[0]);
+ anchorStartOfs = ME_GetCursorOfs(&editor->pCursors[3]);
+ anchorEndOfs = ME_GetCursorOfs(&editor->pCursors[2]);
tmp_cursor = editor->pCursors[0];
editor->pCursors[0] = editor->pCursors[2];
@@ -1231,14 +1264,14 @@ static void
ME_MoveCursorLines(ME_TextEditor *editor, ME_Cursor *pCursor, int nRelOfs)
{
ME_DisplayItem *pRun = pCursor->pRun;
- ME_DisplayItem *pItem, *pOldPara, *pNewPara;
+ ME_DisplayItem *pOldPara = pCursor->pPara;
+ ME_DisplayItem *pItem, *pNewPara;
int x = ME_GetXForArrow(editor, pCursor);
if (editor->bCaretAtEnd && !pCursor->nOffset)
- pRun = ME_FindItemBack(pRun, diRun);
- if (!pRun)
- return;
- pOldPara = ME_GetParagraph(pRun);
+ if (!ME_PrevRun(&pOldPara, &pRun))
+ return;
+
if (nRelOfs == -1)
{
/* start of this row */
@@ -1313,9 +1346,7 @@ static void ME_ArrowPageUp(ME_TextEditor *editor, ME_Cursor *pCursor)
if (editor->vert_si.nPos < p->member.row.nHeight)
{
- pCursor->pPara = editor->pBuffer->pFirst->member.para.next_para;
- pCursor->pRun = ME_FindItemFwd(pCursor->pPara, diRun);
- pCursor->nOffset = 0;
+ ME_SetCursorToStart(editor, pCursor);
editor->bCaretAtEnd = FALSE;
/* Native clears seems to clear this x value on page up at the top
* of the text, but not on page down at the end of the text.
@@ -1380,9 +1411,7 @@ static void ME_ArrowPageDown(ME_TextEditor *editor, ME_Cursor *pCursor)
if (editor->vert_si.nPos >= y - editor->sizeWindow.cy)
{
- pCursor->pPara = editor->pBuffer->pLast->member.para.prev_para;
- pCursor->pRun = ME_FindItemBack(editor->pBuffer->pLast, diRun);
- pCursor->nOffset = 0;
+ ME_SetCursorToEnd(editor, pCursor);
editor->bCaretAtEnd = FALSE;
} else {
ME_DisplayItem *pRun = pCursor->pRun;
@@ -1451,9 +1480,7 @@ static void ME_ArrowHome(ME_TextEditor *editor, ME_Cursor *pCursor)
static void ME_ArrowCtrlHome(ME_TextEditor *editor, ME_Cursor *pCursor)
{
- pCursor->pPara = editor->pBuffer->pFirst->member.para.next_para;
- pCursor->pRun = ME_FindItemFwd(pCursor->pPara, diRun);
- pCursor->nOffset = 0;
+ ME_SetCursorToStart(editor, pCursor);
editor->bCaretAtEnd = FALSE;
}
@@ -1484,33 +1511,21 @@ static void ME_ArrowEnd(ME_TextEditor *editor, ME_Cursor *pCursor)
static void ME_ArrowCtrlEnd(ME_TextEditor *editor, ME_Cursor *pCursor)
{
- pCursor->pPara = editor->pBuffer->pLast->member.para.prev_para;
- pCursor->pRun = ME_FindItemBack(editor->pBuffer->pLast, diRun);
- assert(pCursor->pRun->member.run.nFlags & MERF_ENDPARA);
- pCursor->nOffset = 0;
+ ME_SetCursorToEnd(editor, pCursor);
editor->bCaretAtEnd = FALSE;
}
BOOL ME_IsSelection(ME_TextEditor *editor)
{
- return memcmp(&editor->pCursors[0], &editor->pCursors[1], sizeof(ME_Cursor))!=0;
-}
-
-static int ME_GetSelCursor(ME_TextEditor *editor, int dir)
-{
- int cdir = ME_GetCursorOfs(editor, 0) - ME_GetCursorOfs(editor, 1);
-
- if (cdir*dir>0)
- return 0;
- else
- return 1;
+ return editor->pCursors[0].pRun != editor->pCursors[1].pRun ||
+ editor->pCursors[0].nOffset != editor->pCursors[1].nOffset;
}
void ME_DeleteSelection(ME_TextEditor *editor)
{
int from, to;
- ME_GetSelection(editor, &from, &to);
- ME_DeleteTextAtCursor(editor, ME_GetSelCursor(editor,-1), to-from);
+ int nStartCursor = ME_GetSelectionOfs(editor, &from, &to);
+ ME_DeleteTextAtCursor(editor, nStartCursor, to - from);
}
ME_Style *ME_GetSelectionInsertStyle(ME_TextEditor *editor)
@@ -1525,12 +1540,14 @@ void ME_SendSelChange(ME_TextEditor *editor)
if (!(editor->nEventMask & ENM_SELCHANGE))
return;
+ sc.nmhdr.hwndFrom = NULL;
+ sc.nmhdr.idFrom = 0;
sc.nmhdr.code = EN_SELCHANGE;
- ME_GetSelection(editor, &sc.chrg.cpMin, &sc.chrg.cpMax);
+ ME_GetSelectionOfs(editor, &sc.chrg.cpMin, &sc.chrg.cpMax);
sc.seltyp = SEL_EMPTY;
if (sc.chrg.cpMin != sc.chrg.cpMax)
sc.seltyp |= SEL_TEXT;
- if (sc.chrg.cpMin < sc.chrg.cpMax+1) /* wth were RICHEDIT authors thinking ? */
+ if (sc.chrg.cpMin < sc.chrg.cpMax+1) /* what were RICHEDIT authors thinking ? */
sc.seltyp |= SEL_MULTICHAR;
TRACE("cpMin=%d cpMax=%d seltyp=%d (%s %s)\n",
sc.chrg.cpMin, sc.chrg.cpMax, sc.seltyp,
diff --git a/dll/win32/riched20/clipboard.c b/dll/win32/riched20/clipboard.c
index cf4fe4b37a9..15ce97b943f 100644
--- a/dll/win32/riched20/clipboard.c
+++ b/dll/win32/riched20/clipboard.c
@@ -326,18 +326,23 @@ static const IDataObjectVtbl VT_DataObjectImpl =
DataObjectImpl_EnumDAdvise
};
-static HGLOBAL get_unicode_text(ME_TextEditor *editor, const CHARRANGE *lpchrg)
+static HGLOBAL get_unicode_text(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
{
- int pars, len;
+ int pars = 0;
WCHAR *data;
HANDLE ret;
+ ME_DisplayItem *para;
+ int nEnd = ME_GetCursorOfs(start) + nChars;
- pars = ME_CountParagraphsBetween(editor, lpchrg->cpMin, lpchrg->cpMax);
- len = lpchrg->cpMax-lpchrg->cpMin;
- ret = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR)*(len+pars+1));
+ /* count paragraphs in range */
+ para = start->pPara;
+ while((para = para->member.para.next_para) &&
+ para->member.para.nCharOfs <= nEnd)
+ pars++;
+
+ ret = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * (nChars + pars + 1));
data = GlobalLock(ret);
- len = ME_GetTextW(editor, data, lpchrg->cpMin, len, TRUE);
- data[len] = 0;
+ ME_GetTextW(editor, data, nChars + pars, start, nChars, TRUE);
GlobalUnlock(ret);
return ret;
}
@@ -370,7 +375,7 @@ static DWORD CALLBACK ME_AppendToHGLOBAL(DWORD_PTR dwCookie, LPBYTE lpBuff, LONG
return 0;
}
-static HGLOBAL get_rtf_text(ME_TextEditor *editor, const CHARRANGE *lpchrg)
+static HGLOBAL get_rtf_text(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
{
EDITSTREAM es;
ME_GlobalDestStruct gds;
@@ -379,15 +384,16 @@ static HGLOBAL get_rtf_text(ME_TextEditor *editor, const CHARRANGE *lpchrg)
gds.nLength = 0;
es.dwCookie = (DWORD_PTR)&gds;
es.pfnCallback = ME_AppendToHGLOBAL;
- ME_StreamOutRange(editor, SF_RTF, lpchrg->cpMin, lpchrg->cpMax, &es);
+ ME_StreamOutRange(editor, SF_RTF, start, nChars, &es);
GlobalReAlloc(gds.hData, gds.nLength+1, 0);
return gds.hData;
}
-HRESULT ME_GetDataObject(ME_TextEditor *editor, const CHARRANGE *lpchrg, LPDATAOBJECT *lplpdataobj)
+HRESULT ME_GetDataObject(ME_TextEditor *editor, const ME_Cursor *start,
+ int nChars, LPDATAOBJECT *lplpdataobj)
{
DataObjectImpl *obj;
- TRACE("(%p,%d,%d)\n", editor, lpchrg->cpMin, lpchrg->cpMax);
+ TRACE("(%p,%d,%d)\n", editor, ME_GetCursorOfs(start), nChars);
obj = heap_alloc(sizeof(DataObjectImpl));
if(cfRTF == 0)
@@ -395,7 +401,7 @@ HRESULT ME_GetDataObject(ME_TextEditor *editor, const CHARRANGE *lpchrg, LPDATAO
obj->lpVtbl = &VT_DataObjectImpl;
obj->ref = 1;
- obj->unicode = get_unicode_text(editor, lpchrg);
+ obj->unicode = get_unicode_text(editor, start, nChars);
obj->rtf = NULL;
obj->fmtetc_cnt = 1;
@@ -404,7 +410,7 @@ HRESULT ME_GetDataObject(ME_TextEditor *editor, const CHARRANGE *lpchrg, LPDATAO
obj->fmtetc = GlobalAlloc(GMEM_ZEROINIT, obj->fmtetc_cnt*sizeof(FORMATETC));
InitFormatEtc(obj->fmtetc[0], CF_UNICODETEXT, TYMED_HGLOBAL);
if(editor->mode & TM_RICHTEXT) {
- obj->rtf = get_rtf_text(editor, lpchrg);
+ obj->rtf = get_rtf_text(editor, start, nChars);
InitFormatEtc(obj->fmtetc[1], cfRTF, TYMED_HGLOBAL);
}
diff --git a/dll/win32/riched20/editor.c b/dll/win32/riched20/editor.c
index 278b9aaa843..7a116472917 100644
--- a/dll/win32/riched20/editor.c
+++ b/dll/win32/riched20/editor.c
@@ -141,8 +141,8 @@
+ WM_PASTE
+ WM_SETFONT
+ WM_SETTEXT (resets undo stack !) (proper style?) ANSI&Unicode
- - WM_STYLECHANGING
- - WM_STYLECHANGED (things like read-only flag)
+ + WM_STYLECHANGING (seems to do nothing)
+ + WM_STYLECHANGED (seems to do nothing)
+ WM_UNICHAR
+ WM_VSCROLL
@@ -241,10 +241,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(richedit);
static BOOL ME_RegisterEditorClass(HINSTANCE);
-static BOOL ME_UpdateLinkAttribute(ME_TextEditor *editor, int sel_min, int sel_max);
+static BOOL ME_UpdateLinkAttribute(ME_TextEditor *editor, ME_Cursor *start, int nChars);
-static const WCHAR RichEdit20W[] = {'R', 'i', 'c', 'h', 'E', 'd', 'i', 't', '2', '0', 'W', 0};
-static const WCHAR RichEdit50W[] = {'R', 'i', 'c', 'h', 'E', 'd', 'i', 't', '5', '0', 'W', 0};
static const WCHAR REListBox20W[] = {'R','E','L','i','s','t','B','o','x','2','0','W', 0};
static const WCHAR REComboBox20W[] = {'R','E','C','o','m','b','o','B','o','x','2','0','W', 0};
static HCURSOR hLeft;
@@ -422,7 +420,10 @@ void ME_RTFCharAttrHook(RTF_Info *info)
else if (info->rtfParam != rtfNoParam)
{
RTFColor *c = RTFGetColor(info, info->rtfParam);
- fmt.crTextColor = (c->rtfCBlue<<16)|(c->rtfCGreen<<8)|(c->rtfCRed);
+ if (c && c->rtfCBlue >= 0)
+ fmt.crTextColor = (c->rtfCBlue<<16)|(c->rtfCGreen<<8)|(c->rtfCRed);
+ else
+ fmt.dwEffects = CFE_AUTOBACKCOLOR;
}
break;
case rtfForeColor:
@@ -433,10 +434,11 @@ void ME_RTFCharAttrHook(RTF_Info *info)
else if (info->rtfParam != rtfNoParam)
{
RTFColor *c = RTFGetColor(info, info->rtfParam);
- if (c)
+ if (c && c->rtfCBlue >= 0)
fmt.crTextColor = (c->rtfCBlue<<16)|(c->rtfCGreen<<8)|(c->rtfCRed);
- else
- fmt.crTextColor = 0;
+ else {
+ fmt.dwEffects = CFE_AUTOCOLOR;
+ }
}
break;
case rtfFontNum:
@@ -1011,9 +1013,10 @@ void ME_RTFSpecialCharHook(RTF_Info *info)
info->editor->pCursors[1].pRun = run;
info->editor->pCursors[1].pPara = ME_GetParagraph(run);
info->editor->pCursors[1].nOffset = 0;
- nOfs = ME_GetCursorOfs(info->editor, 1);
- nChars = ME_GetCursorOfs(info->editor, 0) - nOfs;
- ME_InternalDeleteText(info->editor, nOfs, nChars, TRUE);
+ nOfs = ME_GetCursorOfs(&info->editor->pCursors[1]);
+ nChars = ME_GetCursorOfs(&info->editor->pCursors[0]) - nOfs;
+ ME_InternalDeleteText(info->editor, &info->editor->pCursors[1],
+ nChars, TRUE);
}
para = ME_InsertTableRowEndFromCursor(info->editor);
@@ -1146,8 +1149,8 @@ static BOOL ME_RTFInsertOleObject(RTF_Info *info, HENHMETAFILE hemf, HBITMAP hbm
reobject.dwFlags = 0; /* FIXME */
reobject.dwUser = 0;
- /* FIXME: could be simpler */
- ret = IRichEditOle_InsertObject(info->lpRichEditOle, &reobject) == S_OK;
+ ME_InsertOLEFromCursor(info->editor, &reobject, 0);
+ ret = TRUE;
}
if (lpObject) IOleObject_Release(lpObject);
@@ -1341,7 +1344,8 @@ static void ME_RTFReadHook(RTF_Info *info)
{
case rtfBeginGroup:
if (info->stackTop < maxStack) {
- info->stack[info->stackTop].fmt = info->style->fmt;
+ info->stack[info->stackTop].style = info->style;
+ ME_AddRefStyle(info->style);
info->stack[info->stackTop].codePage = info->codePage;
info->stack[info->stackTop].unicodeLength = info->unicodeLength;
}
@@ -1350,23 +1354,17 @@ static void ME_RTFReadHook(RTF_Info *info)
break;
case rtfEndGroup:
{
- ME_Style *s;
RTFFlushOutputBuffer(info);
info->stackTop--;
- if (info->stackTop<=0) {
+ if (info->stackTop <= 0)
info->rtfClass = rtfEOF;
+ if (info->stackTop < 0)
return;
- }
- assert(info->stackTop >= 0);
- if (info->styleChanged)
- {
- /* FIXME too slow ? how come ? */
- s = ME_ApplyStyle(info->style, &info->stack[info->stackTop].fmt);
- ME_ReleaseStyle(info->style);
- info->style = s;
- info->codePage = info->stack[info->stackTop].codePage;
- info->unicodeLength = info->stack[info->stackTop].unicodeLength;
- }
+
+ ME_ReleaseStyle(info->style);
+ info->style = info->stack[info->stackTop].style;
+ info->codePage = info->stack[info->stackTop].codePage;
+ info->unicodeLength = info->stack[info->stackTop].unicodeLength;
break;
}
}
@@ -1388,19 +1386,22 @@ static LRESULT ME_StreamIn(ME_TextEditor *editor, DWORD format, EDITSTREAM *stre
{
RTF_Info parser;
ME_Style *style;
- int from, to, to2, nUndoMode;
+ int from, to, nUndoMode;
int nEventMask = editor->nEventMask;
ME_InStream inStream;
BOOL invalidRTF = FALSE;
+ ME_Cursor *selStart, *selEnd;
TRACE("stream==%p editor==%p format==0x%X\n", stream, editor, format);
editor->nEventMask = 0;
- ME_GetSelection(editor, &from, &to);
- if ((format & SFF_SELECTION) && (editor->mode & TM_RICHTEXT)) {
+ ME_GetSelectionOfs(editor, &from, &to);
+ if (format & SFF_SELECTION && editor->mode & TM_RICHTEXT)
+ {
+ ME_GetSelection(editor, &selStart, &selEnd);
style = ME_GetSelectionInsertStyle(editor);
- ME_InternalDeleteText(editor, from, to-from, FALSE);
+ ME_InternalDeleteText(editor, selStart, to - from, FALSE);
/* Don't insert text at the end of the table row */
if (!editor->bEmulateVersion10) { /* v4.1 */
@@ -1425,12 +1426,12 @@ static LRESULT ME_StreamIn(ME_TextEditor *editor, DWORD format, EDITSTREAM *stre
ME_IsInTable(editor->pCursors[0].pRun))
return 0;
}
- }
- else {
+ } else {
style = editor->pBuffer->pDefaultStyle;
ME_AddRefStyle(style);
ME_SetSelection(editor, 0, 0);
- ME_InternalDeleteText(editor, 0, ME_GetTextLength(editor), FALSE);
+ ME_InternalDeleteText(editor, &editor->pCursors[1],
+ ME_GetTextLength(editor), FALSE);
from = to = 0;
ME_ClearTempStyle(editor);
ME_SetDefaultParaFormat(editor->pCursors[0].pPara->member.para.pFmt);
@@ -1519,9 +1520,9 @@ static LRESULT ME_StreamIn(ME_TextEditor *editor, DWORD format, EDITSTREAM *stre
editor->pCursors[1].pPara = para;
editor->pCursors[1].pRun = ME_FindItemFwd(para, diRun);
editor->pCursors[1].nOffset = 0;
- nOfs = ME_GetCursorOfs(editor, 1);
- nChars = ME_GetCursorOfs(editor, 0) - nOfs;
- ME_InternalDeleteText(editor, nOfs, nChars, TRUE);
+ nOfs = ME_GetCursorOfs(&editor->pCursors[1]);
+ nChars = ME_GetCursorOfs(&editor->pCursors[0]) - nOfs;
+ ME_InternalDeleteText(editor, &editor->pCursors[1], nChars, TRUE);
if (parser.tableDef)
parser.tableDef->tableRowStart = NULL;
}
@@ -1531,23 +1532,34 @@ static LRESULT ME_StreamIn(ME_TextEditor *editor, DWORD format, EDITSTREAM *stre
if (parser.lpRichEditOle)
IRichEditOle_Release(parser.lpRichEditOle);
- if (!inStream.editstream->dwError && parser.stackTop > 0)
- inStream.editstream->dwError = HRESULT_FROM_WIN32(ERROR_HANDLE_EOF);
+ if (parser.stackTop > 0)
+ {
+ while (--parser.stackTop >= 0)
+ {
+ ME_ReleaseStyle(parser.style);
+ parser.style = parser.stack[parser.stackTop].style;
+ }
+ if (!inStream.editstream->dwError)
+ inStream.editstream->dwError = HRESULT_FROM_WIN32(ERROR_HANDLE_EOF);
+ }
/* Remove last line break, as mandated by tests. This is not affected by
CR/LF counters, since RTF streaming presents only \para tokens, which
are converted according to the standard rules: \r for 2.0, \r\n for 1.0
*/
if (stripLastCR) {
- int newfrom, newto;
- ME_GetSelection(editor, &newfrom, &newto);
+ int newto;
+ ME_GetSelection(editor, &selStart, &selEnd);
+ newto = ME_GetCursorOfs(selEnd);
if (newto > to + (editor->bEmulateVersion10 ? 1 : 0)) {
WCHAR lastchar[3] = {'\0', '\0'};
int linebreakSize = editor->bEmulateVersion10 ? 2 : 1;
+ ME_Cursor linebreakCursor = *selEnd;
- ME_GetTextW(editor, lastchar, newto - linebreakSize, linebreakSize, 0);
+ ME_MoveCursorChars(editor, &linebreakCursor, -linebreakSize);
+ ME_GetTextW(editor, lastchar, 2, &linebreakCursor, linebreakSize, 0);
if (lastchar[0] == '\r' && (lastchar[1] == '\n' || lastchar[1] == '\0')) {
- ME_InternalDeleteText(editor, newto - linebreakSize, linebreakSize, FALSE);
+ ME_InternalDeleteText(editor, &linebreakCursor, linebreakSize, FALSE);
}
}
}
@@ -1558,7 +1570,6 @@ static LRESULT ME_StreamIn(ME_TextEditor *editor, DWORD format, EDITSTREAM *stre
ME_StreamInText(editor, format, &inStream, style);
else
ERR("EM_STREAMIN without SF_TEXT or SF_RTF\n");
- ME_GetSelection(editor, &to, &to2);
/* put the cursor at the top */
if (!(format & SFF_SELECTION))
ME_SetSelection(editor, 0, 0);
@@ -1629,10 +1640,8 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
{
const int nLen = lstrlenW(text);
const int nTextLen = ME_GetTextLength(editor);
- int nStart, nEnd;
int nMin, nMax;
- ME_DisplayItem *item;
- ME_DisplayItem *para;
+ ME_Cursor cursor;
WCHAR wLastChar = ' ';
TRACE("flags==0x%08x, chrg->cpMin==%d, chrg->cpMax==%d text==%s\n",
@@ -1693,17 +1702,17 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
/* If possible, find the character before where the search starts */
if ((flags & FR_WHOLEWORD) && nMin)
{
- ME_RunOfsFromCharOfs(editor, nMin - 1, NULL, &item, &nStart);
- wLastChar = item->member.run.strText->szData[nStart];
+ ME_CursorFromCharOfs(editor, nMin - 1, &cursor);
+ wLastChar = cursor.pRun->member.run.strText->szData[cursor.nOffset];
+ ME_MoveCursorChars(editor, &cursor, 1);
+ } else {
+ ME_CursorFromCharOfs(editor, nMin, &cursor);
}
- ME_RunOfsFromCharOfs(editor, nMin, ¶, &item, &nStart);
-
- while (item
- && para->member.para.nCharOfs + item->member.run.nCharOfs + nStart + nLen <= nMax)
+ while (cursor.pRun && ME_GetCursorOfs(&cursor) + nLen <= nMax)
{
- ME_DisplayItem *pCurItem = item;
- int nCurStart = nStart;
+ ME_DisplayItem *pCurItem = cursor.pRun;
+ int nCurStart = cursor.nOffset;
int nMatched = 0;
while (pCurItem && ME_CharCompare(pCurItem->member.run.strText->szData[nCurStart + nMatched], text[nMatched], (flags & FR_MATCHCASE)))
@@ -1736,14 +1745,14 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
break;
}
- nStart += para->member.para.nCharOfs + item->member.run.nCharOfs;
+ cursor.nOffset += cursor.pPara->member.para.nCharOfs + cursor.pRun->member.run.nCharOfs;
if (chrgText)
{
- chrgText->cpMin = nStart;
- chrgText->cpMax = nStart + nLen;
+ chrgText->cpMin = cursor.nOffset;
+ chrgText->cpMax = cursor.nOffset + nLen;
}
- TRACE("found at %d-%d\n", nStart, nStart + nLen);
- return nStart;
+ TRACE("found at %d-%d\n", cursor.nOffset, cursor.nOffset + nLen);
+ return cursor.nOffset;
}
if (nCurStart + nMatched == pCurItem->member.run.strText->nLen)
{
@@ -1756,12 +1765,11 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
else
wLastChar = ' ';
- nStart++;
- if (nStart == item->member.run.strText->nLen)
+ cursor.nOffset++;
+ if (cursor.nOffset == cursor.pRun->member.run.strText->nLen)
{
- item = ME_FindItemFwd(item, diRun);
- para = ME_GetParagraph(item);
- nStart = 0;
+ ME_NextRun(&cursor.pPara, &cursor.pRun);
+ cursor.nOffset = 0;
}
}
}
@@ -1770,22 +1778,23 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
/* If possible, find the character after where the search ends */
if ((flags & FR_WHOLEWORD) && nMax < nTextLen - 1)
{
- ME_RunOfsFromCharOfs(editor, nMax + 1, NULL, &item, &nEnd);
- wLastChar = item->member.run.strText->szData[nEnd];
+ ME_CursorFromCharOfs(editor, nMax + 1, &cursor);
+ wLastChar = cursor.pRun->member.run.strText->szData[cursor.nOffset];
+ ME_MoveCursorChars(editor, &cursor, -1);
+ } else {
+ ME_CursorFromCharOfs(editor, nMax, &cursor);
}
- ME_RunOfsFromCharOfs(editor, nMax, ¶, &item, &nEnd);
-
- while (item
- && para->member.para.nCharOfs + item->member.run.nCharOfs + nEnd - nLen >= nMin)
+ while (cursor.pRun && ME_GetCursorOfs(&cursor) - nLen >= nMin)
{
- ME_DisplayItem *pCurItem = item;
- int nCurEnd = nEnd;
+ ME_DisplayItem *pCurItem = cursor.pRun;
+ ME_DisplayItem *pCurPara = cursor.pPara;
+ int nCurEnd = cursor.nOffset;
int nMatched = 0;
if (nCurEnd == 0)
{
- pCurItem = ME_FindItemBack(pCurItem, diRun);
+ ME_PrevRun(&pCurPara, &pCurItem);
nCurEnd = pCurItem->member.run.strText->nLen + nMatched;
}
@@ -1800,6 +1809,7 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
ME_DisplayItem *pPrevItem = pCurItem;
int nPrevEnd = nCurEnd;
WCHAR wPrevChar;
+ int nStart;
/* Check to see if previous character is a whitespace */
if (flags & FR_WHOLEWORD)
@@ -1820,7 +1830,7 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
break;
}
- nStart = ME_GetParagraph(pCurItem)->member.para.nCharOfs
+ nStart = pCurPara->member.para.nCharOfs
+ pCurItem->member.run.nCharOfs + nCurEnd - nMatched;
if (chrgText)
{
@@ -1832,7 +1842,7 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
}
if (nCurEnd - nMatched == 0)
{
- pCurItem = ME_FindItemBack(pCurItem, diRun);
+ ME_PrevRun(&pCurPara, &pCurItem);
/* Don't care about pCurItem becoming NULL here; it's already taken
* care of in the exterior loop condition */
nCurEnd = pCurItem->member.run.strText->nLen + nMatched;
@@ -1843,12 +1853,11 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
else
wLastChar = ' ';
- nEnd--;
- if (nEnd < 0)
+ cursor.nOffset--;
+ if (cursor.nOffset < 0)
{
- item = ME_FindItemBack(item, diRun);
- para = ME_GetParagraph(item);
- nEnd = item->member.run.strText->nLen;
+ ME_PrevRun(&cursor.pPara, &cursor.pRun);
+ cursor.nOffset = cursor.pRun->member.run.strText->nLen;
}
}
}
@@ -1860,25 +1869,30 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
static int ME_GetTextEx(ME_TextEditor *editor, GETTEXTEX *ex, LPARAM pText)
{
- int nStart, nCount; /* in chars */
+ int nChars;
+ ME_Cursor start;
+
+ if (!ex->cb || !pText) return 0;
if (ex->flags & ~(GT_SELECTION | GT_USECRLF))
FIXME("GETTEXTEX flags 0x%08x not supported\n", ex->flags & ~(GT_SELECTION | GT_USECRLF));
if (ex->flags & GT_SELECTION)
{
- ME_GetSelection(editor, &nStart, &nCount);
- nCount -= nStart;
+ int from, to;
+ int nStartCur = ME_GetSelectionOfs(editor, &from, &to);
+ start = editor->pCursors[nStartCur];
+ nChars = to - from;
}
else
{
- nStart = 0;
- nCount = 0x7fffffff;
+ ME_SetCursorToStart(editor, &start);
+ nChars = INT_MAX;
}
if (ex->codepage == 1200)
{
- nCount = min(nCount, ex->cb / sizeof(WCHAR) - 1);
- return ME_GetTextW(editor, (LPWSTR)pText, nStart, nCount, ex->flags & GT_USECRLF);
+ return ME_GetTextW(editor, (LPWSTR)pText, ex->cb / sizeof(WCHAR) - 1,
+ &start, nChars, ex->flags & GT_USECRLF);
}
else
{
@@ -1888,16 +1902,15 @@ static int ME_GetTextEx(ME_TextEditor *editor, GETTEXTEX *ex, LPARAM pText)
occurs only in richedit 2.0 mode, in which line breaks have only one CR
*/
int crlfmul = (ex->flags & GT_USECRLF) ? 2 : 1;
+ DWORD buflen;
LPWSTR buffer;
- DWORD buflen = ex->cb;
LRESULT rc;
- DWORD flags = 0;
- nCount = min(nCount, ex->cb - 1);
- buffer = heap_alloc((crlfmul*nCount + 1) * sizeof(WCHAR));
+ buflen = min(crlfmul * nChars, ex->cb - 1);
+ buffer = heap_alloc((buflen + 1) * sizeof(WCHAR));
- buflen = ME_GetTextW(editor, buffer, nStart, nCount, ex->flags & GT_USECRLF);
- rc = WideCharToMultiByte(ex->codepage, flags, buffer, buflen+1,
+ nChars = ME_GetTextW(editor, buffer, buflen, &start, nChars, ex->flags & GT_USECRLF);
+ rc = WideCharToMultiByte(ex->codepage, 0, buffer, nChars + 1,
(LPSTR)pText, ex->cb, ex->lpDefaultChar, ex->lpUsedDefChar);
if (rc) rc--; /* do not count 0 terminator */
@@ -1907,13 +1920,16 @@ static int ME_GetTextEx(ME_TextEditor *editor, GETTEXTEX *ex, LPARAM pText)
}
static int ME_GetTextRange(ME_TextEditor *editor, WCHAR *strText,
- int start, int nLen, BOOL unicode)
+ const ME_Cursor *start, int nLen, BOOL unicode)
{
+ if (!strText) return 0;
if (unicode) {
- return ME_GetTextW(editor, strText, start, nLen, 0);
+ return ME_GetTextW(editor, strText, INT_MAX, start, nLen, 0);
} else {
+ int nChars;
WCHAR *p = ALLOC_N_OBJ(WCHAR, nLen+1);
- int nChars = ME_GetTextW(editor, p, start, nLen, 0);
+ if (!p) return 0;
+ nChars = ME_GetTextW(editor, p, nLen, start, nLen, 0);
WideCharToMultiByte(CP_ACP, 0, p, nChars+1, (char *)strText,
nLen+1, NULL, NULL);
FREE_OBJ(p);
@@ -1989,7 +2005,7 @@ static BOOL ME_Paste(ME_TextEditor *editor)
return TRUE;
}
-static BOOL ME_Copy(ME_TextEditor *editor, CHARRANGE *range)
+static BOOL ME_Copy(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
{
LPDATAOBJECT dataObj = NULL;
HRESULT hr = S_OK;
@@ -1998,9 +2014,14 @@ static BOOL ME_Copy(ME_TextEditor *editor, CHARRANGE *range)
return FALSE; /* Copying or Cutting masked text isn't allowed */
if(editor->lpOleCallback)
- hr = IRichEditOleCallback_GetClipboardData(editor->lpOleCallback, range, RECO_COPY, &dataObj);
+ {
+ CHARRANGE range;
+ range.cpMin = ME_GetCursorOfs(start);
+ range.cpMax = range.cpMin + nChars;
+ hr = IRichEditOleCallback_GetClipboardData(editor->lpOleCallback, &range, RECO_COPY, &dataObj);
+ }
if(FAILED(hr) || !dataObj)
- hr = ME_GetDataObject(editor, range, &dataObj);
+ hr = ME_GetDataObject(editor, start, nChars, &dataObj);
if(SUCCEEDED(hr)) {
hr = OleSetClipboard(dataObj);
IDataObject_Release(dataObj);
@@ -2014,14 +2035,14 @@ ME_FilterEvent(ME_TextEditor *editor, UINT msg, WPARAM* wParam, LPARAM* lParam)
{
MSGFILTER msgf;
- if (!editor->hWnd) return FALSE;
+ if (!editor->hWnd || !editor->hwndParent) return FALSE;
msgf.nmhdr.hwndFrom = editor->hWnd;
msgf.nmhdr.idFrom = GetWindowLongW(editor->hWnd, GWLP_ID);
msgf.nmhdr.code = EN_MSGFILTER;
msgf.msg = msg;
msgf.wParam = *wParam;
msgf.lParam = *lParam;
- if (SendMessageW(GetParent(editor->hWnd), WM_NOTIFY, msgf.nmhdr.idFrom, (LPARAM)&msgf))
+ if (SendMessageW(editor->hwndParent, WM_NOTIFY, msgf.nmhdr.idFrom, (LPARAM)&msgf))
return FALSE;
*wParam = msgf.wParam;
*lParam = msgf.lParam;
@@ -2034,24 +2055,28 @@ static void ME_UpdateSelectionLinkAttribute(ME_TextEditor *editor)
{
ME_DisplayItem *startPara, *endPara;
ME_DisplayItem *prev_para;
- int from, to;
+ ME_Cursor *from, *to;
+ ME_Cursor start;
+ int nChars;
if (!editor->AutoURLDetect_bEnable) return;
ME_GetSelection(editor, &from, &to);
/* Find paragraph previous to the one that contains start cursor */
- ME_RunOfsFromCharOfs(editor, from, &startPara, NULL, NULL);
+ startPara = from->pPara;
prev_para = startPara->member.para.prev_para;
if (prev_para->type == diParagraph) startPara = prev_para;
/* Find paragraph that contains end cursor */
- ME_RunOfsFromCharOfs(editor, to, &endPara, NULL, NULL);
- endPara = endPara->member.para.next_para;
+ endPara = to->pPara->member.para.next_para;
- ME_UpdateLinkAttribute(editor,
- startPara->member.para.nCharOfs,
- endPara->member.para.nCharOfs);
+ start.pPara = startPara;
+ start.pRun = ME_FindItemFwd(startPara, diRun);
+ start.nOffset = 0;
+ nChars = endPara->member.para.nCharOfs - startPara->member.para.nCharOfs;
+
+ ME_UpdateLinkAttribute(editor, &start, nChars);
}
static BOOL
@@ -2120,6 +2145,31 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey)
ME_SendRequestResize(editor, FALSE);
return TRUE;
case VK_RETURN:
+ if (editor->bDialogMode)
+ {
+ if (ctrl_is_down)
+ return TRUE;
+
+ if (!(editor->styleFlags & ES_WANTRETURN))
+ {
+ if (editor->hwndParent)
+ {
+ DWORD dw;
+ dw = SendMessageW(editor->hwndParent, DM_GETDEFID, 0, 0);
+ if (HIWORD(dw) == DC_HASDEFID)
+ {
+ HWND hwDefCtrl = GetDlgItem(editor->hwndParent, LOWORD(dw));
+ if (hwDefCtrl)
+ {
+ SendMessageW(editor->hwndParent, WM_NEXTDLGCTL, (WPARAM)hwDefCtrl, TRUE);
+ PostMessageW(hwDefCtrl, WM_KEYDOWN, VK_RETURN, 0);
+ }
+ }
+ }
+ return TRUE;
+ }
+ }
+
if (editor->styleFlags & ES_MULTILINE)
{
ME_Cursor cursor = editor->pCursors[0];
@@ -2133,7 +2183,7 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey)
return TRUE;
}
- ME_GetSelection(editor, &from, &to);
+ ME_GetSelectionOfs(editor, &from, &to);
if (editor->nTextLimit > ME_GetTextLength(editor) - (to-from))
{
if (!editor->bEmulateVersion10) { /* v4.1 */
@@ -2239,6 +2289,14 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey)
return TRUE;
}
break;
+ case VK_ESCAPE:
+ if (editor->bDialogMode && editor->hwndParent)
+ PostMessageW(editor->hwndParent, WM_CLOSE, 0, 0);
+ return TRUE;
+ case VK_TAB:
+ if (editor->bDialogMode && editor->hwndParent)
+ SendMessageW(editor->hwndParent, WM_NEXTDLGCTL, shift_is_down, 0);
+ return TRUE;
case 'A':
if (ctrl_is_down)
{
@@ -2254,14 +2312,16 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey)
case 'X':
if (ctrl_is_down)
{
- CHARRANGE range;
BOOL result;
+ int nOfs, nChars;
+ int nStartCur = ME_GetSelectionOfs(editor, &nOfs, &nChars);
+ ME_Cursor *selStart = &editor->pCursors[nStartCur];
- ME_GetSelection(editor, &range.cpMin, &range.cpMax);
- result = ME_Copy(editor, &range);
+ nChars -= nOfs;
+ result = ME_Copy(editor, selStart, nChars);
if (result && nKey == 'X')
{
- ME_InternalDeleteText(editor, range.cpMin, range.cpMax-range.cpMin, FALSE);
+ ME_InternalDeleteText(editor, selStart, nChars, FALSE);
ME_CommitUndo(editor);
ME_UpdateRepaint(editor);
}
@@ -2334,7 +2394,7 @@ static LRESULT ME_Char(ME_TextEditor *editor, WPARAM charCode,
ME_DisplayItem *para = cursor.pPara;
int from, to;
BOOL ctrl_is_down = GetKeyState(VK_CONTROL) & 0x8000;
- ME_GetSelection(editor, &from, &to);
+ ME_GetSelectionOfs(editor, &from, &to);
if (wstr == '\t' &&
/* v4.1 allows tabs to be inserted with ctrl key down */
!(ctrl_is_down && !editor->bEmulateVersion10))
@@ -2345,7 +2405,7 @@ static LRESULT ME_Char(ME_TextEditor *editor, WPARAM charCode,
para = cursor.pPara;
if (ME_IsSelection(editor) &&
cursor.pRun->member.run.nCharOfs + cursor.nOffset == 0 &&
- to == ME_GetCursorOfs(editor, 0) &&
+ to == ME_GetCursorOfs(&editor->pCursors[0]) &&
para->member.para.prev_para->type == diParagraph)
{
para = para->member.para.prev_para;
@@ -2453,9 +2513,9 @@ static int ME_CalculateClickCount(ME_TextEditor *editor, UINT msg, WPARAM wParam
static BOOL ME_SetCursor(ME_TextEditor *editor)
{
+ ME_Cursor cursor;
POINT pt;
BOOL isExact;
- int offset;
SCROLLBARINFO sbi;
DWORD messagePos = GetMessagePos();
pt.x = (short)LOWORD(messagePos);
@@ -2510,13 +2570,11 @@ static BOOL ME_SetCursor(ME_TextEditor *editor)
ITextHost_TxSetCursor(editor->texthost, hLeft, FALSE);
return TRUE;
}
- offset = ME_CharFromPos(editor, pt.x, pt.y, &isExact);
+ ME_CharFromPos(editor, pt.x, pt.y, &cursor, &isExact);
if (isExact)
{
- ME_Cursor cursor;
ME_Run *run;
- ME_CursorFromCharOfs(editor, offset, &cursor);
run = &cursor.pRun->member.run;
if (run->style->fmt.dwMask & CFM_LINK &&
run->style->fmt.dwEffects & CFE_LINK)
@@ -2530,7 +2588,9 @@ static BOOL ME_SetCursor(ME_TextEditor *editor)
if (ME_IsSelection(editor))
{
int selStart, selEnd;
- ME_GetSelection(editor, &selStart, &selEnd);
+ int offset = ME_GetCursorOfs(&cursor);
+
+ ME_GetSelectionOfs(editor, &selStart, &selEnd);
if (selStart <= offset && selEnd >= offset) {
ITextHost_TxSetCursor(editor->texthost,
LoadCursorW(NULL, (WCHAR*)IDC_ARROW),
@@ -2559,7 +2619,7 @@ static BOOL ME_ShowContextMenu(ME_TextEditor *editor, int x, int y)
int seltype = 0;
if(!editor->lpOleCallback || !editor->hWnd)
return FALSE;
- ME_GetSelection(editor, &selrange.cpMin, &selrange.cpMax);
+ ME_GetSelectionOfs(editor, &selrange.cpMin, &selrange.cpMax);
if(selrange.cpMin == selrange.cpMax)
seltype |= SEL_EMPTY;
else
@@ -2571,7 +2631,7 @@ static BOOL ME_ShowContextMenu(ME_TextEditor *editor, int x, int y)
}
if(SUCCEEDED(IRichEditOleCallback_GetContextMenu(editor->lpOleCallback, seltype, NULL, &selrange, &menu)))
{
- TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, 0, GetParent(editor->hWnd), NULL);
+ TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, 0, editor->hwndParent, NULL);
DestroyMenu(menu);
}
return TRUE;
@@ -2585,8 +2645,11 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
LONG selbarwidth;
ed->hWnd = NULL;
+ ed->hwndParent = NULL;
+ ed->sizeWindow.cx = ed->sizeWindow.cy = 0;
ed->texthost = texthost;
ed->bEmulateVersion10 = bEmulateVersion10;
+ ed->styleFlags = 0;
ITextHost_TxGetPropertyBits(texthost,
(TXTBIT_RICHTEXT|TXTBIT_MULTILINE|
TXTBIT_READONLY|TXTBIT_USEPASSWORD|
@@ -2599,6 +2662,7 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
ES_AUTOHSCROLL|ES_DISABLENOSCROLL);
ed->pBuffer = ME_MakeText();
ed->nZoomNumerator = ed->nZoomDenominator = 0;
+ ed->nAvailWidth = 0; /* wrap to client area */
ME_MakeFirstParagraph(ed);
/* The four cursors are for:
* 0 - The position where the caret is shown
@@ -2608,9 +2672,7 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
*/
ed->nCursors = 4;
ed->pCursors = ALLOC_N_OBJ(ME_Cursor, ed->nCursors);
- ed->pCursors[0].pPara = ed->pBuffer->pFirst->member.para.next_para;
- ed->pCursors[0].pRun = ME_FindItemFwd(ed->pCursors[0].pPara, diRun);
- ed->pCursors[0].nOffset = 0;
+ ME_SetCursorToStart(ed, &ed->pCursors[0]);
ed->pCursors[1] = ed->pCursors[0];
ed->pCursors[2] = ed->pCursors[0];
ed->pCursors[3] = ed->pCursors[1];
@@ -2630,8 +2692,7 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
ed->nUndoMode = umAddToUndo;
ed->nParagraphs = 1;
ed->nLastSelStart = ed->nLastSelEnd = 0;
- ed->pLastSelStartPara = ed->pLastSelEndPara = ME_FindItemFwd(ed->pBuffer->pFirst, diParagraph);
- ed->nAvailWidth = 0; /* wrap to client area */
+ ed->pLastSelStartPara = ed->pLastSelEndPara = ed->pCursors[0].pPara;
ed->bHideSelection = FALSE;
ed->pfnWordBreak = NULL;
ed->lpOleCallback = NULL;
@@ -2639,6 +2700,7 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
ed->mode |= (props & TXTBIT_RICHTEXT) ? TM_RICHTEXT : TM_PLAINTEXT;
ed->AutoURLDetect_bEnable = FALSE;
ed->bHaveFocus = FALSE;
+ ed->bDialogMode = FALSE;
ed->bMouseCaptured = FALSE;
for (i=0; imember.run.style->fmt.dwMask & CFM_LINK)
- && (run->member.run.style->fmt.dwEffects & CFE_LINK))
+ if (cursor.pRun->member.run.style->fmt.dwMask & CFM_LINK &&
+ cursor.pRun->member.run.style->fmt.dwEffects & CFE_LINK)
{ /* The clicked run has CFE_LINK set */
- info.nmhdr.hwndFrom = editor->hWnd;
- info.nmhdr.idFrom = GetWindowLongW(editor->hWnd, GWLP_ID);
+ info.nmhdr.hwndFrom = NULL;
+ info.nmhdr.idFrom = 0;
info.nmhdr.code = EN_LINK;
info.msg = msg;
info.wParam = wParam;
info.lParam = lParam;
- info.chrg.cpMin = ME_CharOfsFromRunOfs(editor, para, run, 0);
- info.chrg.cpMax = info.chrg.cpMin + run->member.run.strText->nLen;
- SendMessageW(GetParent(editor->hWnd), WM_NOTIFY,info.nmhdr.idFrom, (LPARAM)&info);
+ cursor.nOffset = 0;
+ info.chrg.cpMin = ME_GetCursorOfs(&cursor);
+ info.chrg.cpMax = info.chrg.cpMin + cursor.pRun->member.run.strText->nLen;
+ ITextHost_TxNotify(editor->texthost, info.nmhdr.code, &info);
}
}
@@ -2974,8 +3034,6 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
UNSUPPORTED_MSG(EM_SETTABSTOPS)
UNSUPPORTED_MSG(EM_SETTYPOGRAPHYOPTIONS)
UNSUPPORTED_MSG(EM_SETWORDBREAKPROCEX)
- UNSUPPORTED_MSG(WM_STYLECHANGING)
- UNSUPPORTED_MSG(WM_STYLECHANGED)
/* Messages specific to Richedit controls */
@@ -2986,6 +3044,8 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
case WM_GETDLGCODE:
{
UINT code = DLGC_WANTCHARS|DLGC_WANTTAB|DLGC_WANTARROWS|DLGC_HASSETSEL;
+ if (lParam)
+ editor->bDialogMode = TRUE;
if (editor->styleFlags & ES_MULTILINE)
code |= DLGC_WANTMESSAGE;
return code;
@@ -2999,7 +3059,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
UINT from, to;
PUINT pfrom = wParam ? (PUINT)wParam : &from;
PUINT pto = lParam ? (PUINT)lParam : &to;
- ME_GetSelection(editor, (int *)pfrom, (int *)pto);
+ ME_GetSelectionOfs(editor, (int *)pfrom, (int *)pto);
if ((*pfrom|*pto) & 0xFFFF0000)
return -1;
return MAKELONG(*pfrom,*pto);
@@ -3007,7 +3067,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
case EM_EXGETSEL:
{
CHARRANGE *pRange = (CHARRANGE *)lParam;
- ME_GetSelection(editor, &pRange->cpMin, &pRange->cpMax);
+ ME_GetSelectionOfs(editor, &pRange->cpMin, &pRange->cpMax);
TRACE("EM_EXGETSEL = (%d,%d)\n", pRange->cpMin, pRange->cpMax);
return 0;
}
@@ -3194,7 +3254,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
/* If we detect ascii rtf at the start of the string,
* we know it isn't unicode. */
bRtf = (lParam && (!strncmp((char *)lParam, "{\\rtf", 5) ||
- !strncmp((char *)lParam, "{\\urtf}", 6)));
+ !strncmp((char *)lParam, "{\\urtf", 6)));
bUnicode = !bRtf && pStruct->codepage == 1200;
TRACE("EM_SETTEXTEX - %s, flags %d, cp %d\n",
@@ -3203,18 +3263,20 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
bSelection = (pStruct->flags & ST_SELECTION) != 0;
if (bSelection) {
- ME_GetSelection(editor, &from, &to);
+ int nStartCursor = ME_GetSelectionOfs(editor, &from, &to);
style = ME_GetSelectionInsertStyle(editor);
- ME_InternalDeleteText(editor, from, to - from, FALSE);
+ ME_InternalDeleteText(editor, &editor->pCursors[nStartCursor], to - from, FALSE);
} else {
- ME_InternalDeleteText(editor, 0, ME_GetTextLength(editor), FALSE);
+ ME_Cursor start;
+ ME_SetCursorToStart(editor, &start);
+ ME_InternalDeleteText(editor, &start, ME_GetTextLength(editor), FALSE);
style = editor->pBuffer->pDefaultStyle;
}
if (bRtf) {
ME_StreamInRTFString(editor, bSelection, (char *)lParam);
if (bSelection) {
- /* FIXME: The length returned is doesn't include the rtf control
+ /* FIXME: The length returned doesn't include the rtf control
* characters, only the actual text. */
len = lParam ? strlen((char *)lParam) : 0;
}
@@ -3223,14 +3285,17 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
wszText = lParam ? ME_ToUnicode(bUnicode, (void *)lParam) : NULL;
len = wszText ? lstrlenW(wszText) : 0;
ME_InsertTextFromCursor(editor, 0, wszText, len, style);
+ ME_EndToUnicode(bUnicode, wszText);
}
if (bSelection) {
ME_ReleaseStyle(style);
ME_UpdateSelectionLinkAttribute(editor);
} else {
+ ME_Cursor cursor;
len = 1;
- ME_UpdateLinkAttribute(editor, 0, -1);
+ ME_SetCursorToStart(editor, &cursor);
+ ME_UpdateLinkAttribute(editor, &cursor, INT_MAX);
}
ME_CommitUndo(editor);
if (!(pStruct->flags & ST_KEEPUNDO))
@@ -3307,17 +3372,17 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
if (editor->mode & TM_PLAINTEXT)
ME_SetDefaultCharFormat(editor, p);
else {
- ME_SetCharFormat(editor, 0, ME_GetTextLength(editor), p);
+ ME_Cursor start;
+ ME_SetCursorToStart(editor, &start);
+ ME_SetCharFormat(editor, &start, NULL, p);
editor->nModifyStep = 1;
}
} else if (editor->mode & TM_PLAINTEXT) {
return 0;
} else {
- int from, to;
- ME_GetSelection(editor, &from, &to);
- bRepaint = (from != to);
+ bRepaint = ME_IsSelection(editor);
ME_SetSelectionCharFormat(editor, p);
- if (from != to) editor->nModifyStep = 1;
+ if (bRepaint) editor->nModifyStep = 1;
}
ME_CommitUndo(editor);
if (bRepaint)
@@ -3396,23 +3461,23 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
case WM_CLEAR:
{
int from, to;
- ME_GetSelection(editor, &from, &to);
- ME_InternalDeleteText(editor, from, to-from, FALSE);
+ int nStartCursor = ME_GetSelectionOfs(editor, &from, &to);
+ ME_InternalDeleteText(editor, &editor->pCursors[nStartCursor], to-from, FALSE);
ME_CommitUndo(editor);
ME_UpdateRepaint(editor);
return 0;
}
case EM_REPLACESEL:
{
- int from, to;
+ int from, to, nStartCursor;
ME_Style *style;
LPWSTR wszText = lParam ? ME_ToUnicode(unicode, (void *)lParam) : NULL;
size_t len = wszText ? lstrlenW(wszText) : 0;
TRACE("EM_REPLACESEL - %s\n", debugstr_w(wszText));
- ME_GetSelection(editor, &from, &to);
+ nStartCursor = ME_GetSelectionOfs(editor, &from, &to);
style = ME_GetSelectionInsertStyle(editor);
- ME_InternalDeleteText(editor, from, to-from, FALSE);
+ ME_InternalDeleteText(editor, &editor->pCursors[nStartCursor], to-from, FALSE);
ME_InsertTextFromCursor(editor, 0, wszText, len, style);
ME_ReleaseStyle(style);
/* drop temporary style if line end */
@@ -3439,6 +3504,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
CHARFORMAT2W fmt;
HDC hDC;
BOOL bRepaint = LOWORD(lParam);
+ ME_Cursor start;
if (!wParam)
wParam = (WPARAM)GetStockObject(SYSTEM_FONT);
@@ -3446,7 +3512,8 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
hDC = ITextHost_TxGetDC(editor->texthost);
ME_CharFormatFromLogFont(hDC, &lf, &fmt);
ITextHost_TxReleaseDC(editor->texthost, hDC);
- ME_SetCharFormat(editor, 0, ME_GetTextLength(editor), &fmt);
+ ME_SetCursorToStart(editor, &start);
+ ME_SetCharFormat(editor, &start, NULL, &fmt);
ME_SetDefaultCharFormat(editor, &fmt);
ME_CommitUndo(editor);
@@ -3459,11 +3526,14 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
}
case WM_SETTEXT:
{
- ME_InternalDeleteText(editor, 0, ME_GetTextLength(editor), FALSE);
+ ME_Cursor cursor;
+ ME_SetCursorToStart(editor, &cursor);
+ ME_InternalDeleteText(editor, &cursor, ME_GetTextLength(editor), FALSE);
if (lParam)
{
TRACE("WM_SETTEXT lParam==%lx\n",lParam);
- if (!unicode && !strncmp((char *)lParam, "{\\rtf", 5))
+ if (!strncmp((char *)lParam, "{\\rtf", 5) ||
+ !strncmp((char *)lParam, "{\\urtf", 6))
{
/* Undocumented: WM_SETTEXT supports RTF text */
ME_StreamInRTFString(editor, 0, (char *)lParam);
@@ -3492,7 +3562,8 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
}
else
TRACE("WM_SETTEXT - NULL\n");
- ME_UpdateLinkAttribute(editor, 0, -1);
+ ME_SetCursorToStart(editor, &cursor);
+ ME_UpdateLinkAttribute(editor, &cursor, INT_MAX);
ME_SetSelection(editor, 0, 0);
editor->nModifyStep = 0;
ME_CommitUndo(editor);
@@ -3515,12 +3586,13 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
case WM_CUT:
case WM_COPY:
{
- CHARRANGE range;
- ME_GetSelection(editor, &range.cpMin, &range.cpMax);
+ int nFrom, nTo, nStartCur = ME_GetSelectionOfs(editor, &nFrom, &nTo);
+ int nChars = nTo - nFrom;
+ ME_Cursor *selStart = &editor->pCursors[nStartCur];
- if (ME_Copy(editor, &range) && msg == WM_CUT)
+ if (ME_Copy(editor, selStart, nChars) && msg == WM_CUT)
{
- ME_InternalDeleteText(editor, range.cpMin, range.cpMax-range.cpMin, FALSE);
+ ME_InternalDeleteText(editor, selStart, nChars, FALSE);
ME_CommitUndo(editor);
ME_UpdateRepaint(editor);
}
@@ -3540,67 +3612,51 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
case WM_GETTEXT:
{
GETTEXTEX ex;
- LRESULT rc;
- LPSTR bufferA = NULL;
- LPWSTR bufferW = NULL;
-
- if (unicode)
- bufferW = heap_alloc((wParam + 2) * sizeof(WCHAR));
- else
- bufferA = heap_alloc(wParam + 2);
-
- ex.cb = (wParam + 2) * (unicode ? sizeof(WCHAR) : sizeof(CHAR));
+ ex.cb = wParam * (unicode ? sizeof(WCHAR) : sizeof(CHAR));
ex.flags = GT_USECRLF;
ex.codepage = unicode ? 1200 : CP_ACP;
ex.lpDefaultChar = NULL;
ex.lpUsedDefChar = NULL;
-
- rc = ME_GetTextEx(editor, &ex, unicode ? (LPARAM)bufferW : (LPARAM)bufferA);
-
- if (unicode)
- {
- memcpy((LPWSTR)lParam, bufferW, wParam * sizeof(WCHAR));
- if (strlenW(bufferW) >= wParam) rc = 0;
- }
- else
- {
- memcpy((LPSTR)lParam, bufferA, wParam);
- if (strlen(bufferA) >= wParam) rc = 0;
- }
- heap_free(bufferA);
- heap_free(bufferW);
- return rc;
+ return ME_GetTextEx(editor, &ex, lParam);
}
case EM_GETTEXTEX:
return ME_GetTextEx(editor, (GETTEXTEX*)wParam, lParam);
case EM_GETSELTEXT:
{
- int from, to;
- ME_GetSelection(editor, &from, &to);
+ int nFrom, nTo, nStartCur = ME_GetSelectionOfs(editor, &nFrom, &nTo);
+ ME_Cursor *from = &editor->pCursors[nStartCur];
return ME_GetTextRange(editor, (WCHAR *)lParam, from,
- to - from, unicode);
+ nTo - nFrom, unicode);
}
case EM_GETSCROLLPOS:
{
POINT *point = (POINT *)lParam;
point->x = editor->horz_si.nPos;
point->y = editor->vert_si.nPos;
+ /* 16-bit scaled value is returned as stored in scrollinfo */
+ if (editor->horz_si.nMax > 0xffff)
+ point->x = MulDiv(point->x, 0xffff, editor->horz_si.nMax);
+ if (editor->vert_si.nMax > 0xffff)
+ point->y = MulDiv(point->y, 0xffff, editor->vert_si.nMax);
return 1;
}
case EM_GETTEXTRANGE:
{
TEXTRANGEW *rng = (TEXTRANGEW *)lParam;
- int start = rng->chrg.cpMin;
- int end = rng->chrg.cpMax;
+ ME_Cursor start;
+ int nStart = rng->chrg.cpMin;
+ int nEnd = rng->chrg.cpMax;
int textlength = ME_GetTextLength(editor);
- TRACE("EM_GETTEXTRANGE min=%d max=%d unicode=%d emul1.0=%d length=%d\n",
- rng->chrg.cpMin, rng->chrg.cpMax, unicode,
- editor->bEmulateVersion10, ME_GetTextLength(editor));
- if (start < 0) return 0;
- if ((start == 0 && end == -1) || end > textlength)
- end = textlength;
- if (start >= end) return 0;
- return ME_GetTextRange(editor, rng->lpstrText, start, end - start, unicode);
+
+ TRACE("EM_GETTEXTRANGE min=%d max=%d unicode=%d textlength=%d\n",
+ rng->chrg.cpMin, rng->chrg.cpMax, unicode, textlength);
+ if (nStart < 0) return 0;
+ if ((nStart == 0 && nEnd == -1) || nEnd > textlength)
+ nEnd = textlength;
+ if (nStart >= nEnd) return 0;
+
+ ME_CursorFromCharOfs(editor, nStart, &start);
+ return ME_GetTextRange(editor, rng->lpstrText, &start, nEnd - nStart, unicode);
}
case EM_GETLINE:
{
@@ -3686,14 +3742,14 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
case EM_LINEFROMCHAR:
{
if (wParam == -1)
- return ME_RowNumberFromCharOfs(editor, ME_GetCursorOfs(editor, 1));
+ return ME_RowNumberFromCharOfs(editor, ME_GetCursorOfs(&editor->pCursors[1]));
else
return ME_RowNumberFromCharOfs(editor, wParam);
}
case EM_EXLINEFROMCHAR:
{
if (lParam == -1)
- return ME_RowNumberFromCharOfs(editor, ME_GetCursorOfs(editor,1));
+ return ME_RowNumberFromCharOfs(editor, ME_GetCursorOfs(&editor->pCursors[1]));
else
return ME_RowNumberFromCharOfs(editor, lParam);
}
@@ -3809,7 +3865,14 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
case EM_SETZOOM:
return ME_SetZoom(editor, wParam, lParam);
case EM_CHARFROMPOS:
- return ME_CharFromPos(editor, ((POINTL *)lParam)->x, ((POINTL *)lParam)->y, NULL);
+ {
+ ME_Cursor cursor;
+ if (ME_CharFromPos(editor, ((POINTL *)lParam)->x, ((POINTL *)lParam)->y,
+ &cursor, NULL))
+ return ME_GetCursorOfs(&cursor);
+ else
+ return -1;
+ }
case EM_POSFROMCHAR:
{
ME_DisplayItem *pPara, *pRun;
@@ -3841,23 +3904,29 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
}
case WM_CREATE:
{
- SCROLLINFO si;
+ INT max;
ME_SetDefaultFormatRect(editor);
- si.cbSize = sizeof(si);
- si.fMask = SIF_PAGE | SIF_RANGE;
+ max = (editor->styleFlags & ES_DISABLENOSCROLL) ? 1 : 0;
+ if (~editor->styleFlags & ES_DISABLENOSCROLL || editor->styleFlags & WS_VSCROLL)
+ ITextHost_TxSetScrollRange(editor->texthost, SB_VERT, 0, max, TRUE);
+
+ if (~editor->styleFlags & ES_DISABLENOSCROLL || editor->styleFlags & WS_HSCROLL)
+ ITextHost_TxSetScrollRange(editor->texthost, SB_HORZ, 0, max, TRUE);
+
if (editor->styleFlags & ES_DISABLENOSCROLL)
- si.fMask |= SIF_DISABLENOSCROLL;
- si.nMax = (si.fMask & SIF_DISABLENOSCROLL) ? 1 : 0;
- si.nMin = 0;
- si.nPage = 0;
- if (editor->hWnd) {
- SetScrollInfo(editor->hWnd, SB_VERT, &si, TRUE);
- SetScrollInfo(editor->hWnd, SB_HORZ, &si, TRUE);
- } else {
- ITextHost_TxSetScrollRange(editor->texthost, SB_VERT, si.nMin, si.nMax, TRUE);
- ITextHost_TxSetScrollRange(editor->texthost, SB_HORZ, si.nMin, si.nMax, TRUE);
+ {
+ if (editor->styleFlags & WS_VSCROLL)
+ {
+ ITextHost_TxEnableScrollBar(editor->texthost, SB_VERT, ESB_DISABLE_BOTH);
+ ITextHost_TxShowScrollBar(editor->texthost, SB_VERT, TRUE);
+ }
+ if (editor->styleFlags & WS_HSCROLL)
+ {
+ ITextHost_TxEnableScrollBar(editor->texthost, SB_HORZ, ESB_DISABLE_BOTH);
+ ITextHost_TxShowScrollBar(editor->texthost, SB_HORZ, TRUE);
+ }
}
ME_CommitUndo(editor);
@@ -4004,15 +4073,10 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
case SB_THUMBTRACK:
case SB_THUMBPOSITION:
{
- SCROLLINFO sbi;
- sbi.cbSize = sizeof(sbi);
- sbi.fMask = SIF_TRACKPOS;
- /* Try to get 32-bit track position value. */
- if (!GetScrollInfo(editor->hWnd, SB_HORZ, &sbi))
- /* GetScrollInfo failed, settle for 16-bit value in wParam. */
- sbi.nTrackPos = HIWORD(wParam);
-
- ME_HScrollAbs(editor, sbi.nTrackPos);
+ int pos = HIWORD(wParam);
+ if (editor->horz_si.nMax > 0xffff)
+ pos = MulDiv(pos, editor->horz_si.nMax, 0xffff);
+ ME_HScrollAbs(editor, pos);
break;
}
}
@@ -4056,15 +4120,10 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
case SB_THUMBTRACK:
case SB_THUMBPOSITION:
{
- SCROLLINFO sbi;
- sbi.cbSize = sizeof(sbi);
- sbi.fMask = SIF_TRACKPOS;
- /* Try to get 32-bit track position value. */
- if (!GetScrollInfo(editor->hWnd, SB_VERT, &sbi))
- /* GetScrollInfo failed, settle for 16-bit value in wParam. */
- sbi.nTrackPos = HIWORD(wParam);
-
- ME_VScrollAbs(editor, sbi.nTrackPos);
+ int pos = HIWORD(wParam);
+ if (editor->vert_si.nMax > 0xffff)
+ pos = MulDiv(pos, editor->vert_si.nMax, 0xffff);
+ ME_VScrollAbs(editor, pos);
break;
}
}
@@ -4186,7 +4245,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
return 0;
case WM_IME_STARTCOMPOSITION:
{
- editor->imeStartIndex=ME_GetCursorOfs(editor,0);
+ editor->imeStartIndex=ME_GetCursorOfs(&editor->pCursors[0]);
ME_DeleteSelection(editor);
ME_CommitUndo(editor);
ME_UpdateRepaint(editor);
@@ -4350,7 +4409,7 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
ITextHost *texthost;
TRACE("WM_NCCREATE: hWnd %p style 0x%08x\n", hWnd, pcs->style);
- texthost = ME_CreateTextHost(hWnd, FALSE);
+ texthost = ME_CreateTextHost(hWnd, pcs, FALSE);
return texthost != NULL;
}
else if (msg != WM_NCDESTROY)
@@ -4480,7 +4539,7 @@ LRESULT WINAPI RichEdit10ANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM
CREATESTRUCTW *pcs = (CREATESTRUCTW *)lParam;
TRACE("WM_NCCREATE: hWnd %p style 0x%08x\n", hWnd, pcs->style);
- texthost = ME_CreateTextHost(hWnd, TRUE);
+ texthost = ME_CreateTextHost(hWnd, pcs, TRUE);
return texthost != NULL;
}
return RichEditANSIWndProc(hWnd, msg, wParam, lParam);
@@ -4491,81 +4550,71 @@ void ME_SendOldNotify(ME_TextEditor *editor, int nCode)
ITextHost_TxNotify(editor->texthost, nCode, NULL);
}
-int ME_CountParagraphsBetween(ME_TextEditor *editor, int from, int to)
+/* Fill buffer with srcChars unicode characters from the start cursor.
+ *
+ * buffer: destination buffer
+ * buflen: length of buffer in characters excluding the NULL terminator.
+ * start: start of editor text to copy into buffer.
+ * srcChars: Number of characters to use from the editor text.
+ * bCRLF: if true, replaces all end of lines with \r\n pairs.
+ *
+ * returns the number of characters written excluding the NULL terminator.
+ *
+ * The written text is always NULL terminated.
+ */
+int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int buflen,
+ const ME_Cursor *start, int srcChars, BOOL bCRLF)
{
- ME_DisplayItem *item = ME_FindItemFwd(editor->pBuffer->pFirst, diParagraph);
- int i = 0;
-
- while(item && item->member.para.next_para->member.para.nCharOfs <= from)
- item = item->member.para.next_para;
- if (!item)
- return 0;
- while(item && item->member.para.next_para->member.para.nCharOfs <= to) {
- item = item->member.para.next_para;
- i++;
- }
- return i;
-}
-
-
-int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int nStart,
- int nChars, int bCRLF)
-{
- ME_DisplayItem *pRun;
- int nOffset, nWritten = 0;
- WCHAR *pStart = buffer;
-
- ME_RunOfsFromCharOfs(editor, nStart, NULL, &pRun, &nOffset);
+ ME_DisplayItem *pRun, *pNextRun;
+ const WCHAR *pStart = buffer;
+ const WCHAR cr_lf[] = {'\r', '\n', 0};
+ const WCHAR *str;
+ int nLen;
/* bCRLF flag is only honored in 2.0 and up. 1.0 must always return text verbatim */
if (editor->bEmulateVersion10) bCRLF = 0;
- while (nChars && pRun)
+ pRun = start->pRun;
+ assert(pRun);
+ pNextRun = ME_FindItemFwd(pRun, diRun);
+
+ nLen = pRun->member.run.strText->nLen - start->nOffset;
+ str = pRun->member.run.strText->szData + start->nOffset;
+
+ /* No '\r' is appended to the last paragraph. */
+ while (srcChars && buflen && pNextRun)
{
- int nLen;
+ int nFlags = pRun->member.run.nFlags;
- if (pRun->member.run.nFlags & MERF_ENDCELL &&
- pRun->member.run.nFlags & MERF_ENDPARA)
+ if (bCRLF && nFlags & MERF_ENDPARA && ~nFlags & MERF_ENDCELL)
{
- *buffer = '\t';
- nLen = 1;
- } else if (pRun->member.run.nFlags & MERF_ENDPARA) {
- if (!ME_FindItemFwd(pRun, diRun)) {
- /* No '\r' is appended to the last paragraph. */
- nLen = 0;
- } else if (bCRLF && nChars == 1) {
- nLen = 0;
- nChars = 0;
- } else {
- WCHAR cr_lf[] = {'\r', '\n', 0};
- WCHAR *szData;
-
- if (bCRLF)
- {
- nLen = 2;
- szData = cr_lf;
- } else {
- nLen = pRun->member.run.strText->nLen;
- szData = pRun->member.run.strText->szData;
- }
- nLen = min(nChars, nLen - nOffset);
- CopyMemory(buffer, szData + nOffset, sizeof(WCHAR) * nLen);
- }
+ if (buflen == 1) break;
+ /* FIXME: native fails to reduce srcChars here for WM_GETTEXT or
+ * EM_GETTEXTEX, however, this is done for copying text which
+ * also uses this function. */
+ srcChars -= min(nLen, srcChars);
+ nLen = 2;
+ str = cr_lf;
} else {
- nLen = min(nChars, pRun->member.run.strText->nLen - nOffset);
- CopyMemory(buffer, pRun->member.run.strText->szData + nOffset,
- sizeof(WCHAR) * nLen);
+ nLen = min(nLen, srcChars);
+ srcChars -= nLen;
}
- nChars -= nLen;
- nWritten += nLen;
- buffer += nLen;
- nOffset = 0;
- pRun = ME_FindItemFwd(pRun, diRun);
+ nLen = min(nLen, buflen);
+ buflen -= nLen;
+
+ CopyMemory(buffer, str, sizeof(WCHAR) * nLen);
+
+ buffer += nLen;
+
+ pRun = pNextRun;
+ pNextRun = ME_FindItemFwd(pRun, diRun);
+
+ nLen = pRun->member.run.strText->nLen;
+ str = pRun->member.run.strText->szData;
}
*buffer = 0;
- TRACE("nWritten=%d, actual=%d\n", nWritten, buffer-pStart);
- return nWritten;
+ return buffer - pStart;
}
static BOOL ME_RegisterEditorClass(HINSTANCE hInstance)
@@ -4585,9 +4634,9 @@ static BOOL ME_RegisterEditorClass(HINSTANCE hInstance)
if (is_version_nt())
{
- wcW.lpszClassName = RichEdit20W;
+ wcW.lpszClassName = RICHEDIT_CLASS20W;
if (!RegisterClassW(&wcW)) return FALSE;
- wcW.lpszClassName = RichEdit50W;
+ wcW.lpszClassName = MSFTEDIT_CLASS;
if (!RegisterClassW(&wcW)) return FALSE;
}
else
@@ -4608,7 +4657,7 @@ static BOOL ME_RegisterEditorClass(HINSTANCE hInstance)
wcA.hCursor = LoadCursorW(NULL, MAKEINTRESOURCEW(IDC_IBEAM));
wcA.hbrBackground = GetStockObject(NULL_BRUSH);
wcA.lpszMenuName = NULL;
- wcA.lpszClassName = "RichEdit20A";
+ wcA.lpszClassName = RICHEDIT_CLASS20A;
if (!RegisterClassA(&wcA)) return FALSE;
wcA.lpszClassName = "RichEdit50A";
if (!RegisterClassA(&wcA)) return FALSE;
@@ -4688,145 +4737,135 @@ static BOOL isurlspecial(WCHAR c)
* or one of the following special characters: *|/\+%#@ and must consist entirely
* of the characters allowed to start the URL, plus : (colon) which may occur
* at most once, and not at either end.
- *
- * sel_max == -1 indicates scan to end of text.
*/
-static BOOL ME_FindNextURLCandidate(ME_TextEditor *editor, int sel_min, int sel_max,
- int * candidate_min, int * candidate_max)
+static BOOL ME_FindNextURLCandidate(ME_TextEditor *editor,
+ const ME_Cursor *start,
+ int nChars,
+ ME_Cursor *candidate_min,
+ ME_Cursor *candidate_max)
{
- ME_DisplayItem * item;
- ME_DisplayItem * para;
- int nStart;
+ ME_Cursor cursor = *start;
BOOL foundColon = FALSE;
+ BOOL candidateStarted = FALSE;
WCHAR lastAcceptedChar = '\0';
- TRACE("sel_min = %d sel_max = %d\n", sel_min, sel_max);
-
- *candidate_min = *candidate_max = -1;
- ME_RunOfsFromCharOfs(editor, sel_min, ¶, &item, &nStart);
- TRACE("nStart = %d\n", nStart);
- if (sel_max == -1) sel_max = ME_GetTextLength(editor);
- while (item && para->member.para.nCharOfs + item->member.run.nCharOfs + nStart < sel_max)
+ while (nChars > 0)
{
- ME_DisplayItem * next_item;
+ WCHAR *strStart = cursor.pRun->member.run.strText->szData;
+ WCHAR *str = strStart + cursor.nOffset;
+ int nLen = cursor.pRun->member.run.strText->nLen - cursor.nOffset;
+ nChars -= nLen;
- if (!(item->member.run.nFlags & MERF_ENDPARA)) {
+ if (~cursor.pRun->member.run.nFlags & MERF_ENDPARA)
+ {
/* Find start of candidate */
- if (*candidate_min == -1) {
- while (nStart < item->member.run.strText->nLen &&
- !(isalnumW(item->member.run.strText->szData[nStart]) ||
- isurlspecial(item->member.run.strText->szData[nStart]))) {
- nStart++;
- }
- if (nStart < item->member.run.strText->nLen &&
- (isalnumW(item->member.run.strText->szData[nStart]) ||
- isurlspecial(item->member.run.strText->szData[nStart]))) {
- *candidate_min = para->member.para.nCharOfs + item->member.run.nCharOfs + nStart;
- lastAcceptedChar = item->member.run.strText->szData[nStart];
- nStart++;
+ if (!candidateStarted)
+ {
+ while (nLen)
+ {
+ nLen--;
+ if (isalnumW(*str) || isurlspecial(*str))
+ {
+ cursor.nOffset = str - strStart;
+ *candidate_min = cursor;
+ candidateStarted = TRUE;
+ lastAcceptedChar = *str++;
+ break;
+ }
+ str++;
}
}
/* Find end of candidate */
- if (*candidate_min >= 0) {
- while (nStart < item->member.run.strText->nLen &&
- (isalnumW(item->member.run.strText->szData[nStart]) ||
- isurlspecial(item->member.run.strText->szData[nStart]) ||
- (!foundColon && item->member.run.strText->szData[nStart] == ':') )) {
- if (item->member.run.strText->szData[nStart] == ':') foundColon = TRUE;
- lastAcceptedChar = item->member.run.strText->szData[nStart];
- nStart++;
- }
- if (nStart < item->member.run.strText->nLen &&
- !(isalnumW(item->member.run.strText->szData[nStart]) ||
- isurlspecial(item->member.run.strText->szData[nStart]) )) {
- *candidate_max = para->member.para.nCharOfs + item->member.run.nCharOfs + nStart;
- nStart++;
- if (lastAcceptedChar == ':') (*candidate_max)--;
- return TRUE;
+ if (candidateStarted) {
+ while (nLen)
+ {
+ nLen--;
+ if (*str == ':' && !foundColon) {
+ foundColon = TRUE;
+ } else if (!isalnumW(*str) && !isurlspecial(*str)) {
+ cursor.nOffset = str - strStart;
+ if (lastAcceptedChar == ':')
+ ME_MoveCursorChars(editor, &cursor, -1);
+ *candidate_max = cursor;
+ return TRUE;
+ }
+ lastAcceptedChar = *str++;
}
}
} else {
/* End of paragraph: skip it if before candidate span, or terminates
current active span */
- if (*candidate_min >= 0) {
- *candidate_max = para->member.para.nCharOfs + item->member.run.nCharOfs;
- if (lastAcceptedChar == ':') (*candidate_max)--;
+ if (candidateStarted) {
+ if (lastAcceptedChar == ':')
+ ME_MoveCursorChars(editor, &cursor, -1);
+ *candidate_max = cursor;
return TRUE;
}
}
/* Reaching this point means no span was found, so get next span */
- next_item = ME_FindItemFwd(item, diRun);
- if (!next_item) {
- if (*candidate_min >= 0) {
+ if (!ME_NextRun(&cursor.pPara, &cursor.pRun)) {
+ if (candidateStarted) {
/* There are no further runs, so take end of text as end of candidate */
- *candidate_max = para->member.para.nCharOfs + item->member.run.nCharOfs + nStart;
- if (lastAcceptedChar == ':') (*candidate_max)--;
+ cursor.nOffset = str - strStart;
+ if (lastAcceptedChar == ':')
+ ME_MoveCursorChars(editor, &cursor, -1);
+ *candidate_max = cursor;
return TRUE;
}
+ *candidate_max = *candidate_min = cursor;
+ return FALSE;
}
- item = next_item;
- para = ME_GetParagraph(item);
- nStart = 0;
+ cursor.nOffset = 0;
}
- if (item) {
- if (*candidate_min >= 0) {
- /* There are no further runs, so take end of text as end of candidate */
- *candidate_max = para->member.para.nCharOfs + item->member.run.nCharOfs + nStart;
- if (lastAcceptedChar == ':') (*candidate_max)--;
- return TRUE;
- }
+ if (candidateStarted) {
+ /* There are no further runs, so take end of text as end of candidate */
+ if (lastAcceptedChar == ':')
+ ME_MoveCursorChars(editor, &cursor, -1);
+ *candidate_max = cursor;
+ return TRUE;
}
+ *candidate_max = *candidate_min = cursor;
return FALSE;
}
/**
* This proc evaluates the selection and returns TRUE if it can be considered an URL
*/
-static BOOL ME_IsCandidateAnURL(ME_TextEditor *editor, int sel_min, int sel_max)
+static BOOL ME_IsCandidateAnURL(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
{
+#define MAX_PREFIX_LEN 9
struct prefix_s {
- const char *text;
+ const WCHAR text[MAX_PREFIX_LEN];
int length;
- } prefixes[12] = {
- /* Code below depends on these being in decreasing length order! */
- {"prospero:", 10},
- {"telnet:", 8},
- {"gopher:", 8},
- {"mailto:", 8},
- {"https:", 7},
- {"file:", 6},
- {"news:", 6},
- {"wais:", 6},
- {"nntp:", 6},
- {"http:", 5},
- {"www.", 5},
- {"ftp:", 5},
+ }prefixes[] = {
+ {{'p','r','o','s','p','e','r','o',':'}, 9},
+ {{'t','e','l','n','e','t',':'}, 7},
+ {{'g','o','p','h','e','r',':'}, 7},
+ {{'m','a','i','l','t','o',':'}, 7},
+ {{'h','t','t','p','s',':'}, 6},
+ {{'f','i','l','e',':'}, 5},
+ {{'n','e','w','s',':'}, 5},
+ {{'w','a','i','s',':'}, 5},
+ {{'n','n','t','p',':'}, 5},
+ {{'h','t','t','p',':'}, 5},
+ {{'w','w','w','.'}, 4},
+ {{'f','t','p',':'}, 4},
};
- LPWSTR bufferW = NULL;
- WCHAR bufW[32];
+ WCHAR bufferW[MAX_PREFIX_LEN + 1];
unsigned int i;
- if (sel_max == -1) sel_max = ME_GetTextLength(editor);
- assert(sel_min <= sel_max);
- for (i = 0; i < sizeof(prefixes) / sizeof(struct prefix_s); i++)
+ ME_GetTextW(editor, bufferW, MAX_PREFIX_LEN, start, nChars, 0);
+ for (i = 0; i < sizeof(prefixes) / sizeof(*prefixes); i++)
{
- if (sel_max - sel_min < prefixes[i].length) continue;
- if (bufferW == NULL) {
- bufferW = heap_alloc((sel_max - sel_min + 1) * sizeof(WCHAR));
- }
- ME_GetTextW(editor, bufferW, sel_min, min(sel_max - sel_min, lstrlenA(prefixes[i].text)), 0);
- MultiByteToWideChar(CP_ACP, 0, prefixes[i].text, -1, bufW, 32);
- if (!lstrcmpW(bufW, bufferW))
- {
- heap_free(bufferW);
+ if (nChars < prefixes[i].length) continue;
+ if (!memcmp(prefixes[i].text, bufferW, prefixes[i].length * sizeof(WCHAR)))
return TRUE;
- }
}
- heap_free(bufferW);
return FALSE;
+#undef MAX_PREFIX_LEN
}
/**
@@ -4835,53 +4874,48 @@ static BOOL ME_IsCandidateAnURL(ME_TextEditor *editor, int sel_min, int sel_max)
* their proper CFE_LINK attributes set or unset. If the CFE_LINK attribute is
* not what it is supposed to be, this proc sets or unsets it as appropriate.
*
+ * Since this function can cause runs to be split, do not depend on the value
+ * of the start cursor at the end of the function.
+ *
+ * nChars may be set to INT_MAX to update to the end of the text.
+ *
* Returns TRUE if at least one section was modified.
*/
-static BOOL ME_UpdateLinkAttribute(ME_TextEditor *editor, int sel_min, int sel_max)
+static BOOL ME_UpdateLinkAttribute(ME_TextEditor *editor, ME_Cursor *start, int nChars)
{
BOOL modified = FALSE;
- int cMin, cMax;
+ ME_Cursor startCur = *start;
if (!editor->AutoURLDetect_bEnable) return FALSE;
- if (sel_max == -1) sel_max = ME_GetTextLength(editor);
do
{
- int beforeURL[2];
- int inURL[2];
CHARFORMAT2W link;
+ ME_Cursor candidateStart, candidateEnd;
- if (ME_FindNextURLCandidate(editor, sel_min, sel_max, &cMin, &cMax))
+ if (ME_FindNextURLCandidate(editor, &startCur, nChars,
+ &candidateStart, &candidateEnd))
{
/* Section before candidate is not an URL */
- beforeURL[0] = sel_min;
- beforeURL[1] = cMin;
+ int cMin = ME_GetCursorOfs(&candidateStart);
+ int cMax = ME_GetCursorOfs(&candidateEnd);
- if (ME_IsCandidateAnURL(editor, cMin, cMax))
- {
- inURL[0] = cMin; inURL[1] = cMax;
- }
- else
- {
- beforeURL[1] = cMax;
- inURL[0] = inURL[1] = -1;
- }
- sel_min = cMax;
+ if (!ME_IsCandidateAnURL(editor, &candidateStart, cMax - cMin))
+ candidateStart = candidateEnd;
+ nChars -= cMax - ME_GetCursorOfs(&startCur);
}
else
{
/* No more candidates until end of selection */
- beforeURL[0] = sel_min;
- beforeURL[1] = sel_max;
- inURL[0] = inURL[1] = -1;
- sel_min = sel_max;
+ nChars = 0;
}
- if (beforeURL[0] < beforeURL[1])
+ if (startCur.pRun != candidateStart.pRun ||
+ startCur.nOffset != candidateStart.nOffset)
{
/* CFE_LINK effect should be consistently unset */
link.cbSize = sizeof(link);
- ME_GetCharFormat(editor, beforeURL[0], beforeURL[1], &link);
+ ME_GetCharFormat(editor, &startCur, &candidateStart, &link);
if (!(link.dwMask & CFM_LINK) || (link.dwEffects & CFE_LINK))
{
/* CFE_LINK must be unset from this range */
@@ -4889,15 +4923,24 @@ static BOOL ME_UpdateLinkAttribute(ME_TextEditor *editor, int sel_min, int sel_m
link.cbSize = sizeof(link);
link.dwMask = CFM_LINK;
link.dwEffects = 0;
- ME_SetCharFormat(editor, beforeURL[0], beforeURL[1] - beforeURL[0], &link);
+ ME_SetCharFormat(editor, &startCur, &candidateStart, &link);
+ /* Update candidateEnd since setting character formats may split
+ * runs, which can cause a cursor to be at an invalid offset within
+ * a split run. */
+ while (candidateEnd.nOffset >= candidateEnd.pRun->member.run.strText->nLen)
+ {
+ candidateEnd.nOffset -= candidateEnd.pRun->member.run.strText->nLen;
+ candidateEnd.pRun = ME_FindItemFwd(candidateEnd.pRun, diRun);
+ }
modified = TRUE;
}
}
- if (inURL[0] < inURL[1])
+ if (candidateStart.pRun != candidateEnd.pRun ||
+ candidateStart.nOffset != candidateEnd.nOffset)
{
/* CFE_LINK effect should be consistently set */
link.cbSize = sizeof(link);
- ME_GetCharFormat(editor, inURL[0], inURL[1], &link);
+ ME_GetCharFormat(editor, &candidateStart, &candidateEnd, &link);
if (!(link.dwMask & CFM_LINK) || !(link.dwEffects & CFE_LINK))
{
/* CFE_LINK must be set on this range */
@@ -4905,10 +4948,11 @@ static BOOL ME_UpdateLinkAttribute(ME_TextEditor *editor, int sel_min, int sel_m
link.cbSize = sizeof(link);
link.dwMask = CFM_LINK;
link.dwEffects = CFE_LINK;
- ME_SetCharFormat(editor, inURL[0], inURL[1] - inURL[0], &link);
+ ME_SetCharFormat(editor, &candidateStart, &candidateEnd, &link);
modified = TRUE;
}
}
- } while (sel_min < sel_max);
+ startCur = candidateEnd;
+ } while (nChars > 0);
return modified;
}
diff --git a/dll/win32/riched20/editor.h b/dll/win32/riched20/editor.h
index 0929e828497..9739eeab95b 100644
--- a/dll/win32/riched20/editor.h
+++ b/dll/win32/riched20/editor.h
@@ -77,6 +77,8 @@ void ME_CharFormatFromLogFont(HDC hDC, const LOGFONTW *lf, CHARFORMAT2W *fmt); /
/* list.c */
void ME_InsertBefore(ME_DisplayItem *diWhere, ME_DisplayItem *diWhat);
void ME_Remove(ME_DisplayItem *diWhere);
+BOOL ME_NextRun(ME_DisplayItem **para, ME_DisplayItem **run);
+BOOL ME_PrevRun(ME_DisplayItem **para, ME_DisplayItem **run);
ME_DisplayItem *ME_FindItemBack(ME_DisplayItem *di, ME_DIType nTypeOrClass);
ME_DisplayItem *ME_FindItemFwd(ME_DisplayItem *di, ME_DIType nTypeOrClass);
ME_DisplayItem *ME_FindItemBackOrHere(ME_DisplayItem *di, ME_DIType nTypeOrClass);
@@ -95,7 +97,6 @@ ME_String *ME_VSplitString(ME_String *orig, int nVPos);
int ME_IsWhitespaces(const ME_String *s);
int ME_IsSplitable(const ME_String *s);
int ME_FindNonWhitespaceV(const ME_String *s, int nVChar);
-int ME_FindWhitespaceV(ME_String *s, int nVChar);
int ME_CallWordBreakProc(ME_TextEditor *editor, ME_String *str, INT start, INT code);
void ME_StrDeleteV(ME_String *s, int nVChar, int nChars);
/* smart helpers for A<->W conversions, they reserve/free memory and call MultiByte<->WideChar functions */
@@ -120,14 +121,11 @@ int ME_ReverseFindWhitespaceV(const ME_String *s, int nVChar);
/* row.c */
ME_DisplayItem *ME_RowStart(ME_DisplayItem *item);
/* ME_DisplayItem *ME_RowEnd(ME_DisplayItem *item); */
-void ME_RenumberParagraphs(ME_DisplayItem *item); /* TODO */
ME_DisplayItem *ME_FindRowWithNumber(ME_TextEditor *editor, int nRow);
int ME_RowNumberFromCharOfs(ME_TextEditor *editor, int nOfs);
/* run.c */
ME_DisplayItem *ME_MakeRun(ME_Style *s, ME_String *strData, int nFlags);
-/* note: ME_InsertRun inserts a copy of the specified run - so you need to destroy the original */
-ME_DisplayItem *ME_InsertRun(ME_TextEditor *editor, int nCharOfs, ME_DisplayItem *pItem);
ME_DisplayItem *ME_InsertRunAtCursor(ME_TextEditor *editor, ME_Cursor *cursor,
ME_Style *style, const WCHAR *str, int len, int flags);
void ME_CheckCharOffsets(ME_TextEditor *editor);
@@ -136,49 +134,49 @@ int ME_CharFromPoint(ME_Context *c, int cx, ME_Run *run);
/* this one accounts for 1/2 char tolerance */
int ME_CharFromPointCursor(ME_TextEditor *editor, int cx, ME_Run *run);
int ME_PointFromChar(ME_TextEditor *editor, ME_Run *pRun, int nOffset);
-int ME_GetLastSplittablePlace(ME_Context *c, ME_Run *run);
int ME_CanJoinRuns(const ME_Run *run1, const ME_Run *run2);
void ME_JoinRuns(ME_TextEditor *editor, ME_DisplayItem *p);
ME_DisplayItem *ME_SplitRun(ME_WrapContext *wc, ME_DisplayItem *item, int nChar);
ME_DisplayItem *ME_SplitRunSimple(ME_TextEditor *editor, ME_DisplayItem *item, int nChar);
-int ME_FindSplitPoint(ME_Context *c, POINT *pt, ME_Run *run, int desperate);
void ME_UpdateRunFlags(ME_TextEditor *editor, ME_Run *run);
-ME_DisplayItem *ME_SplitFurther(ME_TextEditor *editor, ME_DisplayItem *run);
void ME_CalcRunExtent(ME_Context *c, const ME_Paragraph *para, int startx, ME_Run *run);
SIZE ME_GetRunSize(ME_Context *c, const ME_Paragraph *para, ME_Run *run, int nLen, int startx);
void ME_CursorFromCharOfs(ME_TextEditor *editor, int nCharOfs, ME_Cursor *pCursor);
void ME_RunOfsFromCharOfs(ME_TextEditor *editor, int nCharOfs, ME_DisplayItem **ppPara, ME_DisplayItem **ppRun, int *pOfs);
int ME_CharOfsFromRunOfs(ME_TextEditor *editor, const ME_DisplayItem *pPara, const ME_DisplayItem *pRun, int nOfs);
void ME_SkipAndPropagateCharOffset(ME_DisplayItem *p, int shift);
-void ME_SetCharFormat(ME_TextEditor *editor, int nFrom, int nLen, CHARFORMAT2W *pFmt);
+void ME_SetCharFormat(ME_TextEditor *editor, ME_Cursor *start, ME_Cursor *end, CHARFORMAT2W *pFmt);
void ME_SetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt);
-void ME_GetCharFormat(ME_TextEditor *editor, int nFrom, int nLen, CHARFORMAT2W *pFmt);
+void ME_GetCharFormat(ME_TextEditor *editor, const ME_Cursor *from,
+ const ME_Cursor *to, CHARFORMAT2W *pFmt);
void ME_GetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt);
void ME_GetDefaultCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt);
void ME_SetDefaultCharFormat(ME_TextEditor *editor, CHARFORMAT2W *mod);
/* caret.c */
+void ME_SetCursorToStart(ME_TextEditor *editor, ME_Cursor *cursor);
int ME_SetSelection(ME_TextEditor *editor, int from, int to);
void ME_HideCaret(ME_TextEditor *ed);
void ME_ShowCaret(ME_TextEditor *ed);
void ME_MoveCaret(ME_TextEditor *ed);
-int ME_CharFromPos(ME_TextEditor *editor, int x, int y, BOOL *isExact);
+BOOL ME_CharFromPos(ME_TextEditor *editor, int x, int y, ME_Cursor *cursor, BOOL *isExact);
void ME_LButtonDown(ME_TextEditor *editor, int x, int y, int clickNum);
void ME_MouseMove(ME_TextEditor *editor, int x, int y);
BOOL ME_DeleteTextAtCursor(ME_TextEditor *editor, int nCursor, int nChars);
void ME_InsertTextFromCursor(ME_TextEditor *editor, int nCursor,
const WCHAR *str, int len, ME_Style *style);
void ME_InsertEndRowFromCursor(ME_TextEditor *editor, int nCursor);
+int ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs);
BOOL ME_ArrowKey(ME_TextEditor *ed, int nVKey, BOOL extend, BOOL ctrl);
-int ME_GetCursorOfs(ME_TextEditor *editor, int nCursor);
-void ME_GetSelection(ME_TextEditor *editor, int *from, int *to);
-int ME_CountParagraphsBetween(ME_TextEditor *editor, int from, int to);
+int ME_GetCursorOfs(const ME_Cursor *cursor);
+int ME_GetSelectionOfs(ME_TextEditor *editor, int *from, int *to);
+int ME_GetSelection(ME_TextEditor *editor, ME_Cursor **from, ME_Cursor **to);
BOOL ME_IsSelection(ME_TextEditor *editor);
void ME_DeleteSelection(ME_TextEditor *editor);
void ME_SendSelChange(ME_TextEditor *editor);
void ME_InsertOLEFromCursor(ME_TextEditor *editor, const REOBJECT* reo, int nCursor);
-BOOL ME_InternalDeleteText(ME_TextEditor *editor, int nOfs, int nChars, BOOL bForce);
+BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start, int nChars, BOOL bForce);
int ME_GetTextLength(ME_TextEditor *editor);
int ME_GetTextLengthEx(ME_TextEditor *editor, const GETTEXTLENGTHEX *how);
ME_Style *ME_GetSelectionInsertStyle(ME_TextEditor *editor);
@@ -231,8 +229,7 @@ void ME_ScrollRight(ME_TextEditor *editor, int cx);
void ME_UpdateScrollBar(ME_TextEditor *editor);
/* other functions in paint.c */
-int ME_GetParaBorderWidth(ME_TextEditor *editor, int);
-int ME_GetParaLineSpace(ME_Context *c, ME_Paragraph*);
+int ME_GetParaBorderWidth(ME_Context *c, int flags);
/* richole.c */
LRESULT CreateIRichEditOle(ME_TextEditor *editor, LPVOID *);
@@ -246,14 +243,14 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10);
LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
LPARAM lParam, BOOL unicode, HRESULT* phresult);
void ME_SendOldNotify(ME_TextEditor *editor, int nCode);
-int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int nStart, int nChars, BOOL bCRLF);
+int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int buflen,
+ const ME_Cursor *start, int srcChars, BOOL bCRLF);
void ME_RTFCharAttrHook(struct _RTF_Info *info);
void ME_RTFParAttrHook(struct _RTF_Info *info);
void ME_RTFTblAttrHook(struct _RTF_Info *info);
void ME_RTFSpecialCharHook(struct _RTF_Info *info);
void ME_StreamInFill(ME_InStream *stream);
extern int me_debug;
-extern void DoWrap(ME_TextEditor *editor);
/* table.c */
BOOL ME_IsInTable(ME_DisplayItem *pItem);
@@ -265,7 +262,7 @@ ME_DisplayItem *ME_InsertTableRowEndFromCursor(ME_TextEditor *editor);
ME_DisplayItem *ME_GetTableRowEnd(ME_DisplayItem *para);
ME_DisplayItem *ME_GetTableRowStart(ME_DisplayItem *para);
void ME_CheckTablesForCorruption(ME_TextEditor *editor);
-void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, int nOfs,int *nChars);
+void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, ME_Cursor *c, int *nChars);
ME_DisplayItem* ME_AppendTableRow(ME_TextEditor *editor, ME_DisplayItem *table_row);
void ME_TabPressedInTable(ME_TextEditor *editor, BOOL bSelectedRow);
void ME_MoveCursorFromTableRowStartParagraph(ME_TextEditor *editor);
@@ -273,7 +270,7 @@ struct RTFTable *ME_MakeTableDef(ME_TextEditor *editor);
void ME_InitTableDef(ME_TextEditor *editor, struct RTFTable *tableDef);
/* txthost.c */
-ITextHost *ME_CreateTextHost(HWND hwnd, BOOL bEmulateVersion10);
+ITextHost *ME_CreateTextHost(HWND hwnd, CREATESTRUCTW *cs, BOOL bEmulateVersion10);
#ifdef __i386__ /* Use wrappers to perform thiscall on i386 */
#define TXTHOST_VTABLE(This) (&itextHostStdcallVtbl)
#else /* __i386__ */
@@ -330,8 +327,8 @@ BOOL ME_Redo(ME_TextEditor *editor);
void ME_EmptyUndoStack(ME_TextEditor *editor);
/* writer.c */
-LRESULT ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat, int nStart, int nTo, EDITSTREAM *stream);
+LRESULT ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat, const ME_Cursor *start, int nChars, EDITSTREAM *stream);
LRESULT ME_StreamOut(ME_TextEditor *editor, DWORD dwFormat, EDITSTREAM *stream);
/* clipboard.c */
-HRESULT ME_GetDataObject(ME_TextEditor *editor, const CHARRANGE *lpchrg, LPDATAOBJECT *lplpdataobj);
+HRESULT ME_GetDataObject(ME_TextEditor *editor, const ME_Cursor *start, int nChars, LPDATAOBJECT *lplpdataobj);
diff --git a/dll/win32/riched20/editstr.h b/dll/win32/riched20/editstr.h
index a4af8fe9c0c..9b8d645199e 100644
--- a/dll/win32/riched20/editstr.h
+++ b/dll/win32/riched20/editstr.h
@@ -29,6 +29,7 @@
#include
#include
#include
+#include
#define COBJMACROS
#define NONAMELESSUNION
@@ -50,7 +51,7 @@
#include "wine/debug.h"
#ifdef __i386__
-extern struct ITextHostVtbl itextHostStdcallVtbl;
+extern const struct ITextHostVtbl itextHostStdcallVtbl;
#endif /* __i386__ */
typedef struct tagME_String
@@ -325,7 +326,7 @@ typedef struct tagME_FontCacheItem
typedef struct tagME_TextEditor
{
- HWND hWnd;
+ HWND hWnd, hwndParent;
ITextHost *texthost;
BOOL bEmulateVersion10;
ME_TextBuffer *pBuffer;
@@ -369,6 +370,7 @@ typedef struct tagME_TextEditor
BOOL AutoURLDetect_bEnable;
WCHAR cPasswordMask;
BOOL bHaveFocus;
+ BOOL bDialogMode; /* Indicates that we are inside a dialog window */
/*for IME */
int imeStartIndex;
DWORD selofs; /* The size of the selection bar on the left side of control */
diff --git a/dll/win32/riched20/list.c b/dll/win32/riched20/list.c
index d3d9463c04b..bb91bc4de65 100644
--- a/dll/win32/riched20/list.c
+++ b/dll/win32/riched20/list.c
@@ -44,22 +44,63 @@ void ME_Remove(ME_DisplayItem *diWhere)
static BOOL ME_DITypesEqual(ME_DIType type, ME_DIType nTypeOrClass)
{
- if (type==nTypeOrClass)
- return TRUE;
- if (nTypeOrClass==diRunOrParagraph && (type==diRun || type==diParagraph))
- return TRUE;
- if (nTypeOrClass==diRunOrStartRow && (type==diRun || type==diStartRow))
- return TRUE;
- if (nTypeOrClass==diParagraphOrEnd && (type==diTextEnd || type==diParagraph))
- return TRUE;
- if (nTypeOrClass==diStartRowOrParagraph && (type==diStartRow || type==diParagraph))
- return TRUE;
- if (nTypeOrClass==diStartRowOrParagraphOrEnd
- && (type==diStartRow || type==diParagraph || type==diTextEnd))
- return TRUE;
- if (nTypeOrClass==diRunOrParagraphOrEnd
- && (type==diRun || type==diParagraph || type==diTextEnd))
- return TRUE;
+ switch (nTypeOrClass)
+ {
+ case diRunOrParagraph:
+ return type == diRun || type == diParagraph;
+ case diRunOrStartRow:
+ return type == diRun || type == diStartRow;
+ case diParagraphOrEnd:
+ return type == diTextEnd || type == diParagraph;
+ case diStartRowOrParagraph:
+ return type == diStartRow || type == diParagraph;
+ case diStartRowOrParagraphOrEnd:
+ return type == diStartRow || type == diParagraph || type == diTextEnd;
+ case diRunOrParagraphOrEnd:
+ return type == diRun || type == diParagraph || type == diTextEnd;
+ default:
+ return type == nTypeOrClass;
+ }
+}
+
+/* Modifies run pointer to point to the next run, and modify the
+ * paragraph pointer if moving into the next paragraph.
+ *
+ * Returns TRUE if next run is found, otherwise returns FALSE. */
+BOOL ME_NextRun(ME_DisplayItem **para, ME_DisplayItem **run)
+{
+ ME_DisplayItem *p = (*run)->next;
+ while (p->type != diTextEnd)
+ {
+ if (p->type == diParagraph) {
+ *para = p;
+ } else if (p->type == diRun) {
+ *run = p;
+ return TRUE;
+ }
+ p = p->next;
+ }
+ return FALSE;
+}
+
+/* Modifies run pointer to point to the previous run, and modify the
+ * paragraph pointer if moving into the previous paragraph.
+ *
+ * Returns TRUE if previous run is found, otherwise returns FALSE. */
+BOOL ME_PrevRun(ME_DisplayItem **para, ME_DisplayItem **run)
+{
+ ME_DisplayItem *p = (*run)->prev;
+ while (p->type != diTextStart)
+ {
+ if (p->type == diParagraph) {
+ if (p->member.para.prev_para->type == diParagraph)
+ *para = p->member.para.prev_para;
+ } else if (p->type == diRun) {
+ *run = p;
+ return TRUE;
+ }
+ p = p->prev;
+ }
return FALSE;
}
diff --git a/dll/win32/riched20/paint.c b/dll/win32/riched20/paint.c
index 620ac69160c..2b01e3c2693 100644
--- a/dll/win32/riched20/paint.c
+++ b/dll/win32/riched20/paint.c
@@ -413,7 +413,7 @@ static void ME_DrawRun(ME_Context *c, int x, int y, ME_DisplayItem *rundi, ME_Pa
return;
start = ME_FindItemBack(rundi, diStartRow);
- ME_GetSelection(c->editor, &nSelFrom, &nSelTo);
+ ME_GetSelectionOfs(c->editor, &nSelFrom, &nSelTo);
/* Draw selected end-of-paragraph mark */
if (run->nFlags & MERF_ENDPARA)
@@ -461,19 +461,21 @@ static void ME_DrawRun(ME_Context *c, int x, int y, ME_DisplayItem *rundi, ME_Pa
}
}
-static const struct {unsigned width_num : 4, width_den : 4, pen_style : 4, dble : 1;} border_details[] = {
- /* none */ {0, 1, PS_SOLID, FALSE},
- /* 3/4 */ {3, 4, PS_SOLID, FALSE},
- /* 1 1/2 */ {3, 2, PS_SOLID, FALSE},
- /* 2 1/4 */ {9, 4, PS_SOLID, FALSE},
- /* 3 */ {3, 1, PS_SOLID, FALSE},
- /* 4 1/2 */ {9, 2, PS_SOLID, FALSE},
- /* 6 */ {6, 1, PS_SOLID, FALSE},
- /* 3/4 double */ {3, 4, PS_SOLID, TRUE},
- /* 1 1/2 double */ {3, 2, PS_SOLID, TRUE},
- /* 2 1/4 double */ {9, 4, PS_SOLID, TRUE},
- /* 3/4 gray */ {3, 4, PS_DOT /* FIXME */, FALSE},
- /* 1 1/2 dashed */ {3, 2, PS_DASH, FALSE},
+/* The documented widths are in points (72 dpi), but converting them to
+ * 96 dpi (standard display resolution) avoids dealing with fractions. */
+static const struct {unsigned width : 8, pen_style : 4, dble : 1;} border_details[] = {
+ /* none */ {0, PS_SOLID, FALSE},
+ /* 3/4 */ {1, PS_SOLID, FALSE},
+ /* 1 1/2 */ {2, PS_SOLID, FALSE},
+ /* 2 1/4 */ {3, PS_SOLID, FALSE},
+ /* 3 */ {4, PS_SOLID, FALSE},
+ /* 4 1/2 */ {6, PS_SOLID, FALSE},
+ /* 6 */ {8, PS_SOLID, FALSE},
+ /* 3/4 double */ {1, PS_SOLID, TRUE},
+ /* 1 1/2 double */ {2, PS_SOLID, TRUE},
+ /* 2 1/4 double */ {3, PS_SOLID, TRUE},
+ /* 3/4 gray */ {1, PS_DOT /* FIXME */, FALSE},
+ /* 1 1/2 dashed */ {2, PS_DASH, FALSE},
};
static const COLORREF pen_colors[16] = {
@@ -487,25 +489,20 @@ static const COLORREF pen_colors[16] = {
/* Dark gray */ RGB(0x80, 0x80, 0x80), /* Light gray */ RGB(0xc0, 0xc0, 0xc0),
};
-static int ME_GetBorderPenWidth(ME_TextEditor* editor, int idx)
+static int ME_GetBorderPenWidth(ME_Context* c, int idx)
{
- int width;
+ int width = border_details[idx].width;
+
+ if (c->dpi.cx != 96)
+ width = MulDiv(width, c->dpi.cx, 96);
+
+ if (c->editor->nZoomNumerator != 0)
+ width = MulDiv(width, c->editor->nZoomNumerator, c->editor->nZoomDenominator);
- if (editor->nZoomNumerator == 0)
- {
- width = border_details[idx].width_num + border_details[idx].width_den / 2;
- width /= border_details[idx].width_den;
- }
- else
- {
- width = border_details[idx].width_num * editor->nZoomNumerator;
- width += border_details[idx].width_den * editor->nZoomNumerator / 2;
- width /= border_details[idx].width_den * editor->nZoomDenominator;
- }
return width;
}
-int ME_GetParaBorderWidth(ME_TextEditor* editor, int flags)
+int ME_GetParaBorderWidth(ME_Context* c, int flags)
{
int idx = (flags >> 8) & 0xF;
int width;
@@ -515,34 +512,11 @@ int ME_GetParaBorderWidth(ME_TextEditor* editor, int flags)
FIXME("Unsupported border value %d\n", idx);
return 0;
}
- width = ME_GetBorderPenWidth(editor, idx);
+ width = ME_GetBorderPenWidth(c, idx);
if (border_details[idx].dble) width = width * 2 + 1;
return width;
}
-int ME_GetParaLineSpace(ME_Context* c, ME_Paragraph* para)
-{
- int sp = 0, ls = 0;
- if (!(para->pFmt->dwMask & PFM_LINESPACING)) return 0;
-
- /* FIXME: how to compute simply the line space in ls ??? */
- /* FIXME: does line spacing include the line itself ??? */
- switch (para->pFmt->bLineSpacingRule)
- {
- case 0: sp = ls; break;
- case 1: sp = (3 * ls) / 2; break;
- case 2: sp = 2 * ls; break;
- case 3: sp = ME_twips2pointsY(c, para->pFmt->dyLineSpacing); if (sp < ls) sp = ls; break;
- case 4: sp = ME_twips2pointsY(c, para->pFmt->dyLineSpacing); break;
- case 5: sp = para->pFmt->dyLineSpacing / 20; break;
- default: FIXME("Unsupported spacing rule value %d\n", para->pFmt->bLineSpacingRule);
- }
- if (c->editor->nZoomNumerator == 0)
- return sp;
- else
- return sp * c->editor->nZoomNumerator / c->editor->nZoomDenominator;
-}
-
static void ME_DrawParaDecoration(ME_Context* c, ME_Paragraph* para, int y, RECT* bounds)
{
int idx, border_width, top_border, bottom_border;
@@ -588,7 +562,7 @@ static void ME_DrawParaDecoration(ME_Context* c, ME_Paragraph* para, int y, RECT
*/
if (para->pFmt->wBorders & 0x00B0)
FIXME("Unsupported border flags %x\n", para->pFmt->wBorders);
- border_width = ME_GetParaBorderWidth(c->editor, para->pFmt->wBorders);
+ border_width = ME_GetParaBorderWidth(c, para->pFmt->wBorders);
if (para->pFmt->wBorders & 4) top_border = border_width;
if (para->pFmt->wBorders & 8) bottom_border = border_width;
}
@@ -630,7 +604,7 @@ static void ME_DrawParaDecoration(ME_Context* c, ME_Paragraph* para, int y, RECT
rightEdge = c->pt.x + max(c->editor->sizeWindow.cx,
c->editor->nTotalWidth);
- pen_width = ME_GetBorderPenWidth(c->editor, idx);
+ pen_width = ME_GetBorderPenWidth(c, idx);
pen = CreatePen(border_details[idx].pen_style, pen_width, pencr);
oldpen = SelectObject(c->hDC, pen);
MoveToEx(c->hDC, 0, 0, &pt);
@@ -1036,17 +1010,21 @@ void ME_ScrollAbs(ME_TextEditor *editor, int x, int y)
if (editor->horz_si.nPos != x) {
x = min(x, editor->horz_si.nMax);
x = max(x, editor->horz_si.nMin);
- ITextHost_TxSetScrollPos(editor->texthost, SB_HORZ, x, TRUE);
scrollX = editor->horz_si.nPos - x;
editor->horz_si.nPos = x;
+ if (editor->horz_si.nMax > 0xFFFF) /* scale to 16-bit value */
+ x = MulDiv(x, 0xFFFF, editor->horz_si.nMax);
+ ITextHost_TxSetScrollPos(editor->texthost, SB_HORZ, x, TRUE);
}
if (editor->vert_si.nPos != y) {
y = min(y, editor->vert_si.nMax - (int)editor->vert_si.nPage);
y = max(y, editor->vert_si.nMin);
- ITextHost_TxSetScrollPos(editor->texthost, SB_VERT, y, TRUE);
scrollY = editor->vert_si.nPos - y;
editor->vert_si.nPos = y;
+ if (editor->vert_si.nMax > 0xFFFF) /* scale to 16-bit value */
+ y = MulDiv(y, 0xFFFF, editor->vert_si.nMax);
+ ITextHost_TxSetScrollPos(editor->texthost, SB_VERT, y, TRUE);
}
if (abs(scrollX) > editor->sizeWindow.cx ||
@@ -1061,22 +1039,28 @@ void ME_ScrollAbs(ME_TextEditor *editor, int x, int y)
if (editor->hWnd)
{
LONG winStyle = GetWindowLongW(editor->hWnd, GWL_STYLE);
- bScrollBarIsVisible = (winStyle & WS_HSCROLL) != 0;
- bScrollBarWillBeVisible = (editor->nTotalWidth > editor->sizeWindow.cx
- && (editor->styleFlags & WS_HSCROLL))
- || (editor->styleFlags & ES_DISABLENOSCROLL);
- if (bScrollBarIsVisible != bScrollBarWillBeVisible)
- ITextHost_TxShowScrollBar(editor->texthost, SB_HORZ,
- bScrollBarWillBeVisible);
+ if (editor->styleFlags & WS_HSCROLL)
+ {
+ bScrollBarIsVisible = (winStyle & WS_HSCROLL) != 0;
+ bScrollBarWillBeVisible = (editor->nTotalWidth > editor->sizeWindow.cx
+ && (editor->styleFlags & WS_HSCROLL))
+ || (editor->styleFlags & ES_DISABLENOSCROLL);
+ if (bScrollBarIsVisible != bScrollBarWillBeVisible)
+ ITextHost_TxShowScrollBar(editor->texthost, SB_HORZ,
+ bScrollBarWillBeVisible);
+ }
- bScrollBarIsVisible = (winStyle & WS_VSCROLL) != 0;
- bScrollBarWillBeVisible = (editor->nTotalLength > editor->sizeWindow.cy
- && (editor->styleFlags & WS_VSCROLL)
- && (editor->styleFlags & ES_MULTILINE))
- || (editor->styleFlags & ES_DISABLENOSCROLL);
- if (bScrollBarIsVisible != bScrollBarWillBeVisible)
- ITextHost_TxShowScrollBar(editor->texthost, SB_VERT,
- bScrollBarWillBeVisible);
+ if (editor->styleFlags & WS_VSCROLL)
+ {
+ bScrollBarIsVisible = (winStyle & WS_VSCROLL) != 0;
+ bScrollBarWillBeVisible = (editor->nTotalLength > editor->sizeWindow.cy
+ && (editor->styleFlags & WS_VSCROLL)
+ && (editor->styleFlags & ES_MULTILINE))
+ || (editor->styleFlags & ES_DISABLENOSCROLL);
+ if (bScrollBarIsVisible != bScrollBarWillBeVisible)
+ ITextHost_TxShowScrollBar(editor->texthost, SB_VERT,
+ bScrollBarWillBeVisible);
+ }
}
ME_UpdateScrollBar(editor);
}
@@ -1136,6 +1120,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
si.cbSize = sizeof(si);
si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
+ si.nMin = 0;
if (editor->styleFlags & ES_DISABLENOSCROLL)
si.fMask |= SIF_DISABLENOSCROLL;
@@ -1150,20 +1135,25 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
return;
}
- si.nMin = 0;
si.nMax = editor->nTotalWidth;
si.nPos = editor->horz_si.nPos;
si.nPage = editor->sizeWindow.cx;
- if (si.nMin != editor->horz_si.nMin ||
- si.nMax != editor->horz_si.nMax ||
+ if (si.nMax != editor->horz_si.nMax ||
si.nPage != editor->horz_si.nPage)
{
TRACE("min=%d max=%d page=%d\n", si.nMin, si.nMax, si.nPage);
- editor->horz_si.nMin = si.nMin;
editor->horz_si.nMax = si.nMax;
editor->horz_si.nPage = si.nPage;
- if (bScrollBarWillBeVisible || bScrollBarWasVisible) {
+ if ((bScrollBarWillBeVisible || bScrollBarWasVisible) &&
+ editor->styleFlags & WS_HSCROLL)
+ {
+ if (si.nMax > 0xFFFF)
+ {
+ /* Native scales the scrollbar info to 16-bit external values. */
+ si.nPos = MulDiv(si.nPos, 0xFFFF, si.nMax);
+ si.nMax = 0xFFFF;
+ }
if (editor->hWnd) {
SetScrollInfo(editor->hWnd, SB_HORZ, &si, TRUE);
} else {
@@ -1175,14 +1165,17 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
}
}
- if (si.fMask & SIF_DISABLENOSCROLL) {
- bScrollBarWillBeVisible = TRUE;
- } else if (!(editor->styleFlags & WS_HSCROLL)) {
- bScrollBarWillBeVisible = FALSE;
- }
+ if (editor->styleFlags & WS_HSCROLL)
+ {
+ if (si.fMask & SIF_DISABLENOSCROLL) {
+ bScrollBarWillBeVisible = TRUE;
+ } else if (!(editor->styleFlags & WS_HSCROLL)) {
+ bScrollBarWillBeVisible = FALSE;
+ }
- if (bScrollBarWasVisible != bScrollBarWillBeVisible)
- ITextHost_TxShowScrollBar(editor->texthost, SB_HORZ, bScrollBarWillBeVisible);
+ if (bScrollBarWasVisible != bScrollBarWillBeVisible)
+ ITextHost_TxShowScrollBar(editor->texthost, SB_HORZ, bScrollBarWillBeVisible);
+ }
/* Update vertical scrollbar */
bScrollBarWasVisible = editor->vert_si.nMax > editor->vert_si.nPage;
@@ -1201,15 +1194,21 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
si.nPos = editor->vert_si.nPos;
si.nPage = editor->sizeWindow.cy;
- if (si.nMin != editor->vert_si.nMin ||
- si.nMax != editor->vert_si.nMax ||
+ if (si.nMax != editor->vert_si.nMax ||
si.nPage != editor->vert_si.nPage)
{
TRACE("min=%d max=%d page=%d\n", si.nMin, si.nMax, si.nPage);
- editor->vert_si.nMin = si.nMin;
editor->vert_si.nMax = si.nMax;
editor->vert_si.nPage = si.nPage;
- if (bScrollBarWillBeVisible || bScrollBarWasVisible) {
+ if ((bScrollBarWillBeVisible || bScrollBarWasVisible) &&
+ editor->styleFlags & WS_VSCROLL)
+ {
+ if (si.nMax > 0xFFFF)
+ {
+ /* Native scales the scrollbar info to 16-bit external values. */
+ si.nPos = MulDiv(si.nPos, 0xFFFF, si.nMax);
+ si.nMax = 0xFFFF;
+ }
if (editor->hWnd) {
SetScrollInfo(editor->hWnd, SB_VERT, &si, TRUE);
} else {
@@ -1221,15 +1220,18 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
}
}
- if (si.fMask & SIF_DISABLENOSCROLL) {
- bScrollBarWillBeVisible = TRUE;
- } else if (!(editor->styleFlags & WS_VSCROLL)) {
- bScrollBarWillBeVisible = FALSE;
- }
+ if (editor->styleFlags & WS_VSCROLL)
+ {
+ if (si.fMask & SIF_DISABLENOSCROLL) {
+ bScrollBarWillBeVisible = TRUE;
+ } else if (!(editor->styleFlags & WS_VSCROLL)) {
+ bScrollBarWillBeVisible = FALSE;
+ }
- if (bScrollBarWasVisible != bScrollBarWillBeVisible)
- ITextHost_TxShowScrollBar(editor->texthost, SB_VERT,
- bScrollBarWillBeVisible);
+ if (bScrollBarWasVisible != bScrollBarWillBeVisible)
+ ITextHost_TxShowScrollBar(editor->texthost, SB_VERT,
+ bScrollBarWillBeVisible);
+ }
}
void ME_EnsureVisible(ME_TextEditor *editor, ME_Cursor *pCursor)
@@ -1242,11 +1244,24 @@ void ME_EnsureVisible(ME_TextEditor *editor, ME_Cursor *pCursor)
assert(pRow);
assert(pPara);
- x = pRun->pt.x + ME_PointFromChar(editor, pRun, pCursor->nOffset);
- if (x > editor->horz_si.nPos + editor->sizeWindow.cx)
- x = x + 1 - editor->sizeWindow.cx;
- else if (x > editor->horz_si.nPos)
+ if (editor->styleFlags & ES_AUTOHSCROLL)
+ {
+ x = pRun->pt.x + ME_PointFromChar(editor, pRun, pCursor->nOffset);
+ if (x > editor->horz_si.nPos + editor->sizeWindow.cx)
+ x = x + 1 - editor->sizeWindow.cx;
+ else if (x > editor->horz_si.nPos)
+ x = editor->horz_si.nPos;
+
+ if (~editor->styleFlags & ES_AUTOVSCROLL)
+ {
+ ME_HScrollAbs(editor, x);
+ return;
+ }
+ } else {
+ if (~editor->styleFlags & ES_AUTOVSCROLL)
+ return;
x = editor->horz_si.nPos;
+ }
y = pPara->member.para.pt.y + pRow->member.row.pt.y;
yheight = pRow->member.row.nHeight;
@@ -1267,7 +1282,7 @@ ME_InvalidateSelection(ME_TextEditor *editor)
int nStart, nEnd;
int len = ME_GetTextLength(editor);
- ME_GetSelection(editor, &nStart, &nEnd);
+ ME_GetSelectionOfs(editor, &nStart, &nEnd);
/* if both old and new selection are 0-char (= caret only), then
there's no (inverted) area to be repainted, neither old nor new */
if (nStart == nEnd && editor->nLastSelStart == editor->nLastSelEnd)
@@ -1300,7 +1315,7 @@ ME_InvalidateSelection(ME_TextEditor *editor)
ME_InvalidateMarkedParagraphs(editor);
/* remember the last invalidated position */
- ME_GetSelection(editor, &editor->nLastSelStart, &editor->nLastSelEnd);
+ ME_GetSelectionOfs(editor, &editor->nLastSelStart, &editor->nLastSelEnd);
ME_GetSelectionParas(editor, &editor->pLastSelStartPara, &editor->pLastSelEndPara);
assert(editor->pLastSelStartPara->type == diParagraph);
assert(editor->pLastSelEndPara->type == diParagraph);
diff --git a/dll/win32/riched20/para.c b/dll/win32/riched20/para.c
index 94ef7ae709f..b6319e73aa2 100644
--- a/dll/win32/riched20/para.c
+++ b/dll/win32/riched20/para.c
@@ -335,6 +335,8 @@ ME_DisplayItem *ME_JoinParagraphs(ME_TextEditor *editor, ME_DisplayItem *tp,
int i, shift;
ME_UndoItem *undo = NULL;
int end_len;
+ CHARFORMAT2W fmt;
+ ME_Cursor startCur, endCur;
assert(tp->type == diParagraph);
assert(tp->member.para.next_para);
@@ -351,12 +353,15 @@ ME_DisplayItem *ME_JoinParagraphs(ME_TextEditor *editor, ME_DisplayItem *tp,
end_len = pRun->member.run.strText->nLen;
- {
- /* null char format operation to store the original char format for the ENDPARA run */
- CHARFORMAT2W fmt;
- ME_InitCharFormat2W(&fmt);
- ME_SetCharFormat(editor, pNext->member.para.nCharOfs - end_len, end_len, &fmt);
- }
+ /* null char format operation to store the original char format for the ENDPARA run */
+ ME_InitCharFormat2W(&fmt);
+ endCur.pPara = pNext;
+ endCur.pRun = ME_FindItemFwd(pNext, diRun);
+ endCur.nOffset = 0;
+ startCur = endCur;
+ ME_PrevRun(&startCur.pPara, &startCur.pRun);
+ ME_SetCharFormat(editor, &startCur, &endCur, &fmt);
+
undo = ME_AddUndoItem(editor, diUndoSplitParagraph, pNext);
if (undo)
{
diff --git a/dll/win32/riched20/reader.c b/dll/win32/riched20/reader.c
index b6a6f44f255..9f88cf77554 100644
--- a/dll/win32/riched20/reader.c
+++ b/dll/win32/riched20/reader.c
@@ -442,7 +442,11 @@ static void RTFUngetToken(RTF_Info *info)
* increment the value to compensate for it being decremented
* twice due to the RTFUngetToken. */
if(RTFCheckCM (info, rtfGroup, rtfEndGroup))
+ {
+ info->stack[info->stackTop].style = info->style;
+ ME_AddRefStyle(info->style);
info->stackTop++;
+ }
}
@@ -783,7 +787,6 @@ static void ReadFontTbl(RTF_Info *info)
RTFFont *fp = NULL;
char buf[rtfBufSiz], *bp;
int old = -1;
- const char *fn = "ReadFontTbl";
for (;;)
{
@@ -799,19 +802,19 @@ static void ReadFontTbl(RTF_Info *info)
else if (RTFCheckCM (info, rtfGroup, rtfBeginGroup))
old = 0; /* brace */
else /* can't tell! */
- ERR ( "%s: Cannot determine format\n", fn);
+ ERR ("cannot determine format\n");
}
if (old == 0) /* need to find "{" here */
{
if (!RTFCheckCM (info, rtfGroup, rtfBeginGroup))
- ERR ( "%s: missing \"{\"\n", fn);
+ ERR ("missing \"{\"\n");
RTFGetToken (info); /* yes, skip to next token */
if (info->rtfClass == rtfEOF)
break;
}
fp = New (RTFFont);
if (fp == NULL) {
- ERR ( "%s: cannot allocate font entry\n", fn);
+ ERR ("cannot allocate font entry\n");
break;
}
@@ -837,8 +840,8 @@ static void ReadFontTbl(RTF_Info *info)
{
default:
/* ignore token but announce it */
- WARN ("%s: unknown token \"%s\"\n",
- fn, info->rtfTextBuf);
+ WARN ("unknown token \"%s\"\n",
+ info->rtfTextBuf);
break;
case rtfFontFamily:
fp->rtfFFamily = info->rtfMinor;
@@ -899,7 +902,7 @@ static void ReadFontTbl(RTF_Info *info)
*bp = '\0';
fp->rtfFName = RTFStrSave (buf);
if (fp->rtfFName == NULL)
- ERR ( "%s: cannot allocate font name\n", fn);
+ ERR ("cannot allocate font name\n");
/* already have next token; don't read one */
/* at bottom of loop */
continue;
@@ -907,8 +910,7 @@ static void ReadFontTbl(RTF_Info *info)
else
{
/* ignore token but announce it */
- WARN ( "%s: unknown token \"%s\"\n",
- fn,info->rtfTextBuf);
+ WARN ("unknown token \"%s\"\n", info->rtfTextBuf);
}
RTFGetToken (info);
if (info->rtfClass == rtfEOF)
@@ -920,7 +922,7 @@ static void ReadFontTbl(RTF_Info *info)
{
RTFGetToken (info);
if (!RTFCheckCM (info, rtfGroup, rtfEndGroup))
- ERR ( "%s: missing \"}\"\n", fn);
+ ERR ("missing \"}\"\n");
if (info->rtfClass == rtfEOF)
break;
}
@@ -934,7 +936,7 @@ static void ReadFontTbl(RTF_Info *info)
}
}
if (!fp || (fp->rtfFNum == -1))
- ERR( "%s: missing font number\n", fn);
+ ERR("missing font number\n");
/*
* Could check other pieces of structure here, too, I suppose.
*/
@@ -963,7 +965,6 @@ static void ReadColorTbl(RTF_Info *info)
{
RTFColor *cp;
int cnum = 0;
- const char *fn = "ReadColorTbl";
int group_level = 1;
for (;;)
@@ -986,27 +987,30 @@ static void ReadColorTbl(RTF_Info *info)
cp = New (RTFColor);
if (cp == NULL) {
- ERR ( "%s: cannot allocate color entry\n", fn);
+ ERR ("cannot allocate color entry\n");
break;
}
cp->rtfCNum = cnum++;
- cp->rtfCRed = cp->rtfCGreen = cp->rtfCBlue = -1;
cp->rtfNextColor = info->colorList;
info->colorList = cp;
- while (RTFCheckCM (info, rtfControl, rtfColorName))
- {
- switch (info->rtfMinor)
- {
- case rtfRed: cp->rtfCRed = info->rtfParam; break;
- case rtfGreen: cp->rtfCGreen = info->rtfParam; break;
- case rtfBlue: cp->rtfCBlue = info->rtfParam; break;
- }
- RTFGetToken (info);
+ if (!RTFCheckCM (info, rtfControl, rtfColorName))
+ cp->rtfCRed = cp->rtfCGreen = cp->rtfCBlue = -1;
+ else {
+ cp->rtfCRed = cp->rtfCGreen = cp->rtfCBlue = 0;
+ do {
+ switch (info->rtfMinor)
+ {
+ case rtfRed: cp->rtfCRed = info->rtfParam & 0xFF; break;
+ case rtfGreen: cp->rtfCGreen = info->rtfParam & 0xFF; break;
+ case rtfBlue: cp->rtfCBlue = info->rtfParam & 0xFF; break;
+ }
+ RTFGetToken (info);
+ } while (RTFCheckCM (info, rtfControl, rtfColorName));
}
if (info->rtfClass == rtfEOF)
break;
if (!RTFCheckCM (info, rtfText, ';'))
- ERR ("%s: malformed entry\n", fn);
+ ERR ("malformed entry\n");
}
RTFRouteToken (info); /* feed "}" back to router */
}
@@ -1022,7 +1026,6 @@ static void ReadStyleSheet(RTF_Info *info)
RTFStyle *sp;
RTFStyleElt *sep, *sepLast;
char buf[rtfBufSiz], *bp;
- const char *fn = "ReadStyleSheet";
int real_style;
for (;;)
@@ -1034,7 +1037,7 @@ static void ReadStyleSheet(RTF_Info *info)
break;
sp = New (RTFStyle);
if (sp == NULL) {
- ERR ( "%s: cannot allocate stylesheet entry\n", fn);
+ ERR ("cannot allocate stylesheet entry\n");
break;
}
sp->rtfSName = NULL;
@@ -1048,7 +1051,7 @@ static void ReadStyleSheet(RTF_Info *info)
sp->rtfExpanding = 0;
info->styleList = sp;
if (!RTFCheckCM (info, rtfGroup, rtfBeginGroup))
- ERR ( "%s: missing \"{\"\n", fn);
+ ERR ("missing \"{\"\n");
real_style = TRUE;
for (;;)
{
@@ -1060,7 +1063,7 @@ static void ReadStyleSheet(RTF_Info *info)
{
if (RTFCheckMM (info, rtfSpecialChar, rtfOptDest)) {
RTFGetToken(info);
- ERR( "%s: skipping optional destination\n", fn);
+ ERR("skipping optional destination\n");
RTFSkipGroup(info);
info->rtfClass = rtfGroup;
info->rtfMajor = rtfEndGroup;
@@ -1102,14 +1105,17 @@ static void ReadStyleSheet(RTF_Info *info)
}
sep = New (RTFStyleElt);
if (sep == NULL)
- ERR ( "%s: cannot allocate style element\n", fn);
+ {
+ ERR ("cannot allocate style element\n");
+ break;
+ }
sep->rtfSEClass = info->rtfClass;
sep->rtfSEMajor = info->rtfMajor;
sep->rtfSEMinor = info->rtfMinor;
sep->rtfSEParam = info->rtfParam;
sep->rtfSEText = RTFStrSave (info->rtfTextBuf);
if (sep->rtfSEText == NULL)
- ERR ( "%s: cannot allocate style element text\n", fn);
+ ERR ("cannot allocate style element text\n");
if (sepLast == NULL)
sp->rtfSSEList = sep; /* first element */
else /* add to end */
@@ -1123,7 +1129,7 @@ static void ReadStyleSheet(RTF_Info *info)
* This passes over "{\*\keycode ... }, among
* other things. A temporary (perhaps) hack.
*/
- ERR( "%s: skipping begin\n", fn);
+ ERR("skipping begin\n");
RTFSkipGroup (info);
continue;
}
@@ -1144,19 +1150,18 @@ static void ReadStyleSheet(RTF_Info *info)
*bp = '\0';
sp->rtfSName = RTFStrSave (buf);
if (sp->rtfSName == NULL)
- ERR ( "%s: cannot allocate style name\n", fn);
+ ERR ("cannot allocate style name\n");
}
else /* unrecognized */
{
/* ignore token but announce it */
- WARN ( "%s: unknown token \"%s\"\n",
- fn, info->rtfTextBuf);
+ WARN ("unknown token \"%s\"\n", info->rtfTextBuf);
}
}
if (real_style) {
RTFGetToken (info);
if (!RTFCheckCM (info, rtfGroup, rtfEndGroup))
- ERR ( "%s: missing \"}\"\n", fn);
+ ERR ("missing \"}\"\n");
/*
* Check over the style structure. A name is a must.
* If no style number was specified, check whether it's the
@@ -1168,12 +1173,12 @@ static void ReadStyleSheet(RTF_Info *info)
* Some German RTF writers use "Standard" instead of "Normal".
*/
if (sp->rtfSName == NULL)
- ERR ( "%s: missing style name\n", fn);
+ ERR ("missing style name\n");
if (sp->rtfSNum < 0)
{
if (strncmp (buf, "Normal", 6) != 0
&& strncmp (buf, "Standard", 8) != 0)
- ERR ( "%s: missing style number\n", fn);
+ ERR ("missing style number\n");
sp->rtfSNum = rtfNormalStyleNum;
}
if (sp->rtfSNextPar == -1) /* if \snext not given, */
diff --git a/dll/win32/riched20/richole.c b/dll/win32/riched20/richole.c
index 326ecc537d5..5b6b2b666f7 100644
--- a/dll/win32/riched20/richole.c
+++ b/dll/win32/riched20/richole.c
@@ -315,16 +315,21 @@ IRichEditOle_fnGetClipboardData(IRichEditOle *me, CHARRANGE *lpchrg,
DWORD reco, LPDATAOBJECT *lplpdataobj)
{
IRichEditOleImpl *This = impl_from_IRichEditOle(me);
- CHARRANGE tmpchrg;
+ ME_Cursor start;
+ int nChars;
TRACE("(%p,%p,%d)\n",This, lpchrg, reco);
if(!lplpdataobj)
return E_INVALIDARG;
if(!lpchrg) {
- ME_GetSelection(This->editor, &tmpchrg.cpMin, &tmpchrg.cpMax);
- lpchrg = &tmpchrg;
+ int nFrom, nTo, nStartCur = ME_GetSelectionOfs(This->editor, &nFrom, &nTo);
+ start = This->editor->pCursors[nStartCur];
+ nChars = nTo - nFrom;
+ } else {
+ ME_CursorFromCharOfs(This->editor, lpchrg->cpMin, &start);
+ nChars = lpchrg->cpMax - lpchrg->cpMin;
}
- return ME_GetDataObject(This->editor, lpchrg, lplpdataobj);
+ return ME_GetDataObject(This->editor, &start, nChars, lplpdataobj);
}
static LONG WINAPI IRichEditOle_fnGetLinkCount(IRichEditOle *me)
@@ -383,11 +388,10 @@ IRichEditOle_fnInsertObject(IRichEditOle *me, REOBJECT *reo)
TRACE("(%p,%p)\n", This, reo);
if (reo->cbStruct < sizeof(*reo)) return STG_E_INVALIDPARAMETER;
- if (reo->poleobj) IOleObject_AddRef(reo->poleobj);
- if (reo->pstg) IStorage_AddRef(reo->pstg);
- if (reo->polesite) IOleClientSite_AddRef(reo->polesite);
ME_InsertOLEFromCursor(This->editor, reo, 0);
+ ME_CommitUndo(This->editor);
+ ME_UpdateRepaint(This->editor);
return S_OK;
}
@@ -1725,6 +1729,11 @@ void ME_GetOLEObjectSize(ME_Context *c, ME_Run *run, SIZE *pSize)
if (run->ole_obj->sizel.cx != 0 || run->ole_obj->sizel.cy != 0)
{
convert_sizel(c, &run->ole_obj->sizel, pSize);
+ if (c->editor->nZoomNumerator != 0)
+ {
+ pSize->cx = MulDiv(pSize->cx, c->editor->nZoomNumerator, c->editor->nZoomDenominator);
+ pSize->cy = MulDiv(pSize->cy, c->editor->nZoomNumerator, c->editor->nZoomDenominator);
+ }
return;
}
@@ -1815,53 +1824,45 @@ void ME_DrawOLE(ME_Context *c, int x, int y, ME_Run *run,
GetObjectW(stgm.u.hBitmap, sizeof(dibsect), &dibsect);
hMemDC = CreateCompatibleDC(c->hDC);
SelectObject(hMemDC, stgm.u.hBitmap);
- if (!has_size && c->editor->nZoomNumerator == 0)
+ if (has_size)
{
- sz.cx = dibsect.dsBm.bmWidth;
- sz.cy = dibsect.dsBm.bmHeight;
- BitBlt(c->hDC, x, y - dibsect.dsBm.bmHeight,
+ convert_sizel(c, &run->ole_obj->sizel, &sz);
+ } else {
+ sz.cx = MulDiv(dibsect.dsBm.bmWidth, c->dpi.cx, 96);
+ sz.cy = MulDiv(dibsect.dsBm.bmHeight, c->dpi.cy, 96);
+ }
+ if (c->editor->nZoomNumerator != 0)
+ {
+ sz.cx = MulDiv(sz.cx, c->editor->nZoomNumerator, c->editor->nZoomDenominator);
+ sz.cy = MulDiv(sz.cy, c->editor->nZoomNumerator, c->editor->nZoomDenominator);
+ }
+ if (sz.cx == dibsect.dsBm.bmWidth && sz.cy == dibsect.dsBm.bmHeight)
+ {
+ BitBlt(c->hDC, x, y - sz.cy,
dibsect.dsBm.bmWidth, dibsect.dsBm.bmHeight,
hMemDC, 0, 0, SRCCOPY);
- }
- else
- {
- if (has_size)
- {
- convert_sizel(c, &run->ole_obj->sizel, &sz);
- }
- else
- {
- sz.cx = MulDiv(dibsect.dsBm.bmWidth,
- c->editor->nZoomNumerator, c->editor->nZoomDenominator);
- sz.cy = MulDiv(dibsect.dsBm.bmHeight,
- c->editor->nZoomNumerator, c->editor->nZoomDenominator);
- }
+ } else {
StretchBlt(c->hDC, x, y - sz.cy, sz.cx, sz.cy,
- hMemDC, 0, 0, dibsect.dsBm.bmWidth, dibsect.dsBm.bmHeight, SRCCOPY);
+ hMemDC, 0, 0, dibsect.dsBm.bmWidth,
+ dibsect.dsBm.bmHeight, SRCCOPY);
}
if (!stgm.pUnkForRelease) DeleteObject(stgm.u.hBitmap);
break;
case TYMED_ENHMF:
GetEnhMetaFileHeader(stgm.u.hEnhMetaFile, sizeof(emh), &emh);
- if (!has_size && c->editor->nZoomNumerator == 0)
+ if (has_size)
{
- sz.cy = emh.rclBounds.bottom - emh.rclBounds.top;
- sz.cx = emh.rclBounds.right - emh.rclBounds.left;
+ convert_sizel(c, &run->ole_obj->sizel, &sz);
+ } else {
+ sz.cy = MulDiv(emh.rclBounds.bottom - emh.rclBounds.top, c->dpi.cx, 96);
+ sz.cx = MulDiv(emh.rclBounds.right - emh.rclBounds.left, c->dpi.cy, 96);
}
- else
+ if (c->editor->nZoomNumerator != 0)
{
- if (has_size)
- {
- convert_sizel(c, &run->ole_obj->sizel, &sz);
- }
- else
- {
- sz.cy = MulDiv(emh.rclBounds.bottom - emh.rclBounds.top,
- c->editor->nZoomNumerator, c->editor->nZoomDenominator);
- sz.cx = MulDiv(emh.rclBounds.right - emh.rclBounds.left,
- c->editor->nZoomNumerator, c->editor->nZoomDenominator);
- }
+ sz.cx = MulDiv(sz.cx, c->editor->nZoomNumerator, c->editor->nZoomDenominator);
+ sz.cy = MulDiv(sz.cy, c->editor->nZoomNumerator, c->editor->nZoomDenominator);
}
+
{
RECT rc;
diff --git a/dll/win32/riched20/rtf.h b/dll/win32/riched20/rtf.h
index 3277301b3a2..d8ac32396a8 100644
--- a/dll/win32/riched20/rtf.h
+++ b/dll/win32/riched20/rtf.h
@@ -1095,7 +1095,7 @@ typedef void (*RTFFuncPtr) (RTF_Info *); /* generic function pointer */
/* RTF parser stack element */
struct tagRTFState {
- CHARFORMAT2W fmt;
+ ME_Style *style;
int codePage;
int unicodeLength;
};
diff --git a/dll/win32/riched20/run.c b/dll/win32/riched20/run.c
index cf6c1fcb10f..cd282ec2d84 100644
--- a/dll/win32/riched20/run.c
+++ b/dll/win32/riched20/run.c
@@ -347,27 +347,6 @@ ME_DisplayItem *ME_MakeRun(ME_Style *s, ME_String *strData, int nFlags)
return item;
}
-/******************************************************************************
- * ME_InsertRun
- *
- * Inserts a run at a given character position (offset).
- */
-ME_DisplayItem *ME_InsertRun(ME_TextEditor *editor, int nCharOfs, ME_DisplayItem *pItem)
-{
- ME_Cursor tmp;
- ME_DisplayItem *pDI;
-
- assert(pItem->type == diRun || pItem->type == diUndoInsertRun);
-
- ME_CursorFromCharOfs(editor, nCharOfs, &tmp);
- pDI = ME_InsertRunAtCursor(editor, &tmp, pItem->member.run.style,
- pItem->member.run.strText->szData,
- pItem->member.run.strText->nLen,
- pItem->member.run.nFlags);
-
- return pDI;
-}
-
/******************************************************************************
* ME_InsertRunAtCursor
*
@@ -571,9 +550,14 @@ int ME_CharFromPointCursor(ME_TextEditor *editor, int cx, ME_Run *run)
static void ME_GetTextExtent(ME_Context *c, LPCWSTR szText, int nChars, ME_Style *s, SIZE *size)
{
HGDIOBJ hOldFont;
- hOldFont = ME_SelectStyleFont(c, s);
- GetTextExtentPoint32W(c->hDC, szText, nChars, size);
- ME_UnselectStyleFont(c, s, hOldFont);
+ if (c->hDC) {
+ hOldFont = ME_SelectStyleFont(c, s);
+ GetTextExtentPoint32W(c->hDC, szText, nChars, size);
+ ME_UnselectStyleFont(c, s, hOldFont);
+ } else {
+ size->cx = 0;
+ size->cy = 0;
+ }
}
/******************************************************************************
@@ -726,15 +710,13 @@ void ME_CalcRunExtent(ME_Context *c, const ME_Paragraph *para, int startx, ME_Ru
/******************************************************************************
* ME_SetSelectionCharFormat
- *
+ *
* Applies a style change, either to a current selection, or to insert cursor
* (ie. the style next typed characters will use).
- */
+ */
void ME_SetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt)
{
- int nFrom, nTo;
- ME_GetSelection(editor, &nFrom, &nTo);
- if (nFrom == nTo)
+ if (!ME_IsSelection(editor))
{
ME_Style *s;
if (!editor->pBuffer->pCharStyle)
@@ -742,57 +724,85 @@ void ME_SetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt)
s = ME_ApplyStyle(editor->pBuffer->pCharStyle, pFmt);
ME_ReleaseStyle(editor->pBuffer->pCharStyle);
editor->pBuffer->pCharStyle = s;
+ } else {
+ ME_Cursor *from, *to;
+ ME_GetSelection(editor, &from, &to);
+ ME_SetCharFormat(editor, from, to, pFmt);
}
- else
- ME_SetCharFormat(editor, nFrom, nTo-nFrom, pFmt);
}
/******************************************************************************
* ME_SetCharFormat
- *
+ *
* Applies a style change to the specified part of the text
- */
-void ME_SetCharFormat(ME_TextEditor *editor, int nOfs, int nChars, CHARFORMAT2W *pFmt)
+ *
+ * The start and end cursors specify the part of the text. These cursors will
+ * be updated to stay valid, but this function may invalidate other
+ * non-selection cursors. The end cursor may be NULL to specify all the text
+ * following the start cursor.
+ *
+ * If no text is selected, then nothing is done.
+ */
+void ME_SetCharFormat(ME_TextEditor *editor, ME_Cursor *start, ME_Cursor *end, CHARFORMAT2W *pFmt)
{
- ME_Cursor tmp, tmp2;
ME_DisplayItem *para;
+ ME_DisplayItem *run;
+ ME_DisplayItem *end_run = NULL;
- ME_CursorFromCharOfs(editor, nOfs, &tmp);
- if (tmp.nOffset)
- tmp.pRun = ME_SplitRunSimple(editor, tmp.pRun, tmp.nOffset);
+ if (end && start->pRun == end->pRun && start->nOffset == end->nOffset)
+ return;
- ME_CursorFromCharOfs(editor, nOfs+nChars, &tmp2);
- if (tmp2.nOffset)
- tmp2.pRun = ME_SplitRunSimple(editor, tmp2.pRun, tmp2.nOffset);
+ if (start->nOffset)
+ {
+ /* SplitRunSimple may or may not update the cursors, depending on whether they
+ * are selection cursors, but we need to make sure they are valid. */
+ ME_DisplayItem *split_run = start->pRun;
+ int split_offset = start->nOffset;
+ start->pRun = ME_SplitRunSimple(editor, split_run, split_offset);
+ start->nOffset = 0;
+ if (end && end->pRun == split_run)
+ {
+ end->pRun = start->pRun;
+ end->nOffset -= split_offset;
+ }
+ }
- para = tmp.pPara;
+ if (end && end->nOffset)
+ {
+ end_run = end->pRun = ME_SplitRunSimple(editor, end->pRun, end->nOffset);
+ end->nOffset = 0;
+ } else if (end) {
+ end_run = end->pRun;
+ }
+
+ run = start->pRun;
+ para = start->pPara;
para->member.para.nFlags |= MEPF_REWRAP;
- while(tmp.pRun != tmp2.pRun)
+ while(run != end_run)
{
ME_UndoItem *undo = NULL;
- ME_Style *new_style = ME_ApplyStyle(tmp.pRun->member.run.style, pFmt);
+ ME_Style *new_style = ME_ApplyStyle(run->member.run.style, pFmt);
/* ME_DumpStyle(new_style); */
undo = ME_AddUndoItem(editor, diUndoSetCharFormat, NULL);
if (undo) {
- undo->nStart = tmp.pRun->member.run.nCharOfs+para->member.para.nCharOfs;
- undo->nLen = tmp.pRun->member.run.strText->nLen;
- undo->di.member.ustyle = tmp.pRun->member.run.style;
+ undo->nStart = run->member.run.nCharOfs+para->member.para.nCharOfs;
+ undo->nLen = run->member.run.strText->nLen;
+ undo->di.member.ustyle = run->member.run.style;
/* we'd have to addref undo...ustyle and release tmp...style
but they'd cancel each other out so we can do nothing instead */
}
else
- ME_ReleaseStyle(tmp.pRun->member.run.style);
- tmp.pRun->member.run.style = new_style;
- tmp.pRun = ME_FindItemFwd(tmp.pRun, diRunOrParagraph);
- if (tmp.pRun->type == diParagraph)
+ ME_ReleaseStyle(run->member.run.style);
+ run->member.run.style = new_style;
+ run = ME_FindItemFwd(run, diRunOrParagraph);
+ if (run && run->type == diParagraph)
{
- para = tmp.pRun;
- tmp.pRun = ME_FindItemFwd(tmp.pRun, diRun);
- if (tmp.pRun != tmp2.pRun)
+ para = run;
+ run = ME_FindItemFwd(run, diRun);
+ if (run != end_run)
para->member.para.nFlags |= MEPF_REWRAP;
}
- assert(tmp.pRun);
}
}
@@ -842,20 +852,20 @@ void ME_GetDefaultCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt)
/******************************************************************************
* ME_GetSelectionCharFormat
- *
+ *
* If selection exists, it returns all style elements that are set consistently
- * in the whole selection. If not, it just returns the current style.
- */
+ * in the whole selection. If not, it just returns the current style.
+ */
void ME_GetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt)
{
- int nFrom, nTo;
- ME_GetSelection(editor, &nFrom, &nTo);
- if (nFrom == nTo && editor->pBuffer->pCharStyle)
+ ME_Cursor *from, *to;
+ if (!ME_IsSelection(editor) && editor->pBuffer->pCharStyle)
{
ME_CopyCharFormat(pFmt, &editor->pBuffer->pCharStyle->fmt);
return;
}
- ME_GetCharFormat(editor, nFrom, nTo, pFmt);
+ ME_GetSelection(editor, &from, &to);
+ ME_GetCharFormat(editor, from, to, pFmt);
}
/******************************************************************************
@@ -864,16 +874,17 @@ void ME_GetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt)
* Returns the style consisting of those attributes which are consistently set
* in the whole character range.
*/
-void ME_GetCharFormat(ME_TextEditor *editor, int nFrom, int nTo, CHARFORMAT2W *pFmt)
+void ME_GetCharFormat(ME_TextEditor *editor, const ME_Cursor *from,
+ const ME_Cursor *to, CHARFORMAT2W *pFmt)
{
ME_DisplayItem *run, *run_end;
- int nOffset, nOffset2;
CHARFORMAT2W tmp;
- ME_RunOfsFromCharOfs(editor, nFrom, NULL, &run, &nOffset);
- if (nFrom == nTo) /* special case - if selection is empty, take previous char's formatting */
+ run = from->pRun;
+ /* special case - if selection is empty, take previous char's formatting */
+ if (from->pRun == to->pRun && from->nOffset == to->nOffset)
{
- if (!nOffset)
+ if (!from->nOffset)
{
ME_DisplayItem *tmp_run = ME_FindItemBack(run, diRunOrParagraph);
if (tmp_run->type == diRun) {
@@ -884,10 +895,10 @@ void ME_GetCharFormat(ME_TextEditor *editor, int nFrom, int nTo, CHARFORMAT2W *p
ME_GetRunCharFormat(editor, run, pFmt);
return;
}
-
- if (nTo>nFrom) /* selection consists of chars from nFrom up to nTo-1 */
- nTo--;
- ME_RunOfsFromCharOfs(editor, nTo, NULL, &run_end, &nOffset2);
+
+ run_end = to->pRun;
+ if (!to->nOffset)
+ run_end = ME_FindItemBack(run_end, diRun);
ME_GetRunCharFormat(editor, run, pFmt);
diff --git a/dll/win32/riched20/style.c b/dll/win32/riched20/style.c
index a3b532ebd43..bb2f808954a 100644
--- a/dll/win32/riched20/style.c
+++ b/dll/win32/riched20/style.c
@@ -156,6 +156,7 @@ ME_Style *ME_MakeStyle(CHARFORMAT2W *style) {
s->hFont = NULL;
s->tm.tmAscent = -1;
all_refs++;
+ TRACE_(richedit_style)("ME_MakeStyle %p, total refs=%d\n", s, all_refs);
return s;
}
@@ -449,6 +450,7 @@ void ME_AddRefStyle(ME_Style *s)
assert(s->nRefs>0); /* style with 0 references isn't supposed to exist */
s->nRefs++;
all_refs++;
+ TRACE_(richedit_style)("ME_AddRefStyle %p, new refs=%d, total refs=%d\n", s, s->nRefs, all_refs);
}
void ME_ReleaseStyle(ME_Style *s)
@@ -465,16 +467,15 @@ void ME_ReleaseStyle(ME_Style *s)
ME_DestroyStyle(s);
}
-ME_Style *ME_GetInsertStyle(ME_TextEditor *editor, int nCursor) {
+ME_Style *ME_GetInsertStyle(ME_TextEditor *editor, int nCursor)
+{
if (ME_IsSelection(editor))
{
- ME_Cursor c;
- int from, to;
-
+ ME_Cursor *from, *to;
+
ME_GetSelection(editor, &from, &to);
- ME_CursorFromCharOfs(editor, from, &c);
- ME_AddRefStyle(c.pRun->member.run.style);
- return c.pRun->member.run.style;
+ ME_AddRefStyle(from->pRun->member.run.style);
+ return from->pRun->member.run.style;
}
if (editor->pBuffer->pCharStyle) {
ME_AddRefStyle(editor->pBuffer->pCharStyle);
diff --git a/dll/win32/riched20/table.c b/dll/win32/riched20/table.c
index 6c8ca76c4e7..cbfa2b3f771 100644
--- a/dll/win32/riched20/table.c
+++ b/dll/win32/riched20/table.c
@@ -70,6 +70,7 @@ static ME_DisplayItem* ME_InsertEndParaFromCursor(ME_TextEditor *editor,
}
tp = ME_SplitParagraph(editor, cursor->pRun, pStyle, eol_str, paraFlags);
+ ME_ReleaseStyle(pStyle);
cursor->pPara = tp;
cursor->pRun = ME_FindItemFwd(tp, diRun);
return tp;
@@ -95,6 +96,7 @@ ME_DisplayItem* ME_InsertTableRowStartAtParagraph(ME_TextEditor *editor,
editor->pCursors[0].nOffset = 0;
editor->pCursors[1] = editor->pCursors[0];
startRowPara = ME_InsertTableRowStartFromCursor(editor);
+ savedCursor.pPara = ME_GetParagraph(savedCursor.pRun);
editor->pCursors[0] = savedCursor;
editor->pCursors[1] = editor->pCursors[0];
@@ -121,8 +123,8 @@ ME_DisplayItem* ME_InsertTableRowStartAtParagraph(ME_TextEditor *editor,
ME_DisplayItem* ME_InsertTableCellFromCursor(ME_TextEditor *editor)
{
ME_DisplayItem *para;
- WCHAR cr = '\r';
- ME_String *eol_str = ME_MakeStringN(&cr, 1);
+ WCHAR tab = '\t';
+ ME_String *eol_str = ME_MakeStringN(&tab, 1);
para = ME_InsertEndParaFromCursor(editor, 0, eol_str, MEPF_CELL);
return para;
}
@@ -273,13 +275,14 @@ BOOL ME_IsInTable(ME_DisplayItem *pItem)
}
/* Table rows should either be deleted completely or not at all. */
-void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, int nOfs,int *nChars)
+void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, ME_Cursor *c, int *nChars)
{
- ME_Cursor c, c2;
- ME_DisplayItem *this_para, *end_para;
- ME_CursorFromCharOfs(editor, nOfs, &c);
- this_para = c.pPara;
- ME_CursorFromCharOfs(editor, nOfs + *nChars, &c2);
+ int nOfs = ME_GetCursorOfs(c);
+ ME_Cursor c2 = *c;
+ ME_DisplayItem *this_para = c->pPara;
+ ME_DisplayItem *end_para;
+
+ ME_MoveCursorChars(editor, &c2, *nChars);
end_para = c2.pPara;
if (c2.pRun->member.run.nFlags & MERF_ENDPARA) {
/* End offset might be in the middle of the end paragraph run.
@@ -355,27 +358,32 @@ void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, int nOfs,int *nChars)
this_para->member.para.pFmt->dwMask & PFM_TABLE &&
this_para->member.para.pFmt->wEffects & PFE_TABLE)
{
- pRun = c.pRun;
+ pRun = c->pRun;
/* Find the next tab or end paragraph to use as a delete boundary */
while (!(pRun->member.run.nFlags & (MERF_TAB|MERF_ENDPARA)))
pRun = ME_FindItemFwd(pRun, diRun);
nCharsToBoundary = pRun->member.run.nCharOfs
- - c.pRun->member.run.nCharOfs
- - c.nOffset;
+ - c->pRun->member.run.nCharOfs
+ - c->nOffset;
*nChars = min(*nChars, nCharsToBoundary);
} else if (end_para->member.para.pFmt->dwMask & PFM_TABLE &&
end_para->member.para.pFmt->wEffects & PFE_TABLE)
{
/* The deletion starts from before the row, so don't join it with
* previous non-empty paragraphs. */
+ ME_DisplayItem *curPara;
pRun = NULL;
- if (nOfs > this_para->member.para.nCharOfs)
+ if (nOfs > this_para->member.para.nCharOfs) {
pRun = ME_FindItemBack(end_para, diRun);
- if (!pRun)
+ curPara = end_para->member.para.prev_para;
+ }
+ if (!pRun) {
pRun = ME_FindItemFwd(end_para, diRun);
+ curPara = end_para;
+ }
if (pRun)
{
- nCharsToBoundary = ME_GetParagraph(pRun)->member.para.nCharOfs
+ nCharsToBoundary = curPara->member.para.nCharOfs
+ pRun->member.run.nCharOfs
- nOfs;
if (nCharsToBoundary >= 0)
@@ -549,8 +557,8 @@ void ME_TabPressedInTable(ME_TextEditor *editor, BOOL bSelectedRow)
ME_InvalidateSelection(editor);
{
int from, to;
- from = ME_GetCursorOfs(editor, 0);
- to = ME_GetCursorOfs(editor, 1);
+ from = ME_GetCursorOfs(&editor->pCursors[0]);
+ to = ME_GetCursorOfs(&editor->pCursors[1]);
if (from <= to)
{
fromCursor = editor->pCursors[0];
diff --git a/dll/win32/riched20/txthost.c b/dll/win32/riched20/txthost.c
index 8fabd8388d1..68f44372659 100644
--- a/dll/win32/riched20/txthost.c
+++ b/dll/win32/riched20/txthost.c
@@ -42,9 +42,9 @@ typedef struct ITextHostImpl {
BOOL bEmulateVersion10;
} ITextHostImpl;
-static ITextHostVtbl textHostVtbl;
+static const ITextHostVtbl textHostVtbl;
-ITextHost *ME_CreateTextHost(HWND hwnd, BOOL bEmulateVersion10)
+ITextHost *ME_CreateTextHost(HWND hwnd, CREATESTRUCTW *cs, BOOL bEmulateVersion10)
{
ITextHostImpl *texthost;
texthost = CoTaskMemAlloc(sizeof(*texthost));
@@ -59,7 +59,9 @@ ITextHost *ME_CreateTextHost(HWND hwnd, BOOL bEmulateVersion10)
editor = ME_MakeEditor((ITextHost*)texthost, bEmulateVersion10);
editor->exStyleFlags = GetWindowLongW(hwnd, GWL_EXSTYLE);
+ editor->styleFlags |= GetWindowLongW(hwnd, GWL_STYLE) & ES_WANTRETURN;
editor->hWnd = hwnd; /* FIXME: Remove editor's dependence on hWnd */
+ editor->hwndParent = cs->hwndParent;
SetWindowLongPtrW(hwnd, 0, (LONG_PTR)editor);
}
@@ -448,9 +450,13 @@ HRESULT WINAPI ITextHostImpl_TxNotify(ITextHost *iface,
void *pv)
{
ITextHostImpl *This = (ITextHostImpl *)iface;
+ ME_TextEditor *editor = (ME_TextEditor*)GetWindowLongPtrW(This->hWnd, 0);
HWND hwnd = This->hWnd;
- HWND parent = GetParent(hwnd);
- UINT id = GetWindowLongW(hwnd, GWLP_ID);
+ UINT id;
+
+ if (!editor || !editor->hwndParent) return S_OK;
+
+ id = GetWindowLongW(hwnd, GWLP_ID);
switch (iNotify)
{
@@ -471,13 +477,13 @@ HRESULT WINAPI ITextHostImpl_TxNotify(ITextHost *iface,
info->hwndFrom = hwnd;
info->idFrom = id;
info->code = iNotify;
- SendMessageW(parent, WM_NOTIFY, id, (LPARAM)info);
+ SendMessageW(editor->hwndParent, WM_NOTIFY, id, (LPARAM)info);
break;
}
case EN_UPDATE:
/* Only sent when the window is visible. */
- if (!IsWindowVisible(This->hWnd))
+ if (!IsWindowVisible(hwnd))
break;
/* Fall through */
case EN_CHANGE:
@@ -487,7 +493,7 @@ HRESULT WINAPI ITextHostImpl_TxNotify(ITextHost *iface,
case EN_MAXTEXT:
case EN_SETFOCUS:
case EN_VSCROLL:
- SendMessageW(parent, WM_COMMAND, MAKEWPARAM(id, iNotify), (LPARAM)hwnd);
+ SendMessageW(editor->hwndParent, WM_COMMAND, MAKEWPARAM(id, iNotify), (LPARAM)hwnd);
break;
case EN_MSGFILTER:
@@ -528,159 +534,114 @@ HRESULT WINAPI ITextHostImpl_TxGetSelectionBarWidth(ITextHost *iface,
#ifdef __i386__ /* thiscall functions are i386-specific */
#define THISCALL(func) __thiscall_ ## func
-#define DEFINE_THISCALL_WRAPPER(func) \
+#define DEFINE_THISCALL_WRAPPER(func,args) \
extern typeof(func) THISCALL(func); \
- __ASM_GLOBAL_FUNC(__thiscall_ ## func, \
+ __ASM_STDCALL_FUNC(__thiscall_ ## func, args, \
"popl %eax\n\t" \
"pushl %ecx\n\t" \
"pushl %eax\n\t" \
- "jmp " __ASM_NAME(#func) )
+ "jmp " __ASM_NAME(#func) __ASM_STDCALL(args) )
#else /* __i386__ */
#define THISCALL(func) func
-#define DEFINE_THISCALL_WRAPPER(func) /* nothing */
+#define DEFINE_THISCALL_WRAPPER(func,args) /* nothing */
#endif /* __i386__ */
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetDC);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxReleaseDC);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxShowScrollBar);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxEnableScrollBar);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetScrollRange);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetScrollPos);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxInvalidateRect);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxViewChange);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxCreateCaret);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxShowCaret);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCaretPos);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetTimer);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxKillTimer);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxScrollWindowEx);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCapture);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetFocus);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCursor);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxScreenToClient);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxClientToScreen);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxActivate);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxDeactivate);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetClientRect);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetViewInset);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetCharFormat);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetParaFormat);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetSysColor);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetBackStyle);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetMaxLength);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetScrollBars);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetPasswordChar);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetAcceleratorPos);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetExtent);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_OnTxCharFormatChange);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_OnTxParaFormatChange);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetPropertyBits);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxNotify);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxImmGetContext);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxImmReleaseContext);
-DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetSelectionBarWidth);
-
-static ITextHostVtbl textHostVtbl = {
- ITextHostImpl_QueryInterface,
- ITextHostImpl_AddRef,
- ITextHostImpl_Release,
- THISCALL(ITextHostImpl_TxGetDC),
- THISCALL(ITextHostImpl_TxReleaseDC),
- THISCALL(ITextHostImpl_TxShowScrollBar),
- THISCALL(ITextHostImpl_TxEnableScrollBar),
- THISCALL(ITextHostImpl_TxSetScrollRange),
- THISCALL(ITextHostImpl_TxSetScrollPos),
- THISCALL(ITextHostImpl_TxInvalidateRect),
- THISCALL(ITextHostImpl_TxViewChange),
- THISCALL(ITextHostImpl_TxCreateCaret),
- THISCALL(ITextHostImpl_TxShowCaret),
- THISCALL(ITextHostImpl_TxSetCaretPos),
- THISCALL(ITextHostImpl_TxSetTimer),
- THISCALL(ITextHostImpl_TxKillTimer),
- THISCALL(ITextHostImpl_TxScrollWindowEx),
- THISCALL(ITextHostImpl_TxSetCapture),
- THISCALL(ITextHostImpl_TxSetFocus),
- THISCALL(ITextHostImpl_TxSetCursor),
- THISCALL(ITextHostImpl_TxScreenToClient),
- THISCALL(ITextHostImpl_TxClientToScreen),
- THISCALL(ITextHostImpl_TxActivate),
- THISCALL(ITextHostImpl_TxDeactivate),
- THISCALL(ITextHostImpl_TxGetClientRect),
- THISCALL(ITextHostImpl_TxGetViewInset),
- THISCALL(ITextHostImpl_TxGetCharFormat),
- THISCALL(ITextHostImpl_TxGetParaFormat),
- THISCALL(ITextHostImpl_TxGetSysColor),
- THISCALL(ITextHostImpl_TxGetBackStyle),
- THISCALL(ITextHostImpl_TxGetMaxLength),
- THISCALL(ITextHostImpl_TxGetScrollBars),
- THISCALL(ITextHostImpl_TxGetPasswordChar),
- THISCALL(ITextHostImpl_TxGetAcceleratorPos),
- THISCALL(ITextHostImpl_TxGetExtent),
- THISCALL(ITextHostImpl_OnTxCharFormatChange),
- THISCALL(ITextHostImpl_OnTxParaFormatChange),
- THISCALL(ITextHostImpl_TxGetPropertyBits),
- THISCALL(ITextHostImpl_TxNotify),
- THISCALL(ITextHostImpl_TxImmGetContext),
- THISCALL(ITextHostImpl_TxImmReleaseContext),
- THISCALL(ITextHostImpl_TxGetSelectionBarWidth),
-};
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetDC,4)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxReleaseDC,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxShowScrollBar,12)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxEnableScrollBar,12)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetScrollRange,20)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetScrollPos,16)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxInvalidateRect,12)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxViewChange,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxCreateCaret,16)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxShowCaret,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCaretPos,12)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetTimer,12)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxKillTimer,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxScrollWindowEx,32)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCapture,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetFocus,4)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxSetCursor,12)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxScreenToClient,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxClientToScreen,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxActivate,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxDeactivate,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetClientRect,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetViewInset,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetCharFormat,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetParaFormat,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetSysColor,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetBackStyle,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetMaxLength,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetScrollBars,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetPasswordChar,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetAcceleratorPos,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetExtent,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_OnTxCharFormatChange,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_OnTxParaFormatChange,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetPropertyBits,12)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxNotify,12)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxImmGetContext,4)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxImmReleaseContext,8)
+DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetSelectionBarWidth,8)
#ifdef __i386__ /* thiscall functions are i386-specific */
#define STDCALL(func) __stdcall_ ## func
-#define DEFINE_STDCALL_WRAPPER(num,func) \
+#define DEFINE_STDCALL_WRAPPER(num,func,args) \
extern typeof(func) __stdcall_ ## func; \
- __ASM_GLOBAL_FUNC(__stdcall_ ## func, \
+ __ASM_STDCALL_FUNC(__stdcall_ ## func, args, \
"popl %eax\n\t" \
"popl %ecx\n\t" \
"pushl %eax\n\t" \
"movl (%ecx), %eax\n\t" \
"jmp *(4*(" #num "))(%eax)" )
-DEFINE_STDCALL_WRAPPER(3,ITextHostImpl_TxGetDC);
-DEFINE_STDCALL_WRAPPER(4,ITextHostImpl_TxReleaseDC);
-DEFINE_STDCALL_WRAPPER(5,ITextHostImpl_TxShowScrollBar);
-DEFINE_STDCALL_WRAPPER(6,ITextHostImpl_TxEnableScrollBar);
-DEFINE_STDCALL_WRAPPER(7,ITextHostImpl_TxSetScrollRange);
-DEFINE_STDCALL_WRAPPER(8,ITextHostImpl_TxSetScrollPos);
-DEFINE_STDCALL_WRAPPER(9,ITextHostImpl_TxInvalidateRect);
-DEFINE_STDCALL_WRAPPER(10,ITextHostImpl_TxViewChange);
-DEFINE_STDCALL_WRAPPER(11,ITextHostImpl_TxCreateCaret);
-DEFINE_STDCALL_WRAPPER(12,ITextHostImpl_TxShowCaret);
-DEFINE_STDCALL_WRAPPER(13,ITextHostImpl_TxSetCaretPos);
-DEFINE_STDCALL_WRAPPER(14,ITextHostImpl_TxSetTimer);
-DEFINE_STDCALL_WRAPPER(15,ITextHostImpl_TxKillTimer);
-DEFINE_STDCALL_WRAPPER(16,ITextHostImpl_TxScrollWindowEx);
-DEFINE_STDCALL_WRAPPER(17,ITextHostImpl_TxSetCapture);
-DEFINE_STDCALL_WRAPPER(18,ITextHostImpl_TxSetFocus);
-DEFINE_STDCALL_WRAPPER(19,ITextHostImpl_TxSetCursor);
-DEFINE_STDCALL_WRAPPER(20,ITextHostImpl_TxScreenToClient);
-DEFINE_STDCALL_WRAPPER(21,ITextHostImpl_TxClientToScreen);
-DEFINE_STDCALL_WRAPPER(22,ITextHostImpl_TxActivate);
-DEFINE_STDCALL_WRAPPER(23,ITextHostImpl_TxDeactivate);
-DEFINE_STDCALL_WRAPPER(24,ITextHostImpl_TxGetClientRect);
-DEFINE_STDCALL_WRAPPER(25,ITextHostImpl_TxGetViewInset);
-DEFINE_STDCALL_WRAPPER(26,ITextHostImpl_TxGetCharFormat);
-DEFINE_STDCALL_WRAPPER(27,ITextHostImpl_TxGetParaFormat);
-DEFINE_STDCALL_WRAPPER(28,ITextHostImpl_TxGetSysColor);
-DEFINE_STDCALL_WRAPPER(29,ITextHostImpl_TxGetBackStyle);
-DEFINE_STDCALL_WRAPPER(30,ITextHostImpl_TxGetMaxLength);
-DEFINE_STDCALL_WRAPPER(31,ITextHostImpl_TxGetScrollBars);
-DEFINE_STDCALL_WRAPPER(32,ITextHostImpl_TxGetPasswordChar);
-DEFINE_STDCALL_WRAPPER(33,ITextHostImpl_TxGetAcceleratorPos);
-DEFINE_STDCALL_WRAPPER(34,ITextHostImpl_TxGetExtent);
-DEFINE_STDCALL_WRAPPER(35,ITextHostImpl_OnTxCharFormatChange);
-DEFINE_STDCALL_WRAPPER(36,ITextHostImpl_OnTxParaFormatChange);
-DEFINE_STDCALL_WRAPPER(37,ITextHostImpl_TxGetPropertyBits);
-DEFINE_STDCALL_WRAPPER(38,ITextHostImpl_TxNotify);
-DEFINE_STDCALL_WRAPPER(39,ITextHostImpl_TxImmGetContext);
-DEFINE_STDCALL_WRAPPER(40,ITextHostImpl_TxImmReleaseContext);
-DEFINE_STDCALL_WRAPPER(41,ITextHostImpl_TxGetSelectionBarWidth);
+DEFINE_STDCALL_WRAPPER(3,ITextHostImpl_TxGetDC,4)
+DEFINE_STDCALL_WRAPPER(4,ITextHostImpl_TxReleaseDC,8)
+DEFINE_STDCALL_WRAPPER(5,ITextHostImpl_TxShowScrollBar,12)
+DEFINE_STDCALL_WRAPPER(6,ITextHostImpl_TxEnableScrollBar,12)
+DEFINE_STDCALL_WRAPPER(7,ITextHostImpl_TxSetScrollRange,20)
+DEFINE_STDCALL_WRAPPER(8,ITextHostImpl_TxSetScrollPos,16)
+DEFINE_STDCALL_WRAPPER(9,ITextHostImpl_TxInvalidateRect,12)
+DEFINE_STDCALL_WRAPPER(10,ITextHostImpl_TxViewChange,8)
+DEFINE_STDCALL_WRAPPER(11,ITextHostImpl_TxCreateCaret,16)
+DEFINE_STDCALL_WRAPPER(12,ITextHostImpl_TxShowCaret,8)
+DEFINE_STDCALL_WRAPPER(13,ITextHostImpl_TxSetCaretPos,12)
+DEFINE_STDCALL_WRAPPER(14,ITextHostImpl_TxSetTimer,12)
+DEFINE_STDCALL_WRAPPER(15,ITextHostImpl_TxKillTimer,8)
+DEFINE_STDCALL_WRAPPER(16,ITextHostImpl_TxScrollWindowEx,32)
+DEFINE_STDCALL_WRAPPER(17,ITextHostImpl_TxSetCapture,8)
+DEFINE_STDCALL_WRAPPER(18,ITextHostImpl_TxSetFocus,4)
+DEFINE_STDCALL_WRAPPER(19,ITextHostImpl_TxSetCursor,12)
+DEFINE_STDCALL_WRAPPER(20,ITextHostImpl_TxScreenToClient,8)
+DEFINE_STDCALL_WRAPPER(21,ITextHostImpl_TxClientToScreen,8)
+DEFINE_STDCALL_WRAPPER(22,ITextHostImpl_TxActivate,8)
+DEFINE_STDCALL_WRAPPER(23,ITextHostImpl_TxDeactivate,8)
+DEFINE_STDCALL_WRAPPER(24,ITextHostImpl_TxGetClientRect,8)
+DEFINE_STDCALL_WRAPPER(25,ITextHostImpl_TxGetViewInset,8)
+DEFINE_STDCALL_WRAPPER(26,ITextHostImpl_TxGetCharFormat,8)
+DEFINE_STDCALL_WRAPPER(27,ITextHostImpl_TxGetParaFormat,8)
+DEFINE_STDCALL_WRAPPER(28,ITextHostImpl_TxGetSysColor,8)
+DEFINE_STDCALL_WRAPPER(29,ITextHostImpl_TxGetBackStyle,8)
+DEFINE_STDCALL_WRAPPER(30,ITextHostImpl_TxGetMaxLength,8)
+DEFINE_STDCALL_WRAPPER(31,ITextHostImpl_TxGetScrollBars,8)
+DEFINE_STDCALL_WRAPPER(32,ITextHostImpl_TxGetPasswordChar,8)
+DEFINE_STDCALL_WRAPPER(33,ITextHostImpl_TxGetAcceleratorPos,8)
+DEFINE_STDCALL_WRAPPER(34,ITextHostImpl_TxGetExtent,8)
+DEFINE_STDCALL_WRAPPER(35,ITextHostImpl_OnTxCharFormatChange,8)
+DEFINE_STDCALL_WRAPPER(36,ITextHostImpl_OnTxParaFormatChange,8)
+DEFINE_STDCALL_WRAPPER(37,ITextHostImpl_TxGetPropertyBits,12)
+DEFINE_STDCALL_WRAPPER(38,ITextHostImpl_TxNotify,12)
+DEFINE_STDCALL_WRAPPER(39,ITextHostImpl_TxImmGetContext,4)
+DEFINE_STDCALL_WRAPPER(40,ITextHostImpl_TxImmReleaseContext,8)
+DEFINE_STDCALL_WRAPPER(41,ITextHostImpl_TxGetSelectionBarWidth,8)
-ITextHostVtbl itextHostStdcallVtbl = {
+const ITextHostVtbl itextHostStdcallVtbl = {
NULL,
NULL,
NULL,
@@ -726,3 +687,48 @@ ITextHostVtbl itextHostStdcallVtbl = {
};
#endif /* __i386__ */
+
+static const ITextHostVtbl textHostVtbl = {
+ ITextHostImpl_QueryInterface,
+ ITextHostImpl_AddRef,
+ ITextHostImpl_Release,
+ THISCALL(ITextHostImpl_TxGetDC),
+ THISCALL(ITextHostImpl_TxReleaseDC),
+ THISCALL(ITextHostImpl_TxShowScrollBar),
+ THISCALL(ITextHostImpl_TxEnableScrollBar),
+ THISCALL(ITextHostImpl_TxSetScrollRange),
+ THISCALL(ITextHostImpl_TxSetScrollPos),
+ THISCALL(ITextHostImpl_TxInvalidateRect),
+ THISCALL(ITextHostImpl_TxViewChange),
+ THISCALL(ITextHostImpl_TxCreateCaret),
+ THISCALL(ITextHostImpl_TxShowCaret),
+ THISCALL(ITextHostImpl_TxSetCaretPos),
+ THISCALL(ITextHostImpl_TxSetTimer),
+ THISCALL(ITextHostImpl_TxKillTimer),
+ THISCALL(ITextHostImpl_TxScrollWindowEx),
+ THISCALL(ITextHostImpl_TxSetCapture),
+ THISCALL(ITextHostImpl_TxSetFocus),
+ THISCALL(ITextHostImpl_TxSetCursor),
+ THISCALL(ITextHostImpl_TxScreenToClient),
+ THISCALL(ITextHostImpl_TxClientToScreen),
+ THISCALL(ITextHostImpl_TxActivate),
+ THISCALL(ITextHostImpl_TxDeactivate),
+ THISCALL(ITextHostImpl_TxGetClientRect),
+ THISCALL(ITextHostImpl_TxGetViewInset),
+ THISCALL(ITextHostImpl_TxGetCharFormat),
+ THISCALL(ITextHostImpl_TxGetParaFormat),
+ THISCALL(ITextHostImpl_TxGetSysColor),
+ THISCALL(ITextHostImpl_TxGetBackStyle),
+ THISCALL(ITextHostImpl_TxGetMaxLength),
+ THISCALL(ITextHostImpl_TxGetScrollBars),
+ THISCALL(ITextHostImpl_TxGetPasswordChar),
+ THISCALL(ITextHostImpl_TxGetAcceleratorPos),
+ THISCALL(ITextHostImpl_TxGetExtent),
+ THISCALL(ITextHostImpl_OnTxCharFormatChange),
+ THISCALL(ITextHostImpl_OnTxParaFormatChange),
+ THISCALL(ITextHostImpl_TxGetPropertyBits),
+ THISCALL(ITextHostImpl_TxNotify),
+ THISCALL(ITextHostImpl_TxImmGetContext),
+ THISCALL(ITextHostImpl_TxImmReleaseContext),
+ THISCALL(ITextHostImpl_TxGetSelectionBarWidth),
+};
diff --git a/dll/win32/riched20/txtsrv.c b/dll/win32/riched20/txtsrv.c
index a6d81703528..7ab2af45162 100644
--- a/dll/win32/riched20/txtsrv.c
+++ b/dll/win32/riched20/txtsrv.c
@@ -37,17 +37,17 @@
#ifdef __i386__ /* thiscall functions are i386-specific */
#define THISCALL(func) __thiscall_ ## func
-#define DEFINE_THISCALL_WRAPPER(func) \
+#define DEFINE_THISCALL_WRAPPER(func,args) \
extern typeof(func) THISCALL(func); \
- __ASM_GLOBAL_FUNC(__thiscall_ ## func, \
+ __ASM_STDCALL_FUNC(__thiscall_ ## func, args, \
"popl %eax\n\t" \
"pushl %ecx\n\t" \
"pushl %eax\n\t" \
- "jmp " __ASM_NAME(#func) )
+ "jmp " __ASM_NAME(#func) __ASM_STDCALL(args) )
#else /* __i386__ */
#define THISCALL(func) func
-#define DEFINE_THISCALL_WRAPPER(func) /* nothing */
+#define DEFINE_THISCALL_WRAPPER(func,args) /* nothing */
#endif /* __i386__ */
@@ -87,6 +87,8 @@ HRESULT WINAPI CreateTextServices(IUnknown * pUnkOuter,
ITextImpl->pMyHost = pITextHost;
ITextImpl->lpVtbl = &textservices_Vtbl;
ITextImpl->editor = ME_MakeEditor(pITextHost, FALSE);
+ ITextImpl->editor->exStyleFlags = 0;
+ ITextImpl->editor->rcFormat = (RECT){0,0,0,0};
ME_HandleMessage(ITextImpl->editor, WM_CREATE, 0, 0, TRUE, &hres);
if (pUnkOuter)
@@ -292,12 +294,14 @@ HRESULT WINAPI fnTextSrv_TxGetText(ITextServices *iface,
length = ME_GetTextLength(This->editor);
if (length)
{
+ ME_Cursor start;
BSTR bstr;
bstr = SysAllocStringByteLen(NULL, length * sizeof(WCHAR));
if (bstr == NULL)
return E_OUTOFMEMORY;
- ME_GetTextW(This->editor, bstr , 0, length, FALSE);
+ ME_CursorFromCharOfs(This->editor, 0, &start);
+ ME_GetTextW(This->editor, bstr, length, &start, INT_MAX, FALSE);
*pbstrText = bstr;
} else {
*pbstrText = NULL;
@@ -310,9 +314,11 @@ HRESULT WINAPI fnTextSrv_TxSetText(ITextServices *iface,
LPCWSTR pszText)
{
ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface);
+ ME_Cursor cursor;
- ME_InternalDeleteText(This->editor, 0, ME_GetTextLength(This->editor),
- FALSE);
+ ME_SetCursorToStart(This->editor, &cursor);
+ ME_InternalDeleteText(This->editor, &cursor,
+ ME_GetTextLength(This->editor), FALSE);
ME_InsertTextFromCursor(This->editor, 0, pszText, -1,
This->editor->pBuffer->pDefaultStyle);
ME_SetSelection(This->editor, 0, 0);
@@ -387,24 +393,24 @@ HRESULT WINAPI fnTextSrv_TxGetCachedSize(ITextServices *iface,
return E_NOTIMPL;
}
-DEFINE_THISCALL_WRAPPER(fnTextSrv_TxSendMessage)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_TxDraw)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetHScroll)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetVScroll)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxSetCursor)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_TxQueryHitPoint)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxInplaceActivate)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxInplaceDeactivate)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxUIActivate)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxUIDeactivate)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetText)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_TxSetText)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetCurrentTargetX)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetBaseLinePos)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetNaturalSize)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetDropTarget)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxPropertyBitsChange)
-DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetCachedSize)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_TxSendMessage,20)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_TxDraw,52)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetHScroll,24)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetVScroll,24)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxSetCursor,40)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_TxQueryHitPoint,44)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxInplaceActivate,8)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxInplaceDeactivate,4)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxUIActivate,4)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxUIDeactivate,4)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetText,8)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_TxSetText,8)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetCurrentTargetX,8)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetBaseLinePos,8)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetNaturalSize,36)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetDropTarget,8)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxPropertyBitsChange,12)
+DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetCachedSize,12)
static const ITextServicesVtbl textservices_Vtbl =
{
diff --git a/dll/win32/riched20/undo.c b/dll/win32/riched20/undo.c
index c2f7125b621..8db971186ca 100644
--- a/dll/win32/riched20/undo.c
+++ b/dll/win32/riched20/undo.c
@@ -298,17 +298,28 @@ static void ME_PlayUndoItem(ME_TextEditor *editor, ME_DisplayItem *pItem)
}
case diUndoSetCharFormat:
{
- ME_SetCharFormat(editor, pUItem->nStart, pUItem->nLen, &pItem->member.ustyle->fmt);
+ ME_Cursor start, end;
+ ME_CursorFromCharOfs(editor, pUItem->nStart, &start);
+ end = start;
+ ME_MoveCursorChars(editor, &end, pUItem->nLen);
+ ME_SetCharFormat(editor, &start, &end, &pItem->member.ustyle->fmt);
break;
}
case diUndoInsertRun:
{
- ME_InsertRun(editor, pItem->member.run.nCharOfs, pItem);
+ ME_Cursor tmp;
+ ME_CursorFromCharOfs(editor, pItem->member.run.nCharOfs, &tmp);
+ ME_InsertRunAtCursor(editor, &tmp, pItem->member.run.style,
+ pItem->member.run.strText->szData,
+ pItem->member.run.strText->nLen,
+ pItem->member.run.nFlags);
break;
}
case diUndoDeleteRun:
{
- ME_InternalDeleteText(editor, pUItem->nStart, pUItem->nLen, TRUE);
+ ME_Cursor tmp;
+ ME_CursorFromCharOfs(editor, pUItem->nStart, &tmp);
+ ME_InternalDeleteText(editor, &tmp, pUItem->nLen, TRUE);
break;
}
case diUndoJoinParagraphs:
diff --git a/dll/win32/riched20/wrap.c b/dll/win32/riched20/wrap.c
index 579f33ae19f..3b154904f58 100644
--- a/dll/win32/riched20/wrap.c
+++ b/dll/win32/riched20/wrap.c
@@ -456,6 +456,29 @@ static ME_DisplayItem *ME_WrapHandleRun(ME_WrapContext *wc, ME_DisplayItem *p)
return p->next;
}
+static int ME_GetParaLineSpace(ME_Context* c, ME_Paragraph* para)
+{
+ int sp = 0, ls = 0;
+ if (!(para->pFmt->dwMask & PFM_LINESPACING)) return 0;
+
+ /* FIXME: how to compute simply the line space in ls ??? */
+ /* FIXME: does line spacing include the line itself ??? */
+ switch (para->pFmt->bLineSpacingRule)
+ {
+ case 0: sp = ls; break;
+ case 1: sp = (3 * ls) / 2; break;
+ case 2: sp = 2 * ls; break;
+ case 3: sp = ME_twips2pointsY(c, para->pFmt->dyLineSpacing); if (sp < ls) sp = ls; break;
+ case 4: sp = ME_twips2pointsY(c, para->pFmt->dyLineSpacing); break;
+ case 5: sp = para->pFmt->dyLineSpacing / 20; break;
+ default: FIXME("Unsupported spacing rule value %d\n", para->pFmt->bLineSpacingRule);
+ }
+ if (c->editor->nZoomNumerator == 0)
+ return sp;
+ else
+ return sp * c->editor->nZoomNumerator / c->editor->nZoomDenominator;
+}
+
static void ME_PrepareParagraphForWrapping(ME_Context *c, ME_DisplayItem *tp);
static void ME_WrapTextParagraph(ME_Context *c, ME_DisplayItem *tp) {
@@ -499,7 +522,7 @@ static void ME_WrapTextParagraph(ME_Context *c, ME_DisplayItem *tp) {
if (!(pFmt->dwMask & PFM_TABLE && pFmt->wEffects & PFE_TABLE) &&
pFmt->dwMask & PFM_BORDER)
{
- border = ME_GetParaBorderWidth(c->editor, tp->member.para.pFmt->wBorders);
+ border = ME_GetParaBorderWidth(c, tp->member.para.pFmt->wBorders);
if (pFmt->wBorders & 1) {
wc.nFirstMargin += border;
wc.nLeftMargin += border;
@@ -580,7 +603,6 @@ BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor)
ME_DisplayItem *item;
ME_Context c;
BOOL bModified = FALSE;
- int yStart = -1;
int totalWidth = 0;
ME_InitContext(&c, editor, ITextHost_TxGetDC(editor->texthost));
@@ -598,11 +620,7 @@ BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor)
ME_WrapTextParagraph(&c, item);
if (bRedraw)
- {
item->member.para.nFlags |= MEPF_REPAINT;
- if (yStart == -1)
- yStart = c.pt.y;
- }
bModified = bModified | bRedraw;
@@ -776,6 +794,8 @@ ME_SendRequestResize(ME_TextEditor *editor, BOOL force)
{
REQRESIZE info;
+ info.nmhdr.hwndFrom = NULL;
+ info.nmhdr.idFrom = 0;
info.nmhdr.code = EN_REQUESTRESIZE;
info.rc = rc;
info.rc.right = editor->nTotalWidth;
diff --git a/dll/win32/riched20/writer.c b/dll/win32/riched20/writer.c
index 6cadbd44425..107fadfc70f 100644
--- a/dll/win32/riched20/writer.c
+++ b/dll/win32/riched20/writer.c
@@ -762,23 +762,23 @@ ME_StreamOutRTFText(ME_OutStream *pStream, const WCHAR *text, LONG nChars)
}
-static BOOL
-ME_StreamOutRTF(ME_TextEditor *editor, ME_OutStream *pStream, int nStart, int nChars, int dwFormat)
+static BOOL ME_StreamOutRTF(ME_TextEditor *editor, ME_OutStream *pStream,
+ const ME_Cursor *start, int nChars, int dwFormat)
{
- ME_DisplayItem *p, *pEnd, *pPara;
- int nOffset, nEndLen;
+ ME_Cursor cursor = *start;
+ ME_DisplayItem *prev_para = cursor.pPara;
+ ME_Cursor endCur = cursor;
- ME_RunOfsFromCharOfs(editor, nStart, &pPara, &p, &nOffset);
- ME_RunOfsFromCharOfs(editor, nStart+nChars, NULL, &pEnd, &nEndLen);
+ ME_MoveCursorChars(editor, &endCur, nChars);
if (!ME_StreamOutRTFHeader(pStream, dwFormat))
return FALSE;
- if (!ME_StreamOutRTFFontAndColorTbl(pStream, p, pEnd))
+ if (!ME_StreamOutRTFFontAndColorTbl(pStream, cursor.pRun, endCur.pRun))
return FALSE;
-
+
/* TODO: stylesheet table */
-
+
/* FIXME: maybe emit something smarter for the generator? */
if (!ME_StreamOutPrint(pStream, "{\\*\\generator Wine Riched20 2.0.????;}"))
return FALSE;
@@ -791,138 +791,129 @@ ME_StreamOutRTF(ME_TextEditor *editor, ME_OutStream *pStream, int nStart, int nC
/* TODO: section formatting properties */
- if (!ME_StreamOutRTFParaProps(editor, pStream, ME_GetParagraph(p)))
+ if (!ME_StreamOutRTFParaProps(editor, pStream, cursor.pPara))
return FALSE;
- while(1)
- {
- switch(p->type)
+ do {
+ if (cursor.pPara != prev_para)
{
- case diParagraph:
- if (!editor->bEmulateVersion10) { /* v4.1 */
- if (p->member.para.nFlags & MEPF_ROWSTART) {
- pStream->nNestingLevel++;
- if (pStream->nNestingLevel == 1) {
- if (!ME_StreamOutRTFTableProps(editor, pStream, p))
- return FALSE;
- }
- } else if (p->member.para.nFlags & MEPF_ROWEND) {
- pStream->nNestingLevel--;
- if (pStream->nNestingLevel >= 1) {
- if (!ME_StreamOutPrint(pStream, "{\\*\\nesttableprops"))
- return FALSE;
- if (!ME_StreamOutRTFTableProps(editor, pStream, p))
- return FALSE;
- if (!ME_StreamOutPrint(pStream, "\\nestrow}{\\nonesttables\\par}\r\n"))
- return FALSE;
- } else {
- if (!ME_StreamOutPrint(pStream, "\\row \r\n"))
- return FALSE;
- }
- } else if (!ME_StreamOutRTFParaProps(editor, pStream, p)) {
- return FALSE;
- }
- } else { /* v1.0 - 3.0 */
- if (p->member.para.pFmt->dwMask & PFM_TABLE &&
- p->member.para.pFmt->wEffects & PFE_TABLE)
- {
- if (!ME_StreamOutRTFTableProps(editor, pStream, p))
+ prev_para = cursor.pPara;
+ if (!editor->bEmulateVersion10) { /* v4.1 */
+ if (cursor.pPara->member.para.nFlags & MEPF_ROWSTART) {
+ pStream->nNestingLevel++;
+ if (pStream->nNestingLevel == 1) {
+ if (!ME_StreamOutRTFTableProps(editor, pStream, cursor.pPara))
return FALSE;
}
- if (!ME_StreamOutRTFParaProps(editor, pStream, p))
- return FALSE;
- }
- pPara = p;
- break;
- case diRun:
- if (p == pEnd && !nEndLen)
- break;
- TRACE("flags %xh\n", p->member.run.nFlags);
- /* TODO: emit embedded objects */
- if (pPara->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND))
- break;
- if (p->member.run.nFlags & MERF_GRAPHICS) {
- FIXME("embedded objects are not handled\n");
- } else if (p->member.run.nFlags & MERF_TAB) {
- if (editor->bEmulateVersion10 && /* v1.0 - 3.0 */
- pPara->member.para.pFmt->dwMask & PFM_TABLE &&
- pPara->member.para.pFmt->wEffects & PFE_TABLE)
- {
- if (!ME_StreamOutPrint(pStream, "\\cell "))
+ } else if (cursor.pPara->member.para.nFlags & MEPF_ROWEND) {
+ pStream->nNestingLevel--;
+ if (pStream->nNestingLevel >= 1) {
+ if (!ME_StreamOutPrint(pStream, "{\\*\\nesttableprops"))
+ return FALSE;
+ if (!ME_StreamOutRTFTableProps(editor, pStream, cursor.pPara))
+ return FALSE;
+ if (!ME_StreamOutPrint(pStream, "\\nestrow}{\\nonesttables\\par}\r\n"))
return FALSE;
} else {
- if (!ME_StreamOutPrint(pStream, "\\tab "))
- return FALSE;
- }
- } else if (p->member.run.nFlags & MERF_ENDCELL) {
- if (pStream->nNestingLevel > 1) {
- if (!ME_StreamOutPrint(pStream, "\\nestcell "))
- return FALSE;
- } else {
- if (!ME_StreamOutPrint(pStream, "\\cell "))
- return FALSE;
- }
- nChars--;
- } else if (p->member.run.nFlags & MERF_ENDPARA) {
- if (pPara->member.para.pFmt->dwMask & PFM_TABLE &&
- pPara->member.para.pFmt->wEffects & PFE_TABLE &&
- !(pPara->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND|MEPF_CELL)))
- {
if (!ME_StreamOutPrint(pStream, "\\row \r\n"))
return FALSE;
- } else {
- if (!ME_StreamOutPrint(pStream, "\r\n\\par"))
- return FALSE;
}
- /* Skip as many characters as required by current line break */
- nChars = max(0, nChars - p->member.run.strText->nLen);
- } else if (p->member.run.nFlags & MERF_ENDROW) {
- if (!ME_StreamOutPrint(pStream, "\\line \r\n"))
- return FALSE;
- nChars--;
- } else {
- int nEnd;
-
- if (!ME_StreamOutPrint(pStream, "{"))
- return FALSE;
- TRACE("style %p\n", p->member.run.style);
- if (!ME_StreamOutRTFCharProps(pStream, &p->member.run.style->fmt))
- return FALSE;
-
- nEnd = (p == pEnd) ? nEndLen : p->member.run.strText->nLen;
- if (!ME_StreamOutRTFText(pStream, p->member.run.strText->szData + nOffset, nEnd - nOffset))
- return FALSE;
- nOffset = 0;
- if (!ME_StreamOutPrint(pStream, "}"))
+ } else if (!ME_StreamOutRTFParaProps(editor, pStream, cursor.pPara)) {
+ return FALSE;
+ }
+ } else { /* v1.0 - 3.0 */
+ if (cursor.pPara->member.para.pFmt->dwMask & PFM_TABLE &&
+ cursor.pPara->member.para.pFmt->wEffects & PFE_TABLE)
+ {
+ if (!ME_StreamOutRTFTableProps(editor, pStream, cursor.pPara))
return FALSE;
}
- break;
- default: /* we missed the last item */
- assert(0);
+ if (!ME_StreamOutRTFParaProps(editor, pStream, cursor.pPara))
+ return FALSE;
+ }
}
- if (p == pEnd)
+
+ if (cursor.pRun == endCur.pRun && !endCur.nOffset)
break;
- p = ME_FindItemFwd(p, diRunOrParagraphOrEnd);
- }
+ TRACE("flags %xh\n", cursor.pRun->member.run.nFlags);
+ /* TODO: emit embedded objects */
+ if (cursor.pPara->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND))
+ break;
+ if (cursor.pRun->member.run.nFlags & MERF_GRAPHICS) {
+ FIXME("embedded objects are not handled\n");
+ } else if (cursor.pRun->member.run.nFlags & MERF_TAB) {
+ if (editor->bEmulateVersion10 && /* v1.0 - 3.0 */
+ cursor.pPara->member.para.pFmt->dwMask & PFM_TABLE &&
+ cursor.pPara->member.para.pFmt->wEffects & PFE_TABLE)
+ {
+ if (!ME_StreamOutPrint(pStream, "\\cell "))
+ return FALSE;
+ } else {
+ if (!ME_StreamOutPrint(pStream, "\\tab "))
+ return FALSE;
+ }
+ } else if (cursor.pRun->member.run.nFlags & MERF_ENDCELL) {
+ if (pStream->nNestingLevel > 1) {
+ if (!ME_StreamOutPrint(pStream, "\\nestcell "))
+ return FALSE;
+ } else {
+ if (!ME_StreamOutPrint(pStream, "\\cell "))
+ return FALSE;
+ }
+ nChars--;
+ } else if (cursor.pRun->member.run.nFlags & MERF_ENDPARA) {
+ if (cursor.pPara->member.para.pFmt->dwMask & PFM_TABLE &&
+ cursor.pPara->member.para.pFmt->wEffects & PFE_TABLE &&
+ !(cursor.pPara->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND|MEPF_CELL)))
+ {
+ if (!ME_StreamOutPrint(pStream, "\\row \r\n"))
+ return FALSE;
+ } else {
+ if (!ME_StreamOutPrint(pStream, "\r\n\\par"))
+ return FALSE;
+ }
+ /* Skip as many characters as required by current line break */
+ nChars = max(0, nChars - cursor.pRun->member.run.strText->nLen);
+ } else if (cursor.pRun->member.run.nFlags & MERF_ENDROW) {
+ if (!ME_StreamOutPrint(pStream, "\\line \r\n"))
+ return FALSE;
+ nChars--;
+ } else {
+ int nEnd;
+
+ if (!ME_StreamOutPrint(pStream, "{"))
+ return FALSE;
+ TRACE("style %p\n", cursor.pRun->member.run.style);
+ if (!ME_StreamOutRTFCharProps(pStream, &cursor.pRun->member.run.style->fmt))
+ return FALSE;
+
+ nEnd = (cursor.pRun == endCur.pRun) ? endCur.nOffset : cursor.pRun->member.run.strText->nLen;
+ if (!ME_StreamOutRTFText(pStream, cursor.pRun->member.run.strText->szData + cursor.nOffset,
+ nEnd - cursor.nOffset))
+ return FALSE;
+ cursor.nOffset = 0;
+ if (!ME_StreamOutPrint(pStream, "}"))
+ return FALSE;
+ }
+ } while (cursor.pRun != endCur.pRun && ME_NextRun(&cursor.pPara, &cursor.pRun));
+
if (!ME_StreamOutMove(pStream, "}\0", 2))
return FALSE;
return TRUE;
}
-static BOOL
-ME_StreamOutText(ME_TextEditor *editor, ME_OutStream *pStream, int nStart, int nChars, DWORD dwFormat)
+static BOOL ME_StreamOutText(ME_TextEditor *editor, ME_OutStream *pStream,
+ const ME_Cursor *start, int nChars, DWORD dwFormat)
{
- ME_DisplayItem *item;
+ ME_Cursor cursor = *start;
int nLen;
UINT nCodePage = CP_ACP;
char *buffer = NULL;
int nBufLen = 0;
BOOL success = TRUE;
- ME_RunOfsFromCharOfs(editor, nStart, NULL, &item, &nStart);
-
- if (!item)
+ if (!cursor.pRun)
return FALSE;
if (dwFormat & SF_USECODEPAGE)
@@ -930,10 +921,10 @@ ME_StreamOutText(ME_TextEditor *editor, ME_OutStream *pStream, int nStart, int n
/* TODO: Handle SF_TEXTIZED */
- while (success && nChars && item) {
- nLen = min(nChars, item->member.run.strText->nLen - nStart);
+ while (success && nChars && cursor.pRun) {
+ nLen = min(nChars, cursor.pRun->member.run.strText->nLen - cursor.nOffset);
- if (!editor->bEmulateVersion10 && item->member.run.nFlags & MERF_ENDPARA)
+ if (!editor->bEmulateVersion10 && cursor.pRun->member.run.nFlags & MERF_ENDPARA)
{
static const WCHAR szEOL[2] = { '\r', '\n' };
@@ -944,27 +935,27 @@ ME_StreamOutText(ME_TextEditor *editor, ME_OutStream *pStream, int nStart, int n
success = ME_StreamOutMove(pStream, "\r\n", 2);
} else {
if (dwFormat & SF_UNICODE)
- success = ME_StreamOutMove(pStream, (const char *)(item->member.run.strText->szData + nStart),
+ success = ME_StreamOutMove(pStream, (const char *)(cursor.pRun->member.run.strText->szData + cursor.nOffset),
sizeof(WCHAR) * nLen);
else {
int nSize;
- nSize = WideCharToMultiByte(nCodePage, 0, item->member.run.strText->szData + nStart,
+ nSize = WideCharToMultiByte(nCodePage, 0, cursor.pRun->member.run.strText->szData + cursor.nOffset,
nLen, NULL, 0, NULL, NULL);
if (nSize > nBufLen) {
FREE_OBJ(buffer);
buffer = ALLOC_N_OBJ(char, nSize);
nBufLen = nSize;
}
- WideCharToMultiByte(nCodePage, 0, item->member.run.strText->szData + nStart,
+ WideCharToMultiByte(nCodePage, 0, cursor.pRun->member.run.strText->szData + cursor.nOffset,
nLen, buffer, nSize, NULL, NULL);
success = ME_StreamOutMove(pStream, buffer, nSize);
}
}
nChars -= nLen;
- nStart = 0;
- item = ME_FindItemFwd(item, diRun);
+ cursor.nOffset = 0;
+ cursor.pRun = ME_FindItemFwd(cursor.pRun, diRun);
}
FREE_OBJ(buffer);
@@ -972,24 +963,16 @@ ME_StreamOutText(ME_TextEditor *editor, ME_OutStream *pStream, int nStart, int n
}
-LRESULT
-ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat, int nStart, int nTo, EDITSTREAM *stream)
+LRESULT ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat,
+ const ME_Cursor *start,
+ int nChars, EDITSTREAM *stream)
{
ME_OutStream *pStream = ME_StreamOutInit(editor, stream);
- if (nTo == -1)
- {
- nTo = ME_GetTextLength(editor);
- /* Generate an end-of-paragraph at the end of SCF_ALL RTF output */
- if (dwFormat & SF_RTF)
- nTo++;
- }
- TRACE("from %d to %d\n", nStart, nTo);
-
if (dwFormat & SF_RTF)
- ME_StreamOutRTF(editor, pStream, nStart, nTo - nStart, dwFormat);
+ ME_StreamOutRTF(editor, pStream, start, nChars, dwFormat);
else if (dwFormat & SF_TEXT || dwFormat & SF_TEXTIZED)
- ME_StreamOutText(editor, pStream, nStart, nTo - nStart, dwFormat);
+ ME_StreamOutText(editor, pStream, start, nChars, dwFormat);
if (!pStream->stream->dwError)
ME_StreamOutFlush(pStream);
return ME_StreamOutFree(pStream);
@@ -998,13 +981,19 @@ ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat, int nStart, int nTo, ED
LRESULT
ME_StreamOut(ME_TextEditor *editor, DWORD dwFormat, EDITSTREAM *stream)
{
- int nStart, nTo;
+ ME_Cursor start;
+ int nChars;
- if (dwFormat & SFF_SELECTION)
- ME_GetSelection(editor, &nStart, &nTo);
- else {
- nStart = 0;
- nTo = -1;
+ if (dwFormat & SFF_SELECTION) {
+ int nStart, nTo;
+ start = editor->pCursors[ME_GetSelectionOfs(editor, &nStart, &nTo)];
+ nChars = nTo - nStart;
+ } else {
+ ME_SetCursorToStart(editor, &start);
+ nChars = ME_GetTextLength(editor);
+ /* Generate an end-of-paragraph at the end of SCF_ALL RTF output */
+ if (dwFormat & SF_RTF)
+ nChars++;
}
- return ME_StreamOutRange(editor, dwFormat, nStart, nTo, stream);
+ return ME_StreamOutRange(editor, dwFormat, &start, nChars, stream);
}
diff --git a/dll/win32/rpcrt4/cproxy.c b/dll/win32/rpcrt4/cproxy.c
index 6c26d181978..9ce555f7146 100644
--- a/dll/win32/rpcrt4/cproxy.c
+++ b/dll/win32/rpcrt4/cproxy.c
@@ -2,6 +2,7 @@
* COM proxy implementation
*
* Copyright 2001 Ove Kåven, TransGaming Technologies
+ * Copyright 2009 Alexandre Julliard
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,6 +21,9 @@
* TODO: Handle non-i386 architectures
*/
+#include "config.h"
+#include "wine/port.h"
+
#include
#define COBJMACROS
@@ -37,21 +41,19 @@
WINE_DEFAULT_DEBUG_CHANNEL(ole);
-struct StublessThunk;
-
/* I don't know what MS's std proxy structure looks like,
so this probably doesn't match, but that shouldn't matter */
typedef struct {
const IRpcProxyBufferVtbl *lpVtbl;
LPVOID *PVtbl;
LONG RefCount;
- const MIDL_STUBLESS_PROXY_INFO *stubless;
const IID* piid;
LPUNKNOWN pUnkOuter;
+ IUnknown *base_object; /* must be at offset 0x10 from PVtbl */
+ IRpcProxyBuffer *base_proxy;
PCInterfaceName name;
LPPSFACTORYBUFFER pPSFactory;
LPRPCCHANNELBUFFER pChannel;
- struct StublessThunk *thunks;
} StdProxyImpl;
static const IRpcProxyBufferVtbl StdProxy_Vtbl;
@@ -62,66 +64,111 @@ static const IRpcProxyBufferVtbl StdProxy_Vtbl;
#include "pshpack1.h"
-struct StublessThunk {
+struct thunk {
BYTE push;
DWORD index;
- BYTE call;
+ BYTE jmp;
LONG handler;
- BYTE ret;
- WORD bytes;
- BYTE pad[3];
};
#include "poppack.h"
-/* adjust the stack size since we don't use Windows's method */
-#define STACK_ADJUST sizeof(DWORD)
+extern void call_stubless_func(void);
+__ASM_GLOBAL_FUNC(call_stubless_func,
+ "pushl %esp\n\t" /* pointer to index */
+ __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
+ "call " __ASM_NAME("ObjectStubless") __ASM_STDCALL(4) "\n\t"
+ "popl %edx\n\t" /* args size */
+ __ASM_CFI(".cfi_adjust_cfa_offset -4\n\t")
+ "movl (%esp),%ecx\n\t" /* return address */
+ "addl %edx,%esp\n\t"
+ "jmp *%ecx" );
-#define FILL_STUBLESS(x,idx,stk) \
- x->push = 0x68; /* pushl [immediate] */ \
- x->index = (idx); \
- x->call = 0xe8; /* call [near] */ \
- x->handler = (char*)ObjectStubless - (char*)&x->ret; \
- x->ret = 0xc2; /* ret [immediate] */ \
- x->bytes = stk; \
- x->pad[0] = 0x8d; /* leal (%esi),%esi */ \
- x->pad[1] = 0x76; \
- x->pad[2] = 0x00;
-
-static HRESULT WINAPI ObjectStubless(DWORD index)
+HRESULT WINAPI ObjectStubless(DWORD *args)
{
- char *args = (char*)(&index + 2);
- LPVOID iface = *(LPVOID*)args;
+ DWORD index = args[0];
+ void **iface = (void **)args[2];
+ const void **vtbl = (const void **)*iface;
+ const MIDL_STUBLESS_PROXY_INFO *stubless = *(const MIDL_STUBLESS_PROXY_INFO **)(vtbl - 2);
+ const PFORMAT_STRING fs = stubless->ProcFormatString + stubless->FormatStringOffset[index];
- ICOM_THIS_MULTI(StdProxyImpl,PVtbl,iface);
+ /* store bytes to remove from stack */
+ args[0] = *(const WORD*)(fs + 8);
+ TRACE("(%p)->(%d)([%d bytes]) ret=%08x\n", iface, index, args[0], args[1]);
- PFORMAT_STRING fs = This->stubless->ProcFormatString + This->stubless->FormatStringOffset[index];
- unsigned bytes = *(const WORD*)(fs+8) - STACK_ADJUST;
- TRACE("(%p)->(%d)([%d bytes]) ret=%08x\n", iface, index, bytes, *(DWORD*)(args+bytes));
+ return NdrClientCall2(stubless->pStubDesc, fs, args + 2);
+}
- return NdrClientCall2(This->stubless->pStubDesc, fs, args);
+#define BLOCK_SIZE 1024
+#define MAX_BLOCKS 64 /* 64k methods should be enough for anybody */
+
+static const struct thunk *method_blocks[MAX_BLOCKS];
+
+static const struct thunk *allocate_block( unsigned int num )
+{
+ unsigned int i;
+ struct thunk *prev, *block;
+
+ block = VirtualAlloc( NULL, BLOCK_SIZE * sizeof(*block),
+ MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE );
+ if (!block) return NULL;
+
+ for (i = 0; i < BLOCK_SIZE; i++)
+ {
+ block[i].push = 0x68; /* pushl */
+ block[i].index = BLOCK_SIZE * num + i + 3;
+ block[i].jmp = 0xe9; /* jmp */
+ block[i].handler = (char *)call_stubless_func - (char *)(&block[i].handler + 1);
+ }
+ VirtualProtect( block, BLOCK_SIZE * sizeof(*block), PAGE_EXECUTE_READ, NULL );
+ prev = InterlockedCompareExchangePointer( (void **)&method_blocks[num], block, NULL );
+ if (prev) /* someone beat us to it */
+ {
+ VirtualFree( block, 0, MEM_RELEASE );
+ block = prev;
+ }
+ return block;
+}
+
+static BOOL fill_stubless_table( IUnknownVtbl *vtbl, DWORD num )
+{
+ const void **entry = (const void **)(vtbl + 1);
+ DWORD i, j;
+
+ if (num - 3 > BLOCK_SIZE * MAX_BLOCKS)
+ {
+ FIXME( "%u methods not supported\n", num );
+ return FALSE;
+ }
+ for (i = 0; i < (num - 3 + BLOCK_SIZE - 1) / BLOCK_SIZE; i++)
+ {
+ const struct thunk *block = method_blocks[i];
+ if (!block && !(block = allocate_block( i ))) return FALSE;
+ for (j = 0; j < BLOCK_SIZE && j < num - 3 - i * BLOCK_SIZE; j++, entry++)
+ if (*entry == (LPVOID)-1) *entry = &block[j];
+ }
+ return TRUE;
}
#else /* __i386__ */
-/* can't do that on this arch */
-struct StublessThunk { int dummy; };
-#define FILL_STUBLESS(x,idx,stk) \
- ERR("stubless proxies are not supported on this architecture\n");
-#define STACK_ADJUST 0
+static BOOL fill_stubless_table( IUnknownVtbl *vtbl, DWORD num )
+{
+ ERR("stubless proxies are not supported on this architecture\n");
+ return FALSE;
+}
#endif /* __i386__ */
-HRESULT WINAPI StdProxy_Construct(REFIID riid,
- LPUNKNOWN pUnkOuter,
- const ProxyFileInfo *ProxyInfo,
- int Index,
- LPPSFACTORYBUFFER pPSFactory,
- LPRPCPROXYBUFFER *ppProxy,
- LPVOID *ppvObj)
+HRESULT StdProxy_Construct(REFIID riid,
+ LPUNKNOWN pUnkOuter,
+ const ProxyFileInfo *ProxyInfo,
+ int Index,
+ LPPSFACTORYBUFFER pPSFactory,
+ LPRPCPROXYBUFFER *ppProxy,
+ LPVOID *ppvObj)
{
StdProxyImpl *This;
- const MIDL_STUBLESS_PROXY_INFO *stubless = NULL;
PCInterfaceName name = ProxyInfo->pNamesArray[Index];
CInterfaceProxyVtbl *vtbl = ProxyInfo->pProxyVtblList[Index];
@@ -129,14 +176,12 @@ HRESULT WINAPI StdProxy_Construct(REFIID riid,
/* TableVersion = 2 means it is the stubless version of CInterfaceProxyVtbl */
if (ProxyInfo->TableVersion > 1) {
- stubless = *(const void **)vtbl;
+ ULONG count = ProxyInfo->pStubVtblList[Index]->header.DispatchTableCount;
vtbl = (CInterfaceProxyVtbl *)((const void **)vtbl + 1);
- TRACE("stubless=%p\n", stubless);
+ TRACE("stubless vtbl %p: count=%d\n", vtbl->Vtbl, count );
+ fill_stubless_table( (IUnknownVtbl *)vtbl->Vtbl, count );
}
- TRACE("iid=%s\n", debugstr_guid(vtbl->header.piid));
- TRACE("vtbl=%p\n", vtbl->Vtbl);
-
if (!IsEqualGUID(vtbl->header.piid, riid)) {
ERR("IID mismatch during proxy creation\n");
return RPC_E_UNEXPECTED;
@@ -145,51 +190,37 @@ HRESULT WINAPI StdProxy_Construct(REFIID riid,
This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(StdProxyImpl));
if (!This) return E_OUTOFMEMORY;
- if (stubless) {
- CInterfaceStubVtbl *svtbl = ProxyInfo->pStubVtblList[Index];
- unsigned long i, count = svtbl->header.DispatchTableCount;
- /* Maybe the original vtbl is just modified directly to point at
- * ObjectStublessClientXXX thunks in real Windows, but I don't like it
- */
- TRACE("stubless thunks: count=%ld\n", count);
- This->thunks = HeapAlloc(GetProcessHeap(),0,sizeof(struct StublessThunk)*count);
- This->PVtbl = HeapAlloc(GetProcessHeap(),0,sizeof(LPVOID)*count);
- for (i=0; ithunks[i];
- if (vtbl->Vtbl[i] == (LPVOID)-1) {
- PFORMAT_STRING fs = stubless->ProcFormatString + stubless->FormatStringOffset[i];
- unsigned bytes = *(const WORD*)(fs+8) - STACK_ADJUST;
- TRACE("method %ld: stacksize=%d\n", i, bytes);
- FILL_STUBLESS(thunk, i, bytes)
- This->PVtbl[i] = thunk;
- }
- else {
- memset(thunk, 0, sizeof(struct StublessThunk));
- This->PVtbl[i] = vtbl->Vtbl[i];
- }
- }
- }
- else
- This->PVtbl = vtbl->Vtbl;
-
+ if (!pUnkOuter) pUnkOuter = (IUnknown *)This;
This->lpVtbl = &StdProxy_Vtbl;
+ This->PVtbl = vtbl->Vtbl;
/* one reference for the proxy */
This->RefCount = 1;
- This->stubless = stubless;
This->piid = vtbl->header.piid;
+ This->base_object = NULL;
+ This->base_proxy = NULL;
This->pUnkOuter = pUnkOuter;
This->name = name;
This->pPSFactory = pPSFactory;
This->pChannel = NULL;
+
+ if(ProxyInfo->pDelegatedIIDs && ProxyInfo->pDelegatedIIDs[Index])
+ {
+ HRESULT r = create_proxy( ProxyInfo->pDelegatedIIDs[Index], NULL,
+ &This->base_proxy, (void **)&This->base_object );
+ if (FAILED(r))
+ {
+ HeapFree( GetProcessHeap(), 0, This );
+ return r;
+ }
+ }
+
*ppProxy = (LPRPCPROXYBUFFER)&This->lpVtbl;
*ppvObj = &This->PVtbl;
- /* if there is no outer unknown then the caller will control the lifetime
- * of the proxy object through the proxy buffer, so no need to increment the
- * ref count of the proxy object */
- if (pUnkOuter)
- IUnknown_AddRef((IUnknown *)*ppvObj);
+ IUnknown_AddRef((IUnknown *)*ppvObj);
IPSFactoryBuffer_AddRef(pPSFactory);
+ TRACE( "iid=%s this %p proxy %p obj %p vtbl %p base proxy %p base obj %p\n",
+ debugstr_guid(riid), This, *ppProxy, *ppvObj, This->PVtbl, This->base_proxy, This->base_object );
return S_OK;
}
@@ -200,11 +231,10 @@ static void StdProxy_Destruct(LPRPCPROXYBUFFER iface)
if (This->pChannel)
IRpcProxyBuffer_Disconnect(iface);
+ if (This->base_object) IUnknown_Release( This->base_object );
+ if (This->base_proxy) IRpcProxyBuffer_Release( This->base_proxy );
+
IPSFactoryBuffer_Release(This->pPSFactory);
- if (This->thunks) {
- HeapFree(GetProcessHeap(),0,This->PVtbl);
- HeapFree(GetProcessHeap(),0,This->thunks);
- }
HeapFree(GetProcessHeap(),0,This);
}
@@ -259,6 +289,7 @@ static HRESULT WINAPI StdProxy_Connect(LPRPCPROXYBUFFER iface,
This->pChannel = pChannel;
IRpcChannelBuffer_AddRef(pChannel);
+ if (This->base_proxy) IRpcProxyBuffer_Connect( This->base_proxy, pChannel );
return S_OK;
}
@@ -267,6 +298,8 @@ static VOID WINAPI StdProxy_Disconnect(LPRPCPROXYBUFFER iface)
ICOM_THIS_MULTI(StdProxyImpl,lpVtbl,iface);
TRACE("(%p)->Disconnect()\n",This);
+ if (This->base_proxy) IRpcProxyBuffer_Disconnect( This->base_proxy );
+
IRpcChannelBuffer_Release(This->pChannel);
This->pChannel = NULL;
}
diff --git a/dll/win32/rpcrt4/cpsf.c b/dll/win32/rpcrt4/cpsf.c
index bece899d964..ac1eccf56fa 100644
--- a/dll/win32/rpcrt4/cpsf.c
+++ b/dll/win32/rpcrt4/cpsf.c
@@ -145,6 +145,41 @@ static const IPSFactoryBufferVtbl CStdPSFactory_Vtbl =
CStdPSFactory_CreateStub
};
+
+static void init_psfactory( CStdPSFactoryBuffer *psfac, const ProxyFileInfo **file_list )
+{
+ DWORD i, j, k;
+
+ psfac->lpVtbl = &CStdPSFactory_Vtbl;
+ psfac->RefCount = 0;
+ psfac->pProxyFileList = file_list;
+ for (i = 0; file_list[i]; i++)
+ {
+ const PCInterfaceProxyVtblList *proxies = file_list[i]->pProxyVtblList;
+ const PCInterfaceStubVtblList *stubs = file_list[i]->pStubVtblList;
+
+ for (j = 0; j < file_list[i]->TableSize; j++)
+ {
+ /* FIXME: i think that different vtables should be copied for
+ * async interfaces */
+ void * const *pSrcRpcStubVtbl = (void * const *)&CStdStubBuffer_Vtbl;
+ void **pRpcStubVtbl = (void **)&stubs[j]->Vtbl;
+
+ if (file_list[i]->pDelegatedIIDs && file_list[i]->pDelegatedIIDs[j])
+ {
+ void **vtbl = proxies[j]->Vtbl;
+ if (file_list[i]->TableVersion > 1) vtbl++;
+ fill_delegated_proxy_table( (IUnknownVtbl *)vtbl, stubs[j]->header.DispatchTableCount );
+ pSrcRpcStubVtbl = (void * const *)&CStdStubBuffer_Delegating_Vtbl;
+ }
+
+ for (k = 0; k < sizeof(IRpcStubBufferVtbl)/sizeof(void *); k++)
+ if (!pRpcStubVtbl[k]) pRpcStubVtbl[k] = pSrcRpcStubVtbl[k];
+ }
+ }
+}
+
+
/***********************************************************************
* NdrDllGetClassObject [RPCRT4.@]
*/
@@ -158,35 +193,8 @@ HRESULT WINAPI NdrDllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv,
pPSFactoryBuffer);
*ppv = NULL;
- if (!pPSFactoryBuffer->lpVtbl) {
- const ProxyFileInfo **pProxyFileList2;
- DWORD max_delegating_vtbl_size = 0;
- pPSFactoryBuffer->lpVtbl = &CStdPSFactory_Vtbl;
- pPSFactoryBuffer->RefCount = 0;
- pPSFactoryBuffer->pProxyFileList = pProxyFileList;
- for (pProxyFileList2 = pProxyFileList; *pProxyFileList2; pProxyFileList2++) {
- int i;
- for (i = 0; i < (*pProxyFileList2)->TableSize; i++) {
- /* FIXME: i think that different vtables should be copied for
- * async interfaces */
- void * const *pSrcRpcStubVtbl = (void * const *)&CStdStubBuffer_Vtbl;
- void **pRpcStubVtbl = (void **)&(*pProxyFileList2)->pStubVtblList[i]->Vtbl;
- unsigned int j;
+ if (!pPSFactoryBuffer->lpVtbl) init_psfactory( pPSFactoryBuffer, pProxyFileList );
- if ((*pProxyFileList2)->pDelegatedIIDs && (*pProxyFileList2)->pDelegatedIIDs[i]) {
- pSrcRpcStubVtbl = (void * const *)&CStdStubBuffer_Delegating_Vtbl;
- if ((*pProxyFileList2)->pStubVtblList[i]->header.DispatchTableCount > max_delegating_vtbl_size)
- max_delegating_vtbl_size = (*pProxyFileList2)->pStubVtblList[i]->header.DispatchTableCount;
- }
-
- for (j = 0; j < sizeof(IRpcStubBufferVtbl)/sizeof(void *); j++)
- if (!pRpcStubVtbl[j])
- pRpcStubVtbl[j] = pSrcRpcStubVtbl[j];
- }
- }
- if(max_delegating_vtbl_size > 0)
- create_delegating_vtbl(max_delegating_vtbl_size);
- }
if (pclsid && IsEqualGUID(rclsid, pclsid))
return IPSFactoryBuffer_QueryInterface((LPPSFACTORYBUFFER)pPSFactoryBuffer, iid, ppv);
else {
@@ -207,7 +215,7 @@ HRESULT WINAPI NdrDllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv,
*/
HRESULT WINAPI NdrDllCanUnloadNow(CStdPSFactoryBuffer *pPSFactoryBuffer)
{
- return !(pPSFactoryBuffer->RefCount);
+ return pPSFactoryBuffer->RefCount != 0 ? S_FALSE : S_OK;
}
@@ -266,7 +274,7 @@ HRESULT WINAPI NdrDllRegisterProxy(HMODULE hDll,
if (len && len < sizeof(module)) {
TRACE("registering CLSID %s => %s\n", debugstr_w(clsid), debugstr_w(module));
if (RegCreateKeyW(HKEY_CLASSES_ROOT, keyname, &key) == ERROR_SUCCESS) {
- RegSetValueExW(subkey, NULL, 0, REG_SZ, (const BYTE *)psfactoryW, sizeof(psfactoryW));
+ RegSetValueExW(key, NULL, 0, REG_SZ, (const BYTE *)psfactoryW, sizeof(psfactoryW));
if (RegCreateKeyW(key, inprocserverW, &subkey) == ERROR_SUCCESS) {
RegSetValueExW(subkey, NULL, 0, REG_SZ, (LPBYTE)module, (strlenW(module)+1)*sizeof(WCHAR));
RegSetValueExW(subkey, threadingmodelW, 0, REG_SZ, (const BYTE *)bothW, sizeof(bothW));
diff --git a/dll/win32/rpcrt4/cpsf.h b/dll/win32/rpcrt4/cpsf.h
index d8867d40e60..9cc046ff7ca 100644
--- a/dll/win32/rpcrt4/cpsf.h
+++ b/dll/win32/rpcrt4/cpsf.h
@@ -21,36 +21,25 @@
#ifndef __WINE_CPSF_H
#define __WINE_CPSF_H
-HRESULT WINAPI StdProxy_Construct(REFIID riid,
- LPUNKNOWN pUnkOuter,
- const ProxyFileInfo *ProxyInfo,
- int Index,
- LPPSFACTORYBUFFER pPSFactory,
- LPRPCPROXYBUFFER *ppProxy,
- LPVOID *ppvObj);
+HRESULT StdProxy_Construct(REFIID riid, LPUNKNOWN pUnkOuter, const ProxyFileInfo *ProxyInfo,
+ int Index, LPPSFACTORYBUFFER pPSFactory, LPRPCPROXYBUFFER *ppProxy,
+ LPVOID *ppvObj);
-HRESULT WINAPI CStdStubBuffer_Construct(REFIID riid,
- LPUNKNOWN pUnkServer,
- PCInterfaceName name,
- CInterfaceStubVtbl *vtbl,
- LPPSFACTORYBUFFER pPSFactory,
- LPRPCSTUBBUFFER *ppStub);
+HRESULT CStdStubBuffer_Construct(REFIID riid, LPUNKNOWN pUnkServer, PCInterfaceName name,
+ CInterfaceStubVtbl *vtbl, LPPSFACTORYBUFFER pPSFactory,
+ LPRPCSTUBBUFFER *ppStub);
-HRESULT WINAPI CStdStubBuffer_Delegating_Construct(REFIID riid,
- LPUNKNOWN pUnkServer,
- PCInterfaceName name,
- CInterfaceStubVtbl *vtbl,
- REFIID delegating_iid,
- LPPSFACTORYBUFFER pPSFactory,
- LPRPCSTUBBUFFER *ppStub);
+HRESULT CStdStubBuffer_Delegating_Construct(REFIID riid, LPUNKNOWN pUnkServer, PCInterfaceName name,
+ CInterfaceStubVtbl *vtbl, REFIID delegating_iid,
+ LPPSFACTORYBUFFER pPSFactory, LPRPCSTUBBUFFER *ppStub);
const MIDL_SERVER_INFO *CStdStubBuffer_GetServerInfo(IRpcStubBuffer *iface);
const IRpcStubBufferVtbl CStdStubBuffer_Vtbl;
const IRpcStubBufferVtbl CStdStubBuffer_Delegating_Vtbl;
-void create_delegating_vtbl(DWORD num_methods);
-
+BOOL fill_delegated_proxy_table(IUnknownVtbl *vtbl, DWORD num);
+HRESULT create_proxy(REFIID iid, IUnknown *pUnkOuter, IRpcProxyBuffer **pproxy, void **ppv);
HRESULT create_stub(REFIID iid, IUnknown *pUnk, IRpcStubBuffer **ppstub);
#endif /* __WINE_CPSF_H */
diff --git a/dll/win32/rpcrt4/cstub.c b/dll/win32/rpcrt4/cstub.c
index 85411cd81e9..95ac1d89af2 100644
--- a/dll/win32/rpcrt4/cstub.c
+++ b/dll/win32/rpcrt4/cstub.c
@@ -2,6 +2,7 @@
* COM stub (CStdStubBuffer) implementation
*
* Copyright 2001 Ove Kåven, TransGaming Technologies
+ * Copyright 2009 Alexandre Julliard
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -61,12 +62,12 @@ static inline cstdstubbuffer_delegating_t *impl_from_delegating( IRpcStubBuffer
return (cstdstubbuffer_delegating_t*)((char *)iface - FIELD_OFFSET(cstdstubbuffer_delegating_t, stub_buffer));
}
-HRESULT WINAPI CStdStubBuffer_Construct(REFIID riid,
- LPUNKNOWN pUnkServer,
- PCInterfaceName name,
- CInterfaceStubVtbl *vtbl,
- LPPSFACTORYBUFFER pPSFactory,
- LPRPCSTUBBUFFER *ppStub)
+HRESULT CStdStubBuffer_Construct(REFIID riid,
+ LPUNKNOWN pUnkServer,
+ PCInterfaceName name,
+ CInterfaceStubVtbl *vtbl,
+ LPPSFACTORYBUFFER pPSFactory,
+ LPRPCSTUBBUFFER *ppStub)
{
CStdStubBuffer *This;
IUnknown *pvServer;
@@ -113,20 +114,16 @@ typedef struct
{
DWORD ref;
DWORD size;
- void **methods;
IUnknownVtbl vtbl;
/* remaining entries in vtbl */
} ref_counted_vtbl;
-static struct
-{
- ref_counted_vtbl *table;
-} current_vtbl;
+static ref_counted_vtbl *current_vtbl;
static HRESULT WINAPI delegating_QueryInterface(IUnknown *pUnk, REFIID iid, void **ppv)
{
- *ppv = (void *)pUnk;
+ *ppv = pUnk;
return S_OK;
}
@@ -161,87 +158,137 @@ typedef struct {
} vtbl_method_t;
#include "poppack.h"
-static void fill_table(IUnknownVtbl *vtbl, void **methods, DWORD num)
-{
- vtbl_method_t *method;
- void **entry;
- DWORD i;
+#define BLOCK_SIZE 1024
+#define MAX_BLOCKS 64 /* 64k methods should be enough for anybody */
+static const vtbl_method_t *method_blocks[MAX_BLOCKS];
+
+static const vtbl_method_t *allocate_block( unsigned int num )
+{
+ unsigned int i;
+ vtbl_method_t *prev, *block;
+
+ block = VirtualAlloc( NULL, BLOCK_SIZE * sizeof(*block),
+ MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE );
+ if (!block) return NULL;
+
+ for (i = 0; i < BLOCK_SIZE; i++)
+ {
+ block[i].mov1 = 0x0424448b;
+ block[i].mov2 = 0x408b;
+ block[i].sixteen = 0x10;
+ block[i].mov3 = 0x04244489;
+ block[i].mov4 = 0x008b;
+ block[i].mov5 = 0x808b;
+ block[i].offset = (BLOCK_SIZE * num + i + 3) << 2;
+ block[i].jmp = 0xe0ff;
+ block[i].pad[0] = 0x8d;
+ block[i].pad[1] = 0x76;
+ block[i].pad[2] = 0x00;
+ }
+ VirtualProtect( block, BLOCK_SIZE * sizeof(*block), PAGE_EXECUTE_READ, NULL );
+ prev = InterlockedCompareExchangePointer( (void **)&method_blocks[num], block, NULL );
+ if (prev) /* someone beat us to it */
+ {
+ VirtualFree( block, 0, MEM_RELEASE );
+ block = prev;
+ }
+ return block;
+}
+
+static BOOL fill_delegated_stub_table(IUnknownVtbl *vtbl, DWORD num)
+{
+ const void **entry = (const void **)(vtbl + 1);
+ DWORD i, j;
+
+ if (num - 3 > BLOCK_SIZE * MAX_BLOCKS)
+ {
+ FIXME( "%u methods not supported\n", num );
+ return FALSE;
+ }
vtbl->QueryInterface = delegating_QueryInterface;
vtbl->AddRef = delegating_AddRef;
vtbl->Release = delegating_Release;
-
- method = (vtbl_method_t*)methods;
- entry = (void**)(vtbl + 1);
-
- for(i = 3; i < num; i++)
+ for (i = 0; i < (num - 3 + BLOCK_SIZE - 1) / BLOCK_SIZE; i++)
{
- *entry = method;
- method->mov1 = 0x0424448b;
- method->mov2 = 0x408b;
- method->sixteen = 0x10;
- method->mov3 = 0x04244489;
- method->mov4 = 0x008b;
- method->mov5 = 0x808b;
- method->offset = i << 2;
- method->jmp = 0xe0ff;
- method->pad[0] = 0x8d;
- method->pad[1] = 0x76;
- method->pad[2] = 0x00;
-
- method++;
- entry++;
+ const vtbl_method_t *block = method_blocks[i];
+ if (!block && !(block = allocate_block( i ))) return FALSE;
+ for (j = 0; j < BLOCK_SIZE && j < num - 3 - i * BLOCK_SIZE; j++) *entry++ = &block[j];
}
+ return TRUE;
+}
+
+BOOL fill_delegated_proxy_table(IUnknownVtbl *vtbl, DWORD num)
+{
+ const void **entry = (const void **)(vtbl + 1);
+ DWORD i, j;
+
+ if (num - 3 > BLOCK_SIZE * MAX_BLOCKS)
+ {
+ FIXME( "%u methods not supported\n", num );
+ return FALSE;
+ }
+ vtbl->QueryInterface = IUnknown_QueryInterface_Proxy;
+ vtbl->AddRef = IUnknown_AddRef_Proxy;
+ vtbl->Release = IUnknown_Release_Proxy;
+ for (i = 0; i < (num - 3 + BLOCK_SIZE - 1) / BLOCK_SIZE; i++)
+ {
+ const vtbl_method_t *block = method_blocks[i];
+ if (!block && !(block = allocate_block( i ))) return FALSE;
+ for (j = 0; j < BLOCK_SIZE && j < num - 3 - i * BLOCK_SIZE; j++, entry++)
+ if (!*entry) *entry = &block[j];
+ }
+ return TRUE;
}
#else /* __i386__ */
-typedef struct {int dummy;} vtbl_method_t;
-static void fill_table(IUnknownVtbl *vtbl, void **methods, DWORD num)
+static BOOL fill_delegated_stub_table(IUnknownVtbl *vtbl, DWORD num)
{
ERR("delegated stubs are not supported on this architecture\n");
+ return FALSE;
+}
+
+BOOL fill_delegated_proxy_table(IUnknownVtbl *vtbl, DWORD num)
+{
+ ERR("delegated proxies are not supported on this architecture\n");
+ return FALSE;
}
#endif /* __i386__ */
-void create_delegating_vtbl(DWORD num_methods)
-{
- TRACE("%d\n", num_methods);
- if(num_methods <= 3)
- {
- ERR("should have more than %d methods\n", num_methods);
- return;
- }
-
- EnterCriticalSection(&delegating_vtbl_section);
- if(!current_vtbl.table || num_methods > current_vtbl.table->size)
- {
- DWORD size;
- DWORD old_protect;
- if(current_vtbl.table && current_vtbl.table->ref == 0)
- {
- TRACE("freeing old table\n");
- VirtualFree(current_vtbl.table->methods, 0, MEM_RELEASE);
- HeapFree(GetProcessHeap(), 0, current_vtbl.table);
- }
- size = (num_methods - 3) * sizeof(vtbl_method_t);
- current_vtbl.table = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(ref_counted_vtbl, vtbl) + num_methods * sizeof(void*));
- current_vtbl.table->ref = 0;
- current_vtbl.table->size = num_methods;
- current_vtbl.table->methods = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
- fill_table(¤t_vtbl.table->vtbl, current_vtbl.table->methods, num_methods);
- VirtualProtect(current_vtbl.table->methods, size, PAGE_EXECUTE_READ, &old_protect);
- }
- LeaveCriticalSection(&delegating_vtbl_section);
-}
-
-static IUnknownVtbl *get_delegating_vtbl(void)
+static IUnknownVtbl *get_delegating_vtbl(DWORD num_methods)
{
IUnknownVtbl *ret;
+ if (num_methods < 256) num_methods = 256; /* avoid frequent reallocations */
+
EnterCriticalSection(&delegating_vtbl_section);
- current_vtbl.table->ref++;
- ret = ¤t_vtbl.table->vtbl;
+
+ if(!current_vtbl || num_methods > current_vtbl->size)
+ {
+ ref_counted_vtbl *table = HeapAlloc(GetProcessHeap(), 0,
+ FIELD_OFFSET(ref_counted_vtbl, vtbl) + num_methods * sizeof(void*));
+ if (!table)
+ {
+ LeaveCriticalSection(&delegating_vtbl_section);
+ return NULL;
+ }
+
+ table->ref = 0;
+ table->size = num_methods;
+ fill_delegated_stub_table(&table->vtbl, num_methods);
+
+ if (current_vtbl && current_vtbl->ref == 0)
+ {
+ TRACE("freeing old table\n");
+ HeapFree(GetProcessHeap(), 0, current_vtbl);
+ }
+ current_vtbl = table;
+ }
+
+ current_vtbl->ref++;
+ ret = ¤t_vtbl->vtbl;
LeaveCriticalSection(&delegating_vtbl_section);
return ret;
}
@@ -253,22 +300,21 @@ static void release_delegating_vtbl(IUnknownVtbl *vtbl)
EnterCriticalSection(&delegating_vtbl_section);
table->ref--;
TRACE("ref now %d\n", table->ref);
- if(table->ref == 0 && table != current_vtbl.table)
+ if(table->ref == 0 && table != current_vtbl)
{
TRACE("... and we're not current so free'ing\n");
- VirtualFree(current_vtbl.table->methods, 0, MEM_RELEASE);
HeapFree(GetProcessHeap(), 0, table);
}
LeaveCriticalSection(&delegating_vtbl_section);
}
-HRESULT WINAPI CStdStubBuffer_Delegating_Construct(REFIID riid,
- LPUNKNOWN pUnkServer,
- PCInterfaceName name,
- CInterfaceStubVtbl *vtbl,
- REFIID delegating_iid,
- LPPSFACTORYBUFFER pPSFactory,
- LPRPCSTUBBUFFER *ppStub)
+HRESULT CStdStubBuffer_Delegating_Construct(REFIID riid,
+ LPUNKNOWN pUnkServer,
+ PCInterfaceName name,
+ CInterfaceStubVtbl *vtbl,
+ REFIID delegating_iid,
+ LPPSFACTORYBUFFER pPSFactory,
+ LPRPCSTUBBUFFER *ppStub)
{
cstdstubbuffer_delegating_t *This;
IUnknown *pvServer;
@@ -294,7 +340,7 @@ HRESULT WINAPI CStdStubBuffer_Delegating_Construct(REFIID riid,
return E_OUTOFMEMORY;
}
- This->base_obj = get_delegating_vtbl();
+ This->base_obj = get_delegating_vtbl( vtbl->header.DispatchTableCount );
r = create_stub(delegating_iid, (IUnknown*)&This->base_obj, &This->base_stub);
if(FAILED(r))
{
diff --git a/dll/win32/rpcrt4/ndr_contexthandle.c b/dll/win32/rpcrt4/ndr_contexthandle.c
index 15192a72878..cab0fc5d86e 100644
--- a/dll/win32/rpcrt4/ndr_contexthandle.c
+++ b/dll/win32/rpcrt4/ndr_contexthandle.c
@@ -59,7 +59,7 @@ static CRITICAL_SECTION ndr_context_cs = { &ndr_context_debug, -1, 0, 0, 0, 0 };
static struct context_handle_entry *get_context_entry(NDR_CCONTEXT CContext)
{
- struct context_handle_entry *che = (struct context_handle_entry*) CContext;
+ struct context_handle_entry *che = CContext;
if (che->magic != NDR_CONTEXT_HANDLE_MAGIC)
return NULL;
@@ -111,7 +111,7 @@ void WINAPI NDRCContextMarshall(NDR_CCONTEXT CContext, void *pBuff)
}
else
{
- ndr_context_handle *wire_data = (ndr_context_handle *)pBuff;
+ ndr_context_handle *wire_data = pBuff;
wire_data->attributes = 0;
wire_data->uuid = GUID_NULL;
}
diff --git a/dll/win32/rpcrt4/ndr_fullpointer.c b/dll/win32/rpcrt4/ndr_fullpointer.c
index b686683f6f4..2bbd2b2b1aa 100644
--- a/dll/win32/rpcrt4/ndr_fullpointer.c
+++ b/dll/win32/rpcrt4/ndr_fullpointer.c
@@ -161,6 +161,9 @@ int WINAPI NdrFullPointerQueryRefId(PFULL_PTR_XLAT_TABLES pXlatTables,
{
TRACE("(%p, 0x%x, %d, %p)\n", pXlatTables, RefId, QueryType, ppPointer);
+ if (!RefId)
+ return 1;
+
expand_pointer_table_if_necessary(pXlatTables, RefId);
pXlatTables->NextRefId = max(RefId + 1, pXlatTables->NextRefId);
diff --git a/dll/win32/rpcrt4/ndr_marshall.c b/dll/win32/rpcrt4/ndr_marshall.c
index d1b57fd187a..9946bd13d57 100644
--- a/dll/win32/rpcrt4/ndr_marshall.c
+++ b/dll/win32/rpcrt4/ndr_marshall.c
@@ -39,6 +39,7 @@
#include "ndr_misc.h"
#include "rpcndr.h"
+#include "ndrtypes.h"
#include "wine/unicode.h"
#include "wine/rpcfc.h"
@@ -113,6 +114,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole);
#define NDR_TABLE_SIZE 128
#define NDR_TABLE_MASK 127
+#define NDRSContextFromValue(user_context) (NDR_SCONTEXT)((char *)(user_context) - (char *)NDRSContextValue((NDR_SCONTEXT)NULL))
+
static unsigned char *WINAPI NdrBaseTypeMarshall(PMIDL_STUB_MESSAGE, unsigned char *, PFORMAT_STRING);
static unsigned char *WINAPI NdrBaseTypeUnmarshall(PMIDL_STUB_MESSAGE, unsigned char **, PFORMAT_STRING, unsigned char);
static void WINAPI NdrBaseTypeBufferSize(PMIDL_STUB_MESSAGE, unsigned char *, PFORMAT_STRING);
@@ -548,7 +551,8 @@ PFORMAT_STRING ComputeConformanceOrVariance(
}
break;
default:
- FIXME("unknown conformance type %x\n", pFormat[0] & 0xf0);
+ FIXME("unknown conformance type %x, expect crash.\n", pFormat[0] & 0xf0);
+ goto finish_conf;
}
switch (pFormat[1]) {
@@ -935,7 +939,7 @@ static void PointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
if (type == RPC_FC_FP)
NdrFullPointerInsertRefId(pStubMsg->FullPtrXlatTables, pointer_id,
- base_ptr_val);
+ *pPointer);
}
TRACE("pointer=%p\n", *pPointer);
@@ -1778,7 +1782,7 @@ static inline void array_compute_and_size_conformance(
break;
case RPC_FC_C_CSTRING:
case RPC_FC_C_WSTRING:
- if (pFormat[0] == RPC_FC_C_CSTRING)
+ if (fc == RPC_FC_C_CSTRING)
{
TRACE("string=%s\n", debugstr_a((const char *)pMemory));
pStubMsg->ActualCount = strlen((const char *)pMemory)+1;
@@ -1789,7 +1793,7 @@ static inline void array_compute_and_size_conformance(
pStubMsg->ActualCount = strlenW((LPCWSTR)pMemory)+1;
}
- if (fc == RPC_FC_STRING_SIZED)
+ if (pFormat[1] == RPC_FC_STRING_SIZED)
pFormat = ComputeConformance(pStubMsg, pMemory, pFormat + 2, 0);
else
pStubMsg->MaxCount = pStubMsg->ActualCount;
@@ -2692,17 +2696,33 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg,
safe_copy_to_buffer(pStubMsg, pMemory, 4);
pMemory += 4;
break;
+ case RPC_FC_FLOAT:
+ TRACE("float=%f <= %p\n", *(float*)pMemory, pMemory);
+ safe_copy_to_buffer(pStubMsg, pMemory, sizeof(float));
+ pMemory += sizeof(float);
+ break;
case RPC_FC_HYPER:
TRACE("longlong=%s <= %p\n", wine_dbgstr_longlong(*(ULONGLONG*)pMemory), pMemory);
safe_copy_to_buffer(pStubMsg, pMemory, 8);
pMemory += 8;
break;
+ case RPC_FC_DOUBLE:
+ TRACE("double=%f <= %p\n", *(double*)pMemory, pMemory);
+ safe_copy_to_buffer(pStubMsg, pMemory, sizeof(double));
+ pMemory += sizeof(double);
+ break;
+ case RPC_FC_RP:
+ case RPC_FC_UP:
+ case RPC_FC_OP:
+ case RPC_FC_FP:
case RPC_FC_POINTER:
{
unsigned char *saved_buffer;
int pointer_buffer_mark_set = 0;
TRACE("pointer=%p <= %p\n", *(unsigned char**)pMemory, pMemory);
TRACE("pStubMsg->Buffer before %p\n", pStubMsg->Buffer);
+ if (*pFormat != RPC_FC_POINTER)
+ pPointer = pFormat;
if (*pPointer != RPC_FC_RP)
ALIGN_POINTER_CLEAR(pStubMsg->Buffer, 4);
saved_buffer = pStubMsg->Buffer;
@@ -2724,7 +2744,10 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg,
safe_buffer_increment(pStubMsg, 4); /* for pointer ID */
}
TRACE("pStubMsg->Buffer after %p\n", pStubMsg->Buffer);
- pPointer += 4;
+ if (*pFormat == RPC_FC_POINTER)
+ pPointer += 4;
+ else
+ pFormat += 4;
pMemory += sizeof(void *);
break;
}
@@ -2821,16 +2844,32 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
TRACE("long=%d => %p\n", *(DWORD*)pMemory, pMemory);
pMemory += 4;
break;
+ case RPC_FC_FLOAT:
+ safe_copy_from_buffer(pStubMsg, pMemory, sizeof(float));
+ TRACE("float=%f => %p\n", *(float*)pMemory, pMemory);
+ pMemory += sizeof(float);
+ break;
case RPC_FC_HYPER:
safe_copy_from_buffer(pStubMsg, pMemory, 8);
TRACE("longlong=%s => %p\n", wine_dbgstr_longlong(*(ULONGLONG*)pMemory), pMemory);
pMemory += 8;
break;
+ case RPC_FC_DOUBLE:
+ safe_copy_from_buffer(pStubMsg, pMemory, sizeof(double));
+ TRACE("double=%f => %p\n", *(double*)pMemory, pMemory);
+ pMemory += sizeof(double);
+ break;
+ case RPC_FC_RP:
+ case RPC_FC_UP:
+ case RPC_FC_OP:
+ case RPC_FC_FP:
case RPC_FC_POINTER:
{
unsigned char *saved_buffer;
int pointer_buffer_mark_set = 0;
TRACE("pointer => %p\n", pMemory);
+ if (*pFormat != RPC_FC_POINTER)
+ pPointer = pFormat;
if (*pPointer != RPC_FC_RP)
ALIGN_POINTER(pStubMsg->Buffer, 4);
saved_buffer = pStubMsg->Buffer;
@@ -2852,7 +2891,10 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
if (*pPointer != RPC_FC_RP)
safe_buffer_increment(pStubMsg, 4); /* for pointer ID */
}
- pPointer += 4;
+ if (*pFormat == RPC_FC_POINTER)
+ pPointer += 4;
+ else
+ pFormat += 4;
pMemory += sizeof(void *);
break;
}
@@ -2946,14 +2988,22 @@ static unsigned char * ComplexBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
case RPC_FC_LONG:
case RPC_FC_ULONG:
case RPC_FC_ENUM32:
+ case RPC_FC_FLOAT:
safe_buffer_length_increment(pStubMsg, 4);
pMemory += 4;
break;
case RPC_FC_HYPER:
+ case RPC_FC_DOUBLE:
safe_buffer_length_increment(pStubMsg, 8);
pMemory += 8;
break;
+ case RPC_FC_RP:
+ case RPC_FC_UP:
+ case RPC_FC_OP:
+ case RPC_FC_FP:
case RPC_FC_POINTER:
+ if (*pFormat != RPC_FC_POINTER)
+ pPointer = pFormat;
if (!pStubMsg->IgnoreEmbeddedPointers)
{
int saved_buffer_length = pStubMsg->BufferLength;
@@ -2970,7 +3020,10 @@ static unsigned char * ComplexBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
ALIGN_LENGTH(pStubMsg->BufferLength, 4);
safe_buffer_length_increment(pStubMsg, 4);
}
- pPointer += 4;
+ if (*pFormat == RPC_FC_POINTER)
+ pPointer += 4;
+ else
+ pFormat += 4;
pMemory += sizeof(void*);
break;
case RPC_FC_ALIGNM2:
@@ -3049,14 +3102,25 @@ static unsigned char * ComplexFree(PMIDL_STUB_MESSAGE pStubMsg,
case RPC_FC_ULONG:
case RPC_FC_ENUM16:
case RPC_FC_ENUM32:
+ case RPC_FC_FLOAT:
pMemory += 4;
break;
case RPC_FC_HYPER:
+ case RPC_FC_DOUBLE:
pMemory += 8;
break;
+ case RPC_FC_RP:
+ case RPC_FC_UP:
+ case RPC_FC_OP:
+ case RPC_FC_FP:
case RPC_FC_POINTER:
+ if (*pFormat != RPC_FC_POINTER)
+ pPointer = pFormat;
NdrPointerFree(pStubMsg, *(unsigned char**)pMemory, pPointer);
- pPointer += 4;
+ if (*pFormat == RPC_FC_POINTER)
+ pPointer += 4;
+ else
+ pFormat += 4;
pMemory += sizeof(void *);
break;
case RPC_FC_ALIGNM2:
@@ -3137,17 +3201,25 @@ static ULONG ComplexStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
case RPC_FC_LONG:
case RPC_FC_ULONG:
case RPC_FC_ENUM32:
+ case RPC_FC_FLOAT:
size += 4;
safe_buffer_increment(pStubMsg, 4);
break;
case RPC_FC_HYPER:
+ case RPC_FC_DOUBLE:
size += 8;
safe_buffer_increment(pStubMsg, 8);
break;
+ case RPC_FC_RP:
+ case RPC_FC_UP:
+ case RPC_FC_OP:
+ case RPC_FC_FP:
case RPC_FC_POINTER:
{
unsigned char *saved_buffer;
int pointer_buffer_mark_set = 0;
+ if (*pFormat != RPC_FC_POINTER)
+ pPointer = pFormat;
if (*pPointer != RPC_FC_RP)
ALIGN_POINTER(pStubMsg->Buffer, 4);
saved_buffer = pStubMsg->Buffer;
@@ -3170,7 +3242,10 @@ static ULONG ComplexStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
if (*pPointer != RPC_FC_RP)
safe_buffer_increment(pStubMsg, 4); /* for pointer ID */
}
- pPointer += 4;
+ if (*pFormat == RPC_FC_POINTER)
+ pPointer += 4;
+ else
+ pFormat += 4;
size += sizeof(void *);
break;
}
@@ -3232,13 +3307,21 @@ ULONG ComplexStructSize(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat)
case RPC_FC_ULONG:
case RPC_FC_ENUM16:
case RPC_FC_ENUM32:
+ case RPC_FC_FLOAT:
size += 4;
break;
case RPC_FC_HYPER:
+ case RPC_FC_DOUBLE:
size += 8;
break;
+ case RPC_FC_RP:
+ case RPC_FC_UP:
+ case RPC_FC_OP:
+ case RPC_FC_FP:
case RPC_FC_POINTER:
size += sizeof(void *);
+ if (*pFormat != RPC_FC_POINTER)
+ pFormat += 4;
break;
case RPC_FC_ALIGNM2:
ALIGN_LENGTH(size, 2);
@@ -6687,10 +6770,19 @@ static unsigned char *WINAPI NdrContextHandleMarshall(
}
TRACE("flags: 0x%02x\n", pFormat[1]);
- if (pFormat[1] & 0x80)
- NdrClientContextMarshall(pStubMsg, *(NDR_CCONTEXT **)pMemory, FALSE);
+ if (pStubMsg->IsClient)
+ {
+ if (pFormat[1] & HANDLE_PARAM_IS_VIA_PTR)
+ NdrClientContextMarshall(pStubMsg, *(NDR_CCONTEXT **)pMemory, FALSE);
+ else
+ NdrClientContextMarshall(pStubMsg, pMemory, FALSE);
+ }
else
- NdrClientContextMarshall(pStubMsg, pMemory, FALSE);
+ {
+ NDR_SCONTEXT ctxt = NDRSContextFromValue(pMemory);
+ NDR_RUNDOWN rundown = pStubMsg->StubDesc->apfnNdrRundownRoutines[pFormat[2]];
+ NdrServerContextNewMarshall(pStubMsg, ctxt, rundown, pFormat);
+ }
return NULL;
}
@@ -6714,10 +6806,22 @@ static unsigned char *WINAPI NdrContextHandleUnmarshall(
}
TRACE("flags: 0x%02x\n", pFormat[1]);
- /* [out]-only or [ret] param */
- if ((pFormat[1] & 0x60) == 0x20)
- **(NDR_CCONTEXT **)ppMemory = NULL;
- NdrClientContextUnmarshall(pStubMsg, *(NDR_CCONTEXT **)ppMemory, pStubMsg->RpcMsg->Handle);
+ if (pStubMsg->IsClient)
+ {
+ /* [out]-only or [ret] param */
+ if ((pFormat[1] & (HANDLE_PARAM_IS_IN|HANDLE_PARAM_IS_OUT)) == HANDLE_PARAM_IS_OUT)
+ **(NDR_CCONTEXT **)ppMemory = NULL;
+ NdrClientContextUnmarshall(pStubMsg, *(NDR_CCONTEXT **)ppMemory, pStubMsg->RpcMsg->Handle);
+ }
+ else
+ {
+ NDR_SCONTEXT ctxt;
+ ctxt = NdrServerContextNewUnmarshall(pStubMsg, pFormat);
+ if (pFormat[1] & HANDLE_PARAM_IS_VIA_PTR)
+ *(void **)ppMemory = NDRSContextValue(ctxt);
+ else
+ *(void **)ppMemory = *NDRSContextValue(ctxt);
+ }
return NULL;
}
diff --git a/dll/win32/rpcrt4/ndr_misc.h b/dll/win32/rpcrt4/ndr_misc.h
index c3beff4d725..b0150c3a2eb 100644
--- a/dll/win32/rpcrt4/ndr_misc.h
+++ b/dll/win32/rpcrt4/ndr_misc.h
@@ -62,6 +62,6 @@ extern const NDR_BUFFERSIZE NdrBufferSizer[];
extern const NDR_MEMORYSIZE NdrMemorySizer[];
extern const NDR_FREE NdrFreer[];
-unsigned long ComplexStructSize(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat);
+ULONG ComplexStructSize(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat);
#endif /* __WINE_NDR_MISC_H */
diff --git a/dll/win32/rpcrt4/ndr_ole.c b/dll/win32/rpcrt4/ndr_ole.c
index a3264e70122..a4c23c2c5c2 100644
--- a/dll/win32/rpcrt4/ndr_ole.c
+++ b/dll/win32/rpcrt4/ndr_ole.c
@@ -369,6 +369,30 @@ void WINAPI NdrOleFree(void *NodeToFree)
COM_MemFree(NodeToFree);
}
+/***********************************************************************
+ * Helper function to create a proxy.
+ * Probably similar to NdrpCreateProxy.
+ */
+HRESULT create_proxy(REFIID iid, IUnknown *pUnkOuter, IRpcProxyBuffer **pproxy, void **ppv)
+{
+ CLSID clsid;
+ IPSFactoryBuffer *psfac;
+ HRESULT r;
+
+ if(!LoadCOM()) return E_FAIL;
+
+ r = COM_GetPSClsid( iid, &clsid );
+ if(FAILED(r)) return r;
+
+ r = COM_GetClassObject( &clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IPSFactoryBuffer, (void**)&psfac );
+ if(FAILED(r)) return r;
+
+ r = IPSFactoryBuffer_CreateProxy(psfac, pUnkOuter, iid, pproxy, ppv);
+
+ IPSFactoryBuffer_Release(psfac);
+ return r;
+}
+
/***********************************************************************
* Helper function to create a stub.
* This probably looks very much like NdrpCreateStub.
diff --git a/dll/win32/rpcrt4/rpc_transport.c b/dll/win32/rpcrt4/rpc_transport.c
index b9077a3dc1a..2da72909c23 100644
--- a/dll/win32/rpcrt4/rpc_transport.c
+++ b/dll/win32/rpcrt4/rpc_transport.c
@@ -762,7 +762,7 @@ typedef struct _RpcConnection_tcp
{
RpcConnection common;
int sock;
- int cancel_fds[2];
+ SOCKET cancel_fds[2];
} RpcConnection_tcp;
static RpcConnection *rpcrt4_conn_tcp_alloc(void)
@@ -814,7 +814,7 @@ static RPC_STATUS rpcrt4_ncacn_ip_tcp_open(RpcConnection* Connection)
for (ai_cur = ai; ai_cur; ai_cur = ai_cur->ai_next)
{
- int val;
+ char val;
if (TRACE_ON(rpc))
{
@@ -1091,7 +1091,7 @@ static int rpcrt4_conn_tcp_close(RpcConnection *Connection)
static void rpcrt4_conn_tcp_cancel_call(RpcConnection *Connection)
{
RpcConnection_tcp *tcpc = (RpcConnection_tcp *) Connection;
- char dummy = 1;
+ SOCKET dummy = 1;
TRACE("%p\n", Connection);
@@ -1271,7 +1271,7 @@ static RpcServerProtseq *rpcrt4_protseq_sock_alloc(void)
RpcServerProtseq_sock *ps = HeapAlloc(GetProcessHeap(), 0, sizeof(*ps));
if (ps)
{
- int fds[2];
+ SOCKET fds[2];
if (!socketpair(PF_UNIX, SOCK_DGRAM, 0, fds))
{
fcntl(fds[0], F_SETFL, O_NONBLOCK);
diff --git a/dll/win32/rsaenh/implglue.c b/dll/win32/rsaenh/implglue.c
index b73eba93ec6..7ecfc289ecf 100644
--- a/dll/win32/rsaenh/implglue.c
+++ b/dll/win32/rsaenh/implglue.c
@@ -67,6 +67,18 @@ BOOL init_hash_impl(ALG_ID aiAlgid, HASH_CONTEXT *pHashContext)
case CALG_SHA:
A_SHAInit(&pHashContext->sha);
break;
+
+ case CALG_SHA_256:
+ SHA256_Init(&pHashContext->sha256);
+ break;
+
+ case CALG_SHA_384:
+ SHA384_Init(&pHashContext->sha384);
+ break;
+
+ case CALG_SHA_512:
+ SHA512_Init(&pHashContext->sha512);
+ break;
}
return TRUE;
@@ -93,6 +105,18 @@ BOOL update_hash_impl(ALG_ID aiAlgid, HASH_CONTEXT *pHashContext, CONST BYTE *pb
A_SHAUpdate(&pHashContext->sha, pbData, dwDataLen);
break;
+ case CALG_SHA_256:
+ SHA256_Update(&pHashContext->sha256, pbData, dwDataLen);
+ break;
+
+ case CALG_SHA_384:
+ SHA384_Update(&pHashContext->sha384, pbData, dwDataLen);
+ break;
+
+ case CALG_SHA_512:
+ SHA512_Update(&pHashContext->sha512, pbData, dwDataLen);
+ break;
+
default:
SetLastError(NTE_BAD_ALGID);
return FALSE;
@@ -123,6 +147,18 @@ BOOL finalize_hash_impl(ALG_ID aiAlgid, HASH_CONTEXT *pHashContext, BYTE *pbHash
A_SHAFinal(&pHashContext->sha, (PULONG)pbHashValue);
break;
+ case CALG_SHA_256:
+ SHA256_Final(pbHashValue, &pHashContext->sha256);
+ break;
+
+ case CALG_SHA_384:
+ SHA384_Final(pbHashValue, &pHashContext->sha384);
+ break;
+
+ case CALG_SHA_512:
+ SHA512_Final(pbHashValue, &pHashContext->sha512);
+ break;
+
default:
SetLastError(NTE_BAD_ALGID);
return FALSE;
diff --git a/dll/win32/rsaenh/implglue.h b/dll/win32/rsaenh/implglue.h
index 5deaf53e58a..63553204c5b 100644
--- a/dll/win32/rsaenh/implglue.h
+++ b/dll/win32/rsaenh/implglue.h
@@ -25,6 +25,7 @@
#define __WINE_IMPLGLUE_H
#include "tomcrypt.h"
+#include "sha2.h"
/* Next typedef copied from dlls/advapi32/crypt_md4.c */
typedef struct tagMD4_CTX {
@@ -57,6 +58,9 @@ typedef union tagHASH_CONTEXT {
MD4_CTX md4;
MD5_CTX md5;
SHA_CTX sha;
+ SHA256_CTX sha256;
+ SHA384_CTX sha384;
+ SHA512_CTX sha512;
} HASH_CONTEXT;
typedef union tagKEY_CONTEXT {
diff --git a/dll/win32/rsaenh/rsaenh.c b/dll/win32/rsaenh/rsaenh.c
index 665bc40056f..74ad392f2f2 100644
--- a/dll/win32/rsaenh/rsaenh.c
+++ b/dll/win32/rsaenh/rsaenh.c
@@ -241,6 +241,9 @@ static const PROV_ENUMALGS_EX aProvEnumAlgsEx[5][RSAENH_MAX_ENUMALGS+1] =
{CALG_AES_192, 192,192, 192,0, 8,"AES-192", 39,"Advanced Encryption Standard (AES-192)"},
{CALG_AES_256, 256,256, 256,0, 8,"AES-256", 39,"Advanced Encryption Standard (AES-256)"},
{CALG_SHA, 160,160, 160,CRYPT_FLAG_SIGNING, 6,"SHA-1", 30,"Secure Hash Algorithm (SHA-1)"},
+ {CALG_SHA_256, 256,256, 256,CRYPT_FLAG_SIGNING, 6,"SHA-256", 30,"Secure Hash Algorithm (SHA-256)"},
+ {CALG_SHA_384, 384,384, 384,CRYPT_FLAG_SIGNING, 6,"SHA-384", 30,"Secure Hash Algorithm (SHA-284)"},
+ {CALG_SHA_512, 512,512, 512,CRYPT_FLAG_SIGNING, 6,"SHA-512", 30,"Secure Hash Algorithm (SHA-512)"},
{CALG_MD2, 128,128, 128,CRYPT_FLAG_SIGNING, 4,"MD2", 23,"Message Digest 2 (MD2)"},
{CALG_MD4, 128,128, 128,CRYPT_FLAG_SIGNING, 4,"MD4", 23,"Message Digest 4 (MD4)"},
{CALG_MD5, 128,128, 128,CRYPT_FLAG_SIGNING, 4,"MD5", 23,"Message Digest 5 (MD5)"},
@@ -1422,8 +1425,8 @@ static BOOL build_hash_signature(BYTE *pbSignature, DWORD dwLen, ALG_ID aiAlgid,
static const struct tagOIDDescriptor {
ALG_ID aiAlgid;
DWORD dwLen;
- CONST BYTE abOID[18];
- } aOIDDescriptor[5] = {
+ CONST BYTE abOID[19];
+ } aOIDDescriptor[8] = {
{ CALG_MD2, 18, { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48,
0x86, 0xf7, 0x0d, 0x02, 0x02, 0x05, 0x00, 0x04, 0x10 } },
{ CALG_MD4, 18, { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48,
@@ -1432,6 +1435,15 @@ static BOOL build_hash_signature(BYTE *pbSignature, DWORD dwLen, ALG_ID aiAlgid,
0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10 } },
{ CALG_SHA, 15, { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03,
0x02, 0x1a, 0x05, 0x00, 0x04, 0x14 } },
+ { CALG_SHA_256, 19, { 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
+ 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01,
+ 0x05, 0x00, 0x04, 0x20 } },
+ { CALG_SHA_384, 19, { 0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
+ 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01,
+ 0x05, 0x00, 0x04, 0x30 } },
+ { CALG_SHA_384, 19, { 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
+ 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01,
+ 0x05, 0x00, 0x04, 0x40 } },
{ 0, 0, { 0 } }
};
DWORD dwIdxOID, i, j;
diff --git a/dll/win32/rsaenh/rsaenh.rbuild b/dll/win32/rsaenh/rsaenh.rbuild
index fab9eb9011a..49973032b7e 100644
--- a/dll/win32/rsaenh/rsaenh.rbuild
+++ b/dll/win32/rsaenh/rsaenh.rbuild
@@ -17,6 +17,7 @@
rc4.c
rsa.c
rsaenh.c
+ sha2.c
version.rc
wine
crypt32
diff --git a/dll/win32/shdocvw/dochost.c b/dll/win32/shdocvw/dochost.c
index e8982e4f12a..2196eb9c02e 100644
--- a/dll/win32/shdocvw/dochost.c
+++ b/dll/win32/shdocvw/dochost.c
@@ -21,9 +21,14 @@
#include "hlink.h"
#include "exdispid.h"
#include "mshtml.h"
+#include "initguid.h"
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
+DEFINE_OLEGUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0);
+
+#define DOCHOST_DOCCANNAVIGATE 0
+
static ATOM doc_view_atom = 0;
void push_dochost_task(DocHost *This, task_header_t *task, task_proc_t proc, BOOL send)
@@ -154,16 +159,23 @@ static void advise_prop_notif(DocHost *This, BOOL set)
This->is_prop_notif = set;
}
+void set_doc_state(DocHost *This, READYSTATE doc_state)
+{
+ This->doc_state = doc_state;
+ if(doc_state > This->ready_state)
+ This->ready_state = doc_state;
+}
+
static void update_ready_state(DocHost *This, READYSTATE ready_state)
{
- if(ready_state > READYSTATE_LOADING && This->ready_state <= READYSTATE_LOADING) {
+ if(ready_state > READYSTATE_LOADING && This->doc_state <= READYSTATE_LOADING)
notif_complete(This, DISPID_NAVIGATECOMPLETE2);
- This->ready_state = ready_state;
- }
- if(ready_state == READYSTATE_COMPLETE && This->ready_state < READYSTATE_COMPLETE) {
- This->ready_state = READYSTATE_COMPLETE;
+ if(ready_state == READYSTATE_COMPLETE && This->doc_state < READYSTATE_COMPLETE) {
+ set_doc_state(This, READYSTATE_COMPLETE);
notif_complete(This, DISPID_DOCUMENTCOMPLETE);
+ }else {
+ set_doc_state(This, ready_state);
}
}
@@ -236,7 +248,7 @@ HRESULT dochost_object_available(DocHost *This, IUnknown *doc)
if(SUCCEEDED(hres)) {
if(ready_state == READYSTATE_COMPLETE)
push_ready_state_task(This, READYSTATE_COMPLETE);
- else
+ if(ready_state != READYSTATE_COMPLETE || This->doc_navigate)
advise_prop_notif(This, TRUE);
}
@@ -314,6 +326,11 @@ void deactivate_document(DocHost *This)
IHlinkTarget *hlink = NULL;
HRESULT hres;
+ if(This->doc_navigate) {
+ IUnknown_Release(This->doc_navigate);
+ This->doc_navigate = NULL;
+ }
+
if(This->is_prop_notif)
advise_prop_notif(This, FALSE);
@@ -425,8 +442,34 @@ static HRESULT WINAPI ClOleCommandTarget_Exec(IOleCommandTarget *iface,
VARIANT *pvaOut)
{
DocHost *This = OLECMD_THIS(iface);
- FIXME("(%p)->(%s %d %d %p %p)\n", This, debugstr_guid(pguidCmdGroup), nCmdID,
- nCmdexecopt, pvaIn, pvaOut);
+
+ TRACE("(%p)->(%s %d %d %p %p)\n", This, debugstr_guid(pguidCmdGroup), nCmdID,
+ nCmdexecopt, debugstr_variant(pvaIn), debugstr_variant(pvaOut));
+
+ if(!pguidCmdGroup) {
+ FIXME("Unimplemented cmdid %d\n", nCmdID);
+ return E_NOTIMPL;
+ }
+
+ if(IsEqualGUID(pguidCmdGroup, &CGID_DocHostCmdPriv)) {
+ switch(nCmdID) {
+ case DOCHOST_DOCCANNAVIGATE:
+ if(!pvaIn || V_VT(pvaIn) != VT_UNKNOWN)
+ return E_INVALIDARG;
+
+ if(This->doc_navigate)
+ IUnknown_Release(This->doc_navigate);
+ IUnknown_AddRef(V_UNKNOWN(pvaIn));
+ This->doc_navigate = V_UNKNOWN(pvaIn);
+ return S_OK;
+
+ default:
+ FIXME("unsupported command %d of CGID_DocHostCmdPriv\n", nCmdID);
+ return E_NOTIMPL;
+ }
+ }
+
+ FIXME("Unimplemented group %s\n", debugstr_guid(pguidCmdGroup));
return E_NOTIMPL;
}
@@ -709,7 +752,7 @@ static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, D
if(FAILED(hres))
return hres;
- if(ready_state == READYSTATE_COMPLETE)
+ if(ready_state == READYSTATE_COMPLETE && !This->doc_navigate)
advise_prop_notif(This, FALSE);
push_ready_state_task(This, ready_state);
diff --git a/dll/win32/shdocvw/iexplore.c b/dll/win32/shdocvw/iexplore.c
index ca2c868d13d..d65810f58f9 100644
--- a/dll/win32/shdocvw/iexplore.c
+++ b/dll/win32/shdocvw/iexplore.c
@@ -163,7 +163,7 @@ HRESULT InternetExplorer_Create(IUnknown *pOuter, REFIID riid, void **ppv)
TRACE("(%p %s %p)\n", pOuter, debugstr_guid(riid), ppv);
- ret = heap_alloc(sizeof(InternetExplorer));
+ ret = heap_alloc_zero(sizeof(InternetExplorer));
ret->ref = 0;
ret->doc_host.disp = (IDispatch*)WEBBROWSER2(ret);
diff --git a/dll/win32/shdocvw/navigate.c b/dll/win32/shdocvw/navigate.c
index ec23fcc7b38..8ba5f692740 100644
--- a/dll/win32/shdocvw/navigate.c
+++ b/dll/win32/shdocvw/navigate.c
@@ -27,6 +27,7 @@
#include "winreg.h"
#include "shlwapi.h"
#include "wininet.h"
+#include "mshtml.h"
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
@@ -378,8 +379,7 @@ static BindStatusCallback *create_callback(DocHost *doc_host, LPCWSTR url, PBYTE
return ret;
}
-static void on_before_navigate2(DocHost *This, LPCWSTR url, const BYTE *post_data,
- ULONG post_data_len, LPWSTR headers, VARIANT_BOOL *cancel)
+static void on_before_navigate2(DocHost *This, LPCWSTR url, SAFEARRAY *post_data, LPWSTR headers, VARIANT_BOOL *cancel)
{
VARIANT var_url, var_flags, var_frame_name, var_post_data, var_post_data2, var_headers;
DISPPARAMS dispparams;
@@ -404,18 +404,12 @@ static void on_before_navigate2(DocHost *This, LPCWSTR url, const BYTE *post_dat
V_VARIANTREF(params+2) = &var_post_data2;
V_VT(&var_post_data2) = (VT_BYREF|VT_VARIANT);
V_VARIANTREF(&var_post_data2) = &var_post_data;
- VariantInit(&var_post_data);
-
- if(post_data_len) {
- SAFEARRAYBOUND bound = {post_data_len, 0};
- void *data;
+ if(post_data) {
V_VT(&var_post_data) = VT_UI1|VT_ARRAY;
- V_ARRAY(&var_post_data) = SafeArrayCreate(VT_UI1, 1, &bound);
-
- SafeArrayAccessData(V_ARRAY(&var_post_data), &data);
- memcpy(data, post_data, post_data_len);
- SafeArrayUnaccessData(V_ARRAY(&var_post_data));
+ V_ARRAY(&var_post_data) = post_data;
+ }else {
+ V_VT(&var_post_data) = VT_EMPTY;
}
V_VT(params+3) = (VT_BYREF|VT_VARIANT);
@@ -439,8 +433,6 @@ static void on_before_navigate2(DocHost *This, LPCWSTR url, const BYTE *post_dat
call_sink(This->cps.wbe2, DISPID_BEFORENAVIGATE2, &dispparams);
SysFreeString(V_BSTR(&var_url));
- if(post_data_len)
- SafeArrayDestroy(V_ARRAY(&var_post_data));
}
/* FIXME: urlmon should handle it */
@@ -543,15 +535,153 @@ static HRESULT bind_to_object(DocHost *This, IMoniker *mon, LPCWSTR url, IBindCt
return S_OK;
}
-static HRESULT navigate_bsc(DocHost *This, BindStatusCallback *bsc, IMoniker *mon)
+static void html_window_navigate(DocHost *This, IHTMLPrivateWindow *window, BSTR url, BSTR headers, SAFEARRAY *post_data)
{
- IBindCtx *bindctx;
- VARIANT_BOOL cancel = VARIANT_FALSE;
+ VARIANT headers_var, post_data_var;
+ WCHAR *new_url;
+ BSTR empty_str;
+ DWORD size;
HRESULT hres;
- This->ready_state = READYSTATE_LOADING;
+ size = (strlenW(url)+1)*sizeof(WCHAR);
+ new_url = CoTaskMemAlloc(size);
+ if(!new_url)
+ return;
+ memcpy(new_url, url, size);
+ CoTaskMemFree(This->url);
+ This->url = new_url;
- on_before_navigate2(This, bsc->url, bsc->post_data, bsc->post_data_len, bsc->headers, &cancel);
+ empty_str = SysAllocStringLen(NULL, 0);
+
+ if(headers) {
+ V_VT(&headers_var) = VT_BSTR;
+ V_BSTR(&headers_var) = headers;
+ }else {
+ V_VT(&headers_var) = VT_EMPTY;
+ }
+
+ if(post_data) {
+ V_VT(&post_data_var) = VT_UI1|VT_ARRAY;
+ V_ARRAY(&post_data_var) = post_data;
+ }else {
+ V_VT(&post_data_var) = VT_EMPTY;
+ }
+
+ set_doc_state(This, READYSTATE_LOADING);
+ hres = IHTMLPrivateWindow_SuperNavigate(window, url, empty_str, NULL, NULL, &post_data_var, &headers_var, 0);
+ SysFreeString(empty_str);
+ if(FAILED(hres))
+ WARN("SuprtNavigate failed: %08x\n", hres);
+}
+
+typedef struct {
+ task_header_t header;
+ BSTR url;
+ BSTR headers;
+ SAFEARRAY *post_data;
+ BOOL async_notif;
+} task_doc_navigate_t;
+
+static HRESULT free_doc_navigate_task(task_doc_navigate_t *task, BOOL free_task)
+{
+ SysFreeString(task->url);
+ SysFreeString(task->headers);
+ if(task->post_data)
+ SafeArrayDestroy(task->post_data);
+ if(free_task)
+ heap_free(task);
+ return E_OUTOFMEMORY;
+}
+
+static void doc_navigate_proc(DocHost *This, task_header_t *t)
+{
+ task_doc_navigate_t *task = (task_doc_navigate_t*)t;
+ IHTMLPrivateWindow *priv_window;
+ HRESULT hres;
+
+ if(!This->doc_navigate)
+ return;
+
+ if(task->async_notif) {
+ VARIANT_BOOL cancel = VARIANT_FALSE;
+ on_before_navigate2(This, task->url, task->post_data, task->headers, &cancel);
+ if(cancel) {
+ TRACE("Navigation calnceled\n");
+ free_doc_navigate_task(task, FALSE);
+ return;
+ }
+ }
+
+ hres = IUnknown_QueryInterface(This->doc_navigate, &IID_IHTMLPrivateWindow, (void**)&priv_window);
+ if(SUCCEEDED(hres)) {
+ html_window_navigate(This, priv_window, task->url, task->headers, task->post_data);
+ IHTMLPrivateWindow_Release(priv_window);
+ }else {
+ WARN("Could not get IHTMLPrivateWindow iface: %08x\n", hres);
+ }
+
+ free_doc_navigate_task(task, FALSE);
+}
+
+static HRESULT async_doc_navigate(DocHost *This, LPCWSTR url, LPCWSTR headers, PBYTE post_data, ULONG post_data_size,
+ BOOL async_notif)
+{
+ task_doc_navigate_t *task;
+
+ task = heap_alloc_zero(sizeof(*task));
+ if(!task)
+ return E_OUTOFMEMORY;
+
+ task->url = SysAllocString(url);
+ if(!task->url)
+ return free_doc_navigate_task(task, TRUE);
+
+ if(headers) {
+ task->headers = SysAllocString(headers);
+ if(!task->headers)
+ return free_doc_navigate_task(task, TRUE);
+ }
+
+ if(task->post_data) {
+ task->post_data = SafeArrayCreateVector(VT_UI1, 0, post_data_size);
+ if(!task->post_data)
+ return free_doc_navigate_task(task, TRUE);
+ memcpy(task->post_data->pvData, post_data, post_data_size);
+ }
+
+ if(!async_notif) {
+ VARIANT_BOOL cancel = VARIANT_FALSE;
+
+ on_before_navigate2(This, task->url, task->post_data, task->headers, &cancel);
+ if(cancel) {
+ TRACE("Navigation calnceled\n");
+ free_doc_navigate_task(task, TRUE);
+ return S_OK;
+ }
+ }
+
+ task->async_notif = async_notif;
+ push_dochost_task(This, &task->header, doc_navigate_proc, FALSE);
+ return S_OK;
+}
+
+static HRESULT navigate_bsc(DocHost *This, BindStatusCallback *bsc, IMoniker *mon)
+{
+ VARIANT_BOOL cancel = VARIANT_FALSE;
+ SAFEARRAY *post_data = NULL;
+ IBindCtx *bindctx;
+ HRESULT hres;
+
+ set_doc_state(This, READYSTATE_LOADING);
+
+ if(bsc->post_data) {
+ post_data = SafeArrayCreateVector(VT_UI1, 0, bsc->post_data_len);
+ memcpy(post_data->pvData, post_data, bsc->post_data_len);
+ }
+
+ on_before_navigate2(This, bsc->url, post_data, bsc->headers, &cancel);
+ if(post_data)
+ SafeArrayDestroy(post_data);
if(cancel) {
FIXME("Navigation canceled\n");
return S_OK;
@@ -596,10 +726,10 @@ static void navigate_bsc_proc(DocHost *This, task_header_t *t)
HRESULT navigate_url(DocHost *This, LPCWSTR url, const VARIANT *Flags,
const VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
{
- task_navigate_bsc_t *task;
PBYTE post_data = NULL;
ULONG post_data_len = 0;
LPWSTR headers = NULL;
+ HRESULT hres = S_OK;
TRACE("navigating to %s\n", debugstr_w(url));
@@ -626,15 +756,23 @@ HRESULT navigate_url(DocHost *This, LPCWSTR url, const VARIANT *Flags,
TRACE("Headers: %s\n", debugstr_w(headers));
}
- task = heap_alloc(sizeof(*task));
- task->bsc = create_callback(This, url, post_data, post_data_len, headers);
+ set_doc_state(This, READYSTATE_LOADING);
+ This->ready_state = READYSTATE_LOADING;
+
+ if(This->doc_navigate) {
+ hres = async_doc_navigate(This, url, headers, post_data, post_data_len, TRUE);
+ }else {
+ task_navigate_bsc_t *task;
+
+ task = heap_alloc(sizeof(*task));
+ task->bsc = create_callback(This, url, post_data, post_data_len, headers);
+ push_dochost_task(This, &task->header, navigate_bsc_proc, This->url == NULL);
+ }
if(post_data)
SafeArrayUnaccessData(V_ARRAY(PostData));
- push_dochost_task(This, &task->header, navigate_bsc_proc, This->url == NULL);
-
- return S_OK;
+ return hres;
}
static HRESULT navigate_hlink(DocHost *This, IMoniker *mon, IBindCtx *bindctx,
@@ -649,6 +787,10 @@ static HRESULT navigate_hlink(DocHost *This, IMoniker *mon, IBindCtx *bindctx,
DWORD bindf = 0;
HRESULT hres;
+ hres = IMoniker_GetDisplayName(mon, 0, NULL, &url);
+ if(FAILED(hres))
+ FIXME("GetDisplayName failed: %08x\n", hres);
+
hres = IBindStatusCallback_QueryInterface(callback, &IID_IHttpNegotiate,
(void**)&http_negotiate);
if(SUCCEEDED(hres)) {
@@ -670,16 +812,15 @@ static HRESULT navigate_hlink(DocHost *This, IMoniker *mon, IBindCtx *bindctx,
post_data = bindinfo.stgmedData.u.hGlobal;
}
- hres = IMoniker_GetDisplayName(mon, 0, NULL, &url);
- if(FAILED(hres))
- FIXME("GetDisplayName failed: %08x\n", hres);
+ if(This->doc_navigate) {
+ hres = async_doc_navigate(This, url, headers, post_data, post_data_len, FALSE);
+ }else {
+ bsc = create_callback(This, url, post_data, post_data_len, headers);
+ hres = navigate_bsc(This, bsc, mon);
+ IBindStatusCallback_Release(BINDSC(bsc));
+ }
- bsc = create_callback(This, url, post_data, post_data_len, headers);
CoTaskMemFree(url);
-
- hres = navigate_bsc(This, bsc, mon);
-
- IBindStatusCallback_Release(BINDSC(bsc));
CoTaskMemFree(headers);
ReleaseBindInfo(&bindinfo);
diff --git a/dll/win32/shdocvw/oleobject.c b/dll/win32/shdocvw/oleobject.c
index f67edb7583e..933b5629cea 100644
--- a/dll/win32/shdocvw/oleobject.c
+++ b/dll/win32/shdocvw/oleobject.c
@@ -960,17 +960,6 @@ void WebBrowser_OleObject_Init(WebBrowser *This)
This->lpOleInPlaceActiveObjectVtbl = &OleInPlaceActiveObjectVtbl;
This->lpOleCommandTargetVtbl = &OleCommandTargetVtbl;
- This->client = NULL;
- This->inplace = NULL;
- This->container = NULL;
- This->frame_hwnd = NULL;
- This->uiwindow = NULL;
- This->shell_embedding_hwnd = NULL;
-
- memset(&This->pos_rect, 0, sizeof(RECT));
- memset(&This->clip_rect, 0, sizeof(RECT));
- memset(&This->frameinfo, 0, sizeof(OLEINPLACEFRAMEINFO));
-
/* Default size is 50x20 pixels, in himetric units */
This->extent.cx = MulDiv( 50, 2540, dpi_x );
This->extent.cy = MulDiv( 20, 2540, dpi_y );
diff --git a/dll/win32/shdocvw/shdocvw.h b/dll/win32/shdocvw/shdocvw.h
index c5b9c9a1be5..1184298dca9 100644
--- a/dll/win32/shdocvw/shdocvw.h
+++ b/dll/win32/shdocvw/shdocvw.h
@@ -92,6 +92,7 @@ struct DocHost {
IUnknown *document;
IOleDocumentView *view;
+ IUnknown *doc_navigate;
HWND hwnd;
HWND frame_hwnd;
@@ -103,6 +104,7 @@ struct DocHost {
VARIANT_BOOL busy;
READYSTATE ready_state;
+ READYSTATE doc_state;
DWORD prop_notif_cookie;
BOOL is_prop_notif;
@@ -222,6 +224,7 @@ HRESULT dochost_object_available(DocHost*,IUnknown*);
void call_sink(ConnectionPoint*,DISPID,DISPPARAMS*);
HRESULT navigate_url(DocHost*,LPCWSTR,const VARIANT*,const VARIANT*,VARIANT*,VARIANT*);
HRESULT go_home(DocHost*);
+void set_doc_state(DocHost*,READYSTATE);
#define WM_DOCHOSTTASK (WM_USER+0x300)
void push_dochost_task(DocHost*,task_header_t*,task_proc_t,BOOL);
@@ -262,6 +265,11 @@ static inline void *heap_alloc(size_t len)
return HeapAlloc(GetProcessHeap(), 0, len);
}
+static inline void *heap_alloc_zero(size_t len)
+{
+ return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
+}
+
static inline void *heap_realloc(void *mem, size_t len)
{
return HeapReAlloc(GetProcessHeap(), 0, mem, len);
diff --git a/dll/win32/shdocvw/webbrowser.c b/dll/win32/shdocvw/webbrowser.c
index b0633b03f19..2ac9b9985d5 100644
--- a/dll/win32/shdocvw/webbrowser.c
+++ b/dll/win32/shdocvw/webbrowser.c
@@ -1115,23 +1115,20 @@ static HRESULT WebBrowser_Create(INT version, IUnknown *pOuter, REFIID riid, voi
TRACE("(%p %s %p) version=%d\n", pOuter, debugstr_guid(riid), ppv, version);
- ret = heap_alloc(sizeof(WebBrowser));
+ ret = heap_alloc_zero(sizeof(WebBrowser));
ret->lpWebBrowser2Vtbl = &WebBrowser2Vtbl;
ret->lpServiceProviderVtbl = &ServiceProviderVtbl;
- ret->ref = 0;
+ ret->ref = 1;
ret->version = version;
DocHost_Init(&ret->doc_host, (IDispatch*)WEBBROWSER2(ret));
- ret->register_browser = VARIANT_FALSE;
ret->visible = VARIANT_TRUE;
ret->menu_bar = VARIANT_TRUE;
ret->address_bar = VARIANT_TRUE;
ret->status_bar = VARIANT_TRUE;
ret->tool_bar = VARIANT_TRUE;
- ret->full_screen = VARIANT_FALSE;
- ret->theater_mode = VARIANT_FALSE;
WebBrowser_OleObject_Init(ret);
WebBrowser_ViewObject_Init(ret);
@@ -1139,14 +1136,11 @@ static HRESULT WebBrowser_Create(INT version, IUnknown *pOuter, REFIID riid, voi
WebBrowser_ClassInfo_Init(ret);
WebBrowser_HlinkFrame_Init(ret);
- hres = IWebBrowser_QueryInterface(WEBBROWSER(ret), riid, ppv);
- if(SUCCEEDED(hres)) {
- SHDOCVW_LockModule();
- }else {
- heap_free(ret);
- return hres;
- }
+ SHDOCVW_LockModule();
+ hres = IWebBrowser_QueryInterface(WEBBROWSER(ret), riid, ppv);
+
+ IWebBrowser2_Release(WEBBROWSER(ret));
return hres;
}
diff --git a/dll/win32/shell32/autocomplete.c b/dll/win32/shell32/autocomplete.c
index a637988939f..a0ace20c051 100644
--- a/dll/win32/shell32/autocomplete.c
+++ b/dll/win32/shell32/autocomplete.c
@@ -214,7 +214,7 @@ static HRESULT WINAPI IAutoComplete_fnInit(
static const WCHAR lbName[] = {'L','i','s','t','B','o','x',0};
TRACE("(%p)->(0x%08lx, %p, %s, %s)\n",
- This, (long)hwndEdit, punkACL, debugstr_w(pwzsRegKeyPath), debugstr_w(pwszQuickComplete));
+ This, hwndEdit, punkACL, debugstr_w(pwzsRegKeyPath), debugstr_w(pwszQuickComplete));
if (This->options & ACO_AUTOSUGGEST) TRACE(" ACO_AUTOSUGGEST\n");
if (This->options & ACO_AUTOAPPEND) TRACE(" ACO_AUTOAPPEND\n");
diff --git a/dll/win32/shlwapi/ordinal.c b/dll/win32/shlwapi/ordinal.c
index 375ddaf7ad2..364bbfe8af8 100644
--- a/dll/win32/shlwapi/ordinal.c
+++ b/dll/win32/shlwapi/ordinal.c
@@ -402,7 +402,9 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown)
V_VT(&var) = VT_UNKNOWN;
V_UNKNOWN(&var) = (IUnknown*)pIEnumFormatEtc;
- hRet = IWebBrowserApp_PutProperty(pBrowser, (BSTR)szProperty, var);
+ property = SysAllocString(szProperty);
+ hRet = IWebBrowserApp_PutProperty(pBrowser, property, var);
+ SysFreeString(property);
if (FAILED(hRet))
{
IEnumFORMATETC_Release(pIEnumFormatEtc);
@@ -4854,3 +4856,127 @@ BOOL WINAPI SHPropertyBag_ReadLONG(IPropertyBag *ppb, LPCWSTR pszPropName, LPLON
}
return hr;
}
+
+/* return flags for SHGetObjectCompatFlags, names derived from registry value names */
+#define OBJCOMPAT_OTNEEDSSFCACHE 0x00000001
+#define OBJCOMPAT_NO_WEBVIEW 0x00000002
+#define OBJCOMPAT_UNBINDABLE 0x00000004
+#define OBJCOMPAT_PINDLL 0x00000008
+#define OBJCOMPAT_NEEDSFILESYSANCESTOR 0x00000010
+#define OBJCOMPAT_NOTAFILESYSTEM 0x00000020
+#define OBJCOMPAT_CTXMENU_NOVERBS 0x00000040
+#define OBJCOMPAT_CTXMENU_LIMITEDQI 0x00000080
+#define OBJCOMPAT_COCREATESHELLFOLDERONLY 0x00000100
+#define OBJCOMPAT_NEEDSSTORAGEANCESTOR 0x00000200
+#define OBJCOMPAT_NOLEGACYWEBVIEW 0x00000400
+#define OBJCOMPAT_CTXMENU_XPQCMFLAGS 0x00001000
+#define OBJCOMPAT_NOIPROPERTYSTORE 0x00002000
+
+/* a search table for compatibility flags */
+struct objcompat_entry {
+ const WCHAR name[30];
+ DWORD value;
+};
+
+/* expected to be sorted by name */
+static const struct objcompat_entry objcompat_table[] = {
+ { {'C','O','C','R','E','A','T','E','S','H','E','L','L','F','O','L','D','E','R','O','N','L','Y',0},
+ OBJCOMPAT_COCREATESHELLFOLDERONLY },
+ { {'C','T','X','M','E','N','U','_','L','I','M','I','T','E','D','Q','I',0},
+ OBJCOMPAT_CTXMENU_LIMITEDQI },
+ { {'C','T','X','M','E','N','U','_','N','O','V','E','R','B','S',0},
+ OBJCOMPAT_CTXMENU_LIMITEDQI },
+ { {'C','T','X','M','E','N','U','_','X','P','Q','C','M','F','L','A','G','S',0},
+ OBJCOMPAT_CTXMENU_XPQCMFLAGS },
+ { {'N','E','E','D','S','F','I','L','E','S','Y','S','A','N','C','E','S','T','O','R',0},
+ OBJCOMPAT_NEEDSFILESYSANCESTOR },
+ { {'N','E','E','D','S','S','T','O','R','A','G','E','A','N','C','E','S','T','O','R',0},
+ OBJCOMPAT_NEEDSSTORAGEANCESTOR },
+ { {'N','O','I','P','R','O','P','E','R','T','Y','S','T','O','R','E',0},
+ OBJCOMPAT_NOIPROPERTYSTORE },
+ { {'N','O','L','E','G','A','C','Y','W','E','B','V','I','E','W',0},
+ OBJCOMPAT_NOLEGACYWEBVIEW },
+ { {'N','O','T','A','F','I','L','E','S','Y','S','T','E','M',0},
+ OBJCOMPAT_NOTAFILESYSTEM },
+ { {'N','O','_','W','E','B','V','I','E','W',0},
+ OBJCOMPAT_NO_WEBVIEW },
+ { {'O','T','N','E','E','D','S','S','F','C','A','C','H','E',0},
+ OBJCOMPAT_OTNEEDSSFCACHE },
+ { {'P','I','N','D','L','L',0},
+ OBJCOMPAT_PINDLL },
+ { {'U','N','B','I','N','D','A','B','L','E',0},
+ OBJCOMPAT_UNBINDABLE }
+};
+
+/**************************************************************************
+ * SHGetObjectCompatFlags (SHLWAPI.476)
+ *
+ * Function returns an integer representation of compatibility flags stored
+ * in registry for CLSID under ShellCompatibility subkey.
+ *
+ * PARAMS
+ * pUnk: pointer to object IUnknown interface, idetifies CLSID
+ * clsid: pointer to CLSID to retrieve data for
+ *
+ * RETURNS
+ * 0 on failure, flags set on success
+ */
+DWORD WINAPI SHGetObjectCompatFlags(IUnknown *pUnk, const CLSID *clsid)
+{
+ static const WCHAR compatpathW[] =
+ {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
+ 'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+ 'S','h','e','l','l','C','o','m','p','a','t','i','b','i','l','i','t','y','\\',
+ 'O','b','j','e','c','t','s','\\','%','s',0};
+ WCHAR strW[sizeof(compatpathW)/sizeof(WCHAR) + 38 /* { CLSID } */];
+ DWORD ret, length = sizeof(strW)/sizeof(WCHAR);
+ OLECHAR *clsid_str;
+ HKEY key;
+ INT i;
+
+ TRACE("%p %s\n", pUnk, debugstr_guid(clsid));
+
+ if (!pUnk && !clsid) return 0;
+
+ if (pUnk && !clsid)
+ {
+ FIXME("iface not handled\n");
+ return 0;
+ }
+
+ StringFromCLSID(clsid, &clsid_str);
+ sprintfW(strW, compatpathW, clsid_str);
+ CoTaskMemFree(clsid_str);
+
+ ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, strW, &key);
+ if (ret != ERROR_SUCCESS) return 0;
+
+ /* now collect flag values */
+ ret = 0;
+ for (i = 0; RegEnumValueW(key, i, strW, &length, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; i++)
+ {
+ INT left, right, res, x;
+
+ /* search in table */
+ left = 0;
+ right = sizeof(objcompat_table) / sizeof(struct objcompat_entry) - 1;
+
+ while (right >= left) {
+ x = (left + right) / 2;
+ res = strcmpW(strW, objcompat_table[x].name);
+ if (res == 0)
+ {
+ ret |= objcompat_table[x].value;
+ break;
+ }
+ else if (res < 0)
+ right = x - 1;
+ else
+ left = x + 1;
+ }
+
+ length = sizeof(strW)/sizeof(WCHAR);
+ }
+
+ return ret;
+}
diff --git a/dll/win32/shlwapi/shlwapi.spec b/dll/win32/shlwapi/shlwapi.spec
index 3091783f580..d899232f9c5 100644
--- a/dll/win32/shlwapi/shlwapi.spec
+++ b/dll/win32/shlwapi/shlwapi.spec
@@ -473,7 +473,7 @@
473 stub -noname SHGetIniStringUTF7W
474 stub -noname SHSetIniStringUTF7W
475 stdcall -noname GetShellSecurityDescriptor(ptr long)
-476 stub -noname SHGetObjectCompatFlags
+476 stdcall -noname SHGetObjectCompatFlags(ptr ptr)
477 stub -noname SHCreatePropertyBagOnMemory
478 stdcall -noname IUnknown_TranslateAcceleratorIO(ptr ptr)
479 stdcall -noname IUnknown_UIActivateIO(ptr long ptr)
@@ -559,6 +559,7 @@
@ stdcall ColorAdjustLuma(long long long)
@ stdcall ColorHLSToRGB(long long long)
@ stdcall ColorRGBToHLS(long ptr ptr ptr)
+@ stdcall DelayLoadFailureHook(str str) kernel32.DelayLoadFailureHook
@ stdcall -private DllGetVersion(ptr)
@ stdcall GetMenuPosFromID(ptr long)
@ stdcall HashData (ptr long ptr long)
diff --git a/dll/win32/shlwapi/string.c b/dll/win32/shlwapi/string.c
index cfb59ea4400..e00a92582e0 100644
--- a/dll/win32/shlwapi/string.c
+++ b/dll/win32/shlwapi/string.c
@@ -507,23 +507,33 @@ LPWSTR WINAPI StrCpyW(LPWSTR lpszStr, LPCWSTR lpszSrc)
* Copy a string to another string, up to a maximum number of characters.
*
* PARAMS
- * lpszStr [O] Destination string
- * lpszSrc [I] Source string
- * iLen [I] Maximum number of chars to copy
+ * dst [O] Destination string
+ * src [I] Source string
+ * count [I] Maximum number of chars to copy
*
* RETURNS
- * lpszStr.
+ * dst.
*/
-LPWSTR WINAPI StrCpyNW(LPWSTR lpszStr, LPCWSTR lpszSrc, int iLen)
+LPWSTR WINAPI StrCpyNW(LPWSTR dst, LPCWSTR src, int count)
{
- TRACE("(%p,%s,%i)\n", lpszStr, debugstr_w(lpszSrc), iLen);
+ LPWSTR d = dst;
+ LPCWSTR s = src;
- lstrcpynW(lpszStr, lpszSrc, iLen);
- return lpszStr;
+ TRACE("(%p,%s,%i)\n", dst, debugstr_w(src), count);
+
+ if (s)
+ {
+ while ((count > 1) && *s)
+ {
+ count--;
+ *d++ = *s++;
+ }
+ }
+ if (count) *d = 0;
+
+ return dst;
}
-
-
/*************************************************************************
* SHLWAPI_StrStrHelperA
*
diff --git a/dll/win32/shlwapi/url.c b/dll/win32/shlwapi/url.c
index 2fdae3de523..958a8429f53 100644
--- a/dll/win32/shlwapi/url.c
+++ b/dll/win32/shlwapi/url.c
@@ -359,6 +359,7 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
if (*wk1 != '/') {state = 6; break;}
*wk2++ = *wk1++;
if((dwFlags & URL_FILE_USE_PATHURL) && nByteLen >= sizeof(wszLocalhost)
+ && !strncmpW(wszFile, pszUrl, sizeof(wszFile)/sizeof(WCHAR))
&& !memcmp(wszLocalhost, wk1, sizeof(wszLocalhost))){
wk1 += sizeof(wszLocalhost)/sizeof(WCHAR);
while(*wk1 == '\\' && (dwFlags & URL_FILE_USE_PATHURL))
@@ -2051,6 +2052,9 @@ HRESULT WINAPI UrlGetPartA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut,
LPWSTR in, out;
DWORD ret, len, len2;
+ if(!pszIn || !pszOut || !pcchOut || *pcchOut <= 0)
+ return E_INVALIDARG;
+
in = HeapAlloc(GetProcessHeap(), 0,
(2*INTERNET_MAX_URL_LENGTH) * sizeof(WCHAR));
out = in + INTERNET_MAX_URL_LENGTH;
@@ -2067,7 +2071,7 @@ HRESULT WINAPI UrlGetPartA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut,
len2 = WideCharToMultiByte(0, 0, out, len, 0, 0, 0, 0);
if (len2 > *pcchOut) {
- *pcchOut = len2;
+ *pcchOut = len2+1;
HeapFree(GetProcessHeap(), 0, in);
return E_POINTER;
}
@@ -2093,20 +2097,25 @@ HRESULT WINAPI UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut,
TRACE("(%s %p %p(%d) %08x %08x)\n",
debugstr_w(pszIn), pszOut, pcchOut, *pcchOut, dwPart, dwFlags);
+ if(!pszIn || !pszOut || !pcchOut || *pcchOut <= 0)
+ return E_INVALIDARG;
+
+ *pszOut = '\0';
+
addr = strchrW(pszIn, ':');
if(!addr)
- return E_FAIL;
-
- scheme = get_scheme_code(pszIn, addr-pszIn);
+ scheme = URL_SCHEME_UNKNOWN;
+ else
+ scheme = get_scheme_code(pszIn, addr-pszIn);
ret = URL_ParseUrl(pszIn, &pl);
- if (ret == S_OK) {
- schaddr = pl.pScheme;
- schsize = pl.szScheme;
switch (dwPart) {
case URL_PART_SCHEME:
- if (!pl.szScheme) return E_INVALIDARG;
+ if (!pl.szScheme || scheme == URL_SCHEME_UNKNOWN) {
+ *pcchOut = 0;
+ return S_FALSE;
+ }
addr = pl.pScheme;
size = pl.szScheme;
break;
@@ -2121,55 +2130,76 @@ HRESULT WINAPI UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut,
case URL_SCHEME_HTTPS:
break;
default:
+ *pcchOut = 0;
return E_FAIL;
}
if(scheme==URL_SCHEME_FILE && (!pl.szHostName ||
(pl.szHostName==1 && *(pl.pHostName+1)==':'))) {
- if(pcchOut)
- *pszOut = '\0';
*pcchOut = 0;
return S_FALSE;
}
- if (!pl.szHostName) return E_INVALIDARG;
+ if (!pl.szHostName) {
+ *pcchOut = 0;
+ return S_FALSE;
+ }
addr = pl.pHostName;
size = pl.szHostName;
break;
case URL_PART_USERNAME:
- if (!pl.szUserName) return E_INVALIDARG;
+ if (!pl.szUserName) {
+ *pcchOut = 0;
+ return S_FALSE;
+ }
addr = pl.pUserName;
size = pl.szUserName;
break;
case URL_PART_PASSWORD:
- if (!pl.szPassword) return E_INVALIDARG;
+ if (!pl.szPassword) {
+ *pcchOut = 0;
+ return S_FALSE;
+ }
addr = pl.pPassword;
size = pl.szPassword;
break;
case URL_PART_PORT:
- if (!pl.szPort) return E_INVALIDARG;
+ if (!pl.szPort) {
+ *pcchOut = 0;
+ return S_FALSE;
+ }
addr = pl.pPort;
size = pl.szPort;
break;
case URL_PART_QUERY:
- if (!pl.szQuery) return E_INVALIDARG;
+ if (!pl.szQuery) {
+ *pcchOut = 0;
+ return S_FALSE;
+ }
addr = pl.pQuery;
size = pl.szQuery;
break;
default:
+ *pcchOut = 0;
return E_INVALIDARG;
}
if (dwFlags == URL_PARTFLAG_KEEPSCHEME) {
+ if(!pl.pScheme || !pl.szScheme) {
+ *pcchOut = 0;
+ return E_FAIL;
+ }
+ schaddr = pl.pScheme;
+ schsize = pl.szScheme;
if (*pcchOut < schsize + size + 2) {
*pcchOut = schsize + size + 2;
- return E_POINTER;
- }
+ return E_POINTER;
+ }
memcpy(pszOut, schaddr, schsize*sizeof(WCHAR));
pszOut[schsize] = ':';
memcpy(pszOut+schsize+1, addr, size*sizeof(WCHAR));
@@ -2183,12 +2213,6 @@ HRESULT WINAPI UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut,
*pcchOut = size;
}
TRACE("len=%d %s\n", *pcchOut, debugstr_w(pszOut));
- }else if(dwPart==URL_PART_HOSTNAME && scheme==URL_SCHEME_FILE) {
- if(*pcchOut)
- *pszOut = '\0';
- *pcchOut = 0;
- return S_FALSE;
- }
return ret;
}
diff --git a/dll/win32/syssetup/install.c b/dll/win32/syssetup/install.c
index 6a1a1f7dac6..c212916252b 100644
--- a/dll/win32/syssetup/install.c
+++ b/dll/win32/syssetup/install.c
@@ -511,7 +511,7 @@ cleanup:
}
-static BOOL CALLBACK
+static INT_PTR CALLBACK
StatusMessageWindowProc(
IN HWND hwndDlg,
IN UINT uMsg,
diff --git a/dll/win32/urlmon/internet.c b/dll/win32/urlmon/internet.c
index 6a79e48b526..3d41defe8f6 100644
--- a/dll/win32/urlmon/internet.c
+++ b/dll/win32/urlmon/internet.c
@@ -405,3 +405,12 @@ HRESULT WINAPI CoInternetSetFeatureEnabled(INTERNETFEATURELIST feature, DWORD fl
FIXME("%d, 0x%08x, %x, stub\n", feature, flags, enable);
return E_NOTIMPL;
}
+
+/***********************************************************************
+ * CoInternetIsFeatureEnabled (URLMON.@)
+ */
+HRESULT WINAPI CoInternetIsFeatureEnabled(INTERNETFEATURELIST feature, DWORD flags)
+{
+ FIXME("%d, 0x%08x, stub\n", feature, flags);
+ return E_NOTIMPL;
+}
diff --git a/dll/win32/urlmon/sec_mgr.c b/dll/win32/urlmon/sec_mgr.c
index 81f2f507d0d..f984aa4e907 100644
--- a/dll/win32/urlmon/sec_mgr.c
+++ b/dll/win32/urlmon/sec_mgr.c
@@ -1287,11 +1287,13 @@ HRESULT WINAPI CoInternetGetSecurityUrl(LPCWSTR pwzUrl, LPWSTR *ppwzSecUrl, PSUA
return S_OK;
}
- hres = CoInternetParseUrl(url, PARSE_ROOTDOCUMENT, 0, domain, 0, &len, 0);
- if(hres == S_FALSE) {
- hres = CoInternetParseUrl(url, PARSE_SCHEMA, 0, domain,
- INTERNET_MAX_URL_LENGTH, &len, 0);
- if(hres == S_OK) {
+ hres = CoInternetParseUrl(url, PARSE_SCHEMA, 0, domain,
+ INTERNET_MAX_URL_LENGTH, &len, 0);
+ if(hres == S_OK){
+ const WCHAR fileW[] = {'f','i','l','e',0};
+ if(!strcmpW(domain, fileW)){
+ hres = CoInternetParseUrl(url, PARSE_ROOTDOCUMENT, 0, domain, INTERNET_MAX_URL_LENGTH, &len, 0);
+ }else{
domain[len] = ':';
hres = CoInternetParseUrl(url, PARSE_DOMAIN, 0, domain+len+1,
INTERNET_MAX_URL_LENGTH-len-1, &len, 0);
@@ -1305,7 +1307,8 @@ HRESULT WINAPI CoInternetGetSecurityUrl(LPCWSTR pwzUrl, LPWSTR *ppwzSecUrl, PSUA
return S_OK;
}
}
- }
+ }else
+ return hres;
len = lstrlenW(url)+1;
*ppwzSecUrl = CoTaskMemAlloc(len*sizeof(WCHAR));
diff --git a/dll/win32/urlmon/uri.c b/dll/win32/urlmon/uri.c
index d4d6b47e5ab..668aa9b7109 100644
--- a/dll/win32/urlmon/uri.c
+++ b/dll/win32/urlmon/uri.c
@@ -26,7 +26,13 @@ typedef struct {
LONG ref;
} Uri;
-#define URI(x) ((IUri*) &(x)->lpIUriVtbl)
+typedef struct {
+ const IUriBuilderVtbl *lpIUriBuilderVtbl;
+ LONG ref;
+} UriBuilder;
+
+#define URI(x) ((IUri*) &(x)->lpIUriVtbl)
+#define URIBUILDER(x) ((IUriBuilder*) &(x)->lpIUriBuilderVtbl)
#define URI_THIS(iface) DEFINE_THIS(Uri, IUri, iface)
@@ -300,3 +306,273 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU
*ppURI = URI(ret);
return S_OK;
}
+
+#define URIBUILDER_THIS(iface) DEFINE_THIS(UriBuilder, IUriBuilder, iface)
+
+static HRESULT WINAPI UriBuilder_QueryInterface(IUriBuilder *iface, REFIID riid, void **ppv)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+
+ if(IsEqualGUID(&IID_IUnknown, riid)) {
+ TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
+ *ppv = URIBUILDER(This);
+ }else if(IsEqualGUID(&IID_IUriBuilder, riid)) {
+ TRACE("(%p)->(IID_IUri %p)\n", This, ppv);
+ *ppv = URIBUILDER(This);
+ }else {
+ TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI UriBuilder_AddRef(IUriBuilder *iface)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ LONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) ref=%d\n", This, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI UriBuilder_Release(IUriBuilder *iface)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ LONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) ref=%d\n", This, ref);
+
+ if(!ref)
+ heap_free(This);
+
+ return ref;
+}
+
+static HRESULT WINAPI UriBuilder_CreateUriSimple(IUriBuilder *iface,
+ DWORD dwAllowEncodingPropertyMask,
+ DWORD_PTR dwReserved,
+ IUri **ppIUri)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%d %d %p)\n", This, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_CreateUri(IUriBuilder *iface,
+ DWORD dwCreateFlags,
+ DWORD dwAllowEncodingPropertyMask,
+ DWORD_PTR dwReserved,
+ IUri **ppIUri)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(0x%08x %d %d %p)\n", This, dwCreateFlags, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_CreateUriWithFlags(IUriBuilder *iface,
+ DWORD dwCreateFlags,
+ DWORD dwUriBuilderFlags,
+ DWORD dwAllowEncodingPropertyMask,
+ DWORD_PTR dwReserved,
+ IUri **ppIUri)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(0x%08x 0x%08x %d %d %p)\n", This, dwCreateFlags, dwUriBuilderFlags,
+ dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_GetIUri(IUriBuilder *iface, IUri **ppIUri)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, ppIUri);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_SetIUri(IUriBuilder *iface, IUri *pIUri)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, pIUri);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_GetFragment(IUriBuilder *iface, DWORD *pcchFragment, LPCWSTR *ppwzFragment)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%p %p)\n", This, pcchFragment, ppwzFragment);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_GetHost(IUriBuilder *iface, DWORD *pcchHost, LPCWSTR *ppwzHost)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%p %p)\n", This, pcchHost, ppwzHost);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_GetPassword(IUriBuilder *iface, DWORD *pcchPassword, LPCWSTR *ppwzPassword)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%p %p)\n", This, pcchPassword, ppwzPassword);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_GetPath(IUriBuilder *iface, DWORD *pcchPath, LPCWSTR *ppwzPath)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%p %p)\n", This, pcchPath, ppwzPath);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_GetPort(IUriBuilder *iface, BOOL *pfHasPort, DWORD *pdwPort)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%p %p)\n", This, pfHasPort, pdwPort);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_GetQuery(IUriBuilder *iface, DWORD *pcchQuery, LPCWSTR *ppwzQuery)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%p %p)\n", This, pcchQuery, ppwzQuery);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_GetSchemeName(IUriBuilder *iface, DWORD *pcchSchemeName, LPCWSTR *ppwzSchemeName)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%p %p)\n", This, pcchSchemeName, ppwzSchemeName);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_GetUserName(IUriBuilder *iface, DWORD *pcchUserName, LPCWSTR *ppwzUserName)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%p %p)\n", This, pcchUserName, ppwzUserName);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_SetFragment(IUriBuilder *iface, LPCWSTR pwzNewValue)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_SetHost(IUriBuilder *iface, LPCWSTR pwzNewValue)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_SetPassword(IUriBuilder *iface, LPCWSTR pwzNewValue)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_SetPath(IUriBuilder *iface, LPCWSTR pwzNewValue)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_SetPort(IUriBuilder *iface, BOOL fHasPort, DWORD dwNewValue)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%d %d)\n", This, fHasPort, dwNewValue);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_SetQuery(IUriBuilder *iface, LPCWSTR pwzNewValue)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_SetSchemeName(IUriBuilder *iface, LPCWSTR pwzNewValue)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_SetUserName(IUriBuilder *iface, LPCWSTR pwzNewValue)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_RemoveProperties(IUriBuilder *iface, DWORD dwPropertyMask)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(0x%08x)\n", This, dwPropertyMask);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UriBuilder_HasBeenModified(IUriBuilder *iface, BOOL *pfModified)
+{
+ UriBuilder *This = URIBUILDER_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, pfModified);
+ return E_NOTIMPL;
+}
+
+#undef URIBUILDER_THIS
+
+static const IUriBuilderVtbl UriBuilderVtbl = {
+ UriBuilder_QueryInterface,
+ UriBuilder_AddRef,
+ UriBuilder_Release,
+ UriBuilder_CreateUriSimple,
+ UriBuilder_CreateUri,
+ UriBuilder_CreateUriWithFlags,
+ UriBuilder_GetIUri,
+ UriBuilder_SetIUri,
+ UriBuilder_GetFragment,
+ UriBuilder_GetHost,
+ UriBuilder_GetPassword,
+ UriBuilder_GetPath,
+ UriBuilder_GetPort,
+ UriBuilder_GetQuery,
+ UriBuilder_GetSchemeName,
+ UriBuilder_GetUserName,
+ UriBuilder_SetFragment,
+ UriBuilder_SetHost,
+ UriBuilder_SetPassword,
+ UriBuilder_SetPath,
+ UriBuilder_SetPort,
+ UriBuilder_SetQuery,
+ UriBuilder_SetSchemeName,
+ UriBuilder_SetUserName,
+ UriBuilder_RemoveProperties,
+ UriBuilder_HasBeenModified,
+};
+
+/***********************************************************************
+ * CreateIUriBuilder (urlmon.@)
+ */
+HRESULT WINAPI CreateIUriBuilder(IUri *pIUri, DWORD dwFlags, DWORD_PTR dwReserved, IUriBuilder **ppIUriBuilder)
+{
+ UriBuilder *ret;
+
+ TRACE("(%p %x %x %p)\n", pIUri, dwFlags, (DWORD)dwReserved, ppIUriBuilder);
+
+ ret = heap_alloc(sizeof(UriBuilder));
+ if(!ret)
+ return E_OUTOFMEMORY;
+
+ ret->lpIUriBuilderVtbl = &UriBuilderVtbl;
+ ret->ref = 1;
+
+ *ppIUriBuilder = URIBUILDER(ret);
+ return S_OK;
+}
diff --git a/dll/win32/urlmon/urlmon.spec b/dll/win32/urlmon/urlmon.spec
index a67004a9b0b..e79850c4f19 100644
--- a/dll/win32/urlmon/urlmon.spec
+++ b/dll/win32/urlmon/urlmon.spec
@@ -17,6 +17,7 @@
@ stub CoInternetGetProtocolFlags
@ stdcall CoInternetGetSecurityUrl(ptr ptr long long)
@ stdcall CoInternetGetSession(long ptr long)
+@ stdcall CoInternetIsFeatureEnabled(long long)
@ stdcall CoInternetParseUrl(wstr long long wstr long ptr long)
@ stdcall CoInternetQueryInfo(ptr long long ptr long ptr long)
@ stdcall CoInternetSetFeatureEnabled(long long long)
@@ -26,6 +27,7 @@
@ stdcall CreateAsyncBindCtx(long ptr ptr ptr)
@ stdcall CreateAsyncBindCtxEx(ptr long ptr ptr ptr long)
@ stdcall CreateFormatEnumerator(long ptr ptr)
+@ stdcall CreateIUriBuilder(ptr long long ptr)
@ stdcall CreateUri(wstr long long ptr)
@ stdcall CreateURLMoniker(ptr wstr ptr)
@ stdcall CreateURLMonikerEx(ptr wstr ptr long)
diff --git a/dll/win32/user32/controls/scrollbar.c b/dll/win32/user32/controls/scrollbar.c
index 460fd6a3ea1..0854bd9e0a9 100644
--- a/dll/win32/user32/controls/scrollbar.c
+++ b/dll/win32/user32/controls/scrollbar.c
@@ -1196,64 +1196,44 @@ VOID FASTCALL
ScrollTrackScrollBar(HWND Wnd, INT SBType, POINT Pt)
{
MSG Msg;
- RECT WindowRect;
- UINT XOffset, YOffset;
- POINT TopLeft;
+ UINT XOffset = 0, YOffset = 0;
- if (SB_CTL != SBType)
- {
- GetWindowRect(Wnd, &WindowRect);
-
- Pt.x -= WindowRect.left;
- Pt.y -= WindowRect.top;
-
- TopLeft.x = WindowRect.left;
- TopLeft.y = WindowRect.top;
- ScreenToClient(Wnd, &TopLeft);
- XOffset = - TopLeft.x;
- YOffset = - TopLeft.y;
- }
- else
- {
- XOffset = 0;
- YOffset = 0;
- }
+ if (SBType != SB_CTL)
+ {
+ PWND pwnd = ValidateHwnd(Wnd);
+ if (!pwnd) return;
+ XOffset = pwnd->rcClient.left - pwnd->rcWindow.left;
+ YOffset = pwnd->rcClient.top - pwnd->rcWindow.top;
+ ScreenToClient(Wnd, &Pt);
+ Pt.x += XOffset;
+ Pt.y += YOffset;
+ }
IntScrollHandleScrollEvent(Wnd, SBType, WM_LBUTTONDOWN, Pt);
do
- {
- if (! GetMessageW(&Msg, 0, 0, 0))
- {
- break;
- }
- if (CallMsgFilterW(&Msg, MSGF_SCROLLBAR))
- {
- continue;
- }
-
- switch(Msg.message)
- {
- case WM_SYSTIMER:
- case WM_LBUTTONUP:
- case WM_MOUSEMOVE:
- Pt.x = LOWORD(Msg.lParam) + XOffset;
- Pt.y = HIWORD(Msg.lParam) + YOffset;
- IntScrollHandleScrollEvent(Wnd, SBType, Msg.message, Pt);
- break;
- default:
- TranslateMessage(&Msg);
- DispatchMessageW(&Msg);
- break;
- }
-
- if (! IsWindow(Wnd))
- {
+ {
+ if (!GetMessageW(&Msg, 0, 0, 0)) break;
+ if (CallMsgFilterW(&Msg, MSGF_SCROLLBAR)) continue;
+ if ( Msg.message == WM_LBUTTONUP ||
+ Msg.message == WM_MOUSEMOVE ||
+ (Msg.message == WM_SYSTIMER && Msg.wParam == SCROLL_TIMER))
+ {
+ Pt.x = LOWORD(Msg.lParam) + XOffset;
+ Pt.y = HIWORD(Msg.lParam) + YOffset;
+ IntScrollHandleScrollEvent(Wnd, SBType, Msg.message, Pt);
+ }
+ else
+ {
+ TranslateMessage(&Msg);
+ DispatchMessageW(&Msg);
+ }
+ if (!IsWindow(Wnd))
+ {
ReleaseCapture();
break;
- }
- }
- while (WM_LBUTTONUP != Msg.message);
+ }
+ } while (Msg.message != WM_LBUTTONUP && GetCapture() == Wnd);
}
diff --git a/dll/win32/user32/include/dde_private.h b/dll/win32/user32/include/dde_private.h
index 8583efdc3b0..beca7483ac5 100644
--- a/dll/win32/user32/include/dde_private.h
+++ b/dll/win32/user32/include/dde_private.h
@@ -208,7 +208,7 @@ extern WDML_CONV* WDML_GetConvFromWnd(HWND hWnd);
extern WDML_CONV* WDML_FindConv(WDML_INSTANCE* pInstance, WDML_SIDE side,
HSZ hszService, HSZ hszTopic);
extern BOOL WDML_PostAck(WDML_CONV* pConv, WDML_SIDE side, WORD appRetCode,
- BOOL fBusy, BOOL fAck, UINT pmt, LPARAM lParam, UINT oldMsg);
+ BOOL fBusy, BOOL fAck, UINT_PTR pmt, LPARAM lParam, UINT oldMsg);
extern void WDML_AddLink(WDML_INSTANCE* pInstance, HCONV hConv, WDML_SIDE side,
UINT wType, HSZ hszItem, UINT wFmt);
extern WDML_LINK* WDML_FindLink(WDML_INSTANCE* pInstance, HCONV hConv, WDML_SIDE side,
diff --git a/dll/win32/user32/include/user32.h b/dll/win32/user32/include/user32.h
index 174d71ebb3b..99f48a1a9a2 100644
--- a/dll/win32/user32/include/user32.h
+++ b/dll/win32/user32/include/user32.h
@@ -153,7 +153,7 @@ DesktopPtrToUser(PVOID Ptr)
/* NOTE: This is slow as it requires a call to win32k. This should only be
neccessary if a thread wants to access an object on a different
desktop */
- return NtUserGetDesktopMapping(Ptr);
+ return (PVOID)NtUserGetDesktopMapping(Ptr);
}
}
diff --git a/dll/win32/user32/misc/dllmain.c b/dll/win32/user32/misc/dllmain.c
index 044f493fda4..7a1abc97d1e 100644
--- a/dll/win32/user32/misc/dllmain.c
+++ b/dll/win32/user32/misc/dllmain.c
@@ -217,23 +217,25 @@ BOOL
Init(VOID)
{
USERCONNECT UserCon;
+ PVOID *KernelCallbackTable;
/* Set up the kernel callbacks. */
- NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_WINDOWPROC] =
+ KernelCallbackTable = NtCurrentPeb()->KernelCallbackTable;
+ KernelCallbackTable[USER32_CALLBACK_WINDOWPROC] =
(PVOID)User32CallWindowProcFromKernel;
- NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDASYNCPROC] =
+ KernelCallbackTable[USER32_CALLBACK_SENDASYNCPROC] =
(PVOID)User32CallSendAsyncProcForKernel;
- NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADSYSMENUTEMPLATE] =
+ KernelCallbackTable[USER32_CALLBACK_LOADSYSMENUTEMPLATE] =
(PVOID)User32LoadSysMenuTemplateForKernel;
- NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADDEFAULTCURSORS] =
+ KernelCallbackTable[USER32_CALLBACK_LOADDEFAULTCURSORS] =
(PVOID)User32SetupDefaultCursors;
- NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_HOOKPROC] =
+ KernelCallbackTable[USER32_CALLBACK_HOOKPROC] =
(PVOID)User32CallHookProcFromKernel;
- NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_EVENTPROC] =
+ KernelCallbackTable[USER32_CALLBACK_EVENTPROC] =
(PVOID)User32CallEventProcFromKernel;
- NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADMENU] =
+ KernelCallbackTable[USER32_CALLBACK_LOADMENU] =
(PVOID)User32CallLoadMenuFromKernel;
- NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_CLIENTTHREADSTARTUP] =
+ KernelCallbackTable[USER32_CALLBACK_CLIENTTHREADSTARTUP] =
(PVOID)User32CallClientThreadSetupFromKernel;
NtUserProcessConnect( NtCurrentProcess(),
diff --git a/dll/win32/user32/windows/defwnd.c b/dll/win32/user32/windows/defwnd.c
index ee6def9cdab..890076b0286 100644
--- a/dll/win32/user32/windows/defwnd.c
+++ b/dll/win32/user32/windows/defwnd.c
@@ -30,6 +30,7 @@ LRESULT DefWndNCHitTest(HWND hWnd, POINT Point);
LRESULT DefWndNCLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam);
LRESULT DefWndNCLButtonDblClk(HWND hWnd, WPARAM wParam, LPARAM lParam);
void FASTCALL MenuInitSysMenuPopup(HMENU Menu, DWORD Style, DWORD ClsStyle, LONG HitTest );
+void MENU_EndMenu( HWND );
/* GLOBALS *******************************************************************/
@@ -1480,7 +1481,8 @@ User32DefWindowProc(HWND hWnd,
{
iMenuSysKey = 0;
/* FIXME: Check for a desktop. */
- if (!(GetWindowLongPtrW( hWnd, GWL_STYLE ) & WS_CHILD)) EndMenu();
+ //if (!(GetWindowLongPtrW( hWnd, GWL_STYLE ) & WS_CHILD)) EndMenu();
+ MENU_EndMenu( hWnd );
if (GetCapture() == hWnd)
{
ReleaseCapture();
@@ -2049,7 +2051,6 @@ RealDefWindowProcW(HWND hWnd,
LPCREATESTRUCTW cs = (LPCREATESTRUCTW)lParam;
/* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
* may have child window IDs instead of window name */
-
if (HIWORD(cs->lpszName))
{
DefSetText(hWnd, cs->lpszName, FALSE);
diff --git a/dll/win32/user32/windows/draw.c b/dll/win32/user32/windows/draw.c
index cb67e30f46b..2eb68d11988 100644
--- a/dll/win32/user32/windows/draw.c
+++ b/dll/win32/user32/windows/draw.c
@@ -1574,7 +1574,7 @@ FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr)
if (hbr <= (HBRUSH)(COLOR_MENUBAR + 1))
{
- hbr = GetSysColorBrush((int)hbr - 1);
+ hbr = GetSysColorBrush(PtrToUlong(hbr) - 1);
}
if ((prevhbr = SelectObject(hDC, hbr)) == NULL)
{
diff --git a/dll/win32/user32/windows/menu.c b/dll/win32/user32/windows/menu.c
index 58c4a95243e..ade437c840a 100644
--- a/dll/win32/user32/windows/menu.c
+++ b/dll/win32/user32/windows/menu.c
@@ -1,5 +1,4 @@
-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS user32.dll
* FILE: user32/windows/menu.c
@@ -34,7 +33,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(menu);
/* Internal MenuTrackMenu() flags */
#define TPM_INTERNAL 0xF0000000
-#define TPM_ENTERIDLEEX 0x80000000 /* set owner window for WM_ENTERIDLE */
#define TPM_BUTTONDOWN 0x40000000 /* menu was clicked before tracking */
#define TPM_POPUPMENU 0x20000000 /* menu is a popup menu */
@@ -58,6 +56,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(menu);
/* Use global popup window because there's no way 2 menus can
* be tracked at the same time. */
static HWND top_popup;
+static HMENU top_popup_hmenu;
/* Flag set by EndMenu() to force an exit from menu tracking */
static BOOL fEndMenu = FALSE;
@@ -540,7 +539,7 @@ static UINT FASTCALL MenuFindItemByKey(HWND WndOwner, PROSMENUINFO MenuInfo,
ItemInfo = Items;
for (i = 0; i < MenuInfo->MenuItemCount; i++, ItemInfo++)
{
- if ((ItemInfo->Text) && NULL != ItemInfo->dwTypeData)
+ if ((ItemInfo->lpstr) && NULL != ItemInfo->dwTypeData)
{
WCHAR *p = (WCHAR *) ItemInfo->dwTypeData - 2;
do
@@ -576,8 +575,7 @@ static UINT FASTCALL MenuFindItemByKey(HWND WndOwner, PROSMENUINFO MenuInfo,
*
* Get the size of a bitmap item.
*/
-static void FASTCALL MenuGetBitmapItemSize(PROSMENUITEMINFO lpitem, SIZE *size,
- HWND WndOwner)
+static void FASTCALL MenuGetBitmapItemSize(PROSMENUITEMINFO lpitem, SIZE *size, HWND WndOwner)
{
BITMAP bm;
HBITMAP bmp = lpitem->hbmpItem;
@@ -808,7 +806,7 @@ static void FASTCALL MenuCalcItemSize( HDC hdc, PROSMENUITEMINFO lpitem, PROSMEN
return;
}
- lpitem->XTab = 0;
+ lpitem->dxTab = 0;
if (lpitem->hbmpItem)
{
@@ -831,12 +829,12 @@ static void FASTCALL MenuCalcItemSize( HDC hdc, PROSMENUITEMINFO lpitem, PROSMEN
if( !(MenuInfo->dwStyle & MNS_NOCHECK))
lpitem->Rect.right += 2 * check_bitmap_width;
lpitem->Rect.right += 4 + MenuCharSize.cx;
- lpitem->XTab = lpitem->Rect.right;
+ lpitem->dxTab = lpitem->Rect.right;
lpitem->Rect.right += check_bitmap_width;
} else /* hbmpItem & MenuBar */ {
MenuGetBitmapItemSize(lpitem, &size, hwndOwner );
lpitem->Rect.right += size.cx;
- if( lpitem->Text) lpitem->Rect.right += 2;
+ if( lpitem->lpstr) lpitem->Rect.right += 2;
itemheight = size.cy;
/* Special case: Minimize button doesn't have a space behind it. */
@@ -849,12 +847,12 @@ static void FASTCALL MenuCalcItemSize( HDC hdc, PROSMENUITEMINFO lpitem, PROSMEN
if( !(MenuInfo->dwStyle & MNS_NOCHECK))
lpitem->Rect.right += check_bitmap_width;
lpitem->Rect.right += 4 + MenuCharSize.cx;
- lpitem->XTab = lpitem->Rect.right;
+ lpitem->dxTab = lpitem->Rect.right;
lpitem->Rect.right += check_bitmap_width;
}
/* it must be a text item - unless it's the system menu */
- if (!(lpitem->fType & MF_SYSMENU) && lpitem->Text) {
+ if (!(lpitem->fType & MF_SYSMENU) && lpitem->lpstr) {
HFONT hfontOld = NULL;
RECT rc = lpitem->Rect;
LONG txtheight, txtwidth;
@@ -883,7 +881,7 @@ static void FASTCALL MenuCalcItemSize( HDC hdc, PROSMENUITEMINFO lpitem, PROSMEN
/* get text size after the tab */
tmpheight = DrawTextW( hdc, p, -1, &tmprc,
DT_SINGLELINE|DT_CALCRECT);
- lpitem->XTab += txtwidth;
+ lpitem->dxTab += txtwidth;
txtheight = max( txtheight, tmpheight);
txtwidth += MenuCharSize.cx + /* space for the tab */
tmprc.right - tmprc.left; /* space for the short cut */
@@ -891,7 +889,7 @@ static void FASTCALL MenuCalcItemSize( HDC hdc, PROSMENUITEMINFO lpitem, PROSMEN
txtheight = DrawTextW( hdc, lpitem->dwTypeData, -1, &rc,
DT_SINGLELINE|DT_CALCRECT);
txtwidth = rc.right - rc.left;
- lpitem->XTab += txtwidth;
+ lpitem->dxTab += txtwidth;
}
lpitem->Rect.right += 2 + txtwidth;
itemheight = max( itemheight,
@@ -967,10 +965,10 @@ static void FASTCALL MenuPopupMenuCalcSize(PROSMENUINFO MenuInfo, HWND WndOwner)
// }
maxX = max(maxX, lpitem.Rect.right);
orgY = lpitem.Rect.bottom;
- if ((lpitem.Text) && lpitem.XTab )
+ if ((lpitem.lpstr) && lpitem.dxTab )
{
- maxTab = max( maxTab, lpitem.XTab );
- maxTabWidth = max(maxTabWidth, lpitem.Rect.right - lpitem.XTab);
+ maxTab = max( maxTab, lpitem.dxTab );
+ maxTabWidth = max(maxTabWidth, lpitem.Rect.right - lpitem.dxTab);
}
}
@@ -981,9 +979,9 @@ static void FASTCALL MenuPopupMenuCalcSize(PROSMENUINFO MenuInfo, HWND WndOwner)
if (MenuGetRosMenuItemInfo(MenuInfo->Self, start, &lpitem))
{
lpitem.Rect.right = maxX;
- if ((lpitem.Text) && 0 != lpitem.XTab)
+ if ((lpitem.lpstr) && 0 != lpitem.dxTab)
{
- lpitem.XTab = maxTab;
+ lpitem.dxTab = maxTab;
}
MenuSetRosMenuItemInfo(MenuInfo->Self, start, &lpitem);
}
@@ -1381,7 +1379,7 @@ static void FASTCALL MenuDrawMenuItem(HWND hWnd, PROSMENUINFO MenuInfo, HWND Wnd
}
/* process text if present */
- if (lpitem->Text)
+ if (lpitem->lpstr)
{
register int i = 0;
HFONT hfontOld = 0;
@@ -1431,12 +1429,12 @@ static void FASTCALL MenuDrawMenuItem(HWND hWnd, PROSMENUINFO MenuInfo, HWND Wnd
{
if (L'\t' == Text[i])
{
- rect.left = lpitem->XTab;
+ rect.left = lpitem->dxTab;
uFormat = DT_LEFT | DT_VCENTER | DT_SINGLELINE;
}
else
{
- rect.right = lpitem->XTab;
+ rect.right = lpitem->dxTab;
uFormat = DT_RIGHT | DT_VCENTER | DT_SINGLELINE;
}
@@ -1635,6 +1633,7 @@ static BOOL FASTCALL MenuShowPopup(HWND hwndOwner, HMENU hmenu, UINT id, UINT fl
if ( !MenuInfo.Wnd || ! MenuSetRosMenuInfo(&MenuInfo)) return FALSE;
if (!top_popup) {
top_popup = MenuInfo.Wnd;
+ top_popup_hmenu = hmenu;
}
/* Display the window */
@@ -1645,6 +1644,7 @@ static BOOL FASTCALL MenuShowPopup(HWND hwndOwner, HMENU hmenu, UINT id, UINT fl
return TRUE;
}
+
/***********************************************************************
* MenuSelectItem
*/
@@ -1663,6 +1663,7 @@ static void FASTCALL MenuSelectItem(HWND hwndOwner, PROSMENUINFO hmenu, UINT wIn
else hdc = GetDCEx(hmenu->Wnd, 0, DCX_CACHE | DCX_WINDOW);
if (!top_popup) {
top_popup = hmenu->Wnd;
+ top_popup_hmenu = hmenu->Self;
}
SelectObject( hdc, hMenuFont );
@@ -1834,6 +1835,7 @@ LRESULT WINAPI PopupMenuWndProcA(HWND Wnd, UINT Message, WPARAM wParam, LPARAM l
if (Wnd == top_popup)
{
top_popup = NULL;
+ top_popup_hmenu = NULL;
}
break;
@@ -1906,6 +1908,7 @@ PopupMenuWndProcW(HWND Wnd, UINT Message, WPARAM wParam, LPARAM lParam)
if (Wnd == top_popup)
{
top_popup = NULL;
+ top_popup_hmenu = NULL;
}
break;
@@ -2354,13 +2357,30 @@ MenuShowSubPopup(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SelectFirst, UINT Fl
return Ret;
}
+/**********************************************************************
+ * MENU_EndMenu
+ *
+ * Calls EndMenu() if the hwnd parameter belongs to the menu owner
+ *
+ * Does the (menu stuff) of the default window handling of WM_CANCELMODE
+ */
+void MENU_EndMenu( HWND hwnd )
+{
+ ROSMENUINFO MenuInfo;
+ BOOL Ret = FALSE;
+ if (top_popup_hmenu)
+ Ret = MenuGetRosMenuInfo(&MenuInfo, top_popup_hmenu);
+ if (Ret && hwnd == MenuInfo.WndOwner) EndMenu();
+}
+
/***********************************************************************
* MenuHideSubPopups
*
* Hide the sub-popup menus of this menu.
*/
static void FASTCALL
-MenuHideSubPopups(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SendMenuSelect)
+MenuHideSubPopups(HWND WndOwner, PROSMENUINFO MenuInfo,
+ BOOL SendMenuSelect, UINT wFlags)
{
ROSMENUINFO SubMenuInfo;
ROSMENUITEMINFO ItemInfo;
@@ -2368,28 +2388,32 @@ MenuHideSubPopups(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SendMenuSelect)
TRACE("owner=%x menu=%x 0x%04x\n", WndOwner, MenuInfo, SendMenuSelect);
if (NULL != MenuInfo && NULL != top_popup && NO_SELECTED_ITEM != MenuInfo->FocusedItem)
- {
+ {
MenuInitRosMenuItemInfo(&ItemInfo);
ItemInfo.fMask |= MIIM_FTYPE | MIIM_STATE;
if (! MenuGetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo)
|| 0 == (ItemInfo.fType & MF_POPUP)
|| 0 == (ItemInfo.fState & MF_MOUSESELECT))
- {
+ {
MenuCleanupRosMenuItemInfo(&ItemInfo);
return;
- }
+ }
ItemInfo.fState &= ~MF_MOUSESELECT;
ItemInfo.fMask |= MIIM_STATE;
MenuSetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo);
if (MenuGetRosMenuInfo(&SubMenuInfo, ItemInfo.hSubMenu))
- {
- MenuHideSubPopups(WndOwner, &SubMenuInfo, FALSE);
+ {
+ MenuHideSubPopups(WndOwner, &SubMenuInfo, FALSE, wFlags);
MenuSelectItem(WndOwner, &SubMenuInfo, NO_SELECTED_ITEM, SendMenuSelect, NULL);
DestroyWindow(SubMenuInfo.Wnd);
SubMenuInfo.Wnd = NULL;
MenuSetRosMenuInfo(&SubMenuInfo);
- }
- }
+
+ if (!(wFlags & TPM_NONOTIFY))
+ SendMessageW( WndOwner, WM_UNINITMENUPOPUP, (WPARAM)ItemInfo.hSubMenu,
+ MAKELPARAM(0, IS_SYSTEM_MENU(&SubMenuInfo)) );
+ }
+ }
}
/***********************************************************************
@@ -2398,7 +2422,7 @@ MenuHideSubPopups(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SendMenuSelect)
* Helper function for menu navigation routines.
*/
static void FASTCALL
-MenuSwitchTracking(MTRACKER* Mt, PROSMENUINFO PtMenuInfo, UINT Index)
+MenuSwitchTracking(MTRACKER* Mt, PROSMENUINFO PtMenuInfo, UINT Index, UINT wFlags)
{
ROSMENUINFO TopMenuInfo;
@@ -2409,13 +2433,13 @@ MenuSwitchTracking(MTRACKER* Mt, PROSMENUINFO PtMenuInfo, UINT Index)
0 == ((PtMenuInfo->Flags | TopMenuInfo.Flags) & MF_POPUP))
{
/* both are top level menus (system and menu-bar) */
- MenuHideSubPopups(Mt->OwnerWnd, &TopMenuInfo, FALSE);
+ MenuHideSubPopups(Mt->OwnerWnd, &TopMenuInfo, FALSE, wFlags);
MenuSelectItem(Mt->OwnerWnd, &TopMenuInfo, NO_SELECTED_ITEM, FALSE, NULL);
Mt->TopMenu = PtMenuInfo->Self;
}
else
{
- MenuHideSubPopups(Mt->OwnerWnd, PtMenuInfo, FALSE);
+ MenuHideSubPopups(Mt->OwnerWnd, PtMenuInfo, FALSE, wFlags);
}
MenuSelectItem(Mt->OwnerWnd, PtMenuInfo, Index, TRUE, NULL);
@@ -2531,7 +2555,7 @@ MenuButtonDown(MTRACKER* Mt, HMENU PtMenu, UINT Flags)
{
if (MenuInfo.FocusedItem != Index)
{
- MenuSwitchTracking(Mt, &MenuInfo, Index);
+ MenuSwitchTracking(Mt, &MenuInfo, Index, Flags);
}
/* If the popup menu is not already "popped" */
@@ -2714,7 +2738,7 @@ MenuMouseMove(MTRACKER *Mt, HMENU PtMenu, UINT Flags)
if (MenuGetRosMenuItemInfo(MenuInfo.Self, Index, &ItemInfo) &&
!(ItemInfo.fType & MF_SEPARATOR))
{
- MenuSwitchTracking(Mt, &MenuInfo, Index);
+ MenuSwitchTracking(Mt, &MenuInfo, Index, Flags);
if (!(ItemInfo.fState & (MFS_DISABLED | MFS_GRAYED)))
Mt->CurrentMenu = MenuShowSubPopup(Mt->OwnerWnd, &MenuInfo, FALSE, Flags);
}
@@ -2763,7 +2787,7 @@ MenuGetSubPopup(HMENU Menu)
* NOTE: WM_NEXTMENU documented in Win32 is a bit different.
*/
static LRESULT FASTCALL
-MenuDoNextMenu(MTRACKER* Mt, UINT Vk)
+MenuDoNextMenu(MTRACKER* Mt, UINT Vk, UINT wFlags)
{
ROSMENUINFO TopMenuInfo;
ROSMENUINFO MenuInfo;
@@ -2858,7 +2882,7 @@ MenuDoNextMenu(MTRACKER* Mt, UINT Vk)
FALSE, 0 );
if (Mt->CurrentMenu != Mt->TopMenu)
{
- MenuHideSubPopups(Mt->OwnerWnd, &TopMenuInfo, FALSE);
+ MenuHideSubPopups(Mt->OwnerWnd, &TopMenuInfo, FALSE, wFlags);
}
}
@@ -2949,7 +2973,7 @@ MenuKeyEscape(MTRACKER *Mt, UINT Flags)
if (MenuGetRosMenuInfo(&MenuInfo, MenuPrev))
{
- MenuHideSubPopups(Mt->OwnerWnd, &MenuInfo, TRUE);
+ MenuHideSubPopups(Mt->OwnerWnd, &MenuInfo, TRUE, Flags);
}
Mt->CurrentMenu = MenuPrev;
EndMenu = FALSE;
@@ -3001,7 +3025,7 @@ MenuKeyLeft(MTRACKER* Mt, UINT Flags)
{
return;
}
- MenuHideSubPopups(Mt->OwnerWnd, &PrevMenuInfo, TRUE);
+ MenuHideSubPopups(Mt->OwnerWnd, &PrevMenuInfo, TRUE, Flags);
Mt->CurrentMenu = MenuPrev;
if (! MenuGetRosMenuInfo(&TopMenuInfo, Mt->TopMenu))
@@ -3012,7 +3036,7 @@ MenuKeyLeft(MTRACKER* Mt, UINT Flags)
{
/* move menu bar selection if no more popups are left */
- if (! MenuDoNextMenu(Mt, VK_LEFT))
+ if (! MenuDoNextMenu(Mt, VK_LEFT, Flags))
{
MenuMoveSelection(Mt->OwnerWnd, &TopMenuInfo, ITEM_PREV);
}
@@ -3082,7 +3106,7 @@ static void FASTCALL MenuKeyRight(MTRACKER *Mt, UINT Flags)
{
if (Mt->CurrentMenu != Mt->TopMenu)
{
- MenuHideSubPopups(Mt->OwnerWnd, &MenuInfo, FALSE );
+ MenuHideSubPopups(Mt->OwnerWnd, &MenuInfo, FALSE, Flags);
hmenutmp = Mt->CurrentMenu = Mt->TopMenu;
}
else
@@ -3091,7 +3115,7 @@ static void FASTCALL MenuKeyRight(MTRACKER *Mt, UINT Flags)
}
/* try to move to the next item */
- if ( !MenuDoNextMenu(Mt, VK_RIGHT))
+ if ( !MenuDoNextMenu(Mt, VK_RIGHT, Flags))
MenuMoveSelection(Mt->OwnerWnd, &MenuInfo, ITEM_NEXT);
if ( hmenutmp || Mt->TrackFlags & TF_SUSPENDPOPUP )
@@ -3135,6 +3159,7 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y,
if (!IsMenu(hmenu))
{
+ WARN("Invalid menu handle %p\n", hmenu);
SetLastError( ERROR_INVALID_MENU_HANDLE );
return FALSE;
}
@@ -3177,7 +3202,7 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y,
{
if (!enterIdleSent)
{
- HWND win = (wFlags & TPM_ENTERIDLEEX) && (MenuInfo.Flags & MF_POPUP) ? MenuInfo.Wnd : NULL;
+ HWND win = MenuInfo.Flags & MF_POPUP ? MenuInfo.Wnd : NULL;
enterIdleSent = TRUE;
SendMessageW( mt.OwnerWnd, WM_ENTERIDLE, MSGF_MENU, (LPARAM) win);
}
@@ -3242,6 +3267,7 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y,
if (hmenu)
{
executedMenuId = MenuButtonUp( &mt, hmenu, wFlags);
+ TRACE("executedMenuId %d\n", executedMenuId);
/* End the loop if executedMenuId is an item ID */
/* or if the job was done (executedMenuId = 0). */
@@ -3261,7 +3287,6 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y,
if (hmenu)
fEndMenu |= !MenuMouseMove( &mt, hmenu, wFlags );
- break;
} /* switch(msg.message) - mouse */
}
@@ -3401,6 +3426,7 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y,
PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE );
else mt.TrackFlags &= ~TF_SKIPREMOVE;
}
+ ERR("MenuTrackMenu 2\n");
(void)NtUserSetGUIThreadHandle(MSQ_STATE_MENUOWNER, NULL);
SetCapture(NULL); /* release the capture */
@@ -3415,7 +3441,7 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y,
{
if (MenuGetRosMenuInfo(&MenuInfo, mt.TopMenu))
{
- MenuHideSubPopups(mt.OwnerWnd, &MenuInfo, FALSE);
+ MenuHideSubPopups(mt.OwnerWnd, &MenuInfo, FALSE, wFlags);
if (MenuInfo.Flags & MF_POPUP)
{
@@ -3464,31 +3490,35 @@ static BOOL FASTCALL MenuInitTracking(HWND hWnd, HMENU hMenu, BOOL bPopup, UINT
SendMessageW( hWnd, WM_SETCURSOR, (WPARAM)hWnd, HTCAPTION );
+ MenuGetRosMenuInfo(&MenuInfo, hMenu);
+
if (!(wFlags & TPM_NONOTIFY))
{
SendMessageW( hWnd, WM_INITMENU, (WPARAM)hMenu, 0 );
+ /* If an app changed/recreated menu bar entries in WM_INITMENU
+ * menu sizes will be recalculated once the menu created/shown.
+ */
- MenuGetRosMenuInfo(&MenuInfo, hMenu);
-
- if (!MenuInfo.Height)
- {
- /* app changed/recreated menu bar entries in WM_INITMENU
- Recalculate menu sizes else clicks will not work */
- SetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
+ if (!MenuInfo.Height)
+ {
+ /* app changed/recreated menu bar entries in WM_INITMENU
+ Recalculate menu sizes else clicks will not work */
+ SetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
- }
- /* This makes the menus of applications built with Delphi work.
- * It also enables menus to be displayed in more than one window,
- * but there are some bugs left that need to be fixed in this case.
- */
- if(MenuInfo.Self == hMenu)
- {
- MenuInfo.Wnd = hWnd;
- MenuSetRosMenuInfo(&MenuInfo);
- }
+ }
}
+ /* This makes the menus of applications built with Delphi work.
+ * It also enables menus to be displayed in more than one window,
+ * but there are some bugs left that need to be fixed in this case.
+ */
+ if(MenuInfo.Self == hMenu)
+ {
+ MenuInfo.Wnd = hWnd;
+ MenuSetRosMenuInfo(&MenuInfo);
+ }
+
return TRUE;
}
/***********************************************************************
@@ -3501,6 +3531,7 @@ static BOOL FASTCALL MenuExitTracking(HWND hWnd)
SendMessageW( hWnd, WM_EXITMENULOOP, 0, 0 );
ShowCaret(0);
top_popup = 0;
+ top_popup_hmenu = NULL;
return TRUE;
}
@@ -3512,7 +3543,7 @@ static BOOL FASTCALL MenuExitTracking(HWND hWnd)
VOID MenuTrackMouseMenuBar( HWND hWnd, ULONG ht, POINT pt)
{
HMENU hMenu = (ht == HTSYSMENU) ? NtUserGetSystemMenu( hWnd, FALSE) : GetMenu(hWnd);
- UINT wFlags = TPM_ENTERIDLEEX | TPM_BUTTONDOWN | TPM_LEFTALIGN | TPM_LEFTBUTTON;
+ UINT wFlags = TPM_BUTTONDOWN | TPM_LEFTALIGN | TPM_LEFTBUTTON;
TRACE("wnd=%p ht=0x%04x (%ld,%ld)\n", hWnd, ht, pt.x, pt.y);
@@ -3542,7 +3573,7 @@ VOID MenuTrackKbdMenuBar(HWND hwnd, UINT wParam, WCHAR wChar)
UINT uItem = NO_SELECTED_ITEM;
HMENU hTrackMenu;
ROSMENUINFO MenuInfo;
- UINT wFlags = TPM_ENTERIDLEEX | TPM_LEFTALIGN | TPM_LEFTBUTTON;
+ UINT wFlags = TPM_LEFTALIGN | TPM_LEFTBUTTON;
TRACE("hwnd %p wParam 0x%04x wChar 0x%04x\n", hwnd, wParam, wChar);
@@ -3611,17 +3642,6 @@ track_menu:
*/
BOOL WINAPI TrackPopupMenuEx( HMENU Menu, UINT Flags, int x, int y,
HWND Wnd, LPTPMPARAMS Tpm)
-{
- /* Not fully implemented */
- return TrackPopupMenu(Menu, Flags, x, y, 0, Wnd,
- NULL != Tpm ? &Tpm->rcExclude : NULL);
-}
-
-/**********************************************************************
- * TrackPopupMenu (USER32.@)
- */
-BOOL WINAPI TrackPopupMenu( HMENU Menu, UINT Flags, int x, int y,
- int Reserved, HWND Wnd, CONST RECT *Rect)
{
BOOL ret = FALSE;
@@ -3638,11 +3658,21 @@ BOOL WINAPI TrackPopupMenu( HMENU Menu, UINT Flags, int x, int y,
SendMessageW(Wnd, WM_INITMENUPOPUP, (WPARAM) Menu, 0);
if (MenuShowPopup(Wnd, Menu, 0, Flags, x, y, 0, 0 ))
- ret = MenuTrackMenu(Menu, Flags | TPM_POPUPMENU, 0, 0, Wnd, Rect);
+ ret = MenuTrackMenu(Menu, Flags | TPM_POPUPMENU, 0, 0, Wnd,
+ Tpm ? &Tpm->rcExclude : NULL);
MenuExitTracking(Wnd);
return ret;
}
+/**********************************************************************
+ * TrackPopupMenu (USER32.@)
+ */
+BOOL WINAPI TrackPopupMenu( HMENU Menu, UINT Flags, int x, int y,
+ int Reserved, HWND Wnd, CONST RECT *Rect)
+{
+ return TrackPopupMenuEx( Menu, Flags, x, y, Wnd, NULL);
+}
+
/*
* From MSDN:
* The MFT_BITMAP, MFT_SEPARATOR, and MFT_STRING values cannot be combined
@@ -4035,7 +4065,6 @@ DrawMenuBar(HWND hWnd)
return TRUE;
}
-
/*
* @implemented
*/
@@ -4057,11 +4086,48 @@ EndMenu(VOID)
guii.cbSize = sizeof(GUITHREADINFO);
if(GetGUIThreadInfo(GetCurrentThreadId(), &guii) && guii.hwndMenuOwner)
{
- PostMessageW(guii.hwndMenuOwner, WM_CANCELMODE, 0, 0);
+ if (!fEndMenu &&
+ top_popup &&
+ guii.hwndMenuOwner != top_popup )
+ {
+ ERR("Capture GUI pti hWnd does not match top_popup!\n");
+ }
+ }
+
+ /* if we are in the menu code, and it is active */
+ if (!fEndMenu && top_popup)
+ {
+ /* terminate the menu handling code */
+ fEndMenu = TRUE;
+
+ /* needs to be posted to wakeup the internal menu handler */
+ /* which will now terminate the menu, in the event that */
+ /* the main window was minimized, or lost focus, so we */
+ /* don't end up with an orphaned menu */
+ PostMessageW( top_popup, WM_CANCELMODE, 0, 0);
}
return TRUE;
}
+// So this one maybe one day it will be a callback!
+BOOL WINAPI HiliteMenuItem( HWND hWnd, HMENU hMenu, UINT wItemID,
+ UINT wHilite )
+{
+ ROSMENUINFO MenuInfo;
+ ROSMENUITEMINFO mii;
+ TRACE("(%p, %p, %04x, %04x);\n", hWnd, hMenu, wItemID, wHilite);
+ if (!hWnd)
+ {
+ SetLastError(ERROR_INVALID_WINDOW_HANDLE);
+ return FALSE;
+ }
+ if (!NtUserMenuItemInfo(hMenu, wItemID, wHilite, &mii, FALSE)) return FALSE;
+ if (!NtUserMenuInfo(hMenu, &MenuInfo, FALSE)) return FALSE;
+ if (MenuInfo.FocusedItem == wItemID) return TRUE;
+ MenuHideSubPopups( hWnd, &MenuInfo, FALSE, 0 );
+ MenuSelectItem( hWnd, &MenuInfo, wItemID, TRUE, 0 );
+ return TRUE;
+}
/*
* @implemented
diff --git a/dll/win32/user32/windows/message.c b/dll/win32/user32/windows/message.c
index 81d0d96be09..5631469c03c 100644
--- a/dll/win32/user32/windows/message.c
+++ b/dll/win32/user32/windows/message.c
@@ -2448,7 +2448,7 @@ TranslateMessageEx(CONST MSG *lpMsg, DWORD unk)
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
- return(NtUserTranslateMessage((LPMSG)lpMsg, (HKL)unk));
+ return(NtUserTranslateMessage((LPMSG)lpMsg, unk));
default:
if ( lpMsg->message & ~WM_MAXIMUM )
diff --git a/dll/win32/usp10/usp10.c b/dll/win32/usp10/usp10.c
index 1a68ae0201a..cdd6d7b2919 100644
--- a/dll/win32/usp10/usp10.c
+++ b/dll/win32/usp10/usp10.c
@@ -1308,7 +1308,7 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars,
{
WORD glyph;
if (!hdc) return E_PENDING;
- if (GetGlyphIndicesW(hdc, &pwcChars[i], 1, &glyph, GGI_MARK_NONEXISTING_GLYPHS) == GDI_ERROR) return S_FALSE;
+ if (GetGlyphIndicesW(hdc, &pwcChars[i], 1, &glyph, 0) == GDI_ERROR) return S_FALSE;
pwOutGlyphs[i] = set_cache_glyph(psc, pwcChars[i], glyph);
}
}
diff --git a/dll/win32/version/info.c b/dll/win32/version/info.c
index 5bdcbd7a9d6..e7f7077e72b 100644
--- a/dll/win32/version/info.c
+++ b/dll/win32/version/info.c
@@ -29,15 +29,17 @@
#include "windef.h"
#include "winbase.h"
#include "winver.h"
-#include "winternl.h"
#include "winuser.h"
-#include "wine/winuser16.h"
+#include "winternl.h"
+#include "lzexpand.h"
#include "wine/unicode.h"
#include "winerror.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(ver);
+extern DWORD find_version_resource( HFILE lzfd, DWORD *reslen, DWORD *offset );
+
/******************************************************************************
*
* This function will print via standard TRACE, debug info regarding
@@ -230,225 +232,16 @@ typedef struct
#define VersionInfo32_Next( ver ) \
(VS_VERSION_INFO_STRUCT32 *)( (LPBYTE)ver + (((ver)->wLength + 3) & ~3) )
-/***********************************************************************
- * VERSION_GetFileVersionInfo_PE [internal]
- *
- * NOTE: returns size of the PE VERSION resource or 0xFFFFFFFF
- * in the case the file is a PE module, but VERSION_INFO not found.
- */
-static DWORD VERSION_GetFileVersionInfo_PE( LPCWSTR filename, DWORD datasize, LPVOID data )
-{
- const VS_FIXEDFILEINFO *vffi;
- DWORD len;
- BYTE *buf;
- HMODULE hModule;
- HRSRC hRsrc;
- HGLOBAL hMem;
-
- TRACE("%s\n", debugstr_w(filename));
-
- if (!GetModuleHandleExW(0, filename, &hModule))
- hModule = LoadLibraryExW(filename, 0, LOAD_LIBRARY_AS_DATAFILE);
-
- if(!hModule)
- {
- WARN("Could not load %s\n", debugstr_w(filename));
-
- return 0;
- }
- hRsrc = FindResourceW(hModule,
- MAKEINTRESOURCEW(VS_VERSION_INFO),
- MAKEINTRESOURCEW(VS_FILE_INFO));
- if(!hRsrc)
- {
- WARN("Could not find VS_VERSION_INFO in %s\n", debugstr_w(filename));
- FreeLibrary(hModule);
- return 0xFFFFFFFF;
- }
- len = SizeofResource(hModule, hRsrc);
- hMem = LoadResource(hModule, hRsrc);
- if(!hMem)
- {
- WARN("Could not load VS_VERSION_INFO from %s\n", debugstr_w(filename));
- FreeLibrary(hModule);
- return 0xFFFFFFFF;
- }
- buf = LockResource(hMem);
-
- vffi = (VS_FIXEDFILEINFO *)VersionInfo32_Value( (VS_VERSION_INFO_STRUCT32 *)buf );
-
- if ( vffi->dwSignature != VS_FFI_SIGNATURE )
- {
- WARN("vffi->dwSignature is 0x%08x, but not 0x%08lx!\n",
- vffi->dwSignature, VS_FFI_SIGNATURE );
- len = 0xFFFFFFFF;
- goto END;
- }
-
- if ( TRACE_ON(ver) )
- print_vffi_debug( vffi );
-
- if(data)
- {
- if(datasize < len)
- len = datasize; /* truncate data */
- if(len)
- memcpy(data, buf, len);
- else
- len = 0xFFFFFFFF;
- }
-END:
- FreeResource(hMem);
- FreeLibrary(hModule);
-
- return len;
-}
-
-#ifndef __REACTOS__
-/***********************************************************************
- * VERSION_GetFileVersionInfo_16 [internal]
- *
- * NOTE: returns size of the 16-bit VERSION resource or 0xFFFFFFFF
- * in the case the file exists, but VERSION_INFO not found.
- */
-static DWORD VERSION_GetFileVersionInfo_16( LPCSTR filename, DWORD datasize, LPVOID data )
-{
- const VS_FIXEDFILEINFO *vffi;
- DWORD len, offset;
- BYTE *buf;
- HMODULE16 hModule;
- HRSRC16 hRsrc;
- HGLOBAL16 hMem;
- char dllname[20], owner[20], *p;
- const char *basename;
- BOOL is_builtin = FALSE;
-
- TRACE("%s\n", debugstr_a(filename));
-
- /* strip path information */
-
- basename = filename;
- if (basename[0] && basename[1] == ':') basename += 2; /* strip drive specification */
- if ((p = strrchr( basename, '\\' ))) basename = p + 1;
- if ((p = strrchr( basename, '/' ))) basename = p + 1;
-
- if (strlen(basename) < sizeof(dllname)-4)
- {
- int file_exists;
-
- strcpy( dllname, basename );
- p = strrchr( dllname, '.' );
- if (!p) strcat( dllname, ".dll" );
- for (p = dllname; *p; p++) if (*p >= 'A' && *p <= 'Z') *p += 32;
-
- if (wine_dll_get_owner( dllname, owner, sizeof(owner), &file_exists ) == 0)
- is_builtin = TRUE;
- }
-
- /* first try without loading a 16-bit module */
- if (is_builtin)
- len = 0;
- else
- len = GetFileResourceSize16( filename,
- MAKEINTRESOURCEA(VS_FILE_INFO),
- MAKEINTRESOURCEA(VS_VERSION_INFO),
- &offset );
- if (len)
- {
- if (!data) return len;
-
- len = GetFileResource16( filename,
- MAKEINTRESOURCEA(VS_FILE_INFO),
- MAKEINTRESOURCEA(VS_VERSION_INFO),
- offset, datasize, data );
- if (len)
- {
- vffi = (VS_FIXEDFILEINFO *)VersionInfo16_Value( (VS_VERSION_INFO_STRUCT16 *)data );
-
- if ( vffi->dwSignature == VS_FFI_SIGNATURE )
- {
- if ( ((VS_VERSION_INFO_STRUCT16 *)data)->wLength < len )
- len = ((VS_VERSION_INFO_STRUCT16 *)data)->wLength;
-
- if ( TRACE_ON(ver) )
- print_vffi_debug( vffi );
-
- return len;
- }
- }
- }
-
- /* this might be a builtin 16-bit module */
- hModule = LoadLibrary16(filename);
- if(hModule < 32)
- {
- WARN("Could not load %s\n", debugstr_a(filename));
- if (hModule == ERROR_BAD_FORMAT)
- return 0xFFFFFFFF;
- else
- return 0x0;
- }
- hRsrc = FindResource16(hModule,
- MAKEINTRESOURCEA(VS_VERSION_INFO),
- MAKEINTRESOURCEA(VS_FILE_INFO));
- if(!hRsrc)
- {
- WARN("Could not find VS_VERSION_INFO in %s\n", debugstr_a(filename));
- FreeLibrary16(hModule);
- return 0xFFFFFFFF;
- }
- len = SizeofResource16(hModule, hRsrc);
- hMem = LoadResource16(hModule, hRsrc);
- if(!hMem)
- {
- WARN("Could not load VS_VERSION_INFO from %s\n", debugstr_a(filename));
- FreeLibrary16(hModule);
- return 0xFFFFFFFF;
- }
- buf = LockResource16(hMem);
-
- if(!VersionInfoIs16(buf))
- {
- len = 0xFFFFFFFF;
- goto END;
- }
-
- vffi = (VS_FIXEDFILEINFO *)VersionInfo16_Value( (VS_VERSION_INFO_STRUCT16 *)buf );
-
- if ( vffi->dwSignature != VS_FFI_SIGNATURE )
- {
- WARN("vffi->dwSignature is 0x%08x, but not 0x%08lx!\n",
- vffi->dwSignature, VS_FFI_SIGNATURE );
- len = 0xFFFFFFFF;
- goto END;
- }
-
- if ( TRACE_ON(ver) )
- print_vffi_debug( vffi );
-
- if(data)
- {
- if(datasize < len)
- len = datasize; /* truncate data */
- if(len)
- memcpy(data, buf, len);
- else
- len = 0xFFFFFFFF;
- }
-END:
- FreeResource16(hMem);
- FreeLibrary16(hModule);
-
- return len;
-}
-#endif /* ! __REACTOS__ */
/***********************************************************************
* GetFileVersionInfoSizeW [VERSION.@]
*/
DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
{
- DWORD len;
+ DWORD len, offset, magic = 1;
+ HFILE lzfd;
+ HMODULE hModule;
+ OFSTRUCT ofs;
TRACE("(%s,%p)\n", debugstr_w(filename), handle );
@@ -465,40 +258,27 @@ DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
return 0;
}
- len = VERSION_GetFileVersionInfo_PE(filename, 0, NULL);
- /* 0xFFFFFFFF means: file is a PE module, but VERSION_INFO not found */
- if(len == 0xFFFFFFFF)
+ if ((lzfd = LZOpenFileW( (LPWSTR)filename, &ofs, OF_READ )) != HFILE_ERROR)
{
- SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
- return 0;
+ magic = find_version_resource( lzfd, &len, &offset );
+ LZClose( lzfd );
}
- if (!len)
+ if ((magic == 1) && (hModule = LoadLibraryExW( filename, 0, LOAD_LIBRARY_AS_DATAFILE )))
{
-#ifdef __REACTOS__
- SetLastError(ERROR_FILE_NOT_FOUND);
- return 0;
-#else /* __REACTOS__ */
- LPSTR filenameA;
-
- len = WideCharToMultiByte( CP_ACP, 0, filename, -1, NULL, 0, NULL, NULL );
- filenameA = HeapAlloc( GetProcessHeap(), 0, len );
- WideCharToMultiByte( CP_ACP, 0, filename, -1, filenameA, len, NULL, NULL );
-
- len = VERSION_GetFileVersionInfo_16(filenameA, 0, NULL);
- HeapFree( GetProcessHeap(), 0, filenameA );
- /* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */
- if (!len)
+ HRSRC hRsrc = FindResourceW( hModule, MAKEINTRESOURCEW(VS_VERSION_INFO),
+ MAKEINTRESOURCEW(VS_FILE_INFO) );
+ if (hRsrc)
{
- SetLastError(ERROR_FILE_NOT_FOUND);
- return 0;
- }
- if (len == 0xFFFFFFFF)
- {
- SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
- return 0;
+ magic = IMAGE_NT_SIGNATURE;
+ len = SizeofResource( hModule, hRsrc );
}
+ FreeLibrary( hModule );
+ }
+ switch (magic)
+ {
+ case IMAGE_OS2_SIGNATURE:
/* We have a 16bit resource.
*
* XP/W2K/W2K3 uses a buffer which is more than the actual needed space:
@@ -509,21 +289,22 @@ DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
* info->wLength should be the same as len. Currently it isn't but that
* doesn't seem to be a problem (len is bigger than info->wLength).
*/
- len = (len - sizeof(VS_FIXEDFILEINFO)) * 4;
-#endif /* ! __REACTOS__ */
- }
- else
- {
+ SetLastError(0);
+ return (len - sizeof(VS_FIXEDFILEINFO)) * 4;
+
+ case IMAGE_NT_SIGNATURE:
/* We have a 32bit resource.
*
* XP/W2K/W2K3 uses a buffer which is 2 times the actual needed space + 4 bytes "FE2X"
* This extra buffer is used for Unicode to ANSI conversions in A-Calls
*/
- len = (len * 2) + 4;
- }
+ SetLastError(0);
+ return (len * 2) + 4;
- SetLastError(0);
- return len;
+ default:
+ SetLastError( lzfd == HFILE_ERROR ? ofs.nErrCode : ERROR_RESOURCE_DATA_NOT_FOUND );
+ return 0;
+ }
}
/***********************************************************************
@@ -554,7 +335,11 @@ DWORD WINAPI GetFileVersionInfoSizeA( LPCSTR filename, LPDWORD handle )
BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle,
DWORD datasize, LPVOID data )
{
- DWORD len;
+ static const char signature[4] = "FE2X";
+ DWORD len, offset, magic = 1;
+ HFILE lzfd;
+ OFSTRUCT ofs;
+ HMODULE hModule;
VS_VERSION_INFO_STRUCT32* vvis = data;
TRACE("(%s,%d,size=%d,data=%p)\n",
@@ -565,59 +350,58 @@ BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle,
SetLastError(ERROR_INVALID_DATA);
return FALSE;
}
- len = VERSION_GetFileVersionInfo_PE(filename, datasize, data);
- /* 0xFFFFFFFF means: file is a PE module, but VERSION_INFO not found */
- if (len == 0xFFFFFFFF)
+
+ if ((lzfd = LZOpenFileW( (LPWSTR)filename, &ofs, OF_READ )) != HFILE_ERROR)
{
- SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
- return FALSE;
- }
-
- if (!len)
- {
-#ifdef __REACTOS__
- SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
- return FALSE;
-#else /* __REACTOS__ */
- LPSTR filenameA;
-
- len = WideCharToMultiByte( CP_ACP, 0, filename, -1, NULL, 0, NULL, NULL );
- filenameA = HeapAlloc( GetProcessHeap(), 0, len );
- WideCharToMultiByte( CP_ACP, 0, filename, -1, filenameA, len, NULL, NULL );
-
- len = VERSION_GetFileVersionInfo_16(filenameA, datasize, data);
- HeapFree( GetProcessHeap(), 0, filenameA );
- /* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */
- if (!len || len == 0xFFFFFFFF)
+ if ((magic = find_version_resource( lzfd, &len, &offset )) > 1)
{
- SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
- return FALSE;
+ LZSeek( lzfd, offset, 0 /* SEEK_SET */ );
+ len = LZRead( lzfd, data, min( len, datasize ) );
}
- /* We have a 16bit resource. */
-#endif /* ! __REACTOS__ */
+ LZClose( lzfd );
}
- else
+
+ if ((magic == 1) && (hModule = LoadLibraryExW( filename, 0, LOAD_LIBRARY_AS_DATAFILE )))
{
- static const char signature[] = "FE2X";
- DWORD bufsize = vvis->wLength + strlen(signature);
- DWORD convbuf;
-
+ HRSRC hRsrc = FindResourceW( hModule, MAKEINTRESOURCEW(VS_VERSION_INFO),
+ MAKEINTRESOURCEW(VS_FILE_INFO) );
+ if (hRsrc)
+ {
+ HGLOBAL hMem = LoadResource( hModule, hRsrc );
+ magic = IMAGE_NT_SIGNATURE;
+ len = min( SizeofResource(hModule, hRsrc), datasize );
+ memcpy( data, LockResource( hMem ), len );
+ FreeResource( hMem );
+ }
+ FreeLibrary( hModule );
+ }
+
+ switch (magic)
+ {
+ case IMAGE_OS2_SIGNATURE:
+ /* We have a 16bit resource. */
+ if (TRACE_ON(ver))
+ print_vffi_debug( (VS_FIXEDFILEINFO *)VersionInfo16_Value( (VS_VERSION_INFO_STRUCT16 *)data ));
+ SetLastError(0);
+ return TRUE;
+
+ case IMAGE_NT_SIGNATURE:
/* We have a 32bit resource.
*
* XP/W2K/W2K3 uses a buffer which is 2 times the actual needed space + 4 bytes "FE2X"
* This extra buffer is used for Unicode to ANSI conversions in A-Calls
*/
+ len = vvis->wLength + sizeof(signature);
+ if (datasize >= len) memcpy( (char*)data + vvis->wLength, signature, sizeof(signature) );
+ if (TRACE_ON(ver))
+ print_vffi_debug( (VS_FIXEDFILEINFO *)VersionInfo32_Value( vvis ));
+ SetLastError(0);
+ return TRUE;
- /* information is truncated to datasize bytes */
- if (datasize >= bufsize)
- {
- convbuf = datasize - vvis->wLength;
- memcpy( ((char*)(data))+vvis->wLength, signature, convbuf > 4 ? 4 : convbuf );
- }
+ default:
+ SetLastError( lzfd == HFILE_ERROR ? ofs.nErrCode : ERROR_RESOURCE_DATA_NOT_FOUND );
+ return FALSE;
}
-
- SetLastError(0);
- return TRUE;
}
/***********************************************************************
diff --git a/dll/win32/version/resource.c b/dll/win32/version/resource.c
index a1123c55bf7..e7d34e08a88 100644
--- a/dll/win32/version/resource.c
+++ b/dll/win32/version/resource.c
@@ -36,15 +36,16 @@
#include "windef.h"
#include "winbase.h"
#include "lzexpand.h"
+#include "winuser.h"
+#include "winver.h"
+#undef VS_FILE_INFO
+#define VS_FILE_INFO 16
#include "wine/unicode.h"
#include "wine/winbase16.h"
#include "wine/debug.h"
-/* winnt.h */
-#define IMAGE_FILE_RESOURCE_DIRECTORY 2
-
WINE_DEFAULT_DEBUG_CHANNEL(ver);
@@ -91,56 +92,6 @@ static const IMAGE_RESOURCE_DIRECTORY *find_entry_default( const IMAGE_RESOURCE_
}
-/**********************************************************************
- * find_entry_by_name
- *
- * Find an entry by name in a resource directory
- * Copied from loader/pe_resource.c
- */
-static const IMAGE_RESOURCE_DIRECTORY *find_entry_by_name( const IMAGE_RESOURCE_DIRECTORY *dir,
- LPCSTR name, const void *root )
-{
- const IMAGE_RESOURCE_DIRECTORY *ret = NULL;
- LPWSTR nameW;
- DWORD namelen;
-
- if (!HIWORD(name)) return find_entry_by_id( dir, LOWORD(name), root );
- if (name[0] == '#')
- {
- return find_entry_by_id( dir, atoi(name+1), root );
- }
-
- namelen = MultiByteToWideChar( CP_ACP, 0, name, -1, NULL, 0 );
- if ((nameW = HeapAlloc( GetProcessHeap(), 0, namelen * sizeof(WCHAR) )))
- {
- const IMAGE_RESOURCE_DIRECTORY_ENTRY *entry;
- const IMAGE_RESOURCE_DIR_STRING_U *str;
- int min, max, res, pos;
-
- MultiByteToWideChar( CP_ACP, 0, name, -1, nameW, namelen );
- namelen--; /* remove terminating null */
- entry = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(dir + 1);
- min = 0;
- max = dir->NumberOfNamedEntries - 1;
- while (min <= max)
- {
- pos = (min + max) / 2;
- str = (const IMAGE_RESOURCE_DIR_STRING_U *)((const char *)root + entry[pos].u1.s1.NameOffset);
- res = strncmpiW( nameW, str->NameString, str->Length );
- if (!res && namelen == str->Length)
- {
- ret = (const IMAGE_RESOURCE_DIRECTORY *)((const char *)root + entry[pos].u2.s3.OffsetToDirectory);
- break;
- }
- if (res < 0) max = pos - 1;
- else min = pos + 1;
- }
- HeapFree( GetProcessHeap(), 0, nameW );
- }
- return ret;
-}
-
-
/***********************************************************************
* read_xx_header [internal]
*/
@@ -153,7 +104,11 @@ static int read_xx_header( HFILE lzfd )
if ( sizeof(mzh) != LZRead( lzfd, (LPSTR)&mzh, sizeof(mzh) ) )
return 0;
if ( mzh.e_magic != IMAGE_DOS_SIGNATURE )
+ {
+ if (!memcmp( &mzh, "\177ELF", 4 )) return 1; /* ELF */
+ if (*(UINT *)&mzh == 0xfeedface || *(UINT *)&mzh == 0xcefaedfe) return 1; /* Mach-O */
return 0;
+ }
LZSeek( lzfd, mzh.e_lfanew, SEEK_SET );
if ( 2 != LZRead( lzfd, magic, 2 ) )
@@ -171,13 +126,13 @@ static int read_xx_header( HFILE lzfd )
return 0;
}
-#ifndef __REACTOS__
/***********************************************************************
* find_ne_resource [internal]
*/
-static BOOL find_ne_resource( HFILE lzfd, LPCSTR typeid, LPCSTR resid,
- DWORD *resLen, DWORD *resOff )
+static BOOL find_ne_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff )
{
+ const WORD typeid = VS_FILE_INFO | 0x8000;
+ const WORD resid = VS_VERSION_INFO | 0x8000;
IMAGE_OS2_HEADER nehd;
NE_TYPEINFO *typeInfo;
NE_NAMEINFO *nameInfo;
@@ -210,55 +165,23 @@ static BOOL find_ne_resource( HFILE lzfd, LPCSTR typeid, LPCSTR resid,
/* Find resource */
typeInfo = (NE_TYPEINFO *)(resTab + 2);
-
- if (HIWORD(typeid) != 0) /* named type */
+ while (typeInfo->type_id)
{
- BYTE len = strlen( typeid );
- while (typeInfo->type_id)
- {
- if (!(typeInfo->type_id & 0x8000))
- {
- BYTE *p = resTab + typeInfo->type_id;
- if ((*p == len) && !strncasecmp( (char*)p+1, typeid, len )) goto found_type;
- }
- typeInfo = (NE_TYPEINFO *)((char *)(typeInfo + 1) +
- typeInfo->count * sizeof(NE_NAMEINFO));
- }
+ if (typeInfo->type_id == typeid) goto found_type;
+ typeInfo = (NE_TYPEINFO *)((char *)(typeInfo + 1) +
+ typeInfo->count * sizeof(NE_NAMEINFO));
}
- else /* numeric type id */
- {
- WORD id = LOWORD(typeid) | 0x8000;
- while (typeInfo->type_id)
- {
- if (typeInfo->type_id == id) goto found_type;
- typeInfo = (NE_TYPEINFO *)((char *)(typeInfo + 1) +
- typeInfo->count * sizeof(NE_NAMEINFO));
- }
- }
- TRACE("No typeid entry found for %p\n", typeid );
+ TRACE("No typeid entry found\n" );
HeapFree( GetProcessHeap(), 0, resTab );
return FALSE;
found_type:
nameInfo = (NE_NAMEINFO *)(typeInfo + 1);
- if (HIWORD(resid) != 0) /* named resource */
- {
- BYTE len = strlen( resid );
- for (count = typeInfo->count; count > 0; count--, nameInfo++)
- {
- BYTE *p = resTab + nameInfo->id;
- if (nameInfo->id & 0x8000) continue;
- if ((*p == len) && !strncasecmp( (char*)p+1, resid, len )) goto found_name;
- }
- }
- else /* numeric resource id */
- {
- WORD id = LOWORD(resid) | 0x8000;
- for (count = typeInfo->count; count > 0; count--, nameInfo++)
- if (nameInfo->id == id) goto found_name;
- }
- TRACE("No resid entry found for %p\n", typeid );
+ for (count = typeInfo->count; count > 0; count--, nameInfo++)
+ if (nameInfo->id == resid) goto found_name;
+
+ TRACE("No resid entry found\n" );
HeapFree( GetProcessHeap(), 0, resTab );
return FALSE;
@@ -270,13 +193,11 @@ static BOOL find_ne_resource( HFILE lzfd, LPCSTR typeid, LPCSTR resid,
HeapFree( GetProcessHeap(), 0, resTab );
return TRUE;
}
-#endif /* ! __REACTOS__ */
/***********************************************************************
* find_pe_resource [internal]
*/
-static BOOL find_pe_resource( HFILE lzfd, LPCSTR typeid, LPCSTR resid,
- DWORD *resLen, DWORD *resOff )
+static BOOL find_pe_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff )
{
IMAGE_NT_HEADERS pehd;
DWORD pehdoffset;
@@ -349,22 +270,22 @@ static BOOL find_pe_resource( HFILE lzfd, LPCSTR typeid, LPCSTR resid,
resDir = resSection + (resDataDir->VirtualAddress - sections[i].VirtualAddress);
resPtr = resDir;
- resPtr = find_entry_by_name( resPtr, typeid, resDir );
+ resPtr = find_entry_by_id( resPtr, VS_FILE_INFO, resDir );
if ( !resPtr )
{
- TRACE("No typeid entry found for %p\n", typeid );
+ TRACE("No typeid entry found\n" );
goto done;
}
- resPtr = find_entry_by_name( resPtr, resid, resDir );
+ resPtr = find_entry_by_id( resPtr, VS_VERSION_INFO, resDir );
if ( !resPtr )
{
- TRACE("No resid entry found for %p\n", resid );
+ TRACE("No resid entry found\n" );
goto done;
}
resPtr = find_entry_default( resPtr, resDir );
if ( !resPtr )
{
- TRACE("No default language entry found for %p\n", resid );
+ TRACE("No default language entry found\n" );
goto done;
}
@@ -395,95 +316,21 @@ static BOOL find_pe_resource( HFILE lzfd, LPCSTR typeid, LPCSTR resid,
}
-/*************************************************************************
- * GetFileResourceSize [VER.2]
+/***********************************************************************
+ * find_version_resource [internal]
*/
-DWORD WINAPI GetFileResourceSize16( LPCSTR lpszFileName, LPCSTR lpszResType,
- LPCSTR lpszResId, LPDWORD lpdwFileOffset )
+DWORD find_version_resource( HFILE lzfd, DWORD *reslen, DWORD *offset )
{
- BOOL retv = FALSE;
- HFILE lzfd;
- OFSTRUCT ofs;
- DWORD reslen;
+ DWORD magic = read_xx_header( lzfd );
- TRACE("(%s,type=%p,id=%p,off=%p)\n",
- debugstr_a(lpszFileName), lpszResType, lpszResId, lpszResId );
-
- lzfd = LZOpenFileA( (LPSTR)lpszFileName, &ofs, OF_READ );
- if ( lzfd < 0 ) return 0;
-
- switch ( read_xx_header( lzfd ) )
+ switch (magic)
{
case IMAGE_OS2_SIGNATURE:
-#ifdef __REACTOS__
- ERR("OS2 Images not supported under ReactOS at this time.");
- retv = 0;
-#else
- retv = find_ne_resource( lzfd, lpszResType, lpszResId,
- &reslen, lpdwFileOffset );
-#endif
+ if (!find_ne_resource( lzfd, reslen, offset )) magic = 0;
break;
-
case IMAGE_NT_SIGNATURE:
- retv = find_pe_resource( lzfd, lpszResType, lpszResId,
- &reslen, lpdwFileOffset );
+ if (!find_pe_resource( lzfd, reslen, offset )) magic = 0;
break;
}
-
- LZClose( lzfd );
- return retv? reslen : 0;
-}
-
-
-/*************************************************************************
- * GetFileResource [VER.3]
- */
-DWORD WINAPI GetFileResource16( LPCSTR lpszFileName, LPCSTR lpszResType,
- LPCSTR lpszResId, DWORD dwFileOffset,
- DWORD dwResLen, LPVOID lpvData )
-{
- BOOL retv = FALSE;
- HFILE lzfd;
- OFSTRUCT ofs;
- DWORD reslen = dwResLen;
-
- TRACE("(%s,type=%p,id=%p,off=%d,len=%d,data=%p)\n",
- debugstr_a(lpszFileName), lpszResType, lpszResId,
- dwFileOffset, dwResLen, lpvData );
-
- lzfd = LZOpenFileA( (LPSTR)lpszFileName, &ofs, OF_READ );
- if ( lzfd < 0 ) return 0;
-
- if ( !dwFileOffset )
- {
- switch ( read_xx_header( lzfd ) )
- {
- case IMAGE_OS2_SIGNATURE:
-#ifdef __REACTOS__
- ERR("OS2 Images not supported under ReactOS at this time.");
- retv = 0;
-#else
- retv = find_ne_resource( lzfd, lpszResType, lpszResId,
- &reslen, &dwFileOffset );
-#endif
- break;
-
- case IMAGE_NT_SIGNATURE:
- retv = find_pe_resource( lzfd, lpszResType, lpszResId,
- &reslen, &dwFileOffset );
- break;
- }
-
- if ( !retv )
- {
- LZClose( lzfd );
- return 0;
- }
- }
-
- LZSeek( lzfd, dwFileOffset, SEEK_SET );
- reslen = LZRead( lzfd, lpvData, min( reslen, dwResLen ) );
- LZClose( lzfd );
-
- return reslen;
+ return magic;
}
diff --git a/dll/win32/version/version_ros.diff b/dll/win32/version/version_ros.diff
deleted file mode 100644
index 20e89e533dd..00000000000
--- a/dll/win32/version/version_ros.diff
+++ /dev/null
@@ -1,124 +0,0 @@
-Index: info.c
-===================================================================
---- info.c (revision 23123)
-+++ info.c (working copy)
-@@ -30,6 +30,7 @@
- #include "winbase.h"
- #include "winver.h"
- #include "winternl.h"
-+#include "winuser.h"
- #include "wine/winuser16.h"
- #include "wine/unicode.h"
- #include "winerror.h"
-@@ -303,6 +304,7 @@
- return len;
- }
-
-+#ifndef __REACTOS__
- /***********************************************************************
- * VERSION_GetFileVersionInfo_16 [internal]
- *
-@@ -439,6 +442,7 @@
-
- return len;
- }
-+#endif /* ! __REACTOS__ */
-
- /***********************************************************************
- * GetFileVersionInfoSizeW [VERSION.@]
-@@ -472,6 +475,10 @@
-
- if (!len)
- {
-+#ifdef __REACTOS__
-+ SetLastError(ERROR_FILE_NOT_FOUND);
-+ return 0;
-+#else /* __REACTOS__ */
- LPSTR filenameA;
-
- len = WideCharToMultiByte( CP_ACP, 0, filename, -1, NULL, 0, NULL, NULL );
-@@ -503,6 +510,7 @@
- * doesn't seem to be a problem (len is bigger than info->wLength).
- */
- len = (len - sizeof(VS_FIXEDFILEINFO)) * 4;
-+#endif /* ! __REACTOS__ */
- }
- else
- {
-@@ -567,6 +575,10 @@
-
- if (!len)
- {
-+#ifdef __REACTOS__
-+ SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
-+ return FALSE;
-+#else /* __REACTOS__ */
- LPSTR filenameA;
-
- len = WideCharToMultiByte( CP_ACP, 0, filename, -1, NULL, 0, NULL, NULL );
-@@ -582,6 +594,7 @@
- return FALSE;
- }
- /* We have a 16bit resource. */
-+#endif /* ! __REACTOS__ */
- }
- else
- {
-Index: resource.c
-===================================================================
---- resource.c (revision 23123)
-+++ resource.c (working copy)
-@@ -42,6 +42,9 @@
-
- #include "wine/debug.h"
-
-+/* winnt.h */
-+#define IMAGE_FILE_RESOURCE_DIRECTORY 2
-+
- WINE_DEFAULT_DEBUG_CHANNEL(ver);
-
-
-@@ -168,6 +171,7 @@
- return 0;
- }
-
-+#ifndef __REACTOS__
- /***********************************************************************
- * load_ne_resource [internal]
- */
-@@ -266,6 +271,7 @@
- HeapFree( GetProcessHeap(), 0, resTab );
- return TRUE;
- }
-+#endif /* ! __REACTOS__ */
-
- /***********************************************************************
- * load_pe_resource [internal]
-@@ -411,8 +416,13 @@
- switch ( read_xx_header( lzfd ) )
- {
- case IMAGE_OS2_SIGNATURE:
-+#ifdef __REACTOS__
-+ ERR("OS2 Images not supported under ReactOS at this time.");
-+ retv = 0;
-+#else
- retv = find_ne_resource( lzfd, lpszResType, lpszResId,
- &reslen, lpdwFileOffset );
-+#endif
- break;
-
- case IMAGE_NT_SIGNATURE:
-@@ -450,8 +460,13 @@
- switch ( read_xx_header( lzfd ) )
- {
- case IMAGE_OS2_SIGNATURE:
-+#ifdef __REACTOS__
-+ ERR("OS2 Images not supported under ReactOS at this time.");
-+ retv = 0;
-+#else
- retv = find_ne_resource( lzfd, lpszResType, lpszResId,
- &reslen, &dwFileOffset );
-+#endif
- break;
-
- case IMAGE_NT_SIGNATURE:
diff --git a/dll/win32/win32.rbuild b/dll/win32/win32.rbuild
index 9ff3319d54f..ad862f5169e 100644
--- a/dll/win32/win32.rbuild
+++ b/dll/win32/win32.rbuild
@@ -31,6 +31,9 @@
+
+
+
diff --git a/dll/win32/windowscodecs/info.c b/dll/win32/windowscodecs/info.c
index f909d3a6b6e..2e558a80619 100644
--- a/dll/win32/windowscodecs/info.c
+++ b/dll/win32/windowscodecs/info.c
@@ -726,6 +726,7 @@ typedef struct {
LONG ref;
struct list objects;
struct list *cursor;
+ CRITICAL_SECTION lock; /* Must be held when reading or writing cursor */
} ComponentEnum;
typedef struct {
@@ -783,6 +784,8 @@ static ULONG WINAPI ComponentEnum_Release(IEnumUnknown *iface)
list_remove(&cursor->entry);
HeapFree(GetProcessHeap(), 0, cursor);
}
+ This->lock.DebugInfo->Spare[0] = 0;
+ DeleteCriticalSection(&This->lock);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -795,15 +798,17 @@ static HRESULT WINAPI ComponentEnum_Next(IEnumUnknown *iface, ULONG celt,
ComponentEnum *This = (ComponentEnum*)iface;
int num_fetched=0;
ComponentEnumItem *item;
+ HRESULT hr=S_OK;
TRACE("(%p,%u,%p,%p)\n", iface, celt, rgelt, pceltFetched);
+ EnterCriticalSection(&This->lock);
while (num_fetchedcursor)
{
- *pceltFetched = num_fetched;
- return S_FALSE;
+ hr = S_FALSE;
+ break;
}
item = LIST_ENTRY(This->cursor, ComponentEnumItem, entry);
IUnknown_AddRef(item->unk);
@@ -811,24 +816,31 @@ static HRESULT WINAPI ComponentEnum_Next(IEnumUnknown *iface, ULONG celt,
num_fetched++;
This->cursor = list_next(&This->objects, This->cursor);
}
+ LeaveCriticalSection(&This->lock);
*pceltFetched = num_fetched;
- return S_OK;
+ return hr;
}
static HRESULT WINAPI ComponentEnum_Skip(IEnumUnknown *iface, ULONG celt)
{
ComponentEnum *This = (ComponentEnum*)iface;
int i;
+ HRESULT hr=S_OK;
TRACE("(%p,%u)\n", iface, celt);
+ EnterCriticalSection(&This->lock);
for (i=0; icursor)
- return S_FALSE;
+ {
+ hr = S_FALSE;
+ break;
+ }
This->cursor = list_next(&This->objects, This->cursor);
}
- return S_OK;
+ LeaveCriticalSection(&This->lock);
+ return hr;
}
static HRESULT WINAPI ComponentEnum_Reset(IEnumUnknown *iface)
@@ -837,7 +849,9 @@ static HRESULT WINAPI ComponentEnum_Reset(IEnumUnknown *iface)
TRACE("(%p)\n", iface);
+ EnterCriticalSection(&This->lock);
This->cursor = list_head(&This->objects);
+ LeaveCriticalSection(&This->lock);
return S_OK;
}
@@ -847,6 +861,7 @@ static HRESULT WINAPI ComponentEnum_Clone(IEnumUnknown *iface, IEnumUnknown **pp
ComponentEnum *new_enum;
ComponentEnumItem *old_item, *new_item;
HRESULT ret=S_OK;
+ struct list *old_cursor;
new_enum = HeapAlloc(GetProcessHeap(), 0, sizeof(ComponentEnum));
if (!new_enum)
@@ -858,8 +873,14 @@ static HRESULT WINAPI ComponentEnum_Clone(IEnumUnknown *iface, IEnumUnknown **pp
new_enum->IEnumUnknown_Vtbl = &ComponentEnumVtbl;
new_enum->ref = 1;
new_enum->cursor = NULL;
-
list_init(&new_enum->objects);
+ InitializeCriticalSection(&new_enum->lock);
+ new_enum->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ComponentEnum.lock");
+
+ EnterCriticalSection(&This->lock);
+ old_cursor = This->cursor;
+ LeaveCriticalSection(&This->lock);
+
LIST_FOR_EACH_ENTRY(old_item, &This->objects, ComponentEnumItem, entry)
{
new_item = HeapAlloc(GetProcessHeap(), 0, sizeof(ComponentEnumItem));
@@ -871,7 +892,7 @@ static HRESULT WINAPI ComponentEnum_Clone(IEnumUnknown *iface, IEnumUnknown **pp
new_item->unk = old_item->unk;
list_add_tail(&new_enum->objects, &new_item->entry);
IUnknown_AddRef(new_item->unk);
- if (&old_item->entry == This->cursor) new_enum->cursor = &new_item->entry;
+ if (&old_item->entry == old_cursor) new_enum->cursor = &new_item->entry;
}
if (FAILED(ret))
@@ -923,6 +944,8 @@ HRESULT CreateComponentEnumerator(DWORD componentTypes, DWORD options, IEnumUnkn
This->IEnumUnknown_Vtbl = &ComponentEnumVtbl;
This->ref = 1;
list_init(&This->objects);
+ InitializeCriticalSection(&This->lock);
+ This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ComponentEnum.lock");
for (category=categories; category->type && hr == S_OK; category++)
{
diff --git a/dll/win32/windowscodecs/jpegformat.c b/dll/win32/windowscodecs/jpegformat.c
index 6f788216fbe..017e6045790 100644
--- a/dll/win32/windowscodecs/jpegformat.c
+++ b/dll/win32/windowscodecs/jpegformat.c
@@ -570,7 +570,7 @@ HRESULT JpegDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
HRESULT JpegDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
{
- ERR("Trying to load JPEG picture, but JPEG supported not compiled in.\n");
+ ERR("Trying to load JPEG picture, but JPEG support is not compiled in.\n");
return E_FAIL;
}
diff --git a/dll/win32/windowscodecs/pngformat.c b/dll/win32/windowscodecs/pngformat.c
index 22b37b063f4..5af680e876c 100644
--- a/dll/win32/windowscodecs/pngformat.c
+++ b/dll/win32/windowscodecs/pngformat.c
@@ -1320,13 +1320,13 @@ HRESULT PngEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
HRESULT PngDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
{
- ERR("Trying to load PNG picture, but PNG supported not compiled in.\n");
+ ERR("Trying to load PNG picture, but PNG support is not compiled in.\n");
return E_FAIL;
}
HRESULT PngEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
{
- ERR("Trying to save PNG picture, but PNG supported not compiled in.\n");
+ ERR("Trying to save PNG picture, but PNG support is not compiled in.\n");
return E_FAIL;
}
diff --git a/dll/win32/wininet/http.c b/dll/win32/wininet/http.c
index 5b7459db6f7..57b73729a10 100644
--- a/dll/win32/wininet/http.c
+++ b/dll/win32/wininet/http.c
@@ -1345,9 +1345,12 @@ static WCHAR *HTTP_BuildProxyRequestUrl(http_request_t *req)
static BOOL HTTP_DealWithProxy(appinfo_t *hIC, http_session_t *lpwhs, http_request_t *lpwhr)
{
WCHAR buf[MAXHOSTNAME];
+ WCHAR protoProxy[MAXHOSTNAME + 15];
+ DWORD protoProxyLen = sizeof(protoProxy) / sizeof(protoProxy[0]);
WCHAR proxy[MAXHOSTNAME + 15]; /* 15 == "http://" + sizeof(port#) + ":/\0" */
static WCHAR szNul[] = { 0 };
URL_COMPONENTSW UrlComponents;
+ static const WCHAR protoHttp[] = { 'h','t','t','p',0 };
static const WCHAR szHttp[] = { 'h','t','t','p',':','/','/',0 };
static const WCHAR szFormat[] = { 'h','t','t','p',':','/','/','%','s',0 };
@@ -1356,11 +1359,13 @@ static BOOL HTTP_DealWithProxy(appinfo_t *hIC, http_session_t *lpwhs, http_reque
UrlComponents.lpszHostName = buf;
UrlComponents.dwHostNameLength = MAXHOSTNAME;
+ if (!INTERNET_FindProxyForProtocol(hIC->lpszProxy, protoHttp, protoProxy, &protoProxyLen))
+ return FALSE;
if( CSTR_EQUAL != CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE,
- hIC->lpszProxy,strlenW(szHttp),szHttp,strlenW(szHttp)) )
- sprintfW(proxy, szFormat, hIC->lpszProxy);
+ protoProxy,strlenW(szHttp),szHttp,strlenW(szHttp)) )
+ sprintfW(proxy, szFormat, protoProxy);
else
- strcpyW(proxy, hIC->lpszProxy);
+ strcpyW(proxy, protoProxy);
if( !InternetCrackUrlW(proxy, 0, 0, &UrlComponents) )
return FALSE;
if( UrlComponents.dwHostNameLength == 0 )
@@ -4253,8 +4258,6 @@ DWORD HTTP_Connect(appinfo_t *hIC, LPCWSTR lpszServerName,
}
if(hIC->lpszProxy && hIC->dwAccessType == INTERNET_OPEN_TYPE_PROXY) {
- if(strchrW(hIC->lpszProxy, ' '))
- FIXME("Several proxies not implemented.\n");
if(hIC->lpszProxyBypass)
FIXME("Proxy bypass is ignored.\n");
}
diff --git a/dll/win32/wininet/internet.c b/dll/win32/wininet/internet.c
index 45b6aa791f3..f4b8a0a3abd 100644
--- a/dll/win32/wininet/internet.c
+++ b/dll/win32/wininet/internet.c
@@ -362,6 +362,98 @@ static LONG INTERNET_SaveProxySettings( proxyinfo_t *lpwpi )
return ERROR_SUCCESS;
}
+/***********************************************************************
+ * INTERNET_FindProxyForProtocol
+ *
+ * Searches the proxy string for a proxy of the given protocol.
+ * Returns the found proxy, or the default proxy if none of the given
+ * protocol is found.
+ *
+ * PARAMETERS
+ * szProxy [In] proxy string to search
+ * proto [In] protocol to search for, e.g. "http"
+ * foundProxy [Out] found proxy
+ * foundProxyLen [In/Out] length of foundProxy buffer, in WCHARs
+ *
+ * RETURNS
+ * TRUE if a proxy is found, FALSE if not. If foundProxy is too short,
+ * *foundProxyLen is set to the required size in WCHARs, including the
+ * NULL terminator, and the last error is set to ERROR_INSUFFICIENT_BUFFER.
+ */
+BOOL INTERNET_FindProxyForProtocol(LPCWSTR szProxy, LPCWSTR proto, WCHAR *foundProxy, DWORD *foundProxyLen)
+{
+ LPCWSTR ptr;
+ BOOL ret = FALSE;
+
+ TRACE("(%s, %s)\n", debugstr_w(szProxy), debugstr_w(proto));
+
+ /* First, look for the specified protocol (proto=scheme://host:port) */
+ for (ptr = szProxy; !ret && ptr && *ptr; )
+ {
+ LPCWSTR end, equal;
+
+ if (!(end = strchrW(ptr, ' ')))
+ end = ptr + strlenW(ptr);
+ if ((equal = strchrW(ptr, '=')) && equal < end &&
+ equal - ptr == strlenW(proto) &&
+ !strncmpiW(proto, ptr, strlenW(proto)))
+ {
+ if (end - equal > *foundProxyLen)
+ {
+ WARN("buffer too short for %s\n",
+ debugstr_wn(equal + 1, end - equal - 1));
+ *foundProxyLen = end - equal;
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ }
+ else
+ {
+ memcpy(foundProxy, equal + 1, (end - equal) * sizeof(WCHAR));
+ foundProxy[end - equal] = 0;
+ ret = TRUE;
+ }
+ }
+ if (*end == ' ')
+ ptr = end + 1;
+ else
+ ptr = end;
+ }
+ if (!ret)
+ {
+ /* It wasn't found: look for no protocol */
+ for (ptr = szProxy; !ret && ptr && *ptr; )
+ {
+ LPCWSTR end, equal;
+
+ if (!(end = strchrW(ptr, ' ')))
+ end = ptr + strlenW(ptr);
+ if (!(equal = strchrW(ptr, '=')))
+ {
+ if (end - ptr + 1 > *foundProxyLen)
+ {
+ WARN("buffer too short for %s\n",
+ debugstr_wn(ptr, end - ptr));
+ *foundProxyLen = end - ptr + 1;
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ }
+ else
+ {
+ memcpy(foundProxy, ptr, (end - ptr) * sizeof(WCHAR));
+ foundProxy[end - ptr] = 0;
+ ret = TRUE;
+ }
+ }
+ if (*end == ' ')
+ ptr = end + 1;
+ else
+ ptr = end;
+ }
+ }
+ if (ret)
+ TRACE("found proxy for %s: %s\n", debugstr_w(proto),
+ debugstr_w(foundProxy));
+ return ret;
+}
+
/***********************************************************************
* InternetInitializeAutoProxyDll (WININET.@)
*
diff --git a/dll/win32/wininet/internet.h b/dll/win32/wininet/internet.h
index e45176bb2c0..8fcc0cf3565 100644
--- a/dll/win32/wininet/internet.h
+++ b/dll/win32/wininet/internet.h
@@ -422,6 +422,7 @@ VOID SendAsyncCallback(object_header_t *hdr, DWORD_PTR dwContext,
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext,
DWORD dwInternetStatus, LPVOID lpvStatusInfo,
DWORD dwStatusInfoLength);
+BOOL INTERNET_FindProxyForProtocol(LPCWSTR szProxy, LPCWSTR proto, WCHAR *foundProxy, DWORD *foundProxyLen);
BOOL NETCON_connected(WININET_NETCONNECTION *connection);
DWORD NETCON_init(WININET_NETCONNECTION *connnection, BOOL useSSL);
diff --git a/dll/win32/ws2_32/misc/stubs.c b/dll/win32/ws2_32/misc/stubs.c
index 408f28294a6..10dd98e1ded 100644
--- a/dll/win32/ws2_32/misc/stubs.c
+++ b/dll/win32/ws2_32/misc/stubs.c
@@ -30,7 +30,7 @@ getpeername(IN SOCKET s,
return SOCKET_ERROR;
}
- if (!ReferenceProviderByHandle((HANDLE)s, &Provider))
+ if (!ReferenceProviderByHandle((HANDLE)(ULONG_PTR)(s), &Provider))
{
WSASetLastError(WSAENOTSOCK);
return SOCKET_ERROR;
diff --git a/drivers/base/bootvid/bootvid.rbuild b/drivers/base/bootvid/bootvid.rbuild
index fc9f3ec3bf5..0c996310194 100644
--- a/drivers/base/bootvid/bootvid.rbuild
+++ b/drivers/base/bootvid/bootvid.rbuild
@@ -6,7 +6,7 @@
.
ntoskrnl
hal
-
+
bootvid.c
bootdata.c
diff --git a/drivers/base/bootvid/i386/bootvid.c b/drivers/base/bootvid/i386/bootvid.c
index c55ffc16255..3d0ae503167 100644
--- a/drivers/base/bootvid/i386/bootvid.c
+++ b/drivers/base/bootvid/i386/bootvid.c
@@ -355,7 +355,7 @@ BOOLEAN
NTAPI
VidInitialize(IN BOOLEAN SetMode)
{
- ULONG Context = 0;
+ ULONG_PTR Context = 0;
PHYSICAL_ADDRESS TranslatedAddress;
PHYSICAL_ADDRESS NullAddress = {{0, 0}}, VgaAddress;
ULONG AddressSpace = 1;
diff --git a/drivers/base/bootvid/i386/vga.c b/drivers/base/bootvid/i386/vga.c
index e11aae77fab..eeb06fe8df5 100644
--- a/drivers/base/bootvid/i386/vga.c
+++ b/drivers/base/bootvid/i386/vga.c
@@ -319,8 +319,8 @@ VgaScroll(ULONG Scroll)
do
{
/* Write value in the new position so that we can do the scroll */
- WRITE_REGISTER_UCHAR((PUCHAR)j,
- READ_REGISTER_UCHAR((PUCHAR)j + i));
+ WRITE_REGISTER_UCHAR(UlongToPtr(j),
+ READ_REGISTER_UCHAR(UlongToPtr(j + i)));
/* Move to the next memory location to write to */
j++;
@@ -1197,7 +1197,7 @@ VidSolidColorFill(IN ULONG Left,
__outpw(0x3CE, 7);
/* Calculate pixel position for the read */
- Offset = VgaBase + (Top * 80) + (PUCHAR)LeftOffset;
+ Offset = VgaBase + (Top * 80) + (PUCHAR)(ULONG_PTR)LeftOffset;
/* Select the bitmask register and write the mask */
__outpw(0x3CE, (USHORT)lMask);
@@ -1221,7 +1221,7 @@ VidSolidColorFill(IN ULONG Left,
if (Distance)
{
/* Calculate new pixel position */
- Offset = VgaBase + (Top * 80) + (PUCHAR)RightOffset;
+ Offset = VgaBase + (Top * 80) + (PUCHAR)(ULONG_PTR)RightOffset;
Distance--;
/* Select the bitmask register and write the mask */
@@ -1247,7 +1247,7 @@ VidSolidColorFill(IN ULONG Left,
if (Distance)
{
/* Calculate new pixel position */
- Offset = VgaBase + (Top * 80) + (PUCHAR)(LeftOffset + 1);
+ Offset = VgaBase + (Top * 80) + (PUCHAR)(ULONG_PTR)(LeftOffset + 1);
/* Set the bitmask to 0xFF for all 4 planes */
__outpw(0x3CE, 0xFF08);
diff --git a/drivers/battery/battc/battc.c b/drivers/battery/battc/battc.c
index 3a73bc9c56f..6a0b7220c1c 100644
--- a/drivers/battery/battc/battc.c
+++ b/drivers/battery/battc/battc.c
@@ -51,26 +51,9 @@ BatteryClassSystemControl(PVOID ClassData,
PIRP Irp,
PVOID Disposition)
{
- NTSTATUS Status;
-
UNIMPLEMENTED
- /* FIXME: Uncomment when WmiCompleteRequest is implemented */
-#if 0
- Status = STATUS_WMI_GUID_NOT_FOUND;
- WmiCompleteRequest(DeviceObject,
- Irp,
- Status,
- 0,
- IO_NO_INCREMENT);
-#else
- Irp->IoStatus.Status = Status = STATUS_WMI_GUID_NOT_FOUND;
- Irp->IoStatus.Information = 0;
-
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-#endif
-
- return Status;
+ return STATUS_WMI_GUID_NOT_FOUND;
}
BCLASSAPI
diff --git a/drivers/bus/acpi/acpi.rbuild b/drivers/bus/acpi/acpi.rbuild
index cbc124a26f5..c3e5b7dac90 100644
--- a/drivers/bus/acpi/acpi.rbuild
+++ b/drivers/bus/acpi/acpi.rbuild
@@ -7,6 +7,9 @@
+
+
+
@@ -26,6 +29,8 @@
osl.c
acpienum.c
+ eval.c
+ interface.c
pnp.c
power.c
buspdo.c
diff --git a/drivers/bus/acpi/busmgr/bus.c b/drivers/bus/acpi/busmgr/bus.c
index 34aa0766c04..ae04c2cb31b 100644
--- a/drivers/bus/acpi/busmgr/bus.c
+++ b/drivers/bus/acpi/busmgr/bus.c
@@ -58,6 +58,7 @@ KSPIN_LOCK acpi_bus_event_lock;
LIST_HEAD(acpi_bus_event_list);
//DECLARE_WAIT_QUEUE_HEAD(acpi_bus_event_queue);
KEVENT AcpiEventQueue;
+KDPC event_dpc;
static int
@@ -455,6 +456,21 @@ acpi_bus_get_perf_flags (
Event Management
-------------------------------------------------------------------------- */
+void
+acpi_bus_generate_event_dpc(PKDPC Dpc,
+ PVOID DeferredContext,
+ PVOID SystemArgument1,
+ PVOID SystemArgument2)
+{
+ struct acpi_bus_event *event = SystemArgument1;
+ KIRQL OldIrql;
+
+ KeAcquireSpinLock(&acpi_bus_event_lock, &OldIrql);
+ list_add_tail(&event->node, &acpi_bus_event_list);
+ KeReleaseSpinLock(&acpi_bus_event_lock, OldIrql);
+
+ KeSetEvent(&AcpiEventQueue, IO_NO_INCREMENT, FALSE);
+}
int
acpi_bus_generate_event (
@@ -463,10 +479,8 @@ acpi_bus_generate_event (
int data)
{
struct acpi_bus_event *event = NULL;
- //unsigned long flags = 0;
- KIRQL OldIrql;
- DPRINT1("acpi_bus_generate_event");
+ DPRINT("acpi_bus_generate_event");
if (!device)
return_VALUE(AE_BAD_PARAMETER);
@@ -484,14 +498,8 @@ acpi_bus_generate_event (
event->type = type;
event->data = data;
- //spin_lock_irqsave(&acpi_bus_event_lock, flags);
- KeAcquireSpinLock(&acpi_bus_event_lock, &OldIrql);
- list_add_tail(&event->node, &acpi_bus_event_list);
- KeReleaseSpinLock(&acpi_bus_event_lock, OldIrql);
- //spin_unlock_irqrestore(&acpi_bus_event_lock, flags);
-
- KeSetEvent(&AcpiEventQueue, IO_NO_INCREMENT, FALSE);
- //wake_up_interruptible(&acpi_bus_event_queue);
+ if (!KeInsertQueueDpc(&event_dpc, event, NULL))
+ ExFreePool(event);
return_VALUE(0);
}
@@ -506,7 +514,7 @@ acpi_bus_receive_event (
//DECLARE_WAITQUEUE(wait, current);
- DPRINT1("acpi_bus_receive_event");
+ DPRINT("acpi_bus_receive_event");
if (!event)
return AE_BAD_PARAMETER;
@@ -1153,9 +1161,11 @@ acpi_bus_add (
case ACPI_BUS_TYPE_SYSTEM:
sprintf(device->pnp.bus_id, "%s", "ACPI");
break;
+ case ACPI_BUS_TYPE_POWER_BUTTONF:
case ACPI_BUS_TYPE_POWER_BUTTON:
sprintf(device->pnp.bus_id, "%s", "PWRF");
break;
+ case ACPI_BUS_TYPE_SLEEP_BUTTONF:
case ACPI_BUS_TYPE_SLEEP_BUTTON:
sprintf(device->pnp.bus_id, "%s", "SLPF");
break;
@@ -1262,9 +1272,15 @@ acpi_bus_add (
hid = ACPI_THERMAL_HID;
break;
case ACPI_BUS_TYPE_POWER_BUTTON:
+ hid = ACPI_BUTTON_HID_POWER;
+ break;
+ case ACPI_BUS_TYPE_POWER_BUTTONF:
hid = ACPI_BUTTON_HID_POWERF;
break;
case ACPI_BUS_TYPE_SLEEP_BUTTON:
+ hid = ACPI_BUTTON_HID_SLEEP;
+ break;
+ case ACPI_BUS_TYPE_SLEEP_BUTTONF:
hid = ACPI_BUTTON_HID_SLEEPF;
break;
}
@@ -1326,7 +1342,9 @@ acpi_bus_add (
*/
switch (type) {
case ACPI_BUS_TYPE_POWER_BUTTON:
+ case ACPI_BUS_TYPE_POWER_BUTTONF:
case ACPI_BUS_TYPE_SLEEP_BUTTON:
+ case ACPI_BUS_TYPE_SLEEP_BUTTONF:
break;
default:
status = AcpiAttachData(device->handle,
@@ -1530,16 +1548,40 @@ acpi_bus_scan_fixed (
if (!root)
return_VALUE(AE_NOT_FOUND);
- /*
- * Enumerate all fixed-feature devices.
+ /* If ACPI_FADT_POWER_BUTTON is set, then a control
+ * method power button is present. Otherwise, a fixed
+ * power button is present.
*/
if (AcpiGbl_FADT.Flags & ACPI_FADT_POWER_BUTTON)
result = acpi_bus_add(&device, acpi_root,
NULL, ACPI_BUS_TYPE_POWER_BUTTON);
+ else
+ {
+ /* Enable the fixed power button so we get notified if it is pressed */
+ AcpiWriteBitRegister(ACPI_BITREG_POWER_BUTTON_ENABLE, 1);
+ result = acpi_bus_add(&device, acpi_root,
+ NULL, ACPI_BUS_TYPE_POWER_BUTTONF);
+ }
+
+ /* This one is a bit more complicated and we do it wrong
+ * right now. If ACPI_FADT_SLEEP_BUTTON is set but no
+ * device object is present then no sleep button is present, but
+ * if the flags is clear and there is no device object then it is
+ * a fixed sleep button. If the flag is set and there is a device object
+ * the we have a control method button just like above.
+ */
if (AcpiGbl_FADT.Flags & ACPI_FADT_SLEEP_BUTTON)
result = acpi_bus_add(&device, acpi_root,
NULL, ACPI_BUS_TYPE_SLEEP_BUTTON);
+ else
+ {
+ /* Enable the fixed sleep button so we get notified if it is pressed */
+ AcpiWriteBitRegister(ACPI_BITREG_SLEEP_BUTTON_ENABLE, 1);
+
+ result = acpi_bus_add(&device, acpi_root,
+ NULL, ACPI_BUS_TYPE_SLEEP_BUTTONF);
+ }
return_VALUE(result);
}
@@ -1549,120 +1591,6 @@ acpi_bus_scan_fixed (
Initialization/Cleanup
-------------------------------------------------------------------------- */
-static int
-acpi_bus_init_irq (void)
-{
- ACPI_STATUS status = AE_OK;
- ACPI_OBJECT arg = {ACPI_TYPE_INTEGER};
- ACPI_OBJECT_LIST arg_list = {1, &arg};
- //char *message = NULL;
-
- DPRINT("acpi_bus_init_irq");
-
- /*
- * Let the system know what interrupt model we are using by
- * evaluating the \_PIC object, if exists.
- */
-
- //switch (acpi_irq_model) {
- //case ACPI_IRQ_MODEL_PIC:
- // message = "PIC";
- // break;
- //case ACPI_IRQ_MODEL_IOAPIC:
- // message = "IOAPIC";
- // break;
- //case ACPI_IRQ_MODEL_IOSAPIC:
- // message = "IOSAPIC";
- // break;
- //default:
- // DPRINT1("Unknown interrupt routing model\n");
- // return_VALUE(AE_NOT_FOUND);
- //}
-
- //DPRINT("Using %s for interrupt routing\n", message);
-
- //arg.Integer.Value = acpi_irq_model;
-
- //status = AcpiEvaluateObject(NULL, "\\_PIC", &arg_list, NULL);
- //if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) {
- // ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _PIC\n"));
- // return_VALUE(AE_NOT_FOUND);
- //}
-
- return_VALUE(0);
-}
-
-
-//void
-//acpi_early_init (void)
-//{
-// ACPI_STATUS status = AE_OK;
-//
-// DPRINT("acpi_early_init");
-//
-// if (acpi_disabled)
-// return_VOID;
-//
- /* enable workarounds, unless strict ACPI spec. compliance */
-// if (!acpi_strict)
-// acpi_gbl_enable_interpreter_slack = TRUE;
-//
-// status = acpi_reallocate_root_table();
-// if (ACPI_FAILURE(status)) {
-// printk(KERN_ERR PREFIX
-// "Unable to reallocate ACPI tables\n");
-// goto error0;
-// }
-//
-// status = acpi_initialize_subsystem();
-// if (ACPI_FAILURE(status)) {
-// printk(KERN_ERR PREFIX
-// "Unable to initialize the ACPI Interpreter\n");
-// goto error0;
-// }
-//
-// status = acpi_load_tables();
-// if (ACPI_FAILURE(status)) {
-// printk(KERN_ERR PREFIX
-// "Unable to load the System Description Tables\n");
-// goto error0;
-// }
-//
-//#ifdef CONFIG_X86
-// if (!acpi_ioapic) {
-// /* compatible (0) means level (3) */
-// if (!(acpi_sci_flags & ACPI_MADT_TRIGGER_MASK)) {
-// acpi_sci_flags &= ~ACPI_MADT_TRIGGER_MASK;
-// acpi_sci_flags |= ACPI_MADT_TRIGGER_LEVEL;
-// }
-// /* Set PIC-mode SCI trigger type */
-// acpi_pic_sci_set_trigger(acpi_gbl_FADT.sci_interrupt,
-// (acpi_sci_flags & ACPI_MADT_TRIGGER_MASK) >> 2);
-// } else {
-// /*
-// * now that acpi_gbl_FADT is initialized,
-// * update it with result from INT_SRC_OVR parsing
-// */
-// acpi_gbl_FADT.sci_interrupt = acpi_sci_override_gsi;
-// }
-//#endif
-//
-// status =
-// acpi_enable_subsystem(~
-// (ACPI_NO_HARDWARE_INIT |
-// ACPI_NO_ACPI_ENABLE));
-// if (ACPI_FAILURE(status)) {
-// printk(KERN_ERR PREFIX "Unable to enable ACPI\n");
-// goto error0;
-// }
-//
-// return;
-//
-// error0:
-// disable_acpi();
-// return;
-//}
-
int
acpi_bus_init (void)
{
@@ -1671,6 +1599,8 @@ acpi_bus_init (void)
DPRINT("acpi_bus_init");
+ KeInitializeDpc(&event_dpc, acpi_bus_generate_event_dpc, NULL);
+
status = AcpiEnableSubsystem(ACPI_FULL_INITIALIZATION);
if (ACPI_FAILURE(status)) {
DPRINT1("Unable to start the ACPI Interpreter\n");
@@ -1701,13 +1631,6 @@ acpi_bus_init (void)
/* Initialize sleep structures */
//acpi_sleep_init();
- /*
- * Get the system interrupt model and evaluate \_PIC.
- */
- result = acpi_bus_init_irq();
- if (result)
- goto error1;
-
/*
* Register the for all standard device notifications.
*/
@@ -1726,6 +1649,7 @@ acpi_bus_init (void)
if (result)
goto error2;
+
/*
* Enumerate devices in the ACPI namespace.
*/
@@ -1736,7 +1660,6 @@ acpi_bus_init (void)
if (result)
DPRINT1("acpi_bus_scan failed\n");
- //acpi_motherboard_init();
return_VALUE(0);
/* Mimic structured exception handling */
diff --git a/drivers/bus/acpi/busmgr/button.c b/drivers/bus/acpi/busmgr/button.c
index 5e3eb2b5f0f..9344a5f1f7d 100644
--- a/drivers/bus/acpi/busmgr/button.c
+++ b/drivers/bus/acpi/busmgr/button.c
@@ -57,6 +57,11 @@ struct acpi_button {
UINT8 type;
unsigned long pushed;
};
+
+struct acpi_device *power_button;
+struct acpi_device *sleep_button;
+struct acpi_device *lid_button;
+
/* --------------------------------------------------------------------------
Driver Interface
-------------------------------------------------------------------------- */
@@ -113,10 +118,6 @@ acpi_button_add (
ACPI_STATUS status = AE_OK;
struct acpi_button *button = NULL;
- static struct acpi_device *power_button;
- static struct acpi_device *sleep_button;
- static struct acpi_device *lid_button;
-
ACPI_FUNCTION_TRACE("acpi_button_add");
if (!device)
diff --git a/drivers/bus/acpi/buspdo.c b/drivers/bus/acpi/buspdo.c
index 4a9498e7ad4..84bd1d8fe11 100644
--- a/drivers/bus/acpi/buspdo.c
+++ b/drivers/bus/acpi/buspdo.c
@@ -8,6 +8,9 @@
#include
#include
+#include
+#include
+
#define NDEBUG
#include
@@ -33,9 +36,13 @@ Bus_PDO_PnP (
{
NTSTATUS status;
POWER_STATE state;
+ struct acpi_device *device = NULL;
PAGED_CODE ();
+ if (DeviceData->AcpiHandle)
+ acpi_bus_get_device(DeviceData->AcpiHandle, &device);
+
//
// NB: Because we are a bus enumerator, we have no one to whom we could
// defer these irps. Therefore we do not pass them down but merely
@@ -45,7 +52,6 @@ Bus_PDO_PnP (
switch (IrpStack->MinorFunction) {
case IRP_MN_START_DEVICE:
-
//
// Here we do what ever initialization and ``turning on'' that is
// required to allow others to access this device.
@@ -59,6 +65,43 @@ Bus_PDO_PnP (
break;
}
+ DeviceData->InterfaceName.Length = 0;
+
+ if (!device)
+ {
+ IoRegisterDeviceInterface(DeviceData->Common.Self,
+ &GUID_DEVICE_SYS_BUTTON,
+ NULL,
+ &DeviceData->InterfaceName);
+ }
+ else if (device->flags.hardware_id &&
+ strstr(device->pnp.hardware_id, ACPI_THERMAL_HID))
+ {
+ IoRegisterDeviceInterface(DeviceData->Common.Self,
+ &GUID_DEVICE_THERMAL_ZONE,
+ NULL,
+ &DeviceData->InterfaceName);
+ }
+ else if (device->flags.hardware_id &&
+ strstr(device->pnp.hardware_id, ACPI_BUTTON_HID_LID))
+ {
+ IoRegisterDeviceInterface(DeviceData->Common.Self,
+ &GUID_DEVICE_LID,
+ NULL,
+ &DeviceData->InterfaceName);
+ }
+ else if (device->flags.hardware_id &&
+ strstr(device->pnp.hardware_id, ACPI_PROCESSOR_HID))
+ {
+ IoRegisterDeviceInterface(DeviceData->Common.Self,
+ &GUID_DEVICE_PROCESSOR,
+ NULL,
+ &DeviceData->InterfaceName);
+ }
+
+ if (DeviceData->InterfaceName.Length != 0)
+ IoSetDeviceInterfaceState(&DeviceData->InterfaceName, TRUE);
+
state.DeviceState = PowerDeviceD0;
PoSetPowerState(DeviceData->Common.Self, DevicePowerState, state);
DeviceData->Common.DevicePowerState = PowerDeviceD0;
@@ -68,6 +111,9 @@ Bus_PDO_PnP (
case IRP_MN_STOP_DEVICE:
+ if (DeviceData->InterfaceName.Length != 0)
+ IoSetDeviceInterfaceState(&DeviceData->InterfaceName, FALSE);
+
//
// Here we shut down the device and give up and unmap any resources
// we acquired for the device.
@@ -176,6 +222,12 @@ Bus_PDO_PnP (
break;
+ case IRP_MN_QUERY_INTERFACE:
+
+ status = Bus_PDO_QueryInterface(DeviceData, Irp);
+
+ break;
+
case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
@@ -325,20 +377,17 @@ Bus_PDO_QueryDeviceCaps(
deviceCapabilities->UniqueID = device->flags.unique_id;
deviceCapabilities->NoDisplayInUI = !device->status.show_in_ui;
deviceCapabilities->Address = device->pnp.bus_address;
- deviceCapabilities->RawDeviceOK = FALSE;
}
- else
- {
- deviceCapabilities->EjectSupported = FALSE;
- deviceCapabilities->HardwareDisabled = FALSE;
- deviceCapabilities->Removable = FALSE;
- deviceCapabilities->SurpriseRemovalOK = FALSE;
- deviceCapabilities->UniqueID = FALSE;
- deviceCapabilities->NoDisplayInUI = FALSE;
- deviceCapabilities->Address = 0;
- /* The ACPI driver will run fixed buttons */
- deviceCapabilities->RawDeviceOK = TRUE;
+ if (!device ||
+ (device->flags.hardware_id &&
+ (strstr(device->pnp.hardware_id, ACPI_BUTTON_HID_LID) ||
+ strstr(device->pnp.hardware_id, ACPI_THERMAL_HID) ||
+ strstr(device->pnp.hardware_id, ACPI_PROCESSOR_HID))))
+ {
+ /* Allow ACPI to control the device if it is a lid button,
+ * a thermal zone, a processor, or a fixed feature button */
+ deviceCapabilities->RawDeviceOK = TRUE;
}
deviceCapabilities->SilentInstall = FALSE;
diff --git a/drivers/bus/acpi/cmbatt/cmbatt.c b/drivers/bus/acpi/cmbatt/cmbatt.c
index b8c59739d4e..747ac9ea952 100644
--- a/drivers/bus/acpi/cmbatt/cmbatt.c
+++ b/drivers/bus/acpi/cmbatt/cmbatt.c
@@ -18,34 +18,233 @@ PVOID CmBattPowerCallBackRegistration;
UNICODE_STRING GlobalRegistryPath;
KTIMER CmBattWakeDpcTimerObject;
KDPC CmBattWakeDpcObject;
+PDEVICE_OBJECT AcAdapterPdo;
+LARGE_INTEGER CmBattWakeDpcDelay;
/* FUNCTIONS ******************************************************************/
VOID
NTAPI
-CmBattPowerCallBack(PCMBATT_DEVICE_EXTENSION DeviceExtension,
- PVOID Argument1,
- PVOID Argument2)
+CmBattPowerCallBack(IN PCMBATT_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG Action,
+ IN ULONG Value)
{
- UNIMPLEMENTED;
+ BOOLEAN Cancelled;
+ PDEVICE_OBJECT DeviceObject;
+ if (CmBattDebug & 0x10)
+ DbgPrint("CmBattPowerCallBack: action: %d, value: %d \n", Action, Value);
+
+ /* Check if a transition is going to happen */
+ if (Action == PO_CB_SYSTEM_STATE_LOCK)
+ {
+ /* We have just re-entered S0: call the wake DPC in 10 seconds */
+ if (Value == 1)
+ {
+ if (CmBattDebug & 0x10)
+ DbgPrint("CmBattPowerCallBack: Calling CmBattWakeDpc after 10 seconds.\n");
+ Cancelled = KeSetTimer(&CmBattWakeDpcTimerObject, CmBattWakeDpcDelay, &CmBattWakeDpcObject);
+ if (CmBattDebug & 0x10)
+ DbgPrint("CmBattPowerCallBack: timerCanceled = %d.\n", Cancelled);
+ }
+ else if (Value == 0)
+ {
+ /* We are exiting the S0 state: loop all devices to set the delay flag */
+ if (CmBattDebug & 0x10)
+ DbgPrint("CmBattPowerCallBack: Delaying Notifications\n");
+ for (DeviceObject = DeviceExtension->DeviceObject;
+ DeviceObject;
+ DeviceObject = DeviceObject->NextDevice)
+ {
+ /* Set the delay flag */
+ DeviceExtension = DeviceObject->DeviceExtension;
+ DeviceExtension->DelayNotification = TRUE;
+ }
+ }
+ else if (CmBattDebug & 0x10)
+ {
+ /* Unknown value */
+ DbgPrint("CmBattPowerCallBack: unknown argument2 = %08x\n");
+ }
+ }
}
VOID
NTAPI
-CmBattWakeDpc(PKDPC Dpc,
- PCMBATT_DEVICE_EXTENSION FdoExtension,
- PVOID SystemArgument1,
- PVOID SystemArgument2)
+CmBattWakeDpc(IN PKDPC Dpc,
+ IN PCMBATT_DEVICE_EXTENSION FdoExtension,
+ IN PVOID SystemArgument1,
+ IN PVOID SystemArgument2)
{
+ PDEVICE_OBJECT CurrentObject;
+ BOOLEAN AcNotify = FALSE;
+ PCMBATT_DEVICE_EXTENSION DeviceExtension;
+ ULONG ArFlag;
+ if (CmBattDebug & 2) DbgPrint("CmBattWakeDpc: Entered.\n");
+
+ /* Loop all device objects */
+ for (CurrentObject = FdoExtension->DeviceObject;
+ CurrentObject;
+ CurrentObject = CurrentObject->NextDevice)
+ {
+ /* Turn delay flag off, we're back in S0 */
+ DeviceExtension = CurrentObject->DeviceExtension;
+ DeviceExtension->DelayNotification = 0;
+
+ /* Check if this is an AC adapter */
+ if (DeviceExtension->FdoType == CmBattAcAdapter)
+ {
+ /* Was there a pending notify? */
+ if (DeviceExtension->ArFlag & CMBATT_AR_NOTIFY)
+ {
+ /* We'll send a notify on the next pass */
+ AcNotify = TRUE;
+ DeviceExtension->ArFlag = 0;
+ if (CmBattDebug & 0x20)
+ DbgPrint("CmBattWakeDpc: AC adapter notified\n");
+ }
+ }
+ }
+ /* Loop the device objects again */
+ for (CurrentObject = FdoExtension->DeviceObject;
+ CurrentObject;
+ CurrentObject = CurrentObject->NextDevice)
+ {
+ /* Check if this is a battery */
+ DeviceExtension = CurrentObject->DeviceExtension;
+ if (DeviceExtension->FdoType == CmBattBattery)
+ {
+ /* Check what ARs are pending */
+ ArFlag = DeviceExtension->ArFlag;
+ if (CmBattDebug & 0x20)
+ DbgPrint("CmBattWakeDpc: Performing delayed ARs: %01x\n", ArFlag);
+
+ /* Insert notification, clear the lock value */
+ if (ArFlag & CMBATT_AR_INSERT) InterlockedExchange(&DeviceExtension->ArLockValue, 0);
+
+ /* Removal, clear the battery tag */
+ if (ArFlag & CMBATT_AR_REMOVE) DeviceExtension->Tag = 0;
+
+ /* Notification (or AC/DC adapter change from first pass above) */
+ if ((ArFlag & CMBATT_AR_NOTIFY) || (AcNotify))
+ {
+ /* Notify the class driver */
+ BatteryClassStatusNotify(DeviceExtension->ClassData);
+ }
+ }
+ }
}
VOID
NTAPI
-CmBattNotifyHandler(PCMBATT_DEVICE_EXTENSION DeviceExtension,
- ULONG NotifyValue)
+CmBattNotifyHandler(IN PCMBATT_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG NotifyValue)
{
- UNIMPLEMENTED;
+ ULONG ArFlag;
+ PCMBATT_DEVICE_EXTENSION FdoExtension;
+ PDEVICE_OBJECT DeviceObject;
+
+ if (CmBattDebug & (CMBATT_ACPI_ASSERT | CMBATT_PNP_INFO))
+ DbgPrint("CmBattNotifyHandler: CmBatt 0x%08x Type %d Number %d Notify Value: %x\n",
+ DeviceExtension,
+ DeviceExtension->FdoType,
+ DeviceExtension->DeviceId,
+ NotifyValue);
+
+ /* Check what kind of notification was received */
+ switch (NotifyValue)
+ {
+ /* ACPI Specification says is sends a "Bus Check" when power source changes */
+ case ACPI_BUS_CHECK:
+
+ /* We treat it as possible physical change */
+ DeviceExtension->ArFlag |= (CMBATT_AR_NOTIFY | CMBATT_AR_INSERT);
+ if ((DeviceExtension->Tag) &&
+ (CmBattDebug & (CMBATT_ACPI_WARNING | CMBATT_GENERIC_WARNING)))
+ DbgPrint("CmBattNotifyHandler: Received battery #%x insertion, but tag was not invalid.\n",
+ DeviceExtension->DeviceId);
+ break;
+
+ /* Status of the battery has changed */
+ case ACPI_BATT_NOTIFY_STATUS:
+
+ /* All we'll do is notify the class driver */
+ DeviceExtension->ArFlag |= CMBATT_AR_NOTIFY;
+ break;
+
+ /* Information on the battery has changed, such as physical presence */
+ case ACPI_DEVICE_CHECK:
+ case ACPI_BATT_NOTIFY_INFO:
+
+ /* Reset all state and let the class driver re-evaluate it all */
+ DeviceExtension->ArFlag |= (CMBATT_AR_NOTIFY |
+ CMBATT_AR_INSERT |
+ CMBATT_AR_REMOVE);
+ break;
+
+ default:
+
+ if (CmBattDebug & CMBATT_PNP_INFO)
+ DbgPrint("CmBattNotifyHandler: Unknown Notify Value: %x\n", NotifyValue);
+ }
+
+ /* Check if we're supposed to delay the notification till later */
+ if (DeviceExtension->DelayNotification)
+ {
+ /* We'll handle this when we get a status query later on */
+ if (CmBattDebug & CMBATT_PNP_INFO)
+ DbgPrint("CmBattNotifyHandler: Notification delayed: ARs = %01x\n",
+ DeviceExtension->ArFlag);
+ return;
+ }
+
+ /* We're going to handle this now */
+ if (CmBattDebug & CMBATT_PNP_INFO)
+ DbgPrint("CmBattNotifyHandler: Performing ARs: %01x\n", DeviceExtension->ArFlag);
+
+ /* Check if this is a battery or AC adapter notification */
+ if (DeviceExtension->FdoType == CmBattBattery)
+ {
+ /* Reset the current trip point */
+ DeviceExtension->TripPointValue = BATTERY_UNKNOWN_CAPACITY;
+
+ /* Check what ARs have to be done */
+ ArFlag = DeviceExtension->ArFlag;
+
+ /* New battery inserted, reset lock value */
+ if (ArFlag & CMBATT_AR_INSERT) InterlockedExchange(&DeviceExtension->ArLockValue, 0);
+
+ /* Check if the battery may have been removed */
+ if (ArFlag & CMBATT_AR_REMOVE) DeviceExtension->Tag = 0;
+
+ /* Check if there's been any sort of change to the battery */
+ if (ArFlag & CMBATT_AR_NOTIFY)
+ {
+ /* We'll probably end up re-evaluating _BIF and _BST */
+ DeviceExtension->NotifySent = TRUE;
+ BatteryClassStatusNotify(DeviceExtension->ClassData);
+ }
+ }
+ else if (DeviceExtension->ArFlag & CMBATT_AR_NOTIFY)
+ {
+ /* The only known notification is AC/DC change. Loop device objects. */
+ for (DeviceObject = DeviceExtension->FdoDeviceObject->DriverObject->DeviceObject;
+ DeviceObject;
+ DeviceObject = DeviceObject->NextDevice)
+ {
+ /* Is this a battery? */
+ FdoExtension = DeviceObject->DeviceExtension;
+ if (FdoExtension->FdoType == CmBattBattery)
+ {
+ /* Send a notification to the class driver */
+ FdoExtension->NotifySent = TRUE;
+ BatteryClassStatusNotify(FdoExtension->ClassData);
+ }
+ }
+ }
+
+ /* ARs have been processed */
+ DeviceExtension->ArFlag = 0;
}
VOID
@@ -74,7 +273,7 @@ CmBattUnload(IN PDRIVER_OBJECT DriverObject)
NTSTATUS
NTAPI
-CmBattVerifyStaticInfo(ULONG StaData,
+CmBattVerifyStaticInfo(PCMBATT_DEVICE_EXTENSION DeviceExtension,
ULONG BatteryTag)
{
UNIMPLEMENTED;
@@ -146,71 +345,896 @@ Complete:
NTSTATUS
NTAPI
-CmBattIoctl(PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
+CmBattIoctl(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ PCMBATT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
+ NTSTATUS Status;
+ PIO_STACK_LOCATION IoStackLocation;
+ ULONG IoControlCode, OutputBufferLength, InputBufferLength;
+ PAGED_CODE();
+ if (CmBattDebug & 2) DbgPrint("CmBattIoctl\n");
+
+ /* Acquire the remove lock */
+ Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, 0);
+ if (!NT_SUCCESS(Status))
+ {
+ /* It's too late, fail */
+ Irp->IoStatus.Status = STATUS_DEVICE_REMOVED;
+ IofCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_DEVICE_REMOVED;
+ }
+
+ /* There's nothing to do for an AC adapter */
+ if (DeviceExtension->FdoType == CmBattAcAdapter)
+ {
+ /* Pass it down, and release the remove lock */
+ IoSkipCurrentIrpStackLocation(Irp);
+ Status = IoCallDriver(DeviceExtension->AttachedDevice, Irp);
+ IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp);
+ return Status;
+ }
+
+ /* Send to class driver */
+ Status = BatteryClassIoctl(DeviceExtension->ClassData, Irp);
+ if (Status == STATUS_NOT_SUPPORTED)
+ {
+ /* Read IOCTL information from IRP stack */
+ IoStackLocation = IoGetCurrentIrpStackLocation(Irp);
+ IoControlCode = IoStackLocation->Parameters.DeviceIoControl.IoControlCode;
+ OutputBufferLength = IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength;
+ InputBufferLength = IoStackLocation->Parameters.DeviceIoControl.InputBufferLength;
+ if (CmBattDebug & 4)
+ DbgPrint("CmBattIoctl: Received Direct Access IOCTL %x\n", IoControlCode);
+
+ /* Handle internal IOCTLs */
+ switch (IoControlCode)
+ {
+ case IOCTL_BATTERY_QUERY_UNIQUE_ID:
+
+ /* Data is 4 bytes long */
+ if (OutputBufferLength == sizeof(ULONG))
+ {
+ /* Query it */
+ Status = CmBattGetUniqueId(DeviceExtension->PdoDeviceObject,
+ Irp->AssociatedIrp.SystemBuffer);
+ if (NT_SUCCESS(Status)) Irp->IoStatus.Information = sizeof(ULONG);
+ }
+ else
+ {
+ /* Buffer size invalid */
+ Status = STATUS_INVALID_BUFFER_SIZE;
+ }
+ break;
+
+ case IOCTL_BATTERY_QUERY_STA:
+
+ /* Data is 4 bytes long */
+ if (OutputBufferLength == sizeof(ULONG))
+ {
+ /* Query it */
+ Status = CmBattGetStaData(DeviceExtension->PdoDeviceObject,
+ Irp->AssociatedIrp.SystemBuffer);
+ if (NT_SUCCESS(Status)) Irp->IoStatus.Information = sizeof(ULONG);
+ }
+ else
+ {
+ /* Buffer size invalid */
+ Status = STATUS_INVALID_BUFFER_SIZE;
+ }
+ break;
+
+ case IOCTL_BATTERY_QUERY_PSR:
+
+ /* Data is 4 bytes long */
+ if (OutputBufferLength == sizeof(ULONG))
+ {
+ /* Do we have an AC adapter? */
+ if (AcAdapterPdo)
+ {
+ /* Query it */
+ Status = CmBattGetPsrData(AcAdapterPdo,
+ Irp->AssociatedIrp.SystemBuffer);
+ if (NT_SUCCESS(Status)) Irp->IoStatus.Information = sizeof(ULONG);
+ }
+ else
+ {
+ /* No adapter, just a battery, so fail */
+ Status = STATUS_NO_SUCH_DEVICE;
+ }
+ }
+ else
+ {
+ /* Buffer size invalid */
+ Status = STATUS_INVALID_BUFFER_SIZE;
+ }
+ break;
+
+ case IOCTL_BATTERY_SET_TRIP_POINT:
+
+ /* Data is 4 bytes long */
+ if (InputBufferLength == sizeof(ULONG))
+ {
+ /* Query it */
+ Status = CmBattSetTripPpoint(DeviceExtension,
+ *(PULONG)Irp->AssociatedIrp.SystemBuffer);
+ Irp->IoStatus.Information = 0;
+ }
+ else
+ {
+ /* Buffer size invalid */
+ Status = STATUS_INVALID_BUFFER_SIZE;
+ }
+ break;
+
+ case IOCTL_BATTERY_QUERY_BIF:
+
+ /* Data is 1060 bytes long */
+ if (OutputBufferLength == sizeof(ACPI_BIF_DATA))
+ {
+ /* Query it */
+ Status = CmBattGetBifData(DeviceExtension,
+ Irp->AssociatedIrp.SystemBuffer);
+ if (NT_SUCCESS(Status)) Irp->IoStatus.Information = sizeof(ACPI_BIF_DATA);
+ }
+ else
+ {
+ /* Buffer size invalid */
+ Status = STATUS_INVALID_BUFFER_SIZE;
+ }
+ break;
+
+ case IOCTL_BATTERY_QUERY_BST:
+
+ /* Data is 16 bytes long */
+ if (OutputBufferLength == sizeof(ACPI_BST_DATA))
+ {
+ /* Query it */
+ Status = CmBattGetBstData(DeviceExtension,
+ Irp->AssociatedIrp.SystemBuffer);
+ if (NT_SUCCESS(Status)) Irp->IoStatus.Information = sizeof(ACPI_BST_DATA);
+ }
+ else
+ {
+ /* Buffer size invalid */
+ Status = STATUS_INVALID_BUFFER_SIZE;
+ }
+ break;
+
+ default:
+
+ /* Unknown, let us pass it on to ACPI */
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattIoctl: Unknown IOCTL %x\n", IoControlCode);
+ break;
+ }
+
+ /* Did someone pick it up? */
+ if (Status != STATUS_NOT_SUPPORTED)
+ {
+ /* Complete the request */
+ Irp->IoStatus.Status = Status;
+ IofCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+ else
+ {
+ /* Still unsupported, try ACPI */
+ IoSkipCurrentIrpStackLocation(Irp);
+ Status = IoCallDriver(DeviceExtension->AttachedDevice, Irp);
+ }
+ }
+
+ /* Release the remove lock and return status */
+ IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp);
+ return Status;
}
NTSTATUS
NTAPI
-CmBattQueryTag(PCMBATT_DEVICE_EXTENSION DeviceExtension,
- PULONG BatteryTag)
+CmBattQueryTag(IN PCMBATT_DEVICE_EXTENSION DeviceExtension,
+ OUT PULONG Tag)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ PDEVICE_OBJECT PdoDevice;
+ ULONG StaData;
+ ULONG NewTag;
+ NTSTATUS Status;
+ PAGED_CODE();
+ if (CmBattDebug & (CMBATT_ACPI_WARNING | CMBATT_GENERIC_INFO))
+ DbgPrint("CmBattQueryTag - Tag (%d), Battery %x, Device %d\n",
+ *Tag, DeviceExtension, DeviceExtension->DeviceId);
+
+ /* Get PDO and clear notification flag */
+ PdoDevice = DeviceExtension->PdoDeviceObject;
+ DeviceExtension->NotifySent = 0;
+
+ /* Get _STA from PDO (we need the machine status, not the battery status) */
+ Status = CmBattGetStaData(PdoDevice, &StaData);
+ if (NT_SUCCESS(Status))
+ {
+ /* Is a battery present? */
+ if (StaData & ACPI_STA_BATTERY_PRESENT)
+ {
+ /* Do we not have a tag yet? */
+ if (!DeviceExtension->Tag)
+ {
+ /* Set the new tag value, reset tags if we reached the maximum */
+ NewTag = DeviceExtension->TagData;
+ if (DeviceExtension->TagData++ == 0xFFFFFFFF) NewTag = 1;
+ DeviceExtension->Tag = NewTag;
+ if (CmBattDebug & CMBATT_GENERIC_INFO)
+ DbgPrint("CmBattQueryTag - New Tag: (%d)\n", DeviceExtension->Tag);
+
+ /* Reset trip point data */
+ DeviceExtension->TripPointOld = 0;
+ DeviceExtension->TripPointValue = BATTERY_UNKNOWN_CAPACITY;
+
+ /* Clear AR lock and set new interrupt time */
+ InterlockedExchange(&DeviceExtension->ArLockValue, 0);
+ DeviceExtension->InterruptTime = KeQueryInterruptTime();
+ }
+ }
+ else
+ {
+ /* No battery, so no tag */
+ DeviceExtension->Tag = 0;
+ Status = STATUS_NO_SUCH_DEVICE;
+ }
+ }
+
+ /* Return the tag and status result */
+ *Tag = DeviceExtension->Tag;
+ if (CmBattDebug & CMBATT_ACPI_WARNING)
+ DbgPrint("CmBattQueryTag: Returning Tag: 0x%x, status 0x%x\n", *Tag, Status);
+ return Status;
}
NTSTATUS
NTAPI
-CmBattDisableStatusNotify(PCMBATT_DEVICE_EXTENSION DeviceExtension)
+CmBattDisableStatusNotify(IN PCMBATT_DEVICE_EXTENSION DeviceExtension)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ NTSTATUS Status;
+ PAGED_CODE();
+ if (CmBattDebug & 0xA) DbgPrint("CmBattDisableStatusNotify\n");
+
+ /* Do we have a trip point */
+ if (DeviceExtension->TripPointSet)
+ {
+ /* Is there a current value set? */
+ if (DeviceExtension->TripPointValue)
+ {
+ /* Reset it back to 0 */
+ DeviceExtension->TripPointValue = 0;
+ Status = CmBattSetTripPpoint(DeviceExtension, 0);
+ if (!NT_SUCCESS(Status))
+ {
+ /* If it failed, set unknown/invalid value */
+ DeviceExtension->TripPointValue = BATTERY_UNKNOWN_CAPACITY;
+ if (CmBattDebug & 8)
+ DbgPrint("CmBattDisableStatusNotify: SetTripPoint failed - %x\n", Status);
+ }
+ }
+ else
+ {
+ /* No trip point set, so this is a successful no-op */
+ Status = STATUS_SUCCESS;
+ }
+ }
+ else
+ {
+ /* Nothing we can do */
+ Status = STATUS_OBJECT_NAME_NOT_FOUND;
+ }
+
+ /* Return status */
+ return Status;
}
NTSTATUS
NTAPI
-CmBattSetStatusNotify(PCMBATT_DEVICE_EXTENSION DeviceExtension,
- ULONG BatteryTag,
- PBATTERY_NOTIFY BatteryNotify)
+CmBattSetStatusNotify(IN PCMBATT_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG BatteryTag,
+ IN PBATTERY_NOTIFY BatteryNotify)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ NTSTATUS Status;
+ ACPI_BST_DATA BstData;
+ ULONG Capacity, NewTripPoint, TripPoint, DesignVoltage;
+ BOOLEAN Charging;
+ PAGED_CODE();
+ if (CmBattDebug & (CMBATT_ACPI_WARNING | CMBATT_GENERIC_INFO))
+ DbgPrint("CmBattSetStatusNotify: Tag (%d) Target(0x%x)\n",
+ BatteryTag, BatteryNotify->LowCapacity);
+
+ /* Update any ACPI evaluations */
+ Status = CmBattVerifyStaticInfo(DeviceExtension, BatteryTag);
+ if (!NT_SUCCESS(Status)) return Status;
+
+ /* Trip point not supported, fail */
+ if (!DeviceExtension->TripPointSet) return STATUS_OBJECT_NAME_NOT_FOUND;
+
+ /* Are both capacities known? */
+ if ((BatteryNotify->HighCapacity == BATTERY_UNKNOWN_CAPACITY) ||
+ (BatteryNotify->LowCapacity == BATTERY_UNKNOWN_CAPACITY))
+ {
+ /* We can't set trip points without these */
+ if (CmBattDebug & CMBATT_GENERIC_WARNING)
+ DbgPrint("CmBattSetStatusNotify: Failing request because of BATTERY_UNKNOWN_CAPACITY.\n");
+ return STATUS_NOT_SUPPORTED;
+ }
+
+ /* Is the battery charging? */
+ Charging = DeviceExtension->BstData.State & ACPI_BATT_STAT_CHARGING;
+ if (Charging)
+ {
+ /* Then the trip point is when we hit the cap */
+ Capacity = BatteryNotify->HighCapacity;
+ NewTripPoint = BatteryNotify->HighCapacity;
+ }
+ else
+ {
+ /* Otherwise it's when we discharge to the bottom */
+ Capacity = BatteryNotify->LowCapacity;
+ NewTripPoint = BatteryNotify->LowCapacity;
+ }
+
+ /* Do we have data in Amps or Watts? */
+ if (DeviceExtension->BifData.PowerUnit == ACPI_BATT_POWER_UNIT_AMPS)
+ {
+ /* We need the voltage to do the conversion */
+ DesignVoltage = DeviceExtension->BifData.DesignVoltage;
+ if ((DesignVoltage != BATTERY_UNKNOWN_VOLTAGE) && (DesignVoltage))
+ {
+ /* Convert from mAh into Ah */
+ TripPoint = 1000 * NewTripPoint;
+ if (Charging)
+ {
+ /* Scale the high trip point */
+ NewTripPoint = (TripPoint + 500) / DesignVoltage + ((TripPoint + 500) % DesignVoltage != 0);
+ }
+ else
+ {
+ /* Scale the low trip point */
+ NewTripPoint = (TripPoint - 500) / DesignVoltage - ((TripPoint - 500) % DesignVoltage == 0);
+ }
+ }
+ else
+ {
+ /* Without knowing the voltage, Amps are not enough data on consumption */
+ Status = STATUS_NOT_SUPPORTED;
+ if (CmBattDebug & CMBATT_ACPI_WARNING)
+ DbgPrint("CmBattSetStatusNotify: Can't calculate BTP, DesignVoltage = 0x%08x\n",
+ DesignVoltage);
+ }
+ }
+ else if (Charging)
+ {
+ /* Make it trip just one past the charge cap */
+ ++NewTripPoint;
+ }
+ else if (NewTripPoint > 0)
+ {
+ /* Make it trip just one below the drain cap */
+ --NewTripPoint;
+ }
+
+ /* Do we actually have a new trip point? */
+ if (NewTripPoint == DeviceExtension->TripPointValue)
+ {
+ /* No, so there is no work to be done */
+ if (CmBattDebug & CMBATT_GENERIC_STATUS)
+ DbgPrint("CmBattSetStatusNotify: Keeping original setting: %X\n", DeviceExtension->TripPointValue);
+ return STATUS_SUCCESS;
+ }
+
+ /* Set the trip point with ACPI and check for success */
+ DeviceExtension->TripPointValue = NewTripPoint;
+ Status = CmBattSetTripPpoint(DeviceExtension, NewTripPoint);
+ if (!(NewTripPoint) && (Capacity)) Status = STATUS_NOT_SUPPORTED;
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed to set the trip point, or there wasn't one settable */
+ DeviceExtension->TripPointValue = BATTERY_UNKNOWN_CAPACITY;
+ if (CmBattDebug & (CMBATT_GENERIC_WARNING | CMBATT_ACPI_WARNING))
+ DbgPrint("CmBattSetStatusNotify: SetTripPoint failed - %x\n", Status);
+ return Status;
+ }
+
+ /* Read the new BST data to see the latest state */
+ Status = CmBattGetBstData(DeviceExtension, &BstData);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We'll return failure to the caller */
+ if (CmBattDebug & (CMBATT_GENERIC_WARNING | CMBATT_ACPI_WARNING))
+ DbgPrint("CmBattSetStatusNotify: GetBstData - %x\n", Status);
+ }
+ else if ((Charging) && (BstData.RemainingCapacity >= NewTripPoint))
+ {
+ /* We are charging and our capacity is past the trip point, so trip now */
+ if (CmBattDebug & CMBATT_GENERIC_WARNING)
+ DbgPrint("CmBattSetStatusNotify: Trip point already crossed (1): TP = %08x, remaining capacity = %08x\n",
+ NewTripPoint, BstData.RemainingCapacity);
+ CmBattNotifyHandler(DeviceExtension, ACPI_BATT_NOTIFY_STATUS);
+ }
+ else if ((BstData.RemainingCapacity) && (Capacity))
+ {
+ /* We are discharging, and our capacity is below the trip point, trip now */
+ if (CmBattDebug & CMBATT_GENERIC_WARNING)
+ DbgPrint("CmBattSetStatusNotify: Trip point already crossed (1): TP = %08x, remaining capacity = %08x\n",
+ NewTripPoint, BstData.RemainingCapacity);
+ CmBattNotifyHandler(DeviceExtension, ACPI_BATT_NOTIFY_STATUS);
+ }
+
+ /* All should've went well if we got here, unless BST failed... return! */
+ if (CmBattDebug & CMBATT_GENERIC_STATUS)
+ DbgPrint("CmBattSetStatusNotify: Want %X CurrentCap %X\n",
+ Capacity, DeviceExtension->RemainingCapacity);
+ if (CmBattDebug & CMBATT_ACPI_WARNING)
+ DbgPrint("CmBattSetStatusNotify: Set to: [%#08lx][%#08lx][%#08lx] Status %x\n",
+ BatteryNotify->PowerState,
+ BatteryNotify->LowCapacity,
+ BatteryNotify->HighCapacity);
+ return Status;
}
NTSTATUS
NTAPI
-CmBattGetBatteryStatus(PCMBATT_DEVICE_EXTENSION DeviceExtension,
- ULONG BatteryTag)
+CmBattGetBatteryStatus(IN PCMBATT_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG Tag)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ ULONG PsrData = 0;
+ NTSTATUS Status;
+ ULONG BstState;
+ ULONG DesignVoltage, PresentRate, RemainingCapacity;
+ PAGED_CODE();
+ if (CmBattDebug & CMBATT_GENERIC_INFO)
+ DbgPrint("CmBattGetBatteryStatus - CmBatt (%08x) Tag (%d)\n", DeviceExtension, Tag);
+
+ /* Validate ACPI data */
+ Status = CmBattVerifyStaticInfo(DeviceExtension, Tag);
+ if (!NT_SUCCESS(Status)) return Status;
+
+ /* Check for delayed status notifications */
+ if (DeviceExtension->DelayNotification)
+ {
+ /* Process them now and don't do any other work */
+ CmBattNotifyHandler(DeviceExtension, ACPI_BATT_NOTIFY_STATUS);
+ return Status;
+ }
+
+ /* Get _BST from ACPI */
+ Status = CmBattGetBstData(DeviceExtension, &DeviceExtension->BstData);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Fail */
+ InterlockedExchange(&DeviceExtension->ArLockValue, 0);
+ return Status;
+ }
+
+ /* Clear current BST information */
+ DeviceExtension->State = 0;
+ DeviceExtension->RemainingCapacity = 0;
+ DeviceExtension->PresentVoltage = 0;
+ DeviceExtension->Rate = 0;
+
+ /* Get battery state */
+ BstState = DeviceExtension->BstData.State;
+
+ /* Is the battery both charging and discharging? */
+ if ((BstState & ACPI_BATT_STAT_DISCHARG) && (BstState & ACPI_BATT_STAT_CHARGING) &&
+ (CmBattDebug & (CMBATT_ACPI_WARNING | CMBATT_GENERIC_WARNING)))
+ DbgPrint("************************ ACPI BIOS BUG ********************\n* "
+ "CmBattGetBatteryStatus: Invalid state: _BST method returned 0x%08x for Battery State.\n"
+ "* One battery cannot be charging and discharging at the same time.\n",
+ BstState);
+
+ /* Is the battery discharging? */
+ if (BstState & ACPI_BATT_STAT_DISCHARG)
+ {
+ /* Set power state and check if it just started discharging now */
+ DeviceExtension->State |= BATTERY_DISCHARGING;
+ if (!(DeviceExtension->State & ACPI_BATT_STAT_DISCHARG))
+ {
+ /* Remember the time when the state changed */
+ DeviceExtension->InterruptTime = KeQueryInterruptTime();
+ }
+ }
+ else if (BstState & ACPI_BATT_STAT_CHARGING)
+ {
+ /* Battery is charging, update power state */
+ DeviceExtension->State |= (BATTERY_CHARGING | BATTERY_POWER_ON_LINE);
+ }
+
+ /* Is the battery in a critical state? */
+ if (BstState & ACPI_BATT_STAT_CRITICAL) DeviceExtension->State |= BATTERY_CRITICAL;
+
+ /* Read the voltage data */
+ DeviceExtension->PresentVoltage = DeviceExtension->BstData.PresentVoltage;
+
+ /* Check if we have an A/C adapter */
+ if (AcAdapterPdo)
+ {
+ /* Query information on it */
+ CmBattGetPsrData(AcAdapterPdo, &PsrData);
+ }
+ else
+ {
+ /* Otherwise, check if the battery is charging */
+ if (BstState & ACPI_BATT_STAT_CHARGING)
+ {
+ /* Then we'll assume there's a charger */
+ PsrData = 1;
+ }
+ else
+ {
+ /* Assume no charger */
+ PsrData = 0;
+ }
+ }
+
+ /* Is there a charger? */
+ if (PsrData)
+ {
+ /* Set the power state flag to reflect this */
+ DeviceExtension->State |= BATTERY_POWER_ON_LINE;
+ if (CmBattDebug & (CMBATT_GENERIC_INFO | CMBATT_GENERIC_STATUS))
+ DbgPrint("CmBattGetBatteryStatus: AC adapter is connected\n");
+ }
+ else if (CmBattDebug & (CMBATT_GENERIC_INFO | CMBATT_GENERIC_STATUS))
+ {
+ DbgPrint("CmBattGetBatteryStatus: AC adapter is NOT connected\n");
+ }
+
+ /* Get some data we'll need */
+ DesignVoltage = DeviceExtension->BifData.DesignVoltage;
+ PresentRate = DeviceExtension->BstData.PresentRate;
+ RemainingCapacity = DeviceExtension->BstData.RemainingCapacity;
+
+ /* Check if we have battery data in Watts instead of Amps */
+ if (DeviceExtension->BifData.PowerUnit == ACPI_BATT_POWER_UNIT_WATTS)
+ {
+ /* Get the data from the BST */
+ DeviceExtension->RemainingCapacity = RemainingCapacity;
+ DeviceExtension->Rate = PresentRate;
+
+ /* Check if the rate is invalid */
+ if (PresentRate > CM_MAX_VALUE)
+ {
+ /* Set an unknown rate and don't touch the old value */
+ DeviceExtension->Rate = BATTERY_UNKNOWN_RATE;
+ if ((PresentRate != CM_UNKNOWN_VALUE) && (CmBattDebug & CMBATT_ACPI_WARNING))
+ {
+ DbgPrint("CmBattGetBatteryStatus - Rate is greater than CM_MAX_VALUE\n");
+ DbgPrint("---------------------- PresentRate = 0x%08x\n", PresentRate);
+ }
+ }
+ }
+ else if ((DesignVoltage != CM_UNKNOWN_VALUE) && (DesignVoltage))
+ {
+ /* We have voltage data, what about capacity? */
+ if (RemainingCapacity == CM_UNKNOWN_VALUE)
+ {
+ /* Unable to calculate it */
+ DeviceExtension->RemainingCapacity = BATTERY_UNKNOWN_CAPACITY;
+ if (CmBattDebug & CMBATT_ACPI_WARNING)
+ {
+ DbgPrint("CmBattGetBatteryStatus - Can't calculate RemainingCapacity \n");
+ DbgPrint("---------------------- RemainingCapacity = CM_UNKNOWN_VALUE\n");
+ }
+ }
+ else
+ {
+ /* Compute the capacity with the information we have */
+ DeviceExtension->RemainingCapacity = (DesignVoltage * RemainingCapacity + 500) / 1000;
+ }
+
+ /* Check if we have a rate */
+ if (PresentRate != CM_UNKNOWN_VALUE)
+ {
+ /* Make sure the rate isn't too large */
+ if (PresentRate > (-500 / DesignVoltage))
+ {
+ /* It is, so set unknown state */
+ DeviceExtension->Rate = BATTERY_UNKNOWN_RATE;
+ if (CmBattDebug & CMBATT_ACPI_WARNING)
+ {
+ DbgPrint("CmBattGetBatteryStatus - Can't calculate Rate \n");
+ DbgPrint("---------------------- Overflow: PresentRate = 0x%08x\n", PresentRate);
+ }
+ }
+
+ /* Compute the rate */
+ DeviceExtension->Rate = (PresentRate * DesignVoltage + 500) / 1000;
+ }
+ else
+ {
+ /* We don't have a rate, so set unknown value */
+ DeviceExtension->Rate = BATTERY_UNKNOWN_RATE;
+ if (CmBattDebug & CMBATT_ACPI_WARNING)
+ {
+ DbgPrint("CmBattGetBatteryStatus - Can't calculate Rate \n");
+ DbgPrint("---------------------- Present Rate = CM_UNKNOWN_VALUE\n");
+ }
+ }
+ }
+ else
+ {
+ /* We have no rate, and no capacity, set unknown values */
+ DeviceExtension->Rate = BATTERY_UNKNOWN_RATE;
+ DeviceExtension->RemainingCapacity = BATTERY_UNKNOWN_CAPACITY;
+ if (CmBattDebug & CMBATT_ACPI_WARNING)
+ {
+ DbgPrint("CmBattGetBatteryStatus - Can't calculate RemainingCapacity and Rate \n");
+ DbgPrint("---------------------- DesignVoltage = 0x%08x\n", DesignVoltage);
+ }
+ }
+
+ /* Check if we have an unknown rate */
+ if (DeviceExtension->Rate == BATTERY_UNKNOWN_RATE)
+ {
+ /* The battery is discharging but we don't know by how much... this is bad! */
+ if ((BstState & ACPI_BATT_STAT_DISCHARG) &&
+ (CmBattDebug & (CMBATT_ACPI_WARNING | CMBATT_GENERIC_WARNING)))
+ DbgPrint("CmBattGetBatteryStatus: battery rate is unkown when battery is not charging!\n");
+ }
+ else if (DeviceExtension->State & BATTERY_DISCHARGING)
+ {
+ /* The battery is discharging, so treat the rate as a negative rate */
+ DeviceExtension->Rate = -DeviceExtension->Rate;
+ }
+ else if (!(DeviceExtension->State & BATTERY_CHARGING) && (DeviceExtension->Rate))
+ {
+ /* We are not charging, not discharging, but have a rate? Ignore it! */
+ if (CmBattDebug & CMBATT_GENERIC_WARNING)
+ DbgPrint("CmBattGetBatteryStatus: battery is not charging or discharging, but rate = %x\n",
+ DeviceExtension->Rate);
+ DeviceExtension->Rate = 0;
+ }
+
+ /* Done */
+ return STATUS_SUCCESS;
}
NTSTATUS
NTAPI
-CmBattQueryInformation(PCMBATT_DEVICE_EXTENSION DeviceExtension,
- ULONG BatteryTag,
- BATTERY_QUERY_INFORMATION_LEVEL Level,
- OPTIONAL LONG AtRate,
- PVOID Buffer,
- ULONG BufferLength,
- PULONG ReturnedLength)
+CmBattQueryInformation(IN PCMBATT_DEVICE_EXTENSION FdoExtension,
+ IN ULONG Tag,
+ IN BATTERY_QUERY_INFORMATION_LEVEL InfoLevel,
+ IN OPTIONAL LONG AtRate,
+ IN PVOID Buffer,
+ IN ULONG BufferLength,
+ OUT PULONG ReturnedLength)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ NTSTATUS Status;
+ PVOID QueryData = NULL;
+ ULONG QueryLength = 0;
+ ULONG RemainingTime = 0;
+ ANSI_STRING TempString;
+ UNICODE_STRING TempString2;
+ WCHAR InfoBuffer[256];
+ WCHAR TempBuffer[256];
+ UNICODE_STRING InfoString;
+ ULONG RemainingCapacity;
+ BATTERY_REPORTING_SCALE BatteryReportingScale[2];
+ LONG Rate;
+ PAGED_CODE();
+ if (CmBattDebug & (CMBATT_ACPI_WARNING | CMBATT_GENERIC_INFO))
+ DbgPrint("CmBattQueryInformation - Tag (%d) Device %d, Informationlevel %d\n",
+ Tag,
+ FdoExtension->DeviceId,
+ InfoLevel);
+
+ /* Check ACPI Data */
+ Status = CmBattVerifyStaticInfo(FdoExtension, Tag);
+ if (!NT_SUCCESS(Status)) return Status;
+
+ /* Check what caller wants */
+ switch (InfoLevel)
+ {
+ case BatteryInformation:
+ /* Just return our static information */
+ QueryData = &FdoExtension->BatteryInformation;
+ QueryLength = sizeof(BATTERY_INFORMATION);
+ break;
+
+ case BatteryGranularityInformation:
+
+ /* Return our static information, we have two scales */
+ BatteryReportingScale[0].Granularity = FdoExtension->BatteryCapacityGranularity1;
+ BatteryReportingScale[0].Capacity = FdoExtension->BatteryInformation.DefaultAlert1;
+ BatteryReportingScale[1].Granularity = FdoExtension->BatteryCapacityGranularity2;
+ BatteryReportingScale[1].Capacity = FdoExtension->BatteryInformation.DesignedCapacity;
+ QueryData = BatteryReportingScale;
+ QueryLength = sizeof(BATTERY_REPORTING_SCALE) * 2;
+ break;
+
+ case BatteryEstimatedTime:
+
+ /* Check if it's been more than 2 1/2 minutes since the last change */
+ if ((KeQueryInterruptTime() - 150000000) > (FdoExtension->InterruptTime))
+ {
+ /* Get new battery status */
+ CmBattGetBatteryStatus(FdoExtension, FdoExtension->Tag);
+
+ /* If the caller didn't specify a rate, use our static one */
+ Rate = AtRate;
+ if (!Rate) Rate = FdoExtension->Rate;
+
+ /* If we don't have a valid negative rate, use unknown value */
+ if (Rate >= 0) Rate = BATTERY_UNKNOWN_RATE;
+
+ /* Grab the remaining capacity */
+ RemainingCapacity = FdoExtension->RemainingCapacity;
+
+ /* See if we don't know one or the other */
+ if ((Rate == BATTERY_UNKNOWN_RATE) ||
+ (RemainingCapacity == BATTERY_UNKNOWN_CAPACITY))
+ {
+ /* If the battery is discharging, we can't give out a time */
+ if ((FdoExtension->BstData.State & ACPI_BATT_STAT_DISCHARG) &&
+ (CmBattDebug & CMBATT_GENERIC_WARNING))
+ DbgPrint("CmBattQueryInformation: Can't calculate EstimatedTime.\n");
+
+ /* Check if we don't have a rate and capacity is going down */
+ if ((FdoExtension->Rate == BATTERY_UNKNOWN_RATE) &&
+ (FdoExtension->BstData.State & ACPI_BATT_STAT_DISCHARG))
+ {
+ /* We have to fail, since we lack data */
+ Status = STATUS_INVALID_DEVICE_REQUEST;
+ if (CmBattDebug & CMBATT_GENERIC_WARNING)
+ DbgPrint("---------------------- PresentRate = BATTERY_UNKNOWN_RATE\n");
+ }
+
+ /* If we don't have capacity, the rate is useless */
+ if (RemainingCapacity == BATTERY_UNKNOWN_CAPACITY)
+ {
+ /* We have to fail the request */
+ Status = STATUS_INVALID_DEVICE_REQUEST;
+ if (CmBattDebug & CMBATT_GENERIC_WARNING)
+ DbgPrint("---------------------- RemainingCapacity = BATTERY_UNKNOWN_CAPACITY\n");
+ }
+ }
+ else
+ {
+ /* We have data, but is it valid? */
+ if (RemainingCapacity > 0x123456)
+ {
+ /* The capacity seems bogus, so don't use it */
+ if (CmBattDebug & CMBATT_ACPI_WARNING)
+ DbgPrint("CmBattQueryInformation: Data Overflow in calculating Remaining Capacity.\n");
+ }
+ else
+ {
+ /* Compute the remaining time in seconds, based on rate */
+ RemainingTime = (RemainingCapacity * 3600) / -Rate;
+ }
+ }
+ }
+
+ /* Return the remaining time */
+ QueryData = &RemainingTime;
+ QueryLength = sizeof(ULONG);
+ break;
+
+ case BatteryDeviceName:
+
+ /* Build the model number string */
+ RtlInitAnsiString(&TempString, FdoExtension->ModelNumber);
+
+ /* Convert it to Unicode */
+ InfoString.Buffer = InfoBuffer;
+ InfoString.MaximumLength = sizeof(InfoBuffer);
+ Status = RtlAnsiStringToUnicodeString(&InfoString, &TempString, 0);
+
+ /* Return the unicode buffer */
+ QueryData = InfoString.Buffer;
+ QueryLength = InfoString.Length;
+ break;
+
+ case BatteryTemperature:
+ case BatteryManufactureDate:
+
+ /* We don't support these */
+ Status = STATUS_INVALID_DEVICE_REQUEST;
+ break;
+
+ case BatteryManufactureName:
+
+ /* Build the OEM info string */
+ RtlInitAnsiString(&TempString, FdoExtension->OemInfo);
+
+ /* Convert it to Unicode */
+ InfoString.Buffer = InfoBuffer;
+ InfoString.MaximumLength = sizeof(InfoBuffer);
+ Status = RtlAnsiStringToUnicodeString(&InfoString, &TempString, 0);
+
+ /* Return the unicode buffer */
+ QueryData = InfoString.Buffer;
+ QueryLength = InfoString.Length;
+ break;
+
+ case BatteryUniqueID:
+
+ /* Build the serial number string */
+ RtlInitAnsiString(&TempString, FdoExtension->SerialNumber);
+
+ /* Convert it to Unicode */
+ InfoString.Buffer = InfoBuffer;
+ InfoString.MaximumLength = sizeof(InfoBuffer);
+ RtlAnsiStringToUnicodeString(&InfoString, &TempString, 0);
+
+ /* Setup a temporary string for concatenation */
+ TempString2.Buffer = TempBuffer;
+ TempString2.MaximumLength = sizeof(TempBuffer);
+
+ /* Check if there's an OEM string */
+ if (FdoExtension->OemInfo[0])
+ {
+ /* Build the OEM info string */
+ RtlInitAnsiString(&TempString, FdoExtension->OemInfo);
+
+ /* Convert it to Unicode and append it */
+ RtlAnsiStringToUnicodeString(&TempString2, &TempString, 0);
+ RtlAppendUnicodeStringToString(&InfoString, &TempString2);
+ }
+
+ /* Build the model number string */
+ RtlInitAnsiString(&TempString, FdoExtension->ModelNumber);
+
+ /* Convert it to Unicode and append it */
+ RtlAnsiStringToUnicodeString(&TempString2, &TempString, 0);
+ RtlAppendUnicodeStringToString(&InfoString, &TempString2);
+
+ /* Return the final appended string */
+ QueryData = InfoString.Buffer;
+ QueryLength = InfoString.Length;
+ break;
+
+ default:
+
+ /* Everything else is unknown */
+ Status = STATUS_INVALID_PARAMETER;
+ break;
+ }
+
+ /* Return the required length and check if the caller supplied enough */
+ *ReturnedLength = QueryLength;
+ if (BufferLength < QueryLength) Status = STATUS_BUFFER_TOO_SMALL;
+
+ /* Copy the data if there's enough space and it exists */
+ if ((NT_SUCCESS(Status)) && (QueryData)) RtlCopyMemory(Buffer, QueryData, QueryLength);
+
+ /* Return function result */
+ return Status;
}
NTSTATUS
NTAPI
-CmBattQueryStatus(PCMBATT_DEVICE_EXTENSION DeviceExtension,
- ULONG BatteryTag,
- PBATTERY_STATUS BatteryStatus)
+CmBattQueryStatus(IN PCMBATT_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG Tag,
+ IN PBATTERY_STATUS BatteryStatus)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ NTSTATUS Status;
+ PAGED_CODE();
+ if (CmBattDebug & (CMBATT_ACPI_WARNING | CMBATT_GENERIC_INFO))
+ DbgPrint("CmBattQueryStatus - Tag (%d) Device %x\n", Tag, DeviceExtension->DeviceId);
+
+ /* Query ACPI information */
+ Status = CmBattGetBatteryStatus(DeviceExtension, Tag);
+ if (NT_SUCCESS(Status))
+ {
+ BatteryStatus->PowerState = DeviceExtension->State;
+ BatteryStatus->Capacity = DeviceExtension->RemainingCapacity;
+ BatteryStatus->Voltage = DeviceExtension->PresentVoltage;
+ BatteryStatus->Rate = DeviceExtension->Rate;
+ }
+
+ /* Return status */
+ if (CmBattDebug & (CMBATT_GENERIC_INFO))
+ DbgPrint("CmBattQueryStatus: Returning [%#08lx][%#08lx][%#08lx][%#08lx]\n",
+ BatteryStatus->PowerState,
+ BatteryStatus->Capacity,
+ BatteryStatus->Voltage,
+ BatteryStatus->Rate);
+ return Status;
}
NTSTATUS
@@ -233,28 +1257,24 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject,
{
/* Fail if we're out of memory this early */
if (CmBattDebug & CMBATT_GENERIC_WARNING)
- {
DbgPrint("CmBatt: Couldn't allocate pool for registry path.");
- }
return STATUS_INSUFFICIENT_RESOURCES;
}
/* Buffer allocated, copy the string */
RtlCopyUnicodeString(&GlobalRegistryPath, RegistryPath);
if (CmBattDebug & CMBATT_GENERIC_INFO)
- {
DbgPrint("CmBatt DriverEntry - Obj (%08x) Path \"%ws\"\n",
DriverObject,
RegistryPath->Buffer);
- }
/* Setup the major dispatchers */
- DriverObject->MajorFunction[0] = CmBattOpenClose;
- DriverObject->MajorFunction[2] = CmBattOpenClose;
- DriverObject->MajorFunction[14] = CmBattIoctl;
- DriverObject->MajorFunction[22] = CmBattPowerDispatch;
- DriverObject->MajorFunction[27] = CmBattPnpDispatch;
- DriverObject->MajorFunction[23] = CmBattSystemControl;
+ DriverObject->MajorFunction[IRP_MJ_CREATE] = CmBattOpenClose;
+ DriverObject->MajorFunction[IRP_MJ_CLOSE] = CmBattOpenClose;
+ DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = CmBattIoctl;
+ DriverObject->MajorFunction[IRP_MJ_POWER] = CmBattPowerDispatch;
+ DriverObject->MajorFunction[IRP_MJ_PNP] = CmBattPnpDispatch;
+ DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = CmBattSystemControl;
/* And the unload routine */
DriverObject->DriverUnload = CmBattUnload;
@@ -276,9 +1296,7 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject,
/* No callback, fail */
CmBattPowerCallBackObject = 0;
if (CmBattDebug & CMBATT_GENERIC_WARNING)
- {
DbgPrint("CmBattRegisterPowerCallBack: failed status=0x%08x\n", Status);
- }
}
else
{
@@ -296,9 +1314,7 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject,
{
ObfDereferenceObject(CmBattPowerCallBackObject);
if (CmBattDebug & CMBATT_GENERIC_WARNING)
- {
DbgPrint("CmBattRegisterPowerCallBack: ExRegisterCallback failed.\n");
- }
}
/* All good */
diff --git a/drivers/bus/acpi/cmbatt/cmbatt.h b/drivers/bus/acpi/cmbatt/cmbatt.h
index f3583f8dd1b..8f952d20200 100644
--- a/drivers/bus/acpi/cmbatt/cmbatt.h
+++ b/drivers/bus/acpi/cmbatt/cmbatt.h
@@ -11,8 +11,27 @@
#include
#include
#include
+#include
#include
+#define IOCTL_BATTERY_QUERY_UNIQUE_ID \
+ CTL_CODE(FILE_DEVICE_BATTERY, 0x101, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x294404
+
+#define IOCTL_BATTERY_QUERY_STA \
+ CTL_CODE(FILE_DEVICE_BATTERY, 0x102, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x294408
+
+#define IOCTL_BATTERY_QUERY_PSR \
+ CTL_CODE(FILE_DEVICE_BATTERY, 0x103, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x29440C
+
+#define IOCTL_BATTERY_SET_TRIP_POINT \
+ CTL_CODE(FILE_DEVICE_BATTERY, 0x104, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x294410
+
+#define IOCTL_BATTERY_QUERY_BIF \
+ CTL_CODE(FILE_DEVICE_BATTERY, 0x105, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x294414
+
+#define IOCTL_BATTERY_QUERY_BST \
+ CTL_CODE(FILE_DEVICE_BATTERY, 0x106, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x294418
+
#define CMBATT_GENERIC_STATUS 0x01
#define CMBATT_GENERIC_INFO 0x02
#define CMBATT_GENERIC_WARNING 0x04
@@ -29,6 +48,25 @@ typedef enum _CMBATT_EXTENSION_TYPE
CmBattBattery
} CMBATT_EXTENSION_TYPE;
+#define ACPI_BUS_CHECK 0x00
+#define ACPI_DEVICE_CHECK 0x01
+
+#define ACPI_STA_PRESENT 0x01
+#define ACPI_STA_ENABLED 0x02
+#define ACPI_STA_SHOW_UI 0x04
+#define ACPI_STA_FUNCTIONAL 0x08
+#define ACPI_STA_BATTERY_PRESENT 0x10
+
+#define ACPI_BATT_NOTIFY_STATUS 0x80
+#define ACPI_BATT_NOTIFY_INFO 0x81
+
+#define ACPI_BATT_STAT_DISCHARG 0x0001
+#define ACPI_BATT_STAT_CHARGING 0x0002
+#define ACPI_BATT_STAT_CRITICAL 0x0004
+
+#define CM_MAX_VALUE 0x7FFFFFFF
+#define CM_UNKNOWN_VALUE 0xFFFFFFFF
+
typedef struct _ACPI_BST_DATA
{
ULONG State;
@@ -37,6 +75,9 @@ typedef struct _ACPI_BST_DATA
ULONG PresentVoltage;
} ACPI_BST_DATA, *PACPI_BST_DATA;
+#define ACPI_BATT_POWER_UNIT_WATTS 0x0
+#define ACPI_BATT_POWER_UNIT_AMPS 0x1
+
typedef struct _ACPI_BIF_DATA
{
ULONG PowerUnit;
@@ -54,6 +95,10 @@ typedef struct _ACPI_BIF_DATA
CHAR OemInfo[256];
} ACPI_BIF_DATA, *PACPI_BIF_DATA;
+#define CMBATT_AR_NOTIFY 0x01
+#define CMBATT_AR_INSERT 0x02
+#define CMBATT_AR_REMOVE 0x04
+
typedef struct _CMBATT_DEVICE_EXTENSION
{
CMBATT_EXTENSION_TYPE FdoType;
@@ -66,18 +111,17 @@ typedef struct _CMBATT_DEVICE_EXTENSION
PIRP PowerIrp;
POWER_STATE PowerState;
WMILIB_CONTEXT WmiLibInfo;
- ULONG WaitWakeEnable;
- ULONG WmiCount;
- KEVENT WmiEvent;
+ BOOLEAN WaitWakeEnable;
+ IO_REMOVE_LOCK RemoveLock;
ULONG DeviceId;
PUNICODE_STRING DeviceName;
- ACPI_INTERFACE_STANDARD2 AcpiInterface;
- BOOLEAN DelayAr;
- BOOLEAN DelayedArFlag;
+ ACPI_INTERFACE_STANDARD AcpiInterface;
+ BOOLEAN DelayNotification;
+ BOOLEAN ArFlag;
PVOID ClassData;
BOOLEAN Started;
BOOLEAN NotifySent;
- ULONG ArLock;
+ LONG ArLockValue;
ULONG TagData;
ULONG Tag;
ULONG ModelNumberLength;
@@ -93,7 +137,7 @@ typedef struct _CMBATT_DEVICE_EXTENSION
ULONG RemainingCapacity;
ULONG PresentVoltage;
ULONG Rate;
- BATTERY_INFORMATION StaticBatteryInformation;
+ BATTERY_INFORMATION BatteryInformation;
ULONG BatteryCapacityGranularity1;
ULONG BatteryCapacityGranularity2;
BOOLEAN TripPointSet;
@@ -129,5 +173,110 @@ CmBattSystemControl(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
);
-
+
+NTSTATUS
+NTAPI
+CmBattGetBstData(
+ PCMBATT_DEVICE_EXTENSION DeviceExtension,
+ PACPI_BST_DATA BstData
+);
+
+NTSTATUS
+NTAPI
+CmBattGetPsrData(
+ PDEVICE_OBJECT DeviceObject,
+ PULONG PsrData
+);
+
+NTSTATUS
+NTAPI
+CmBattGetStaData(
+ PDEVICE_OBJECT DeviceObject,
+ PULONG StaData
+);
+
+NTSTATUS
+NTAPI
+CmBattGetBifData(
+ PCMBATT_DEVICE_EXTENSION DeviceExtension,
+ PACPI_BIF_DATA BifData
+);
+
+NTSTATUS
+NTAPI
+CmBattSetTripPpoint(
+ PCMBATT_DEVICE_EXTENSION DeviceExtension,
+ ULONG AlarmValue
+);
+
+VOID
+NTAPI
+CmBattNotifyHandler(
+ IN PCMBATT_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG NotifyValue
+);
+
+NTSTATUS
+NTAPI
+CmBattWmiDeRegistration(
+ PCMBATT_DEVICE_EXTENSION DeviceExtension
+);
+
+NTSTATUS
+NTAPI
+CmBattWmiRegistration(
+ PCMBATT_DEVICE_EXTENSION DeviceExtension
+);
+
+NTSTATUS
+NTAPI
+CmBattGetUniqueId(
+ PDEVICE_OBJECT DeviceObject,
+ PULONG UniqueId
+);
+
+NTSTATUS
+NTAPI
+CmBattQueryInformation(
+ IN PCMBATT_DEVICE_EXTENSION FdoExtension,
+ IN ULONG Tag,
+ IN BATTERY_QUERY_INFORMATION_LEVEL InfoLevel,
+ IN OPTIONAL LONG AtRate,
+ IN PVOID Buffer,
+ IN ULONG BufferLength,
+ OUT PULONG ReturnedLength
+);
+
+NTSTATUS
+NTAPI
+CmBattQueryStatus(
+ IN PCMBATT_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG Tag,
+ IN PBATTERY_STATUS BatteryStatus
+);
+
+NTSTATUS
+NTAPI
+CmBattSetStatusNotify(
+ IN PCMBATT_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG BatteryTag,
+ IN PBATTERY_NOTIFY BatteryNotify
+);
+
+NTSTATUS
+NTAPI
+CmBattDisableStatusNotify(
+ IN PCMBATT_DEVICE_EXTENSION DeviceExtension
+);
+
+NTSTATUS
+NTAPI
+CmBattQueryTag(
+ IN PCMBATT_DEVICE_EXTENSION DeviceExtension,
+ OUT PULONG Tag
+);
+
+extern PDEVICE_OBJECT AcAdapterPdo;
+extern ULONG CmBattDebug;
+
/* EOF */
diff --git a/drivers/bus/acpi/cmbatt/cmbatt.rbuild b/drivers/bus/acpi/cmbatt/cmbatt.rbuild
index c8a09e31b44..34c85adccf1 100644
--- a/drivers/bus/acpi/cmbatt/cmbatt.rbuild
+++ b/drivers/bus/acpi/cmbatt/cmbatt.rbuild
@@ -4,10 +4,12 @@
ntoskrnl
hal
battc
+ wmilib
.
cmbatt.c
cmexec.c
cmbpnp.c
cmbwmi.c
cmbatt.rc
+ cmbatt.h
diff --git a/drivers/bus/acpi/cmbatt/cmbpnp.c b/drivers/bus/acpi/cmbatt/cmbpnp.c
index 3a56dce87f0..55d3ae63d49 100644
--- a/drivers/bus/acpi/cmbatt/cmbpnp.c
+++ b/drivers/bus/acpi/cmbatt/cmbpnp.c
@@ -12,95 +12,864 @@
/* FUNCTIONS ******************************************************************/
+VOID
+NTAPI
+CmBattWaitWakeLoop(IN PDEVICE_OBJECT DeviceObject,
+ IN UCHAR MinorFunction,
+ IN POWER_STATE PowerState,
+ IN PVOID Context,
+ IN PIO_STATUS_BLOCK IoStatusBlock)
+{
+ NTSTATUS Status;
+ PCMBATT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
+ if (CmBattDebug & 0x20) DbgPrint("CmBattWaitWakeLoop: Entered.\n");
+
+ /* Check for success */
+ if ((NT_SUCCESS(IoStatusBlock->Status)) && (DeviceExtension->WaitWakeEnable))
+ {
+ /* Request a new power IRP */
+ if (CmBattDebug & 2) DbgPrint("CmBattWaitWakeLoop: completed successfully\n");
+ Status = PoRequestPowerIrp(DeviceObject,
+ MinorFunction,
+ PowerState,
+ CmBattWaitWakeLoop,
+ Context,
+ &DeviceExtension->PowerIrp);
+ if (CmBattDebug & 2)
+ DbgPrint("CmBattWaitWakeLoop: PoRequestPowerIrp: status = 0x%08x.\n",
+ Status);
+ }
+ else
+ {
+ /* Clear the power IRP, we failed */
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattWaitWakeLoop: failed: status = 0x%08x.\n",
+ IoStatusBlock->Status);
+ DeviceExtension->PowerIrp = NULL;
+ }
+}
+
NTSTATUS
NTAPI
-CmBattIoCompletion(PDEVICE_OBJECT DeviceObject,
- PIRP Irp,
- PKEVENT Event)
+CmBattIoCompletion(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PKEVENT Event)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ if (CmBattDebug & 2) DbgPrint("CmBattIoCompletion: Event (%x)\n", Event);
+
+ /* Set the completion event */
+ KeSetEvent(Event, IO_NO_INCREMENT, FALSE);
+ return STATUS_MORE_PROCESSING_REQUIRED;
}
NTSTATUS
NTAPI
-CmBattGetAcpiInterfaces(PDEVICE_OBJECT DeviceObject,
- PACPI_INTERFACE_STANDARD2 *AcpiInterface)
+CmBattGetAcpiInterfaces(IN PDEVICE_OBJECT DeviceObject,
+ IN OUT PACPI_INTERFACE_STANDARD AcpiInterface)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ PIRP Irp;
+ NTSTATUS Status;
+ PIO_STACK_LOCATION IoStackLocation;
+ KEVENT Event;
+
+ /* Allocate the IRP */
+ Irp = IoAllocateIrp(DeviceObject->StackSize, 0);
+ if (!Irp)
+ {
+ /* Fail */
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattGetAcpiInterfaces: Failed to allocate Irp\n");
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Set default error code */
+ Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
+
+ /* Build the query */
+ IoStackLocation = IoGetNextIrpStackLocation(Irp);
+ IoStackLocation->MinorFunction = IRP_MN_QUERY_INTERFACE;
+ IoStackLocation->Parameters.QueryInterface.InterfaceType = &GUID_ACPI_INTERFACE_STANDARD;
+ IoStackLocation->Parameters.QueryInterface.Size = sizeof(ACPI_INTERFACE_STANDARD);
+ IoStackLocation->Parameters.QueryInterface.Version = 1;
+ IoStackLocation->Parameters.QueryInterface.Interface = (PINTERFACE)AcpiInterface;
+ IoStackLocation->Parameters.QueryInterface.InterfaceSpecificData = NULL;
+
+ /* Set default ACPI interface data */
+ AcpiInterface->Size = sizeof(ACPI_INTERFACE_STANDARD);
+ AcpiInterface->Version = 1;
+
+ /* Initialize our wait event */
+ KeInitializeEvent(&Event, SynchronizationEvent, 0);
+
+ /* Set the completion routine */
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+ IoSetCompletionRoutine(Irp,
+ (PVOID)CmBattIoCompletion,
+ &Event,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ /* Now call ACPI */
+ Status = IoCallDriver(DeviceObject, Irp);
+ if (Status == STATUS_PENDING)
+ {
+ /* Wait for completion */
+ KeWaitForSingleObject(&Event,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+ Status = Irp->IoStatus.Status;
+ }
+
+ /* Free the IRP */
+ IoFreeIrp(Irp);
+
+ /* Return status */
+ if (!(NT_SUCCESS(Status)) && (CmBattDebug & 0xC))
+ DbgPrint("CmBattGetAcpiInterfaces: Could not get ACPI driver interfaces, status = %x\n", Status);
+ return Status;
}
VOID
NTAPI
-CmBattDestroyFdo(PDEVICE_OBJECT DeviceObject)
+CmBattDestroyFdo(IN PDEVICE_OBJECT DeviceObject)
{
- UNIMPLEMENTED;
+ PAGED_CODE();
+ if (CmBattDebug & 0x220) DbgPrint("CmBattDestroyFdo, Battery.\n");
+
+ /* Delete the device */
+ IoDeleteDevice(DeviceObject);
+ if (CmBattDebug & 0x220) DbgPrint("CmBattDestroyFdo: done.\n");
}
NTSTATUS
NTAPI
-CmBattRemoveDevice(PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
+CmBattRemoveDevice(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ PCMBATT_DEVICE_EXTENSION DeviceExtension;
+ PVOID Context;
+ DeviceExtension = DeviceObject->DeviceExtension;
+ if (CmBattDebug & 2)
+ DbgPrint("CmBattRemoveDevice: CmBatt (%x), Type %d, _UID %d\n",
+ DeviceExtension,
+ DeviceExtension->FdoType,
+ DeviceExtension->DeviceId);
+
+ /* Make sure it's safe to go ahead */
+ IoReleaseRemoveLockAndWait(&DeviceExtension->RemoveLock, 0);
+
+ /* Check for pending power IRP */
+ if (DeviceExtension->PowerIrp)
+ {
+ /* Cancel and clear */
+ IoCancelIrp(DeviceExtension->PowerIrp);
+ DeviceExtension->PowerIrp = NULL;
+ }
+
+ /* Check what type of FDO is being removed */
+ Context = DeviceExtension->AcpiInterface.Context;
+ if (DeviceExtension->FdoType == CmBattBattery)
+ {
+ /* Unregister battery FDO */
+ DeviceExtension->AcpiInterface.UnregisterForDeviceNotifications(Context,
+ (PVOID)CmBattNotifyHandler);
+ CmBattWmiDeRegistration(DeviceExtension);
+ if (!NT_SUCCESS(BatteryClassUnload(DeviceExtension->ClassData))) ASSERT(FALSE);
+ }
+ else
+ {
+ /* Unregister AC adapter FDO */
+ DeviceExtension->AcpiInterface.UnregisterForDeviceNotifications(Context,
+ (PVOID)CmBattNotifyHandler);
+ CmBattWmiDeRegistration(DeviceExtension);
+ AcAdapterPdo = NULL;
+ }
+
+ /* Detach and delete */
+ IoDetachDevice(DeviceExtension->AttachedDevice);
+ IoDeleteDevice(DeviceExtension->DeviceObject);
+ return STATUS_SUCCESS;
}
NTSTATUS
NTAPI
-CmBattPowerDispatch(PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
+CmBattPowerDispatch(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ PIO_STACK_LOCATION IoStackLocation;
+ PCMBATT_DEVICE_EXTENSION DeviceExtension;
+ NTSTATUS Status;
+ if (CmBattDebug & 0x210) DbgPrint("CmBattPowerDispatch\n");
+
+ /* Get stack location and device extension */
+ IoStackLocation = IoGetCurrentIrpStackLocation(Irp);
+ DeviceExtension = DeviceObject->DeviceExtension;
+ switch (IoStackLocation->MinorFunction)
+ {
+ case IRP_MN_WAIT_WAKE:
+ if (CmBattDebug & 0x10)
+ DbgPrint("CmBattPowerDispatch: IRP_MN_WAIT_WAKE\n");
+ break;
+
+ case IRP_MN_POWER_SEQUENCE:
+ if (CmBattDebug & 0x10)
+ DbgPrint("CmBattPowerDispatch: IRP_MN_POWER_SEQUENCE\n");
+ break;
+
+ case IRP_MN_QUERY_POWER:
+ if (CmBattDebug & 0x10)
+ DbgPrint("CmBattPowerDispatch: IRP_MN_WAIT_WAKE\n");
+ break;
+
+ case IRP_MN_SET_POWER:
+ if (CmBattDebug & 0x10)
+ DbgPrint("CmBattPowerDispatch: IRP_MN_SET_POWER type: %d, State: %d \n",
+ IoStackLocation->Parameters.Power.Type,
+ IoStackLocation->Parameters.Power.State);
+ break;
+
+ default:
+
+ if (CmBattDebug & 1)
+ DbgPrint("CmBattPowerDispatch: minor %d\n", IoStackLocation->MinorFunction);
+ break;
+ }
+
+ /* Start the next IRP and see if we're attached */
+ PoStartNextPowerIrp(Irp);
+ if (DeviceExtension->AttachedDevice)
+ {
+ /* Call ACPI */
+ IoSkipCurrentIrpStackLocation(Irp);
+ Status = PoCallDriver(DeviceExtension->AttachedDevice, Irp);
+ }
+ else
+ {
+ /* Complete the request here */
+ Status = Irp->IoStatus.Status;
+ IofCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+
+ /* Return status */
+ return Status;
}
NTSTATUS
NTAPI
-CmBattCreateFdo(PDRIVER_OBJECT DriverObject,
- PDEVICE_OBJECT DeviceObject,
- ULONG DeviceExtensionSize,
- PDEVICE_OBJECT *NewDeviceObject)
+CmBattPnpDispatch(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ PIO_STACK_LOCATION IoStackLocation;
+ PCMBATT_DEVICE_EXTENSION DeviceExtension;
+ NTSTATUS Status;
+ KEVENT Event;
+ PAGED_CODE();
+
+ /* Get stack location and device extension */
+ IoStackLocation = IoGetCurrentIrpStackLocation(Irp);
+ DeviceExtension = DeviceObject->DeviceExtension;
+
+ /* Set default error */
+ Status = STATUS_NOT_SUPPORTED;
+
+ /* Try to acquire the lock before doing anything */
+ Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, 0);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Complete the request */
+ Irp->IoStatus.Status = STATUS_DEVICE_REMOVED;
+ IofCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_DEVICE_REMOVED;
+ }
+
+ /* What's the operation? */
+ switch (IoStackLocation->MinorFunction)
+ {
+ case IRP_MN_QUERY_PNP_DEVICE_STATE:
+
+ /* Initialize our wait event */
+ KeInitializeEvent(&Event, SynchronizationEvent, 0);
+
+ /* Set the completion routine */
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+ IoSetCompletionRoutine(Irp,
+ (PVOID)CmBattIoCompletion,
+ &Event,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ /* Now call ACPI to inherit its PnP Device State */
+ Status = IoCallDriver(DeviceObject, Irp);
+ if (Status == STATUS_PENDING)
+ {
+ /* Wait for completion */
+ KeWaitForSingleObject(&Event,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+ Status = Irp->IoStatus.Status;
+ }
+
+ /* However, a battery CAN be disabled */
+ Irp->IoStatus.Information &= ~PNP_DEVICE_NOT_DISABLEABLE;
+
+ /* Release the remove lock and complete the request */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp);
+ return Status;
+
+ case IRP_MN_SURPRISE_REMOVAL:
+ if (CmBattDebug & 0x20)
+ DbgPrint("CmBattPnpDispatch: IRP_MN_SURPRISE_REMOVAL\n");
+
+ /* Lock the device extension and set the handle count to invalid */
+ ExAcquireFastMutex(&DeviceExtension->FastMutex);
+ DeviceExtension->HandleCount = -1;
+ ExReleaseFastMutex(&DeviceExtension->FastMutex);
+ Status = STATUS_SUCCESS;
+ break;
+
+ case IRP_MN_START_DEVICE:
+ if (CmBattDebug & 0x20)
+ DbgPrint("CmBattPnpDispatch: IRP_MN_START_DEVICE\n");
+
+ /* Mark the extension as started */
+ if (DeviceExtension->FdoType == CmBattBattery) DeviceExtension->Started = TRUE;
+ Status = STATUS_SUCCESS;
+ break;
+
+ case IRP_MN_STOP_DEVICE:
+ if (CmBattDebug & 0x20)
+ DbgPrint("CmBattPnpDispatch: IRP_MN_STOP_DEVICE\n");
+
+ /* Mark the extension as stopped */
+ if (DeviceExtension->FdoType == CmBattBattery) DeviceExtension->Started = FALSE;
+ Status = STATUS_SUCCESS;
+ break;
+
+ case IRP_MN_QUERY_REMOVE_DEVICE:
+ if (CmBattDebug & 0x20)
+ DbgPrint("CmBattPnpDispatch: IRP_MN_QUERY_REMOVE_DEVICE\n");
+
+ /* Lock the extension and get the current handle count */
+ ExAcquireFastMutex(&DeviceExtension->FastMutex);
+ if (DeviceExtension->HandleCount == 0)
+ {
+ /* No handles. Mark it as invalid since it'll be removed */
+ DeviceExtension->HandleCount = -1;
+ Status = STATUS_SUCCESS;
+ }
+ else if (DeviceExtension->HandleCount == -1)
+ {
+ /* Don't do anything, but this is strange since it's already removed */
+ Status = STATUS_SUCCESS;
+ if (CmBattDebug & 4)
+ DbgPrint("CmBattPnpDispatch: Recieved two consecutive QUERY_REMOVE requests.\n");
+ }
+ else
+ {
+ /* Fail because there's still open handles */
+ Status = STATUS_UNSUCCESSFUL;
+ }
+
+ /* Release the lock and return */
+ ExReleaseFastMutex(&DeviceExtension->FastMutex);
+ break;
+
+ case IRP_MN_REMOVE_DEVICE:
+ if (CmBattDebug & 0x20)
+ DbgPrint("CmBattPnpDispatch: IRP_MN_REMOVE_DEVICE\n");
+
+ /* Call the remove code */
+ Status = CmBattRemoveDevice(DeviceObject, Irp);
+ break;
+
+ case IRP_MN_CANCEL_REMOVE_DEVICE:
+ if (CmBattDebug & 0x20)
+ DbgPrint("CmBattPnpDispatch: IRP_MN_CANCEL_REMOVE_DEVICE\n");
+
+ /* Lock the extension and get the handle count */
+ ExAcquireFastMutex(&DeviceExtension->FastMutex);
+ if (DeviceExtension->HandleCount == -1)
+ {
+ /* A remove was in progress, set the handle count back to 0 */
+ DeviceExtension->HandleCount = 0;
+ }
+ else if (CmBattDebug & 2)
+ {
+ /* Nop, but warn about it */
+ DbgPrint("CmBattPnpDispatch: Received CANCEL_REMOVE when OpenCount == %x\n",
+ DeviceExtension->HandleCount);
+ }
+
+ /* Return success in all cases, and release the lock */
+ Status = STATUS_SUCCESS;
+ ExReleaseFastMutex(&DeviceExtension->FastMutex);
+ break;
+
+ case IRP_MN_QUERY_STOP_DEVICE:
+ if (CmBattDebug & 0x20)
+ DbgPrint("CmBattPnpDispatch: IRP_MN_QUERY_STOP_DEVICE\n");
+
+ /* There's no real support for this */
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+
+ case IRP_MN_CANCEL_STOP_DEVICE:
+ if (CmBattDebug & 0x20)
+ DbgPrint("CmBattPnpDispatch: IRP_MN_CANCEL_STOP_DEVICE\n");
+
+ /* There's no real support for this */
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+
+ case IRP_MN_QUERY_CAPABILITIES:
+
+ /* Initialize our wait event */
+ KeInitializeEvent(&Event, SynchronizationEvent, 0);
+
+ /* Set the completion routine */
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+ IoSetCompletionRoutine(Irp,
+ (PVOID)CmBattIoCompletion,
+ &Event,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ /* Now call ACPI */
+ Status = IoCallDriver(DeviceObject, Irp);
+ if (Status == STATUS_PENDING)
+ {
+ /* Wait for completion */
+ KeWaitForSingleObject(&Event,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+ Status = Irp->IoStatus.Status;
+ }
+
+ /* Get the wake power state */
+ DeviceExtension->PowerState.SystemState = IoStackLocation->Parameters.DeviceCapabilities.Capabilities->SystemWake;
+ if (CmBattDebug & 0x20)
+ DbgPrint("CmBattPnpDispatch: IRP_MN_QUERY_CAPABILITIES %d Capabilities->SystemWake = %x\n",
+ DeviceExtension->FdoType,
+ DeviceExtension->PowerState);
+
+ /* Check if it's invalid */
+ if (DeviceExtension->PowerState.SystemState == PowerSystemUnspecified)
+ {
+ /* Wait wake is not supported in this scenario */
+ DeviceExtension->WaitWakeEnable = FALSE;
+ if (CmBattDebug & 0x20)
+ DbgPrint("CmBattPnpDispatch: IRP_MN_QUERY_CAPABILITIES Wake not supported.\n");
+ }
+ else if (!(DeviceExtension->PowerIrp) &&
+ (DeviceExtension->WaitWakeEnable))
+ {
+ /* If it was requested in the registry, request the power IRP for it */
+ PoRequestPowerIrp(DeviceExtension->DeviceObject,
+ 0,
+ DeviceExtension->PowerState,
+ CmBattWaitWakeLoop,
+ 0,
+ &DeviceExtension->PowerIrp);
+ if (CmBattDebug & 0x20)
+ DbgPrint("CmBattPnpDispatch: IRP_MN_QUERY_CAPABILITIES wait/Wake irp sent.\n");
+ }
+
+ /* Release the remove lock and complete the request */
+ IofCompleteRequest(Irp, IO_NO_INCREMENT);
+ IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp);
+ return Status;
+
+ default:
+ /* Unsupported */
+ if (CmBattDebug & 0x20)
+ DbgPrint("CmBattPnpDispatch: Unimplemented minor %0x\n",
+ IoStackLocation->MinorFunction);
+ break;
+ }
+
+ /* Release the remove lock */
+ IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp);
+
+ /* Set IRP status if we have one */
+ if (Status != STATUS_NOT_SUPPORTED) Irp->IoStatus.Status = Status;
+
+ /* Did someone pick it up? */
+ if ((NT_SUCCESS(Status)) || (Status == STATUS_NOT_SUPPORTED))
+ {
+ /* Still unsupported, try ACPI */
+ IoSkipCurrentIrpStackLocation(Irp);
+ Status = IoCallDriver(DeviceExtension->AttachedDevice, Irp);
+ }
+ else
+ {
+ /* Complete the request */
+ Status = Irp->IoStatus.Status;
+ IofCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+
+ /* Release the remove lock and return status */
+ return Status;
}
NTSTATUS
NTAPI
-CmBattPnpDispatch(PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
+CmBattCreateFdo(IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG DeviceExtensionSize,
+ IN PDEVICE_OBJECT *NewDeviceObject)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ PDEVICE_OBJECT FdoDeviceObject;
+ HANDLE KeyHandle;
+ PCMBATT_DEVICE_EXTENSION FdoExtension;
+ UCHAR Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG)];
+ PKEY_VALUE_PARTIAL_INFORMATION PartialInfo = (PVOID)Buffer;
+ NTSTATUS Status;
+ UNICODE_STRING KeyString;
+ ULONG UniqueId;
+ ULONG ResultLength;
+ PAGED_CODE();
+ if (CmBattDebug & 0x220) DbgPrint("CmBattCreateFdo: Entered\n");
+
+ /* Get unique ID */
+ Status = CmBattGetUniqueId(DeviceObject, &UniqueId);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Assume 0 */
+ UniqueId = 0;
+ if (CmBattDebug & 2)
+ DbgPrint("CmBattCreateFdo: Error %x from _UID, assuming unit #0\n", Status);
+ }
+
+ /* Create the FDO */
+ Status = IoCreateDevice(DriverObject,
+ DeviceExtensionSize,
+ 0,
+ FILE_DEVICE_BATTERY,
+ FILE_DEVICE_SECURE_OPEN,
+ 0,
+ &FdoDeviceObject);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Fail */
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattCreateFdo: error (0x%x) creating device object\n", Status);
+ return Status;
+ }
+
+ /* Set FDO flags */
+ FdoDeviceObject->Flags |= DO_BUFFERED_IO;
+ FdoDeviceObject->Flags |= DO_MAP_IO_BUFFER;
+ FdoDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
+
+ /* Initialize the extension */
+ FdoExtension = FdoDeviceObject->DeviceExtension;
+ RtlZeroMemory(FdoExtension, DeviceExtensionSize);
+ FdoExtension->DeviceObject = FdoDeviceObject;
+ FdoExtension->FdoDeviceObject = FdoDeviceObject;
+ FdoExtension->PdoDeviceObject = DeviceObject;
+
+ /* Attach to ACPI */
+ FdoExtension->AttachedDevice = IoAttachDeviceToDeviceStack(FdoDeviceObject,
+ DeviceObject);
+ if (!FdoExtension->AttachedDevice)
+ {
+ /* Destroy and fail */
+ CmBattDestroyFdo(FdoExtension->FdoDeviceObject);
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattCreateFdo: IoAttachDeviceToDeviceStack failed.\n");
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* Get ACPI interface for EVAL */
+ Status = CmBattGetAcpiInterfaces(FdoExtension->AttachedDevice,
+ &FdoExtension->AcpiInterface);
+ if (!FdoExtension->AttachedDevice)
+ {
+ /* Detach, destroy, and fail */
+ IoDetachDevice(FdoExtension->AttachedDevice);
+ CmBattDestroyFdo(FdoExtension->FdoDeviceObject);
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattCreateFdo: Could not get ACPI interfaces: %x\n", Status);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* Setup the rest of the extension */
+ ExInitializeFastMutex(&FdoExtension->FastMutex);
+ IoInitializeRemoveLock(&FdoExtension->RemoveLock, 0, 0, 0);
+ FdoExtension->HandleCount = 0;
+ FdoExtension->WaitWakeEnable = FALSE;
+ FdoExtension->DeviceId = UniqueId;
+ FdoExtension->DeviceName = NULL;
+ FdoExtension->DelayNotification = FALSE;
+ FdoExtension->ArFlag = 0;
+
+ /* Open the device key */
+ Status = IoOpenDeviceRegistryKey(DeviceObject,
+ PLUGPLAY_REGKEY_DEVICE,
+ KEY_READ,
+ &KeyHandle);
+ if (NT_SUCCESS(Status))
+ {
+ /* Read wait wake value */
+ RtlInitUnicodeString(&KeyString, L"WaitWakeEnabled");
+ Status = ZwQueryValueKey(KeyHandle,
+ &KeyString,
+ KeyValuePartialInformation,
+ PartialInfo,
+ sizeof(Buffer),
+ &ResultLength);
+ if (NT_SUCCESS(Status))
+ {
+ /* Set value */
+ FdoExtension->WaitWakeEnable = *(PULONG)PartialInfo->Data;
+ }
+
+ /* Close the handle */
+ ZwClose(KeyHandle);
+ }
+
+ /* Return success and the new FDO */
+ *NewDeviceObject = FdoDeviceObject;
+ if (CmBattDebug & 0x220)
+ DbgPrint("CmBattCreateFdo: Created FDO %x\n", FdoDeviceObject);
+ return STATUS_SUCCESS;
}
NTSTATUS
NTAPI
-CmBattAddBattery(PDRIVER_OBJECT DriverObject,
- PDEVICE_OBJECT DeviceObject)
+CmBattAddBattery(IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT DeviceObject)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ BATTERY_MINIPORT_INFO MiniportInfo;
+ NTSTATUS Status;
+ PDEVICE_OBJECT FdoDeviceObject;
+ PCMBATT_DEVICE_EXTENSION FdoExtension;
+ PAGED_CODE();
+ if (CmBattDebug & 0x220)
+ DbgPrint("CmBattAddBattery: pdo %x\n", DeviceObject);
+
+ /* Create the FDO */
+ Status = CmBattCreateFdo(DriverObject,
+ DeviceObject,
+ sizeof(CMBATT_DEVICE_EXTENSION),
+ &FdoDeviceObject);
+ if (!NT_SUCCESS(Status))
+ {
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattAddBattery: error (0x%x) creating Fdo\n", Status);
+ return Status;
+ }
+
+ /* Build the FDO extensio, check if we support trip points */
+ FdoExtension = FdoDeviceObject->DeviceExtension;
+ FdoExtension->FdoType = CmBattBattery;
+ FdoExtension->Started = 0;
+ FdoExtension->NotifySent = TRUE;
+ InterlockedExchange(&FdoExtension->ArLockValue, 0);
+ FdoExtension->TripPointValue = BATTERY_UNKNOWN_CAPACITY;
+ FdoExtension->Tag = 0;
+ FdoExtension->InterruptTime = KeQueryInterruptTime();
+ FdoExtension->TripPointSet = CmBattSetTripPpoint(FdoExtension, 0) !=
+ STATUS_OBJECT_NAME_NOT_FOUND;
+
+ /* Setup the battery miniport information structure */
+ RtlZeroMemory(&MiniportInfo, sizeof(MiniportInfo));
+ MiniportInfo.Pdo = DeviceObject;
+ MiniportInfo.MajorVersion = BATTERY_CLASS_MAJOR_VERSION;
+ MiniportInfo.MinorVersion = BATTERY_CLASS_MINOR_VERSION;
+ MiniportInfo.Context = FdoExtension;
+ MiniportInfo.QueryTag = (PVOID)CmBattQueryTag;
+ MiniportInfo.QueryInformation = (PVOID)CmBattQueryInformation;
+ MiniportInfo.SetInformation = NULL;
+ MiniportInfo.QueryStatus = (PVOID)CmBattQueryStatus;
+ MiniportInfo.SetStatusNotify = (PVOID)CmBattSetStatusNotify;
+ MiniportInfo.DisableStatusNotify = (PVOID)CmBattDisableStatusNotify;
+ MiniportInfo.DeviceName = FdoExtension->DeviceName;
+
+ /* Register with the class driver */
+ Status = BatteryClassInitializeDevice(&MiniportInfo, &FdoExtension->ClassData);
+ if (!NT_SUCCESS(Status))
+ {
+ IoDetachDevice(FdoExtension->AttachedDevice);
+ CmBattDestroyFdo(FdoExtension->FdoDeviceObject);
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattAddBattery: error (0x%x) registering with class\n", Status);
+ return Status;
+ }
+
+ /* Register WMI */
+ Status = CmBattWmiRegistration(FdoExtension);
+ if (!NT_SUCCESS(Status))
+ {
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattAddBattery: Could not register as a WMI provider, status = %Lx\n", Status);
+ return Status;
+ }
+
+ /* Register ACPI */
+ Status = FdoExtension->AcpiInterface.RegisterForDeviceNotifications(FdoExtension->AcpiInterface.Context,
+ (PVOID)CmBattNotifyHandler,
+ FdoExtension);
+ if (!NT_SUCCESS(Status))
+ {
+ CmBattWmiDeRegistration(FdoExtension);
+ BatteryClassUnload(FdoExtension->ClassData);
+ IoDetachDevice(FdoExtension->AttachedDevice);
+ CmBattDestroyFdo(FdoExtension->FdoDeviceObject);
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattAddBattery: Could not register for battery notify, status = %Lx\n", Status);
+ }
+
+ /* Return status */
+ return Status;
}
NTSTATUS
NTAPI
-CmBattAddAcAdapter(PDRIVER_OBJECT DriverObject,
- PDEVICE_OBJECT DeviceObject)
+CmBattAddAcAdapter(IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT PdoDeviceObject)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ PDEVICE_OBJECT FdoDeviceObject;
+ NTSTATUS Status;
+ PCMBATT_DEVICE_EXTENSION DeviceExtension;
+ PAGED_CODE();
+ if (CmBattDebug & 0x220)
+ DbgPrint("CmBattAddAcAdapter: pdo %x\n", PdoDeviceObject);
+
+ /* Check if we already have an AC adapter */
+ if (AcAdapterPdo)
+ {
+ /* Don't do anything */
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBatt: Second AC adapter found. Current version of driver only supports 1 aadapter.\n");
+ }
+ else
+ {
+ /* Set this as the AC adapter's PDO */
+ AcAdapterPdo = PdoDeviceObject;
+ }
+
+ /* Create the FDO for the adapter */
+ Status = CmBattCreateFdo(DriverObject,
+ PdoDeviceObject,
+ sizeof(CMBATT_DEVICE_EXTENSION),
+ &FdoDeviceObject);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Fail */
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattAddAcAdapter: error (0x%x) creating Fdo\n", Status);
+ return Status;
+ }
+
+ /* Set the type and do WMI registration */
+ DeviceExtension = FdoDeviceObject->DeviceExtension;
+ DeviceExtension->FdoType = CmBattAcAdapter;
+ Status = CmBattWmiRegistration(DeviceExtension);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We can go on without WMI */
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattAddBattery: Could not register as a WMI provider, status = %Lx\n", Status);
+ }
+
+ /* Register with ACPI */
+ Status = DeviceExtension->AcpiInterface.RegisterForDeviceNotifications(DeviceExtension->AcpiInterface.Context,
+ (PVOID)CmBattNotifyHandler,
+ DeviceExtension);
+ if (!(NT_SUCCESS(Status)) && (CmBattDebug & 0xC))
+ DbgPrint("CmBattAddAcAdapter: Could not register for power notify, status = %Lx\n", Status);
+
+ /* Send the first manual notification */
+ CmBattNotifyHandler(DeviceExtension, ACPI_BATT_NOTIFY_STATUS);
+ return STATUS_SUCCESS;
}
NTSTATUS
NTAPI
-CmBattAddDevice(PDRIVER_OBJECT DriverObject,
- PDEVICE_OBJECT DeviceObject)
+CmBattAddDevice(IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT PdoDeviceObject)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ NTSTATUS Status;
+ HANDLE KeyHandle;
+ ULONG ResultLength;
+ UNICODE_STRING KeyString;
+ UCHAR Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG)];
+ PKEY_VALUE_PARTIAL_INFORMATION PartialInfo = (PVOID)Buffer;
+ ULONG PowerSourceType;
+ PAGED_CODE();
+ if (CmBattDebug & 0x220)
+ DbgPrint("CmBattAddDevice: Entered with pdo %x\n", PdoDeviceObject);
+
+ /* Make sure we have a PDO */
+ if (!PdoDeviceObject)
+ {
+ /* Should not be having as one */
+ if (CmBattDebug & 0x24) DbgPrint("CmBattAddDevice: Asked to do detection\n");
+ return STATUS_NO_MORE_ENTRIES;
+ }
+
+ /* Open the driver key */
+ Status = IoOpenDeviceRegistryKey(PdoDeviceObject,
+ PLUGPLAY_REGKEY_DRIVER,
+ KEY_READ,
+ &KeyHandle);
+ if (!NT_SUCCESS(Status))
+ {
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattAddDevice: Could not get the software branch: %x\n", Status);
+ return Status;
+ }
+
+ /* Read the power source type */
+ RtlInitUnicodeString(&KeyString, L"PowerSourceType");
+ Status = ZwQueryValueKey(KeyHandle,
+ &KeyString,
+ KeyValuePartialInformation,
+ PartialInfo,
+ sizeof(Buffer),
+ &ResultLength);
+ ZwClose(KeyHandle);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We need the data, fail without it */
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattAddDevice: Could not read the power type identifier: %x\n", Status);
+ return Status;
+ }
+
+ /* Check what kind of power source this is */
+ PowerSourceType = *(PULONG)PartialInfo->Data;
+ if (PowerSourceType == 1)
+ {
+ /* Create an AC adapter */
+ Status = CmBattAddAcAdapter(DriverObject, PdoDeviceObject);
+ }
+ else if (PowerSourceType == 0)
+ {
+ /* Create a battery */
+ Status = CmBattAddBattery(DriverObject, PdoDeviceObject);
+ }
+ else
+ {
+ /* Unknown type, fail */
+ if (CmBattDebug & 0xC)
+ DbgPrint("CmBattAddDevice: Invalid POWER_SOURCE_TYPE == %d \n", PowerSourceType);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* Return whatever the FDO creation routine did */
+ return Status;
}
/* EOF */
diff --git a/drivers/bus/acpi/cmbatt/cmbwmi.c b/drivers/bus/acpi/cmbatt/cmbwmi.c
index 3609e17d5ff..1274f04280b 100644
--- a/drivers/bus/acpi/cmbatt/cmbwmi.c
+++ b/drivers/bus/acpi/cmbatt/cmbwmi.c
@@ -10,8 +10,46 @@
#include "cmbatt.h"
+/* GLOBALS ********************************************************************/
+
+WMIGUIDREGINFO CmBattWmiGuidList[1] =
+{
+ {&GUID_POWER_DEVICE_WAKE_ENABLE, 1, 0}
+};
+
/* FUNCTIONS ******************************************************************/
+PCHAR
+NTAPI
+WMIMinorFunctionString(IN UCHAR MinorFunction)
+{
+ switch (MinorFunction)
+ {
+ case IRP_MN_CHANGE_SINGLE_INSTANCE:
+ return "IRP_MN_CHANGE_SINGLE_INSTANCE";
+ case IRP_MN_CHANGE_SINGLE_ITEM:
+ return "IRP_MN_CHANGE_SINGLE_ITEM";
+ case IRP_MN_DISABLE_COLLECTION:
+ return "IRP_MN_DISABLE_COLLECTION";
+ case IRP_MN_DISABLE_EVENTS:
+ return "IRP_MN_DISABLE_EVENTS";
+ case IRP_MN_ENABLE_COLLECTION:
+ return "IRP_MN_ENABLE_COLLECTION";
+ case IRP_MN_ENABLE_EVENTS:
+ return "IRP_MN_ENABLE_EVENTS";
+ case IRP_MN_EXECUTE_METHOD:
+ return "IRP_MN_EXECUTE_METHOD";
+ case IRP_MN_QUERY_ALL_DATA:
+ return "IRP_MN_QUERY_ALL_DATA";
+ case IRP_MN_QUERY_SINGLE_INSTANCE:
+ return "IRP_MN_QUERY_SINGLE_INSTANCE";
+ case IRP_MN_REGINFO:
+ return "IRP_MN_REGINFO";
+ default:
+ return "IRP_MN_?????";
+ }
+}
+
NTSTATUS
NTAPI
CmBattQueryWmiRegInfo(PDEVICE_OBJECT DeviceObject,
@@ -69,27 +107,115 @@ CmBattSetWmiDataItem(PDEVICE_OBJECT DeviceObject,
NTSTATUS
NTAPI
-CmBattWmiDeRegistration(PCMBATT_DEVICE_EXTENSION DeviceExtension)
+CmBattWmiDeRegistration(IN PCMBATT_DEVICE_EXTENSION DeviceExtension)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ PAGED_CODE();
+
+ /* De-register */
+ return IoWMIRegistrationControl(DeviceExtension->FdoDeviceObject,
+ WMIREG_ACTION_DEREGISTER);
}
NTSTATUS
NTAPI
-CmBattWmiRegistration(PCMBATT_DEVICE_EXTENSION DeviceExtension)
+CmBattWmiRegistration(IN PCMBATT_DEVICE_EXTENSION DeviceExtension)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ PAGED_CODE();
+
+ /* GUID information */
+ DeviceExtension->WmiLibInfo.GuidCount = sizeof(CmBattWmiGuidList) /
+ sizeof(WMIGUIDREGINFO);
+ DeviceExtension->WmiLibInfo.GuidList = CmBattWmiGuidList;
+
+ /* Callbacks */
+ DeviceExtension->WmiLibInfo.QueryWmiRegInfo = CmBattQueryWmiRegInfo;
+ DeviceExtension->WmiLibInfo.QueryWmiDataBlock = CmBattQueryWmiDataBlock;
+ DeviceExtension->WmiLibInfo.SetWmiDataBlock = CmBattSetWmiDataBlock;
+ DeviceExtension->WmiLibInfo.SetWmiDataItem = CmBattSetWmiDataItem;
+ DeviceExtension->WmiLibInfo.ExecuteWmiMethod = NULL;
+ DeviceExtension->WmiLibInfo.WmiFunctionControl = NULL;
+
+ /* Register */
+ return IoWMIRegistrationControl(DeviceExtension->FdoDeviceObject,
+ WMIREG_ACTION_REGISTER);
}
NTSTATUS
NTAPI
-CmBattSystemControl(PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
+CmBattSystemControl(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ NTSTATUS Status;
+ PCMBATT_DEVICE_EXTENSION DeviceExtension;
+ PWMILIB_CONTEXT WmiLibContext;
+ SYSCTL_IRP_DISPOSITION Disposition = IrpForward;
+ PAGED_CODE();
+ if (CmBattDebug & 2)
+ DbgPrint("CmBatt: SystemControl: %s\n",
+ WMIMinorFunctionString(IoGetCurrentIrpStackLocation(Irp)->MinorFunction));
+
+ /* Acquire the remove lock */
+ DeviceExtension = DeviceObject->DeviceExtension;
+ Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, 0);
+ if (!NT_SUCCESS(Status))
+ {
+ /* It's too late, fail */
+ Irp->IoStatus.Status = STATUS_DEVICE_REMOVED;
+ IofCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_DEVICE_REMOVED;
+ }
+
+ /* What kind of device is this? */
+ WmiLibContext = &DeviceExtension->WmiLibInfo;
+ if (DeviceExtension->FdoType == CmBattBattery)
+ {
+ /* For batteries, let the class driver handle it */
+ Status = BatteryClassSystemControl(DeviceExtension->ClassData,
+ WmiLibContext,
+ DeviceObject,
+ Irp,
+ &Disposition);
+ }
+ else
+ {
+ /* Otherwise, call the wmi library directly */
+ Status = WmiSystemControl(WmiLibContext,
+ DeviceObject,
+ Irp,
+ &Disposition);
+ }
+
+ /* Check what happened */
+ switch (Disposition)
+ {
+ case IrpNotCompleted:
+
+ /* Complete it here */
+ if (CmBattDebug & 2) DbgPrint("CmBatt: SystemControl: Irp Not Completed.\n");
+ IofCompleteRequest(Irp, IO_NO_INCREMENT);
+ break;
+
+ case IrpForward:
+
+ /* Forward it to ACPI */
+ if (CmBattDebug & 2) DbgPrint("CmBatt: SystemControl: Irp Forward.\n");
+ IoSkipCurrentIrpStackLocation(Irp);
+ Status = IoCallDriver(DeviceExtension->AttachedDevice, Irp);
+ break;
+
+ case IrpProcessed:
+
+ /* Nothing to do */
+ if (CmBattDebug & 2) DbgPrint("CmBatt: SystemControl: Irp Processed.\n");
+ break;
+
+ default:
+ ASSERT(FALSE);
+ }
+
+ /* Release the lock and return */
+ IoReleaseRemoveLock(&DeviceExtension->RemoveLock, 0);
+ return Status;
}
/* EOF */
diff --git a/drivers/bus/acpi/cmbatt/cmexec.c b/drivers/bus/acpi/cmbatt/cmexec.c
index a41865c5e4c..beb646ab509 100644
--- a/drivers/bus/acpi/cmbatt/cmexec.c
+++ b/drivers/bus/acpi/cmbatt/cmexec.c
@@ -14,29 +14,307 @@
NTSTATUS
NTAPI
-GetDwordElement(PACPI_METHOD_ARGUMENT Argument,
- PULONG Value)
+GetDwordElement(IN PACPI_METHOD_ARGUMENT Argument,
+ OUT PULONG Value)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ NTSTATUS Status;
+
+ /* Must have an integer */
+ if (Argument->Type != ACPI_METHOD_ARGUMENT_INTEGER)
+ {
+ /* Not an integer, fail */
+ Status = STATUS_ACPI_INVALID_DATA;
+ if (CmBattDebug & 0x4C)
+ DbgPrint("GetDwordElement: Object contained wrong data type - %d\n",
+ Argument->Type);
+ }
+ else
+ {
+ /* Read the integer value */
+ *Value = Argument->Argument;
+ Status = STATUS_SUCCESS;
+ }
+
+ /* Return status */
+ return Status;
}
NTSTATUS
NTAPI
-GetStringElement(PACPI_METHOD_ARGUMENT Argument,
- PCHAR Value)
+GetStringElement(IN PACPI_METHOD_ARGUMENT Argument,
+ OUT PCHAR Value)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ NTSTATUS Status;
+
+ /* Must have a string of buffer */
+ if ((Argument->Type == ACPI_METHOD_ARGUMENT_STRING) ||
+ (Argument->Type == ACPI_METHOD_ARGUMENT_BUFFER))
+ {
+ /* String must be less than 256 characters */
+ if (Argument->DataLength < 256)
+ {
+ /* Copy the buffer */
+ RtlCopyMemory(Value, Argument->Data, Argument->DataLength);
+ Status = STATUS_SUCCESS;
+ }
+ else
+ {
+ /* The buffer is too small (the string is too large) */
+ Status = STATUS_BUFFER_TOO_SMALL;
+ if (CmBattDebug & 0x4C)
+ DbgPrint("GetStringElement: return buffer not big enough - %d\n", Argument->DataLength);
+ }
+ }
+ else
+ {
+ /* Not valid string data */
+ Status = STATUS_ACPI_INVALID_DATA;
+ if (CmBattDebug & 0x4C)
+ DbgPrint("GetStringElement: Object contained wrong data type - %d\n", Argument->Type);
+ }
+
+ /* Return the status */
+ return Status;
}
NTSTATUS
NTAPI
-CmBattGetPsrData(PDEVICE_OBJECT DeviceObject,
- PULONG PsrData)
+CmBattSendDownStreamIrp(IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG IoControlCode,
+ IN PVOID InputBuffer,
+ IN ULONG InputBufferLength,
+ IN PACPI_EVAL_OUTPUT_BUFFER OutputBuffer,
+ IN ULONG OutputBufferLength)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ PIRP Irp;
+ NTSTATUS Status;
+ KEVENT Event;
+ IO_STATUS_BLOCK IoStatusBlock;
+ PAGED_CODE();
+
+ /* Initialize our wait event */
+ KeInitializeEvent(&Event, SynchronizationEvent, 0);
+
+ /* Allocate the IRP */
+ Irp = IoBuildDeviceIoControlRequest(IoControlCode,
+ DeviceObject,
+ InputBuffer,
+ InputBufferLength,
+ OutputBuffer,
+ OutputBufferLength,
+ 0,
+ &Event,
+ &IoStatusBlock);
+ if (!Irp)
+ {
+ /* No IRP, fail */
+ if (CmBattDebug & 0x4C)
+ DbgPrint("CmBattSendDownStreamIrp: Failed to allocate Irp\n");
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Call ACPI */
+ if (CmBattDebug & 0x40)
+ DbgPrint("CmBattSendDownStreamIrp: Irp %x [Tid] %x\n",
+ Irp, KeGetCurrentThread());
+ Status = IoCallDriver(DeviceObject, Irp);
+ if (Status == STATUS_PENDING)
+ {
+ /* Wait for completion */
+ KeWaitForSingleObject(&Event,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+ Status = Irp->IoStatus.Status;
+ }
+
+ /* Check if caller wanted output */
+ if (OutputBuffer)
+ {
+ /* Make sure it's valid ACPI output buffer */
+ if ((OutputBuffer->Signature != ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE) ||
+ !(OutputBuffer->Count))
+ {
+ /* It isn't, so set failure code */
+ Status = STATUS_ACPI_INVALID_DATA;
+ }
+ }
+
+ /* Return status */
+ if (CmBattDebug & 0x40)
+ DbgPrint("CmBattSendDownStreamIrp: Irp %x completed %x! [Tid] %x\n",
+ Irp, Status, KeGetCurrentThread());
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+CmBattGetPsrData(IN PDEVICE_OBJECT DeviceObject,
+ OUT PULONG PsrData)
+{
+ NTSTATUS Status;
+ ACPI_EVAL_OUTPUT_BUFFER OutputBuffer;
+ ACPI_EVAL_INPUT_BUFFER InputBuffer;
+ PAGED_CODE();
+ if (CmBattDebug & 0x40)
+ DbgPrint("CmBattGetPsrData: Entered with Pdo %x Tid %x\n",
+ DeviceObject, KeGetCurrentThread());
+
+ /* Initialize to zero */
+ ASSERT(PsrData != NULL);
+ *PsrData = 0;
+
+ /* Request the _PSR method */
+ *(PULONG)InputBuffer.MethodName = 'RSP_';
+ InputBuffer.Signature = ACPI_EVAL_INPUT_BUFFER_SIGNATURE;
+
+ /* Send it to ACPI */
+ Status = CmBattSendDownStreamIrp(DeviceObject,
+ IOCTL_ACPI_EVAL_METHOD,
+ &InputBuffer,
+ sizeof(InputBuffer),
+ &OutputBuffer,
+ sizeof(OutputBuffer));
+ if (NT_SUCCESS(Status))
+ {
+ /* Read the result */
+ Status = GetDwordElement(OutputBuffer.Argument, PsrData);
+ if (CmBattDebug & 0x440)
+ DbgPrint("CmBattGetPsrData: _PSR method returned %x \n", *PsrData);
+ }
+ else if (CmBattDebug & 0x44C)
+ {
+ /* Failure */
+ DbgPrint("CmBattGetPsrData: Failed _PSR method - Status (0x%x)\n", Status);
+ }
+
+ /* Return status */
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+CmBattGetStaData(IN PDEVICE_OBJECT DeviceObject,
+ OUT PULONG StaData)
+{
+ NTSTATUS Status;
+ ACPI_EVAL_OUTPUT_BUFFER OutputBuffer;
+ ACPI_EVAL_INPUT_BUFFER InputBuffer;
+ PAGED_CODE();
+ if (CmBattDebug & 0x40)
+ DbgPrint("CmBattGetStaData: Entered with Pdo %x Tid %x\n",
+ DeviceObject, KeGetCurrentThread());
+
+ /* Initialize to zero */
+ ASSERT(StaData != NULL);
+ *StaData = 0;
+
+ /* Request the _PSR method */
+ *(PULONG)InputBuffer.MethodName = 'ATS_';
+ InputBuffer.Signature = ACPI_EVAL_INPUT_BUFFER_SIGNATURE;
+
+ /* Send it to ACPI */
+ Status = CmBattSendDownStreamIrp(DeviceObject,
+ IOCTL_ACPI_EVAL_METHOD,
+ &InputBuffer,
+ sizeof(InputBuffer),
+ &OutputBuffer,
+ sizeof(OutputBuffer));
+ if (NT_SUCCESS(Status))
+ {
+ /* Read the result */
+ Status = GetDwordElement(OutputBuffer.Argument, StaData);
+ if (CmBattDebug & 0x440)
+ DbgPrint("CmBattGetStaData: _STA method returned %x \n", *StaData);
+ }
+ else if (CmBattDebug & 0x44C)
+ {
+ /* Failure */
+ DbgPrint("CmBattGetStaData: Failed _STA method - Status (0x%x)\n", Status);
+ Status = STATUS_NO_SUCH_DEVICE;
+ }
+
+ /* Return status */
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+CmBattGetUniqueId(IN PDEVICE_OBJECT DeviceObject,
+ OUT PULONG UniqueId)
+{
+ NTSTATUS Status;
+ ACPI_EVAL_OUTPUT_BUFFER OutputBuffer;
+ ACPI_EVAL_INPUT_BUFFER InputBuffer;
+ PAGED_CODE();
+ if (CmBattDebug & 0x40)
+ DbgPrint("CmBattGetUniqueId: Entered with Pdo %x Tid %x\n",
+ DeviceObject, KeGetCurrentThread());
+
+ /* Initialize to zero */
+ ASSERT(UniqueId != NULL);
+ *UniqueId = 0;
+
+ /* Request the _PSR method */
+ *(PULONG)InputBuffer.MethodName = 'DIU_';
+ InputBuffer.Signature = ACPI_EVAL_INPUT_BUFFER_SIGNATURE;
+
+ /* Send it to ACPI */
+ Status = CmBattSendDownStreamIrp(DeviceObject,
+ IOCTL_ACPI_EVAL_METHOD,
+ &InputBuffer,
+ sizeof(InputBuffer),
+ &OutputBuffer,
+ sizeof(OutputBuffer));
+ if (NT_SUCCESS(Status))
+ {
+ /* Read the result */
+ Status = GetDwordElement(OutputBuffer.Argument, UniqueId);
+ if (CmBattDebug & 0x440)
+ DbgPrint("CmBattGetUniqueId: _UID method returned %x \n", *UniqueId);
+ }
+ else if (CmBattDebug & 0x44C)
+ {
+ /* Failure */
+ DbgPrint("CmBattGetUniqueId: Failed _UID method - Status (0x%x)\n", Status);
+ Status = STATUS_NO_SUCH_DEVICE;
+ }
+
+ /* Return status */
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+CmBattSetTripPpoint(IN PCMBATT_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG AlarmValue)
+{
+ NTSTATUS Status;
+ ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER InputBuffer;
+ PAGED_CODE();
+ if (CmBattDebug & 0x440)
+ DbgPrint("CmBattSetTripPpoint: _BTP Alarm Value %x Device %x Tid %x\n",
+ AlarmValue, DeviceExtension->DeviceId, KeGetCurrentThread);
+
+ /* Request the _BTP method */
+ *(PULONG)InputBuffer.MethodName = 'PTB_';
+ InputBuffer.Signature = ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_SIGNATURE;
+ InputBuffer.IntegerArgument = AlarmValue;
+
+ /* Send it to ACPI */
+ Status = CmBattSendDownStreamIrp(DeviceExtension->AttachedDevice,
+ IOCTL_ACPI_EVAL_METHOD,
+ &InputBuffer,
+ sizeof(InputBuffer),
+ NULL,
+ 0);
+ if (!(NT_SUCCESS(Status)) && (CmBattDebug & 0x440))
+ DbgPrint("CmBattSetTripPpoint: Failed _BTP method on device %x - Status (0x%x)\n",
+ DeviceExtension->DeviceId, Status);
+
+ /* Return status */
+ return Status;
}
NTSTATUS
@@ -55,46 +333,6 @@ CmBattGetBstData(PCMBATT_DEVICE_EXTENSION DeviceExtension,
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-CmBattGetStaData(PDEVICE_OBJECT DeviceObject,
- PULONG StaData)
-{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
}
-NTSTATUS
-NTAPI
-CmBattGetUniqueId(PDEVICE_OBJECT DeviceObject,
- PULONG UniqueId)
-{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-CmBattSetTripPpoint(PCMBATT_DEVICE_EXTENSION DeviceExtension,
- ULONG AlarmValue)
-{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-CmBattSendDownStreamIrp(PDEVICE_OBJECT DeviceObject,
- ULONG IoControlCode,
- PVOID InputBuffer,
- ULONG InputBufferLength,
- PACPI_EVAL_OUTPUT_BUFFER OutputBuffer,
- ULONG OutputBufferLength)
-{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
-}
-
/* EOF */
diff --git a/drivers/bus/acpi/compbatt/compbatt.c b/drivers/bus/acpi/compbatt/compbatt.c
new file mode 100644
index 00000000000..03d587c46ad
--- /dev/null
+++ b/drivers/bus/acpi/compbatt/compbatt.c
@@ -0,0 +1,168 @@
+/*
+ * PROJECT: ReactOS Composite Battery Driver
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: boot/drivers/bus/acpi/compbatt/compbatt.c
+ * PURPOSE: Main Initialization Code and IRP Handling
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include "compbatt.h"
+
+/* GLOBALS ********************************************************************/
+
+ULONG CompBattDebug;
+
+/* FUNCTIONS ******************************************************************/
+
+NTSTATUS
+NTAPI
+CompBattOpenClose(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattSystemControl(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattMonitorIrpComplete(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PKEVENT Event)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattMonitorIrpCompleteWorker(IN PCOMPBATT_BATTERY_ENTRY BatteryData)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattRecalculateTag(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattIoctl(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattQueryTag(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension,
+ OUT PULONG Tag)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattDisableStatusNotify(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattSetStatusNotify(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG BatteryTag,
+ IN PBATTERY_NOTIFY BatteryNotify)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattGetBatteryStatus(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG Tag)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattQueryStatus(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG Tag,
+ IN PBATTERY_STATUS BatteryStatus)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattGetBatteryInformation(OUT PBATTERY_INFORMATION BatteryInformation,
+ IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattGetBatteryGranularity(OUT PBATTERY_REPORTING_SCALE ReportingScale,
+ IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattGetEstimatedTime(OUT PULONG Time,
+ IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattQueryInformation(IN PCOMPBATT_DEVICE_EXTENSION FdoExtension,
+ IN ULONG Tag,
+ IN BATTERY_QUERY_INFORMATION_LEVEL InfoLevel,
+ IN OPTIONAL LONG AtRate,
+ IN PVOID Buffer,
+ IN ULONG BufferLength,
+ OUT PULONG ReturnedLength)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+DriverEntry(IN PDRIVER_OBJECT DriverObject,
+ IN PUNICODE_STRING RegistryPath)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/* EOF */
diff --git a/drivers/bus/acpi/compbatt/compbatt.h b/drivers/bus/acpi/compbatt/compbatt.h
new file mode 100644
index 00000000000..701f1362641
--- /dev/null
+++ b/drivers/bus/acpi/compbatt/compbatt.h
@@ -0,0 +1,57 @@
+/*
+ * PROJECT: ReactOS Composite Battery Driver
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: boot/drivers/bus/acpi/compbatt/compbatt.h
+ * PURPOSE: Main Header File
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+#include
+#include
+#include
+#include
+
+typedef struct _COMPBATT_BATTERY_ENTRY
+{
+ LIST_ENTRY BatteryLink;
+ IO_REMOVE_LOCK RemoveLock;
+ PDEVICE_OBJECT DeviceObject;
+ PIRP Irp;
+ WORK_QUEUE_ITEM WorkItem;
+ BOOLEAN WaitFlag;
+ BATTERY_WAIT_STATUS WaitStatus;
+ union
+ {
+ BATTERY_WAIT_STATUS WorkerWaitStatus;
+ BATTERY_STATUS WorkerStatus;
+ };
+ ULONG Tag;
+ ULONG Flags;
+ BATTERY_INFORMATION BatteryInformation;
+ BATTERY_STATUS BatteryStatus;
+ ULONGLONG InterruptTime;
+ UNICODE_STRING BatteryName;
+} COMPBATT_BATTERY_ENTRY, *PCOMPBATT_BATTERY_ENTRY;
+
+typedef struct _COMPBATT_DEVICE_EXTENSION
+{
+ PVOID ClassData;
+ ULONG NextTag;
+ LIST_ENTRY BatteryList;
+ FAST_MUTEX Lock;
+ ULONG Tag;
+ ULONG Flags;
+ BATTERY_INFORMATION BatteryInformation;
+ BATTERY_STATUS BatteryStatus;
+ ULONGLONG InterruptTime;
+ POWER_STATE PowerState;
+ ULONG LowCapacity;
+ ULONG HighCapacity;
+ PDEVICE_OBJECT AttachedDevice;
+ PDEVICE_OBJECT DeviceObject;
+ PVOID NotificationEntry;
+} COMPBATT_DEVICE_EXTENSION, *PCOMPBATT_DEVICE_EXTENSION;
+
+extern ULONG CmBattDebug;
+
+/* EOF */
diff --git a/drivers/bus/acpi/compbatt/compbatt.rbuild b/drivers/bus/acpi/compbatt/compbatt.rbuild
new file mode 100644
index 00000000000..6a92873c0e1
--- /dev/null
+++ b/drivers/bus/acpi/compbatt/compbatt.rbuild
@@ -0,0 +1,13 @@
+
+
+
+ ntoskrnl
+ hal
+ battc
+ .
+ compbatt.c
+ compmisc.c
+ comppnp.c
+ compbatt.rc
+ compbatt.h
+
diff --git a/drivers/bus/acpi/compbatt/compbatt.rc b/drivers/bus/acpi/compbatt/compbatt.rc
new file mode 100644
index 00000000000..a7ec82048fc
--- /dev/null
+++ b/drivers/bus/acpi/compbatt/compbatt.rc
@@ -0,0 +1,5 @@
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION "Composite Battery Driver\0"
+#define REACTOS_STR_INTERNAL_NAME "compbatt\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "compbatt.sys\0"
+#include
diff --git a/drivers/bus/acpi/compbatt/compmisc.c b/drivers/bus/acpi/compbatt/compmisc.c
new file mode 100644
index 00000000000..3f75d4b9abf
--- /dev/null
+++ b/drivers/bus/acpi/compbatt/compmisc.c
@@ -0,0 +1,40 @@
+/*
+ * PROJECT: ReactOS Composite Battery Driver
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: boot/drivers/bus/acpi/compbatt/compmisc.c
+ * PURPOSE: Miscellaneous Support Routines
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include "compbatt.h"
+
+/* FUNCTIONS ******************************************************************/
+
+NTSTATUS
+NTAPI
+BatteryIoctl(IN ULONG IoControlCode,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PVOID InputBuffer,
+ IN ULONG InputBufferLength,
+ IN PVOID OutputBuffer,
+ IN ULONG OutputBufferLength,
+ IN BOOLEAN InternalDeviceIoControl)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattGetDeviceObjectPointer(IN PCUNICODE_STRING DeviceName,
+ IN ACCESS_MASK DesiredAccess,
+ OUT PFILE_OBJECT *FileObject,
+ OUT PDEVICE_OBJECT *DeviceObject)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/* EOF */
diff --git a/drivers/bus/acpi/compbatt/comppnp.c b/drivers/bus/acpi/compbatt/comppnp.c
new file mode 100644
index 00000000000..a767c18ab80
--- /dev/null
+++ b/drivers/bus/acpi/compbatt/comppnp.c
@@ -0,0 +1,95 @@
+/*
+ * PROJECT: ReactOS Composite Battery Driver
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: boot/drivers/bus/acpi/compbatt/comppnp.c
+ * PURPOSE: Plug-and-Play IOCTL/IRP Handling
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include "compbatt.h"
+
+/* FUNCTIONS ******************************************************************/
+
+NTSTATUS
+NTAPI
+CompBattPowerDispatch(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+PCOMPBATT_BATTERY_ENTRY
+NTAPI
+RemoveBatteryFromList(IN PCUNICODE_STRING BatteryName,
+ IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
+{
+ UNIMPLEMENTED;
+ return NULL;
+}
+
+BOOLEAN
+NTAPI
+IsBatteryAlreadyOnList(IN PCUNICODE_STRING BatteryName,
+ IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
+{
+ UNIMPLEMENTED;
+ return FALSE;
+}
+
+NTSTATUS
+NTAPI
+CompBattAddNewBattery(IN PCUNICODE_STRING BatteryName,
+ IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattRemoveBattery(IN PCUNICODE_STRING BatteryName,
+ IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattGetBatteries(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattPnpEventHandler(IN PDEVICE_INTERFACE_CHANGE_NOTIFICATION Notification,
+ IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattAddDevice(IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT PdoDeviceObject)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+CompBattPnpDispatch(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/* EOF */
diff --git a/drivers/bus/acpi/include/acpi_bus.h b/drivers/bus/acpi/include/acpi_bus.h
index d5fe9efccc6..d2dc22d02a9 100644
--- a/drivers/bus/acpi/include/acpi_bus.h
+++ b/drivers/bus/acpi/include/acpi_bus.h
@@ -73,6 +73,8 @@ enum acpi_bus_device_type {
ACPI_BUS_TYPE_SYSTEM,
ACPI_BUS_TYPE_POWER_BUTTON,
ACPI_BUS_TYPE_SLEEP_BUTTON,
+ ACPI_BUS_TYPE_POWER_BUTTONF,
+ ACPI_BUS_TYPE_SLEEP_BUTTONF,
ACPI_BUS_DEVICE_TYPE_COUNT
};
diff --git a/drivers/bus/acpi/include/acpisys.h b/drivers/bus/acpi/include/acpisys.h
index 368ac97c83f..adf2a0c592a 100644
--- a/drivers/bus/acpi/include/acpisys.h
+++ b/drivers/bus/acpi/include/acpisys.h
@@ -39,6 +39,7 @@ typedef struct _PDO_DEVICE_DATA
// Link point to hold all the PDOs for a single bus together
LIST_ENTRY Link;
ULONG InterfaceRefCount;
+ UNICODE_STRING InterfaceName;
} PDO_DEVICE_DATA, *PPDO_DEVICE_DATA;
@@ -64,10 +65,6 @@ typedef struct _FDO_DEVICE_DATA
// A synchronization for access to the device extension.
FAST_MUTEX Mutex;
- // The name returned from IoRegisterDeviceInterface,
- // which is used as a handle for IoSetDeviceInterfaceState.
- UNICODE_STRING InterfaceName;
-
} FDO_DEVICE_DATA, *PFDO_DEVICE_DATA;
#define FDO_FROM_PDO(pdoData) \
@@ -90,6 +87,11 @@ NTSTATUS
ACPIEnumerateDevices(
PFDO_DEVICE_DATA DeviceExtension);
+NTSTATUS
+NTAPI
+Bus_PDO_EvalMethod(PPDO_DEVICE_DATA DeviceData,
+ PIRP Irp);
+
NTSTATUS
NTAPI
Bus_CreateClose (
diff --git a/drivers/bus/acpi/main.c b/drivers/bus/acpi/main.c
index 3d1170eefd6..175ad53d728 100644
--- a/drivers/bus/acpi/main.c
+++ b/drivers/bus/acpi/main.c
@@ -6,6 +6,9 @@
#include
#include
+#include
+#include
+
#define NDEBUG
#include
@@ -15,7 +18,8 @@
#endif
-
+extern struct acpi_device *sleep_button;
+extern struct acpi_device *power_button;
NTSTATUS
NTAPI
@@ -29,7 +33,9 @@ Bus_AddDevice(
PDEVICE_OBJECT deviceObject = NULL;
PFDO_DEVICE_DATA deviceData = NULL;
PWCHAR deviceName = NULL;
+#ifndef NDEBUG
ULONG nameLength;
+#endif
PAGED_CODE ();
@@ -162,38 +168,161 @@ End:
}
+NTSTATUS
+NTAPI
+ACPIDispatchCreateClose(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return STATUS_SUCCESS;
+}
+
+VOID
+NTAPI
+ButtonWaitThread(PVOID Context)
+{
+ PIRP Irp = Context;
+ int result;
+ struct acpi_bus_event event;
+ ULONG ButtonEvent;
+
+ while (ACPI_SUCCESS(result = acpi_bus_receive_event(&event)) &&
+ event.type != ACPI_BUTTON_NOTIFY_STATUS);
+
+ if (!ACPI_SUCCESS(result))
+ {
+ Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+ }
+ else
+ {
+ if (strstr(event.bus_id, "PWRF"))
+ ButtonEvent = SYS_BUTTON_POWER;
+ else if (strstr(event.bus_id, "SLPF"))
+ ButtonEvent = SYS_BUTTON_SLEEP;
+ else
+ ButtonEvent = 0;
+
+ RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, &ButtonEvent, sizeof(ButtonEvent));
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = sizeof(ULONG);
+ }
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+}
+
+
NTSTATUS
NTAPI
ACPIDispatchDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
- PIO_STACK_LOCATION IrpSp;
- NTSTATUS Status;
+ PIO_STACK_LOCATION irpStack;
+ NTSTATUS status = STATUS_NOT_SUPPORTED;
+ PCOMMON_DEVICE_DATA commonData;
+ ULONG Caps = 0;
+ HANDLE ThreadHandle;
- DPRINT("Called. IRP is at (0x%X)\n", Irp);
+ PAGED_CODE ();
+
+ irpStack = IoGetCurrentIrpStackLocation (Irp);
+ ASSERT (IRP_MJ_DEVICE_CONTROL == irpStack->MajorFunction);
+
+ commonData = (PCOMMON_DEVICE_DATA) DeviceObject->DeviceExtension;
Irp->IoStatus.Information = 0;
- IrpSp = IoGetCurrentIrpStackLocation(Irp);
- switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) {
- default:
- DPRINT("Unknown IOCTL 0x%X\n", IrpSp->Parameters.DeviceIoControl.IoControlCode);
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
+ if (!commonData->IsFDO)
+ {
+ switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
+ {
+ case IOCTL_ACPI_EVAL_METHOD:
+ status = Bus_PDO_EvalMethod((PPDO_DEVICE_DATA)commonData,
+ Irp);
+ break;
- if (Status != STATUS_PENDING) {
- Irp->IoStatus.Status = Status;
+ case IOCTL_GET_SYS_BUTTON_CAPS:
+ if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG))
+ {
+ status = STATUS_BUFFER_TOO_SMALL;
+ break;
+ }
- DPRINT("Completing IRP at 0x%X\n", Irp);
+ if (wcsstr(((PPDO_DEVICE_DATA)commonData)->HardwareIDs, L"PNP0C0D"))
+ {
+ DPRINT1("Lid button reported to power manager\n");
+ Caps |= SYS_BUTTON_LID;
+ }
+ else if (((PPDO_DEVICE_DATA)commonData)->AcpiHandle == NULL)
+ {
+ /* We have to return both at the same time because since we
+ * have a NULL handle we are the fixed feature DO and we will
+ * only be called once (not once per device)
+ */
+ if (power_button)
+ {
+ DPRINT1("Fixed power button reported to power manager\n");
+ Caps |= SYS_BUTTON_POWER;
+ }
+ if (sleep_button)
+ {
+ DPRINT1("Fixed sleep button reported to power manager\n");
+ Caps |= SYS_BUTTON_SLEEP;
+ }
+ }
+ else if (wcsstr(((PPDO_DEVICE_DATA)commonData)->HardwareIDs, L"PNP0C0C"))
+ {
+ DPRINT1("Control method power button reported to power manager\n");
+ Caps |= SYS_BUTTON_POWER;
+ }
+ else if (wcsstr(((PPDO_DEVICE_DATA)commonData)->HardwareIDs, L"PNP0C0E"))
+ {
+ DPRINT1("Control method sleep reported to power manager\n");
+ Caps |= SYS_BUTTON_SLEEP;
+ }
+ else
+ {
+ DPRINT1("IOCTL_GET_SYS_BUTTON_CAPS sent to a non-button device\n");
+ status = STATUS_INVALID_PARAMETER;
+ }
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- }
+ if (Caps != 0)
+ {
+ RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, &Caps, sizeof(Caps));
+ Irp->IoStatus.Information = sizeof(Caps);
+ status = STATUS_SUCCESS;
+ }
+ break;
- DPRINT("Leaving. Status 0x%X\n", Status);
+ case IOCTL_GET_SYS_BUTTON_EVENT:
+ PsCreateSystemThread(&ThreadHandle, THREAD_ALL_ACCESS, 0, 0, 0, ButtonWaitThread, Irp);
+ ZwClose(ThreadHandle);
- return Status;
+ status = STATUS_PENDING;
+ break;
+
+ default:
+ DPRINT1("Unsupported IOCTL: %x\n", irpStack->Parameters.DeviceIoControl.IoControlCode);
+ break;
+ }
+ }
+ else
+ DPRINT1("IOCTL sent to the ACPI FDO! Kill the caller!\n");
+
+ if (status != STATUS_PENDING)
+ {
+ Irp->IoStatus.Status = status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+ else
+ IoMarkIrpPending(Irp);
+
+ return status;
}
NTSTATUS
@@ -211,6 +340,8 @@ DriverEntry (
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ACPIDispatchDeviceControl;
DriverObject->MajorFunction [IRP_MJ_PNP] = Bus_PnP;
DriverObject->MajorFunction [IRP_MJ_POWER] = Bus_Power;
+ DriverObject->MajorFunction [IRP_MJ_CREATE] = ACPIDispatchCreateClose;
+ DriverObject->MajorFunction [IRP_MJ_CLOSE] = ACPIDispatchCreateClose;
DriverObject->DriverExtension->AddDevice = Bus_AddDevice;
diff --git a/drivers/bus/acpi/osl.c b/drivers/bus/acpi/osl.c
index f2549951e7e..a5df0c0d620 100644
--- a/drivers/bus/acpi/osl.c
+++ b/drivers/bus/acpi/osl.c
@@ -576,7 +576,12 @@ AcpiOsWaitSemaphore(
DPRINT("Waiting for semaphore %p\n", Handle);
ASSERT(Mutex);
- ExAcquireFastMutex(Mutex);
+ /* HACK: We enter here at a high IRQL sometimes
+ * because we get called from DPCs and ISRs and
+ * we can't use a fast mutex at that IRQL */
+ if (KeGetCurrentIrql() <= APC_LEVEL)
+ ExAcquireFastMutex(Mutex);
+
return AE_OK;
}
@@ -590,7 +595,12 @@ AcpiOsSignalSemaphore (
DPRINT("AcpiOsSignalSemaphore %p\n",Handle);
ASSERT(Mutex);
- ExReleaseFastMutex(Mutex);
+ /* HACK: We enter here at a high IRQL sometimes
+ * because we get called from DPCs and ISRs and
+ * we can't use a fast mutex at that IRQL */
+ if (KeGetCurrentIrql() <= APC_LEVEL)
+ ExReleaseFastMutex(Mutex);
+
return AE_OK;
}
diff --git a/drivers/bus/isapnp/isapnp.c b/drivers/bus/isapnp/isapnp.c
index 2c27302f8ab..37262c3aa87 100644
--- a/drivers/bus/isapnp/isapnp.c
+++ b/drivers/bus/isapnp/isapnp.c
@@ -153,7 +153,7 @@ static VOID WriteUlong(UCHAR Index, ULONG Value)
}
#endif
-static __inline VOID SetReadDataPort(ULONG Port)
+static __inline VOID SetReadDataPort(ULONG_PTR Port)
{
IsaPnPReadPort = (PUCHAR)Port;
WriteUchar(0x00, (UCHAR) (Port >> 2));
@@ -214,13 +214,13 @@ static VOID DeactivateLogicalDevice(UCHAR LogicalDevice)
#define READ_DATA_PORT_STEP 32 /* Minimum is 4 */
-static ULONG FindNextReadPort(VOID)
+static ULONG_PTR FindNextReadPort(VOID)
{
- ULONG Port;
+ ULONG_PTR Port;
- Port = (ULONG)IsaPnPReadPort;
+ Port = (ULONG_PTR)IsaPnPReadPort;
while (TRUE) {
@@ -260,7 +260,7 @@ static ULONG FindNextReadPort(VOID)
static BOOLEAN IsolateReadDataPortSelect(VOID)
{
- ULONG Port;
+ ULONG_PTR Port;
SendWait();
SendKey();
@@ -333,7 +333,7 @@ static ULONG IsolatePnPCards(VOID)
KeStallExecutionProcessor(250);
iteration++;
SendWake(0x00);
- SetReadDataPort((ULONG)IsaPnPReadPort);
+ SetReadDataPort((ULONG_PTR)IsaPnPReadPort);
KeStallExecutionProcessor(1000);
WriteAddress(0x01);
KeStallExecutionProcessor(1000);
@@ -1304,7 +1304,7 @@ static NTSTATUS BuildResourceLists(PISAPNP_LOGICAL_DEVICE LogicalDevice)
do {
Status = BuildResourceList(LogicalDevice, p, Priority);
if (NT_SUCCESS(Status)) {
- p = (PIO_RESOURCE_LIST)((ULONG)p + SingleListSize);
+ p = (PIO_RESOURCE_LIST)((ULONG_PTR)p + SingleListSize);
Priority++;
}
} while (Status != STATUS_NOT_FOUND);
@@ -1476,7 +1476,7 @@ ISAPNPQueryBusRelations(
CurrentEntry = CurrentEntry->Flink;
}
- Irp->IoStatus.Information = (ULONG)Relations;
+ Irp->IoStatus.Information = (ULONG_PTR)Relations;
return Status;
}
diff --git a/drivers/directx/dxg/ddhmg.c b/drivers/directx/dxg/ddhmg.c
index 39e0721d339..caa5cafeb15 100644
--- a/drivers/directx/dxg/ddhmg.c
+++ b/drivers/directx/dxg/ddhmg.c
@@ -24,7 +24,7 @@ BOOL
FASTCALL
VerifyObjectOwner(PDD_ENTRY pEntry)
{
- DWORD Pid = (DWORD) PsGetCurrentProcessId() & 0xFFFFFFFC;
+ DWORD Pid = (DWORD)(DWORD_PTR)PsGetCurrentProcessId() & 0xFFFFFFFC;
DWORD check = pEntry->ObjectOwner.ulObj & 0xFFFFFFFE;
return ( (check == Pid) || (!check));
}
@@ -145,7 +145,7 @@ FASTCALL
DdHmgLock(HANDLE DdHandle, UCHAR ObjectType, BOOLEAN LockOwned)
{
- DWORD Index = (DWORD)DdHandle & 0x1FFFFF;
+ DWORD Index = (DWORD)(DWORD_PTR)DdHandle & 0x1FFFFF;
PDD_ENTRY pEntry = NULL;
PVOID Object = NULL;
diff --git a/drivers/filesystems/ntfs/attrib.c b/drivers/filesystems/ntfs/attrib.c
index 95a5af6630b..e334ba98b00 100644
--- a/drivers/filesystems/ntfs/attrib.c
+++ b/drivers/filesystems/ntfs/attrib.c
@@ -88,7 +88,7 @@ FindRun (PNONRESIDENT_ATTRIBUTE NresAttr,
*lcn = 0;
- for (run = (PUCHAR)((ULONG)NresAttr + NresAttr->RunArrayOffset);
+ for (run = (PUCHAR)((ULONG_PTR)NresAttr + NresAttr->RunArrayOffset);
*run != 0; run += RunLength(run))
{
*lcn += RunLCN(run);
@@ -248,7 +248,7 @@ NtfsDumpAttribute (PATTRIBUTE Attribute)
{
Name.Length = Attribute->NameLength * sizeof(WCHAR);
Name.MaximumLength = Name.Length;
- Name.Buffer = (PWCHAR)((ULONG)Attribute + Attribute->NameOffset);
+ Name.Buffer = (PWCHAR)((ULONG_PTR)Attribute + Attribute->NameOffset);
DbgPrint("'%wZ' ", &Name);
}
diff --git a/drivers/input/i8042prt/keyboard.c b/drivers/input/i8042prt/keyboard.c
index 3aa2b1b24b4..0550c907a29 100644
--- a/drivers/input/i8042prt/keyboard.c
+++ b/drivers/input/i8042prt/keyboard.c
@@ -200,7 +200,7 @@ i8042PowerWorkItem(
/* Register GUID_DEVICE_SYS_BUTTON interface and report capability */
if (DeviceExtension->NewCaps != DeviceExtension->ReportedCaps)
{
- WaitingIrp = InterlockedExchangePointer(&DeviceExtension->PowerIrp, NULL);
+ WaitingIrp = InterlockedExchangePointer((PVOID)&DeviceExtension->PowerIrp, NULL);
if (WaitingIrp)
{
/* Cancel the current power irp, as capability changed */
@@ -255,7 +255,7 @@ i8042PowerWorkItem(
}
/* Directly complete the IOCTL_GET_SYS_BUTTON_EVENT Irp (if any) */
- WaitingIrp = InterlockedExchangePointer(&DeviceExtension->PowerIrp, NULL);
+ WaitingIrp = InterlockedExchangePointer((PVOID)&DeviceExtension->PowerIrp, NULL);
if (WaitingIrp)
{
PULONG pEvent = (PULONG)WaitingIrp->AssociatedIrp.SystemBuffer;
@@ -413,7 +413,7 @@ i8042KbdDeviceControl(
else
{
WaitingIrp = InterlockedCompareExchangePointer(
- &DeviceExtension->PowerIrp,
+ (PVOID)&DeviceExtension->PowerIrp,
Irp,
NULL);
/* Check if an Irp is already pending */
@@ -431,7 +431,7 @@ i8042KbdDeviceControl(
PowerKey = InterlockedExchange((PLONG)&DeviceExtension->LastPowerKey, 0);
if (PowerKey != 0)
{
- (VOID)InterlockedCompareExchangePointer(&DeviceExtension->PowerIrp, NULL, Irp);
+ (VOID)InterlockedCompareExchangePointer((PVOID)&DeviceExtension->PowerIrp, NULL, Irp);
*(PULONG)Irp->AssociatedIrp.SystemBuffer = PowerKey;
Status = STATUS_SUCCESS;
Irp->IoStatus.Status = Status;
diff --git a/drivers/network/afd/afd/connect.c b/drivers/network/afd/afd/connect.c
index 567fca91bc8..3f47a05941a 100644
--- a/drivers/network/afd/afd/connect.c
+++ b/drivers/network/afd/afd/connect.c
@@ -380,7 +380,18 @@ AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
#endif
if( FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS )
- return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0 );
+ {
+ if( FCB->RemoteAddress ) ExFreePool( FCB->RemoteAddress );
+ FCB->RemoteAddress =
+ TaCopyTransportAddress( &ConnectReq->RemoteAddress );
+
+ if( !FCB->RemoteAddress )
+ Status = STATUS_NO_MEMORY;
+ else
+ Status = STATUS_SUCCESS;
+
+ return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
+ }
switch( FCB->State ) {
case SOCKET_STATE_CONNECTED:
diff --git a/drivers/network/afd/afd/write.c b/drivers/network/afd/afd/write.c
index a23036161de..aa1c9e371a5 100644
--- a/drivers/network/afd/afd/write.c
+++ b/drivers/network/afd/afd/write.c
@@ -229,7 +229,7 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PTDI_CONNECTION_INFORMATION TargetAddress;
/* Check that the socket is bound */
- if( FCB->State != SOCKET_STATE_BOUND )
+ if( FCB->State != SOCKET_STATE_BOUND || !FCB->RemoteAddress )
return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp,
0 );
diff --git a/drivers/network/dd/ne2000/include/ne2000.h b/drivers/network/dd/ne2000/include/ne2000.h
index 0785c4187d2..4c4e28bdbcd 100644
--- a/drivers/network/dd/ne2000/include/ne2000.h
+++ b/drivers/network/dd/ne2000/include/ne2000.h
@@ -80,7 +80,7 @@ typedef struct _NIC_ADAPTER
NDIS_MINIPORT_INTERRUPT Interrupt;
/* I/O base address and interrupt number of adapter */
- ULONG IoBaseAddress;
+ ULONG_PTR IoBaseAddress;
ULONG InterruptLevel;
ULONG InterruptVector;
BOOLEAN InterruptShared;
@@ -222,24 +222,24 @@ VOID NICUpdateCounters(
VOID NICReadDataAlign(
PNIC_ADAPTER Adapter,
PUSHORT Target,
- ULONG Source,
+ ULONG_PTR Source,
USHORT Length);
VOID NICWriteDataAlign(
PNIC_ADAPTER Adapter,
- ULONG Target,
+ ULONG_PTR Target,
PUSHORT Source,
USHORT Length);
VOID NICReadData(
PNIC_ADAPTER Adapter,
PUCHAR Target,
- ULONG Source,
+ ULONG_PTR Source,
USHORT Length);
VOID NICWriteData(
PNIC_ADAPTER Adapter,
- ULONG Target,
+ ULONG_PTR Target,
PUCHAR Source,
USHORT Length);
diff --git a/drivers/network/dd/ne2000/ne2000/8390.c b/drivers/network/dd/ne2000/ne2000/8390.c
index c055d43f276..d7ceafba106 100644
--- a/drivers/network/dd/ne2000/ne2000/8390.c
+++ b/drivers/network/dd/ne2000/ne2000/8390.c
@@ -11,10 +11,10 @@
#include
/* Null-terminated array of ports to probe. This is "semi-risky" (Don Becker). */
-ULONG ProbeAddressList[] = { 0x280, 0x300, 0x320, 0x340, 0x360, 0x380, 0 };
+ULONG_PTR ProbeAddressList[] = { 0x280, 0x300, 0x320, 0x340, 0x360, 0x380, 0 };
static BOOLEAN ProbeAddressForNIC(
- ULONG address)
+ ULONG_PTR address)
/*
* FUNCTION: Probes an address for a NIC
* ARGUMENTS:
@@ -129,7 +129,7 @@ static BOOLEAN NICTestRAM(
* Start at 1KB and test for every 1KB up to 64KB
*/
{
- ULONG Base;
+ ULONG_PTR Base;
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
diff --git a/drivers/network/ndis/include/ndissys.h b/drivers/network/ndis/include/ndissys.h
index d97f1f0ab41..10c6a26ede4 100644
--- a/drivers/network/ndis/include/ndissys.h
+++ b/drivers/network/ndis/include/ndissys.h
@@ -59,6 +59,13 @@ NTAPI
ExGetCurrentProcessorCpuUsage(
PULONG CpuUsage);
+/* portability fixes */
+#ifdef _M_AMD64
+#define KfReleaseSpinLock KeReleaseSpinLock
+#define KefAcquireSpinLockAtDpcLevel KeAcquireSpinLockAtDpcLevel
+#define KefReleaseSpinLockFromDpcLevel KeReleaseSpinLockFromDpcLevel
+#endif
+
#endif /* __NDISSYS_H */
/* EOF */
diff --git a/drivers/network/ndis/ndis/io.c b/drivers/network/ndis/ndis/io.c
index b843997e6bd..0f809bf2890 100644
--- a/drivers/network/ndis/ndis/io.c
+++ b/drivers/network/ndis/ndis/io.c
@@ -106,7 +106,7 @@ NdisImmediateReadPortUchar(
OUT PUCHAR Data)
{
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
- *Data = READ_PORT_UCHAR((PUCHAR)Port); // FIXME: What to do with WrapperConfigurationContext?
+ *Data = READ_PORT_UCHAR(UlongToPtr(Port)); // FIXME: What to do with WrapperConfigurationContext?
}
@@ -121,7 +121,7 @@ NdisImmediateReadPortUlong(
OUT PULONG Data)
{
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
- *Data = READ_PORT_ULONG((PULONG)Port); // FIXME: What to do with WrapperConfigurationContext?
+ *Data = READ_PORT_ULONG(UlongToPtr(Port)); // FIXME: What to do with WrapperConfigurationContext?
}
@@ -136,7 +136,7 @@ NdisImmediateReadPortUshort(
OUT PUSHORT Data)
{
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
- *Data = READ_PORT_USHORT((PUSHORT)Port); // FIXME: What to do with WrapperConfigurationContext?
+ *Data = READ_PORT_USHORT(UlongToPtr(Port)); // FIXME: What to do with WrapperConfigurationContext?
}
@@ -151,7 +151,7 @@ NdisImmediateWritePortUchar(
IN UCHAR Data)
{
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
- WRITE_PORT_UCHAR((PUCHAR)Port, Data); // FIXME: What to do with WrapperConfigurationContext?
+ WRITE_PORT_UCHAR(UlongToPtr(Port), Data); // FIXME: What to do with WrapperConfigurationContext?
}
@@ -166,7 +166,7 @@ NdisImmediateWritePortUlong(
IN ULONG Data)
{
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
- WRITE_PORT_ULONG((PULONG)Port, Data); // FIXME: What to do with WrapperConfigurationContext?
+ WRITE_PORT_ULONG(UlongToPtr(Port), Data); // FIXME: What to do with WrapperConfigurationContext?
}
@@ -181,7 +181,7 @@ NdisImmediateWritePortUshort(
IN USHORT Data)
{
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
- WRITE_PORT_USHORT((PUSHORT)Port, Data); // FIXME: What to do with WrapperConfigurationContext?
+ WRITE_PORT_USHORT(UlongToPtr(Port), Data); // FIXME: What to do with WrapperConfigurationContext?
}
@@ -880,7 +880,7 @@ NdisMRegisterIoPortRange(
if(AddressSpace)
{
ASSERT(TranslatedAddress.u.HighPart == 0);
- *PortOffset = (PVOID) TranslatedAddress.u.LowPart;
+ *PortOffset = (PVOID)(ULONG_PTR)TranslatedAddress.QuadPart;
NDIS_DbgPrint(MAX_TRACE, ("Returning 0x%x\n", *PortOffset));
return NDIS_STATUS_SUCCESS;
}
diff --git a/drivers/network/ndis/ndis/miniport.c b/drivers/network/ndis/ndis/miniport.c
index 05c750d8ebe..2a9934c355e 100644
--- a/drivers/network/ndis/ndis/miniport.c
+++ b/drivers/network/ndis/ndis/miniport.c
@@ -2109,6 +2109,7 @@ NdisIDeviceIoControl(
PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension;
PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
NDIS_STATUS Status = STATUS_NOT_SUPPORTED;
+ ULONG Written;
Irp->IoStatus.Information = 0;
@@ -2121,7 +2122,8 @@ NdisIDeviceIoControl(
*(PNDIS_OID)Irp->AssociatedIrp.SystemBuffer,
Stack->Parameters.DeviceIoControl.OutputBufferLength,
MmGetSystemAddressForMdl(Irp->MdlAddress),
- &Irp->IoStatus.Information);
+ &Written);
+ Irp->IoStatus.Information = Written;
break;
default:
diff --git a/drivers/network/ndis/ndis/misc.c b/drivers/network/ndis/ndis/misc.c
index f8b05a80849..dca3726dcba 100644
--- a/drivers/network/ndis/ndis/misc.c
+++ b/drivers/network/ndis/ndis/misc.c
@@ -426,7 +426,7 @@ NdisInterlockedPopEntrySList(
* NDIS 5.0
*/
{
- return ExInterlockedPopEntrySList ( ListHead, Lock );
+ return (PSINGLE_LIST_ENTRY)ExInterlockedPopEntrySList ( ListHead, Lock );
}
@@ -447,7 +447,7 @@ NdisInterlockedPushEntrySList(
* NDIS 5.0
*/
{
- return ExInterlockedPushEntrySList ( ListHead, ListEntry, Lock );
+ return (PSINGLE_LIST_ENTRY)ExInterlockedPushEntrySList ( ListHead, (PSLIST_ENTRY)ListEntry, Lock );
}
diff --git a/drivers/network/tcpip/datalink/lan.c b/drivers/network/tcpip/datalink/lan.c
index fd0b818ac1b..890330e202d 100644
--- a/drivers/network/tcpip/datalink/lan.c
+++ b/drivers/network/tcpip/datalink/lan.c
@@ -684,7 +684,7 @@ VOID LANTransmit(
if (Adapter->MTU < Size) {
/* This is NOT a pointer. MSDN explicitly says so. */
NDIS_PER_PACKET_INFO_FROM_PACKET(NdisPacket,
- TcpLargeSendPacketInfo) = (PVOID)((ULONG)Adapter->MTU);
+ TcpLargeSendPacketInfo) = (PVOID)((ULONG_PTR)Adapter->MTU);
}
TcpipAcquireSpinLock( &Adapter->Lock, &OldIrql );
diff --git a/drivers/network/tcpip/tcpip/dispatch.c b/drivers/network/tcpip/tcpip/dispatch.c
index fb77376d68f..f216ed5f678 100644
--- a/drivers/network/tcpip/tcpip/dispatch.c
+++ b/drivers/network/tcpip/tcpip/dispatch.c
@@ -688,7 +688,7 @@ NTSTATUS DispTdiQueryInformation(
AddressInfo = (PTDI_ADDRESS_INFO)MmGetSystemAddressForMdl(Irp->MdlAddress);
Address = (PTA_IP_ADDRESS)&AddressInfo->Address;
- switch ((ULONG)IrpSp->FileObject->FsContext2) {
+ switch ((ULONG_PTR)IrpSp->FileObject->FsContext2) {
case TDI_TRANSPORT_ADDRESS_FILE:
AddrFile = (PADDRESS_FILE)TranContext->Handle.AddressHandle;
@@ -732,7 +732,7 @@ NTSTATUS DispTdiQueryInformation(
AddressInfo = (PTDI_CONNECTION_INFORMATION)
MmGetSystemAddressForMdl(Irp->MdlAddress);
- switch ((ULONG)IrpSp->FileObject->FsContext2) {
+ switch ((ULONG_PTR)IrpSp->FileObject->FsContext2) {
case TDI_TRANSPORT_ADDRESS_FILE:
AddrFile = (PADDRESS_FILE)TranContext->Handle.AddressHandle;
Endpoint = AddrFile ? AddrFile->Connection : NULL;
@@ -1039,12 +1039,16 @@ NTSTATUS DispTdiSendDatagram(
(*((PADDRESS_FILE)Request.Handle.AddressHandle)->Send)));
if( (*((PADDRESS_FILE)Request.Handle.AddressHandle)->Send != NULL) )
+ {
+ ULONG DataUsed = 0;
Status = (*((PADDRESS_FILE)Request.Handle.AddressHandle)->Send)(
Request.Handle.AddressHandle,
DgramInfo->SendDatagramInformation,
DataBuffer,
BufferSize,
- &Irp->IoStatus.Information);
+ &DataUsed);
+ Irp->IoStatus.Information = DataUsed;
+ }
else {
Status = STATUS_UNSUCCESSFUL;
ASSERT(FALSE);
@@ -1310,7 +1314,7 @@ NTSTATUS DispTdiQueryInformationEx(
TranContext = (PTRANSPORT_CONTEXT)IrpSp->FileObject->FsContext;
- switch ((ULONG)IrpSp->FileObject->FsContext2) {
+ switch ((ULONG_PTR)IrpSp->FileObject->FsContext2) {
case TDI_TRANSPORT_ADDRESS_FILE:
Request.Handle.AddressHandle = TranContext->Handle.AddressHandle;
break;
@@ -1485,7 +1489,7 @@ NTSTATUS DispTdiSetInformationEx(
TranContext = (PTRANSPORT_CONTEXT)IrpSp->FileObject->FsContext;
Info = (PTCP_REQUEST_SET_INFORMATION_EX)Irp->AssociatedIrp.SystemBuffer;
- switch ((ULONG)IrpSp->FileObject->FsContext2) {
+ switch ((ULONG_PTR)IrpSp->FileObject->FsContext2) {
case TDI_TRANSPORT_ADDRESS_FILE:
Request.Handle.AddressHandle = TranContext->Handle.AddressHandle;
break;
diff --git a/drivers/serial/serenum/detect.c b/drivers/serial/serenum/detect.c
index 87af5890236..8391ddbd427 100644
--- a/drivers/serial/serenum/detect.c
+++ b/drivers/serial/serenum/detect.c
@@ -532,7 +532,7 @@ SerenumDetectLegacyDevice(
/* Fill the read buffer */
TRACE_(SERENUM, "Fill the read buffer\n");
- Status = ReadBytes(LowerDevice, Buffer, sizeof(Buffer)/sizeof(Buffer[0]), &Count);
+ Status = ReadBytes(LowerDevice, Buffer, sizeof(Buffer)/sizeof(Buffer[0]), (PVOID)&Count);
if (!NT_SUCCESS(Status)) goto ByeBye;
RtlInitUnicodeString(&DeviceId, L"Serenum\\Mouse");
diff --git a/drivers/serial/serial/devctrl.c b/drivers/serial/serial/devctrl.c
index f37002dfebd..2f8f563d6a0 100644
--- a/drivers/serial/serial/devctrl.c
+++ b/drivers/serial/serial/devctrl.c
@@ -802,7 +802,7 @@ SerialDeviceControl(
* as pending, it might be possible to complete the
* Irp before pending it, leading to a crash! */
WaitingIrp = InterlockedCompareExchangePointer(
- &DeviceExtension->WaitOnMaskIrp,
+ (PVOID)&DeviceExtension->WaitOnMaskIrp,
Irp,
NULL);
diff --git a/drivers/storage/class/class2/class2.c b/drivers/storage/class/class2/class2.c
index 517ddd4061e..cb8d1f7108c 100644
--- a/drivers/storage/class/class2/class2.c
+++ b/drivers/storage/class/class2/class2.c
@@ -1314,7 +1314,7 @@ Return Value:
// of original IRP.
//
- nextIrpStack->Parameters.Others.Argument1 = (PVOID) irpCount;
+ nextIrpStack->Parameters.Others.Argument1 = (PVOID)(ULONG_PTR) irpCount;
for (i = 0; i < irpCount; i++) {
@@ -1502,7 +1502,7 @@ Return Value:
srb,
irpStack->MajorFunction,
irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL ? irpStack->Parameters.DeviceIoControl.IoControlCode : 0,
- MAXIMUM_RETRIES - ((ULONG)irpStack->Parameters.Others.Argument4),
+ MAXIMUM_RETRIES - ((ULONG_PTR)irpStack->Parameters.Others.Argument4),
&status);
//
@@ -1517,7 +1517,7 @@ Return Value:
retry = TRUE;
}
- if (retry && (irpStack->Parameters.Others.Argument4 = (PVOID)((ULONG)irpStack->Parameters.Others.Argument4-1))) {
+ if (retry && (irpStack->Parameters.Others.Argument4 = (PVOID)((ULONG_PTR)irpStack->Parameters.Others.Argument4-1))) {
//
// Retry request.
@@ -1654,7 +1654,7 @@ Return Value:
srb,
irpStack->MajorFunction,
irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL ? irpStack->Parameters.DeviceIoControl.IoControlCode : 0,
- MAXIMUM_RETRIES - ((ULONG)irpStack->Parameters.Others.Argument4),
+ MAXIMUM_RETRIES - ((ULONG_PTR)irpStack->Parameters.Others.Argument4),
&status);
//
@@ -1669,7 +1669,7 @@ Return Value:
retry = TRUE;
}
- if (retry && (irpStack->Parameters.Others.Argument4 = (PVOID)((ULONG)irpStack->Parameters.Others.Argument4-1))) {
+ if (retry && (irpStack->Parameters.Others.Argument4 = (PVOID)((ULONG_PTR)irpStack->Parameters.Others.Argument4-1))) {
//
// Retry request. If the class driver has supplied a StartIo,
diff --git a/drivers/storage/floppy/floppy.c b/drivers/storage/floppy/floppy.c
index 712f8d85468..05d15983fe9 100644
--- a/drivers/storage/floppy/floppy.c
+++ b/drivers/storage/floppy/floppy.c
@@ -520,7 +520,7 @@ static NTSTATUS NTAPI ConfigCallback(PVOID Context,
if(AddressSpace == 0)
gControllerInfo[gNumberOfControllers].BaseAddress = MmMapIoSpace(TranslatedAddress, FDC_PORT_BYTES, MmNonCached);
else
- gControllerInfo[gNumberOfControllers].BaseAddress = (PUCHAR)TranslatedAddress.u.LowPart;
+ gControllerInfo[gNumberOfControllers].BaseAddress = (PUCHAR)(ULONG_PTR)TranslatedAddress.QuadPart;
}
else if(PartialDescriptor->Type == CmResourceTypeDma)
diff --git a/drivers/storage/ide/atapi/atapi.c b/drivers/storage/ide/atapi/atapi.c
index ddcd417eae8..fe3c9808c95 100644
--- a/drivers/storage/ide/atapi/atapi.c
+++ b/drivers/storage/ide/atapi/atapi.c
@@ -2744,7 +2744,7 @@ Return Value:
{
PHW_DEVICE_EXTENSION deviceExtension = HwDeviceExtension;
- ULONG nativeModeAdapterTableIndex = (ULONG)Context;
+ ULONG nativeModeAdapterTableIndex = (ULONG_PTR)Context;
ULONG channel;
PUCHAR ioSpace;
BOOLEAN atapiOnly,
@@ -6260,7 +6260,7 @@ Return Value:
newStatus = ScsiPortInitialize(DriverObject,
Argument2,
&hwInitializationData,
- (PVOID) i);
+ (PVOID)(ULONG_PTR)i);
if (newStatus < statusToReturn)
statusToReturn = newStatus;
}
diff --git a/drivers/storage/scsiport/scsiport.c b/drivers/storage/scsiport/scsiport.c
index be9fc55c237..3e3fb5488e8 100644
--- a/drivers/storage/scsiport/scsiport.c
+++ b/drivers/storage/scsiport/scsiport.c
@@ -552,7 +552,7 @@ ScsiPortGetDeviceBase(IN PVOID HwDeviceExtension,
/* i/o space */
if (AddressSpace != 0)
- return((PVOID)TranslatedAddress.u.LowPart);
+ return((PVOID)(ULONG_PTR)TranslatedAddress.QuadPart);
MappedAddress = MmMapIoSpace(TranslatedAddress,
NumberOfBytes,
@@ -1223,8 +1223,8 @@ CreatePortConfig:
PortConfig->AccessRanges = (PVOID)(PortConfig+1);
/* Align to LONGLONG */
- PortConfig->AccessRanges = (PVOID)((ULONG)(PortConfig->AccessRanges) + 7);
- PortConfig->AccessRanges = (PVOID)((ULONG)(PortConfig->AccessRanges) & ~7);
+ PortConfig->AccessRanges = (PVOID)((ULONG_PTR)(PortConfig->AccessRanges) + 7);
+ PortConfig->AccessRanges = (PVOID)((ULONG_PTR)(PortConfig->AccessRanges) & ~7);
/* Copy the data */
RtlCopyMemory(PortConfig->AccessRanges,
diff --git a/drivers/storage/scsiport/scsiport.rbuild b/drivers/storage/scsiport/scsiport.rbuild
index 57750f9a6b0..556d742680f 100644
--- a/drivers/storage/scsiport/scsiport.rbuild
+++ b/drivers/storage/scsiport/scsiport.rbuild
@@ -3,10 +3,11 @@
-
+
.
ntoskrnl
hal
scsiport.c
+ stubs.c
scsiport.rc
diff --git a/drivers/storage/scsiport/scsiport.spec b/drivers/storage/scsiport/scsiport.spec
deleted file mode 100644
index b779b1ee557..00000000000
--- a/drivers/storage/scsiport/scsiport.spec
+++ /dev/null
@@ -1,45 +0,0 @@
-@ cdecl ScsiDebugPrint()
-@ stdcall ScsiPortCompleteRequest(ptr long long long long)
-@ stdcall ScsiPortConvertPhysicalAddressToUlong(long long)
-@ stdcall ScsiPortConvertUlongToPhysicalAddress(long) NTOSKRNL.RtlConvertUlongToLargeInteger
-@ stdcall ScsiPortFlushDma(ptr)
-@ stdcall ScsiPortFreeDeviceBase(ptr ptr)
-@ stdcall ScsiPortGetBusData(ptr long long long ptr long)
-@ stdcall ScsiPortGetDeviceBase(ptr long long long long long long)
-@ stdcall ScsiPortGetLogicalUnit(ptr long long long)
-@ stdcall ScsiPortGetPhysicalAddress(ptr ptr ptr long)
-@ stdcall ScsiPortGetSrb(ptr long long long long)
-@ stdcall ScsiPortGetUncachedExtension(ptr ptr long)
-@ stdcall ScsiPortGetVirtualAddress(ptr long long)
-@ stdcall ScsiPortInitialize(ptr ptr ptr ptr)
-@ stdcall ScsiPortIoMapTransfer(ptr ptr long long)
-@ stdcall ScsiPortLogError(ptr ptr long long long long long)
-@ stdcall ScsiPortMoveMemory(ptr ptr long)
-@ cdecl ScsiPortNotification()
-@ stdcall ScsiPortReadPortBufferUchar(ptr ptr long) HAL.READ_PORT_BUFFER_UCHAR
-@ stdcall ScsiPortReadPortBufferUshort(ptr ptr long) HAL.READ_PORT_BUFFER_USHORT
-@ stdcall ScsiPortReadPortBufferUlong(ptr ptr long) HAL.READ_PORT_BUFFER_ULONG
-@ stdcall ScsiPortReadPortUchar(ptr) HAL.READ_PORT_UCHAR
-@ stdcall ScsiPortReadPortUshort(ptr) HAL.READ_PORT_USHORT
-@ stdcall ScsiPortReadPortUlong(ptr) HAL.READ_PORT_ULONG
-@ stdcall ScsiPortReadRegisterBufferUchar(ptr ptr long) NTOSKRNL.READ_REGISTER_BUFFER_UCHAR
-@ stdcall ScsiPortReadRegisterBufferUshort(ptr ptr long) NTOSKRNL.READ_REGISTER_BUFFER_USHORT
-@ stdcall ScsiPortReadRegisterBufferUlong(ptr ptr long) NTOSKRNL.READ_REGISTER_BUFFER_ULONG
-@ stdcall ScsiPortReadRegisterUchar(ptr) NTOSKRNL.READ_REGISTER_UCHAR
-@ stdcall ScsiPortReadRegisterUshort(ptr) NTOSKRNL.READ_REGISTER_USHORT
-@ stdcall ScsiPortReadRegisterUlong(ptr) NTOSKRNL.READ_REGISTER_ULONG
-@ stdcall ScsiPortSetBusDataByOffset(ptr long long long ptr long long)
-@ stdcall ScsiPortStallExecution(long) HAL.KeStallExecutionProcessor
-@ stdcall ScsiPortValidateRange(ptr long long long long long long)
-@ stdcall ScsiPortWritePortBufferUchar(ptr ptr long) HAL.WRITE_PORT_BUFFER_UCHAR
-@ stdcall ScsiPortWritePortBufferUshort(ptr ptr long) HAL.WRITE_PORT_BUFFER_USHORT
-@ stdcall ScsiPortWritePortBufferUlong(ptr ptr long) HAL.WRITE_PORT_BUFFER_ULONG
-@ stdcall ScsiPortWritePortUchar(ptr long) HAL.WRITE_PORT_UCHAR
-@ stdcall ScsiPortWritePortUshort(ptr long) HAL.WRITE_PORT_USHORT
-@ stdcall ScsiPortWritePortUlong(ptr long) HAL.WRITE_PORT_ULONG
-@ stdcall ScsiPortWriteRegisterBufferUchar(ptr ptr long) NTOSKRNL.WRITE_REGISTER_BUFFER_UCHAR
-@ stdcall ScsiPortWriteRegisterBufferUshort(ptr ptr long) NTOSKRNL.WRITE_REGISTER_BUFFER_USHORT
-@ stdcall ScsiPortWriteRegisterBufferUlong(ptr ptr long) NTOSKRNL.WRITE_REGISTER_BUFFER_ULONG
-@ stdcall ScsiPortWriteRegisterUchar(ptr long) NTOSKRNL.WRITE_REGISTER_UCHAR
-@ stdcall ScsiPortWriteRegisterUshort(ptr long) NTOSKRNL.WRITE_REGISTER_USHORT
-@ stdcall ScsiPortWriteRegisterUlong(ptr long) NTOSKRNL.WRITE_REGISTER_ULONG
diff --git a/drivers/video/displays/framebuf_new/framebuf_new.rbuild b/drivers/video/displays/framebuf_new/framebuf_new.rbuild
index 991954e44e2..de7c4a1d3be 100644
--- a/drivers/video/displays/framebuf_new/framebuf_new.rbuild
+++ b/drivers/video/displays/framebuf_new/framebuf_new.rbuild
@@ -10,10 +10,12 @@
pointer.c
screen.c
framebuf_new.rc
-
- -mrtd
- -fno-builtin
- -Wno-unused-variable
-
+
+
+ -mrtd
+ -fno-builtin
+ -Wno-unused-variable
+
+
driver.h
diff --git a/drivers/video/displays/vga/main/enable.c b/drivers/video/displays/vga/main/enable.c
index 2d1a943ee76..80d032cddfb 100644
--- a/drivers/video/displays/vga/main/enable.c
+++ b/drivers/video/displays/vga/main/enable.c
@@ -574,7 +574,7 @@ DrvGetModes(IN HANDLE Driver,
/* next DEVMODE entry */
OutputModes--;
- DM = (PDEVMODEW) ( ((ULONG)DM) + sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
+ DM = (PDEVMODEW) ( ((ULONG_PTR)DM) + sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
OutputSize += (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
}
diff --git a/drivers/video/font/bmfd/font.c b/drivers/video/font/bmfd/font.c
index 4760fac40a9..3afdc4fb360 100644
--- a/drivers/video/font/bmfd/font.c
+++ b/drivers/video/font/bmfd/font.c
@@ -389,7 +389,7 @@ BmfdQueryFontTree(
{
PBMFD_FILE pfile = (PBMFD_FILE)iFile;
PBMFD_FACE pface;
- ULONG i, j, cjOffset, cjSize, cGlyphs, cRuns;
+ ULONG i, j, cjSize, cGlyphs, cRuns;
CHAR ch, chFirst, ach[256];
WCHAR wc, awc[256];
PFD_GLYPHSET pGlyphSet;
@@ -475,14 +475,13 @@ BmfdQueryFontTree(
pwcrun[0].wcLow = awc[0];
pwcrun[0].cGlyphs = 1;
pwcrun[0].phg = phglyphs;
- phglyphs[0] = (HGLYPH)pface->pCharTable;
+ phglyphs[0] = 0;
/* Walk through all supported chars */
for (i = 1, j = 0; i < cGlyphs; i++)
{
- /* Use pointer to glyph entry as hglyph */
- cjOffset = (ach[i] - chFirst) * pface->cjEntrySize;
- phglyphs[i] = (HGLYPH)(pface->pCharTable + cjOffset);
+ /* Use offset to glyph entry as hglyph */
+ phglyphs[i] = (ach[i] - chFirst) * pface->cjEntrySize;
/* Check whether we can append the wchar to a run */
if (awc[i] == awc[i - 1] + 1)
diff --git a/drivers/video/font/bmfd/glyph.c b/drivers/video/font/bmfd/glyph.c
index fc88b45b710..a2ce39f157f 100644
--- a/drivers/video/font/bmfd/glyph.c
+++ b/drivers/video/font/bmfd/glyph.c
@@ -80,7 +80,7 @@ BmfdQueryGlyphAndBitmap(
ULONG cjSize)
{
PBMFD_FACE pface = pfont->pface;
- PGLYPHENTRY pge = (PGLYPHENTRY)hg;
+ PGLYPHENTRY pge = (PGLYPHENTRY)(pface->pCharTable + hg);
ULONG xSrc, ySrc, cxSrc, cySrc;
ULONG xDst, yDst, cxDst, cyDst;
ULONG xScale, yScale;
diff --git a/drivers/video/videoprt/agp.c b/drivers/video/videoprt/agp.c
index ff390af0932..768e6d92f0a 100644
--- a/drivers/video/videoprt/agp.c
+++ b/drivers/video/videoprt/agp.c
@@ -275,7 +275,7 @@ IntAgpCommitVirtual(
else /* ProcessHandle != NULL */
{
/* Release some virtual memory */
- ULONG Size = Pages * PAGE_SIZE;
+ SIZE_T Size = Pages * PAGE_SIZE;
ULONG OffsetInBytes = Offset * PAGE_SIZE;
BaseAddress = (PVOID)((ULONG_PTR)VirtualMapping->MappedAddress +
OffsetInBytes);
@@ -349,7 +349,7 @@ IntAgpFreeVirtual(
else /* ProcessHandle != NULL */
{
/* Unmap the section view */
- ULONG Size = Pages * PAGE_SIZE;
+ SIZE_T Size = Pages * PAGE_SIZE;
ULONG OffsetInBytes = Offset * PAGE_SIZE;
BaseAddress = (PVOID)((ULONG_PTR)VirtualMapping->MappedAddress +
OffsetInBytes);
@@ -400,7 +400,7 @@ IntAgpReleaseVirtual(
else /* ProcessHandle != NULL */
{
/* Release the allocated virtual memory */
- ULONG Size = VirtualMapping->AgpMapping->NumberOfPages * PAGE_SIZE;
+ SIZE_T Size = VirtualMapping->AgpMapping->NumberOfPages * PAGE_SIZE;
Status = ZwFreeVirtualMemory(VirtualMapping->ProcessHandle,
&VirtualMapping->MappedAddress,
&Size, MEM_RELEASE);
@@ -452,7 +452,7 @@ IntAgpReserveVirtual(
else /* ProcessHandle != NULL */
{
/* Reserve memory for usermode */
- ULONG Size = AgpMapping->NumberOfPages * PAGE_SIZE;
+ SIZE_T Size = AgpMapping->NumberOfPages * PAGE_SIZE;
MappedAddress = NULL;
Status = ZwAllocateVirtualMemory(ProcessHandle, &MappedAddress, 0, &Size,
MEM_RESERVE, PAGE_NOACCESS);
diff --git a/drivers/video/videoprt/int10.c b/drivers/video/videoprt/int10.c
index 7930c87ca72..5f5458aa89f 100644
--- a/drivers/video/videoprt/int10.c
+++ b/drivers/video/videoprt/int10.c
@@ -24,6 +24,7 @@
/* PRIVATE FUNCTIONS **********************************************************/
+#if defined(_M_IX86)
VP_STATUS NTAPI
IntInt10AllocateBuffer(
IN PVOID Context,
@@ -190,6 +191,7 @@ IntInt10CallBios(
if (NT_SUCCESS(Status)) return NO_ERROR;
return ERROR_INVALID_PARAMETER;
}
+#endif
/* PUBLIC FUNCTIONS ***********************************************************/
@@ -202,6 +204,7 @@ VideoPortInt10(
IN PVOID HwDeviceExtension,
IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments)
{
+#if defined(_M_IX86)
CONTEXT BiosContext;
NTSTATUS Status;
PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess();
@@ -243,4 +246,9 @@ VideoPortInt10(
IntDetachFromCSRSS(&CallingProcess, &ApcState);
if (NT_SUCCESS(Status)) return NO_ERROR;
return ERROR_INVALID_PARAMETER;
+#else
+ /* Not implemented for anything else than X86*/
+ DPRINT1("Int10 not available on non-x86!\n");
+ return ERROR_INVALID_FUNCTION;
+#endif
}
diff --git a/drivers/video/videoprt/interrupt.c b/drivers/video/videoprt/interrupt.c
index 54a5b9566cb..b15ebdf974c 100644
--- a/drivers/video/videoprt/interrupt.c
+++ b/drivers/video/videoprt/interrupt.c
@@ -110,6 +110,7 @@ VP_STATUS
NTAPI
VideoPortEnableInterrupt(IN PVOID HwDeviceExtension)
{
+#ifndef _M_AMD64
PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
BOOLEAN InterruptValid;
@@ -133,6 +134,11 @@ VideoPortEnableInterrupt(IN PVOID HwDeviceExtension)
/* Return to caller */
return NO_ERROR;
+#else
+ /* FIXME: Function still present? If so what to use instead of HalEnableSystemInterrupt? */
+ UNIMPLEMENTED;
+ return ERROR_INVALID_ACCESS;
+#endif
}
/*
@@ -142,6 +148,7 @@ VP_STATUS
NTAPI
VideoPortDisableInterrupt(IN PVOID HwDeviceExtension)
{
+#ifndef _M_AMD64
PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
/* Get the device extension */
@@ -158,4 +165,9 @@ VideoPortDisableInterrupt(IN PVOID HwDeviceExtension)
HalDisableSystemInterrupt(DeviceExtension->InterruptVector,
0);
return NO_ERROR;
+#else
+ /* FIXME: Function still present? If so what to use instead of HalDisableSystemInterrupt? */
+ UNIMPLEMENTED;
+ return ERROR_INVALID_ACCESS;
+#endif
}
diff --git a/drivers/video/videoprt/resource.c b/drivers/video/videoprt/resource.c
index 2ed6417c2ef..b17edb75500 100644
--- a/drivers/video/videoprt/resource.c
+++ b/drivers/video/videoprt/resource.c
@@ -163,7 +163,7 @@ IntVideoPortMapMemory(
if (Status)
*Status = NO_ERROR;
- return (PVOID)TranslatedAddress.u.LowPart;
+ return (PVOID)(ULONG_PTR)TranslatedAddress.u.LowPart;
}
/* user space */
@@ -271,7 +271,7 @@ IntVideoPortUnmapMemory(
Status = ZwUnmapViewOfSection(NtCurrentProcess(), MappedAddress);
if (!NT_SUCCESS(Status))
{
- WARN_(VIDEOPRT, "Warning: Mapping for address 0x%x not found!\n", (ULONG)MappedAddress);
+ WARN_(VIDEOPRT, "Warning: Mapping for address 0x%p not found!\n", MappedAddress);
}
}
diff --git a/drivers/video/videoprt/services.c b/drivers/video/videoprt/services.c
index fbf69a8aff2..5b9f3cf5036 100644
--- a/drivers/video/videoprt/services.c
+++ b/drivers/video/videoprt/services.c
@@ -43,6 +43,7 @@ VideoPortQueryServices(
switch (ServicesType)
{
+#if defined(_M_IX86)
case VideoPortServicesInt10:
if (Interface->Version >= VIDEO_PORT_INT10_INTERFACE_VERSION_1 ||
Interface->Size >= sizeof(VIDEO_PORT_INT10_INTERFACE))
@@ -60,7 +61,7 @@ VideoPortQueryServices(
return NO_ERROR;
}
break;
-
+#endif
case VideoPortServicesAGP:
if ((Interface->Version == VIDEO_PORT_AGP_INTERFACE_VERSION_2 &&
Interface->Size >= sizeof(VIDEO_PORT_AGP_INTERFACE_2)) ||
diff --git a/drivers/video/videoprt/videoprt.c b/drivers/video/videoprt/videoprt.c
index 19a64f7b53c..33c6fedc7f8 100644
--- a/drivers/video/videoprt/videoprt.c
+++ b/drivers/video/videoprt/videoprt.c
@@ -330,7 +330,7 @@ IntVideoPortFindAdapter(
{
WCHAR DeviceVideoBuffer[20];
PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
- ULONG Size;
+ SIZE_T Size;
NTSTATUS Status;
VIDEO_PORT_CONFIG_INFO ConfigInfo;
SYSTEM_BASIC_INFORMATION SystemBasicInfo;
diff --git a/drivers/wdm/audio/legacy/wdmaud/interface.h b/drivers/wdm/audio/legacy/wdmaud/interface.h
index 211045cf0c9..aa5e7b25f28 100644
--- a/drivers/wdm/audio/legacy/wdmaud/interface.h
+++ b/drivers/wdm/audio/legacy/wdmaud/interface.h
@@ -26,7 +26,7 @@ typedef struct
{
KSSTREAM_HEADER Header;
SOUND_DEVICE_TYPE DeviceType;
- ULONG DeviceIndex;
+ ULONG_PTR DeviceIndex;
HANDLE hDevice;
ULONG DeviceCount;
diff --git a/hal/hal.rbuild b/hal/hal.rbuild
index b846b042bf5..c81a61d1f22 100644
--- a/hal/hal.rbuild
+++ b/hal/hal.rbuild
@@ -2,10 +2,16 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/hal/halx86/generic/amd64/systimer.S b/hal/halx86/generic/amd64/systimer.S
new file mode 100644
index 00000000000..1cb3b6e02a3
--- /dev/null
+++ b/hal/halx86/generic/amd64/systimer.S
@@ -0,0 +1,92 @@
+/*
+ * FILE: hal/halx86/generic/timer.S
+ * COPYRIGHT: See COPYING in the top level directory
+ * PURPOSE: System Timer Interrupt and Management
+ * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include
+#include
+
+/* GLOBALS *******************************************************************/
+
+.data
+
+.global MsgUnimplemented
+MsgUnimplemented:
+.asciz "WARNING: %s at %s:%d is UNIMPLEMENTED!\n"
+
+
+/* FUNCTIONS *****************************************************************/
+
+.text
+.code64
+
+PUBLIC HalpCalibrateStallExecution@0
+HalpCalibrateStallExecution@0:
+
+
+PUBLIC HalpProfileInterrupt
+HalpProfileInterrupt:
+
+
+PUBLIC KeStallExecutionProcessor
+KeStallExecutionProcessor:
+
+ /* Get the number of microseconds required */
+ jecxz Done
+
+ /* Multiply by the stall factor */
+ mov eax, gs:[KPCR_STALL_SCALE_FACTOR]
+ mul ecx
+
+ /* Align to 16 bytes */
+ .align 16
+
+ /* Jump to subtraction loop */
+ jmp SubtractLoop
+
+ /* Align to 16 bytes */
+ .align 16
+
+ /* Subtract one count */
+SubtractLoop:
+ sub eax, 1
+ jnz SubtractLoop
+
+Done:
+ /* Return */
+ ret 4
+
+
+PUBLIC HalpQuery8254Counter
+HalpQuery8254Counter:
+
+ /* Save EFLAGS and disable interrupts */
+ pushfq
+ cli
+
+ /* Set timer data */
+ mov al, 0
+ out 0x43, al
+ jmp $+2
+
+ /* Read current timer */
+ in al, 0x40
+ jmp $+2
+ movzx ecx, al
+ in al, 0x40
+ mov ch, al
+
+ /* Return it and restore interrupt state */
+ mov eax, ecx
+ popfq
+ ret
+
+PUBLIC HalpClockInterrupt
+HalpClockInterrupt:
+ UNIMPLEMENTED _HalpClockInterrupt
+ iret
+
diff --git a/hal/halx86/generic/amd64/x86bios.c b/hal/halx86/generic/amd64/x86bios.c
new file mode 100644
index 00000000000..3b43bf1d95f
--- /dev/null
+++ b/hal/halx86/generic/amd64/x86bios.c
@@ -0,0 +1,289 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL, See COPYING in the top level directory
+ * FILE: hal/halx86/generic/amd64/x86bios.c
+ * PURPOSE:
+ * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include
+//#define NDEBUG
+#include
+
+#include "x86emu.h"
+
+/* This page serves as fallback for pages used by Mm */
+#define DEFAULT_PAGE 0x21
+
+/* GLOBALS *******************************************************************/
+
+BOOLEAN x86BiosIsInitialized;
+LONG x86BiosBufferIsAllocated = 0;
+PUCHAR x86BiosMemoryMapping;
+
+
+VOID
+NTAPI
+DbgDumpPage(PUCHAR MemBuffer, USHORT Segment)
+{
+ ULONG x, y, Offset;
+
+ for (y = 0; y < 0x100; y++)
+ {
+ for (x = 0; x < 0x10; x++)
+ {
+ Offset = Segment * 16 + y * 16 + x;
+ DbgPrint("%02x ", MemBuffer[Offset]);
+ }
+ DbgPrint("\n");
+ }
+}
+
+VOID
+NTAPI
+HalInitializeBios(ULONG Unknown, PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+ PPFN_NUMBER PfnArray;
+ PFN_NUMBER Pfn, Last;
+ PMEMORY_ALLOCATION_DESCRIPTOR Descriptor;
+ PLIST_ENTRY ListEntry;
+ PMDL Mdl;
+
+ /* Allocate an MDL for 1MB */
+ Mdl = IoAllocateMdl(NULL, 0x100000, FALSE, FALSE, NULL);
+ if (!Mdl)
+ {
+ ASSERT(FALSE);
+ }
+
+ /* Get pointer to the pfn array */
+ PfnArray = MmGetMdlPfnArray(Mdl);
+
+ /* Fill the array with low memory PFNs */
+ for (Pfn = 0; Pfn < 0x100; Pfn++)
+ {
+ PfnArray[Pfn] = Pfn;
+ }
+
+ /* Loop the memory descriptors */
+ for (ListEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
+ ListEntry != &LoaderBlock->MemoryDescriptorListHead;
+ ListEntry = ListEntry->Flink)
+ {
+ /* Get the memory descriptor */
+ Descriptor = CONTAINING_RECORD(ListEntry,
+ MEMORY_ALLOCATION_DESCRIPTOR,
+ ListEntry);
+
+ /* Check if the memory is in the low range */
+ if (Descriptor->BasePage < 0x100)
+ {
+ /* Check if the memory type is firmware */
+ if (Descriptor->MemoryType != LoaderFirmwarePermanent &&
+ Descriptor->MemoryType != LoaderSpecialMemory)
+ {
+ /* It's something else, so don't use it! */
+ Last = min(Descriptor->BasePage + Descriptor->PageCount, 0x100);
+ for (Pfn = Descriptor->BasePage; Pfn < Last; Pfn++)
+ {
+ /* Set each page to the default page */
+ PfnArray[Pfn] = DEFAULT_PAGE;
+ }
+ }
+ }
+ }
+
+ Mdl->MdlFlags = MDL_PAGES_LOCKED;
+
+ /* Map the MDL to system space */
+ x86BiosMemoryMapping = MmGetSystemAddressForMdlSafe(Mdl, HighPagePriority);
+ ASSERT(x86BiosMemoryMapping);
+
+ DPRINT1("memory: %p, %p\n", *(PVOID*)x86BiosMemoryMapping, *(PVOID*)(x86BiosMemoryMapping + 8));
+ //DbgDumpPage(x86BiosMemoryMapping, 0xc351);
+
+ x86BiosIsInitialized = TRUE;
+
+ HalpBiosDisplayReset();
+}
+
+NTSTATUS
+NTAPI
+x86BiosAllocateBuffer(
+ ULONG *Size,
+ USHORT *Segment,
+ USHORT *Offset)
+{
+ /* Check if the system is initialized and the buffer is large enough */
+ if (!x86BiosIsInitialized || *Size > PAGE_SIZE)
+ {
+ /* Something was wrong, fail! */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Check if the buffer is already allocated */
+ if (InterlockedBitTestAndSet(&x86BiosBufferIsAllocated, 0))
+ {
+ /* Buffer was already allocated, fail */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* The buffer is sufficient, return hardcoded address and size */
+ *Size = PAGE_SIZE;
+ *Segment = 0x2000;
+ *Offset = 0;
+
+ return STATUS_SUCCESS;;
+}
+
+NTSTATUS
+NTAPI
+x86BiosFreeBuffer(
+ USHORT Segment,
+ USHORT Offset)
+{
+ /* Check if the system is initialized and if the address matches */
+ if (!x86BiosIsInitialized || Segment != 0x2000 || Offset != 0)
+ {
+ /* Something was wrong, fail */
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Check if the buffer was allocated */
+ if (!InterlockedBitTestAndReset(&x86BiosBufferIsAllocated, 0))
+ {
+ /* It was not, fail */
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Buffer is freed, nothing more to do */
+ return STATUS_SUCCESS;;
+}
+
+NTSTATUS
+NTAPI
+x86BiosReadMemory(
+ USHORT Segment,
+ USHORT Offset,
+ PVOID Buffer,
+ ULONG Size)
+{
+ ULONG_PTR Address;
+
+ /* Calculate the physical address */
+ Address = (Segment << 4) + Offset;
+
+ /* Check if it's valid */
+ if (!x86BiosIsInitialized || Address + Size > 0x100000)
+ {
+ /* Invalid */
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Copy the memory to the buffer */
+ RtlCopyMemory(Buffer, x86BiosMemoryMapping + Address, Size);
+
+ /* Return success */
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+x86BiosWriteMemory(
+ USHORT Segment,
+ USHORT Offset,
+ PVOID Buffer,
+ ULONG Size)
+{
+ ULONG_PTR Address;
+
+ /* Calculate the physical address */
+ Address = (Segment << 4) + Offset;
+
+ /* Check if it's valid */
+ if (!x86BiosIsInitialized || Address + Size > 0x100000)
+ {
+ /* Invalid */
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Copy the memory from the buffer */
+ RtlCopyMemory(x86BiosMemoryMapping + Address, Buffer, Size);
+
+ /* Return success */
+ return STATUS_SUCCESS;
+}
+
+BOOLEAN
+NTAPI
+x86BiosCall(
+ ULONG InterruptNumber,
+ X86_BIOS_REGISTERS *Registers)
+{
+ X86_VM_STATE VmState;
+ struct
+ {
+ USHORT Ip;
+ USHORT SegCs;
+ } *InterrupTable;
+
+ /* Zero the VmState */
+ RtlZeroMemory(&VmState, sizeof(VmState));
+
+ /* Copy the registers */
+ VmState.BiosRegisters = *Registers;
+
+ /* Set the physical memory buffer */
+ VmState.MemBuffer = x86BiosMemoryMapping;
+
+ /* Set Eflags */
+ VmState.Registers.Eflags.Long = 0; // FIXME
+
+ /* Setup stack */
+ VmState.Registers.SegSs = 0; // FIXME
+ VmState.Registers.Sp = 0x2000 - 2; // FIXME
+
+ /* Initialize IP from the interrupt vector table */
+ InterrupTable = (PVOID)x86BiosMemoryMapping;
+ VmState.Registers.SegCs = InterrupTable[InterruptNumber].SegCs;
+ VmState.Registers.Eip = InterrupTable[InterruptNumber].Ip;
+
+ /* Make the function return on IRET */
+ VmState.Flags.ReturnOnIret = 1;
+
+ /* Call the x86 emulator */
+ x86Emulator(&VmState);
+
+ /* Copy registers back to caller */
+ *Registers = VmState.BiosRegisters;
+
+ return TRUE;
+}
+
+BOOLEAN
+NTAPI
+HalpBiosDisplayReset(VOID)
+{
+ X86_BIOS_REGISTERS Registers;
+ ULONG OldEflags;
+
+ /* Save flags and disable interrupts */
+ OldEflags = __readeflags();
+ _disable();
+
+ /* Set AH = 0 (Set video mode), AL = 0x12 (640x480x16 vga) */
+ Registers.Eax = 0x12;
+
+ /* Call INT 0x10 */
+ x86BiosCall(0x10, &Registers);
+
+ // FIXME: check result
+
+ /* Restore previous flags */
+ __writeeflags(OldEflags);
+
+ return TRUE;
+}
+
diff --git a/hal/halx86/generic/cmos.c b/hal/halx86/generic/cmos.c
index a25c429c884..225b6e31600 100644
--- a/hal/halx86/generic/cmos.c
+++ b/hal/halx86/generic/cmos.c
@@ -15,44 +15,9 @@
/* GLOBALS *******************************************************************/
-KSPIN_LOCK HalpSystemHardwareLock;
UCHAR HalpCmosCenturyOffset;
-ULONG HalpSystemHardwareFlags;
-/* PRIVATE FUNCTIONS **********************************************************/
-
-VOID
-NTAPI
-HalpAcquireSystemHardwareSpinLock(VOID)
-{
- ULONG Flags;
-
- /* Get flags and disable interrupts */
- Flags = __readeflags();
- _disable();
-
- /* Acquire the lock */
- KxAcquireSpinLock(&HalpSystemHardwareLock);
-
- /* We have the lock, save the flags now */
- HalpSystemHardwareFlags = Flags;
-}
-
-VOID
-NTAPI
-HalpReleaseCmosSpinLock(VOID)
-{
- ULONG Flags;
-
- /* Get the flags */
- Flags = HalpSystemHardwareFlags;
-
- /* Release the lock */
- KxReleaseSpinLock(&HalpSystemHardwareLock);
-
- /* Restore the flags */
- __writeeflags(Flags);
-}
+/* PRIVATE FUNCTIONS *********************************************************/
FORCEINLINE
UCHAR
diff --git a/hal/halx86/generic/portio.c b/hal/halx86/generic/i386/portio.c
similarity index 100%
rename from hal/halx86/generic/portio.c
rename to hal/halx86/generic/i386/portio.c
diff --git a/hal/halx86/generic/systimer.S b/hal/halx86/generic/i386/systimer.S
similarity index 100%
rename from hal/halx86/generic/systimer.S
rename to hal/halx86/generic/i386/systimer.S
diff --git a/hal/halx86/generic/trap.S b/hal/halx86/generic/i386/trap.S
similarity index 100%
rename from hal/halx86/generic/trap.S
rename to hal/halx86/generic/i386/trap.S
diff --git a/hal/halx86/generic/misc.c b/hal/halx86/generic/misc.c
index d188d50afb7..4ddd30ee589 100644
--- a/hal/halx86/generic/misc.c
+++ b/hal/halx86/generic/misc.c
@@ -245,3 +245,60 @@ KeFlushWriteBuffer(VOID)
//
return;
}
+
+#ifdef _M_IX86
+/* x86 fastcall wrappers */
+
+#undef KeRaiseIrql
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+KeRaiseIrql(KIRQL NewIrql,
+ PKIRQL OldIrql)
+{
+ /* Call the fastcall function */
+ *OldIrql = KfRaiseIrql(NewIrql);
+}
+
+#undef KeLowerIrql
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+KeLowerIrql(KIRQL NewIrql)
+{
+ /* Call the fastcall function */
+ KfLowerIrql(NewIrql);
+}
+
+#undef KeAcquireSpinLock
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+KeAcquireSpinLock(PKSPIN_LOCK SpinLock,
+ PKIRQL OldIrql)
+{
+ /* Call the fastcall function */
+ *OldIrql = KfAcquireSpinLock(SpinLock);
+}
+
+#undef KeReleaseSpinLock
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+KeReleaseSpinLock(PKSPIN_LOCK SpinLock,
+ KIRQL NewIrql)
+{
+ /* Call the fastcall function */
+ KfReleaseSpinLock(SpinLock, NewIrql);
+}
+
+#endif
+
diff --git a/hal/halx86/generic/pic.c b/hal/halx86/generic/pic.c
deleted file mode 100644
index a710d862567..00000000000
--- a/hal/halx86/generic/pic.c
+++ /dev/null
@@ -1,1363 +0,0 @@
-/*
- * PROJECT: ReactOS HAL
- * LICENSE: BSD - See COPYING.ARM in the top level directory
- * FILE: hal/halx86/generic/pic.c
- * PURPOSE: HAL PIC Management and Control Code
- * PROGRAMMERS: ReactOS Portable Systems Group
- */
-
-/* INCLUDES *******************************************************************/
-
-#include
-#define NDEBUG
-#include
-
-/* GLOBALS ********************************************************************/
-
-#ifndef _MINIHAL_
-/*
- * This table basically keeps track of level vs edge triggered interrupts.
- * Windows has 250+ entries, but it seems stupid to replicate that since the PIC
- * can't actually have that many.
- *
- * When a level interrupt is registered, the respective pointer in this table is
- * modified to point to a dimiss routine for level interrupts instead.
- *
- * The other thing this table does is special case IRQ7, IRQ13 and IRQ15:
- *
- * - If an IRQ line is deasserted before it is acknowledged due to a noise spike
- * generated by an expansion device (since the IRQ line is low during the 1st
- * acknowledge bus cycle), the i8259 will keep the line low for at least 100ns
- * When the spike passes, a pull-up resistor will return the IRQ line to high.
- * Since the PIC requires the input be high until the first acknowledge, the
- * i8259 knows that this was a spurious interrupt, and on the second interrupt
- * acknowledge cycle, it reports this to the CPU. Since no valid interrupt has
- * actually happened Intel hardcoded the chip to report IRQ7 on the master PIC
- * and IRQ15 on the slave PIC (IR7 either way).
- *
- * "ISA System Architecture", 3rd Edition, states that these cases should be
- * handled by reading the respective Interrupt Service Request (ISR) bits from
- * the affected PIC, and validate whether or not IR7 is set. If it isn't, then
- * the interrupt is spurious and should be ignored.
- *
- * Note that for a spurious IRQ15, we DO have to send an EOI to the master for
- * IRQ2 since the line was asserted by the slave when it received the spurious
- * IRQ15!
- *
- * - When the 80287/80387 math co-processor generates an FPU/NPX trap, this is
- * connected to IRQ13, so we have to clear the busy latch on the NPX port.
- */
-PHAL_DISMISS_INTERRUPT HalpSpecialDismissTable[16] =
-{
- HalpDismissIrqGeneric,
- HalpDismissIrqGeneric,
- HalpDismissIrqGeneric,
- HalpDismissIrqGeneric,
- HalpDismissIrqGeneric,
- HalpDismissIrqGeneric,
- HalpDismissIrqGeneric,
- HalpDismissIrq07,
- HalpDismissIrqGeneric,
- HalpDismissIrqGeneric,
- HalpDismissIrqGeneric,
- HalpDismissIrqGeneric,
- HalpDismissIrqGeneric,
- HalpDismissIrq13,
- HalpDismissIrqGeneric,
- HalpDismissIrq15
-};
-
-/*
- * These are the level IRQ dismissal functions that get copied in the table
- * above if the given IRQ is actually level triggered.
- */
-PHAL_DISMISS_INTERRUPT HalpSpecialDismissLevelTable[16] =
-{
- HalpDismissIrqLevel,
- HalpDismissIrqLevel,
- HalpDismissIrqLevel,
- HalpDismissIrqLevel,
- HalpDismissIrqLevel,
- HalpDismissIrqLevel,
- HalpDismissIrqLevel,
- HalpDismissIrq07Level,
- HalpDismissIrqLevel,
- HalpDismissIrqLevel,
- HalpDismissIrqLevel,
- HalpDismissIrqLevel,
- HalpDismissIrqLevel,
- HalpDismissIrq13Level,
- HalpDismissIrqLevel,
- HalpDismissIrq15Level
-};
-
-/* This table contains the static x86 PIC mapping between IRQLs and IRQs */
-ULONG KiI8259MaskTable[32] =
-{
-#ifdef __GNUC__
-#if __GNUC__ * 100 + __GNUC_MINOR__ >= 404
- /*
- * It Device IRQLs only start at 4 or higher, so these are just software
- * IRQLs that don't really change anything on the hardware
- */
- 0b00000000000000000000000000000000, /* IRQL 0 */
- 0b00000000000000000000000000000000, /* IRQL 1 */
- 0b00000000000000000000000000000000, /* IRQL 2 */
- 0b00000000000000000000000000000000, /* IRQL 3 */
-
- /*
- * These next IRQLs are actually useless from the PIC perspective, because
- * with only 2 PICs, the mask you can send them is only 8 bits each, for 16
- * bits total, so these IRQLs are masking off a phantom PIC.
- */
- 0b11111111100000000000000000000000, /* IRQL 4 */
- 0b11111111110000000000000000000000, /* IRQL 5 */
- 0b11111111111000000000000000000000, /* IRQL 6 */
- 0b11111111111100000000000000000000, /* IRQL 7 */
- 0b11111111111110000000000000000000, /* IRQL 8 */
- 0b11111111111111000000000000000000, /* IRQL 9 */
- 0b11111111111111100000000000000000, /* IRQL 10 */
- 0b11111111111111110000000000000000, /* IRQL 11 */
-
- /*
- * Okay, now we're finally starting to mask off IRQs on the slave PIC, from
- * IRQ15 to IRQ8. This means the higher-level IRQs get less priority in the
- * IRQL sense.
- */
- 0b11111111111111111000000000000000, /* IRQL 12 */
- 0b11111111111111111100000000000000, /* IRQL 13 */
- 0b11111111111111111110000000000000, /* IRQL 14 */
- 0b11111111111111111111000000000000, /* IRQL 15 */
- 0b11111111111111111111100000000000, /* IRQL 16 */
- 0b11111111111111111111110000000000, /* IRQL 17 */
- 0b11111111111111111111111000000000, /* IRQL 18 */
- 0b11111111111111111111111000000000, /* IRQL 19 */
-
- /*
- * Now we mask off the IRQs on the master. Notice the 0 "droplet"? You might
- * have also seen that IRQL 18 and 19 are essentially equal as far as the
- * PIC is concerned. That bit is actually IRQ8, which happens to be the RTC.
- * The RTC will keep firing as long as we don't reach PROFILE_LEVEL which
- * actually kills it. The RTC clock (unlike the system clock) is used by the
- * profiling APIs in the HAL, so that explains the logic.
- */
- 0b11111111111111111111111010000000, /* IRQL 20 */
- 0b11111111111111111111111011000000, /* IRQL 21 */
- 0b11111111111111111111111011100000, /* IRQL 22 */
- 0b11111111111111111111111011110000, /* IRQL 23 */
- 0b11111111111111111111111011111000, /* IRQL 24 */
- 0b11111111111111111111111011111000, /* IRQL 25 */
- 0b11111111111111111111111011111010, /* IRQL 26 */
- 0b11111111111111111111111111111010, /* IRQL 27 */
-
- /*
- * IRQL 24 and 25 are actually identical, so IRQL 28 is actually the last
- * IRQL to modify a bit on the master PIC. It happens to modify the very
- * last of the IRQs, IRQ0, which corresponds to the system clock interval
- * timer that keeps track of time (the Windows heartbeat). We only want to
- * turn this off at a high-enough IRQL, which is why IRQLs 24 and 25 are the
- * same to give this guy a chance to come up higher. Note that IRQL 28 is
- * called CLOCK2_LEVEL, which explains the usage we just explained.
- */
- 0b11111111111111111111111111111011, /* IRQL 28 */
-
- /*
- * We have finished off with the PIC so there's nothing left to mask at the
- * level of these IRQLs, making them only logical IRQLs on x86 machines.
- * Note that we have another 0 "droplet" you might've caught since IRQL 26.
- * In this case, it's the 2nd bit that never gets turned off, which is IRQ2,
- * the cascade IRQ that we use to bridge the slave PIC with the master PIC.
- * We never want to turn it off, so no matter the IRQL, it will be set to 0.
- */
- 0b11111111111111111111111111111011, /* IRQL 29 */
- 0b11111111111111111111111111111011, /* IRQL 30 */
- 0b11111111111111111111111111111011 /* IRQL 31 */
-#else
- 0, /* IRQL 0 */
- 0, /* IRQL 1 */
- 0, /* IRQL 2 */
- 0, /* IRQL 3 */
- 0xFF800000, /* IRQL 4 */
- 0xFFC00000, /* IRQL 5 */
- 0xFFE00000, /* IRQL 6 */
- 0xFFF00000, /* IRQL 7 */
- 0xFFF80000, /* IRQL 8 */
- 0xFFFC0000, /* IRQL 9 */
- 0xFFFE0000, /* IRQL 10 */
- 0xFFFF0000, /* IRQL 11 */
- 0xFFFF8000, /* IRQL 12 */
- 0xFFFFC000, /* IRQL 13 */
- 0xFFFFE000, /* IRQL 14 */
- 0xFFFFF000, /* IRQL 15 */
- 0xFFFFF800, /* IRQL 16 */
- 0xFFFFFC00, /* IRQL 17 */
- 0xFFFFFE00, /* IRQL 18 */
- 0xFFFFFE00, /* IRQL 19 */
- 0xFFFFFE80, /* IRQL 20 */
- 0xFFFFFEC0, /* IRQL 21 */
- 0xFFFFFEE0, /* IRQL 22 */
- 0xFFFFFEF0, /* IRQL 23 */
- 0xFFFFFEF8, /* IRQL 24 */
- 0xFFFFFEF8, /* IRQL 25 */
- 0xFFFFFEFA, /* IRQL 26 */
- 0xFFFFFFFA, /* IRQL 27 */
- 0xFFFFFFFB, /* IRQL 28 */
- 0xFFFFFFFB, /* IRQL 29 */
- 0xFFFFFFFB, /* IRQL 30 */
- 0xFFFFFFFB /* IRQL 31 */
-#endif
-#endif
-};
-
-/* This table indicates which IRQs, if pending, can preempt a given IRQL level */
-ULONG FindHigherIrqlMask[32] =
-{
-#ifdef __GNUC__
-#if __GNUC__ * 100 + __GNUC_MINOR__ >= 404
- /*
- * Software IRQLs, at these levels all hardware interrupts can preempt.
- * Each higher IRQL simply enables which software IRQL can preempt the
- * current level.
- */
- 0b11111111111111111111111111111110, /* IRQL 0 */
- 0b11111111111111111111111111111100, /* IRQL 1 */
- 0b11111111111111111111111111111000, /* IRQL 2 */
-
- /*
- * IRQL3 means only hardware IRQLs can now preempt. These last 4 zeros will
- * then continue throughout the rest of the list, trickling down.
- */
- 0b11111111111111111111111111110000, /* IRQL 3 */
-
- /*
- * Just like in the previous list, these masks don't really mean anything
- * since we've only got two PICs with 16 possible IRQs total
- */
- 0b00000111111111111111111111110000, /* IRQL 4 */
- 0b00000011111111111111111111110000, /* IRQL 5 */
- 0b00000001111111111111111111110000, /* IRQL 6 */
- 0b00000000111111111111111111110000, /* IRQL 7 */
- 0b00000000011111111111111111110000, /* IRQL 8 */
- 0b00000000001111111111111111110000, /* IRQL 9 */
- 0b00000000000111111111111111110000, /* IRQL 10 */
-
- /*
- * Now we start progressivly limiting which slave PIC interrupts have the
- * right to preempt us at each level.
- */
- 0b00000000000011111111111111110000, /* IRQL 11 */
- 0b00000000000001111111111111110000, /* IRQL 12 */
- 0b00000000000000111111111111110000, /* IRQL 13 */
- 0b00000000000000011111111111110000, /* IRQL 14 */
- 0b00000000000000001111111111110000, /* IRQL 15 */
- 0b00000000000000000111111111110000, /* IRQL 16 */
- 0b00000000000000000011111111110000, /* IRQL 17 */
- 0b00000000000000000001111111110000, /* IRQL 18 */
- 0b00000000000000000001111111110000, /* IRQL 19 */
-
- /*
- * Also recall from the earlier table that IRQL 18/19 are treated the same
- * in order to spread the masks better thoughout the 32 IRQLs and to reflect
- * the fact that some bits will always stay on until much higher IRQLs since
- * they are system-critical. One such example is the 1 bit that you start to
- * see trickling down here. This is IRQ8, the RTC timer used for profiling,
- * so it will always preempt until we reach PROFILE_LEVEL.
- */
- 0b00000000000000000001011111110000, /* IRQL 20 */
- 0b00000000000000000001001111110000, /* IRQL 20 */
- 0b00000000000000000001000111110000, /* IRQL 22 */
- 0b00000000000000000001000011110000, /* IRQL 23 */
- 0b00000000000000000001000001110000, /* IRQL 24 */
- 0b00000000000000000001000000110000, /* IRQL 25 */
- 0b00000000000000000001000000010000, /* IRQL 26 */
-
- /* At this point, only the clock (IRQ0) can still preempt... */
- 0b00000000000000000000000000010000, /* IRQL 27 */
-
- /* And any higher than that there's no relation with hardware PICs anymore */
- 0b00000000000000000000000000000000, /* IRQL 28 */
- 0b00000000000000000000000000000000, /* IRQL 29 */
- 0b00000000000000000000000000000000, /* IRQL 30 */
- 0b00000000000000000000000000000000, /* IRQL 31 */
-#else
- 0xFFFFFFFE, /* IRQL 0 */
- 0xFFFFFFFC, /* IRQL 1 */
- 0xFFFFFFF8, /* IRQL 2 */
- 0xFFFFFFF0, /* IRQL 3 */
- 0x7FFFFF0, /* IRQL 4 */
- 0x3FFFFF0, /* IRQL 5 */
- 0x1FFFFF0, /* IRQL 6 */
- 0x0FFFFF0, /* IRQL 7 */
- 0x7FFFF0, /* IRQL 8 */
- 0x3FFFF0, /* IRQL 9 */
- 0x1FFFF0, /* IRQL 10 */
- 0x0FFFF0, /* IRQL 11 */
- 0x7FFF0, /* IRQL 12 */
- 0x3FFF0, /* IRQL 13 */
- 0x1FFF0, /* IRQL 14 */
- 0x0FFF0, /* IRQL 15 */
- 0x7FF0, /* IRQL 16 */
- 0x3FF0, /* IRQL 17 */
- 0x1FF0, /* IRQL 18 */
- 0x1FF0, /* IRQL 19 */
- 0x17F0, /* IRQL 20 */
- 0x13F0, /* IRQL 21 */
- 0x11F0, /* IRQL 22 */
- 0x10F0, /* IRQL 23 */
- 0x1070, /* IRQL 24 */
- 0x1030, /* IRQL 25 */
- 0x1010, /* IRQL 26 */
- 0x10, /* IRQL 27 */
- 0, /* IRQL 28 */
- 0, /* IRQL 29 */
- 0, /* IRQL 30 */
- 0 /* IRQL 31 */
-#endif
-#endif
-};
-
-/* Denotes minimum required IRQL before we can process pending SW interrupts */
-KIRQL SWInterruptLookUpTable[8] =
-{
- PASSIVE_LEVEL, /* IRR 0 */
- PASSIVE_LEVEL, /* IRR 1 */
- APC_LEVEL, /* IRR 2 */
- APC_LEVEL, /* IRR 3 */
- DISPATCH_LEVEL, /* IRR 4 */
- DISPATCH_LEVEL, /* IRR 5 */
- DISPATCH_LEVEL, /* IRR 6 */
- DISPATCH_LEVEL /* IRR 7 */
-};
-
-#define HalpDelayedHardwareInterrupt(x) \
- VOID HalpHardwareInterrupt##x(VOID); \
- VOID \
- HalpHardwareInterrupt##x(VOID) \
- { \
- asm volatile ("int $%c0\n"::"i"(PRIMARY_VECTOR_BASE + x)); \
- }
-
-/* Pending/delayed hardware interrupt handlers */
-HalpDelayedHardwareInterrupt(0);
-HalpDelayedHardwareInterrupt(1);
-HalpDelayedHardwareInterrupt(2);
-HalpDelayedHardwareInterrupt(3);
-HalpDelayedHardwareInterrupt(4);
-HalpDelayedHardwareInterrupt(5);
-HalpDelayedHardwareInterrupt(6);
-HalpDelayedHardwareInterrupt(7);
-HalpDelayedHardwareInterrupt(8);
-HalpDelayedHardwareInterrupt(9);
-HalpDelayedHardwareInterrupt(10);
-HalpDelayedHardwareInterrupt(11);
-HalpDelayedHardwareInterrupt(12);
-HalpDelayedHardwareInterrupt(13);
-HalpDelayedHardwareInterrupt(14);
-HalpDelayedHardwareInterrupt(15);
-
-/* Handlers for pending interrupts */
-PHAL_SW_INTERRUPT_HANDLER SWInterruptHandlerTable[20] =
-{
- KiUnexpectedInterrupt,
- HalpApcInterrupt,
- HalpDispatchInterrupt2,
- KiUnexpectedInterrupt,
- HalpHardwareInterrupt0,
- HalpHardwareInterrupt1,
- HalpHardwareInterrupt2,
- HalpHardwareInterrupt3,
- HalpHardwareInterrupt4,
- HalpHardwareInterrupt5,
- HalpHardwareInterrupt6,
- HalpHardwareInterrupt7,
- HalpHardwareInterrupt8,
- HalpHardwareInterrupt9,
- HalpHardwareInterrupt10,
- HalpHardwareInterrupt11,
- HalpHardwareInterrupt12,
- HalpHardwareInterrupt13,
- HalpHardwareInterrupt14,
- HalpHardwareInterrupt15
-};
-
-/* Handlers for pending software interrupts when we already have a trap frame*/
-PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY SWInterruptHandlerTable2[3] =
-{
- (PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY)KiUnexpectedInterrupt,
- HalpApcInterrupt2ndEntry,
- HalpDispatchInterrupt2ndEntry
-};
-
-LONG HalpEisaELCR;
-
-/* FUNCTIONS ******************************************************************/
-
-VOID
-NTAPI
-HalpInitializePICs(IN BOOLEAN EnableInterrupts)
-{
- ULONG EFlags;
- I8259_ICW1 Icw1;
- I8259_ICW2 Icw2;
- I8259_ICW3 Icw3;
- I8259_ICW4 Icw4;
- EISA_ELCR Elcr;
- ULONG i, j;
-
- /* Save EFlags and disable interrupts */
- EFlags = __readeflags();
- _disable();
-
- /* Initialize ICW1 for master, interval 8, edge-triggered mode with ICW4 */
- Icw1.NeedIcw4 = TRUE;
- Icw1.InterruptMode = EdgeTriggered;
- Icw1.OperatingMode = Cascade;
- Icw1.Interval = Interval8;
- Icw1.Init = TRUE;
- Icw1.InterruptVectorAddress = 0; /* This is only used in MCS80/85 mode */
- __outbyte(PIC1_CONTROL_PORT, Icw1.Bits);
-
- /* Set interrupt vector base */
- Icw2.Bits = PRIMARY_VECTOR_BASE;
- __outbyte(PIC1_DATA_PORT, Icw2.Bits);
-
- /* Connect slave to IRQ 2 */
- Icw3.Bits = 0;
- Icw3.SlaveIrq2 = TRUE;
- __outbyte(PIC1_DATA_PORT, Icw3.Bits);
-
- /* Enable 8086 mode, non-automatic EOI, non-buffered mode, non special fully nested mode */
- Icw4.Reserved = 0;
- Icw4.SystemMode = New8086Mode;
- Icw4.EoiMode = NormalEoi;
- Icw4.BufferedMode = NonBuffered;
- Icw4.SpecialFullyNestedMode = FALSE;
- __outbyte(PIC1_DATA_PORT, Icw4.Bits);
-
- /* Mask all interrupts */
- __outbyte(PIC1_DATA_PORT, 0xFF);
-
- /* Initialize ICW1 for master, interval 8, edge-triggered mode with ICW4 */
- Icw1.NeedIcw4 = TRUE;
- Icw1.InterruptMode = EdgeTriggered;
- Icw1.OperatingMode = Cascade;
- Icw1.Interval = Interval8;
- Icw1.Init = TRUE;
- Icw1.InterruptVectorAddress = 0; /* This is only used in MCS80/85 mode */
- __outbyte(PIC2_CONTROL_PORT, Icw1.Bits);
-
- /* Set interrupt vector base */
- Icw2.Bits = PRIMARY_VECTOR_BASE + 8;
- __outbyte(PIC2_DATA_PORT, Icw2.Bits);
-
- /* Slave ID */
- Icw3.Bits = 0;
- Icw3.SlaveId = 2;
- __outbyte(PIC2_DATA_PORT, Icw3.Bits);
-
- /* Enable 8086 mode, non-automatic EOI, non-buffered mode, non special fully nested mode */
- Icw4.Reserved = 0;
- Icw4.SystemMode = New8086Mode;
- Icw4.EoiMode = NormalEoi;
- Icw4.BufferedMode = NonBuffered;
- Icw4.SpecialFullyNestedMode = FALSE;
- __outbyte(PIC2_DATA_PORT, Icw4.Bits);
-
- /* Mask all interrupts */
- __outbyte(PIC2_DATA_PORT, 0xFF);
-
- /* Read EISA Edge/Level Register for master and slave */
- Elcr.Bits = (__inbyte(EISA_ELCR_SLAVE) << 8) | __inbyte(EISA_ELCR_MASTER);
-
- /* IRQs 0, 1, 2, 8, and 13 are system-reserved and must be edge */
- if (!(Elcr.Master.Irq0Level) && !(Elcr.Master.Irq1Level) && !(Elcr.Master.Irq2Level) &&
- !(Elcr.Slave.Irq8Level) && !(Elcr.Slave.Irq13Level))
- {
- /* ELCR is as it's supposed to be, save it */
- HalpEisaELCR = Elcr.Bits;
-
- /* Scan for level interrupts */
- for (i = 1, j = 0; j < 16; i <<= 1, j++)
- {
- if (HalpEisaELCR & i)
- {
- /* Switch handler to level */
- SWInterruptHandlerTable[j + 4] = HalpHardwareInterruptLevel;
-
- /* Switch dismiss to level */
- HalpSpecialDismissTable[j] = HalpSpecialDismissLevelTable[j];
- }
- }
- }
-
- /* Restore interrupt state */
- if (EnableInterrupts) EFlags |= EFLAGS_INTERRUPT_MASK;
- __writeeflags(EFlags);
-}
-
-/* IRQL MANAGEMENT ************************************************************/
-
-/*
- * @implemented
- */
-KIRQL
-NTAPI
-KeGetCurrentIrql(VOID)
-{
- /* Return the IRQL */
- return KeGetPcr()->Irql;
-}
-
-/*
- * @implemented
- */
-KIRQL
-NTAPI
-KeRaiseIrqlToDpcLevel(VOID)
-{
- PKPCR Pcr = KeGetPcr();
- KIRQL CurrentIrql;
-
- /* Save and update IRQL */
- CurrentIrql = Pcr->Irql;
- Pcr->Irql = DISPATCH_LEVEL;
-
-#ifdef IRQL_DEBUG
- /* Validate correct raise */
- if (CurrentIrql > DISPATCH_LEVEL) KeBugCheck(IRQL_NOT_GREATER_OR_EQUAL);
-#endif
-
- /* Return the previous value */
- return CurrentIrql;
-}
-
-/*
- * @implemented
- */
-KIRQL
-NTAPI
-KeRaiseIrqlToSynchLevel(VOID)
-{
- PKPCR Pcr = KeGetPcr();
- KIRQL CurrentIrql;
-
- /* Save and update IRQL */
- CurrentIrql = Pcr->Irql;
- Pcr->Irql = SYNCH_LEVEL;
-
-#ifdef IRQL_DEBUG
- /* Validate correct raise */
- if (CurrentIrql > SYNCH_LEVEL)
- {
- /* Crash system */
- KeBugCheckEx(IRQL_NOT_GREATER_OR_EQUAL,
- CurrentIrql,
- SYNCH_LEVEL,
- 0,
- 1);
- }
-#endif
-
- /* Return the previous value */
- return CurrentIrql;
-}
-
-/*
- * @implemented
- */
-KIRQL
-FASTCALL
-KfRaiseIrql(IN KIRQL NewIrql)
-{
- PKPCR Pcr = KeGetPcr();
- KIRQL CurrentIrql;
-
- /* Read current IRQL */
- CurrentIrql = Pcr->Irql;
-
-#ifdef IRQL_DEBUG
- /* Validate correct raise */
- if (CurrentIrql > NewIrql)
- {
- /* Crash system */
- Pcr->Irql = PASSIVE_LEVEL;
- KeBugCheck(IRQL_NOT_GREATER_OR_EQUAL);
- }
-#endif
-
- /* Set new IRQL */
- Pcr->Irql = NewIrql;
-
- /* Return old IRQL */
- return CurrentIrql;
-}
-
-
-/*
- * @implemented
- */
-VOID
-FASTCALL
-KfLowerIrql(IN KIRQL OldIrql)
-{
- ULONG EFlags;
- ULONG PendingIrql, PendingIrqlMask;
- PKPCR Pcr = KeGetPcr();
- PIC_MASK Mask;
-
-#ifdef IRQL_DEBUG
- /* Validate correct lower */
- if (OldIrql > Pcr->Irql)
- {
- /* Crash system */
- Pcr->Irql = HIGH_LEVEL;
- KeBugCheck(IRQL_NOT_LESS_OR_EQUAL);
- }
-#endif
-
- /* Save EFlags and disable interrupts */
- EFlags = __readeflags();
- _disable();
-
- /* Set old IRQL */
- Pcr->Irql = OldIrql;
-
- /* Check for pending software interrupts and compare with current IRQL */
- PendingIrqlMask = Pcr->IRR & FindHigherIrqlMask[OldIrql];
- if (PendingIrqlMask)
- {
- /* Check if pending IRQL affects hardware state */
- BitScanReverse(&PendingIrql, PendingIrqlMask);
- if (PendingIrql > DISPATCH_LEVEL)
- {
- /* Set new PIC mask */
- Mask.Both = Pcr->IDR;
- __outbyte(PIC1_DATA_PORT, Mask.Master);
- __outbyte(PIC2_DATA_PORT, Mask.Slave);
-
- /* Clear IRR bit */
- Pcr->IRR ^= (1 << PendingIrql);
- }
-
- /* Now handle pending interrupt */
- SWInterruptHandlerTable[PendingIrql]();
- }
-
- /* Restore interrupt state */
- __writeeflags(EFlags);
-}
-
-/* SOFTWARE INTERRUPTS ********************************************************/
-
-/*
- * @implemented
- */
-VOID
-FASTCALL
-HalRequestSoftwareInterrupt(IN KIRQL Irql)
-{
- ULONG EFlags;
- PKPCR Pcr = KeGetPcr();
- KIRQL PendingIrql;
-
- /* Save EFlags and disable interrupts */
- EFlags = __readeflags();
- _disable();
-
- /* Mask out the requested bit */
- Pcr->IRR |= (1 << Irql);
-
- /* Check for pending software interrupts and compare with current IRQL */
- PendingIrql = SWInterruptLookUpTable[Pcr->IRR & 3];
- if (PendingIrql > Pcr->Irql) SWInterruptHandlerTable[PendingIrql]();
-
- /* Restore interrupt state */
- __writeeflags(EFlags);
-}
-
-/*
- * @implemented
- */
-VOID
-FASTCALL
-HalClearSoftwareInterrupt(IN KIRQL Irql)
-{
- /* Mask out the requested bit */
- KeGetPcr()->IRR &= ~(1 << Irql);
-}
-
-VOID
-NTAPI
-HalpEndSoftwareInterrupt(IN KIRQL OldIrql,
- IN PKTRAP_FRAME TrapFrame)
-{
- ULONG PendingIrql, PendingIrqlMask, PendingIrqMask;
- PKPCR Pcr = KeGetPcr();
- PIC_MASK Mask;
-
- /* Set old IRQL */
- Pcr->Irql = OldIrql;
-
- /* Loop checking for pending interrupts */
- while (TRUE)
- {
- /* Check for pending software interrupts and compare with current IRQL */
- PendingIrqlMask = Pcr->IRR & FindHigherIrqlMask[OldIrql];
- if (!PendingIrqlMask) return;
-
- /* Check for in-service delayed interrupt */
- if (Pcr->IrrActive & 0xFFFFFFF0) return;
-
- /* Check if pending IRQL affects hardware state */
- BitScanReverse(&PendingIrql, PendingIrqlMask);
- if (PendingIrql > DISPATCH_LEVEL)
- {
- /* Set new PIC mask */
- Mask.Both = Pcr->IDR;
- __outbyte(PIC1_DATA_PORT, Mask.Master);
- __outbyte(PIC2_DATA_PORT, Mask.Slave);
-
- /* Set active bit otherwise, and clear it from IRR */
- PendingIrqMask = (1 << PendingIrql);
- Pcr->IrrActive |= PendingIrqMask;
- Pcr->IRR ^= PendingIrqMask;
-
- /* Handle delayed hardware interrupt */
- SWInterruptHandlerTable[PendingIrql]();
-
- /* Handling complete */
- Pcr->IrrActive ^= PendingIrqMask;
- }
- else
- {
- /* No need to loop checking for hardware interrupts */
- SWInterruptHandlerTable2[PendingIrql](TrapFrame);
- }
- }
-}
-
-/* EDGE INTERRUPT DISMISSAL FUNCTIONS *****************************************/
-
-BOOLEAN
-FORCEINLINE
-_HalpDismissIrqGeneric(IN KIRQL Irql,
- IN ULONG Irq,
- OUT PKIRQL OldIrql)
-{
- PIC_MASK Mask;
- KIRQL CurrentIrql;
- I8259_OCW2 Ocw2;
- PKPCR Pcr = KeGetPcr();
-
- /* First save current IRQL and compare it to the requested one */
- CurrentIrql = Pcr->Irql;
-
- /* Check if this interrupt is really allowed to happen */
- if (Irql > CurrentIrql)
- {
- /* Set the new IRQL and return the current one */
- Pcr->Irql = Irql;
- *OldIrql = CurrentIrql;
-
- /* Prepare OCW2 for EOI */
- Ocw2.Bits = 0;
- Ocw2.EoiMode = SpecificEoi;
-
- /* Check which PIC needs the EOI */
- if (Irq > 8)
- {
- /* Send the EOI for the IRQ */
- __outbyte(PIC2_CONTROL_PORT, Ocw2.Bits | (Irq - 8));
-
- /* Send the EOI for IRQ2 on the master because this was cascaded */
- __outbyte(PIC1_CONTROL_PORT, Ocw2.Bits | 2);
- }
- else
- {
- /* Send the EOI for the IRQ */
- __outbyte(PIC1_CONTROL_PORT, Ocw2.Bits | Irq);
- }
-
- /* Enable interrupts and return success */
- _enable();
- return TRUE;
- }
-
- /* Update the IRR so that we deliver this interrupt when the IRQL is proper */
- Pcr->IRR |= (1 << (Irq + 4));
-
- /* Set new PIC mask to real IRQL level, since the optimization is lost now */
- Mask.Both = KiI8259MaskTable[CurrentIrql] | Pcr->IDR;
- __outbyte(PIC1_DATA_PORT, Mask.Master);
- __outbyte(PIC2_DATA_PORT, Mask.Slave);
-
- /* Now lie and say this was spurious */
- return FALSE;
-}
-
-BOOLEAN
-__attribute__((regparm(3)))
-HalpDismissIrqGeneric(IN KIRQL Irql,
- IN ULONG Irq,
- OUT PKIRQL OldIrql)
-{
- /* Run the inline code */
- return _HalpDismissIrqGeneric(Irql, Irq, OldIrql);
-}
-
-BOOLEAN
-__attribute__((regparm(3)))
-HalpDismissIrq15(IN KIRQL Irql,
- IN ULONG Irq,
- OUT PKIRQL OldIrql)
-{
- I8259_OCW3 Ocw3;
- I8259_OCW2 Ocw2;
- I8259_ISR Isr;
-
- /* Request the ISR */
- Ocw3.Bits = 0;
- Ocw3.Sbo = 1; /* This encodes an OCW3 vs. an OCW2 */
- Ocw3.ReadRequest = ReadIsr;
- __outbyte(PIC2_CONTROL_PORT, Ocw3.Bits);
-
- /* Read the ISR */
- Isr.Bits = __inbyte(PIC2_CONTROL_PORT);
-
- /* Is IRQ15 really active (this is IR7) */
- if (Isr.Irq7 == FALSE)
- {
- /* It isn't, so we have to EOI IRQ2 because this was cascaded */
- Ocw2.Bits = 0;
- Ocw2.EoiMode = SpecificEoi;
- __outbyte(PIC1_CONTROL_PORT, Ocw2.Bits | 2);
-
- /* And now fail since this was spurious */
- return FALSE;
- }
-
- /* Do normal interrupt dismiss */
- return _HalpDismissIrqGeneric(Irql, Irq, OldIrql);
-}
-
-
-BOOLEAN
-__attribute__((regparm(3)))
-HalpDismissIrq13(IN KIRQL Irql,
- IN ULONG Irq,
- OUT PKIRQL OldIrql)
-{
- /* Clear the FPU busy latch */
- __outbyte(0xF0, 0);
-
- /* Do normal interrupt dismiss */
- return _HalpDismissIrqGeneric(Irql, Irq, OldIrql);
-}
-
-BOOLEAN
-__attribute__((regparm(3)))
-HalpDismissIrq07(IN KIRQL Irql,
- IN ULONG Irq,
- OUT PKIRQL OldIrql)
-{
- I8259_OCW3 Ocw3;
- I8259_ISR Isr;
-
- /* Request the ISR */
- Ocw3.Bits = 0;
- Ocw3.Sbo = 1;
- Ocw3.ReadRequest = ReadIsr;
- __outbyte(PIC1_CONTROL_PORT, Ocw3.Bits);
-
- /* Read the ISR */
- Isr.Bits = __inbyte(PIC1_CONTROL_PORT);
-
- /* Is IRQ 7 really active? If it isn't, this is spurious so fail */
- if (Isr.Irq7 == FALSE) return FALSE;
-
- /* Do normal interrupt dismiss */
- return _HalpDismissIrqGeneric(Irql, Irq, OldIrql);
-}
-
-/* LEVEL INTERRUPT DISMISSAL FUNCTIONS ****************************************/
-
-BOOLEAN
-FORCEINLINE
-_HalpDismissIrqLevel(IN KIRQL Irql,
- IN ULONG Irq,
- OUT PKIRQL OldIrql)
-{
- PIC_MASK Mask;
- KIRQL CurrentIrql;
- I8259_OCW2 Ocw2;
- PKPCR Pcr = KeGetPcr();
-
- /* Update the PIC */
- Mask.Both = KiI8259MaskTable[Irql] | Pcr->IDR;
- __outbyte(PIC1_DATA_PORT, Mask.Master);
- __outbyte(PIC2_DATA_PORT, Mask.Slave);
-
- /* Update the IRR so that we clear this interrupt when the IRQL is proper */
- Pcr->IRR |= (1 << (Irq + 4));
-
- /* Save current IRQL */
- CurrentIrql = Pcr->Irql;
-
- /* Prepare OCW2 for EOI */
- Ocw2.Bits = 0;
- Ocw2.EoiMode = SpecificEoi;
-
- /* Check which PIC needs the EOI */
- if (Irq > 8)
- {
- /* Send the EOI for the IRQ */
- __outbyte(PIC2_CONTROL_PORT, Ocw2.Bits | (Irq - 8));
-
- /* Send the EOI for IRQ2 on the master because this was cascaded */
- __outbyte(PIC1_CONTROL_PORT, Ocw2.Bits | 2);
- }
- else
- {
- /* Send the EOI for the IRQ */
- __outbyte(PIC1_CONTROL_PORT, Ocw2.Bits | Irq);
- }
-
- /* Check if this interrupt should be allowed to happen */
- if (Irql > CurrentIrql)
- {
- /* Set the new IRQL and return the current one */
- Pcr->Irql = Irql;
- *OldIrql = CurrentIrql;
-
- /* Enable interrupts and return success */
- _enable();
- return TRUE;
- }
-
- /* Now lie and say this was spurious */
- return FALSE;
-}
-
-BOOLEAN
-__attribute__((regparm(3)))
-HalpDismissIrqLevel(IN KIRQL Irql,
- IN ULONG Irq,
- OUT PKIRQL OldIrql)
-{
- /* Run the inline code */
- return _HalpDismissIrqLevel(Irql, Irq, OldIrql);
-}
-
-BOOLEAN
-__attribute__((regparm(3)))
-HalpDismissIrq15Level(IN KIRQL Irql,
- IN ULONG Irq,
- OUT PKIRQL OldIrql)
-{
- I8259_OCW3 Ocw3;
- I8259_OCW2 Ocw2;
- I8259_ISR Isr;
-
- /* Request the ISR */
- Ocw3.Bits = 0;
- Ocw3.Sbo = 1; /* This encodes an OCW3 vs. an OCW2 */
- Ocw3.ReadRequest = ReadIsr;
- __outbyte(PIC2_CONTROL_PORT, Ocw3.Bits);
-
- /* Read the ISR */
- Isr.Bits = __inbyte(PIC2_CONTROL_PORT);
-
- /* Is IRQ15 really active (this is IR7) */
- if (Isr.Irq7 == FALSE)
- {
- /* It isn't, so we have to EOI IRQ2 because this was cascaded */
- Ocw2.Bits = 0;
- Ocw2.EoiMode = SpecificEoi;
- __outbyte(PIC1_CONTROL_PORT, Ocw2.Bits | 2);
-
- /* And now fail since this was spurious */
- return FALSE;
- }
-
- /* Do normal interrupt dismiss */
- return _HalpDismissIrqLevel(Irql, Irq, OldIrql);
-}
-
-BOOLEAN
-__attribute__((regparm(3)))
-HalpDismissIrq13Level(IN KIRQL Irql,
- IN ULONG Irq,
- OUT PKIRQL OldIrql)
-{
- /* Clear the FPU busy latch */
- __outbyte(0xF0, 0);
-
- /* Do normal interrupt dismiss */
- return _HalpDismissIrqLevel(Irql, Irq, OldIrql);
-}
-
-BOOLEAN
-__attribute__((regparm(3)))
-HalpDismissIrq07Level(IN KIRQL Irql,
- IN ULONG Irq,
- OUT PKIRQL OldIrql)
-{
- I8259_OCW3 Ocw3;
- I8259_ISR Isr;
-
- /* Request the ISR */
- Ocw3.Bits = 0;
- Ocw3.Sbo = 1;
- Ocw3.ReadRequest = ReadIsr;
- __outbyte(PIC1_CONTROL_PORT, Ocw3.Bits);
-
- /* Read the ISR */
- Isr.Bits = __inbyte(PIC1_CONTROL_PORT);
-
- /* Is IRQ 7 really active? If it isn't, this is spurious so fail */
- if (Isr.Irq7 == FALSE) return FALSE;
-
- /* Do normal interrupt dismiss */
- return _HalpDismissIrqLevel(Irql, Irq, OldIrql);
-}
-
-VOID
-HalpHardwareInterruptLevel(VOID)
-{
- PKPCR Pcr = KeGetPcr();
- ULONG PendingIrqlMask, PendingIrql;
-
- /* Check for pending software interrupts and compare with current IRQL */
- PendingIrqlMask = Pcr->IRR & FindHigherIrqlMask[Pcr->Irql];
- if (PendingIrqlMask)
- {
- /* Check for in-service delayed interrupt */
- if (Pcr->IrrActive & 0xFFFFFFF0) return;
-
- /* Check if pending IRQL affects hardware state */
- BitScanReverse(&PendingIrql, PendingIrqlMask);
-
- /* Clear IRR bit */
- Pcr->IRR ^= (1 << PendingIrql);
-
- /* Now handle pending interrupt */
- SWInterruptHandlerTable[PendingIrql]();
- }
-}
-
-/* SYSTEM INTERRUPTS **********************************************************/
-
-/*
- * @implemented
- */
-BOOLEAN
-NTAPI
-HalEnableSystemInterrupt(IN UCHAR Vector,
- IN KIRQL Irql,
- IN KINTERRUPT_MODE InterruptMode)
-{
- ULONG Irq;
- PKPCR Pcr = KeGetPcr();
- PIC_MASK PicMask;
-
- /* Validate the IRQ */
- Irq = Vector - PRIMARY_VECTOR_BASE;
- if (Irq >= CLOCK2_LEVEL) return FALSE;
-
- /* Check for level interrupt */
- if (InterruptMode == LevelSensitive)
- {
- /* Switch handler to level */
- SWInterruptHandlerTable[Irq + 4] = HalpHardwareInterruptLevel;
-
- /* Switch dismiss to level */
- HalpSpecialDismissTable[Irq] = HalpSpecialDismissLevelTable[Irq];
- }
-
- /* Disable interrupts */
- _disable();
-
- /* Update software IDR */
- Pcr->IDR &= ~(1 << Irq);
-
- /* Set new PIC mask */
- PicMask.Both = KiI8259MaskTable[Pcr->Irql] | Pcr->IDR;
- __outbyte(PIC1_DATA_PORT, PicMask.Master);
- __outbyte(PIC2_DATA_PORT, PicMask.Slave);
-
- /* Enable interrupts and exit */
- _enable();
- return TRUE;
-}
-
-/*
- * @implemented
- */
-VOID
-NTAPI
-HalDisableSystemInterrupt(IN UCHAR Vector,
- IN KIRQL Irql)
-{
- ULONG IrqMask;
- PIC_MASK PicMask;
-
- /* Compute new combined IRQ mask */
- IrqMask = 1 << (Vector - PRIMARY_VECTOR_BASE);
-
- /* Disable interrupts */
- _disable();
-
- /* Update software IDR */
- KeGetPcr()->IDR |= IrqMask;
-
- /* Read current interrupt mask */
- PicMask.Master = __inbyte(PIC1_DATA_PORT);
- PicMask.Slave = __inbyte(PIC2_DATA_PORT);
-
- /* Add the new disabled interrupt */
- PicMask.Both |= IrqMask;
-
- /* Write new interrupt mask */
- __outbyte(PIC1_DATA_PORT, PicMask.Master);
- __outbyte(PIC2_DATA_PORT, PicMask.Slave);
-
- /* Bring interrupts back */
- _enable();
-}
-
-/*
- * @implemented
- */
-BOOLEAN
-NTAPI
-HalBeginSystemInterrupt(IN KIRQL Irql,
- IN UCHAR Vector,
- OUT PKIRQL OldIrql)
-{
- ULONG Irq;
-
- /* Get the IRQ and call the proper routine to handle it */
- Irq = Vector - PRIMARY_VECTOR_BASE;
- return HalpSpecialDismissTable[Irq](Irql, Irq, OldIrql);
-}
-
-/*
- * @implemented
- */
-VOID
-NTAPI
-HalEndSystemInterrupt(IN KIRQL OldIrql,
- IN PKTRAP_FRAME TrapFrame)
-{
- ULONG PendingIrql, PendingIrqlMask, PendingIrqMask;
- PKPCR Pcr = KeGetPcr();
- PIC_MASK Mask;
-
- /* Set old IRQL */
- Pcr->Irql = OldIrql;
-
- /* Check for pending software interrupts and compare with current IRQL */
- PendingIrqlMask = Pcr->IRR & FindHigherIrqlMask[OldIrql];
- if (PendingIrqlMask)
- {
- /* Check for in-service delayed interrupt */
- if (Pcr->IrrActive & 0xFFFFFFF0) return;
-
- /* Loop checking for pending interrupts */
- while (TRUE)
- {
- /* Check if pending IRQL affects hardware state */
- BitScanReverse(&PendingIrql, PendingIrqlMask);
- if (PendingIrql > DISPATCH_LEVEL)
- {
- /* Set new PIC mask */
- Mask.Both = Pcr->IDR;
- __outbyte(PIC1_DATA_PORT, Mask.Master);
- __outbyte(PIC2_DATA_PORT, Mask.Slave);
-
- /* Now check if this specific interrupt is already in-service */
- PendingIrqMask = (1 << PendingIrql);
- if (Pcr->IrrActive & PendingIrqMask) return;
-
- /* Set active bit otherwise, and clear it from IRR */
- Pcr->IrrActive |= PendingIrqMask;
- Pcr->IRR ^= PendingIrqMask;
-
- /* Handle delayed hardware interrupt */
- SWInterruptHandlerTable[PendingIrql]();
-
- /* Handling complete */
- Pcr->IrrActive ^= PendingIrqMask;
-
- /* Check if there's still interrupts pending */
- PendingIrqlMask = Pcr->IRR & FindHigherIrqlMask[Pcr->Irql];
- if (!PendingIrqlMask) break;
- }
- else
- {
- /* Now handle pending software interrupt */
- SWInterruptHandlerTable2[PendingIrql](TrapFrame);
- }
- }
- }
-}
-
-/* SOFTWARE INTERRUPT TRAPS ***************************************************/
-
-VOID
-FORCEINLINE
-DECLSPEC_NORETURN
-_HalpApcInterruptHandler(IN PKTRAP_FRAME TrapFrame)
-{
- KIRQL CurrentIrql;
- PKPCR Pcr = KeGetPcr();
-
- /* Save the current IRQL and update it */
- CurrentIrql = Pcr->Irql;
- Pcr->Irql = APC_LEVEL;
-
- /* Remove DPC from IRR */
- Pcr->IRR &= ~(1 << APC_LEVEL);
-
- /* Enable interrupts and call the kernel's APC interrupt handler */
- _enable();
- KiDeliverApc(((KiUserTrap(TrapFrame)) || (TrapFrame->EFlags & EFLAGS_V86_MASK)) ?
- UserMode : KernelMode,
- NULL,
- TrapFrame);
-
- /* Disable interrupts and end the interrupt */
- _disable();
- HalpEndSoftwareInterrupt(CurrentIrql, TrapFrame);
-
- /* Exit the interrupt */
- KiEoiHelper(TrapFrame);
-}
-
-VOID
-FASTCALL
-DECLSPEC_NORETURN
-HalpApcInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame)
-{
- /* Do the work */
- _HalpApcInterruptHandler(TrapFrame);
-}
-
-VOID
-FASTCALL
-DECLSPEC_NORETURN
-HalpApcInterruptHandler(IN PKTRAP_FRAME TrapFrame)
-{
- /* Set up a fake INT Stack */
- TrapFrame->EFlags = __readeflags();
- TrapFrame->SegCs = KGDT_R0_CODE;
- TrapFrame->Eip = TrapFrame->Eax;
-
- /* Build the trap frame */
- KiEnterInterruptTrap(TrapFrame);
-
- /* Do the work */
- _HalpApcInterruptHandler(TrapFrame);
-}
-
-KIRQL
-FORCEINLINE
-_HalpDispatchInterruptHandler(VOID)
-{
- KIRQL CurrentIrql;
- PKPCR Pcr = KeGetPcr();
-
- /* Save the current IRQL and update it */
- CurrentIrql = Pcr->Irql;
- Pcr->Irql = DISPATCH_LEVEL;
-
- /* Remove DPC from IRR */
- Pcr->IRR &= ~(1 << DISPATCH_LEVEL);
-
- /* Enable interrupts and call the kernel's DPC interrupt handler */
- _enable();
- KiDispatchInterrupt();
- _disable();
-
- /* Return IRQL */
- return CurrentIrql;
-}
-
-VOID
-FASTCALL
-DECLSPEC_NORETURN
-HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame)
-{
- KIRQL CurrentIrql;
-
- /* Do the work */
- CurrentIrql = _HalpDispatchInterruptHandler();
-
- /* End the interrupt */
- HalpEndSoftwareInterrupt(CurrentIrql, TrapFrame);
-
- /* Exit the interrupt */
- KiEoiHelper(TrapFrame);
-}
-
-VOID
-HalpDispatchInterrupt2(VOID)
-{
- ULONG PendingIrqlMask, PendingIrql;
- KIRQL OldIrql;
- PIC_MASK Mask;
- PKPCR Pcr = KeGetPcr();
-
- /* Do the work */
- OldIrql = _HalpDispatchInterruptHandler();
-
- /* Restore IRQL */
- Pcr->Irql = OldIrql;
-
- /* Check for pending software interrupts and compare with current IRQL */
- PendingIrqlMask = Pcr->IRR & FindHigherIrqlMask[OldIrql];
- if (PendingIrqlMask)
- {
- /* Check if pending IRQL affects hardware state */
- BitScanReverse(&PendingIrql, PendingIrqlMask);
- if (PendingIrql > DISPATCH_LEVEL)
- {
- /* Set new PIC mask */
- Mask.Both = Pcr->IDR;
- __outbyte(PIC1_DATA_PORT, Mask.Master);
- __outbyte(PIC2_DATA_PORT, Mask.Slave);
-
- /* Clear IRR bit */
- Pcr->IRR ^= (1 << PendingIrql);
- }
-
- /* Now handle pending interrupt */
- SWInterruptHandlerTable[PendingIrql]();
- }
-}
-
-#else
-
-KIRQL
-NTAPI
-KeGetCurrentIrql(VOID)
-{
- return PASSIVE_LEVEL;
-}
-
-VOID
-FASTCALL
-KfLowerIrql(
- IN KIRQL OldIrql)
-{
-}
-
-KIRQL
-FASTCALL
-KfRaiseIrql(
- IN KIRQL NewIrql)
-{
- return NewIrql;
-}
-
-#endif
diff --git a/hal/halx86/generic/processor.c b/hal/halx86/generic/processor.c
deleted file mode 100644
index 662514b19cf..00000000000
--- a/hal/halx86/generic/processor.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * PROJECT: ReactOS HAL
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: hal/halx86/up/processor.c
- * PURPOSE: HAL Processor Routines
- * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
- */
-
-/* INCLUDES ******************************************************************/
-
-#include
-#define NDEBUG
-#include
-
-LONG HalpActiveProcessors;
-KAFFINITY HalpDefaultInterruptAffinity;
-
-/* PRIVATE FUNCTIONS *********************************************************/
-
-VOID
-NTAPI
-HaliHaltSystem(VOID)
-{
- /* Disable interrupts and halt the CPU */
- _disable();
- __halt();
-}
-
-/* FUNCTIONS *****************************************************************/
-
-/*
- * @implemented
- */
-VOID
-NTAPI
-HalInitializeProcessor(IN ULONG ProcessorNumber,
- IN PLOADER_PARAMETER_BLOCK LoaderBlock)
-{
- /* Set default IDR and stall count */
- KeGetPcr()->IDR = 0xFFFFFFFB;
- KeGetPcr()->StallScaleFactor = INITIAL_STALL_COUNT;
-
- /* Update the interrupt affinity and processor mask */
- InterlockedBitTestAndSet(&HalpActiveProcessors, ProcessorNumber);
- InterlockedBitTestAndSet((PLONG)&HalpDefaultInterruptAffinity,
- ProcessorNumber);
-
- /* Register routines for KDCOM */
- HalpRegisterKdSupportFunctions();
-}
-
-/*
- * @implemented
- */
-BOOLEAN
-NTAPI
-HalAllProcessorsStarted(VOID)
-{
- /* Do nothing */
- return TRUE;
-}
-
-/*
- * @implemented
- */
-BOOLEAN
-NTAPI
-HalStartNextProcessor(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
- IN PKPROCESSOR_STATE ProcessorState)
-{
- /* Ready to start */
- return FALSE;
-}
-
-/*
- * @implemented
- */
-VOID
-NTAPI
-HalProcessorIdle(VOID)
-{
- /* Enable interrupts and halt the processor */
- _enable();
- __halt();
-}
-
-/*
- * @implemented
- */
-VOID
-NTAPI
-HalRequestIpi(KAFFINITY TargetProcessors)
-{
- /* Not implemented on UP */
- __debugbreak();
-}
-
-/* EOF */
diff --git a/hal/halx86/generic/spinlock.c b/hal/halx86/generic/spinlock.c
index 059bbba83a5..1aab8d5a314 100644
--- a/hal/halx86/generic/spinlock.c
+++ b/hal/halx86/generic/spinlock.c
@@ -8,29 +8,25 @@
/* INCLUDES ******************************************************************/
-/* Enable this (and the define in irq.S) to make UP HAL work for MP Kernel */
-/* #define CONFIG_SMP */
+/* This file is compiled twice. Once for UP and once for MP */
#include
#define NDEBUG
#include
+#include
+
#undef KeAcquireSpinLock
#undef KeReleaseSpinLock
+/* GLOBALS *******************************************************************/
+
+ULONG HalpSystemHardwareFlags;
+KSPIN_LOCK HalpSystemHardwareLock;
+
/* FUNCTIONS *****************************************************************/
-/*
- * @implemented
- */
-VOID
-NTAPI
-KeAcquireSpinLock(PKSPIN_LOCK SpinLock,
- PKIRQL OldIrql)
-{
- /* Call the fastcall function */
- *OldIrql = KfAcquireSpinLock(SpinLock);
-}
+#ifdef _M_IX86
/*
* @implemented
@@ -49,18 +45,6 @@ KeAcquireSpinLockRaiseToSynch(PKSPIN_LOCK SpinLock)
return OldIrql;
}
-/*
- * @implemented
- */
-VOID
-NTAPI
-KeReleaseSpinLock(PKSPIN_LOCK SpinLock,
- KIRQL NewIrql)
-{
- /* Call the fastcall function */
- KfReleaseSpinLock(SpinLock, NewIrql);
-}
-
/*
* @implemented
*/
@@ -228,27 +212,38 @@ KeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber,
return TRUE;
}
-#undef KeRaiseIrql
-/*
- * @implemented
- */
+#endif
+
VOID
NTAPI
-KeRaiseIrql(KIRQL NewIrql,
- PKIRQL OldIrql)
+HalpAcquireSystemHardwareSpinLock(VOID)
{
- /* Call the fastcall function */
- *OldIrql = KfRaiseIrql(NewIrql);
+ ULONG Flags;
+
+ /* Get flags and disable interrupts */
+ Flags = __readeflags();
+ _disable();
+
+ /* Acquire the lock */
+ KxAcquireSpinLock(&HalpSystemHardwareLock);
+
+ /* We have the lock, save the flags now */
+ HalpSystemHardwareFlags = Flags;
}
-#undef KeLowerIrql
-/*
- * @implemented
- */
VOID
NTAPI
-KeLowerIrql(KIRQL NewIrql)
+HalpReleaseCmosSpinLock(VOID)
{
- /* Call the fastcall function */
- KfLowerIrql(NewIrql);
+ ULONG Flags;
+
+ /* Get the flags */
+ Flags = HalpSystemHardwareFlags;
+
+ /* Release the lock */
+ KxReleaseSpinLock(&HalpSystemHardwareLock);
+
+ /* Restore the flags */
+ __writeeflags(Flags);
}
+
diff --git a/hal/halx86/hal_generic.rbuild b/hal/halx86/hal_generic.rbuild
index 99528c96975..154379fa8a9 100644
--- a/hal/halx86/hal_generic.rbuild
+++ b/hal/halx86/hal_generic.rbuild
@@ -18,24 +18,35 @@
beep.c
bios.c
cmos.c
+ display.c
dma.c
drive.c
- display.c
halinit.c
misc.c
- portio.c
profil.c
reboot.c
sysinfo.c
- systimer.S
timer.c
- trap.S
usage.c
+
+
+ portio.c
+ systimer.S
+ trap.S
+
+
+
+
+ x86bios.c
+ systimer.S
+
+
hal.h
+
include
include
@@ -59,19 +70,23 @@
display.c
drive.c
misc.c
- pic.c
- portio.c
- processor.c
profil.c
reboot.c
spinlock.c
sysinfo.c
- systimer.S
timer.c
usage.c
+
+
+ portio.c
+ systimer.S
+
+
halinit_up.c
+ pic.c
+ processor.c
diff --git a/hal/halx86/hal_generic_mp.rbuild b/hal/halx86/hal_generic_mp.rbuild
index 5bf819c953e..5063a045c1a 100644
--- a/hal/halx86/hal_generic_mp.rbuild
+++ b/hal/halx86/hal_generic_mp.rbuild
@@ -7,6 +7,9 @@
+
+ spinlock.c
+
apic.c
halinit_mp.c
@@ -14,7 +17,6 @@
ipi_mp.c
mpconfig.c
processor_mp.c
- spinlock.c
halmp.rc
diff --git a/hal/halx86/hal_generic_up.rbuild b/hal/halx86/hal_generic_up.rbuild
index 405da09c949..732a374b86c 100644
--- a/hal/halx86/hal_generic_up.rbuild
+++ b/hal/halx86/hal_generic_up.rbuild
@@ -7,9 +7,11 @@
+ spinlock.c
+
+
pic.c
processor.c
- spinlock.c
diff --git a/hal/halx86/halamd64.rbuild b/hal/halx86/halamd64.rbuild
index 8b137891791..4a09aa2c838 100644
--- a/hal/halx86/halamd64.rbuild
+++ b/hal/halx86/halamd64.rbuild
@@ -1 +1,27 @@
+
+
+
+
+
+
+ include
+ include
+
+
+
+
+ hal_generic
+ hal_generic_up
+ ntoskrnl
+
+
+
+ halinit_mp.c
+ halmp.rc
+
+
+
+
+
+
diff --git a/hal/halx86/halmps.rbuild b/hal/halx86/halmps.rbuild
index 05bab4161c1..ad17eac9002 100644
--- a/hal/halx86/halmps.rbuild
+++ b/hal/halx86/halmps.rbuild
@@ -14,10 +14,13 @@
ntoskrnl
libcntpr
- mps.S
- mpsboot.asm
- mpsirql.c
-
+
+
+ mps.S
+ mpsboot.asm
+ mpsirql.c
+
+
diff --git a/hal/halx86/include/halp.h b/hal/halx86/include/halp.h
index 16c82dfabfc..6fd63fa3e17 100644
--- a/hal/halx86/include/halp.h
+++ b/hal/halx86/include/halp.h
@@ -681,100 +681,7 @@ HalpReleaseCmosSpinLock(
VOID
);
-//
-// This is duplicated from ke_x.h
-//
-#ifdef CONFIG_SMP
-//
-// Spinlock Acquisition at IRQL >= DISPATCH_LEVEL
-//
-FORCEINLINE
-VOID
-KxAcquireSpinLock(IN PKSPIN_LOCK SpinLock)
-{
- /* Make sure that we don't own the lock already */
- if (((KSPIN_LOCK)KeGetCurrentThread() | 1) == *SpinLock)
- {
- /* We do, bugcheck! */
- KeBugCheckEx(SPIN_LOCK_ALREADY_OWNED, (ULONG_PTR)SpinLock, 0, 0, 0);
- }
- for (;;)
- {
- /* Try to acquire it */
- if (InterlockedBitTestAndSet((PLONG)SpinLock, 0))
- {
- /* Value changed... wait until it's locked */
- while (*(volatile KSPIN_LOCK *)SpinLock == 1)
- {
-#ifdef DBG
- /* On debug builds, we use a much slower but useful routine */
- //Kii386SpinOnSpinLock(SpinLock, 5);
-
- /* FIXME: Do normal yield for now */
- YieldProcessor();
-#else
- /* Otherwise, just yield and keep looping */
- YieldProcessor();
-#endif
- }
- }
- else
- {
-#ifdef DBG
- /* On debug builds, we OR in the KTHREAD */
- *SpinLock = (KSPIN_LOCK)KeGetCurrentThread() | 1;
-#endif
- /* All is well, break out */
- break;
- }
- }
-}
-
-//
-// Spinlock Release at IRQL >= DISPATCH_LEVEL
-//
-FORCEINLINE
-VOID
-KxReleaseSpinLock(IN PKSPIN_LOCK SpinLock)
-{
-#ifdef DBG
- /* Make sure that the threads match */
- if (((KSPIN_LOCK)KeGetCurrentThread() | 1) != *SpinLock)
- {
- /* They don't, bugcheck */
- KeBugCheckEx(SPIN_LOCK_NOT_OWNED, (ULONG_PTR)SpinLock, 0, 0, 0);
- }
-#endif
- /* Clear the lock */
- InterlockedAnd((PLONG)SpinLock, 0);
-}
-
-#else
-
-//
-// Spinlock Acquire at IRQL >= DISPATCH_LEVEL
-//
-FORCEINLINE
-VOID
-KxAcquireSpinLock(IN PKSPIN_LOCK SpinLock)
-{
- /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
- UNREFERENCED_PARAMETER(SpinLock);
-}
-
-//
-// Spinlock Release at IRQL >= DISPATCH_LEVEL
-//
-FORCEINLINE
-VOID
-KxReleaseSpinLock(IN PKSPIN_LOCK SpinLock)
-{
- /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
- UNREFERENCED_PARAMETER(SpinLock);
-}
-
-#endif
VOID
FASTCALL
diff --git a/hal/halx86/mp/amd64/mps.S b/hal/halx86/mp/amd64/mps.S
new file mode 100644
index 00000000000..35436520ae6
--- /dev/null
+++ b/hal/halx86/mp/amd64/mps.S
@@ -0,0 +1,96 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: ntoskrnl/hal/amd64/generic/mps.S
+ * PURPOSE: Intel MultiProcessor specification support
+ * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include
+#include
+
+/* FUNCTIONS *****************************************************************/
+
+#define BEFORE \
+ cld; \
+ push rax; \
+ push rbx; \
+ push rcx; \
+ push rdx; \
+ push rsi; \
+ push rdi; \
+ push fs; \
+ push gs; \
+
+#define AFTER \
+ pop gs; \
+ pop fs; \
+ pop rdi; \
+ pop rsi; \
+ pop rdx; \
+ pop rcx; \
+ pop rbx; \
+ pop rax; \
+
+#ifdef CONFIG_SMP
+PUBLIC MpsIpiInterrupt
+MpsIpiInterrupt:
+ /* Save registers */
+ BEFORE
+
+ /* Call the C handler */
+ call MpsIpiHandler
+
+ /* Return to the caller */
+ AFTER
+ iret
+#endif
+
+PUBLIC MpsErrorInterrupt
+MpsErrorInterrupt:
+ /* Save registers */
+ BEFORE
+
+ /* Call the C handler */
+ call MpsErrorHandler
+
+ /* Return to the caller */
+ AFTER
+ iret
+
+
+PUBLIC MpsSpuriousInterrupt
+MpsSpuriousInterrupt:
+ /* Save registers */
+ BEFORE
+
+ /* Call the C handler */
+ call MpsSpuriousHandler
+
+ /* Return to the caller */
+ AFTER
+ iret
+
+PUBLIC MpsTimerInterrupt
+MpsTimerInterrupt:
+ /* Save registers */
+ BEFORE
+
+ mov ebx, 0xef
+ mov eax, 0xceafbeef
+ push rax
+ push rsp
+ push rbx
+ call MpsTimerHandler
+ pop rax
+ pop rax
+ pop rax
+
+ /* Return to the caller */
+ AFTER
+ iret
+
+
+/* EOF */
diff --git a/hal/halx86/mp/mps.S b/hal/halx86/mp/i386/mps.S
similarity index 100%
rename from hal/halx86/mp/mps.S
rename to hal/halx86/mp/i386/mps.S
diff --git a/hal/halx86/mp/mpsboot.asm b/hal/halx86/mp/i386/mpsboot.asm
similarity index 100%
rename from hal/halx86/mp/mpsboot.asm
rename to hal/halx86/mp/i386/mpsboot.asm
diff --git a/hal/halx86/mp/mpsirql.c b/hal/halx86/mp/i386/mpsirql.c
similarity index 89%
rename from hal/halx86/mp/mpsirql.c
rename to hal/halx86/mp/i386/mpsirql.c
index de87b144d55..643369a552e 100644
--- a/hal/halx86/mp/mpsirql.c
+++ b/hal/halx86/mp/i386/mpsirql.c
@@ -144,29 +144,6 @@ KfLowerIrql (KIRQL NewIrql)
}
-/**********************************************************************
- * NAME EXPORTED
- * KeLowerIrql
- *
- * DESCRIPTION
- * Restores the irq level on the current processor
- *
- * ARGUMENTS
- * NewIrql = Irql to lower to
- *
- * RETURN VALUE
- * None
- *
- * NOTES
- */
-#undef KeLowerIrql
-VOID NTAPI
-KeLowerIrql (KIRQL NewIrql)
-{
- KfLowerIrql (NewIrql);
-}
-
-
/**********************************************************************
* NAME EXPORTED
* KfRaiseIrql
@@ -215,33 +192,6 @@ KfRaiseIrql (KIRQL NewIrql)
return OldIrql;
}
-
-/**********************************************************************
- * NAME EXPORTED
- * KeRaiseIrql
- *
- * DESCRIPTION
- * Raises the hardware priority (irql)
- *
- * ARGUMENTS
- * NewIrql = Irql to raise to
- * OldIrql (OUT) = Caller supplied storage for the previous irql
- *
- * RETURN VALUE
- * None
- *
- * NOTES
- * Calls KfRaiseIrql
- */
-#undef KeRaiseIrql
-VOID NTAPI
-KeRaiseIrql (KIRQL NewIrql,
- PKIRQL OldIrql)
-{
- *OldIrql = KfRaiseIrql (NewIrql);
-}
-
-
/**********************************************************************
* NAME EXPORTED
* KeRaiseIrqlToDpcLevel
diff --git a/hal/halx86/mp/spinlock.c b/hal/halx86/mp/spinlock.c
deleted file mode 100644
index c8506adf02b..00000000000
--- a/hal/halx86/mp/spinlock.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: hal/halx86/mp/spinlock.c
- * PURPOSE: Implements spinlocks
- * PROGRAMMER: David Welch (welch@cwcom.net)
- * Eric Kohl
- * UPDATE HISTORY:
- * 09/06/2000 Created
- */
-
-/*
- * NOTE: On a uniprocessor machine spinlocks are implemented by raising
- * the irq level
- */
-
-/* INCLUDES ****************************************************************/
-
-#include
-#define NDEBUG
-#include
-
-/* Hmm, needed for KDBG := 1. Why? */
-#undef KeGetCurrentIrql
-
-/* FUNCTIONS ***************************************************************/
-
-#undef KeAcquireSpinLock
-VOID NTAPI
-KeAcquireSpinLock (
- PKSPIN_LOCK SpinLock,
- PKIRQL OldIrql
- )
-/*
- * FUNCTION: Acquires a spinlock
- * ARGUMENTS:
- * SpinLock = Spinlock to acquire
- * OldIrql (OUT) = Caller supplied storage for the previous irql
- */
-{
- *OldIrql = KfAcquireSpinLock(SpinLock);
-}
-
-KIRQL FASTCALL
-KeAcquireSpinLockRaiseToSynch (
- PKSPIN_LOCK SpinLock
- )
-{
- KIRQL OldIrql;
-
- OldIrql = KfRaiseIrql(CLOCK2_LEVEL);
- KiAcquireSpinLock(SpinLock);
-
- return OldIrql;
-}
-
-#undef KeReleaseSpinLock
-VOID NTAPI
-KeReleaseSpinLock (
- PKSPIN_LOCK SpinLock,
- KIRQL NewIrql
- )
-/*
- * FUNCTION: Releases a spinlock
- * ARGUMENTS:
- * SpinLock = Spinlock to release
- * NewIrql = Irql level before acquiring the spinlock
- */
-{
- KfReleaseSpinLock(SpinLock, NewIrql);
-}
-
-LOGICAL
-FASTCALL
-KeTryToAcquireQueuedSpinLock(
- KSPIN_LOCK_QUEUE_NUMBER LockNumber,
- PKIRQL OldIrql)
-{
- UNIMPLEMENTED;
-
- return FALSE;
-}
-
-
-BOOLEAN
-FASTCALL
-KeTryToAcquireQueuedSpinLockRaiseToSynch(
- KSPIN_LOCK_QUEUE_NUMBER LockNumber,
- PKIRQL OldIrql)
-{
- UNIMPLEMENTED;
-
- return FALSE;
-}
-
-KIRQL FASTCALL
-KfAcquireSpinLock (
- PKSPIN_LOCK SpinLock
- )
-{
- KIRQL OldIrql;
-
- ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
-
- OldIrql = KfRaiseIrql(DISPATCH_LEVEL);
- KiAcquireSpinLock(SpinLock);
-
- return OldIrql;
-}
-
-VOID FASTCALL
-KfReleaseSpinLock (
- PKSPIN_LOCK SpinLock,
- KIRQL NewIrql
- )
-/*
- * FUNCTION: Releases a spinlock
- * ARGUMENTS:
- * SpinLock = Spinlock to release
- * NewIrql = Irql level before acquiring the spinlock
- */
-{
- ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL || KeGetCurrentIrql() == SYNCH_LEVEL);
- KiReleaseSpinLock(SpinLock);
- KfLowerIrql(NewIrql);
-}
-
-
-/*
- * @unimplemented
- */
-VOID
-FASTCALL
-KeAcquireInStackQueuedSpinLock(
- IN PKSPIN_LOCK SpinLock,
- IN PKLOCK_QUEUE_HANDLE LockHandle
- )
-{
- UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-VOID
-FASTCALL
-KeAcquireInStackQueuedSpinLockRaiseToSynch(
- IN PKSPIN_LOCK SpinLock,
- IN PKLOCK_QUEUE_HANDLE LockHandle
- )
-{
- UNIMPLEMENTED;
-}
-
-
-/*
- * @unimplemented
- */
-VOID
-FASTCALL
-KeReleaseInStackQueuedSpinLock(
- IN PKLOCK_QUEUE_HANDLE LockHandle
- )
-{
- UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-KIRQL
-FASTCALL
-KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER Number)
-{
- UNIMPLEMENTED;
- return 0;
-}
-
-/*
- * @unimplemented
- */
-KIRQL
-FASTCALL
-KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
-{
- UNIMPLEMENTED;
- return 0;
-}
-
-/*
- * @unimplemented
- */
-VOID
-FASTCALL
-KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER Number,
- IN KIRQL OldIrql)
-{
- UNIMPLEMENTED;
-}
-
-/* EOF */
diff --git a/include/ddk/acpiioct.h b/include/ddk/acpiioct.h
index a51cc3dd4b4..d4d550feae1 100644
--- a/include/ddk/acpiioct.h
+++ b/include/ddk/acpiioct.h
@@ -159,7 +159,7 @@ typedef ACPI_ENUM_CHILDREN_OUTPUT_BUFFER UNALIGNED *PACPI_ENUM_CHILDREN_OUTPUT_B
#define ACPI_METHOD_SET_ARGUMENT_STRING( Argument, StrData ) \
{ Argument->Type = ACPI_METHOD_ARGUMENT_STRING; \
- Argument->DataLength = strlen((PUCHAR)StrData) + sizeof(UCHAR); \
+ Argument->DataLength = strlen((PCHAR)StrData) + sizeof(UCHAR); \
RtlCopyMemory(&Argument->Data[0],(PUCHAR)StrData,Argument->DataLength); }
#define ACPI_METHOD_SET_ARGUMENT_BUFFER( Argument, BuffData, BuffLength ) \
diff --git a/include/ddk/ntstatus.h b/include/ddk/ntstatus.h
deleted file mode 100644
index 688f996d3ff..00000000000
--- a/include/ddk/ntstatus.h
+++ /dev/null
@@ -1,1122 +0,0 @@
-/*
- * ntstatus.h
- *
- * Windows NT status codes
- *
- * This file is part of the w32api package.
- *
- * Contributors:
- * Created by Casper S. Hornstrup
- *
- * THIS SOFTWARE IS NOT COPYRIGHTED
- *
- * This source code is offered for use in the public domain. You may
- * use, modify or distribute it freely.
- *
- * This code is distributed in the hope that it will be useful but
- * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
- * DISCLAIMED. This includes but is not limited to warranties of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-
-#ifndef _NTSTATUS_
-#define _NTSTATUS_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if !defined(STATUS_SUCCESS)
-#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
-#endif /* !STATUS_SUCCESS */
-#define FACILITY_DEBUGGER 0x1
-#define FACILITY_RPC_RUNTIME 0x2
-#define FACILITY_RPC_STUBS 0x3
-#define FACILITY_IO_ERROR_CODE 0x4
-#define FACILITY_TERMINAL_SERVER 0xA
-#define FACILITY_USB_ERROR_CODE 0x10
-#define FACILITY_HID_ERROR_CODE 0x11
-#define FACILITY_FIREWIRE_ERROR_CODE 0x12
-#define FACILITY_CLUSTER_ERROR_CODE 0x13
-#define FACILITY_ACPI_ERROR_CODE 0x14
-#define FACILITY_SXS_ERROR_CODE 0x15
-#define STATUS_SEVERITY_SUCCESS 0x0
-#define STATUS_SEVERITY_INFORMATIONAL 0x1
-#define STATUS_SEVERITY_WARNING 0x2
-#define STATUS_SEVERITY_ERROR 0x3
-#define STATUS_WAIT_0 ((NTSTATUS)0x00000000L)
-#define STATUS_WAIT_1 ((NTSTATUS)0x00000001L)
-#define STATUS_WAIT_2 ((NTSTATUS)0x00000002L)
-#define STATUS_WAIT_3 ((NTSTATUS)0x00000003L)
-#define STATUS_WAIT_63 ((NTSTATUS)0x0000003FL)
-#define STATUS_ABANDONED ((NTSTATUS)0x00000080L)
-#define STATUS_ABANDONED_WAIT_0 ((NTSTATUS)0x00000080L)
-#define STATUS_ABANDONED_WAIT_63 ((NTSTATUS)0x000000BFL)
-#define STATUS_USER_APC ((NTSTATUS)0x000000C0L)
-#define STATUS_KERNEL_APC ((NTSTATUS)0x00000100L)
-#define STATUS_ALERTED ((NTSTATUS)0x00000101L)
-#define STATUS_TIMEOUT ((NTSTATUS)0x00000102L)
-#define STATUS_PENDING ((NTSTATUS)0x00000103L)
-#define STATUS_REPARSE ((NTSTATUS)0x00000104L)
-#define STATUS_MORE_ENTRIES ((NTSTATUS)0x00000105L)
-#define STATUS_NOT_ALL_ASSIGNED ((NTSTATUS)0x00000106L)
-#define STATUS_SOME_NOT_MAPPED ((NTSTATUS)0x00000107L)
-#define STATUS_OPLOCK_BREAK_IN_PROGRESS ((NTSTATUS)0x00000108L)
-#define STATUS_VOLUME_MOUNTED ((NTSTATUS)0x00000109L)
-#define STATUS_RXACT_COMMITTED ((NTSTATUS)0x0000010AL)
-#define STATUS_NOTIFY_CLEANUP ((NTSTATUS)0x0000010BL)
-#define STATUS_NOTIFY_ENUM_DIR ((NTSTATUS)0x0000010CL)
-#define STATUS_NO_QUOTAS_FOR_ACCOUNT ((NTSTATUS)0x0000010DL)
-#define STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED ((NTSTATUS)0x0000010EL)
-#define STATUS_PAGE_FAULT_TRANSITION ((NTSTATUS)0x00000110L)
-#define STATUS_PAGE_FAULT_DEMAND_ZERO ((NTSTATUS)0x00000111L)
-#define STATUS_PAGE_FAULT_COPY_ON_WRITE ((NTSTATUS)0x00000112L)
-#define STATUS_PAGE_FAULT_GUARD_PAGE ((NTSTATUS)0x00000113L)
-#define STATUS_PAGE_FAULT_PAGING_FILE ((NTSTATUS)0x00000114L)
-#define STATUS_CACHE_PAGE_LOCKED ((NTSTATUS)0x00000115L)
-#define STATUS_CRASH_DUMP ((NTSTATUS)0x00000116L)
-#define STATUS_BUFFER_ALL_ZEROS ((NTSTATUS)0x00000117L)
-#define STATUS_REPARSE_OBJECT ((NTSTATUS)0x00000118L)
-#define STATUS_RESOURCE_REQUIREMENTS_CHANGED ((NTSTATUS)0x00000119L)
-#define STATUS_TRANSLATION_COMPLETE ((NTSTATUS)0x00000120L)
-#define STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY ((NTSTATUS)0x00000121L)
-#define STATUS_NOTHING_TO_TERMINATE ((NTSTATUS)0x00000122L)
-#define STATUS_PROCESS_NOT_IN_JOB ((NTSTATUS)0x00000123L)
-#define STATUS_PROCESS_IN_JOB ((NTSTATUS)0x00000124L)
-#define STATUS_OBJECT_NAME_EXISTS ((NTSTATUS)0x40000000L)
-#define STATUS_THREAD_WAS_SUSPENDED ((NTSTATUS)0x40000001L)
-#define STATUS_WORKING_SET_LIMIT_RANGE ((NTSTATUS)0x40000002L)
-#define STATUS_IMAGE_NOT_AT_BASE ((NTSTATUS)0x40000003L)
-#define STATUS_RXACT_STATE_CREATED ((NTSTATUS)0x40000004L)
-#define STATUS_SEGMENT_NOTIFICATION ((NTSTATUS)0x40000005L)
-#define STATUS_LOCAL_USER_SESSION_KEY ((NTSTATUS)0x40000006L)
-#define STATUS_BAD_CURRENT_DIRECTORY ((NTSTATUS)0x40000007L)
-#define STATUS_SERIAL_MORE_WRITES ((NTSTATUS)0x40000008L)
-#define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009L)
-#define STATUS_FT_READ_RECOVERY_FROM_BACKUP ((NTSTATUS)0x4000000AL)
-#define STATUS_FT_WRITE_RECOVERY ((NTSTATUS)0x4000000BL)
-#define STATUS_SERIAL_COUNTER_TIMEOUT ((NTSTATUS)0x4000000CL)
-#define STATUS_NULL_LM_PASSWORD ((NTSTATUS)0x4000000DL)
-#define STATUS_IMAGE_MACHINE_TYPE_MISMATCH ((NTSTATUS)0x4000000EL)
-#define STATUS_RECEIVE_PARTIAL ((NTSTATUS)0x4000000FL)
-#define STATUS_RECEIVE_EXPEDITED ((NTSTATUS)0x40000010L)
-#define STATUS_RECEIVE_PARTIAL_EXPEDITED ((NTSTATUS)0x40000011L)
-#define STATUS_EVENT_DONE ((NTSTATUS)0x40000012L)
-#define STATUS_EVENT_PENDING ((NTSTATUS)0x40000013L)
-#define STATUS_CHECKING_FILE_SYSTEM ((NTSTATUS)0x40000014L)
-#define STATUS_FATAL_APP_EXIT ((NTSTATUS)0x40000015L)
-#define STATUS_PREDEFINED_HANDLE ((NTSTATUS)0x40000016L)
-#define STATUS_WAS_UNLOCKED ((NTSTATUS)0x40000017L)
-#define STATUS_SERVICE_NOTIFICATION ((NTSTATUS)0x40000018L)
-#define STATUS_WAS_LOCKED ((NTSTATUS)0x40000019L)
-#define STATUS_LOG_HARD_ERROR ((NTSTATUS)0x4000001AL)
-#define STATUS_ALREADY_WIN32 ((NTSTATUS)0x4000001BL)
-#define STATUS_WX86_UNSIMULATE ((NTSTATUS)0x4000001CL)
-#define STATUS_WX86_CONTINUE ((NTSTATUS)0x4000001DL)
-#define STATUS_WX86_SINGLE_STEP ((NTSTATUS)0x4000001EL)
-#define STATUS_WX86_BREAKPOINT ((NTSTATUS)0x4000001FL)
-#define STATUS_WX86_EXCEPTION_CONTINUE ((NTSTATUS)0x40000020L)
-#define STATUS_WX86_EXCEPTION_LASTCHANCE ((NTSTATUS)0x40000021L)
-#define STATUS_WX86_EXCEPTION_CHAIN ((NTSTATUS)0x40000022L)
-#define STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE ((NTSTATUS)0x40000023L)
-#define STATUS_NO_YIELD_PERFORMED ((NTSTATUS)0x40000024L)
-#define STATUS_TIMER_RESUME_IGNORED ((NTSTATUS)0x40000025L)
-#define STATUS_ARBITRATION_UNHANDLED ((NTSTATUS)0x40000026L)
-#define STATUS_CARDBUS_NOT_SUPPORTED ((NTSTATUS)0x40000027L)
-#define STATUS_WX86_CREATEWX86TIB ((NTSTATUS)0x40000028L)
-#define STATUS_MP_PROCESSOR_MISMATCH ((NTSTATUS)0x40000029L)
-#define STATUS_HIBERNATED ((NTSTATUS)0x4000002AL)
-#define STATUS_RESUME_HIBERNATION ((NTSTATUS)0x4000002BL)
-#define STATUS_GUARD_PAGE_VIOLATION ((NTSTATUS)0x80000001L)
-#define STATUS_DATATYPE_MISALIGNMENT ((NTSTATUS)0x80000002L)
-#define STATUS_BREAKPOINT ((NTSTATUS)0x80000003L)
-#define STATUS_SINGLE_STEP ((NTSTATUS)0x80000004L)
-#define STATUS_BUFFER_OVERFLOW ((NTSTATUS)0x80000005L)
-#define STATUS_NO_MORE_FILES ((NTSTATUS)0x80000006L)
-#define STATUS_WAKE_SYSTEM_DEBUGGER ((NTSTATUS)0x80000007L)
-#define STATUS_HANDLES_CLOSED ((NTSTATUS)0x8000000AL)
-#define STATUS_NO_INHERITANCE ((NTSTATUS)0x8000000BL)
-#define STATUS_GUID_SUBSTITUTION_MADE ((NTSTATUS)0x8000000CL)
-#define STATUS_PARTIAL_COPY ((NTSTATUS)0x8000000DL)
-#define STATUS_DEVICE_PAPER_EMPTY ((NTSTATUS)0x8000000EL)
-#define STATUS_DEVICE_POWERED_OFF ((NTSTATUS)0x8000000FL)
-#define STATUS_DEVICE_OFF_LINE ((NTSTATUS)0x80000010L)
-#define STATUS_DEVICE_BUSY ((NTSTATUS)0x80000011L)
-#define STATUS_NO_MORE_EAS ((NTSTATUS)0x80000012L)
-#define STATUS_INVALID_EA_NAME ((NTSTATUS)0x80000013L)
-#define STATUS_EA_LIST_INCONSISTENT ((NTSTATUS)0x80000014L)
-#define STATUS_INVALID_EA_FLAG ((NTSTATUS)0x80000015L)
-#define STATUS_VERIFY_REQUIRED ((NTSTATUS)0x80000016L)
-#define STATUS_EXTRANEOUS_INFORMATION ((NTSTATUS)0x80000017L)
-#define STATUS_RXACT_COMMIT_NECESSARY ((NTSTATUS)0x80000018L)
-#define STATUS_NO_MORE_ENTRIES ((NTSTATUS)0x8000001AL)
-#define STATUS_FILEMARK_DETECTED ((NTSTATUS)0x8000001BL)
-#define STATUS_MEDIA_CHANGED ((NTSTATUS)0x8000001CL)
-#define STATUS_BUS_RESET ((NTSTATUS)0x8000001DL)
-#define STATUS_END_OF_MEDIA ((NTSTATUS)0x8000001EL)
-#define STATUS_BEGINNING_OF_MEDIA ((NTSTATUS)0x8000001FL)
-#define STATUS_MEDIA_CHECK ((NTSTATUS)0x80000020L)
-#define STATUS_SETMARK_DETECTED ((NTSTATUS)0x80000021L)
-#define STATUS_NO_DATA_DETECTED ((NTSTATUS)0x80000022L)
-#define STATUS_REDIRECTOR_HAS_OPEN_HANDLES ((NTSTATUS)0x80000023L)
-#define STATUS_SERVER_HAS_OPEN_HANDLES ((NTSTATUS)0x80000024L)
-#define STATUS_ALREADY_DISCONNECTED ((NTSTATUS)0x80000025L)
-#define STATUS_LONGJUMP ((NTSTATUS)0x80000026L)
-#define STATUS_CLEANER_CARTRIDGE_INSTALLED ((NTSTATUS)0x80000027L)
-#define STATUS_PLUGPLAY_QUERY_VETOED ((NTSTATUS)0x80000028L)
-#define STATUS_UNWIND_CONSOLIDATE ((NTSTATUS)0x80000029L)
-#define STATUS_CLUSTER_NODE_ALREADY_UP ((NTSTATUS)0x80130001L)
-#define STATUS_CLUSTER_NODE_ALREADY_DOWN ((NTSTATUS)0x80130002L)
-#define STATUS_CLUSTER_NETWORK_ALREADY_ONLINE ((NTSTATUS)0x80130003L)
-#define STATUS_CLUSTER_NETWORK_ALREADY_OFFLINE ((NTSTATUS)0x80130004L)
-#define STATUS_CLUSTER_NODE_ALREADY_MEMBER ((NTSTATUS)0x80130005L)
-#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)
-#define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002L)
-#define STATUS_INVALID_INFO_CLASS ((NTSTATUS)0xC0000003L)
-#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
-#define STATUS_ACCESS_VIOLATION ((NTSTATUS)0xC0000005L)
-#define STATUS_IN_PAGE_ERROR ((NTSTATUS)0xC0000006L)
-#define STATUS_PAGEFILE_QUOTA ((NTSTATUS)0xC0000007L)
-#define STATUS_INVALID_HANDLE ((NTSTATUS)0xC0000008L)
-#define STATUS_BAD_INITIAL_STACK ((NTSTATUS)0xC0000009L)
-#define STATUS_BAD_INITIAL_PC ((NTSTATUS)0xC000000AL)
-#define STATUS_INVALID_CID ((NTSTATUS)0xC000000BL)
-#define STATUS_TIMER_NOT_CANCELED ((NTSTATUS)0xC000000CL)
-#define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000DL)
-#define STATUS_NO_SUCH_DEVICE ((NTSTATUS)0xC000000EL)
-#define STATUS_NO_SUCH_FILE ((NTSTATUS)0xC000000FL)
-#define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS)0xC0000010L)
-#define STATUS_END_OF_FILE ((NTSTATUS)0xC0000011L)
-#define STATUS_WRONG_VOLUME ((NTSTATUS)0xC0000012L)
-#define STATUS_NO_MEDIA_IN_DEVICE ((NTSTATUS)0xC0000013L)
-#define STATUS_UNRECOGNIZED_MEDIA ((NTSTATUS)0xC0000014L)
-#define STATUS_NONEXISTENT_SECTOR ((NTSTATUS)0xC0000015L)
-#define STATUS_MORE_PROCESSING_REQUIRED ((NTSTATUS)0xC0000016L)
-#define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017L)
-#define STATUS_CONFLICTING_ADDRESSES ((NTSTATUS)0xC0000018L)
-#define STATUS_NOT_MAPPED_VIEW ((NTSTATUS)0xC0000019L)
-#define STATUS_UNABLE_TO_FREE_VM ((NTSTATUS)0xC000001AL)
-#define STATUS_UNABLE_TO_DELETE_SECTION ((NTSTATUS)0xC000001BL)
-#define STATUS_INVALID_SYSTEM_SERVICE ((NTSTATUS)0xC000001CL)
-#define STATUS_ILLEGAL_INSTRUCTION ((NTSTATUS)0xC000001DL)
-#define STATUS_INVALID_LOCK_SEQUENCE ((NTSTATUS)0xC000001EL)
-#define STATUS_INVALID_VIEW_SIZE ((NTSTATUS)0xC000001FL)
-#define STATUS_INVALID_FILE_FOR_SECTION ((NTSTATUS)0xC0000020L)
-#define STATUS_ALREADY_COMMITTED ((NTSTATUS)0xC0000021L)
-#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
-#define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023L)
-#define STATUS_OBJECT_TYPE_MISMATCH ((NTSTATUS)0xC0000024L)
-#define STATUS_NONCONTINUABLE_EXCEPTION ((NTSTATUS)0xC0000025L)
-#define STATUS_INVALID_DISPOSITION ((NTSTATUS)0xC0000026L)
-#define STATUS_UNWIND ((NTSTATUS)0xC0000027L)
-#define STATUS_BAD_STACK ((NTSTATUS)0xC0000028L)
-#define STATUS_INVALID_UNWIND_TARGET ((NTSTATUS)0xC0000029L)
-#define STATUS_NOT_LOCKED ((NTSTATUS)0xC000002AL)
-#define STATUS_PARITY_ERROR ((NTSTATUS)0xC000002BL)
-#define STATUS_UNABLE_TO_DECOMMIT_VM ((NTSTATUS)0xC000002CL)
-#define STATUS_NOT_COMMITTED ((NTSTATUS)0xC000002DL)
-#define STATUS_INVALID_PORT_ATTRIBUTES ((NTSTATUS)0xC000002EL)
-#define STATUS_PORT_MESSAGE_TOO_LONG ((NTSTATUS)0xC000002FL)
-#define STATUS_INVALID_PARAMETER_MIX ((NTSTATUS)0xC0000030L)
-#define STATUS_INVALID_QUOTA_LOWER ((NTSTATUS)0xC0000031L)
-#define STATUS_DISK_CORRUPT_ERROR ((NTSTATUS)0xC0000032L)
-#define STATUS_OBJECT_NAME_INVALID ((NTSTATUS)0xC0000033L)
-#define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034L)
-#define STATUS_OBJECT_NAME_COLLISION ((NTSTATUS)0xC0000035L)
-#define STATUS_PORT_DISCONNECTED ((NTSTATUS)0xC0000037L)
-#define STATUS_DEVICE_ALREADY_ATTACHED ((NTSTATUS)0xC0000038L)
-#define STATUS_OBJECT_PATH_INVALID ((NTSTATUS)0xC0000039L)
-#define STATUS_OBJECT_PATH_NOT_FOUND ((NTSTATUS)0xC000003AL)
-#define STATUS_OBJECT_PATH_SYNTAX_BAD ((NTSTATUS)0xC000003BL)
-#define STATUS_DATA_OVERRUN ((NTSTATUS)0xC000003CL)
-#define STATUS_DATA_LATE_ERROR ((NTSTATUS)0xC000003DL)
-#define STATUS_DATA_ERROR ((NTSTATUS)0xC000003EL)
-#define STATUS_CRC_ERROR ((NTSTATUS)0xC000003FL)
-#define STATUS_SECTION_TOO_BIG ((NTSTATUS)0xC0000040L)
-#define STATUS_PORT_CONNECTION_REFUSED ((NTSTATUS)0xC0000041L)
-#define STATUS_INVALID_PORT_HANDLE ((NTSTATUS)0xC0000042L)
-#define STATUS_SHARING_VIOLATION ((NTSTATUS)0xC0000043L)
-#define STATUS_QUOTA_EXCEEDED ((NTSTATUS)0xC0000044L)
-#define STATUS_INVALID_PAGE_PROTECTION ((NTSTATUS)0xC0000045L)
-#define STATUS_MUTANT_NOT_OWNED ((NTSTATUS)0xC0000046L)
-#define STATUS_SEMAPHORE_LIMIT_EXCEEDED ((NTSTATUS)0xC0000047L)
-#define STATUS_PORT_ALREADY_SET ((NTSTATUS)0xC0000048L)
-#define STATUS_SECTION_NOT_IMAGE ((NTSTATUS)0xC0000049L)
-#define STATUS_SUSPEND_COUNT_EXCEEDED ((NTSTATUS)0xC000004AL)
-#define STATUS_THREAD_IS_TERMINATING ((NTSTATUS)0xC000004BL)
-#define STATUS_BAD_WORKING_SET_LIMIT ((NTSTATUS)0xC000004CL)
-#define STATUS_INCOMPATIBLE_FILE_MAP ((NTSTATUS)0xC000004DL)
-#define STATUS_SECTION_PROTECTION ((NTSTATUS)0xC000004EL)
-#define STATUS_EAS_NOT_SUPPORTED ((NTSTATUS)0xC000004FL)
-#define STATUS_EA_TOO_LARGE ((NTSTATUS)0xC0000050L)
-#define STATUS_NONEXISTENT_EA_ENTRY ((NTSTATUS)0xC0000051L)
-#define STATUS_NO_EAS_ON_FILE ((NTSTATUS)0xC0000052L)
-#define STATUS_EA_CORRUPT_ERROR ((NTSTATUS)0xC0000053L)
-#define STATUS_FILE_LOCK_CONFLICT ((NTSTATUS)0xC0000054L)
-#define STATUS_LOCK_NOT_GRANTED ((NTSTATUS)0xC0000055L)
-#define STATUS_DELETE_PENDING ((NTSTATUS)0xC0000056L)
-#define STATUS_CTL_FILE_NOT_SUPPORTED ((NTSTATUS)0xC0000057L)
-#define STATUS_UNKNOWN_REVISION ((NTSTATUS)0xC0000058L)
-#define STATUS_REVISION_MISMATCH ((NTSTATUS)0xC0000059L)
-#define STATUS_INVALID_OWNER ((NTSTATUS)0xC000005AL)
-#define STATUS_INVALID_PRIMARY_GROUP ((NTSTATUS)0xC000005BL)
-#define STATUS_NO_IMPERSONATION_TOKEN ((NTSTATUS)0xC000005CL)
-#define STATUS_CANT_DISABLE_MANDATORY ((NTSTATUS)0xC000005DL)
-#define STATUS_NO_LOGON_SERVERS ((NTSTATUS)0xC000005EL)
-#define STATUS_NO_SUCH_LOGON_SESSION ((NTSTATUS)0xC000005FL)
-#define STATUS_NO_SUCH_PRIVILEGE ((NTSTATUS)0xC0000060L)
-#define STATUS_PRIVILEGE_NOT_HELD ((NTSTATUS)0xC0000061L)
-#define STATUS_INVALID_ACCOUNT_NAME ((NTSTATUS)0xC0000062L)
-#define STATUS_USER_EXISTS ((NTSTATUS)0xC0000063L)
-#define STATUS_NO_SUCH_USER ((NTSTATUS)0xC0000064L)
-#define STATUS_GROUP_EXISTS ((NTSTATUS)0xC0000065L)
-#define STATUS_NO_SUCH_GROUP ((NTSTATUS)0xC0000066L)
-#define STATUS_MEMBER_IN_GROUP ((NTSTATUS)0xC0000067L)
-#define STATUS_MEMBER_NOT_IN_GROUP ((NTSTATUS)0xC0000068L)
-#define STATUS_LAST_ADMIN ((NTSTATUS)0xC0000069L)
-#define STATUS_WRONG_PASSWORD ((NTSTATUS)0xC000006AL)
-#define STATUS_ILL_FORMED_PASSWORD ((NTSTATUS)0xC000006BL)
-#define STATUS_PASSWORD_RESTRICTION ((NTSTATUS)0xC000006CL)
-#define STATUS_LOGON_FAILURE ((NTSTATUS)0xC000006DL)
-#define STATUS_ACCOUNT_RESTRICTION ((NTSTATUS)0xC000006EL)
-#define STATUS_INVALID_LOGON_HOURS ((NTSTATUS)0xC000006FL)
-#define STATUS_INVALID_WORKSTATION ((NTSTATUS)0xC0000070L)
-#define STATUS_PASSWORD_EXPIRED ((NTSTATUS)0xC0000071L)
-#define STATUS_ACCOUNT_DISABLED ((NTSTATUS)0xC0000072L)
-#define STATUS_NONE_MAPPED ((NTSTATUS)0xC0000073L)
-#define STATUS_TOO_MANY_LUIDS_REQUESTED ((NTSTATUS)0xC0000074L)
-#define STATUS_LUIDS_EXHAUSTED ((NTSTATUS)0xC0000075L)
-#define STATUS_INVALID_SUB_AUTHORITY ((NTSTATUS)0xC0000076L)
-#define STATUS_INVALID_ACL ((NTSTATUS)0xC0000077L)
-#define STATUS_INVALID_SID ((NTSTATUS)0xC0000078L)
-#define STATUS_INVALID_SECURITY_DESCR ((NTSTATUS)0xC0000079L)
-#define STATUS_PROCEDURE_NOT_FOUND ((NTSTATUS)0xC000007AL)
-#define STATUS_INVALID_IMAGE_FORMAT ((NTSTATUS)0xC000007BL)
-#define STATUS_NO_TOKEN ((NTSTATUS)0xC000007CL)
-#define STATUS_BAD_INHERITANCE_ACL ((NTSTATUS)0xC000007DL)
-#define STATUS_RANGE_NOT_LOCKED ((NTSTATUS)0xC000007EL)
-#define STATUS_DISK_FULL ((NTSTATUS)0xC000007FL)
-#define STATUS_SERVER_DISABLED ((NTSTATUS)0xC0000080L)
-#define STATUS_SERVER_NOT_DISABLED ((NTSTATUS)0xC0000081L)
-#define STATUS_TOO_MANY_GUIDS_REQUESTED ((NTSTATUS)0xC0000082L)
-#define STATUS_GUIDS_EXHAUSTED ((NTSTATUS)0xC0000083L)
-#define STATUS_INVALID_ID_AUTHORITY ((NTSTATUS)0xC0000084L)
-#define STATUS_AGENTS_EXHAUSTED ((NTSTATUS)0xC0000085L)
-#define STATUS_INVALID_VOLUME_LABEL ((NTSTATUS)0xC0000086L)
-#define STATUS_SECTION_NOT_EXTENDED ((NTSTATUS)0xC0000087L)
-#define STATUS_NOT_MAPPED_DATA ((NTSTATUS)0xC0000088L)
-#define STATUS_RESOURCE_DATA_NOT_FOUND ((NTSTATUS)0xC0000089L)
-#define STATUS_RESOURCE_TYPE_NOT_FOUND ((NTSTATUS)0xC000008AL)
-#define STATUS_RESOURCE_NAME_NOT_FOUND ((NTSTATUS)0xC000008BL)
-#define STATUS_ARRAY_BOUNDS_EXCEEDED ((NTSTATUS)0xC000008CL)
-#define STATUS_FLOAT_DENORMAL_OPERAND ((NTSTATUS)0xC000008DL)
-#define STATUS_FLOAT_DIVIDE_BY_ZERO ((NTSTATUS)0xC000008EL)
-#define STATUS_FLOAT_INEXACT_RESULT ((NTSTATUS)0xC000008FL)
-#define STATUS_FLOAT_INVALID_OPERATION ((NTSTATUS)0xC0000090L)
-#define STATUS_FLOAT_OVERFLOW ((NTSTATUS)0xC0000091L)
-#define STATUS_FLOAT_STACK_CHECK ((NTSTATUS)0xC0000092L)
-#define STATUS_FLOAT_UNDERFLOW ((NTSTATUS)0xC0000093L)
-#define STATUS_INTEGER_DIVIDE_BY_ZERO ((NTSTATUS)0xC0000094L)
-#define STATUS_INTEGER_OVERFLOW ((NTSTATUS)0xC0000095L)
-#define STATUS_PRIVILEGED_INSTRUCTION ((NTSTATUS)0xC0000096L)
-#define STATUS_TOO_MANY_PAGING_FILES ((NTSTATUS)0xC0000097L)
-#define STATUS_FILE_INVALID ((NTSTATUS)0xC0000098L)
-#define STATUS_ALLOTTED_SPACE_EXCEEDED ((NTSTATUS)0xC0000099L)
-#define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009AL)
-#define STATUS_DFS_EXIT_PATH_FOUND ((NTSTATUS)0xC000009BL)
-#define STATUS_DEVICE_DATA_ERROR ((NTSTATUS)0xC000009CL)
-#define STATUS_DEVICE_NOT_CONNECTED ((NTSTATUS)0xC000009DL)
-#define STATUS_DEVICE_POWER_FAILURE ((NTSTATUS)0xC000009EL)
-#define STATUS_FREE_VM_NOT_AT_BASE ((NTSTATUS)0xC000009FL)
-#define STATUS_MEMORY_NOT_ALLOCATED ((NTSTATUS)0xC00000A0L)
-#define STATUS_WORKING_SET_QUOTA ((NTSTATUS)0xC00000A1L)
-#define STATUS_MEDIA_WRITE_PROTECTED ((NTSTATUS)0xC00000A2L)
-#define STATUS_DEVICE_NOT_READY ((NTSTATUS)0xC00000A3L)
-#define STATUS_INVALID_GROUP_ATTRIBUTES ((NTSTATUS)0xC00000A4L)
-#define STATUS_BAD_IMPERSONATION_LEVEL ((NTSTATUS)0xC00000A5L)
-#define STATUS_CANT_OPEN_ANONYMOUS ((NTSTATUS)0xC00000A6L)
-#define STATUS_BAD_VALIDATION_CLASS ((NTSTATUS)0xC00000A7L)
-#define STATUS_BAD_TOKEN_TYPE ((NTSTATUS)0xC00000A8L)
-#define STATUS_BAD_MASTER_BOOT_RECORD ((NTSTATUS)0xC00000A9L)
-#define STATUS_INSTRUCTION_MISALIGNMENT ((NTSTATUS)0xC00000AAL)
-#define STATUS_INSTANCE_NOT_AVAILABLE ((NTSTATUS)0xC00000ABL)
-#define STATUS_PIPE_NOT_AVAILABLE ((NTSTATUS)0xC00000ACL)
-#define STATUS_INVALID_PIPE_STATE ((NTSTATUS)0xC00000ADL)
-#define STATUS_PIPE_BUSY ((NTSTATUS)0xC00000AEL)
-#define STATUS_ILLEGAL_FUNCTION ((NTSTATUS)0xC00000AFL)
-#define STATUS_PIPE_DISCONNECTED ((NTSTATUS)0xC00000B0L)
-#define STATUS_PIPE_CLOSING ((NTSTATUS)0xC00000B1L)
-#define STATUS_PIPE_CONNECTED ((NTSTATUS)0xC00000B2L)
-#define STATUS_PIPE_LISTENING ((NTSTATUS)0xC00000B3L)
-#define STATUS_INVALID_READ_MODE ((NTSTATUS)0xC00000B4L)
-#define STATUS_IO_TIMEOUT ((NTSTATUS)0xC00000B5L)
-#define STATUS_FILE_FORCED_CLOSED ((NTSTATUS)0xC00000B6L)
-#define STATUS_PROFILING_NOT_STARTED ((NTSTATUS)0xC00000B7L)
-#define STATUS_PROFILING_NOT_STOPPED ((NTSTATUS)0xC00000B8L)
-#define STATUS_COULD_NOT_INTERPRET ((NTSTATUS)0xC00000B9L)
-#define STATUS_FILE_IS_A_DIRECTORY ((NTSTATUS)0xC00000BAL)
-#define STATUS_NOT_SUPPORTED ((NTSTATUS)0xC00000BBL)
-#define STATUS_REMOTE_NOT_LISTENING ((NTSTATUS)0xC00000BCL)
-#define STATUS_DUPLICATE_NAME ((NTSTATUS)0xC00000BDL)
-#define STATUS_BAD_NETWORK_PATH ((NTSTATUS)0xC00000BEL)
-#define STATUS_NETWORK_BUSY ((NTSTATUS)0xC00000BFL)
-#define STATUS_DEVICE_DOES_NOT_EXIST ((NTSTATUS)0xC00000C0L)
-#define STATUS_TOO_MANY_COMMANDS ((NTSTATUS)0xC00000C1L)
-#define STATUS_ADAPTER_HARDWARE_ERROR ((NTSTATUS)0xC00000C2L)
-#define STATUS_INVALID_NETWORK_RESPONSE ((NTSTATUS)0xC00000C3L)
-#define STATUS_UNEXPECTED_NETWORK_ERROR ((NTSTATUS)0xC00000C4L)
-#define STATUS_BAD_REMOTE_ADAPTER ((NTSTATUS)0xC00000C5L)
-#define STATUS_PRINT_QUEUE_FULL ((NTSTATUS)0xC00000C6L)
-#define STATUS_NO_SPOOL_SPACE ((NTSTATUS)0xC00000C7L)
-#define STATUS_PRINT_CANCELLED ((NTSTATUS)0xC00000C8L)
-#define STATUS_NETWORK_NAME_DELETED ((NTSTATUS)0xC00000C9L)
-#define STATUS_NETWORK_ACCESS_DENIED ((NTSTATUS)0xC00000CAL)
-#define STATUS_BAD_DEVICE_TYPE ((NTSTATUS)0xC00000CBL)
-#define STATUS_BAD_NETWORK_NAME ((NTSTATUS)0xC00000CCL)
-#define STATUS_TOO_MANY_NAMES ((NTSTATUS)0xC00000CDL)
-#define STATUS_TOO_MANY_SESSIONS ((NTSTATUS)0xC00000CEL)
-#define STATUS_SHARING_PAUSED ((NTSTATUS)0xC00000CFL)
-#define STATUS_REQUEST_NOT_ACCEPTED ((NTSTATUS)0xC00000D0L)
-#define STATUS_REDIRECTOR_PAUSED ((NTSTATUS)0xC00000D1L)
-#define STATUS_NET_WRITE_FAULT ((NTSTATUS)0xC00000D2L)
-#define STATUS_PROFILING_AT_LIMIT ((NTSTATUS)0xC00000D3L)
-#define STATUS_NOT_SAME_DEVICE ((NTSTATUS)0xC00000D4L)
-#define STATUS_FILE_RENAMED ((NTSTATUS)0xC00000D5L)
-#define STATUS_VIRTUAL_CIRCUIT_CLOSED ((NTSTATUS)0xC00000D6L)
-#define STATUS_NO_SECURITY_ON_OBJECT ((NTSTATUS)0xC00000D7L)
-#define STATUS_CANT_WAIT ((NTSTATUS)0xC00000D8L)
-#define STATUS_PIPE_EMPTY ((NTSTATUS)0xC00000D9L)
-#define STATUS_CANT_ACCESS_DOMAIN_INFO ((NTSTATUS)0xC00000DAL)
-#define STATUS_CANT_TERMINATE_SELF ((NTSTATUS)0xC00000DBL)
-#define STATUS_INVALID_SERVER_STATE ((NTSTATUS)0xC00000DCL)
-#define STATUS_INVALID_DOMAIN_STATE ((NTSTATUS)0xC00000DDL)
-#define STATUS_INVALID_DOMAIN_ROLE ((NTSTATUS)0xC00000DEL)
-#define STATUS_NO_SUCH_DOMAIN ((NTSTATUS)0xC00000DFL)
-#define STATUS_DOMAIN_EXISTS ((NTSTATUS)0xC00000E0L)
-#define STATUS_DOMAIN_LIMIT_EXCEEDED ((NTSTATUS)0xC00000E1L)
-#define STATUS_OPLOCK_NOT_GRANTED ((NTSTATUS)0xC00000E2L)
-#define STATUS_INVALID_OPLOCK_PROTOCOL ((NTSTATUS)0xC00000E3L)
-#define STATUS_INTERNAL_DB_CORRUPTION ((NTSTATUS)0xC00000E4L)
-#define STATUS_INTERNAL_ERROR ((NTSTATUS)0xC00000E5L)
-#define STATUS_GENERIC_NOT_MAPPED ((NTSTATUS)0xC00000E6L)
-#define STATUS_BAD_DESCRIPTOR_FORMAT ((NTSTATUS)0xC00000E7L)
-#define STATUS_INVALID_USER_BUFFER ((NTSTATUS)0xC00000E8L)
-#define STATUS_UNEXPECTED_IO_ERROR ((NTSTATUS)0xC00000E9L)
-#define STATUS_UNEXPECTED_MM_CREATE_ERR ((NTSTATUS)0xC00000EAL)
-#define STATUS_UNEXPECTED_MM_MAP_ERROR ((NTSTATUS)0xC00000EBL)
-#define STATUS_UNEXPECTED_MM_EXTEND_ERR ((NTSTATUS)0xC00000ECL)
-#define STATUS_NOT_LOGON_PROCESS ((NTSTATUS)0xC00000EDL)
-#define STATUS_LOGON_SESSION_EXISTS ((NTSTATUS)0xC00000EEL)
-#define STATUS_INVALID_PARAMETER_1 ((NTSTATUS)0xC00000EFL)
-#define STATUS_INVALID_PARAMETER_2 ((NTSTATUS)0xC00000F0L)
-#define STATUS_INVALID_PARAMETER_3 ((NTSTATUS)0xC00000F1L)
-#define STATUS_INVALID_PARAMETER_4 ((NTSTATUS)0xC00000F2L)
-#define STATUS_INVALID_PARAMETER_5 ((NTSTATUS)0xC00000F3L)
-#define STATUS_INVALID_PARAMETER_6 ((NTSTATUS)0xC00000F4L)
-#define STATUS_INVALID_PARAMETER_7 ((NTSTATUS)0xC00000F5L)
-#define STATUS_INVALID_PARAMETER_8 ((NTSTATUS)0xC00000F6L)
-#define STATUS_INVALID_PARAMETER_9 ((NTSTATUS)0xC00000F7L)
-#define STATUS_INVALID_PARAMETER_10 ((NTSTATUS)0xC00000F8L)
-#define STATUS_INVALID_PARAMETER_11 ((NTSTATUS)0xC00000F9L)
-#define STATUS_INVALID_PARAMETER_12 ((NTSTATUS)0xC00000FAL)
-#define STATUS_REDIRECTOR_NOT_STARTED ((NTSTATUS)0xC00000FBL)
-#define STATUS_REDIRECTOR_STARTED ((NTSTATUS)0xC00000FCL)
-#define STATUS_STACK_OVERFLOW ((NTSTATUS)0xC00000FDL)
-#define STATUS_NO_SUCH_PACKAGE ((NTSTATUS)0xC00000FEL)
-#define STATUS_BAD_FUNCTION_TABLE ((NTSTATUS)0xC00000FFL)
-#define STATUS_VARIABLE_NOT_FOUND ((NTSTATUS)0xC0000100L)
-#define STATUS_DIRECTORY_NOT_EMPTY ((NTSTATUS)0xC0000101L)
-#define STATUS_FILE_CORRUPT_ERROR ((NTSTATUS)0xC0000102L)
-#define STATUS_NOT_A_DIRECTORY ((NTSTATUS)0xC0000103L)
-#define STATUS_BAD_LOGON_SESSION_STATE ((NTSTATUS)0xC0000104L)
-#define STATUS_LOGON_SESSION_COLLISION ((NTSTATUS)0xC0000105L)
-#define STATUS_NAME_TOO_LONG ((NTSTATUS)0xC0000106L)
-#define STATUS_FILES_OPEN ((NTSTATUS)0xC0000107L)
-#define STATUS_CONNECTION_IN_USE ((NTSTATUS)0xC0000108L)
-#define STATUS_MESSAGE_NOT_FOUND ((NTSTATUS)0xC0000109L)
-#define STATUS_PROCESS_IS_TERMINATING ((NTSTATUS)0xC000010AL)
-#define STATUS_INVALID_LOGON_TYPE ((NTSTATUS)0xC000010BL)
-#define STATUS_NO_GUID_TRANSLATION ((NTSTATUS)0xC000010CL)
-#define STATUS_CANNOT_IMPERSONATE ((NTSTATUS)0xC000010DL)
-#define STATUS_IMAGE_ALREADY_LOADED ((NTSTATUS)0xC000010EL)
-#define STATUS_ABIOS_NOT_PRESENT ((NTSTATUS)0xC000010FL)
-#define STATUS_ABIOS_LID_NOT_EXIST ((NTSTATUS)0xC0000110L)
-#define STATUS_ABIOS_LID_ALREADY_OWNED ((NTSTATUS)0xC0000111L)
-#define STATUS_ABIOS_NOT_LID_OWNER ((NTSTATUS)0xC0000112L)
-#define STATUS_ABIOS_INVALID_COMMAND ((NTSTATUS)0xC0000113L)
-#define STATUS_ABIOS_INVALID_LID ((NTSTATUS)0xC0000114L)
-#define STATUS_ABIOS_SELECTOR_NOT_AVAILABLE ((NTSTATUS)0xC0000115L)
-#define STATUS_ABIOS_INVALID_SELECTOR ((NTSTATUS)0xC0000116L)
-#define STATUS_NO_LDT ((NTSTATUS)0xC0000117L)
-#define STATUS_INVALID_LDT_SIZE ((NTSTATUS)0xC0000118L)
-#define STATUS_INVALID_LDT_OFFSET ((NTSTATUS)0xC0000119L)
-#define STATUS_INVALID_LDT_DESCRIPTOR ((NTSTATUS)0xC000011AL)
-#define STATUS_INVALID_IMAGE_NE_FORMAT ((NTSTATUS)0xC000011BL)
-#define STATUS_RXACT_INVALID_STATE ((NTSTATUS)0xC000011CL)
-#define STATUS_RXACT_COMMIT_FAILURE ((NTSTATUS)0xC000011DL)
-#define STATUS_MAPPED_FILE_SIZE_ZERO ((NTSTATUS)0xC000011EL)
-#define STATUS_TOO_MANY_OPENED_FILES ((NTSTATUS)0xC000011FL)
-#define STATUS_CANCELLED ((NTSTATUS)0xC0000120L)
-#define STATUS_CANNOT_DELETE ((NTSTATUS)0xC0000121L)
-#define STATUS_INVALID_COMPUTER_NAME ((NTSTATUS)0xC0000122L)
-#define STATUS_FILE_DELETED ((NTSTATUS)0xC0000123L)
-#define STATUS_SPECIAL_ACCOUNT ((NTSTATUS)0xC0000124L)
-#define STATUS_SPECIAL_GROUP ((NTSTATUS)0xC0000125L)
-#define STATUS_SPECIAL_USER ((NTSTATUS)0xC0000126L)
-#define STATUS_MEMBERS_PRIMARY_GROUP ((NTSTATUS)0xC0000127L)
-#define STATUS_FILE_CLOSED ((NTSTATUS)0xC0000128L)
-#define STATUS_TOO_MANY_THREADS ((NTSTATUS)0xC0000129L)
-#define STATUS_THREAD_NOT_IN_PROCESS ((NTSTATUS)0xC000012AL)
-#define STATUS_TOKEN_ALREADY_IN_USE ((NTSTATUS)0xC000012BL)
-#define STATUS_PAGEFILE_QUOTA_EXCEEDED ((NTSTATUS)0xC000012CL)
-#define STATUS_COMMITMENT_LIMIT ((NTSTATUS)0xC000012DL)
-#define STATUS_INVALID_IMAGE_LE_FORMAT ((NTSTATUS)0xC000012EL)
-#define STATUS_INVALID_IMAGE_NOT_MZ ((NTSTATUS)0xC000012FL)
-#define STATUS_INVALID_IMAGE_PROTECT ((NTSTATUS)0xC0000130L)
-#define STATUS_INVALID_IMAGE_WIN_16 ((NTSTATUS)0xC0000131L)
-#define STATUS_LOGON_SERVER_CONFLICT ((NTSTATUS)0xC0000132L)
-#define STATUS_TIME_DIFFERENCE_AT_DC ((NTSTATUS)0xC0000133L)
-#define STATUS_SYNCHRONIZATION_REQUIRED ((NTSTATUS)0xC0000134L)
-#define STATUS_DLL_NOT_FOUND ((NTSTATUS)0xC0000135L)
-#define STATUS_OPEN_FAILED ((NTSTATUS)0xC0000136L)
-#define STATUS_IO_PRIVILEGE_FAILED ((NTSTATUS)0xC0000137L)
-#define STATUS_ORDINAL_NOT_FOUND ((NTSTATUS)0xC0000138L)
-#define STATUS_ENTRYPOINT_NOT_FOUND ((NTSTATUS)0xC0000139L)
-#define STATUS_CONTROL_C_EXIT ((NTSTATUS)0xC000013AL)
-#define STATUS_LOCAL_DISCONNECT ((NTSTATUS)0xC000013BL)
-#define STATUS_REMOTE_DISCONNECT ((NTSTATUS)0xC000013CL)
-#define STATUS_REMOTE_RESOURCES ((NTSTATUS)0xC000013DL)
-#define STATUS_LINK_FAILED ((NTSTATUS)0xC000013EL)
-#define STATUS_LINK_TIMEOUT ((NTSTATUS)0xC000013FL)
-#define STATUS_INVALID_CONNECTION ((NTSTATUS)0xC0000140L)
-#define STATUS_INVALID_ADDRESS ((NTSTATUS)0xC0000141L)
-#define STATUS_DLL_INIT_FAILED ((NTSTATUS)0xC0000142L)
-#define STATUS_MISSING_SYSTEMFILE ((NTSTATUS)0xC0000143L)
-#define STATUS_UNHANDLED_EXCEPTION ((NTSTATUS)0xC0000144L)
-#define STATUS_APP_INIT_FAILURE ((NTSTATUS)0xC0000145L)
-#define STATUS_PAGEFILE_CREATE_FAILED ((NTSTATUS)0xC0000146L)
-#define STATUS_NO_PAGEFILE ((NTSTATUS)0xC0000147L)
-#define STATUS_INVALID_LEVEL ((NTSTATUS)0xC0000148L)
-#define STATUS_WRONG_PASSWORD_CORE ((NTSTATUS)0xC0000149L)
-#define STATUS_ILLEGAL_FLOAT_CONTEXT ((NTSTATUS)0xC000014AL)
-#define STATUS_PIPE_BROKEN ((NTSTATUS)0xC000014BL)
-#define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014CL)
-#define STATUS_REGISTRY_IO_FAILED ((NTSTATUS)0xC000014DL)
-#define STATUS_NO_EVENT_PAIR ((NTSTATUS)0xC000014EL)
-#define STATUS_UNRECOGNIZED_VOLUME ((NTSTATUS)0xC000014FL)
-#define STATUS_SERIAL_NO_DEVICE_INITED ((NTSTATUS)0xC0000150L)
-#define STATUS_NO_SUCH_ALIAS ((NTSTATUS)0xC0000151L)
-#define STATUS_MEMBER_NOT_IN_ALIAS ((NTSTATUS)0xC0000152L)
-#define STATUS_MEMBER_IN_ALIAS ((NTSTATUS)0xC0000153L)
-#define STATUS_ALIAS_EXISTS ((NTSTATUS)0xC0000154L)
-#define STATUS_LOGON_NOT_GRANTED ((NTSTATUS)0xC0000155L)
-#define STATUS_TOO_MANY_SECRETS ((NTSTATUS)0xC0000156L)
-#define STATUS_SECRET_TOO_LONG ((NTSTATUS)0xC0000157L)
-#define STATUS_INTERNAL_DB_ERROR ((NTSTATUS)0xC0000158L)
-#define STATUS_FULLSCREEN_MODE ((NTSTATUS)0xC0000159L)
-#define STATUS_TOO_MANY_CONTEXT_IDS ((NTSTATUS)0xC000015AL)
-#define STATUS_LOGON_TYPE_NOT_GRANTED ((NTSTATUS)0xC000015BL)
-#define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015CL)
-#define STATUS_NT_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS)0xC000015DL)
-#define STATUS_DOMAIN_CTRLR_CONFIG_ERROR ((NTSTATUS)0xC000015EL)
-#define STATUS_FT_MISSING_MEMBER ((NTSTATUS)0xC000015FL)
-#define STATUS_ILL_FORMED_SERVICE_ENTRY ((NTSTATUS)0xC0000160L)
-#define STATUS_ILLEGAL_CHARACTER ((NTSTATUS)0xC0000161L)
-#define STATUS_UNMAPPABLE_CHARACTER ((NTSTATUS)0xC0000162L)
-#define STATUS_UNDEFINED_CHARACTER ((NTSTATUS)0xC0000163L)
-#define STATUS_FLOPPY_VOLUME ((NTSTATUS)0xC0000164L)
-#define STATUS_FLOPPY_ID_MARK_NOT_FOUND ((NTSTATUS)0xC0000165L)
-#define STATUS_FLOPPY_WRONG_CYLINDER ((NTSTATUS)0xC0000166L)
-#define STATUS_FLOPPY_UNKNOWN_ERROR ((NTSTATUS)0xC0000167L)
-#define STATUS_FLOPPY_BAD_REGISTERS ((NTSTATUS)0xC0000168L)
-#define STATUS_DISK_RECALIBRATE_FAILED ((NTSTATUS)0xC0000169L)
-#define STATUS_DISK_OPERATION_FAILED ((NTSTATUS)0xC000016AL)
-#define STATUS_DISK_RESET_FAILED ((NTSTATUS)0xC000016BL)
-#define STATUS_SHARED_IRQ_BUSY ((NTSTATUS)0xC000016CL)
-#define STATUS_FT_ORPHANING ((NTSTATUS)0xC000016DL)
-#define STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT ((NTSTATUS)0xC000016EL)
-#define STATUS_PARTITION_FAILURE ((NTSTATUS)0xC0000172L)
-#define STATUS_INVALID_BLOCK_LENGTH ((NTSTATUS)0xC0000173L)
-#define STATUS_DEVICE_NOT_PARTITIONED ((NTSTATUS)0xC0000174L)
-#define STATUS_UNABLE_TO_LOCK_MEDIA ((NTSTATUS)0xC0000175L)
-#define STATUS_UNABLE_TO_UNLOAD_MEDIA ((NTSTATUS)0xC0000176L)
-#define STATUS_EOM_OVERFLOW ((NTSTATUS)0xC0000177L)
-#define STATUS_NO_MEDIA ((NTSTATUS)0xC0000178L)
-#define STATUS_NO_SUCH_MEMBER ((NTSTATUS)0xC000017AL)
-#define STATUS_INVALID_MEMBER ((NTSTATUS)0xC000017BL)
-#define STATUS_KEY_DELETED ((NTSTATUS)0xC000017CL)
-#define STATUS_NO_LOG_SPACE ((NTSTATUS)0xC000017DL)
-#define STATUS_TOO_MANY_SIDS ((NTSTATUS)0xC000017EL)
-#define STATUS_LM_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS)0xC000017FL)
-#define STATUS_KEY_HAS_CHILDREN ((NTSTATUS)0xC0000180L)
-#define STATUS_CHILD_MUST_BE_VOLATILE ((NTSTATUS)0xC0000181L)
-#define STATUS_DEVICE_CONFIGURATION_ERROR ((NTSTATUS)0xC0000182L)
-#define STATUS_DRIVER_INTERNAL_ERROR ((NTSTATUS)0xC0000183L)
-#define STATUS_INVALID_DEVICE_STATE ((NTSTATUS)0xC0000184L)
-#define STATUS_IO_DEVICE_ERROR ((NTSTATUS)0xC0000185L)
-#define STATUS_DEVICE_PROTOCOL_ERROR ((NTSTATUS)0xC0000186L)
-#define STATUS_BACKUP_CONTROLLER ((NTSTATUS)0xC0000187L)
-#define STATUS_LOG_FILE_FULL ((NTSTATUS)0xC0000188L)
-#define STATUS_TOO_LATE ((NTSTATUS)0xC0000189L)
-#define STATUS_NO_TRUST_LSA_SECRET ((NTSTATUS)0xC000018AL)
-#define STATUS_NO_TRUST_SAM_ACCOUNT ((NTSTATUS)0xC000018BL)
-#define STATUS_TRUSTED_DOMAIN_FAILURE ((NTSTATUS)0xC000018CL)
-#define STATUS_TRUSTED_RELATIONSHIP_FAILURE ((NTSTATUS)0xC000018DL)
-#define STATUS_EVENTLOG_FILE_CORRUPT ((NTSTATUS)0xC000018EL)
-#define STATUS_EVENTLOG_CANT_START ((NTSTATUS)0xC000018FL)
-#define STATUS_TRUST_FAILURE ((NTSTATUS)0xC0000190L)
-#define STATUS_MUTANT_LIMIT_EXCEEDED ((NTSTATUS)0xC0000191L)
-#define STATUS_NETLOGON_NOT_STARTED ((NTSTATUS)0xC0000192L)
-#define STATUS_ACCOUNT_EXPIRED ((NTSTATUS)0xC0000193L)
-#define STATUS_POSSIBLE_DEADLOCK ((NTSTATUS)0xC0000194L)
-#define STATUS_NETWORK_CREDENTIAL_CONFLICT ((NTSTATUS)0xC0000195L)
-#define STATUS_REMOTE_SESSION_LIMIT ((NTSTATUS)0xC0000196L)
-#define STATUS_EVENTLOG_FILE_CHANGED ((NTSTATUS)0xC0000197L)
-#define STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT ((NTSTATUS)0xC0000198L)
-#define STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT ((NTSTATUS)0xC0000199L)
-#define STATUS_NOLOGON_SERVER_TRUST_ACCOUNT ((NTSTATUS)0xC000019AL)
-#define STATUS_DOMAIN_TRUST_INCONSISTENT ((NTSTATUS)0xC000019BL)
-#define STATUS_FS_DRIVER_REQUIRED ((NTSTATUS)0xC000019CL)
-#define STATUS_NO_USER_SESSION_KEY ((NTSTATUS)0xC0000202L)
-#define STATUS_USER_SESSION_DELETED ((NTSTATUS)0xC0000203L)
-#define STATUS_RESOURCE_LANG_NOT_FOUND ((NTSTATUS)0xC0000204L)
-#define STATUS_INSUFF_SERVER_RESOURCES ((NTSTATUS)0xC0000205L)
-#define STATUS_INVALID_BUFFER_SIZE ((NTSTATUS)0xC0000206L)
-#define STATUS_INVALID_ADDRESS_COMPONENT ((NTSTATUS)0xC0000207L)
-#define STATUS_INVALID_ADDRESS_WILDCARD ((NTSTATUS)0xC0000208L)
-#define STATUS_TOO_MANY_ADDRESSES ((NTSTATUS)0xC0000209L)
-#define STATUS_ADDRESS_ALREADY_EXISTS ((NTSTATUS)0xC000020AL)
-#define STATUS_ADDRESS_CLOSED ((NTSTATUS)0xC000020BL)
-#define STATUS_CONNECTION_DISCONNECTED ((NTSTATUS)0xC000020CL)
-#define STATUS_CONNECTION_RESET ((NTSTATUS)0xC000020DL)
-#define STATUS_TOO_MANY_NODES ((NTSTATUS)0xC000020EL)
-#define STATUS_TRANSACTION_ABORTED ((NTSTATUS)0xC000020FL)
-#define STATUS_TRANSACTION_TIMED_OUT ((NTSTATUS)0xC0000210L)
-#define STATUS_TRANSACTION_NO_RELEASE ((NTSTATUS)0xC0000211L)
-#define STATUS_TRANSACTION_NO_MATCH ((NTSTATUS)0xC0000212L)
-#define STATUS_TRANSACTION_RESPONDED ((NTSTATUS)0xC0000213L)
-#define STATUS_TRANSACTION_INVALID_ID ((NTSTATUS)0xC0000214L)
-#define STATUS_TRANSACTION_INVALID_TYPE ((NTSTATUS)0xC0000215L)
-#define STATUS_NOT_SERVER_SESSION ((NTSTATUS)0xC0000216L)
-#define STATUS_NOT_CLIENT_SESSION ((NTSTATUS)0xC0000217L)
-#define STATUS_CANNOT_LOAD_REGISTRY_FILE ((NTSTATUS)0xC0000218L)
-#define STATUS_DEBUG_ATTACH_FAILED ((NTSTATUS)0xC0000219L)
-#define STATUS_SYSTEM_PROCESS_TERMINATED ((NTSTATUS)0xC000021AL)
-#define STATUS_DATA_NOT_ACCEPTED ((NTSTATUS)0xC000021BL)
-#define STATUS_NO_BROWSER_SERVERS_FOUND ((NTSTATUS)0xC000021CL)
-#define STATUS_VDM_HARD_ERROR ((NTSTATUS)0xC000021DL)
-#define STATUS_DRIVER_CANCEL_TIMEOUT ((NTSTATUS)0xC000021EL)
-#define STATUS_REPLY_MESSAGE_MISMATCH ((NTSTATUS)0xC000021FL)
-#define STATUS_MAPPED_ALIGNMENT ((NTSTATUS)0xC0000220L)
-#define STATUS_IMAGE_CHECKSUM_MISMATCH ((NTSTATUS)0xC0000221L)
-#define STATUS_LOST_WRITEBEHIND_DATA ((NTSTATUS)0xC0000222L)
-#define STATUS_CLIENT_SERVER_PARAMETERS_INVALID ((NTSTATUS)0xC0000223L)
-#define STATUS_PASSWORD_MUST_CHANGE ((NTSTATUS)0xC0000224L)
-#define STATUS_NOT_FOUND ((NTSTATUS)0xC0000225L)
-#define STATUS_NOT_TINY_STREAM ((NTSTATUS)0xC0000226L)
-#define STATUS_RECOVERY_FAILURE ((NTSTATUS)0xC0000227L)
-#define STATUS_STACK_OVERFLOW_READ ((NTSTATUS)0xC0000228L)
-#define STATUS_FAIL_CHECK ((NTSTATUS)0xC0000229L)
-#define STATUS_DUPLICATE_OBJECTID ((NTSTATUS)0xC000022AL)
-#define STATUS_OBJECTID_EXISTS ((NTSTATUS)0xC000022BL)
-#define STATUS_CONVERT_TO_LARGE ((NTSTATUS)0xC000022CL)
-#define STATUS_RETRY ((NTSTATUS)0xC000022DL)
-#define STATUS_FOUND_OUT_OF_SCOPE ((NTSTATUS)0xC000022EL)
-#define STATUS_ALLOCATE_BUCKET ((NTSTATUS)0xC000022FL)
-#define STATUS_PROPSET_NOT_FOUND ((NTSTATUS)0xC0000230L)
-#define STATUS_MARSHALL_OVERFLOW ((NTSTATUS)0xC0000231L)
-#define STATUS_INVALID_VARIANT ((NTSTATUS)0xC0000232L)
-#define STATUS_DOMAIN_CONTROLLER_NOT_FOUND ((NTSTATUS)0xC0000233L)
-#define STATUS_ACCOUNT_LOCKED_OUT ((NTSTATUS)0xC0000234L)
-#define STATUS_HANDLE_NOT_CLOSABLE ((NTSTATUS)0xC0000235L)
-#define STATUS_CONNECTION_REFUSED ((NTSTATUS)0xC0000236L)
-#define STATUS_GRACEFUL_DISCONNECT ((NTSTATUS)0xC0000237L)
-#define STATUS_ADDRESS_ALREADY_ASSOCIATED ((NTSTATUS)0xC0000238L)
-#define STATUS_ADDRESS_NOT_ASSOCIATED ((NTSTATUS)0xC0000239L)
-#define STATUS_CONNECTION_INVALID ((NTSTATUS)0xC000023AL)
-#define STATUS_CONNECTION_ACTIVE ((NTSTATUS)0xC000023BL)
-#define STATUS_NETWORK_UNREACHABLE ((NTSTATUS)0xC000023CL)
-#define STATUS_HOST_UNREACHABLE ((NTSTATUS)0xC000023DL)
-#define STATUS_PROTOCOL_UNREACHABLE ((NTSTATUS)0xC000023EL)
-#define STATUS_PORT_UNREACHABLE ((NTSTATUS)0xC000023FL)
-#define STATUS_REQUEST_ABORTED ((NTSTATUS)0xC0000240L)
-#define STATUS_CONNECTION_ABORTED ((NTSTATUS)0xC0000241L)
-#define STATUS_BAD_COMPRESSION_BUFFER ((NTSTATUS)0xC0000242L)
-#define STATUS_USER_MAPPED_FILE ((NTSTATUS)0xC0000243L)
-#define STATUS_AUDIT_FAILED ((NTSTATUS)0xC0000244L)
-#define STATUS_TIMER_RESOLUTION_NOT_SET ((NTSTATUS)0xC0000245L)
-#define STATUS_CONNECTION_COUNT_LIMIT ((NTSTATUS)0xC0000246L)
-#define STATUS_LOGIN_TIME_RESTRICTION ((NTSTATUS)0xC0000247L)
-#define STATUS_LOGIN_WKSTA_RESTRICTION ((NTSTATUS)0xC0000248L)
-#define STATUS_IMAGE_MP_UP_MISMATCH ((NTSTATUS)0xC0000249L)
-#define STATUS_INSUFFICIENT_LOGON_INFO ((NTSTATUS)0xC0000250L)
-#define STATUS_BAD_DLL_ENTRYPOINT ((NTSTATUS)0xC0000251L)
-#define STATUS_BAD_SERVICE_ENTRYPOINT ((NTSTATUS)0xC0000252L)
-#define STATUS_LPC_REPLY_LOST ((NTSTATUS)0xC0000253L)
-#define STATUS_IP_ADDRESS_CONFLICT1 ((NTSTATUS)0xC0000254L)
-#define STATUS_IP_ADDRESS_CONFLICT2 ((NTSTATUS)0xC0000255L)
-#define STATUS_REGISTRY_QUOTA_LIMIT ((NTSTATUS)0xC0000256L)
-#define STATUS_PATH_NOT_COVERED ((NTSTATUS)0xC0000257L)
-#define STATUS_NO_CALLBACK_ACTIVE ((NTSTATUS)0xC0000258L)
-#define STATUS_LICENSE_QUOTA_EXCEEDED ((NTSTATUS)0xC0000259L)
-#define STATUS_PWD_TOO_SHORT ((NTSTATUS)0xC000025AL)
-#define STATUS_PWD_TOO_RECENT ((NTSTATUS)0xC000025BL)
-#define STATUS_PWD_HISTORY_CONFLICT ((NTSTATUS)0xC000025CL)
-#define STATUS_PLUGPLAY_NO_DEVICE ((NTSTATUS)0xC000025EL)
-#define STATUS_UNSUPPORTED_COMPRESSION ((NTSTATUS)0xC000025FL)
-#define STATUS_INVALID_HW_PROFILE ((NTSTATUS)0xC0000260L)
-#define STATUS_INVALID_PLUGPLAY_DEVICE_PATH ((NTSTATUS)0xC0000261L)
-#define STATUS_DRIVER_ORDINAL_NOT_FOUND ((NTSTATUS)0xC0000262L)
-#define STATUS_DRIVER_ENTRYPOINT_NOT_FOUND ((NTSTATUS)0xC0000263L)
-#define STATUS_RESOURCE_NOT_OWNED ((NTSTATUS)0xC0000264L)
-#define STATUS_TOO_MANY_LINKS ((NTSTATUS)0xC0000265L)
-#define STATUS_QUOTA_LIST_INCONSISTENT ((NTSTATUS)0xC0000266L)
-#define STATUS_FILE_IS_OFFLINE ((NTSTATUS)0xC0000267L)
-#define STATUS_EVALUATION_EXPIRATION ((NTSTATUS)0xC0000268L)
-#define STATUS_ILLEGAL_DLL_RELOCATION ((NTSTATUS)0xC0000269L)
-#define STATUS_LICENSE_VIOLATION ((NTSTATUS)0xC000026AL)
-#define STATUS_DLL_INIT_FAILED_LOGOFF ((NTSTATUS)0xC000026BL)
-#define STATUS_DRIVER_UNABLE_TO_LOAD ((NTSTATUS)0xC000026CL)
-#define STATUS_DFS_UNAVAILABLE ((NTSTATUS)0xC000026DL)
-#define STATUS_VOLUME_DISMOUNTED ((NTSTATUS)0xC000026EL)
-#define STATUS_WX86_INTERNAL_ERROR ((NTSTATUS)0xC000026FL)
-#define STATUS_WX86_FLOAT_STACK_CHECK ((NTSTATUS)0xC0000270L)
-#define STATUS_VALIDATE_CONTINUE ((NTSTATUS)0xC0000271L)
-#define STATUS_NO_MATCH ((NTSTATUS)0xC0000272L)
-#define STATUS_NO_MORE_MATCHES ((NTSTATUS)0xC0000273L)
-#define STATUS_NOT_A_REPARSE_POINT ((NTSTATUS)0xC0000275L)
-#define STATUS_IO_REPARSE_TAG_INVALID ((NTSTATUS)0xC0000276L)
-#define STATUS_IO_REPARSE_TAG_MISMATCH ((NTSTATUS)0xC0000277L)
-#define STATUS_IO_REPARSE_DATA_INVALID ((NTSTATUS)0xC0000278L)
-#define STATUS_IO_REPARSE_TAG_NOT_HANDLED ((NTSTATUS)0xC0000279L)
-#define STATUS_REPARSE_POINT_NOT_RESOLVED ((NTSTATUS)0xC0000280L)
-#define STATUS_DIRECTORY_IS_A_REPARSE_POINT ((NTSTATUS)0xC0000281L)
-#define STATUS_RANGE_LIST_CONFLICT ((NTSTATUS)0xC0000282L)
-#define STATUS_SOURCE_ELEMENT_EMPTY ((NTSTATUS)0xC0000283L)
-#define STATUS_DESTINATION_ELEMENT_FULL ((NTSTATUS)0xC0000284L)
-#define STATUS_ILLEGAL_ELEMENT_ADDRESS ((NTSTATUS)0xC0000285L)
-#define STATUS_MAGAZINE_NOT_PRESENT ((NTSTATUS)0xC0000286L)
-#define STATUS_REINITIALIZATION_NEEDED ((NTSTATUS)0xC0000287L)
-#define STATUS_DEVICE_REQUIRES_CLEANING ((NTSTATUS)0x80000288L)
-#define STATUS_DEVICE_DOOR_OPEN ((NTSTATUS)0x80000289L)
-#define STATUS_ENCRYPTION_FAILED ((NTSTATUS)0xC000028AL)
-#define STATUS_DECRYPTION_FAILED ((NTSTATUS)0xC000028BL)
-#define STATUS_RANGE_NOT_FOUND ((NTSTATUS)0xC000028CL)
-#define STATUS_NO_RECOVERY_POLICY ((NTSTATUS)0xC000028DL)
-#define STATUS_NO_EFS ((NTSTATUS)0xC000028EL)
-#define STATUS_WRONG_EFS ((NTSTATUS)0xC000028FL)
-#define STATUS_NO_USER_KEYS ((NTSTATUS)0xC0000290L)
-#define STATUS_FILE_NOT_ENCRYPTED ((NTSTATUS)0xC0000291L)
-#define STATUS_NOT_EXPORT_FORMAT ((NTSTATUS)0xC0000292L)
-#define STATUS_FILE_ENCRYPTED ((NTSTATUS)0xC0000293L)
-#define STATUS_WAKE_SYSTEM ((NTSTATUS)0x40000294L)
-#define STATUS_WMI_GUID_NOT_FOUND ((NTSTATUS)0xC0000295L)
-#define STATUS_WMI_INSTANCE_NOT_FOUND ((NTSTATUS)0xC0000296L)
-#define STATUS_WMI_ITEMID_NOT_FOUND ((NTSTATUS)0xC0000297L)
-#define STATUS_WMI_TRY_AGAIN ((NTSTATUS)0xC0000298L)
-#define STATUS_SHARED_POLICY ((NTSTATUS)0xC0000299L)
-#define STATUS_POLICY_OBJECT_NOT_FOUND ((NTSTATUS)0xC000029AL)
-#define STATUS_POLICY_ONLY_IN_DS ((NTSTATUS)0xC000029BL)
-#define STATUS_VOLUME_NOT_UPGRADED ((NTSTATUS)0xC000029CL)
-#define STATUS_REMOTE_STORAGE_NOT_ACTIVE ((NTSTATUS)0xC000029DL)
-#define STATUS_REMOTE_STORAGE_MEDIA_ERROR ((NTSTATUS)0xC000029EL)
-#define STATUS_NO_TRACKING_SERVICE ((NTSTATUS)0xC000029FL)
-#define STATUS_SERVER_SID_MISMATCH ((NTSTATUS)0xC00002A0L)
-#define STATUS_DS_NO_ATTRIBUTE_OR_VALUE ((NTSTATUS)0xC00002A1L)
-#define STATUS_DS_INVALID_ATTRIBUTE_SYNTAX ((NTSTATUS)0xC00002A2L)
-#define STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED ((NTSTATUS)0xC00002A3L)
-#define STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS ((NTSTATUS)0xC00002A4L)
-#define STATUS_DS_BUSY ((NTSTATUS)0xC00002A5L)
-#define STATUS_DS_UNAVAILABLE ((NTSTATUS)0xC00002A6L)
-#define STATUS_DS_NO_RIDS_ALLOCATED ((NTSTATUS)0xC00002A7L)
-#define STATUS_DS_NO_MORE_RIDS ((NTSTATUS)0xC00002A8L)
-#define STATUS_DS_INCORRECT_ROLE_OWNER ((NTSTATUS)0xC00002A9L)
-#define STATUS_DS_RIDMGR_INIT_ERROR ((NTSTATUS)0xC00002AAL)
-#define STATUS_DS_OBJ_CLASS_VIOLATION ((NTSTATUS)0xC00002ABL)
-#define STATUS_DS_CANT_ON_NON_LEAF ((NTSTATUS)0xC00002ACL)
-#define STATUS_DS_CANT_ON_RDN ((NTSTATUS)0xC00002ADL)
-#define STATUS_DS_CANT_MOD_OBJ_CLASS ((NTSTATUS)0xC00002AEL)
-#define STATUS_DS_CROSS_DOM_MOVE_FAILED ((NTSTATUS)0xC00002AFL)
-#define STATUS_DS_GC_NOT_AVAILABLE ((NTSTATUS)0xC00002B0L)
-#define STATUS_DIRECTORY_SERVICE_REQUIRED ((NTSTATUS)0xC00002B1L)
-#define STATUS_REPARSE_ATTRIBUTE_CONFLICT ((NTSTATUS)0xC00002B2L)
-#define STATUS_CANT_ENABLE_DENY_ONLY ((NTSTATUS)0xC00002B3L)
-#define STATUS_FLOAT_MULTIPLE_FAULTS ((NTSTATUS)0xC00002B4L)
-#define STATUS_FLOAT_MULTIPLE_TRAPS ((NTSTATUS)0xC00002B5L)
-#define STATUS_DEVICE_REMOVED ((NTSTATUS)0xC00002B6L)
-#define STATUS_JOURNAL_DELETE_IN_PROGRESS ((NTSTATUS)0xC00002B7L)
-#define STATUS_JOURNAL_NOT_ACTIVE ((NTSTATUS)0xC00002B8L)
-#define STATUS_NOINTERFACE ((NTSTATUS)0xC00002B9L)
-#define STATUS_DS_ADMIN_LIMIT_EXCEEDED ((NTSTATUS)0xC00002C1L)
-#define STATUS_DRIVER_FAILED_SLEEP ((NTSTATUS)0xC00002C2L)
-#define STATUS_MUTUAL_AUTHENTICATION_FAILED ((NTSTATUS)0xC00002C3L)
-#define STATUS_CORRUPT_SYSTEM_FILE ((NTSTATUS)0xC00002C4L)
-#define STATUS_DATATYPE_MISALIGNMENT_ERROR ((NTSTATUS)0xC00002C5L)
-#define STATUS_WMI_READ_ONLY ((NTSTATUS)0xC00002C6L)
-#define STATUS_WMI_SET_FAILURE ((NTSTATUS)0xC00002C7L)
-#define STATUS_COMMITMENT_MINIMUM ((NTSTATUS)0xC00002C8L)
-#define STATUS_REG_NAT_CONSUMPTION ((NTSTATUS)0xC00002C9L)
-#define STATUS_TRANSPORT_FULL ((NTSTATUS)0xC00002CAL)
-#define STATUS_DS_SAM_INIT_FAILURE ((NTSTATUS)0xC00002CBL)
-#define STATUS_ONLY_IF_CONNECTED ((NTSTATUS)0xC00002CCL)
-#define STATUS_DS_SENSITIVE_GROUP_VIOLATION ((NTSTATUS)0xC00002CDL)
-#define STATUS_PNP_RESTART_ENUMERATION ((NTSTATUS)0xC00002CEL)
-#define STATUS_JOURNAL_ENTRY_DELETED ((NTSTATUS)0xC00002CFL)
-#define STATUS_DS_CANT_MOD_PRIMARYGROUPID ((NTSTATUS)0xC00002D0L)
-#define STATUS_SYSTEM_IMAGE_BAD_SIGNATURE ((NTSTATUS)0xC00002D1L)
-#define STATUS_PNP_REBOOT_REQUIRED ((NTSTATUS)0xC00002D2L)
-#define STATUS_POWER_STATE_INVALID ((NTSTATUS)0xC00002D3L)
-#define STATUS_DS_INVALID_GROUP_TYPE ((NTSTATUS)0xC00002D4L)
-#define STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN ((NTSTATUS)0xC00002D5L)
-#define STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN ((NTSTATUS)0xC00002D6L)
-#define STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS)0xC00002D7L)
-#define STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS)0xC00002D8L)
-#define STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS)0xC00002D9L)
-#define STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER ((NTSTATUS)0xC00002DAL)
-#define STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER ((NTSTATUS)0xC00002DBL)
-#define STATUS_DS_HAVE_PRIMARY_MEMBERS ((NTSTATUS)0xC00002DCL)
-#define STATUS_WMI_NOT_SUPPORTED ((NTSTATUS)0xC00002DDL)
-#define STATUS_INSUFFICIENT_POWER ((NTSTATUS)0xC00002DEL)
-#define STATUS_SAM_NEED_BOOTKEY_PASSWORD ((NTSTATUS)0xC00002DFL)
-#define STATUS_SAM_NEED_BOOTKEY_FLOPPY ((NTSTATUS)0xC00002E0L)
-#define STATUS_DS_CANT_START ((NTSTATUS)0xC00002E1L)
-#define STATUS_DS_INIT_FAILURE ((NTSTATUS)0xC00002E2L)
-#define STATUS_SAM_INIT_FAILURE ((NTSTATUS)0xC00002E3L)
-#define STATUS_DS_GC_REQUIRED ((NTSTATUS)0xC00002E4L)
-#define STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY ((NTSTATUS)0xC00002E5L)
-#define STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS ((NTSTATUS)0xC00002E6L)
-#define STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED ((NTSTATUS)0xC00002E7L)
-#define STATUS_MULTIPLE_FAULT_VIOLATION ((NTSTATUS)0xC00002E8L)
-#define STATUS_CURRENT_DOMAIN_NOT_ALLOWED ((NTSTATUS)0xC00002E9L)
-#define STATUS_CANNOT_MAKE ((NTSTATUS)0xC00002EAL)
-#define STATUS_SYSTEM_SHUTDOWN ((NTSTATUS)0xC00002EBL)
-#define STATUS_DS_INIT_FAILURE_CONSOLE ((NTSTATUS)0xC00002ECL)
-#define STATUS_DS_SAM_INIT_FAILURE_CONSOLE ((NTSTATUS)0xC00002EDL)
-#define STATUS_UNFINISHED_CONTEXT_DELETED ((NTSTATUS)0xC00002EEL)
-#define STATUS_NO_TGT_REPLY ((NTSTATUS)0xC00002EFL)
-#define STATUS_OBJECTID_NOT_FOUND ((NTSTATUS)0xC00002F0L)
-#define STATUS_NO_IP_ADDRESSES ((NTSTATUS)0xC00002F1L)
-#define STATUS_WRONG_CREDENTIAL_HANDLE ((NTSTATUS)0xC00002F2L)
-#define STATUS_CRYPTO_SYSTEM_INVALID ((NTSTATUS)0xC00002F3L)
-#define STATUS_MAX_REFERRALS_EXCEEDED ((NTSTATUS)0xC00002F4L)
-#define STATUS_MUST_BE_KDC ((NTSTATUS)0xC00002F5L)
-#define STATUS_STRONG_CRYPTO_NOT_SUPPORTED ((NTSTATUS)0xC00002F6L)
-#define STATUS_TOO_MANY_PRINCIPALS ((NTSTATUS)0xC00002F7L)
-#define STATUS_NO_PA_DATA ((NTSTATUS)0xC00002F8L)
-#define STATUS_PKINIT_NAME_MISMATCH ((NTSTATUS)0xC00002F9L)
-#define STATUS_SMARTCARD_LOGON_REQUIRED ((NTSTATUS)0xC00002FAL)
-#define STATUS_KDC_INVALID_REQUEST ((NTSTATUS)0xC00002FBL)
-#define STATUS_KDC_UNABLE_TO_REFER ((NTSTATUS)0xC00002FCL)
-#define STATUS_KDC_UNKNOWN_ETYPE ((NTSTATUS)0xC00002FDL)
-#define STATUS_SHUTDOWN_IN_PROGRESS ((NTSTATUS)0xC00002FEL)
-#define STATUS_SERVER_SHUTDOWN_IN_PROGRESS ((NTSTATUS)0xC00002FFL)
-#define STATUS_NOT_SUPPORTED_ON_SBS ((NTSTATUS)0xC0000300L)
-#define STATUS_WMI_GUID_DISCONNECTED ((NTSTATUS)0xC0000301L)
-#define STATUS_WMI_ALREADY_DISABLED ((NTSTATUS)0xC0000302L)
-#define STATUS_WMI_ALREADY_ENABLED ((NTSTATUS)0xC0000303L)
-#define STATUS_MFT_TOO_FRAGMENTED ((NTSTATUS)0xC0000304L)
-#define STATUS_COPY_PROTECTION_FAILURE ((NTSTATUS)0xC0000305L)
-#define STATUS_CSS_AUTHENTICATION_FAILURE ((NTSTATUS)0xC0000306L)
-#define STATUS_CSS_KEY_NOT_PRESENT ((NTSTATUS)0xC0000307L)
-#define STATUS_CSS_KEY_NOT_ESTABLISHED ((NTSTATUS)0xC0000308L)
-#define STATUS_CSS_SCRAMBLED_SECTOR ((NTSTATUS)0xC0000309L)
-#define STATUS_CSS_REGION_MISMATCH ((NTSTATUS)0xC000030AL)
-#define STATUS_CSS_RESETS_EXHAUSTED ((NTSTATUS)0xC000030BL)
-#define STATUS_PKINIT_FAILURE ((NTSTATUS)0xC0000320L)
-#define STATUS_SMARTCARD_SUBSYSTEM_FAILURE ((NTSTATUS)0xC0000321L)
-#define STATUS_NO_KERB_KEY ((NTSTATUS)0xC0000322L)
-#define STATUS_HOST_DOWN ((NTSTATUS)0xC0000350L)
-#define STATUS_UNSUPPORTED_PREAUTH ((NTSTATUS)0xC0000351L)
-#define STATUS_EFS_ALG_BLOB_TOO_BIG ((NTSTATUS)0xC0000352L)
-#define STATUS_PORT_NOT_SET ((NTSTATUS)0xC0000353L)
-#define STATUS_DEBUGGER_INACTIVE ((NTSTATUS)0xC0000354L)
-#define STATUS_DS_VERSION_CHECK_FAILURE ((NTSTATUS)0xC0000355L)
-#define STATUS_AUDITING_DISABLED ((NTSTATUS)0xC0000356L)
-#define STATUS_PRENT4_MACHINE_ACCOUNT ((NTSTATUS)0xC0000357L)
-#define STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS)0xC0000358L)
-#define STATUS_INVALID_IMAGE_WIN_32 ((NTSTATUS)0xC0000359L)
-#define STATUS_INVALID_IMAGE_WIN_64 ((NTSTATUS)0xC000035AL)
-#define STATUS_BAD_BINDINGS ((NTSTATUS)0xC000035BL)
-#define STATUS_NETWORK_SESSION_EXPIRED ((NTSTATUS)0xC000035CL)
-#define STATUS_APPHELP_BLOCK ((NTSTATUS)0xC000035DL)
-#define STATUS_ALL_SIDS_FILTERED ((NTSTATUS)0xC000035EL)
-#define STATUS_NOT_SAFE_MODE_DRIVER ((NTSTATUS)0xC000035FL)
-#define STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT ((NTSTATUS)0xC0000361L)
-#define STATUS_ACCESS_DISABLED_BY_POLICY_PATH ((NTSTATUS)0xC0000362L)
-#define STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER ((NTSTATUS)0xC0000363L)
-#define STATUS_ACCESS_DISABLED_BY_POLICY_OTHER ((NTSTATUS)0xC0000364L)
-#define STATUS_FAILED_DRIVER_ENTRY ((NTSTATUS)0xC0000365L)
-#define STATUS_DEVICE_ENUMERATION_ERROR ((NTSTATUS)0xC0000366L)
-#define STATUS_WAIT_FOR_OPLOCK ((NTSTATUS)0x00000367L)
-#define STATUS_MOUNT_POINT_NOT_RESOLVED ((NTSTATUS)0xC0000368L)
-#define STATUS_INVALID_DEVICE_OBJECT_PARAMETER ((NTSTATUS)0xC0000369L)
-#define STATUS_MCA_OCCURED ((NTSTATUS)0xC000036AL)
-#define STATUS_DRIVER_BLOCKED_CRITICAL ((NTSTATUS)0xC000036BL)
-#define STATUS_DRIVER_BLOCKED ((NTSTATUS)0xC000036CL)
-#define STATUS_DRIVER_DATABASE_ERROR ((NTSTATUS)0xC000036DL)
-#define STATUS_SYSTEM_HIVE_TOO_LARGE ((NTSTATUS)0xC000036EL)
-#define STATUS_INVALID_IMPORT_OF_NON_DLL ((NTSTATUS)0xC000036FL)
-#define STATUS_DS_SHUTTING_DOWN ((NTSTATUS)0x40000370L)
-#define STATUS_SMARTCARD_WRONG_PIN ((NTSTATUS)0xC0000380L)
-#define STATUS_SMARTCARD_CARD_BLOCKED ((NTSTATUS)0xC0000381L)
-#define STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED ((NTSTATUS)0xC0000382L)
-#define STATUS_SMARTCARD_NO_CARD ((NTSTATUS)0xC0000383L)
-#define STATUS_SMARTCARD_NO_KEY_CONTAINER ((NTSTATUS)0xC0000384L)
-#define STATUS_SMARTCARD_NO_CERTIFICATE ((NTSTATUS)0xC0000385L)
-#define STATUS_SMARTCARD_NO_KEYSET ((NTSTATUS)0xC0000386L)
-#define STATUS_SMARTCARD_IO_ERROR ((NTSTATUS)0xC0000387L)
-#define STATUS_DOWNGRADE_DETECTED ((NTSTATUS)0xC0000388L)
-#define STATUS_SMARTCARD_CERT_REVOKED ((NTSTATUS)0xC0000389L)
-#define STATUS_ISSUING_CA_UNTRUSTED ((NTSTATUS)0xC000038AL)
-#define STATUS_REVOCATION_OFFLINE_C ((NTSTATUS)0xC000038BL)
-#define STATUS_PKINIT_CLIENT_FAILURE ((NTSTATUS)0xC000038CL)
-#define STATUS_SMARTCARD_CERT_EXPIRED ((NTSTATUS)0xC000038DL)
-#define STATUS_DRIVER_FAILED_PRIOR_UNLOAD ((NTSTATUS)0xC000038EL)
-#define STATUS_ASSERTION_FAILURE ((NTSTATUS)0xC0000420L)
-#define STATUS_CALLBACK_POP_STACK ((NTSTATUS)0xC0000423L)
-#define STATUS_WOW_ASSERTION ((NTSTATUS)0xC0009898L)
-#define RPC_NT_INVALID_STRING_BINDING ((NTSTATUS)0xC0020001L)
-#define RPC_NT_WRONG_KIND_OF_BINDING ((NTSTATUS)0xC0020002L)
-#define RPC_NT_INVALID_BINDING ((NTSTATUS)0xC0020003L)
-#define RPC_NT_PROTSEQ_NOT_SUPPORTED ((NTSTATUS)0xC0020004L)
-#define RPC_NT_INVALID_RPC_PROTSEQ ((NTSTATUS)0xC0020005L)
-#define RPC_NT_INVALID_STRING_UUID ((NTSTATUS)0xC0020006L)
-#define RPC_NT_INVALID_ENDPOINT_FORMAT ((NTSTATUS)0xC0020007L)
-#define RPC_NT_INVALID_NET_ADDR ((NTSTATUS)0xC0020008L)
-#define RPC_NT_NO_ENDPOINT_FOUND ((NTSTATUS)0xC0020009L)
-#define RPC_NT_INVALID_TIMEOUT ((NTSTATUS)0xC002000AL)
-#define RPC_NT_OBJECT_NOT_FOUND ((NTSTATUS)0xC002000BL)
-#define RPC_NT_ALREADY_REGISTERED ((NTSTATUS)0xC002000CL)
-#define RPC_NT_TYPE_ALREADY_REGISTERED ((NTSTATUS)0xC002000DL)
-#define RPC_NT_ALREADY_LISTENING ((NTSTATUS)0xC002000EL)
-#define RPC_NT_NO_PROTSEQS_REGISTERED ((NTSTATUS)0xC002000FL)
-#define RPC_NT_NOT_LISTENING ((NTSTATUS)0xC0020010L)
-#define RPC_NT_UNKNOWN_MGR_TYPE ((NTSTATUS)0xC0020011L)
-#define RPC_NT_UNKNOWN_IF ((NTSTATUS)0xC0020012L)
-#define RPC_NT_NO_BINDINGS ((NTSTATUS)0xC0020013L)
-#define RPC_NT_NO_PROTSEQS ((NTSTATUS)0xC0020014L)
-#define RPC_NT_CANT_CREATE_ENDPOINT ((NTSTATUS)0xC0020015L)
-#define RPC_NT_OUT_OF_RESOURCES ((NTSTATUS)0xC0020016L)
-#define RPC_NT_SERVER_UNAVAILABLE ((NTSTATUS)0xC0020017L)
-#define RPC_NT_SERVER_TOO_BUSY ((NTSTATUS)0xC0020018L)
-#define RPC_NT_INVALID_NETWORK_OPTIONS ((NTSTATUS)0xC0020019L)
-#define RPC_NT_NO_CALL_ACTIVE ((NTSTATUS)0xC002001AL)
-#define RPC_NT_CALL_FAILED ((NTSTATUS)0xC002001BL)
-#define RPC_NT_CALL_FAILED_DNE ((NTSTATUS)0xC002001CL)
-#define RPC_NT_PROTOCOL_ERROR ((NTSTATUS)0xC002001DL)
-#define RPC_NT_UNSUPPORTED_TRANS_SYN ((NTSTATUS)0xC002001FL)
-#define RPC_NT_UNSUPPORTED_TYPE ((NTSTATUS)0xC0020021L)
-#define RPC_NT_INVALID_TAG ((NTSTATUS)0xC0020022L)
-#define RPC_NT_INVALID_BOUND ((NTSTATUS)0xC0020023L)
-#define RPC_NT_NO_ENTRY_NAME ((NTSTATUS)0xC0020024L)
-#define RPC_NT_INVALID_NAME_SYNTAX ((NTSTATUS)0xC0020025L)
-#define RPC_NT_UNSUPPORTED_NAME_SYNTAX ((NTSTATUS)0xC0020026L)
-#define RPC_NT_UUID_NO_ADDRESS ((NTSTATUS)0xC0020028L)
-#define RPC_NT_DUPLICATE_ENDPOINT ((NTSTATUS)0xC0020029L)
-#define RPC_NT_UNKNOWN_AUTHN_TYPE ((NTSTATUS)0xC002002AL)
-#define RPC_NT_MAX_CALLS_TOO_SMALL ((NTSTATUS)0xC002002BL)
-#define RPC_NT_STRING_TOO_LONG ((NTSTATUS)0xC002002CL)
-#define RPC_NT_PROTSEQ_NOT_FOUND ((NTSTATUS)0xC002002DL)
-#define RPC_NT_PROCNUM_OUT_OF_RANGE ((NTSTATUS)0xC002002EL)
-#define RPC_NT_BINDING_HAS_NO_AUTH ((NTSTATUS)0xC002002FL)
-#define RPC_NT_UNKNOWN_AUTHN_SERVICE ((NTSTATUS)0xC0020030L)
-#define RPC_NT_UNKNOWN_AUTHN_LEVEL ((NTSTATUS)0xC0020031L)
-#define RPC_NT_INVALID_AUTH_IDENTITY ((NTSTATUS)0xC0020032L)
-#define RPC_NT_UNKNOWN_AUTHZ_SERVICE ((NTSTATUS)0xC0020033L)
-#define EPT_NT_INVALID_ENTRY ((NTSTATUS)0xC0020034L)
-#define EPT_NT_CANT_PERFORM_OP ((NTSTATUS)0xC0020035L)
-#define EPT_NT_NOT_REGISTERED ((NTSTATUS)0xC0020036L)
-#define RPC_NT_NOTHING_TO_EXPORT ((NTSTATUS)0xC0020037L)
-#define RPC_NT_INCOMPLETE_NAME ((NTSTATUS)0xC0020038L)
-#define RPC_NT_INVALID_VERS_OPTION ((NTSTATUS)0xC0020039L)
-#define RPC_NT_NO_MORE_MEMBERS ((NTSTATUS)0xC002003AL)
-#define RPC_NT_NOT_ALL_OBJS_UNEXPORTED ((NTSTATUS)0xC002003BL)
-#define RPC_NT_INTERFACE_NOT_FOUND ((NTSTATUS)0xC002003CL)
-#define RPC_NT_ENTRY_ALREADY_EXISTS ((NTSTATUS)0xC002003DL)
-#define RPC_NT_ENTRY_NOT_FOUND ((NTSTATUS)0xC002003EL)
-#define RPC_NT_NAME_SERVICE_UNAVAILABLE ((NTSTATUS)0xC002003FL)
-#define RPC_NT_INVALID_NAF_ID ((NTSTATUS)0xC0020040L)
-#define RPC_NT_CANNOT_SUPPORT ((NTSTATUS)0xC0020041L)
-#define RPC_NT_NO_CONTEXT_AVAILABLE ((NTSTATUS)0xC0020042L)
-#define RPC_NT_INTERNAL_ERROR ((NTSTATUS)0xC0020043L)
-#define RPC_NT_ZERO_DIVIDE ((NTSTATUS)0xC0020044L)
-#define RPC_NT_ADDRESS_ERROR ((NTSTATUS)0xC0020045L)
-#define RPC_NT_FP_DIV_ZERO ((NTSTATUS)0xC0020046L)
-#define RPC_NT_FP_UNDERFLOW ((NTSTATUS)0xC0020047L)
-#define RPC_NT_FP_OVERFLOW ((NTSTATUS)0xC0020048L)
-#define RPC_NT_NO_MORE_ENTRIES ((NTSTATUS)0xC0030001L)
-#define RPC_NT_SS_CHAR_TRANS_OPEN_FAIL ((NTSTATUS)0xC0030002L)
-#define RPC_NT_SS_CHAR_TRANS_SHORT_FILE ((NTSTATUS)0xC0030003L)
-#define RPC_NT_SS_IN_NULL_CONTEXT ((NTSTATUS)0xC0030004L)
-#define RPC_NT_SS_CONTEXT_MISMATCH ((NTSTATUS)0xC0030005L)
-#define RPC_NT_SS_CONTEXT_DAMAGED ((NTSTATUS)0xC0030006L)
-#define RPC_NT_SS_HANDLES_MISMATCH ((NTSTATUS)0xC0030007L)
-#define RPC_NT_SS_CANNOT_GET_CALL_HANDLE ((NTSTATUS)0xC0030008L)
-#define RPC_NT_NULL_REF_POINTER ((NTSTATUS)0xC0030009L)
-#define RPC_NT_ENUM_VALUE_OUT_OF_RANGE ((NTSTATUS)0xC003000AL)
-#define RPC_NT_BYTE_COUNT_TOO_SMALL ((NTSTATUS)0xC003000BL)
-#define RPC_NT_BAD_STUB_DATA ((NTSTATUS)0xC003000CL)
-#define RPC_NT_CALL_IN_PROGRESS ((NTSTATUS)0xC0020049L)
-#define RPC_NT_NO_MORE_BINDINGS ((NTSTATUS)0xC002004AL)
-#define RPC_NT_GROUP_MEMBER_NOT_FOUND ((NTSTATUS)0xC002004BL)
-#define EPT_NT_CANT_CREATE ((NTSTATUS)0xC002004CL)
-#define RPC_NT_INVALID_OBJECT ((NTSTATUS)0xC002004DL)
-#define RPC_NT_NO_INTERFACES ((NTSTATUS)0xC002004FL)
-#define RPC_NT_CALL_CANCELLED ((NTSTATUS)0xC0020050L)
-#define RPC_NT_BINDING_INCOMPLETE ((NTSTATUS)0xC0020051L)
-#define RPC_NT_COMM_FAILURE ((NTSTATUS)0xC0020052L)
-#define RPC_NT_UNSUPPORTED_AUTHN_LEVEL ((NTSTATUS)0xC0020053L)
-#define RPC_NT_NO_PRINC_NAME ((NTSTATUS)0xC0020054L)
-#define RPC_NT_NOT_RPC_ERROR ((NTSTATUS)0xC0020055L)
-#define RPC_NT_UUID_LOCAL_ONLY ((NTSTATUS)0x40020056L)
-#define RPC_NT_SEC_PKG_ERROR ((NTSTATUS)0xC0020057L)
-#define RPC_NT_NOT_CANCELLED ((NTSTATUS)0xC0020058L)
-#define RPC_NT_INVALID_ES_ACTION ((NTSTATUS)0xC0030059L)
-#define RPC_NT_WRONG_ES_VERSION ((NTSTATUS)0xC003005AL)
-#define RPC_NT_WRONG_STUB_VERSION ((NTSTATUS)0xC003005BL)
-#define RPC_NT_INVALID_PIPE_OBJECT ((NTSTATUS)0xC003005CL)
-#define RPC_NT_INVALID_PIPE_OPERATION ((NTSTATUS)0xC003005DL)
-#define RPC_NT_WRONG_PIPE_VERSION ((NTSTATUS)0xC003005EL)
-#define RPC_NT_PIPE_CLOSED ((NTSTATUS)0xC003005FL)
-#define RPC_NT_PIPE_DISCIPLINE_ERROR ((NTSTATUS)0xC0030060L)
-#define RPC_NT_PIPE_EMPTY ((NTSTATUS)0xC0030061L)
-#define RPC_NT_INVALID_ASYNC_HANDLE ((NTSTATUS)0xC0020062L)
-#define RPC_NT_INVALID_ASYNC_CALL ((NTSTATUS)0xC0020063L)
-#define RPC_NT_SEND_INCOMPLETE ((NTSTATUS)0x400200AFL)
-#define STATUS_ACPI_INVALID_OPCODE ((NTSTATUS)0xC0140001L)
-#define STATUS_ACPI_STACK_OVERFLOW ((NTSTATUS)0xC0140002L)
-#define STATUS_ACPI_ASSERT_FAILED ((NTSTATUS)0xC0140003L)
-#define STATUS_ACPI_INVALID_INDEX ((NTSTATUS)0xC0140004L)
-#define STATUS_ACPI_INVALID_ARGUMENT ((NTSTATUS)0xC0140005L)
-#define STATUS_ACPI_FATAL ((NTSTATUS)0xC0140006L)
-#define STATUS_ACPI_INVALID_SUPERNAME ((NTSTATUS)0xC0140007L)
-#define STATUS_ACPI_INVALID_ARGTYPE ((NTSTATUS)0xC0140008L)
-#define STATUS_ACPI_INVALID_OBJTYPE ((NTSTATUS)0xC0140009L)
-#define STATUS_ACPI_INVALID_TARGETTYPE ((NTSTATUS)0xC014000AL)
-#define STATUS_ACPI_INCORRECT_ARGUMENT_COUNT ((NTSTATUS)0xC014000BL)
-#define STATUS_ACPI_ADDRESS_NOT_MAPPED ((NTSTATUS)0xC014000CL)
-#define STATUS_ACPI_INVALID_EVENTTYPE ((NTSTATUS)0xC014000DL)
-#define STATUS_ACPI_HANDLER_COLLISION ((NTSTATUS)0xC014000EL)
-#define STATUS_ACPI_INVALID_DATA ((NTSTATUS)0xC014000FL)
-#define STATUS_ACPI_INVALID_REGION ((NTSTATUS)0xC0140010L)
-#define STATUS_ACPI_INVALID_ACCESS_SIZE ((NTSTATUS)0xC0140011L)
-#define STATUS_ACPI_ACQUIRE_GLOBAL_LOCK ((NTSTATUS)0xC0140012L)
-#define STATUS_ACPI_ALREADY_INITIALIZED ((NTSTATUS)0xC0140013L)
-#define STATUS_ACPI_NOT_INITIALIZED ((NTSTATUS)0xC0140014L)
-#define STATUS_ACPI_INVALID_MUTEX_LEVEL ((NTSTATUS)0xC0140015L)
-#define STATUS_ACPI_MUTEX_NOT_OWNED ((NTSTATUS)0xC0140016L)
-#define STATUS_ACPI_MUTEX_NOT_OWNER ((NTSTATUS)0xC0140017L)
-#define STATUS_ACPI_RS_ACCESS ((NTSTATUS)0xC0140018L)
-#define STATUS_ACPI_INVALID_TABLE ((NTSTATUS)0xC0140019L)
-#define STATUS_ACPI_REG_HANDLER_FAILED ((NTSTATUS)0xC0140020L)
-#define STATUS_ACPI_POWER_REQUEST_FAILED ((NTSTATUS)0xC0140021L)
-#define STATUS_CTX_WINSTATION_NAME_INVALID ((NTSTATUS)0xC00A0001L)
-#define STATUS_CTX_INVALID_PD ((NTSTATUS)0xC00A0002L)
-#define STATUS_CTX_PD_NOT_FOUND ((NTSTATUS)0xC00A0003L)
-#define STATUS_CTX_CDM_CONNECT ((NTSTATUS)0x400A0004L)
-#define STATUS_CTX_CDM_DISCONNECT ((NTSTATUS)0x400A0005L)
-#define STATUS_CTX_CLOSE_PENDING ((NTSTATUS)0xC00A0006L)
-#define STATUS_CTX_NO_OUTBUF ((NTSTATUS)0xC00A0007L)
-#define STATUS_CTX_MODEM_INF_NOT_FOUND ((NTSTATUS)0xC00A0008L)
-#define STATUS_CTX_INVALID_MODEMNAME ((NTSTATUS)0xC00A0009L)
-#define STATUS_CTX_RESPONSE_ERROR ((NTSTATUS)0xC00A000AL)
-#define STATUS_CTX_MODEM_RESPONSE_TIMEOUT ((NTSTATUS)0xC00A000BL)
-#define STATUS_CTX_MODEM_RESPONSE_NO_CARRIER ((NTSTATUS)0xC00A000CL)
-#define STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE ((NTSTATUS)0xC00A000DL)
-#define STATUS_CTX_MODEM_RESPONSE_BUSY ((NTSTATUS)0xC00A000EL)
-#define STATUS_CTX_MODEM_RESPONSE_VOICE ((NTSTATUS)0xC00A000FL)
-#define STATUS_CTX_TD_ERROR ((NTSTATUS)0xC00A0010L)
-#define STATUS_CTX_LICENSE_CLIENT_INVALID ((NTSTATUS)0xC00A0012L)
-#define STATUS_CTX_LICENSE_NOT_AVAILABLE ((NTSTATUS)0xC00A0013L)
-#define STATUS_CTX_LICENSE_EXPIRED ((NTSTATUS)0xC00A0014L)
-#define STATUS_CTX_WINSTATION_NOT_FOUND ((NTSTATUS)0xC00A0015L)
-#define STATUS_CTX_WINSTATION_NAME_COLLISION ((NTSTATUS)0xC00A0016L)
-#define STATUS_CTX_WINSTATION_BUSY ((NTSTATUS)0xC00A0017L)
-#define STATUS_CTX_BAD_VIDEO_MODE ((NTSTATUS)0xC00A0018L)
-#define STATUS_CTX_GRAPHICS_INVALID ((NTSTATUS)0xC00A0022L)
-#define STATUS_CTX_NOT_CONSOLE ((NTSTATUS)0xC00A0024L)
-#define STATUS_CTX_CLIENT_QUERY_TIMEOUT ((NTSTATUS)0xC00A0026L)
-#define STATUS_CTX_CONSOLE_DISCONNECT ((NTSTATUS)0xC00A0027L)
-#define STATUS_CTX_CONSOLE_CONNECT ((NTSTATUS)0xC00A0028L)
-#define STATUS_CTX_SHADOW_DENIED ((NTSTATUS)0xC00A002AL)
-#define STATUS_CTX_WINSTATION_ACCESS_DENIED ((NTSTATUS)0xC00A002BL)
-#define STATUS_CTX_INVALID_WD ((NTSTATUS)0xC00A002EL)
-#define STATUS_CTX_WD_NOT_FOUND ((NTSTATUS)0xC00A002FL)
-#define STATUS_CTX_SHADOW_INVALID ((NTSTATUS)0xC00A0030L)
-#define STATUS_CTX_SHADOW_DISABLED ((NTSTATUS)0xC00A0031L)
-#define STATUS_RDP_PROTOCOL_ERROR ((NTSTATUS)0xC00A0032L)
-#define STATUS_CTX_CLIENT_LICENSE_NOT_SET ((NTSTATUS)0xC00A0033L)
-#define STATUS_CTX_CLIENT_LICENSE_IN_USE ((NTSTATUS)0xC00A0034L)
-#define STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE ((NTSTATUS)0xC00A0035L)
-#define STATUS_CTX_SHADOW_NOT_RUNNING ((NTSTATUS)0xC00A0036L)
-#define STATUS_PNP_BAD_MPS_TABLE ((NTSTATUS)0xC0040035L)
-#define STATUS_PNP_TRANSLATION_FAILED ((NTSTATUS)0xC0040036L)
-#define STATUS_PNP_IRQ_TRANSLATION_FAILED ((NTSTATUS)0xC0040037L)
-#define STATUS_SXS_SECTION_NOT_FOUND ((NTSTATUS)0xC0150001L)
-#define STATUS_SXS_CANT_GEN_ACTCTX ((NTSTATUS)0xC0150002L)
-#define STATUS_SXS_INVALID_ACTCTXDATA_FORMAT ((NTSTATUS)0xC0150003L)
-#define STATUS_SXS_ASSEMBLY_NOT_FOUND ((NTSTATUS)0xC0150004L)
-#define STATUS_SXS_MANIFEST_FORMAT_ERROR ((NTSTATUS)0xC0150005L)
-#define STATUS_SXS_MANIFEST_PARSE_ERROR ((NTSTATUS)0xC0150006L)
-#define STATUS_SXS_ACTIVATION_CONTEXT_DISABLED ((NTSTATUS)0xC0150007L)
-#define STATUS_SXS_KEY_NOT_FOUND ((NTSTATUS)0xC0150008L)
-#define STATUS_SXS_VERSION_CONFLICT ((NTSTATUS)0xC0150009L)
-#define STATUS_SXS_WRONG_SECTION_TYPE ((NTSTATUS)0xC015000AL)
-#define STATUS_SXS_THREAD_QUERIES_DISABLED ((NTSTATUS)0xC015000BL)
-#define STATUS_SXS_ASSEMBLY_MISSING ((NTSTATUS)0xC015000CL)
-#define STATUS_SXS_RELEASE_ACTIVATION_CONTEXT ((NTSTATUS)0x4015000DL)
-#define STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET ((NTSTATUS)0xC015000EL)
-#define STATUS_SXS_EARLY_DEACTIVATION ((NTSTATUS)0xC015000FL)
-#define STATUS_SXS_INVALID_DEACTIVATION ((NTSTATUS)0xC0150010L)
-#define STATUS_SXS_MULTIPLE_DEACTIVATION ((NTSTATUS)0xC0150011L)
-#define STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY ((NTSTATUS)0xC0150012L)
-#define STATUS_SXS_PROCESS_TERMINATION_REQUESTED ((NTSTATUS)0xC0150013L)
-#define STATUS_CLUSTER_INVALID_NODE ((NTSTATUS)0xC0130001L)
-#define STATUS_CLUSTER_NODE_EXISTS ((NTSTATUS)0xC0130002L)
-#define STATUS_CLUSTER_JOIN_IN_PROGRESS ((NTSTATUS)0xC0130003L)
-#define STATUS_CLUSTER_NODE_NOT_FOUND ((NTSTATUS)0xC0130004L)
-#define STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND ((NTSTATUS)0xC0130005L)
-#define STATUS_CLUSTER_NETWORK_EXISTS ((NTSTATUS)0xC0130006L)
-#define STATUS_CLUSTER_NETWORK_NOT_FOUND ((NTSTATUS)0xC0130007L)
-#define STATUS_CLUSTER_NETINTERFACE_EXISTS ((NTSTATUS)0xC0130008L)
-#define STATUS_CLUSTER_NETINTERFACE_NOT_FOUND ((NTSTATUS)0xC0130009L)
-#define STATUS_CLUSTER_INVALID_REQUEST ((NTSTATUS)0xC013000AL)
-#define STATUS_CLUSTER_INVALID_NETWORK_PROVIDER ((NTSTATUS)0xC013000BL)
-#define STATUS_CLUSTER_NODE_DOWN ((NTSTATUS)0xC013000CL)
-#define STATUS_CLUSTER_NODE_UNREACHABLE ((NTSTATUS)0xC013000DL)
-#define STATUS_CLUSTER_NODE_NOT_MEMBER ((NTSTATUS)0xC013000EL)
-#define STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS ((NTSTATUS)0xC013000FL)
-#define STATUS_CLUSTER_INVALID_NETWORK ((NTSTATUS)0xC0130010L)
-#define STATUS_CLUSTER_NO_NET_ADAPTERS ((NTSTATUS)0xC0130011L)
-#define STATUS_CLUSTER_NODE_UP ((NTSTATUS)0xC0130012L)
-#define STATUS_CLUSTER_NODE_PAUSED ((NTSTATUS)0xC0130013L)
-#define STATUS_CLUSTER_NODE_NOT_PAUSED ((NTSTATUS)0xC0130014L)
-#define STATUS_CLUSTER_NO_SECURITY_CONTEXT ((NTSTATUS)0xC0130015L)
-#define STATUS_CLUSTER_NETWORK_NOT_INTERNAL ((NTSTATUS)0xC0130016L)
-#define STATUS_CLUSTER_POISONED ((NTSTATUS)0xC0130017L)
-
-/*
-* Debug codes
-*/
-
-#define DBG_EXCEPTION_HANDLED ((NTSTATUS)0x00010001)
-#define DBG_CONTINUE ((NTSTATUS)0x00010002)
-#define DBG_REPLY_LATER ((NTSTATUS)0x40010001)
-#define DBG_UNABLE_TO_PROVIDE_HANDLE ((NTSTATUS)0x40010002)
-#define DBG_TERMINATE_THREAD ((NTSTATUS)0x40010003)
-#define DBG_TERMINATE_PROCESS ((NTSTATUS)0x40010004)
-#define DBG_CONTROL_C ((NTSTATUS)0x40010005)
-#define DBG_PRINTEXCEPTION_C ((NTSTATUS)0x40010006)
-#define DBG_RIPEXCEPTION ((NTSTATUS)0x40010007)
-#define DBG_CONTROL_BREAK ((NTSTATUS)0x40010008)
-#define DBG_COMMAND_EXCEPTION ((NTSTATUS)0x40010009)
-#define DBG_EXCEPTION_NOT_HANDLED ((NTSTATUS)0x80010001)
-#define DBG_NO_STATE_CHANGE ((NTSTATUS)0xC0010001)
-#define DBG_APP_NOT_IDLE ((NTSTATUS)0xC0010002)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index 319e62dd35f..7e97ea08c1d 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -1915,6 +1915,12 @@ NTSTATUS
typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK;
+#define PO_CB_SYSTEM_POWER_POLICY 0
+#define PO_CB_AC_STATUS 1
+#define PO_CB_BUTTON_COLLISION 2
+#define PO_CB_SYSTEM_STATE_LOCK 3
+#define PO_CB_LID_SWITCH_STATE 4
+#define PO_CB_PROCESSOR_POWER_POLICY 5
/******************************************************************************
* Configuration Manager Types *
@@ -3152,6 +3158,12 @@ typedef VOID
(DDKAPI *WMI_NOTIFICATION_CALLBACK)(
PVOID Wnode,
PVOID Context);
+
+#define WMIREG_ACTION_REGISTER 1
+#define WMIREG_ACTION_DEREGISTER 2
+#define WMIREG_ACTION_REREGISTER 3
+#define WMIREG_ACTION_UPDATE_GUIDS 4
+#define WMIREG_ACTION_BLOCK_IRPS 5
#define EVENT_INCREMENT 1
#define IO_NO_INCREMENT 0
@@ -3479,6 +3491,91 @@ typedef struct
PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications;
} ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2;
+typedef
+BOOLEAN
+(*PGPE_SERVICE_ROUTINE)(
+ PDEVICE_OBJECT ObjectContext,
+ PVOID ServiceContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_CONNECT_VECTOR)(
+ PDEVICE_OBJECT Context,
+ ULONG GpeNumber,
+ KINTERRUPT_MODE Mode,
+ BOOLEAN Shareable,
+ PGPE_SERVICE_ROUTINE ServiceRoutine,
+ PVOID ServiceContext,
+ PVOID *ObjectContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_DISCONNECT_VECTOR)(
+ PDEVICE_OBJECT Context,
+ PVOID ObjectContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_ENABLE_EVENT)(
+ PDEVICE_OBJECT Context,
+ PVOID ObjectContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_DISABLE_EVENT)(
+ PDEVICE_OBJECT Context,
+ PVOID ObjectContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_CLEAR_STATUS)(
+ PDEVICE_OBJECT Context,
+ PVOID ObjectContext
+);
+
+typedef
+VOID
+(*PDEVICE_NOTIFY_CALLBACK)(
+ PVOID NotificationContext,
+ ULONG NotifyCode
+);
+
+typedef
+NTSTATUS
+(*PREGISTER_FOR_DEVICE_NOTIFICATIONS)(
+ PDEVICE_OBJECT Context,
+ PDEVICE_NOTIFY_CALLBACK NotificationHandler,
+ PVOID NotificationContext
+);
+
+typedef
+VOID
+(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)(
+ PDEVICE_OBJECT Context,
+ PDEVICE_NOTIFY_CALLBACK NotificationHandler
+);
+
+typedef struct
+{
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PGPE_CONNECT_VECTOR GpeConnectVector;
+ PGPE_DISCONNECT_VECTOR GpeDisconnectVector;
+ PGPE_ENABLE_EVENT GpeEnableEvent;
+ PGPE_DISABLE_EVENT GpeDisableEvent;
+ PGPE_CLEAR_STATUS GpeClearStatus;
+ PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications;
+ PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications;
+} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
+
typedef struct _DEVICE_CAPABILITIES {
USHORT Size;
USHORT Version;
diff --git a/include/dxsdk/dxsdk.rbuild b/include/dxsdk/dxsdk.rbuild
index 8183bd34b30..1d91680f471 100644
--- a/include/dxsdk/dxsdk.rbuild
+++ b/include/dxsdk/dxsdk.rbuild
@@ -3,6 +3,7 @@
amstream.idl
austream.idl
+ bdatif.idl
ddstream.idl
dmodshow.idl
mixerocx.idl
diff --git a/include/ndk/pstypes.h b/include/ndk/pstypes.h
index 45e27f2d741..d423b7a2df2 100644
--- a/include/ndk/pstypes.h
+++ b/include/ndk/pstypes.h
@@ -26,6 +26,7 @@ Author:
#include
#include
#include
+#include
#ifndef NTOS_MODE_USER
#include
#include
@@ -616,133 +617,6 @@ typedef struct _INITIAL_PEB
HANDLE Mutant;
} INITIAL_PEB, *PINITIAL_PEB;
-//
-// Process Environment Block (PEB)
-//
-typedef struct _PEB
-{
- BOOLEAN InheritedAddressSpace;
- BOOLEAN ReadImageFileExecOptions;
- BOOLEAN BeingDebugged;
-#if (NTDDI_VERSION >= NTDDI_WS03)
- struct
- {
- BOOLEAN ImageUsesLargePages:1;
- #if (NTDDI_VERSION >= NTDDI_LONGHORN)
- BOOLEAN IsProtectedProcess:1;
- BOOLEAN IsLegacyProcess:1;
- BOOLEAN SpareBits:5;
- #else
- BOOLEAN SpareBits:7;
- #endif
- };
-#else
- BOOLEAN SpareBool;
-#endif
- HANDLE Mutant;
- PVOID ImageBaseAddress;
- PPEB_LDR_DATA Ldr;
- struct _RTL_USER_PROCESS_PARAMETERS *ProcessParameters;
- PVOID SubSystemData;
- PVOID ProcessHeap;
-#if (NTDDI_VERSION >= NTDDI_LONGHORN)
- struct _RTL_CRITICAL_SECTION *FastPebLock;
- PVOID AltThunkSListPtr;
- PVOID IFEOKey;
- ULONG Spare;
- union
- {
- PVOID* KernelCallbackTable;
- PVOID UserSharedInfoPtr;
- };
- ULONG SystemReserved[1];
- ULONG SpareUlong;
-#else
- PVOID FastPebLock;
- PPEBLOCKROUTINE FastPebLockRoutine;
- PPEBLOCKROUTINE FastPebUnlockRoutine;
- ULONG EnvironmentUpdateCount;
- PVOID* KernelCallbackTable;
- PVOID EventLogSection;
- PVOID EventLog;
-#endif
- PPEB_FREE_BLOCK FreeList;
- ULONG TlsExpansionCounter;
- PVOID TlsBitmap;
- ULONG TlsBitmapBits[0x2];
- PVOID ReadOnlySharedMemoryBase;
- PVOID ReadOnlySharedMemoryHeap;
- PVOID* ReadOnlyStaticServerData;
- PVOID AnsiCodePageData;
- PVOID OemCodePageData;
- PVOID UnicodeCaseTableData;
- ULONG NumberOfProcessors;
- ULONG NtGlobalFlag;
- LARGE_INTEGER CriticalSectionTimeout;
- ULONG HeapSegmentReserve;
- ULONG HeapSegmentCommit;
- ULONG HeapDeCommitTotalFreeThreshold;
- ULONG HeapDeCommitFreeBlockThreshold;
- ULONG NumberOfHeaps;
- ULONG MaximumNumberOfHeaps;
- PVOID* ProcessHeaps;
- PVOID GdiSharedHandleTable;
- PVOID ProcessStarterHelper;
- ULONG GdiDCAttributeList;
-#if (NTDDI_VERSION >= NTDDI_LONGHORN)
- struct _RTL_CRITICAL_SECTION *LoaderLock;
-#else
- PVOID LoaderLock;
-#endif
- ULONG OSMajorVersion;
- ULONG OSMinorVersion;
- USHORT OSBuildNumber;
- USHORT OSCSDVersion;
- ULONG OSPlatformId;
- ULONG ImageSubSystem;
- ULONG ImageSubSystemMajorVersion;
- ULONG ImageSubSystemMinorVersion;
- ULONG ImageProcessAffinityMask;
- ULONG GdiHandleBuffer[0x22];
- PPOST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
- struct _RTL_BITMAP *TlsExpansionBitmap;
- ULONG TlsExpansionBitmapBits[0x20];
- ULONG SessionId;
-#if (NTDDI_VERSION >= NTDDI_WINXP)
- ULARGE_INTEGER AppCompatFlags;
- ULARGE_INTEGER AppCompatFlagsUser;
- PVOID pShimData;
- PVOID AppCompatInfo;
- UNICODE_STRING CSDVersion;
- struct _ACTIVATION_CONTEXT_DATA *ActivationContextData;
- struct _ASSEMBLY_STORAGE_MAP *ProcessAssemblyStorageMap;
- struct _ACTIVATION_CONTEXT_DATA *SystemDefaultActivationContextData;
- struct _ASSEMBLY_STORAGE_MAP *SystemAssemblyStorageMap;
- ULONG MinimumStackCommit;
-#endif
-#if (NTDDI_VERSION >= NTDDI_WS03)
- PVOID *FlsCallback;
- LIST_ENTRY FlsListHead;
- struct _RTL_BITMAP *FlsBitmap;
- ULONG FlsBitmapBits[4];
- ULONG FlsHighIndex;
-#endif
-#if (NTDDI_VERSION >= NTDDI_LONGHORN)
- PVOID WerRegistrationData;
- PVOID WerShipAssertPtr;
-#endif
-} PEB, *PPEB;
-
-//
-// GDI Batch Descriptor
-//
-typedef struct _GDI_TEB_BATCH
-{
- ULONG Offset;
- HANDLE HDC;
- ULONG Buffer[0x136];
-} GDI_TEB_BATCH, *PGDI_TEB_BATCH;
-
//
// Initial TEB
//
@@ -771,146 +645,50 @@ typedef struct _TEB_ACTIVE_FRAME
PTEB_ACTIVE_FRAME_CONTEXT Context;
} TEB_ACTIVE_FRAME, *PTEB_ACTIVE_FRAME;
+typedef struct _CLIENT_ID32
+{
+ ULONG UniqueProcess;
+ ULONG UniqueThread;
+} CLIENT_ID32, *PCLIENT_ID32;
+
+typedef struct _CLIENT_ID64
+{
+ ULONG64 UniqueProcess;
+ ULONG64 UniqueThread;
+} CLIENT_ID64, *PCLIENT_ID64;
+
+#if (NTDDI_VERSION < NTDDI_WS03)
+typedef struct _Wx86ThreadState
+{
+ PULONG CallBx86Eip;
+ PVOID DeallocationCpu;
+ BOOLEAN UseKnownWx86Dll;
+ CHAR OleStubInvoked;
+} Wx86ThreadState, *PWx86ThreadState;
+#endif
+
+
//
+// Process Environment Block (PEB)
// Thread Environment Block (TEB)
//
-typedef struct _TEB
-{
- NT_TIB Tib;
- PVOID EnvironmentPointer;
- CLIENT_ID ClientId;
- PVOID ActiveRpcHandle;
- PVOID ThreadLocalStoragePointer;
- struct _PEB *ProcessEnvironmentBlock;
- ULONG LastErrorValue;
- ULONG CountOfOwnedCriticalSections;
- PVOID CsrClientThread;
- struct _W32THREAD* Win32ThreadInfo;
- ULONG User32Reserved[0x1A];
- ULONG UserReserved[5];
- PVOID WOW32Reserved;
- LCID CurrentLocale;
- ULONG FpSoftwareStatusRegister;
- PVOID SystemReserved1[0x36];
- LONG ExceptionCode;
- struct _ACTIVATION_CONTEXT_STACK *ActivationContextStackPointer;
+#include "peb_teb.h"
+
#ifdef _WIN64
- UCHAR SpareBytes1[24];
-#else
- UCHAR SpareBytes1[0x24];
+//
+// Explicit 32 bit PEB/TEB
+//
+#define EXPLICIT_32BIT
+#include "peb_teb.h"
+#undef EXPLICIT_32BIT
+
+//
+// Explicit 64 bit PEB/TEB
+//
+#define EXPLICIT_64BIT
+#include "peb_teb.h"
+#undef EXPLICIT_64BIT
#endif
- ULONG TxFsContext;
- GDI_TEB_BATCH GdiTebBatch;
- CLIENT_ID RealClientId;
- PVOID GdiCachedProcessHandle;
- ULONG GdiClientPID;
- ULONG GdiClientTID;
- PVOID GdiThreadLocalInfo;
- SIZE_T Win32ClientInfo[62];
- PVOID glDispatchTable[0xE9];
- SIZE_T glReserved1[0x1D];
- PVOID glReserved2;
- PVOID glSectionInfo;
- PVOID glSection;
- PVOID glTable;
- PVOID glCurrentRC;
- PVOID glContext;
- NTSTATUS LastStatusValue;
- UNICODE_STRING StaticUnicodeString;
- WCHAR StaticUnicodeBuffer[0x105];
- PVOID DeallocationStack;
- PVOID TlsSlots[0x40];
- LIST_ENTRY TlsLinks;
- PVOID Vdm;
- PVOID ReservedForNtRpc;
- PVOID DbgSsReserved[0x2];
- ULONG HardErrorDisabled;
-#ifdef _WIN64
- PVOID Instrumentation[11];
-#else
- PVOID Instrumentation[9];
-#endif
- GUID ActivityId;
- PVOID SubProcessTag;
- PVOID EtwTraceData;
-#if (NTDDI_VERSION >= NTDDI_LONGHORN)
- PVOID EtwLocalData;
-#endif
- PVOID WinSockData;
- ULONG GdiBatchCount;
-#if (NTDDI_VERSION >= NTDDI_LONGHORN)
- BOOLEAN SpareBool0;
- BOOLEAN SpareBool1;
- BOOLEAN SpareBool2;
-#else
- BOOLEAN InDbgPrint;
- BOOLEAN FreeStackOnTermination;
- BOOLEAN HasFiberData;
-#endif
- UCHAR IdealProcessor;
- ULONG GuaranteedStackBytes;
- PVOID ReservedForPerf;
- PVOID ReservedForOle;
- ULONG WaitingOnLoaderLock;
-#if (NTDDI_VERSION >= NTDDI_LONGHORN)
- PVOID SavedPriorityState;
-#else
- ULONG SparePointer1;
-#endif
- ULONG SoftPatchPtr1;
- ULONG SoftPatchPtr2;
- PVOID *TlsExpansionSlots;
- ULONG ImpersonationLocale;
- ULONG IsImpersonating;
- PVOID NlsCache;
- PVOID pShimData;
- ULONG HeapVirualAffinity;
- PVOID CurrentTransactionHandle;
- PTEB_ACTIVE_FRAME ActiveFrame;
-#if (NTDDI_VERSION >= NTDDI_WS03)
- PVOID FlsData;
-#endif
-#if (NTDDI_VERSION >= NTDDI_LONGHORN)
- PVOID PreferredLangauges;
- PVOID UserPrefLanguages;
- PVOID MergedPrefLanguages;
- ULONG MuiImpersonation;
- union
- {
- struct
- {
- USHORT SpareCrossTebFlags:16;
- };
- USHORT CrossTebFlags;
- };
- union
- {
- struct
- {
- USHORT DbgSafeThunkCall:1;
- USHORT DbgInDebugPrint:1;
- USHORT DbgHasFiberData:1;
- USHORT DbgSkipThreadAttach:1;
- USHORT DbgWerInShipAssertCode:1;
- USHORT DbgIssuedInitialBp:1;
- USHORT DbgClonedThread:1;
- USHORT SpareSameTebBits:9;
- };
- USHORT SameTebFlags;
- };
- PVOID TxnScopeEntercallback;
- PVOID TxnScopeExitCAllback;
- PVOID TxnScopeContext;
- ULONG LockCount;
- ULONG ProcessRundown;
- ULONGLONG LastSwitchTime;
- ULONGLONG TotalSwitchOutTime;
- LARGE_INTEGER WaitReasonBitMap;
-#else
- UCHAR SafeThunkCall;
- UCHAR BooleanSpare[3];
-#endif
-} TEB, *PTEB;
#ifdef NTOS_MODE_USER
diff --git a/include/ndk/rtlfuncs.h b/include/ndk/rtlfuncs.h
index debd1ee3154..210dd2fffc5 100644
--- a/include/ndk/rtlfuncs.h
+++ b/include/ndk/rtlfuncs.h
@@ -25,6 +25,7 @@ Author:
#include
#include
#include
+#include
#include
#include "in6addr.h"
#include "inaddr.h"
diff --git a/include/ndk/rtltypes.h b/include/ndk/rtltypes.h
index 70aa3ed5bdc..aa6d8607fb6 100644
--- a/include/ndk/rtltypes.h
+++ b/include/ndk/rtltypes.h
@@ -23,7 +23,8 @@ Author:
// Dependencies
//
#include
-#include
+#include
+#include
//
// Maximum Atom Length
@@ -760,6 +761,7 @@ typedef struct _RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED
} RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED,
*PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED;
+#if (NTDDI_VERSION >= NTDDI_WS03)
typedef struct _ACTIVATION_CONTEXT_STACK
{
PRTL_ACTIVATION_CONTEXT_STACK_FRAME ActiveFrame;
@@ -769,6 +771,15 @@ typedef struct _ACTIVATION_CONTEXT_STACK
ULONG StackId;
} ACTIVATION_CONTEXT_STACK,
*PACTIVATION_CONTEXT_STACK;
+#else
+typedef struct _ACTIVATION_CONTEXT_STACK
+{
+ ULONG Flags;
+ ULONG NextCookieSequenceNumber;
+ PVOID ActiveFrame;
+ LIST_ENTRY FrameListCache;
+} ACTIVATION_CONTEXT_STACK, *PACTIVATION_CONTEXT_STACK;
+#endif
#endif
diff --git a/include/ndk/umtypes.h b/include/ndk/umtypes.h
index 7e02d7664b8..95c1c8f2f53 100644
--- a/include/ndk/umtypes.h
+++ b/include/ndk/umtypes.h
@@ -151,6 +151,8 @@ typedef struct _CSTRING
CONST CHAR *Buffer;
} CSTRING, *PCSTRING;
+#endif
+
typedef struct _STRING32 {
USHORT Length;
USHORT MaximumLength;
@@ -167,7 +169,6 @@ typedef struct _STRING64 {
UNICODE_STRING64, *PUNICODE_STRING64,
ANSI_STRING64, *PANSI_STRING64;
-#endif
typedef struct _OBJECT_ATTRIBUTES
{
diff --git a/include/psdk/ntstatus.h b/include/psdk/ntstatus.h
index 933de41b892..688f996d3ff 100644
--- a/include/psdk/ntstatus.h
+++ b/include/psdk/ntstatus.h
@@ -1,31 +1,1104 @@
/*
- * Win32 definitions for Windows NT
+ * ntstatus.h
*
- * Copyright 1996 Alexandre Julliard
+ * Windows NT status codes
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * This file is part of the w32api package.
*
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
+ * Contributors:
+ * Created by Casper S. Hornstrup
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _NTSTATUS_
#define _NTSTATUS_
-#ifndef WIN32_NO_STATUS
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !defined(STATUS_SUCCESS)
+#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
+#endif /* !STATUS_SUCCESS */
+#define FACILITY_DEBUGGER 0x1
+#define FACILITY_RPC_RUNTIME 0x2
+#define FACILITY_RPC_STUBS 0x3
+#define FACILITY_IO_ERROR_CODE 0x4
+#define FACILITY_TERMINAL_SERVER 0xA
+#define FACILITY_USB_ERROR_CODE 0x10
+#define FACILITY_HID_ERROR_CODE 0x11
+#define FACILITY_FIREWIRE_ERROR_CODE 0x12
+#define FACILITY_CLUSTER_ERROR_CODE 0x13
+#define FACILITY_ACPI_ERROR_CODE 0x14
+#define FACILITY_SXS_ERROR_CODE 0x15
+#define STATUS_SEVERITY_SUCCESS 0x0
+#define STATUS_SEVERITY_INFORMATIONAL 0x1
+#define STATUS_SEVERITY_WARNING 0x2
+#define STATUS_SEVERITY_ERROR 0x3
+#define STATUS_WAIT_0 ((NTSTATUS)0x00000000L)
+#define STATUS_WAIT_1 ((NTSTATUS)0x00000001L)
+#define STATUS_WAIT_2 ((NTSTATUS)0x00000002L)
+#define STATUS_WAIT_3 ((NTSTATUS)0x00000003L)
+#define STATUS_WAIT_63 ((NTSTATUS)0x0000003FL)
+#define STATUS_ABANDONED ((NTSTATUS)0x00000080L)
+#define STATUS_ABANDONED_WAIT_0 ((NTSTATUS)0x00000080L)
+#define STATUS_ABANDONED_WAIT_63 ((NTSTATUS)0x000000BFL)
+#define STATUS_USER_APC ((NTSTATUS)0x000000C0L)
+#define STATUS_KERNEL_APC ((NTSTATUS)0x00000100L)
+#define STATUS_ALERTED ((NTSTATUS)0x00000101L)
+#define STATUS_TIMEOUT ((NTSTATUS)0x00000102L)
+#define STATUS_PENDING ((NTSTATUS)0x00000103L)
+#define STATUS_REPARSE ((NTSTATUS)0x00000104L)
+#define STATUS_MORE_ENTRIES ((NTSTATUS)0x00000105L)
+#define STATUS_NOT_ALL_ASSIGNED ((NTSTATUS)0x00000106L)
+#define STATUS_SOME_NOT_MAPPED ((NTSTATUS)0x00000107L)
+#define STATUS_OPLOCK_BREAK_IN_PROGRESS ((NTSTATUS)0x00000108L)
+#define STATUS_VOLUME_MOUNTED ((NTSTATUS)0x00000109L)
+#define STATUS_RXACT_COMMITTED ((NTSTATUS)0x0000010AL)
+#define STATUS_NOTIFY_CLEANUP ((NTSTATUS)0x0000010BL)
+#define STATUS_NOTIFY_ENUM_DIR ((NTSTATUS)0x0000010CL)
+#define STATUS_NO_QUOTAS_FOR_ACCOUNT ((NTSTATUS)0x0000010DL)
+#define STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED ((NTSTATUS)0x0000010EL)
+#define STATUS_PAGE_FAULT_TRANSITION ((NTSTATUS)0x00000110L)
+#define STATUS_PAGE_FAULT_DEMAND_ZERO ((NTSTATUS)0x00000111L)
+#define STATUS_PAGE_FAULT_COPY_ON_WRITE ((NTSTATUS)0x00000112L)
+#define STATUS_PAGE_FAULT_GUARD_PAGE ((NTSTATUS)0x00000113L)
+#define STATUS_PAGE_FAULT_PAGING_FILE ((NTSTATUS)0x00000114L)
+#define STATUS_CACHE_PAGE_LOCKED ((NTSTATUS)0x00000115L)
+#define STATUS_CRASH_DUMP ((NTSTATUS)0x00000116L)
+#define STATUS_BUFFER_ALL_ZEROS ((NTSTATUS)0x00000117L)
+#define STATUS_REPARSE_OBJECT ((NTSTATUS)0x00000118L)
+#define STATUS_RESOURCE_REQUIREMENTS_CHANGED ((NTSTATUS)0x00000119L)
+#define STATUS_TRANSLATION_COMPLETE ((NTSTATUS)0x00000120L)
+#define STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY ((NTSTATUS)0x00000121L)
+#define STATUS_NOTHING_TO_TERMINATE ((NTSTATUS)0x00000122L)
+#define STATUS_PROCESS_NOT_IN_JOB ((NTSTATUS)0x00000123L)
+#define STATUS_PROCESS_IN_JOB ((NTSTATUS)0x00000124L)
+#define STATUS_OBJECT_NAME_EXISTS ((NTSTATUS)0x40000000L)
+#define STATUS_THREAD_WAS_SUSPENDED ((NTSTATUS)0x40000001L)
+#define STATUS_WORKING_SET_LIMIT_RANGE ((NTSTATUS)0x40000002L)
+#define STATUS_IMAGE_NOT_AT_BASE ((NTSTATUS)0x40000003L)
+#define STATUS_RXACT_STATE_CREATED ((NTSTATUS)0x40000004L)
+#define STATUS_SEGMENT_NOTIFICATION ((NTSTATUS)0x40000005L)
+#define STATUS_LOCAL_USER_SESSION_KEY ((NTSTATUS)0x40000006L)
+#define STATUS_BAD_CURRENT_DIRECTORY ((NTSTATUS)0x40000007L)
+#define STATUS_SERIAL_MORE_WRITES ((NTSTATUS)0x40000008L)
+#define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009L)
+#define STATUS_FT_READ_RECOVERY_FROM_BACKUP ((NTSTATUS)0x4000000AL)
+#define STATUS_FT_WRITE_RECOVERY ((NTSTATUS)0x4000000BL)
+#define STATUS_SERIAL_COUNTER_TIMEOUT ((NTSTATUS)0x4000000CL)
+#define STATUS_NULL_LM_PASSWORD ((NTSTATUS)0x4000000DL)
+#define STATUS_IMAGE_MACHINE_TYPE_MISMATCH ((NTSTATUS)0x4000000EL)
+#define STATUS_RECEIVE_PARTIAL ((NTSTATUS)0x4000000FL)
+#define STATUS_RECEIVE_EXPEDITED ((NTSTATUS)0x40000010L)
+#define STATUS_RECEIVE_PARTIAL_EXPEDITED ((NTSTATUS)0x40000011L)
+#define STATUS_EVENT_DONE ((NTSTATUS)0x40000012L)
+#define STATUS_EVENT_PENDING ((NTSTATUS)0x40000013L)
+#define STATUS_CHECKING_FILE_SYSTEM ((NTSTATUS)0x40000014L)
+#define STATUS_FATAL_APP_EXIT ((NTSTATUS)0x40000015L)
+#define STATUS_PREDEFINED_HANDLE ((NTSTATUS)0x40000016L)
+#define STATUS_WAS_UNLOCKED ((NTSTATUS)0x40000017L)
+#define STATUS_SERVICE_NOTIFICATION ((NTSTATUS)0x40000018L)
+#define STATUS_WAS_LOCKED ((NTSTATUS)0x40000019L)
+#define STATUS_LOG_HARD_ERROR ((NTSTATUS)0x4000001AL)
+#define STATUS_ALREADY_WIN32 ((NTSTATUS)0x4000001BL)
+#define STATUS_WX86_UNSIMULATE ((NTSTATUS)0x4000001CL)
+#define STATUS_WX86_CONTINUE ((NTSTATUS)0x4000001DL)
+#define STATUS_WX86_SINGLE_STEP ((NTSTATUS)0x4000001EL)
+#define STATUS_WX86_BREAKPOINT ((NTSTATUS)0x4000001FL)
+#define STATUS_WX86_EXCEPTION_CONTINUE ((NTSTATUS)0x40000020L)
+#define STATUS_WX86_EXCEPTION_LASTCHANCE ((NTSTATUS)0x40000021L)
+#define STATUS_WX86_EXCEPTION_CHAIN ((NTSTATUS)0x40000022L)
+#define STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE ((NTSTATUS)0x40000023L)
+#define STATUS_NO_YIELD_PERFORMED ((NTSTATUS)0x40000024L)
+#define STATUS_TIMER_RESUME_IGNORED ((NTSTATUS)0x40000025L)
+#define STATUS_ARBITRATION_UNHANDLED ((NTSTATUS)0x40000026L)
+#define STATUS_CARDBUS_NOT_SUPPORTED ((NTSTATUS)0x40000027L)
+#define STATUS_WX86_CREATEWX86TIB ((NTSTATUS)0x40000028L)
+#define STATUS_MP_PROCESSOR_MISMATCH ((NTSTATUS)0x40000029L)
+#define STATUS_HIBERNATED ((NTSTATUS)0x4000002AL)
+#define STATUS_RESUME_HIBERNATION ((NTSTATUS)0x4000002BL)
+#define STATUS_GUARD_PAGE_VIOLATION ((NTSTATUS)0x80000001L)
+#define STATUS_DATATYPE_MISALIGNMENT ((NTSTATUS)0x80000002L)
+#define STATUS_BREAKPOINT ((NTSTATUS)0x80000003L)
+#define STATUS_SINGLE_STEP ((NTSTATUS)0x80000004L)
+#define STATUS_BUFFER_OVERFLOW ((NTSTATUS)0x80000005L)
+#define STATUS_NO_MORE_FILES ((NTSTATUS)0x80000006L)
+#define STATUS_WAKE_SYSTEM_DEBUGGER ((NTSTATUS)0x80000007L)
+#define STATUS_HANDLES_CLOSED ((NTSTATUS)0x8000000AL)
+#define STATUS_NO_INHERITANCE ((NTSTATUS)0x8000000BL)
+#define STATUS_GUID_SUBSTITUTION_MADE ((NTSTATUS)0x8000000CL)
+#define STATUS_PARTIAL_COPY ((NTSTATUS)0x8000000DL)
+#define STATUS_DEVICE_PAPER_EMPTY ((NTSTATUS)0x8000000EL)
+#define STATUS_DEVICE_POWERED_OFF ((NTSTATUS)0x8000000FL)
+#define STATUS_DEVICE_OFF_LINE ((NTSTATUS)0x80000010L)
+#define STATUS_DEVICE_BUSY ((NTSTATUS)0x80000011L)
+#define STATUS_NO_MORE_EAS ((NTSTATUS)0x80000012L)
+#define STATUS_INVALID_EA_NAME ((NTSTATUS)0x80000013L)
+#define STATUS_EA_LIST_INCONSISTENT ((NTSTATUS)0x80000014L)
+#define STATUS_INVALID_EA_FLAG ((NTSTATUS)0x80000015L)
+#define STATUS_VERIFY_REQUIRED ((NTSTATUS)0x80000016L)
+#define STATUS_EXTRANEOUS_INFORMATION ((NTSTATUS)0x80000017L)
+#define STATUS_RXACT_COMMIT_NECESSARY ((NTSTATUS)0x80000018L)
+#define STATUS_NO_MORE_ENTRIES ((NTSTATUS)0x8000001AL)
+#define STATUS_FILEMARK_DETECTED ((NTSTATUS)0x8000001BL)
+#define STATUS_MEDIA_CHANGED ((NTSTATUS)0x8000001CL)
+#define STATUS_BUS_RESET ((NTSTATUS)0x8000001DL)
+#define STATUS_END_OF_MEDIA ((NTSTATUS)0x8000001EL)
+#define STATUS_BEGINNING_OF_MEDIA ((NTSTATUS)0x8000001FL)
+#define STATUS_MEDIA_CHECK ((NTSTATUS)0x80000020L)
+#define STATUS_SETMARK_DETECTED ((NTSTATUS)0x80000021L)
+#define STATUS_NO_DATA_DETECTED ((NTSTATUS)0x80000022L)
+#define STATUS_REDIRECTOR_HAS_OPEN_HANDLES ((NTSTATUS)0x80000023L)
+#define STATUS_SERVER_HAS_OPEN_HANDLES ((NTSTATUS)0x80000024L)
+#define STATUS_ALREADY_DISCONNECTED ((NTSTATUS)0x80000025L)
+#define STATUS_LONGJUMP ((NTSTATUS)0x80000026L)
+#define STATUS_CLEANER_CARTRIDGE_INSTALLED ((NTSTATUS)0x80000027L)
+#define STATUS_PLUGPLAY_QUERY_VETOED ((NTSTATUS)0x80000028L)
+#define STATUS_UNWIND_CONSOLIDATE ((NTSTATUS)0x80000029L)
+#define STATUS_CLUSTER_NODE_ALREADY_UP ((NTSTATUS)0x80130001L)
+#define STATUS_CLUSTER_NODE_ALREADY_DOWN ((NTSTATUS)0x80130002L)
+#define STATUS_CLUSTER_NETWORK_ALREADY_ONLINE ((NTSTATUS)0x80130003L)
+#define STATUS_CLUSTER_NETWORK_ALREADY_OFFLINE ((NTSTATUS)0x80130004L)
+#define STATUS_CLUSTER_NODE_ALREADY_MEMBER ((NTSTATUS)0x80130005L)
+#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)
+#define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002L)
+#define STATUS_INVALID_INFO_CLASS ((NTSTATUS)0xC0000003L)
+#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
+#define STATUS_ACCESS_VIOLATION ((NTSTATUS)0xC0000005L)
+#define STATUS_IN_PAGE_ERROR ((NTSTATUS)0xC0000006L)
+#define STATUS_PAGEFILE_QUOTA ((NTSTATUS)0xC0000007L)
+#define STATUS_INVALID_HANDLE ((NTSTATUS)0xC0000008L)
+#define STATUS_BAD_INITIAL_STACK ((NTSTATUS)0xC0000009L)
+#define STATUS_BAD_INITIAL_PC ((NTSTATUS)0xC000000AL)
+#define STATUS_INVALID_CID ((NTSTATUS)0xC000000BL)
+#define STATUS_TIMER_NOT_CANCELED ((NTSTATUS)0xC000000CL)
+#define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000DL)
+#define STATUS_NO_SUCH_DEVICE ((NTSTATUS)0xC000000EL)
+#define STATUS_NO_SUCH_FILE ((NTSTATUS)0xC000000FL)
+#define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS)0xC0000010L)
+#define STATUS_END_OF_FILE ((NTSTATUS)0xC0000011L)
+#define STATUS_WRONG_VOLUME ((NTSTATUS)0xC0000012L)
+#define STATUS_NO_MEDIA_IN_DEVICE ((NTSTATUS)0xC0000013L)
+#define STATUS_UNRECOGNIZED_MEDIA ((NTSTATUS)0xC0000014L)
+#define STATUS_NONEXISTENT_SECTOR ((NTSTATUS)0xC0000015L)
+#define STATUS_MORE_PROCESSING_REQUIRED ((NTSTATUS)0xC0000016L)
+#define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017L)
+#define STATUS_CONFLICTING_ADDRESSES ((NTSTATUS)0xC0000018L)
+#define STATUS_NOT_MAPPED_VIEW ((NTSTATUS)0xC0000019L)
+#define STATUS_UNABLE_TO_FREE_VM ((NTSTATUS)0xC000001AL)
+#define STATUS_UNABLE_TO_DELETE_SECTION ((NTSTATUS)0xC000001BL)
+#define STATUS_INVALID_SYSTEM_SERVICE ((NTSTATUS)0xC000001CL)
+#define STATUS_ILLEGAL_INSTRUCTION ((NTSTATUS)0xC000001DL)
+#define STATUS_INVALID_LOCK_SEQUENCE ((NTSTATUS)0xC000001EL)
+#define STATUS_INVALID_VIEW_SIZE ((NTSTATUS)0xC000001FL)
+#define STATUS_INVALID_FILE_FOR_SECTION ((NTSTATUS)0xC0000020L)
+#define STATUS_ALREADY_COMMITTED ((NTSTATUS)0xC0000021L)
+#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
+#define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023L)
+#define STATUS_OBJECT_TYPE_MISMATCH ((NTSTATUS)0xC0000024L)
+#define STATUS_NONCONTINUABLE_EXCEPTION ((NTSTATUS)0xC0000025L)
+#define STATUS_INVALID_DISPOSITION ((NTSTATUS)0xC0000026L)
+#define STATUS_UNWIND ((NTSTATUS)0xC0000027L)
+#define STATUS_BAD_STACK ((NTSTATUS)0xC0000028L)
+#define STATUS_INVALID_UNWIND_TARGET ((NTSTATUS)0xC0000029L)
+#define STATUS_NOT_LOCKED ((NTSTATUS)0xC000002AL)
+#define STATUS_PARITY_ERROR ((NTSTATUS)0xC000002BL)
+#define STATUS_UNABLE_TO_DECOMMIT_VM ((NTSTATUS)0xC000002CL)
+#define STATUS_NOT_COMMITTED ((NTSTATUS)0xC000002DL)
+#define STATUS_INVALID_PORT_ATTRIBUTES ((NTSTATUS)0xC000002EL)
+#define STATUS_PORT_MESSAGE_TOO_LONG ((NTSTATUS)0xC000002FL)
+#define STATUS_INVALID_PARAMETER_MIX ((NTSTATUS)0xC0000030L)
+#define STATUS_INVALID_QUOTA_LOWER ((NTSTATUS)0xC0000031L)
+#define STATUS_DISK_CORRUPT_ERROR ((NTSTATUS)0xC0000032L)
+#define STATUS_OBJECT_NAME_INVALID ((NTSTATUS)0xC0000033L)
+#define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034L)
+#define STATUS_OBJECT_NAME_COLLISION ((NTSTATUS)0xC0000035L)
+#define STATUS_PORT_DISCONNECTED ((NTSTATUS)0xC0000037L)
+#define STATUS_DEVICE_ALREADY_ATTACHED ((NTSTATUS)0xC0000038L)
+#define STATUS_OBJECT_PATH_INVALID ((NTSTATUS)0xC0000039L)
+#define STATUS_OBJECT_PATH_NOT_FOUND ((NTSTATUS)0xC000003AL)
+#define STATUS_OBJECT_PATH_SYNTAX_BAD ((NTSTATUS)0xC000003BL)
+#define STATUS_DATA_OVERRUN ((NTSTATUS)0xC000003CL)
+#define STATUS_DATA_LATE_ERROR ((NTSTATUS)0xC000003DL)
+#define STATUS_DATA_ERROR ((NTSTATUS)0xC000003EL)
+#define STATUS_CRC_ERROR ((NTSTATUS)0xC000003FL)
+#define STATUS_SECTION_TOO_BIG ((NTSTATUS)0xC0000040L)
+#define STATUS_PORT_CONNECTION_REFUSED ((NTSTATUS)0xC0000041L)
+#define STATUS_INVALID_PORT_HANDLE ((NTSTATUS)0xC0000042L)
+#define STATUS_SHARING_VIOLATION ((NTSTATUS)0xC0000043L)
+#define STATUS_QUOTA_EXCEEDED ((NTSTATUS)0xC0000044L)
+#define STATUS_INVALID_PAGE_PROTECTION ((NTSTATUS)0xC0000045L)
+#define STATUS_MUTANT_NOT_OWNED ((NTSTATUS)0xC0000046L)
+#define STATUS_SEMAPHORE_LIMIT_EXCEEDED ((NTSTATUS)0xC0000047L)
+#define STATUS_PORT_ALREADY_SET ((NTSTATUS)0xC0000048L)
+#define STATUS_SECTION_NOT_IMAGE ((NTSTATUS)0xC0000049L)
+#define STATUS_SUSPEND_COUNT_EXCEEDED ((NTSTATUS)0xC000004AL)
+#define STATUS_THREAD_IS_TERMINATING ((NTSTATUS)0xC000004BL)
+#define STATUS_BAD_WORKING_SET_LIMIT ((NTSTATUS)0xC000004CL)
+#define STATUS_INCOMPATIBLE_FILE_MAP ((NTSTATUS)0xC000004DL)
+#define STATUS_SECTION_PROTECTION ((NTSTATUS)0xC000004EL)
+#define STATUS_EAS_NOT_SUPPORTED ((NTSTATUS)0xC000004FL)
+#define STATUS_EA_TOO_LARGE ((NTSTATUS)0xC0000050L)
+#define STATUS_NONEXISTENT_EA_ENTRY ((NTSTATUS)0xC0000051L)
+#define STATUS_NO_EAS_ON_FILE ((NTSTATUS)0xC0000052L)
+#define STATUS_EA_CORRUPT_ERROR ((NTSTATUS)0xC0000053L)
+#define STATUS_FILE_LOCK_CONFLICT ((NTSTATUS)0xC0000054L)
+#define STATUS_LOCK_NOT_GRANTED ((NTSTATUS)0xC0000055L)
+#define STATUS_DELETE_PENDING ((NTSTATUS)0xC0000056L)
+#define STATUS_CTL_FILE_NOT_SUPPORTED ((NTSTATUS)0xC0000057L)
+#define STATUS_UNKNOWN_REVISION ((NTSTATUS)0xC0000058L)
+#define STATUS_REVISION_MISMATCH ((NTSTATUS)0xC0000059L)
+#define STATUS_INVALID_OWNER ((NTSTATUS)0xC000005AL)
+#define STATUS_INVALID_PRIMARY_GROUP ((NTSTATUS)0xC000005BL)
+#define STATUS_NO_IMPERSONATION_TOKEN ((NTSTATUS)0xC000005CL)
+#define STATUS_CANT_DISABLE_MANDATORY ((NTSTATUS)0xC000005DL)
+#define STATUS_NO_LOGON_SERVERS ((NTSTATUS)0xC000005EL)
+#define STATUS_NO_SUCH_LOGON_SESSION ((NTSTATUS)0xC000005FL)
+#define STATUS_NO_SUCH_PRIVILEGE ((NTSTATUS)0xC0000060L)
+#define STATUS_PRIVILEGE_NOT_HELD ((NTSTATUS)0xC0000061L)
+#define STATUS_INVALID_ACCOUNT_NAME ((NTSTATUS)0xC0000062L)
+#define STATUS_USER_EXISTS ((NTSTATUS)0xC0000063L)
+#define STATUS_NO_SUCH_USER ((NTSTATUS)0xC0000064L)
+#define STATUS_GROUP_EXISTS ((NTSTATUS)0xC0000065L)
+#define STATUS_NO_SUCH_GROUP ((NTSTATUS)0xC0000066L)
+#define STATUS_MEMBER_IN_GROUP ((NTSTATUS)0xC0000067L)
+#define STATUS_MEMBER_NOT_IN_GROUP ((NTSTATUS)0xC0000068L)
+#define STATUS_LAST_ADMIN ((NTSTATUS)0xC0000069L)
+#define STATUS_WRONG_PASSWORD ((NTSTATUS)0xC000006AL)
+#define STATUS_ILL_FORMED_PASSWORD ((NTSTATUS)0xC000006BL)
+#define STATUS_PASSWORD_RESTRICTION ((NTSTATUS)0xC000006CL)
+#define STATUS_LOGON_FAILURE ((NTSTATUS)0xC000006DL)
+#define STATUS_ACCOUNT_RESTRICTION ((NTSTATUS)0xC000006EL)
+#define STATUS_INVALID_LOGON_HOURS ((NTSTATUS)0xC000006FL)
+#define STATUS_INVALID_WORKSTATION ((NTSTATUS)0xC0000070L)
+#define STATUS_PASSWORD_EXPIRED ((NTSTATUS)0xC0000071L)
+#define STATUS_ACCOUNT_DISABLED ((NTSTATUS)0xC0000072L)
+#define STATUS_NONE_MAPPED ((NTSTATUS)0xC0000073L)
+#define STATUS_TOO_MANY_LUIDS_REQUESTED ((NTSTATUS)0xC0000074L)
+#define STATUS_LUIDS_EXHAUSTED ((NTSTATUS)0xC0000075L)
+#define STATUS_INVALID_SUB_AUTHORITY ((NTSTATUS)0xC0000076L)
+#define STATUS_INVALID_ACL ((NTSTATUS)0xC0000077L)
+#define STATUS_INVALID_SID ((NTSTATUS)0xC0000078L)
+#define STATUS_INVALID_SECURITY_DESCR ((NTSTATUS)0xC0000079L)
+#define STATUS_PROCEDURE_NOT_FOUND ((NTSTATUS)0xC000007AL)
+#define STATUS_INVALID_IMAGE_FORMAT ((NTSTATUS)0xC000007BL)
+#define STATUS_NO_TOKEN ((NTSTATUS)0xC000007CL)
+#define STATUS_BAD_INHERITANCE_ACL ((NTSTATUS)0xC000007DL)
+#define STATUS_RANGE_NOT_LOCKED ((NTSTATUS)0xC000007EL)
+#define STATUS_DISK_FULL ((NTSTATUS)0xC000007FL)
+#define STATUS_SERVER_DISABLED ((NTSTATUS)0xC0000080L)
+#define STATUS_SERVER_NOT_DISABLED ((NTSTATUS)0xC0000081L)
+#define STATUS_TOO_MANY_GUIDS_REQUESTED ((NTSTATUS)0xC0000082L)
+#define STATUS_GUIDS_EXHAUSTED ((NTSTATUS)0xC0000083L)
+#define STATUS_INVALID_ID_AUTHORITY ((NTSTATUS)0xC0000084L)
+#define STATUS_AGENTS_EXHAUSTED ((NTSTATUS)0xC0000085L)
+#define STATUS_INVALID_VOLUME_LABEL ((NTSTATUS)0xC0000086L)
+#define STATUS_SECTION_NOT_EXTENDED ((NTSTATUS)0xC0000087L)
+#define STATUS_NOT_MAPPED_DATA ((NTSTATUS)0xC0000088L)
+#define STATUS_RESOURCE_DATA_NOT_FOUND ((NTSTATUS)0xC0000089L)
+#define STATUS_RESOURCE_TYPE_NOT_FOUND ((NTSTATUS)0xC000008AL)
+#define STATUS_RESOURCE_NAME_NOT_FOUND ((NTSTATUS)0xC000008BL)
+#define STATUS_ARRAY_BOUNDS_EXCEEDED ((NTSTATUS)0xC000008CL)
+#define STATUS_FLOAT_DENORMAL_OPERAND ((NTSTATUS)0xC000008DL)
+#define STATUS_FLOAT_DIVIDE_BY_ZERO ((NTSTATUS)0xC000008EL)
+#define STATUS_FLOAT_INEXACT_RESULT ((NTSTATUS)0xC000008FL)
+#define STATUS_FLOAT_INVALID_OPERATION ((NTSTATUS)0xC0000090L)
+#define STATUS_FLOAT_OVERFLOW ((NTSTATUS)0xC0000091L)
+#define STATUS_FLOAT_STACK_CHECK ((NTSTATUS)0xC0000092L)
+#define STATUS_FLOAT_UNDERFLOW ((NTSTATUS)0xC0000093L)
+#define STATUS_INTEGER_DIVIDE_BY_ZERO ((NTSTATUS)0xC0000094L)
+#define STATUS_INTEGER_OVERFLOW ((NTSTATUS)0xC0000095L)
+#define STATUS_PRIVILEGED_INSTRUCTION ((NTSTATUS)0xC0000096L)
+#define STATUS_TOO_MANY_PAGING_FILES ((NTSTATUS)0xC0000097L)
+#define STATUS_FILE_INVALID ((NTSTATUS)0xC0000098L)
+#define STATUS_ALLOTTED_SPACE_EXCEEDED ((NTSTATUS)0xC0000099L)
+#define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009AL)
+#define STATUS_DFS_EXIT_PATH_FOUND ((NTSTATUS)0xC000009BL)
+#define STATUS_DEVICE_DATA_ERROR ((NTSTATUS)0xC000009CL)
+#define STATUS_DEVICE_NOT_CONNECTED ((NTSTATUS)0xC000009DL)
+#define STATUS_DEVICE_POWER_FAILURE ((NTSTATUS)0xC000009EL)
+#define STATUS_FREE_VM_NOT_AT_BASE ((NTSTATUS)0xC000009FL)
+#define STATUS_MEMORY_NOT_ALLOCATED ((NTSTATUS)0xC00000A0L)
+#define STATUS_WORKING_SET_QUOTA ((NTSTATUS)0xC00000A1L)
+#define STATUS_MEDIA_WRITE_PROTECTED ((NTSTATUS)0xC00000A2L)
+#define STATUS_DEVICE_NOT_READY ((NTSTATUS)0xC00000A3L)
+#define STATUS_INVALID_GROUP_ATTRIBUTES ((NTSTATUS)0xC00000A4L)
+#define STATUS_BAD_IMPERSONATION_LEVEL ((NTSTATUS)0xC00000A5L)
+#define STATUS_CANT_OPEN_ANONYMOUS ((NTSTATUS)0xC00000A6L)
+#define STATUS_BAD_VALIDATION_CLASS ((NTSTATUS)0xC00000A7L)
+#define STATUS_BAD_TOKEN_TYPE ((NTSTATUS)0xC00000A8L)
+#define STATUS_BAD_MASTER_BOOT_RECORD ((NTSTATUS)0xC00000A9L)
+#define STATUS_INSTRUCTION_MISALIGNMENT ((NTSTATUS)0xC00000AAL)
+#define STATUS_INSTANCE_NOT_AVAILABLE ((NTSTATUS)0xC00000ABL)
+#define STATUS_PIPE_NOT_AVAILABLE ((NTSTATUS)0xC00000ACL)
+#define STATUS_INVALID_PIPE_STATE ((NTSTATUS)0xC00000ADL)
+#define STATUS_PIPE_BUSY ((NTSTATUS)0xC00000AEL)
+#define STATUS_ILLEGAL_FUNCTION ((NTSTATUS)0xC00000AFL)
+#define STATUS_PIPE_DISCONNECTED ((NTSTATUS)0xC00000B0L)
+#define STATUS_PIPE_CLOSING ((NTSTATUS)0xC00000B1L)
+#define STATUS_PIPE_CONNECTED ((NTSTATUS)0xC00000B2L)
+#define STATUS_PIPE_LISTENING ((NTSTATUS)0xC00000B3L)
+#define STATUS_INVALID_READ_MODE ((NTSTATUS)0xC00000B4L)
+#define STATUS_IO_TIMEOUT ((NTSTATUS)0xC00000B5L)
+#define STATUS_FILE_FORCED_CLOSED ((NTSTATUS)0xC00000B6L)
+#define STATUS_PROFILING_NOT_STARTED ((NTSTATUS)0xC00000B7L)
+#define STATUS_PROFILING_NOT_STOPPED ((NTSTATUS)0xC00000B8L)
+#define STATUS_COULD_NOT_INTERPRET ((NTSTATUS)0xC00000B9L)
+#define STATUS_FILE_IS_A_DIRECTORY ((NTSTATUS)0xC00000BAL)
+#define STATUS_NOT_SUPPORTED ((NTSTATUS)0xC00000BBL)
+#define STATUS_REMOTE_NOT_LISTENING ((NTSTATUS)0xC00000BCL)
+#define STATUS_DUPLICATE_NAME ((NTSTATUS)0xC00000BDL)
+#define STATUS_BAD_NETWORK_PATH ((NTSTATUS)0xC00000BEL)
+#define STATUS_NETWORK_BUSY ((NTSTATUS)0xC00000BFL)
+#define STATUS_DEVICE_DOES_NOT_EXIST ((NTSTATUS)0xC00000C0L)
+#define STATUS_TOO_MANY_COMMANDS ((NTSTATUS)0xC00000C1L)
+#define STATUS_ADAPTER_HARDWARE_ERROR ((NTSTATUS)0xC00000C2L)
+#define STATUS_INVALID_NETWORK_RESPONSE ((NTSTATUS)0xC00000C3L)
+#define STATUS_UNEXPECTED_NETWORK_ERROR ((NTSTATUS)0xC00000C4L)
+#define STATUS_BAD_REMOTE_ADAPTER ((NTSTATUS)0xC00000C5L)
+#define STATUS_PRINT_QUEUE_FULL ((NTSTATUS)0xC00000C6L)
+#define STATUS_NO_SPOOL_SPACE ((NTSTATUS)0xC00000C7L)
+#define STATUS_PRINT_CANCELLED ((NTSTATUS)0xC00000C8L)
+#define STATUS_NETWORK_NAME_DELETED ((NTSTATUS)0xC00000C9L)
+#define STATUS_NETWORK_ACCESS_DENIED ((NTSTATUS)0xC00000CAL)
+#define STATUS_BAD_DEVICE_TYPE ((NTSTATUS)0xC00000CBL)
+#define STATUS_BAD_NETWORK_NAME ((NTSTATUS)0xC00000CCL)
+#define STATUS_TOO_MANY_NAMES ((NTSTATUS)0xC00000CDL)
+#define STATUS_TOO_MANY_SESSIONS ((NTSTATUS)0xC00000CEL)
+#define STATUS_SHARING_PAUSED ((NTSTATUS)0xC00000CFL)
+#define STATUS_REQUEST_NOT_ACCEPTED ((NTSTATUS)0xC00000D0L)
+#define STATUS_REDIRECTOR_PAUSED ((NTSTATUS)0xC00000D1L)
+#define STATUS_NET_WRITE_FAULT ((NTSTATUS)0xC00000D2L)
+#define STATUS_PROFILING_AT_LIMIT ((NTSTATUS)0xC00000D3L)
+#define STATUS_NOT_SAME_DEVICE ((NTSTATUS)0xC00000D4L)
+#define STATUS_FILE_RENAMED ((NTSTATUS)0xC00000D5L)
+#define STATUS_VIRTUAL_CIRCUIT_CLOSED ((NTSTATUS)0xC00000D6L)
+#define STATUS_NO_SECURITY_ON_OBJECT ((NTSTATUS)0xC00000D7L)
+#define STATUS_CANT_WAIT ((NTSTATUS)0xC00000D8L)
+#define STATUS_PIPE_EMPTY ((NTSTATUS)0xC00000D9L)
+#define STATUS_CANT_ACCESS_DOMAIN_INFO ((NTSTATUS)0xC00000DAL)
+#define STATUS_CANT_TERMINATE_SELF ((NTSTATUS)0xC00000DBL)
+#define STATUS_INVALID_SERVER_STATE ((NTSTATUS)0xC00000DCL)
+#define STATUS_INVALID_DOMAIN_STATE ((NTSTATUS)0xC00000DDL)
+#define STATUS_INVALID_DOMAIN_ROLE ((NTSTATUS)0xC00000DEL)
+#define STATUS_NO_SUCH_DOMAIN ((NTSTATUS)0xC00000DFL)
+#define STATUS_DOMAIN_EXISTS ((NTSTATUS)0xC00000E0L)
+#define STATUS_DOMAIN_LIMIT_EXCEEDED ((NTSTATUS)0xC00000E1L)
+#define STATUS_OPLOCK_NOT_GRANTED ((NTSTATUS)0xC00000E2L)
+#define STATUS_INVALID_OPLOCK_PROTOCOL ((NTSTATUS)0xC00000E3L)
+#define STATUS_INTERNAL_DB_CORRUPTION ((NTSTATUS)0xC00000E4L)
+#define STATUS_INTERNAL_ERROR ((NTSTATUS)0xC00000E5L)
+#define STATUS_GENERIC_NOT_MAPPED ((NTSTATUS)0xC00000E6L)
+#define STATUS_BAD_DESCRIPTOR_FORMAT ((NTSTATUS)0xC00000E7L)
+#define STATUS_INVALID_USER_BUFFER ((NTSTATUS)0xC00000E8L)
+#define STATUS_UNEXPECTED_IO_ERROR ((NTSTATUS)0xC00000E9L)
+#define STATUS_UNEXPECTED_MM_CREATE_ERR ((NTSTATUS)0xC00000EAL)
+#define STATUS_UNEXPECTED_MM_MAP_ERROR ((NTSTATUS)0xC00000EBL)
+#define STATUS_UNEXPECTED_MM_EXTEND_ERR ((NTSTATUS)0xC00000ECL)
+#define STATUS_NOT_LOGON_PROCESS ((NTSTATUS)0xC00000EDL)
+#define STATUS_LOGON_SESSION_EXISTS ((NTSTATUS)0xC00000EEL)
+#define STATUS_INVALID_PARAMETER_1 ((NTSTATUS)0xC00000EFL)
+#define STATUS_INVALID_PARAMETER_2 ((NTSTATUS)0xC00000F0L)
+#define STATUS_INVALID_PARAMETER_3 ((NTSTATUS)0xC00000F1L)
+#define STATUS_INVALID_PARAMETER_4 ((NTSTATUS)0xC00000F2L)
+#define STATUS_INVALID_PARAMETER_5 ((NTSTATUS)0xC00000F3L)
+#define STATUS_INVALID_PARAMETER_6 ((NTSTATUS)0xC00000F4L)
+#define STATUS_INVALID_PARAMETER_7 ((NTSTATUS)0xC00000F5L)
+#define STATUS_INVALID_PARAMETER_8 ((NTSTATUS)0xC00000F6L)
+#define STATUS_INVALID_PARAMETER_9 ((NTSTATUS)0xC00000F7L)
+#define STATUS_INVALID_PARAMETER_10 ((NTSTATUS)0xC00000F8L)
+#define STATUS_INVALID_PARAMETER_11 ((NTSTATUS)0xC00000F9L)
+#define STATUS_INVALID_PARAMETER_12 ((NTSTATUS)0xC00000FAL)
+#define STATUS_REDIRECTOR_NOT_STARTED ((NTSTATUS)0xC00000FBL)
+#define STATUS_REDIRECTOR_STARTED ((NTSTATUS)0xC00000FCL)
+#define STATUS_STACK_OVERFLOW ((NTSTATUS)0xC00000FDL)
+#define STATUS_NO_SUCH_PACKAGE ((NTSTATUS)0xC00000FEL)
+#define STATUS_BAD_FUNCTION_TABLE ((NTSTATUS)0xC00000FFL)
+#define STATUS_VARIABLE_NOT_FOUND ((NTSTATUS)0xC0000100L)
+#define STATUS_DIRECTORY_NOT_EMPTY ((NTSTATUS)0xC0000101L)
+#define STATUS_FILE_CORRUPT_ERROR ((NTSTATUS)0xC0000102L)
+#define STATUS_NOT_A_DIRECTORY ((NTSTATUS)0xC0000103L)
+#define STATUS_BAD_LOGON_SESSION_STATE ((NTSTATUS)0xC0000104L)
+#define STATUS_LOGON_SESSION_COLLISION ((NTSTATUS)0xC0000105L)
+#define STATUS_NAME_TOO_LONG ((NTSTATUS)0xC0000106L)
+#define STATUS_FILES_OPEN ((NTSTATUS)0xC0000107L)
+#define STATUS_CONNECTION_IN_USE ((NTSTATUS)0xC0000108L)
+#define STATUS_MESSAGE_NOT_FOUND ((NTSTATUS)0xC0000109L)
+#define STATUS_PROCESS_IS_TERMINATING ((NTSTATUS)0xC000010AL)
+#define STATUS_INVALID_LOGON_TYPE ((NTSTATUS)0xC000010BL)
+#define STATUS_NO_GUID_TRANSLATION ((NTSTATUS)0xC000010CL)
+#define STATUS_CANNOT_IMPERSONATE ((NTSTATUS)0xC000010DL)
+#define STATUS_IMAGE_ALREADY_LOADED ((NTSTATUS)0xC000010EL)
+#define STATUS_ABIOS_NOT_PRESENT ((NTSTATUS)0xC000010FL)
+#define STATUS_ABIOS_LID_NOT_EXIST ((NTSTATUS)0xC0000110L)
+#define STATUS_ABIOS_LID_ALREADY_OWNED ((NTSTATUS)0xC0000111L)
+#define STATUS_ABIOS_NOT_LID_OWNER ((NTSTATUS)0xC0000112L)
+#define STATUS_ABIOS_INVALID_COMMAND ((NTSTATUS)0xC0000113L)
+#define STATUS_ABIOS_INVALID_LID ((NTSTATUS)0xC0000114L)
+#define STATUS_ABIOS_SELECTOR_NOT_AVAILABLE ((NTSTATUS)0xC0000115L)
+#define STATUS_ABIOS_INVALID_SELECTOR ((NTSTATUS)0xC0000116L)
+#define STATUS_NO_LDT ((NTSTATUS)0xC0000117L)
+#define STATUS_INVALID_LDT_SIZE ((NTSTATUS)0xC0000118L)
+#define STATUS_INVALID_LDT_OFFSET ((NTSTATUS)0xC0000119L)
+#define STATUS_INVALID_LDT_DESCRIPTOR ((NTSTATUS)0xC000011AL)
+#define STATUS_INVALID_IMAGE_NE_FORMAT ((NTSTATUS)0xC000011BL)
+#define STATUS_RXACT_INVALID_STATE ((NTSTATUS)0xC000011CL)
+#define STATUS_RXACT_COMMIT_FAILURE ((NTSTATUS)0xC000011DL)
+#define STATUS_MAPPED_FILE_SIZE_ZERO ((NTSTATUS)0xC000011EL)
+#define STATUS_TOO_MANY_OPENED_FILES ((NTSTATUS)0xC000011FL)
+#define STATUS_CANCELLED ((NTSTATUS)0xC0000120L)
+#define STATUS_CANNOT_DELETE ((NTSTATUS)0xC0000121L)
+#define STATUS_INVALID_COMPUTER_NAME ((NTSTATUS)0xC0000122L)
+#define STATUS_FILE_DELETED ((NTSTATUS)0xC0000123L)
+#define STATUS_SPECIAL_ACCOUNT ((NTSTATUS)0xC0000124L)
+#define STATUS_SPECIAL_GROUP ((NTSTATUS)0xC0000125L)
+#define STATUS_SPECIAL_USER ((NTSTATUS)0xC0000126L)
+#define STATUS_MEMBERS_PRIMARY_GROUP ((NTSTATUS)0xC0000127L)
+#define STATUS_FILE_CLOSED ((NTSTATUS)0xC0000128L)
+#define STATUS_TOO_MANY_THREADS ((NTSTATUS)0xC0000129L)
+#define STATUS_THREAD_NOT_IN_PROCESS ((NTSTATUS)0xC000012AL)
+#define STATUS_TOKEN_ALREADY_IN_USE ((NTSTATUS)0xC000012BL)
+#define STATUS_PAGEFILE_QUOTA_EXCEEDED ((NTSTATUS)0xC000012CL)
+#define STATUS_COMMITMENT_LIMIT ((NTSTATUS)0xC000012DL)
+#define STATUS_INVALID_IMAGE_LE_FORMAT ((NTSTATUS)0xC000012EL)
+#define STATUS_INVALID_IMAGE_NOT_MZ ((NTSTATUS)0xC000012FL)
+#define STATUS_INVALID_IMAGE_PROTECT ((NTSTATUS)0xC0000130L)
+#define STATUS_INVALID_IMAGE_WIN_16 ((NTSTATUS)0xC0000131L)
+#define STATUS_LOGON_SERVER_CONFLICT ((NTSTATUS)0xC0000132L)
+#define STATUS_TIME_DIFFERENCE_AT_DC ((NTSTATUS)0xC0000133L)
+#define STATUS_SYNCHRONIZATION_REQUIRED ((NTSTATUS)0xC0000134L)
+#define STATUS_DLL_NOT_FOUND ((NTSTATUS)0xC0000135L)
+#define STATUS_OPEN_FAILED ((NTSTATUS)0xC0000136L)
+#define STATUS_IO_PRIVILEGE_FAILED ((NTSTATUS)0xC0000137L)
+#define STATUS_ORDINAL_NOT_FOUND ((NTSTATUS)0xC0000138L)
+#define STATUS_ENTRYPOINT_NOT_FOUND ((NTSTATUS)0xC0000139L)
+#define STATUS_CONTROL_C_EXIT ((NTSTATUS)0xC000013AL)
+#define STATUS_LOCAL_DISCONNECT ((NTSTATUS)0xC000013BL)
+#define STATUS_REMOTE_DISCONNECT ((NTSTATUS)0xC000013CL)
+#define STATUS_REMOTE_RESOURCES ((NTSTATUS)0xC000013DL)
+#define STATUS_LINK_FAILED ((NTSTATUS)0xC000013EL)
+#define STATUS_LINK_TIMEOUT ((NTSTATUS)0xC000013FL)
+#define STATUS_INVALID_CONNECTION ((NTSTATUS)0xC0000140L)
+#define STATUS_INVALID_ADDRESS ((NTSTATUS)0xC0000141L)
+#define STATUS_DLL_INIT_FAILED ((NTSTATUS)0xC0000142L)
+#define STATUS_MISSING_SYSTEMFILE ((NTSTATUS)0xC0000143L)
+#define STATUS_UNHANDLED_EXCEPTION ((NTSTATUS)0xC0000144L)
+#define STATUS_APP_INIT_FAILURE ((NTSTATUS)0xC0000145L)
+#define STATUS_PAGEFILE_CREATE_FAILED ((NTSTATUS)0xC0000146L)
+#define STATUS_NO_PAGEFILE ((NTSTATUS)0xC0000147L)
+#define STATUS_INVALID_LEVEL ((NTSTATUS)0xC0000148L)
+#define STATUS_WRONG_PASSWORD_CORE ((NTSTATUS)0xC0000149L)
+#define STATUS_ILLEGAL_FLOAT_CONTEXT ((NTSTATUS)0xC000014AL)
+#define STATUS_PIPE_BROKEN ((NTSTATUS)0xC000014BL)
+#define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014CL)
+#define STATUS_REGISTRY_IO_FAILED ((NTSTATUS)0xC000014DL)
+#define STATUS_NO_EVENT_PAIR ((NTSTATUS)0xC000014EL)
+#define STATUS_UNRECOGNIZED_VOLUME ((NTSTATUS)0xC000014FL)
+#define STATUS_SERIAL_NO_DEVICE_INITED ((NTSTATUS)0xC0000150L)
+#define STATUS_NO_SUCH_ALIAS ((NTSTATUS)0xC0000151L)
+#define STATUS_MEMBER_NOT_IN_ALIAS ((NTSTATUS)0xC0000152L)
+#define STATUS_MEMBER_IN_ALIAS ((NTSTATUS)0xC0000153L)
+#define STATUS_ALIAS_EXISTS ((NTSTATUS)0xC0000154L)
+#define STATUS_LOGON_NOT_GRANTED ((NTSTATUS)0xC0000155L)
+#define STATUS_TOO_MANY_SECRETS ((NTSTATUS)0xC0000156L)
+#define STATUS_SECRET_TOO_LONG ((NTSTATUS)0xC0000157L)
+#define STATUS_INTERNAL_DB_ERROR ((NTSTATUS)0xC0000158L)
+#define STATUS_FULLSCREEN_MODE ((NTSTATUS)0xC0000159L)
+#define STATUS_TOO_MANY_CONTEXT_IDS ((NTSTATUS)0xC000015AL)
+#define STATUS_LOGON_TYPE_NOT_GRANTED ((NTSTATUS)0xC000015BL)
+#define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015CL)
+#define STATUS_NT_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS)0xC000015DL)
+#define STATUS_DOMAIN_CTRLR_CONFIG_ERROR ((NTSTATUS)0xC000015EL)
+#define STATUS_FT_MISSING_MEMBER ((NTSTATUS)0xC000015FL)
+#define STATUS_ILL_FORMED_SERVICE_ENTRY ((NTSTATUS)0xC0000160L)
+#define STATUS_ILLEGAL_CHARACTER ((NTSTATUS)0xC0000161L)
+#define STATUS_UNMAPPABLE_CHARACTER ((NTSTATUS)0xC0000162L)
+#define STATUS_UNDEFINED_CHARACTER ((NTSTATUS)0xC0000163L)
+#define STATUS_FLOPPY_VOLUME ((NTSTATUS)0xC0000164L)
+#define STATUS_FLOPPY_ID_MARK_NOT_FOUND ((NTSTATUS)0xC0000165L)
+#define STATUS_FLOPPY_WRONG_CYLINDER ((NTSTATUS)0xC0000166L)
+#define STATUS_FLOPPY_UNKNOWN_ERROR ((NTSTATUS)0xC0000167L)
+#define STATUS_FLOPPY_BAD_REGISTERS ((NTSTATUS)0xC0000168L)
+#define STATUS_DISK_RECALIBRATE_FAILED ((NTSTATUS)0xC0000169L)
+#define STATUS_DISK_OPERATION_FAILED ((NTSTATUS)0xC000016AL)
+#define STATUS_DISK_RESET_FAILED ((NTSTATUS)0xC000016BL)
+#define STATUS_SHARED_IRQ_BUSY ((NTSTATUS)0xC000016CL)
+#define STATUS_FT_ORPHANING ((NTSTATUS)0xC000016DL)
+#define STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT ((NTSTATUS)0xC000016EL)
+#define STATUS_PARTITION_FAILURE ((NTSTATUS)0xC0000172L)
+#define STATUS_INVALID_BLOCK_LENGTH ((NTSTATUS)0xC0000173L)
+#define STATUS_DEVICE_NOT_PARTITIONED ((NTSTATUS)0xC0000174L)
+#define STATUS_UNABLE_TO_LOCK_MEDIA ((NTSTATUS)0xC0000175L)
+#define STATUS_UNABLE_TO_UNLOAD_MEDIA ((NTSTATUS)0xC0000176L)
+#define STATUS_EOM_OVERFLOW ((NTSTATUS)0xC0000177L)
+#define STATUS_NO_MEDIA ((NTSTATUS)0xC0000178L)
+#define STATUS_NO_SUCH_MEMBER ((NTSTATUS)0xC000017AL)
+#define STATUS_INVALID_MEMBER ((NTSTATUS)0xC000017BL)
+#define STATUS_KEY_DELETED ((NTSTATUS)0xC000017CL)
+#define STATUS_NO_LOG_SPACE ((NTSTATUS)0xC000017DL)
+#define STATUS_TOO_MANY_SIDS ((NTSTATUS)0xC000017EL)
+#define STATUS_LM_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS)0xC000017FL)
+#define STATUS_KEY_HAS_CHILDREN ((NTSTATUS)0xC0000180L)
+#define STATUS_CHILD_MUST_BE_VOLATILE ((NTSTATUS)0xC0000181L)
+#define STATUS_DEVICE_CONFIGURATION_ERROR ((NTSTATUS)0xC0000182L)
+#define STATUS_DRIVER_INTERNAL_ERROR ((NTSTATUS)0xC0000183L)
+#define STATUS_INVALID_DEVICE_STATE ((NTSTATUS)0xC0000184L)
+#define STATUS_IO_DEVICE_ERROR ((NTSTATUS)0xC0000185L)
+#define STATUS_DEVICE_PROTOCOL_ERROR ((NTSTATUS)0xC0000186L)
+#define STATUS_BACKUP_CONTROLLER ((NTSTATUS)0xC0000187L)
+#define STATUS_LOG_FILE_FULL ((NTSTATUS)0xC0000188L)
+#define STATUS_TOO_LATE ((NTSTATUS)0xC0000189L)
+#define STATUS_NO_TRUST_LSA_SECRET ((NTSTATUS)0xC000018AL)
+#define STATUS_NO_TRUST_SAM_ACCOUNT ((NTSTATUS)0xC000018BL)
+#define STATUS_TRUSTED_DOMAIN_FAILURE ((NTSTATUS)0xC000018CL)
+#define STATUS_TRUSTED_RELATIONSHIP_FAILURE ((NTSTATUS)0xC000018DL)
+#define STATUS_EVENTLOG_FILE_CORRUPT ((NTSTATUS)0xC000018EL)
+#define STATUS_EVENTLOG_CANT_START ((NTSTATUS)0xC000018FL)
+#define STATUS_TRUST_FAILURE ((NTSTATUS)0xC0000190L)
+#define STATUS_MUTANT_LIMIT_EXCEEDED ((NTSTATUS)0xC0000191L)
+#define STATUS_NETLOGON_NOT_STARTED ((NTSTATUS)0xC0000192L)
+#define STATUS_ACCOUNT_EXPIRED ((NTSTATUS)0xC0000193L)
+#define STATUS_POSSIBLE_DEADLOCK ((NTSTATUS)0xC0000194L)
+#define STATUS_NETWORK_CREDENTIAL_CONFLICT ((NTSTATUS)0xC0000195L)
+#define STATUS_REMOTE_SESSION_LIMIT ((NTSTATUS)0xC0000196L)
+#define STATUS_EVENTLOG_FILE_CHANGED ((NTSTATUS)0xC0000197L)
+#define STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT ((NTSTATUS)0xC0000198L)
+#define STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT ((NTSTATUS)0xC0000199L)
+#define STATUS_NOLOGON_SERVER_TRUST_ACCOUNT ((NTSTATUS)0xC000019AL)
+#define STATUS_DOMAIN_TRUST_INCONSISTENT ((NTSTATUS)0xC000019BL)
+#define STATUS_FS_DRIVER_REQUIRED ((NTSTATUS)0xC000019CL)
+#define STATUS_NO_USER_SESSION_KEY ((NTSTATUS)0xC0000202L)
+#define STATUS_USER_SESSION_DELETED ((NTSTATUS)0xC0000203L)
+#define STATUS_RESOURCE_LANG_NOT_FOUND ((NTSTATUS)0xC0000204L)
+#define STATUS_INSUFF_SERVER_RESOURCES ((NTSTATUS)0xC0000205L)
+#define STATUS_INVALID_BUFFER_SIZE ((NTSTATUS)0xC0000206L)
+#define STATUS_INVALID_ADDRESS_COMPONENT ((NTSTATUS)0xC0000207L)
+#define STATUS_INVALID_ADDRESS_WILDCARD ((NTSTATUS)0xC0000208L)
+#define STATUS_TOO_MANY_ADDRESSES ((NTSTATUS)0xC0000209L)
+#define STATUS_ADDRESS_ALREADY_EXISTS ((NTSTATUS)0xC000020AL)
+#define STATUS_ADDRESS_CLOSED ((NTSTATUS)0xC000020BL)
+#define STATUS_CONNECTION_DISCONNECTED ((NTSTATUS)0xC000020CL)
+#define STATUS_CONNECTION_RESET ((NTSTATUS)0xC000020DL)
+#define STATUS_TOO_MANY_NODES ((NTSTATUS)0xC000020EL)
+#define STATUS_TRANSACTION_ABORTED ((NTSTATUS)0xC000020FL)
+#define STATUS_TRANSACTION_TIMED_OUT ((NTSTATUS)0xC0000210L)
+#define STATUS_TRANSACTION_NO_RELEASE ((NTSTATUS)0xC0000211L)
+#define STATUS_TRANSACTION_NO_MATCH ((NTSTATUS)0xC0000212L)
+#define STATUS_TRANSACTION_RESPONDED ((NTSTATUS)0xC0000213L)
+#define STATUS_TRANSACTION_INVALID_ID ((NTSTATUS)0xC0000214L)
+#define STATUS_TRANSACTION_INVALID_TYPE ((NTSTATUS)0xC0000215L)
+#define STATUS_NOT_SERVER_SESSION ((NTSTATUS)0xC0000216L)
+#define STATUS_NOT_CLIENT_SESSION ((NTSTATUS)0xC0000217L)
+#define STATUS_CANNOT_LOAD_REGISTRY_FILE ((NTSTATUS)0xC0000218L)
+#define STATUS_DEBUG_ATTACH_FAILED ((NTSTATUS)0xC0000219L)
+#define STATUS_SYSTEM_PROCESS_TERMINATED ((NTSTATUS)0xC000021AL)
+#define STATUS_DATA_NOT_ACCEPTED ((NTSTATUS)0xC000021BL)
+#define STATUS_NO_BROWSER_SERVERS_FOUND ((NTSTATUS)0xC000021CL)
+#define STATUS_VDM_HARD_ERROR ((NTSTATUS)0xC000021DL)
+#define STATUS_DRIVER_CANCEL_TIMEOUT ((NTSTATUS)0xC000021EL)
+#define STATUS_REPLY_MESSAGE_MISMATCH ((NTSTATUS)0xC000021FL)
+#define STATUS_MAPPED_ALIGNMENT ((NTSTATUS)0xC0000220L)
+#define STATUS_IMAGE_CHECKSUM_MISMATCH ((NTSTATUS)0xC0000221L)
+#define STATUS_LOST_WRITEBEHIND_DATA ((NTSTATUS)0xC0000222L)
+#define STATUS_CLIENT_SERVER_PARAMETERS_INVALID ((NTSTATUS)0xC0000223L)
+#define STATUS_PASSWORD_MUST_CHANGE ((NTSTATUS)0xC0000224L)
+#define STATUS_NOT_FOUND ((NTSTATUS)0xC0000225L)
+#define STATUS_NOT_TINY_STREAM ((NTSTATUS)0xC0000226L)
+#define STATUS_RECOVERY_FAILURE ((NTSTATUS)0xC0000227L)
+#define STATUS_STACK_OVERFLOW_READ ((NTSTATUS)0xC0000228L)
+#define STATUS_FAIL_CHECK ((NTSTATUS)0xC0000229L)
+#define STATUS_DUPLICATE_OBJECTID ((NTSTATUS)0xC000022AL)
+#define STATUS_OBJECTID_EXISTS ((NTSTATUS)0xC000022BL)
+#define STATUS_CONVERT_TO_LARGE ((NTSTATUS)0xC000022CL)
+#define STATUS_RETRY ((NTSTATUS)0xC000022DL)
+#define STATUS_FOUND_OUT_OF_SCOPE ((NTSTATUS)0xC000022EL)
+#define STATUS_ALLOCATE_BUCKET ((NTSTATUS)0xC000022FL)
+#define STATUS_PROPSET_NOT_FOUND ((NTSTATUS)0xC0000230L)
+#define STATUS_MARSHALL_OVERFLOW ((NTSTATUS)0xC0000231L)
+#define STATUS_INVALID_VARIANT ((NTSTATUS)0xC0000232L)
+#define STATUS_DOMAIN_CONTROLLER_NOT_FOUND ((NTSTATUS)0xC0000233L)
+#define STATUS_ACCOUNT_LOCKED_OUT ((NTSTATUS)0xC0000234L)
+#define STATUS_HANDLE_NOT_CLOSABLE ((NTSTATUS)0xC0000235L)
+#define STATUS_CONNECTION_REFUSED ((NTSTATUS)0xC0000236L)
+#define STATUS_GRACEFUL_DISCONNECT ((NTSTATUS)0xC0000237L)
+#define STATUS_ADDRESS_ALREADY_ASSOCIATED ((NTSTATUS)0xC0000238L)
+#define STATUS_ADDRESS_NOT_ASSOCIATED ((NTSTATUS)0xC0000239L)
+#define STATUS_CONNECTION_INVALID ((NTSTATUS)0xC000023AL)
+#define STATUS_CONNECTION_ACTIVE ((NTSTATUS)0xC000023BL)
+#define STATUS_NETWORK_UNREACHABLE ((NTSTATUS)0xC000023CL)
+#define STATUS_HOST_UNREACHABLE ((NTSTATUS)0xC000023DL)
+#define STATUS_PROTOCOL_UNREACHABLE ((NTSTATUS)0xC000023EL)
+#define STATUS_PORT_UNREACHABLE ((NTSTATUS)0xC000023FL)
+#define STATUS_REQUEST_ABORTED ((NTSTATUS)0xC0000240L)
+#define STATUS_CONNECTION_ABORTED ((NTSTATUS)0xC0000241L)
+#define STATUS_BAD_COMPRESSION_BUFFER ((NTSTATUS)0xC0000242L)
+#define STATUS_USER_MAPPED_FILE ((NTSTATUS)0xC0000243L)
+#define STATUS_AUDIT_FAILED ((NTSTATUS)0xC0000244L)
+#define STATUS_TIMER_RESOLUTION_NOT_SET ((NTSTATUS)0xC0000245L)
+#define STATUS_CONNECTION_COUNT_LIMIT ((NTSTATUS)0xC0000246L)
+#define STATUS_LOGIN_TIME_RESTRICTION ((NTSTATUS)0xC0000247L)
+#define STATUS_LOGIN_WKSTA_RESTRICTION ((NTSTATUS)0xC0000248L)
+#define STATUS_IMAGE_MP_UP_MISMATCH ((NTSTATUS)0xC0000249L)
+#define STATUS_INSUFFICIENT_LOGON_INFO ((NTSTATUS)0xC0000250L)
+#define STATUS_BAD_DLL_ENTRYPOINT ((NTSTATUS)0xC0000251L)
+#define STATUS_BAD_SERVICE_ENTRYPOINT ((NTSTATUS)0xC0000252L)
+#define STATUS_LPC_REPLY_LOST ((NTSTATUS)0xC0000253L)
+#define STATUS_IP_ADDRESS_CONFLICT1 ((NTSTATUS)0xC0000254L)
+#define STATUS_IP_ADDRESS_CONFLICT2 ((NTSTATUS)0xC0000255L)
+#define STATUS_REGISTRY_QUOTA_LIMIT ((NTSTATUS)0xC0000256L)
+#define STATUS_PATH_NOT_COVERED ((NTSTATUS)0xC0000257L)
+#define STATUS_NO_CALLBACK_ACTIVE ((NTSTATUS)0xC0000258L)
+#define STATUS_LICENSE_QUOTA_EXCEEDED ((NTSTATUS)0xC0000259L)
+#define STATUS_PWD_TOO_SHORT ((NTSTATUS)0xC000025AL)
+#define STATUS_PWD_TOO_RECENT ((NTSTATUS)0xC000025BL)
+#define STATUS_PWD_HISTORY_CONFLICT ((NTSTATUS)0xC000025CL)
+#define STATUS_PLUGPLAY_NO_DEVICE ((NTSTATUS)0xC000025EL)
+#define STATUS_UNSUPPORTED_COMPRESSION ((NTSTATUS)0xC000025FL)
+#define STATUS_INVALID_HW_PROFILE ((NTSTATUS)0xC0000260L)
+#define STATUS_INVALID_PLUGPLAY_DEVICE_PATH ((NTSTATUS)0xC0000261L)
+#define STATUS_DRIVER_ORDINAL_NOT_FOUND ((NTSTATUS)0xC0000262L)
+#define STATUS_DRIVER_ENTRYPOINT_NOT_FOUND ((NTSTATUS)0xC0000263L)
+#define STATUS_RESOURCE_NOT_OWNED ((NTSTATUS)0xC0000264L)
+#define STATUS_TOO_MANY_LINKS ((NTSTATUS)0xC0000265L)
+#define STATUS_QUOTA_LIST_INCONSISTENT ((NTSTATUS)0xC0000266L)
+#define STATUS_FILE_IS_OFFLINE ((NTSTATUS)0xC0000267L)
+#define STATUS_EVALUATION_EXPIRATION ((NTSTATUS)0xC0000268L)
+#define STATUS_ILLEGAL_DLL_RELOCATION ((NTSTATUS)0xC0000269L)
+#define STATUS_LICENSE_VIOLATION ((NTSTATUS)0xC000026AL)
+#define STATUS_DLL_INIT_FAILED_LOGOFF ((NTSTATUS)0xC000026BL)
+#define STATUS_DRIVER_UNABLE_TO_LOAD ((NTSTATUS)0xC000026CL)
+#define STATUS_DFS_UNAVAILABLE ((NTSTATUS)0xC000026DL)
+#define STATUS_VOLUME_DISMOUNTED ((NTSTATUS)0xC000026EL)
+#define STATUS_WX86_INTERNAL_ERROR ((NTSTATUS)0xC000026FL)
+#define STATUS_WX86_FLOAT_STACK_CHECK ((NTSTATUS)0xC0000270L)
+#define STATUS_VALIDATE_CONTINUE ((NTSTATUS)0xC0000271L)
+#define STATUS_NO_MATCH ((NTSTATUS)0xC0000272L)
+#define STATUS_NO_MORE_MATCHES ((NTSTATUS)0xC0000273L)
+#define STATUS_NOT_A_REPARSE_POINT ((NTSTATUS)0xC0000275L)
+#define STATUS_IO_REPARSE_TAG_INVALID ((NTSTATUS)0xC0000276L)
+#define STATUS_IO_REPARSE_TAG_MISMATCH ((NTSTATUS)0xC0000277L)
+#define STATUS_IO_REPARSE_DATA_INVALID ((NTSTATUS)0xC0000278L)
+#define STATUS_IO_REPARSE_TAG_NOT_HANDLED ((NTSTATUS)0xC0000279L)
+#define STATUS_REPARSE_POINT_NOT_RESOLVED ((NTSTATUS)0xC0000280L)
+#define STATUS_DIRECTORY_IS_A_REPARSE_POINT ((NTSTATUS)0xC0000281L)
+#define STATUS_RANGE_LIST_CONFLICT ((NTSTATUS)0xC0000282L)
+#define STATUS_SOURCE_ELEMENT_EMPTY ((NTSTATUS)0xC0000283L)
+#define STATUS_DESTINATION_ELEMENT_FULL ((NTSTATUS)0xC0000284L)
+#define STATUS_ILLEGAL_ELEMENT_ADDRESS ((NTSTATUS)0xC0000285L)
+#define STATUS_MAGAZINE_NOT_PRESENT ((NTSTATUS)0xC0000286L)
+#define STATUS_REINITIALIZATION_NEEDED ((NTSTATUS)0xC0000287L)
+#define STATUS_DEVICE_REQUIRES_CLEANING ((NTSTATUS)0x80000288L)
+#define STATUS_DEVICE_DOOR_OPEN ((NTSTATUS)0x80000289L)
+#define STATUS_ENCRYPTION_FAILED ((NTSTATUS)0xC000028AL)
+#define STATUS_DECRYPTION_FAILED ((NTSTATUS)0xC000028BL)
+#define STATUS_RANGE_NOT_FOUND ((NTSTATUS)0xC000028CL)
+#define STATUS_NO_RECOVERY_POLICY ((NTSTATUS)0xC000028DL)
+#define STATUS_NO_EFS ((NTSTATUS)0xC000028EL)
+#define STATUS_WRONG_EFS ((NTSTATUS)0xC000028FL)
+#define STATUS_NO_USER_KEYS ((NTSTATUS)0xC0000290L)
+#define STATUS_FILE_NOT_ENCRYPTED ((NTSTATUS)0xC0000291L)
+#define STATUS_NOT_EXPORT_FORMAT ((NTSTATUS)0xC0000292L)
+#define STATUS_FILE_ENCRYPTED ((NTSTATUS)0xC0000293L)
+#define STATUS_WAKE_SYSTEM ((NTSTATUS)0x40000294L)
+#define STATUS_WMI_GUID_NOT_FOUND ((NTSTATUS)0xC0000295L)
+#define STATUS_WMI_INSTANCE_NOT_FOUND ((NTSTATUS)0xC0000296L)
+#define STATUS_WMI_ITEMID_NOT_FOUND ((NTSTATUS)0xC0000297L)
+#define STATUS_WMI_TRY_AGAIN ((NTSTATUS)0xC0000298L)
+#define STATUS_SHARED_POLICY ((NTSTATUS)0xC0000299L)
+#define STATUS_POLICY_OBJECT_NOT_FOUND ((NTSTATUS)0xC000029AL)
+#define STATUS_POLICY_ONLY_IN_DS ((NTSTATUS)0xC000029BL)
+#define STATUS_VOLUME_NOT_UPGRADED ((NTSTATUS)0xC000029CL)
+#define STATUS_REMOTE_STORAGE_NOT_ACTIVE ((NTSTATUS)0xC000029DL)
+#define STATUS_REMOTE_STORAGE_MEDIA_ERROR ((NTSTATUS)0xC000029EL)
+#define STATUS_NO_TRACKING_SERVICE ((NTSTATUS)0xC000029FL)
+#define STATUS_SERVER_SID_MISMATCH ((NTSTATUS)0xC00002A0L)
+#define STATUS_DS_NO_ATTRIBUTE_OR_VALUE ((NTSTATUS)0xC00002A1L)
+#define STATUS_DS_INVALID_ATTRIBUTE_SYNTAX ((NTSTATUS)0xC00002A2L)
+#define STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED ((NTSTATUS)0xC00002A3L)
+#define STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS ((NTSTATUS)0xC00002A4L)
+#define STATUS_DS_BUSY ((NTSTATUS)0xC00002A5L)
+#define STATUS_DS_UNAVAILABLE ((NTSTATUS)0xC00002A6L)
+#define STATUS_DS_NO_RIDS_ALLOCATED ((NTSTATUS)0xC00002A7L)
+#define STATUS_DS_NO_MORE_RIDS ((NTSTATUS)0xC00002A8L)
+#define STATUS_DS_INCORRECT_ROLE_OWNER ((NTSTATUS)0xC00002A9L)
+#define STATUS_DS_RIDMGR_INIT_ERROR ((NTSTATUS)0xC00002AAL)
+#define STATUS_DS_OBJ_CLASS_VIOLATION ((NTSTATUS)0xC00002ABL)
+#define STATUS_DS_CANT_ON_NON_LEAF ((NTSTATUS)0xC00002ACL)
+#define STATUS_DS_CANT_ON_RDN ((NTSTATUS)0xC00002ADL)
+#define STATUS_DS_CANT_MOD_OBJ_CLASS ((NTSTATUS)0xC00002AEL)
+#define STATUS_DS_CROSS_DOM_MOVE_FAILED ((NTSTATUS)0xC00002AFL)
+#define STATUS_DS_GC_NOT_AVAILABLE ((NTSTATUS)0xC00002B0L)
+#define STATUS_DIRECTORY_SERVICE_REQUIRED ((NTSTATUS)0xC00002B1L)
+#define STATUS_REPARSE_ATTRIBUTE_CONFLICT ((NTSTATUS)0xC00002B2L)
+#define STATUS_CANT_ENABLE_DENY_ONLY ((NTSTATUS)0xC00002B3L)
+#define STATUS_FLOAT_MULTIPLE_FAULTS ((NTSTATUS)0xC00002B4L)
+#define STATUS_FLOAT_MULTIPLE_TRAPS ((NTSTATUS)0xC00002B5L)
+#define STATUS_DEVICE_REMOVED ((NTSTATUS)0xC00002B6L)
+#define STATUS_JOURNAL_DELETE_IN_PROGRESS ((NTSTATUS)0xC00002B7L)
+#define STATUS_JOURNAL_NOT_ACTIVE ((NTSTATUS)0xC00002B8L)
+#define STATUS_NOINTERFACE ((NTSTATUS)0xC00002B9L)
+#define STATUS_DS_ADMIN_LIMIT_EXCEEDED ((NTSTATUS)0xC00002C1L)
+#define STATUS_DRIVER_FAILED_SLEEP ((NTSTATUS)0xC00002C2L)
+#define STATUS_MUTUAL_AUTHENTICATION_FAILED ((NTSTATUS)0xC00002C3L)
+#define STATUS_CORRUPT_SYSTEM_FILE ((NTSTATUS)0xC00002C4L)
+#define STATUS_DATATYPE_MISALIGNMENT_ERROR ((NTSTATUS)0xC00002C5L)
+#define STATUS_WMI_READ_ONLY ((NTSTATUS)0xC00002C6L)
+#define STATUS_WMI_SET_FAILURE ((NTSTATUS)0xC00002C7L)
+#define STATUS_COMMITMENT_MINIMUM ((NTSTATUS)0xC00002C8L)
+#define STATUS_REG_NAT_CONSUMPTION ((NTSTATUS)0xC00002C9L)
+#define STATUS_TRANSPORT_FULL ((NTSTATUS)0xC00002CAL)
+#define STATUS_DS_SAM_INIT_FAILURE ((NTSTATUS)0xC00002CBL)
+#define STATUS_ONLY_IF_CONNECTED ((NTSTATUS)0xC00002CCL)
+#define STATUS_DS_SENSITIVE_GROUP_VIOLATION ((NTSTATUS)0xC00002CDL)
+#define STATUS_PNP_RESTART_ENUMERATION ((NTSTATUS)0xC00002CEL)
+#define STATUS_JOURNAL_ENTRY_DELETED ((NTSTATUS)0xC00002CFL)
+#define STATUS_DS_CANT_MOD_PRIMARYGROUPID ((NTSTATUS)0xC00002D0L)
+#define STATUS_SYSTEM_IMAGE_BAD_SIGNATURE ((NTSTATUS)0xC00002D1L)
+#define STATUS_PNP_REBOOT_REQUIRED ((NTSTATUS)0xC00002D2L)
+#define STATUS_POWER_STATE_INVALID ((NTSTATUS)0xC00002D3L)
+#define STATUS_DS_INVALID_GROUP_TYPE ((NTSTATUS)0xC00002D4L)
+#define STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN ((NTSTATUS)0xC00002D5L)
+#define STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN ((NTSTATUS)0xC00002D6L)
+#define STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS)0xC00002D7L)
+#define STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS)0xC00002D8L)
+#define STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS)0xC00002D9L)
+#define STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER ((NTSTATUS)0xC00002DAL)
+#define STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER ((NTSTATUS)0xC00002DBL)
+#define STATUS_DS_HAVE_PRIMARY_MEMBERS ((NTSTATUS)0xC00002DCL)
+#define STATUS_WMI_NOT_SUPPORTED ((NTSTATUS)0xC00002DDL)
+#define STATUS_INSUFFICIENT_POWER ((NTSTATUS)0xC00002DEL)
+#define STATUS_SAM_NEED_BOOTKEY_PASSWORD ((NTSTATUS)0xC00002DFL)
+#define STATUS_SAM_NEED_BOOTKEY_FLOPPY ((NTSTATUS)0xC00002E0L)
+#define STATUS_DS_CANT_START ((NTSTATUS)0xC00002E1L)
+#define STATUS_DS_INIT_FAILURE ((NTSTATUS)0xC00002E2L)
+#define STATUS_SAM_INIT_FAILURE ((NTSTATUS)0xC00002E3L)
+#define STATUS_DS_GC_REQUIRED ((NTSTATUS)0xC00002E4L)
+#define STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY ((NTSTATUS)0xC00002E5L)
+#define STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS ((NTSTATUS)0xC00002E6L)
+#define STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED ((NTSTATUS)0xC00002E7L)
+#define STATUS_MULTIPLE_FAULT_VIOLATION ((NTSTATUS)0xC00002E8L)
+#define STATUS_CURRENT_DOMAIN_NOT_ALLOWED ((NTSTATUS)0xC00002E9L)
+#define STATUS_CANNOT_MAKE ((NTSTATUS)0xC00002EAL)
+#define STATUS_SYSTEM_SHUTDOWN ((NTSTATUS)0xC00002EBL)
+#define STATUS_DS_INIT_FAILURE_CONSOLE ((NTSTATUS)0xC00002ECL)
+#define STATUS_DS_SAM_INIT_FAILURE_CONSOLE ((NTSTATUS)0xC00002EDL)
+#define STATUS_UNFINISHED_CONTEXT_DELETED ((NTSTATUS)0xC00002EEL)
+#define STATUS_NO_TGT_REPLY ((NTSTATUS)0xC00002EFL)
+#define STATUS_OBJECTID_NOT_FOUND ((NTSTATUS)0xC00002F0L)
+#define STATUS_NO_IP_ADDRESSES ((NTSTATUS)0xC00002F1L)
+#define STATUS_WRONG_CREDENTIAL_HANDLE ((NTSTATUS)0xC00002F2L)
+#define STATUS_CRYPTO_SYSTEM_INVALID ((NTSTATUS)0xC00002F3L)
+#define STATUS_MAX_REFERRALS_EXCEEDED ((NTSTATUS)0xC00002F4L)
+#define STATUS_MUST_BE_KDC ((NTSTATUS)0xC00002F5L)
+#define STATUS_STRONG_CRYPTO_NOT_SUPPORTED ((NTSTATUS)0xC00002F6L)
+#define STATUS_TOO_MANY_PRINCIPALS ((NTSTATUS)0xC00002F7L)
+#define STATUS_NO_PA_DATA ((NTSTATUS)0xC00002F8L)
+#define STATUS_PKINIT_NAME_MISMATCH ((NTSTATUS)0xC00002F9L)
+#define STATUS_SMARTCARD_LOGON_REQUIRED ((NTSTATUS)0xC00002FAL)
+#define STATUS_KDC_INVALID_REQUEST ((NTSTATUS)0xC00002FBL)
+#define STATUS_KDC_UNABLE_TO_REFER ((NTSTATUS)0xC00002FCL)
+#define STATUS_KDC_UNKNOWN_ETYPE ((NTSTATUS)0xC00002FDL)
+#define STATUS_SHUTDOWN_IN_PROGRESS ((NTSTATUS)0xC00002FEL)
+#define STATUS_SERVER_SHUTDOWN_IN_PROGRESS ((NTSTATUS)0xC00002FFL)
+#define STATUS_NOT_SUPPORTED_ON_SBS ((NTSTATUS)0xC0000300L)
+#define STATUS_WMI_GUID_DISCONNECTED ((NTSTATUS)0xC0000301L)
+#define STATUS_WMI_ALREADY_DISABLED ((NTSTATUS)0xC0000302L)
+#define STATUS_WMI_ALREADY_ENABLED ((NTSTATUS)0xC0000303L)
+#define STATUS_MFT_TOO_FRAGMENTED ((NTSTATUS)0xC0000304L)
+#define STATUS_COPY_PROTECTION_FAILURE ((NTSTATUS)0xC0000305L)
+#define STATUS_CSS_AUTHENTICATION_FAILURE ((NTSTATUS)0xC0000306L)
+#define STATUS_CSS_KEY_NOT_PRESENT ((NTSTATUS)0xC0000307L)
+#define STATUS_CSS_KEY_NOT_ESTABLISHED ((NTSTATUS)0xC0000308L)
+#define STATUS_CSS_SCRAMBLED_SECTOR ((NTSTATUS)0xC0000309L)
+#define STATUS_CSS_REGION_MISMATCH ((NTSTATUS)0xC000030AL)
+#define STATUS_CSS_RESETS_EXHAUSTED ((NTSTATUS)0xC000030BL)
+#define STATUS_PKINIT_FAILURE ((NTSTATUS)0xC0000320L)
+#define STATUS_SMARTCARD_SUBSYSTEM_FAILURE ((NTSTATUS)0xC0000321L)
+#define STATUS_NO_KERB_KEY ((NTSTATUS)0xC0000322L)
+#define STATUS_HOST_DOWN ((NTSTATUS)0xC0000350L)
+#define STATUS_UNSUPPORTED_PREAUTH ((NTSTATUS)0xC0000351L)
+#define STATUS_EFS_ALG_BLOB_TOO_BIG ((NTSTATUS)0xC0000352L)
+#define STATUS_PORT_NOT_SET ((NTSTATUS)0xC0000353L)
+#define STATUS_DEBUGGER_INACTIVE ((NTSTATUS)0xC0000354L)
+#define STATUS_DS_VERSION_CHECK_FAILURE ((NTSTATUS)0xC0000355L)
+#define STATUS_AUDITING_DISABLED ((NTSTATUS)0xC0000356L)
+#define STATUS_PRENT4_MACHINE_ACCOUNT ((NTSTATUS)0xC0000357L)
+#define STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS)0xC0000358L)
+#define STATUS_INVALID_IMAGE_WIN_32 ((NTSTATUS)0xC0000359L)
+#define STATUS_INVALID_IMAGE_WIN_64 ((NTSTATUS)0xC000035AL)
+#define STATUS_BAD_BINDINGS ((NTSTATUS)0xC000035BL)
+#define STATUS_NETWORK_SESSION_EXPIRED ((NTSTATUS)0xC000035CL)
+#define STATUS_APPHELP_BLOCK ((NTSTATUS)0xC000035DL)
+#define STATUS_ALL_SIDS_FILTERED ((NTSTATUS)0xC000035EL)
+#define STATUS_NOT_SAFE_MODE_DRIVER ((NTSTATUS)0xC000035FL)
+#define STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT ((NTSTATUS)0xC0000361L)
+#define STATUS_ACCESS_DISABLED_BY_POLICY_PATH ((NTSTATUS)0xC0000362L)
+#define STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER ((NTSTATUS)0xC0000363L)
+#define STATUS_ACCESS_DISABLED_BY_POLICY_OTHER ((NTSTATUS)0xC0000364L)
+#define STATUS_FAILED_DRIVER_ENTRY ((NTSTATUS)0xC0000365L)
+#define STATUS_DEVICE_ENUMERATION_ERROR ((NTSTATUS)0xC0000366L)
+#define STATUS_WAIT_FOR_OPLOCK ((NTSTATUS)0x00000367L)
+#define STATUS_MOUNT_POINT_NOT_RESOLVED ((NTSTATUS)0xC0000368L)
+#define STATUS_INVALID_DEVICE_OBJECT_PARAMETER ((NTSTATUS)0xC0000369L)
+#define STATUS_MCA_OCCURED ((NTSTATUS)0xC000036AL)
+#define STATUS_DRIVER_BLOCKED_CRITICAL ((NTSTATUS)0xC000036BL)
+#define STATUS_DRIVER_BLOCKED ((NTSTATUS)0xC000036CL)
+#define STATUS_DRIVER_DATABASE_ERROR ((NTSTATUS)0xC000036DL)
+#define STATUS_SYSTEM_HIVE_TOO_LARGE ((NTSTATUS)0xC000036EL)
+#define STATUS_INVALID_IMPORT_OF_NON_DLL ((NTSTATUS)0xC000036FL)
+#define STATUS_DS_SHUTTING_DOWN ((NTSTATUS)0x40000370L)
+#define STATUS_SMARTCARD_WRONG_PIN ((NTSTATUS)0xC0000380L)
+#define STATUS_SMARTCARD_CARD_BLOCKED ((NTSTATUS)0xC0000381L)
+#define STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED ((NTSTATUS)0xC0000382L)
+#define STATUS_SMARTCARD_NO_CARD ((NTSTATUS)0xC0000383L)
+#define STATUS_SMARTCARD_NO_KEY_CONTAINER ((NTSTATUS)0xC0000384L)
+#define STATUS_SMARTCARD_NO_CERTIFICATE ((NTSTATUS)0xC0000385L)
+#define STATUS_SMARTCARD_NO_KEYSET ((NTSTATUS)0xC0000386L)
+#define STATUS_SMARTCARD_IO_ERROR ((NTSTATUS)0xC0000387L)
+#define STATUS_DOWNGRADE_DETECTED ((NTSTATUS)0xC0000388L)
+#define STATUS_SMARTCARD_CERT_REVOKED ((NTSTATUS)0xC0000389L)
+#define STATUS_ISSUING_CA_UNTRUSTED ((NTSTATUS)0xC000038AL)
+#define STATUS_REVOCATION_OFFLINE_C ((NTSTATUS)0xC000038BL)
+#define STATUS_PKINIT_CLIENT_FAILURE ((NTSTATUS)0xC000038CL)
+#define STATUS_SMARTCARD_CERT_EXPIRED ((NTSTATUS)0xC000038DL)
+#define STATUS_DRIVER_FAILED_PRIOR_UNLOAD ((NTSTATUS)0xC000038EL)
+#define STATUS_ASSERTION_FAILURE ((NTSTATUS)0xC0000420L)
+#define STATUS_CALLBACK_POP_STACK ((NTSTATUS)0xC0000423L)
+#define STATUS_WOW_ASSERTION ((NTSTATUS)0xC0009898L)
+#define RPC_NT_INVALID_STRING_BINDING ((NTSTATUS)0xC0020001L)
+#define RPC_NT_WRONG_KIND_OF_BINDING ((NTSTATUS)0xC0020002L)
+#define RPC_NT_INVALID_BINDING ((NTSTATUS)0xC0020003L)
+#define RPC_NT_PROTSEQ_NOT_SUPPORTED ((NTSTATUS)0xC0020004L)
+#define RPC_NT_INVALID_RPC_PROTSEQ ((NTSTATUS)0xC0020005L)
+#define RPC_NT_INVALID_STRING_UUID ((NTSTATUS)0xC0020006L)
+#define RPC_NT_INVALID_ENDPOINT_FORMAT ((NTSTATUS)0xC0020007L)
+#define RPC_NT_INVALID_NET_ADDR ((NTSTATUS)0xC0020008L)
+#define RPC_NT_NO_ENDPOINT_FOUND ((NTSTATUS)0xC0020009L)
+#define RPC_NT_INVALID_TIMEOUT ((NTSTATUS)0xC002000AL)
+#define RPC_NT_OBJECT_NOT_FOUND ((NTSTATUS)0xC002000BL)
+#define RPC_NT_ALREADY_REGISTERED ((NTSTATUS)0xC002000CL)
+#define RPC_NT_TYPE_ALREADY_REGISTERED ((NTSTATUS)0xC002000DL)
+#define RPC_NT_ALREADY_LISTENING ((NTSTATUS)0xC002000EL)
+#define RPC_NT_NO_PROTSEQS_REGISTERED ((NTSTATUS)0xC002000FL)
+#define RPC_NT_NOT_LISTENING ((NTSTATUS)0xC0020010L)
+#define RPC_NT_UNKNOWN_MGR_TYPE ((NTSTATUS)0xC0020011L)
+#define RPC_NT_UNKNOWN_IF ((NTSTATUS)0xC0020012L)
+#define RPC_NT_NO_BINDINGS ((NTSTATUS)0xC0020013L)
+#define RPC_NT_NO_PROTSEQS ((NTSTATUS)0xC0020014L)
+#define RPC_NT_CANT_CREATE_ENDPOINT ((NTSTATUS)0xC0020015L)
+#define RPC_NT_OUT_OF_RESOURCES ((NTSTATUS)0xC0020016L)
+#define RPC_NT_SERVER_UNAVAILABLE ((NTSTATUS)0xC0020017L)
+#define RPC_NT_SERVER_TOO_BUSY ((NTSTATUS)0xC0020018L)
+#define RPC_NT_INVALID_NETWORK_OPTIONS ((NTSTATUS)0xC0020019L)
+#define RPC_NT_NO_CALL_ACTIVE ((NTSTATUS)0xC002001AL)
+#define RPC_NT_CALL_FAILED ((NTSTATUS)0xC002001BL)
+#define RPC_NT_CALL_FAILED_DNE ((NTSTATUS)0xC002001CL)
+#define RPC_NT_PROTOCOL_ERROR ((NTSTATUS)0xC002001DL)
+#define RPC_NT_UNSUPPORTED_TRANS_SYN ((NTSTATUS)0xC002001FL)
+#define RPC_NT_UNSUPPORTED_TYPE ((NTSTATUS)0xC0020021L)
+#define RPC_NT_INVALID_TAG ((NTSTATUS)0xC0020022L)
+#define RPC_NT_INVALID_BOUND ((NTSTATUS)0xC0020023L)
+#define RPC_NT_NO_ENTRY_NAME ((NTSTATUS)0xC0020024L)
+#define RPC_NT_INVALID_NAME_SYNTAX ((NTSTATUS)0xC0020025L)
+#define RPC_NT_UNSUPPORTED_NAME_SYNTAX ((NTSTATUS)0xC0020026L)
+#define RPC_NT_UUID_NO_ADDRESS ((NTSTATUS)0xC0020028L)
+#define RPC_NT_DUPLICATE_ENDPOINT ((NTSTATUS)0xC0020029L)
+#define RPC_NT_UNKNOWN_AUTHN_TYPE ((NTSTATUS)0xC002002AL)
+#define RPC_NT_MAX_CALLS_TOO_SMALL ((NTSTATUS)0xC002002BL)
+#define RPC_NT_STRING_TOO_LONG ((NTSTATUS)0xC002002CL)
+#define RPC_NT_PROTSEQ_NOT_FOUND ((NTSTATUS)0xC002002DL)
+#define RPC_NT_PROCNUM_OUT_OF_RANGE ((NTSTATUS)0xC002002EL)
+#define RPC_NT_BINDING_HAS_NO_AUTH ((NTSTATUS)0xC002002FL)
+#define RPC_NT_UNKNOWN_AUTHN_SERVICE ((NTSTATUS)0xC0020030L)
+#define RPC_NT_UNKNOWN_AUTHN_LEVEL ((NTSTATUS)0xC0020031L)
+#define RPC_NT_INVALID_AUTH_IDENTITY ((NTSTATUS)0xC0020032L)
+#define RPC_NT_UNKNOWN_AUTHZ_SERVICE ((NTSTATUS)0xC0020033L)
+#define EPT_NT_INVALID_ENTRY ((NTSTATUS)0xC0020034L)
+#define EPT_NT_CANT_PERFORM_OP ((NTSTATUS)0xC0020035L)
+#define EPT_NT_NOT_REGISTERED ((NTSTATUS)0xC0020036L)
+#define RPC_NT_NOTHING_TO_EXPORT ((NTSTATUS)0xC0020037L)
+#define RPC_NT_INCOMPLETE_NAME ((NTSTATUS)0xC0020038L)
+#define RPC_NT_INVALID_VERS_OPTION ((NTSTATUS)0xC0020039L)
+#define RPC_NT_NO_MORE_MEMBERS ((NTSTATUS)0xC002003AL)
+#define RPC_NT_NOT_ALL_OBJS_UNEXPORTED ((NTSTATUS)0xC002003BL)
+#define RPC_NT_INTERFACE_NOT_FOUND ((NTSTATUS)0xC002003CL)
+#define RPC_NT_ENTRY_ALREADY_EXISTS ((NTSTATUS)0xC002003DL)
+#define RPC_NT_ENTRY_NOT_FOUND ((NTSTATUS)0xC002003EL)
+#define RPC_NT_NAME_SERVICE_UNAVAILABLE ((NTSTATUS)0xC002003FL)
+#define RPC_NT_INVALID_NAF_ID ((NTSTATUS)0xC0020040L)
+#define RPC_NT_CANNOT_SUPPORT ((NTSTATUS)0xC0020041L)
+#define RPC_NT_NO_CONTEXT_AVAILABLE ((NTSTATUS)0xC0020042L)
+#define RPC_NT_INTERNAL_ERROR ((NTSTATUS)0xC0020043L)
+#define RPC_NT_ZERO_DIVIDE ((NTSTATUS)0xC0020044L)
+#define RPC_NT_ADDRESS_ERROR ((NTSTATUS)0xC0020045L)
+#define RPC_NT_FP_DIV_ZERO ((NTSTATUS)0xC0020046L)
+#define RPC_NT_FP_UNDERFLOW ((NTSTATUS)0xC0020047L)
+#define RPC_NT_FP_OVERFLOW ((NTSTATUS)0xC0020048L)
+#define RPC_NT_NO_MORE_ENTRIES ((NTSTATUS)0xC0030001L)
+#define RPC_NT_SS_CHAR_TRANS_OPEN_FAIL ((NTSTATUS)0xC0030002L)
+#define RPC_NT_SS_CHAR_TRANS_SHORT_FILE ((NTSTATUS)0xC0030003L)
+#define RPC_NT_SS_IN_NULL_CONTEXT ((NTSTATUS)0xC0030004L)
+#define RPC_NT_SS_CONTEXT_MISMATCH ((NTSTATUS)0xC0030005L)
+#define RPC_NT_SS_CONTEXT_DAMAGED ((NTSTATUS)0xC0030006L)
+#define RPC_NT_SS_HANDLES_MISMATCH ((NTSTATUS)0xC0030007L)
+#define RPC_NT_SS_CANNOT_GET_CALL_HANDLE ((NTSTATUS)0xC0030008L)
+#define RPC_NT_NULL_REF_POINTER ((NTSTATUS)0xC0030009L)
+#define RPC_NT_ENUM_VALUE_OUT_OF_RANGE ((NTSTATUS)0xC003000AL)
+#define RPC_NT_BYTE_COUNT_TOO_SMALL ((NTSTATUS)0xC003000BL)
+#define RPC_NT_BAD_STUB_DATA ((NTSTATUS)0xC003000CL)
+#define RPC_NT_CALL_IN_PROGRESS ((NTSTATUS)0xC0020049L)
+#define RPC_NT_NO_MORE_BINDINGS ((NTSTATUS)0xC002004AL)
+#define RPC_NT_GROUP_MEMBER_NOT_FOUND ((NTSTATUS)0xC002004BL)
+#define EPT_NT_CANT_CREATE ((NTSTATUS)0xC002004CL)
+#define RPC_NT_INVALID_OBJECT ((NTSTATUS)0xC002004DL)
+#define RPC_NT_NO_INTERFACES ((NTSTATUS)0xC002004FL)
+#define RPC_NT_CALL_CANCELLED ((NTSTATUS)0xC0020050L)
+#define RPC_NT_BINDING_INCOMPLETE ((NTSTATUS)0xC0020051L)
+#define RPC_NT_COMM_FAILURE ((NTSTATUS)0xC0020052L)
+#define RPC_NT_UNSUPPORTED_AUTHN_LEVEL ((NTSTATUS)0xC0020053L)
+#define RPC_NT_NO_PRINC_NAME ((NTSTATUS)0xC0020054L)
+#define RPC_NT_NOT_RPC_ERROR ((NTSTATUS)0xC0020055L)
+#define RPC_NT_UUID_LOCAL_ONLY ((NTSTATUS)0x40020056L)
+#define RPC_NT_SEC_PKG_ERROR ((NTSTATUS)0xC0020057L)
+#define RPC_NT_NOT_CANCELLED ((NTSTATUS)0xC0020058L)
+#define RPC_NT_INVALID_ES_ACTION ((NTSTATUS)0xC0030059L)
+#define RPC_NT_WRONG_ES_VERSION ((NTSTATUS)0xC003005AL)
+#define RPC_NT_WRONG_STUB_VERSION ((NTSTATUS)0xC003005BL)
+#define RPC_NT_INVALID_PIPE_OBJECT ((NTSTATUS)0xC003005CL)
+#define RPC_NT_INVALID_PIPE_OPERATION ((NTSTATUS)0xC003005DL)
+#define RPC_NT_WRONG_PIPE_VERSION ((NTSTATUS)0xC003005EL)
+#define RPC_NT_PIPE_CLOSED ((NTSTATUS)0xC003005FL)
+#define RPC_NT_PIPE_DISCIPLINE_ERROR ((NTSTATUS)0xC0030060L)
+#define RPC_NT_PIPE_EMPTY ((NTSTATUS)0xC0030061L)
+#define RPC_NT_INVALID_ASYNC_HANDLE ((NTSTATUS)0xC0020062L)
+#define RPC_NT_INVALID_ASYNC_CALL ((NTSTATUS)0xC0020063L)
+#define RPC_NT_SEND_INCOMPLETE ((NTSTATUS)0x400200AFL)
+#define STATUS_ACPI_INVALID_OPCODE ((NTSTATUS)0xC0140001L)
+#define STATUS_ACPI_STACK_OVERFLOW ((NTSTATUS)0xC0140002L)
+#define STATUS_ACPI_ASSERT_FAILED ((NTSTATUS)0xC0140003L)
+#define STATUS_ACPI_INVALID_INDEX ((NTSTATUS)0xC0140004L)
+#define STATUS_ACPI_INVALID_ARGUMENT ((NTSTATUS)0xC0140005L)
+#define STATUS_ACPI_FATAL ((NTSTATUS)0xC0140006L)
+#define STATUS_ACPI_INVALID_SUPERNAME ((NTSTATUS)0xC0140007L)
+#define STATUS_ACPI_INVALID_ARGTYPE ((NTSTATUS)0xC0140008L)
+#define STATUS_ACPI_INVALID_OBJTYPE ((NTSTATUS)0xC0140009L)
+#define STATUS_ACPI_INVALID_TARGETTYPE ((NTSTATUS)0xC014000AL)
+#define STATUS_ACPI_INCORRECT_ARGUMENT_COUNT ((NTSTATUS)0xC014000BL)
+#define STATUS_ACPI_ADDRESS_NOT_MAPPED ((NTSTATUS)0xC014000CL)
+#define STATUS_ACPI_INVALID_EVENTTYPE ((NTSTATUS)0xC014000DL)
+#define STATUS_ACPI_HANDLER_COLLISION ((NTSTATUS)0xC014000EL)
+#define STATUS_ACPI_INVALID_DATA ((NTSTATUS)0xC014000FL)
+#define STATUS_ACPI_INVALID_REGION ((NTSTATUS)0xC0140010L)
+#define STATUS_ACPI_INVALID_ACCESS_SIZE ((NTSTATUS)0xC0140011L)
+#define STATUS_ACPI_ACQUIRE_GLOBAL_LOCK ((NTSTATUS)0xC0140012L)
+#define STATUS_ACPI_ALREADY_INITIALIZED ((NTSTATUS)0xC0140013L)
+#define STATUS_ACPI_NOT_INITIALIZED ((NTSTATUS)0xC0140014L)
+#define STATUS_ACPI_INVALID_MUTEX_LEVEL ((NTSTATUS)0xC0140015L)
+#define STATUS_ACPI_MUTEX_NOT_OWNED ((NTSTATUS)0xC0140016L)
+#define STATUS_ACPI_MUTEX_NOT_OWNER ((NTSTATUS)0xC0140017L)
+#define STATUS_ACPI_RS_ACCESS ((NTSTATUS)0xC0140018L)
+#define STATUS_ACPI_INVALID_TABLE ((NTSTATUS)0xC0140019L)
+#define STATUS_ACPI_REG_HANDLER_FAILED ((NTSTATUS)0xC0140020L)
+#define STATUS_ACPI_POWER_REQUEST_FAILED ((NTSTATUS)0xC0140021L)
+#define STATUS_CTX_WINSTATION_NAME_INVALID ((NTSTATUS)0xC00A0001L)
+#define STATUS_CTX_INVALID_PD ((NTSTATUS)0xC00A0002L)
+#define STATUS_CTX_PD_NOT_FOUND ((NTSTATUS)0xC00A0003L)
+#define STATUS_CTX_CDM_CONNECT ((NTSTATUS)0x400A0004L)
+#define STATUS_CTX_CDM_DISCONNECT ((NTSTATUS)0x400A0005L)
+#define STATUS_CTX_CLOSE_PENDING ((NTSTATUS)0xC00A0006L)
+#define STATUS_CTX_NO_OUTBUF ((NTSTATUS)0xC00A0007L)
+#define STATUS_CTX_MODEM_INF_NOT_FOUND ((NTSTATUS)0xC00A0008L)
+#define STATUS_CTX_INVALID_MODEMNAME ((NTSTATUS)0xC00A0009L)
+#define STATUS_CTX_RESPONSE_ERROR ((NTSTATUS)0xC00A000AL)
+#define STATUS_CTX_MODEM_RESPONSE_TIMEOUT ((NTSTATUS)0xC00A000BL)
+#define STATUS_CTX_MODEM_RESPONSE_NO_CARRIER ((NTSTATUS)0xC00A000CL)
+#define STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE ((NTSTATUS)0xC00A000DL)
+#define STATUS_CTX_MODEM_RESPONSE_BUSY ((NTSTATUS)0xC00A000EL)
+#define STATUS_CTX_MODEM_RESPONSE_VOICE ((NTSTATUS)0xC00A000FL)
+#define STATUS_CTX_TD_ERROR ((NTSTATUS)0xC00A0010L)
+#define STATUS_CTX_LICENSE_CLIENT_INVALID ((NTSTATUS)0xC00A0012L)
+#define STATUS_CTX_LICENSE_NOT_AVAILABLE ((NTSTATUS)0xC00A0013L)
+#define STATUS_CTX_LICENSE_EXPIRED ((NTSTATUS)0xC00A0014L)
+#define STATUS_CTX_WINSTATION_NOT_FOUND ((NTSTATUS)0xC00A0015L)
+#define STATUS_CTX_WINSTATION_NAME_COLLISION ((NTSTATUS)0xC00A0016L)
+#define STATUS_CTX_WINSTATION_BUSY ((NTSTATUS)0xC00A0017L)
+#define STATUS_CTX_BAD_VIDEO_MODE ((NTSTATUS)0xC00A0018L)
+#define STATUS_CTX_GRAPHICS_INVALID ((NTSTATUS)0xC00A0022L)
+#define STATUS_CTX_NOT_CONSOLE ((NTSTATUS)0xC00A0024L)
+#define STATUS_CTX_CLIENT_QUERY_TIMEOUT ((NTSTATUS)0xC00A0026L)
+#define STATUS_CTX_CONSOLE_DISCONNECT ((NTSTATUS)0xC00A0027L)
+#define STATUS_CTX_CONSOLE_CONNECT ((NTSTATUS)0xC00A0028L)
+#define STATUS_CTX_SHADOW_DENIED ((NTSTATUS)0xC00A002AL)
+#define STATUS_CTX_WINSTATION_ACCESS_DENIED ((NTSTATUS)0xC00A002BL)
+#define STATUS_CTX_INVALID_WD ((NTSTATUS)0xC00A002EL)
+#define STATUS_CTX_WD_NOT_FOUND ((NTSTATUS)0xC00A002FL)
+#define STATUS_CTX_SHADOW_INVALID ((NTSTATUS)0xC00A0030L)
+#define STATUS_CTX_SHADOW_DISABLED ((NTSTATUS)0xC00A0031L)
+#define STATUS_RDP_PROTOCOL_ERROR ((NTSTATUS)0xC00A0032L)
+#define STATUS_CTX_CLIENT_LICENSE_NOT_SET ((NTSTATUS)0xC00A0033L)
+#define STATUS_CTX_CLIENT_LICENSE_IN_USE ((NTSTATUS)0xC00A0034L)
+#define STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE ((NTSTATUS)0xC00A0035L)
+#define STATUS_CTX_SHADOW_NOT_RUNNING ((NTSTATUS)0xC00A0036L)
+#define STATUS_PNP_BAD_MPS_TABLE ((NTSTATUS)0xC0040035L)
+#define STATUS_PNP_TRANSLATION_FAILED ((NTSTATUS)0xC0040036L)
+#define STATUS_PNP_IRQ_TRANSLATION_FAILED ((NTSTATUS)0xC0040037L)
+#define STATUS_SXS_SECTION_NOT_FOUND ((NTSTATUS)0xC0150001L)
+#define STATUS_SXS_CANT_GEN_ACTCTX ((NTSTATUS)0xC0150002L)
+#define STATUS_SXS_INVALID_ACTCTXDATA_FORMAT ((NTSTATUS)0xC0150003L)
+#define STATUS_SXS_ASSEMBLY_NOT_FOUND ((NTSTATUS)0xC0150004L)
+#define STATUS_SXS_MANIFEST_FORMAT_ERROR ((NTSTATUS)0xC0150005L)
+#define STATUS_SXS_MANIFEST_PARSE_ERROR ((NTSTATUS)0xC0150006L)
+#define STATUS_SXS_ACTIVATION_CONTEXT_DISABLED ((NTSTATUS)0xC0150007L)
+#define STATUS_SXS_KEY_NOT_FOUND ((NTSTATUS)0xC0150008L)
+#define STATUS_SXS_VERSION_CONFLICT ((NTSTATUS)0xC0150009L)
+#define STATUS_SXS_WRONG_SECTION_TYPE ((NTSTATUS)0xC015000AL)
+#define STATUS_SXS_THREAD_QUERIES_DISABLED ((NTSTATUS)0xC015000BL)
+#define STATUS_SXS_ASSEMBLY_MISSING ((NTSTATUS)0xC015000CL)
+#define STATUS_SXS_RELEASE_ACTIVATION_CONTEXT ((NTSTATUS)0x4015000DL)
+#define STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET ((NTSTATUS)0xC015000EL)
+#define STATUS_SXS_EARLY_DEACTIVATION ((NTSTATUS)0xC015000FL)
+#define STATUS_SXS_INVALID_DEACTIVATION ((NTSTATUS)0xC0150010L)
+#define STATUS_SXS_MULTIPLE_DEACTIVATION ((NTSTATUS)0xC0150011L)
+#define STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY ((NTSTATUS)0xC0150012L)
+#define STATUS_SXS_PROCESS_TERMINATION_REQUESTED ((NTSTATUS)0xC0150013L)
+#define STATUS_CLUSTER_INVALID_NODE ((NTSTATUS)0xC0130001L)
+#define STATUS_CLUSTER_NODE_EXISTS ((NTSTATUS)0xC0130002L)
+#define STATUS_CLUSTER_JOIN_IN_PROGRESS ((NTSTATUS)0xC0130003L)
+#define STATUS_CLUSTER_NODE_NOT_FOUND ((NTSTATUS)0xC0130004L)
+#define STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND ((NTSTATUS)0xC0130005L)
+#define STATUS_CLUSTER_NETWORK_EXISTS ((NTSTATUS)0xC0130006L)
+#define STATUS_CLUSTER_NETWORK_NOT_FOUND ((NTSTATUS)0xC0130007L)
+#define STATUS_CLUSTER_NETINTERFACE_EXISTS ((NTSTATUS)0xC0130008L)
+#define STATUS_CLUSTER_NETINTERFACE_NOT_FOUND ((NTSTATUS)0xC0130009L)
+#define STATUS_CLUSTER_INVALID_REQUEST ((NTSTATUS)0xC013000AL)
+#define STATUS_CLUSTER_INVALID_NETWORK_PROVIDER ((NTSTATUS)0xC013000BL)
+#define STATUS_CLUSTER_NODE_DOWN ((NTSTATUS)0xC013000CL)
+#define STATUS_CLUSTER_NODE_UNREACHABLE ((NTSTATUS)0xC013000DL)
+#define STATUS_CLUSTER_NODE_NOT_MEMBER ((NTSTATUS)0xC013000EL)
+#define STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS ((NTSTATUS)0xC013000FL)
+#define STATUS_CLUSTER_INVALID_NETWORK ((NTSTATUS)0xC0130010L)
+#define STATUS_CLUSTER_NO_NET_ADAPTERS ((NTSTATUS)0xC0130011L)
+#define STATUS_CLUSTER_NODE_UP ((NTSTATUS)0xC0130012L)
+#define STATUS_CLUSTER_NODE_PAUSED ((NTSTATUS)0xC0130013L)
+#define STATUS_CLUSTER_NODE_NOT_PAUSED ((NTSTATUS)0xC0130014L)
+#define STATUS_CLUSTER_NO_SECURITY_CONTEXT ((NTSTATUS)0xC0130015L)
+#define STATUS_CLUSTER_NETWORK_NOT_INTERNAL ((NTSTATUS)0xC0130016L)
+#define STATUS_CLUSTER_POISONED ((NTSTATUS)0xC0130017L)
/*
- * Debug codes
- */
+* Debug codes
+*/
#define DBG_EXCEPTION_HANDLED ((NTSTATUS)0x00010001)
#define DBG_CONTINUE ((NTSTATUS)0x00010002)
@@ -42,1086 +1115,8 @@
#define DBG_NO_STATE_CHANGE ((NTSTATUS)0xC0010001)
#define DBG_APP_NOT_IDLE ((NTSTATUS)0xC0010002)
-/*
- * Exception codes
- */
+#ifdef __cplusplus
+}
+#endif
-#define STATUS_SUCCESS ((NTSTATUS)0x00000000)
-#define STATUS_SEVERITY_SUCCESS 0x0
-#define STATUS_SEVERITY_INFORMATIONAL 0x1
-#define STATUS_SEVERITY_WARNING 0x2
-#define STATUS_SEVERITY_ERROR 0x3
-
-#define STATUS_WAIT_1 ((NTSTATUS)0x00000001)
-#define STATUS_WAIT_2 ((NTSTATUS)0x00000002)
-#define STATUS_WAIT_3 ((NTSTATUS)0x00000003)
-#define STATUS_WAIT_63 ((NTSTATUS)0x0000003f)
-#define STATUS_ABANDONED ((NTSTATUS)0x00000080)
-#define STATUS_ABANDONED_WAIT_63 ((NTSTATUS)0x000000BF)
-#define STATUS_USER_APC ((NTSTATUS)0x000000C0)
-#define STATUS_KERNEL_APC ((NTSTATUS)0x00000100)
-#define STATUS_ALERTED ((NTSTATUS)0x00000101)
-#define STATUS_TIMEOUT ((NTSTATUS)0x00000102)
-#define STATUS_PENDING ((NTSTATUS)0x00000103)
-#define STATUS_REPARSE ((NTSTATUS)0x00000104)
-#define STATUS_MORE_ENTRIES ((NTSTATUS)0x00000105)
-#define STATUS_NOT_ALL_ASSIGNED ((NTSTATUS)0x00000106)
-#define STATUS_SOME_NOT_MAPPED ((NTSTATUS)0x00000107)
-#define STATUS_OPLOCK_BREAK_IN_PROGRESS ((NTSTATUS)0x00000108)
-#define STATUS_VOLUME_MOUNTED ((NTSTATUS)0x00000109)
-#define STATUS_RXACT_COMMITTED ((NTSTATUS)0x0000010A)
-#define STATUS_NOTIFY_CLEANUP ((NTSTATUS)0x0000010B)
-#define STATUS_NOTIFY_ENUM_DIR ((NTSTATUS)0x0000010C)
-#define STATUS_NO_QUOTAS_FOR_ACCOUNT ((NTSTATUS)0x0000010D)
-#define STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED ((NTSTATUS)0x0000010E)
-#define STATUS_PAGE_FAULT_TRANSITION ((NTSTATUS)0x00000110)
-#define STATUS_PAGE_FAULT_DEMAND_ZERO ((NTSTATUS)0x00000111)
-#define STATUS_PAGE_FAULT_COPY_ON_WRITE ((NTSTATUS)0x00000112)
-#define STATUS_PAGE_FAULT_GUARD_PAGE ((NTSTATUS)0x00000113)
-#define STATUS_PAGE_FAULT_PAGING_FILE ((NTSTATUS)0x00000114)
-#define STATUS_CACHE_PAGE_LOCKED ((NTSTATUS)0x00000115)
-#define STATUS_CRASH_DUMP ((NTSTATUS)0x00000116)
-#define STATUS_BUFFER_ALL_ZEROS ((NTSTATUS)0x00000117)
-#define STATUS_REPARSE_OBJECT ((NTSTATUS)0x00000118)
-#define STATUS_RESOURCE_REQUIREMENTS_CHANGED ((NTSTATUS)0x00000119)
-#define STATUS_TRANSLATION_COMPLETE ((NTSTATUS)0x00000120)
-#define STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY ((NTSTATUS)0x00000121)
-#define STATUS_NOTHING_TO_TERMINATE ((NTSTATUS)0x00000122)
-#define STATUS_PROCESS_NOT_IN_JOB ((NTSTATUS)0x00000123)
-#define STATUS_PROCESS_IN_JOB ((NTSTATUS)0x00000124)
-#define STATUS_VOLSNAP_HIBERNATE_READY ((NTSTATUS)0x00000125)
-#define STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY ((NTSTATUS)0x00000126)
-
-#define STATUS_OBJECT_NAME_EXISTS ((NTSTATUS)0x40000000)
-#define STATUS_THREAD_WAS_SUSPENDED ((NTSTATUS)0x40000001)
-#define STATUS_WORKING_SET_LIMIT_RANGE ((NTSTATUS)0x40000002)
-#define STATUS_IMAGE_NOT_AT_BASE ((NTSTATUS)0x40000003)
-#define STATUS_RXACT_STATE_CREATED ((NTSTATUS)0x40000004)
-#define STATUS_SEGMENT_NOTIFICATION ((NTSTATUS)0x40000005)
-#define STATUS_LOCAL_USER_SESSION_KEY ((NTSTATUS)0x40000006)
-#define STATUS_BAD_CURRENT_DIRECTORY ((NTSTATUS)0x40000007)
-#define STATUS_SERIAL_MORE_WRITES ((NTSTATUS)0x40000008)
-#define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009)
-#define STATUS_FT_READ_RECOVERY_FROM_BACKUP ((NTSTATUS)0x4000000A)
-#define STATUS_FT_WRITE_RECOVERY ((NTSTATUS)0x4000000B)
-#define STATUS_SERIAL_COUNTER_TIMEOUT ((NTSTATUS)0x4000000C)
-#define STATUS_NULL_LM_PASSWORD ((NTSTATUS)0x4000000D)
-#define STATUS_IMAGE_MACHINE_TYPE_MISMATCH ((NTSTATUS)0x4000000E)
-#define STATUS_RECEIVE_PARTIAL ((NTSTATUS)0x4000000F)
-#define STATUS_RECEIVE_EXPEDITED ((NTSTATUS)0x40000010)
-#define STATUS_RECEIVE_PARTIAL_EXPEDITED ((NTSTATUS)0x40000011)
-#define STATUS_EVENT_DONE ((NTSTATUS)0x40000012)
-#define STATUS_EVENT_PENDING ((NTSTATUS)0x40000013)
-#define STATUS_CHECKING_FILE_SYSTEM ((NTSTATUS)0x40000014)
-#define STATUS_FATAL_APP_EXIT ((NTSTATUS)0x40000015)
-#define STATUS_PREDEFINED_HANDLE ((NTSTATUS)0x40000016)
-#define STATUS_WAS_UNLOCKED ((NTSTATUS)0x40000017)
-#define STATUS_SERVICE_NOTIFICATION ((NTSTATUS)0x40000018)
-#define STATUS_WAS_LOCKED ((NTSTATUS)0x40000019)
-#define STATUS_LOG_HARD_ERROR ((NTSTATUS)0x4000001A)
-#define STATUS_ALREADY_WIN32 ((NTSTATUS)0x4000001B)
-#define STATUS_WX86_UNSIMULATE ((NTSTATUS)0x4000001C)
-#define STATUS_WX86_CONTINUE ((NTSTATUS)0x4000001D)
-#define STATUS_WX86_SINGLE_STEP ((NTSTATUS)0x4000001E)
-#define STATUS_WX86_BREAKPOINT ((NTSTATUS)0x4000001F)
-#define STATUS_WX86_EXCEPTION_CONTINUE ((NTSTATUS)0x40000020)
-#define STATUS_WX86_EXCEPTION_LASTCHANCE ((NTSTATUS)0x40000021)
-#define STATUS_WX86_EXCEPTION_CHAIN ((NTSTATUS)0x40000022)
-#define STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE ((NTSTATUS)0x40000023)
-#define STATUS_NO_YIELD_PERFORMED ((NTSTATUS)0x40000024)
-#define STATUS_TIMER_RESUME_IGNORED ((NTSTATUS)0x40000025)
-#define STATUS_ARBITRATION_UNHANDLED ((NTSTATUS)0x40000026)
-#define STATUS_CARDBUS_NOT_SUPPORTED ((NTSTATUS)0x40000027)
-#define STATUS_WX86_CREATEWX86TIB ((NTSTATUS)0x40000028)
-#define STATUS_MP_PROCESSOR_MISMATCH ((NTSTATUS)0x40000029)
-#define STATUS_HIBERNATED ((NTSTATUS)0x4000002A)
-#define STATUS_RESUME_HIBERNATION ((NTSTATUS)0x4000002B)
-#define STATUS_FIRMWARE_UPDATED ((NTSTATUS)0x4000002C)
-#define STATUS_WAKE_SYSTEM ((NTSTATUS)0x40000294)
-#define STATUS_DS_SHUTTING_DOWN ((NTSTATUS)0x40000370)
-
-#define RPC_NT_UUID_LOCAL_ONLY ((NTSTATUS)0x40020056)
-#define RPC_NT_SEND_INCOMPLETE ((NTSTATUS)0x400200AF)
-
-#define STATUS_CTX_CDM_CONNECT ((NTSTATUS)0x400A0004)
-#define STATUS_CTX_CDM_DISCONNECT ((NTSTATUS)0x400A0005)
-
-#define STATUS_SXS_RELEASE_ACTIVATION_CONTEXT ((NTSTATUS)0x4015000D)
-
-#define STATUS_GUARD_PAGE_VIOLATION ((NTSTATUS)0x80000001)
-#define STATUS_DATATYPE_MISALIGNMENT ((NTSTATUS)0x80000002)
-#define STATUS_BREAKPOINT ((NTSTATUS)0x80000003)
-#define STATUS_SINGLE_STEP ((NTSTATUS)0x80000004)
-#define STATUS_BUFFER_OVERFLOW ((NTSTATUS)0x80000005)
-#define STATUS_NO_MORE_FILES ((NTSTATUS)0x80000006)
-#define STATUS_WAKE_SYSTEM_DEBUGGER ((NTSTATUS)0x80000007)
-
-#define STATUS_HANDLES_CLOSED ((NTSTATUS)0x8000000A)
-#define STATUS_NO_INHERITANCE ((NTSTATUS)0x8000000B)
-#define STATUS_GUID_SUBSTITUTION_MADE ((NTSTATUS)0x8000000C)
-#define STATUS_PARTIAL_COPY ((NTSTATUS)0x8000000D)
-#define STATUS_DEVICE_PAPER_EMPTY ((NTSTATUS)0x8000000E)
-#define STATUS_DEVICE_POWERED_OFF ((NTSTATUS)0x8000000F)
-#define STATUS_DEVICE_OFF_LINE ((NTSTATUS)0x80000010)
-#define STATUS_DEVICE_BUSY ((NTSTATUS)0x80000011)
-#define STATUS_NO_MORE_EAS ((NTSTATUS)0x80000012)
-#define STATUS_INVALID_EA_NAME ((NTSTATUS)0x80000013)
-#define STATUS_EA_LIST_INCONSISTENT ((NTSTATUS)0x80000014)
-#define STATUS_INVALID_EA_FLAG ((NTSTATUS)0x80000015)
-#define STATUS_VERIFY_REQUIRED ((NTSTATUS)0x80000016)
-#define STATUS_EXTRANEOUS_INFORMATION ((NTSTATUS)0x80000017)
-#define STATUS_RXACT_COMMIT_NECESSARY ((NTSTATUS)0x80000018)
-#define STATUS_NO_MORE_ENTRIES ((NTSTATUS)0x8000001A)
-#define STATUS_FILEMARK_DETECTED ((NTSTATUS)0x8000001B)
-#define STATUS_MEDIA_CHANGED ((NTSTATUS)0x8000001C)
-#define STATUS_BUS_RESET ((NTSTATUS)0x8000001D)
-#define STATUS_END_OF_MEDIA ((NTSTATUS)0x8000001E)
-#define STATUS_BEGINNING_OF_MEDIA ((NTSTATUS)0x8000001F)
-#define STATUS_MEDIA_CHECK ((NTSTATUS)0x80000020)
-#define STATUS_SETMARK_DETECTED ((NTSTATUS)0x80000021)
-#define STATUS_NO_DATA_DETECTED ((NTSTATUS)0x80000022)
-#define STATUS_REDIRECTOR_HAS_OPEN_HANDLES ((NTSTATUS)0x80000023)
-#define STATUS_SERVER_HAS_OPEN_HANDLES ((NTSTATUS)0x80000024)
-#define STATUS_ALREADY_DISCONNECTED ((NTSTATUS)0x80000025)
-#define STATUS_LONGJUMP ((NTSTATUS)0x80000026)
-#define STATUS_CLEANER_CARTRIDGE_INSTALLED ((NTSTATUS)0x80000027)
-#define STATUS_PLUGPLAY_QUERY_VETOED ((NTSTATUS)0x80000028)
-#define STATUS_UNWIND_CONSOLIDATE ((NTSTATUS)0x80000029)
-#define STATUS_REGISTRY_HIVE_RECOVERED ((NTSTATUS)0x8000002A)
-#define STATUS_DLL_MIGHT_BE_INSECURE ((NTSTATUS)0x8000002B)
-#define STATUS_DLL_MIGHT_BE_INCOMPATIBLE ((NTSTATUS)0x8000002C)
-
-#define STATUS_DEVICE_REQUIRES_CLEANING ((NTSTATUS)0x80000288)
-#define STATUS_DEVICE_DOOR_OPEN ((NTSTATUS)0x80000289)
-
-#define STATUS_CLUSTER_NODE_ALREADY_UP ((NTSTATUS)0x80130001)
-#define STATUS_CLUSTER_NODE_ALREADY_DOWN ((NTSTATUS)0x80130002)
-#define STATUS_CLUSTER_NETWORK_ALREADY_ONLINE ((NTSTATUS)0x80130003)
-#define STATUS_CLUSTER_NETWORK_ALREADY_OFFLINE ((NTSTATUS)0x80130004)
-#define STATUS_CLUSTER_NODE_ALREADY_MEMBER ((NTSTATUS)0x80130005)
-
-#define STATUS_WAIT_0 ((NTSTATUS)0x00000000)
-#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001)
-#define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002)
-#define STATUS_INVALID_INFO_CLASS ((NTSTATUS)0xC0000003)
-#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004)
-#define STATUS_ACCESS_VIOLATION ((NTSTATUS)0xC0000005)
-#define STATUS_IN_PAGE_ERROR ((NTSTATUS)0xC0000006)
-#define STATUS_PAGEFILE_QUOTA ((NTSTATUS)0xC0000007)
-#define STATUS_INVALID_HANDLE ((NTSTATUS)0xC0000008)
-#define STATUS_BAD_INITIAL_STACK ((NTSTATUS)0xC0000009)
-#define STATUS_BAD_INITIAL_PC ((NTSTATUS)0xC000000A)
-#define STATUS_INVALID_CID ((NTSTATUS)0xC000000B)
-#define STATUS_TIMER_NOT_CANCELED ((NTSTATUS)0xC000000C)
-#define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000D)
-#define STATUS_NO_SUCH_DEVICE ((NTSTATUS)0xC000000E)
-#define STATUS_NO_SUCH_FILE ((NTSTATUS)0xC000000F)
-#define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS)0xC0000010)
-#define STATUS_END_OF_FILE ((NTSTATUS)0xC0000011)
-#define STATUS_WRONG_VOLUME ((NTSTATUS)0xC0000012)
-#define STATUS_NO_MEDIA_IN_DEVICE ((NTSTATUS)0xC0000013)
-#define STATUS_UNRECOGNIZED_MEDIA ((NTSTATUS)0xC0000014)
-#define STATUS_NONEXISTENT_SECTOR ((NTSTATUS)0xC0000015)
-#define STATUS_MORE_PROCESSING_REQUIRED ((NTSTATUS)0xC0000016)
-#define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017)
-#define STATUS_CONFLICTING_ADDRESSES ((NTSTATUS)0xC0000018)
-#define STATUS_NOT_MAPPED_VIEW ((NTSTATUS)0xC0000019)
-#define STATUS_UNABLE_TO_FREE_VM ((NTSTATUS)0xC000001A)
-#define STATUS_UNABLE_TO_DELETE_SECTION ((NTSTATUS)0xC000001B)
-#define STATUS_INVALID_SYSTEM_SERVICE ((NTSTATUS)0xC000001C)
-#define STATUS_ILLEGAL_INSTRUCTION ((NTSTATUS)0xC000001D)
-#define STATUS_INVALID_LOCK_SEQUENCE ((NTSTATUS)0xC000001E)
-#define STATUS_INVALID_VIEW_SIZE ((NTSTATUS)0xC000001F)
-#define STATUS_INVALID_FILE_FOR_SECTION ((NTSTATUS)0xC0000020)
-#define STATUS_ALREADY_COMMITTED ((NTSTATUS)0xC0000021)
-#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022)
-#define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023)
-#define STATUS_OBJECT_TYPE_MISMATCH ((NTSTATUS)0xC0000024)
-#define STATUS_NONCONTINUABLE_EXCEPTION ((NTSTATUS)0xC0000025)
-#define STATUS_INVALID_DISPOSITION ((NTSTATUS)0xC0000026)
-#define STATUS_UNWIND ((NTSTATUS)0xC0000027)
-#define STATUS_BAD_STACK ((NTSTATUS)0xC0000028)
-#define STATUS_INVALID_UNWIND_TARGET ((NTSTATUS)0xC0000029)
-#define STATUS_NOT_LOCKED ((NTSTATUS)0xC000002A)
-#define STATUS_PARITY_ERROR ((NTSTATUS)0xC000002B)
-#define STATUS_UNABLE_TO_DECOMMIT_VM ((NTSTATUS)0xC000002C)
-#define STATUS_NOT_COMMITTED ((NTSTATUS)0xC000002D)
-#define STATUS_INVALID_PORT_ATTRIBUTES ((NTSTATUS)0xC000002E)
-#define STATUS_PORT_MESSAGE_TOO_LONG ((NTSTATUS)0xC000002F)
-#define STATUS_INVALID_PARAMETER_MIX ((NTSTATUS)0xC0000030)
-#define STATUS_INVALID_QUOTA_LOWER ((NTSTATUS)0xC0000031)
-#define STATUS_DISK_CORRUPT_ERROR ((NTSTATUS)0xC0000032)
-#define STATUS_OBJECT_NAME_INVALID ((NTSTATUS)0xC0000033)
-#define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034)
-#define STATUS_OBJECT_NAME_COLLISION ((NTSTATUS)0xC0000035)
-#define STATUS_PORT_DISCONNECTED ((NTSTATUS)0xC0000037)
-#define STATUS_DEVICE_ALREADY_ATTACHED ((NTSTATUS)0xC0000038)
-#define STATUS_OBJECT_PATH_INVALID ((NTSTATUS)0xC0000039)
-#define STATUS_OBJECT_PATH_NOT_FOUND ((NTSTATUS)0xC000003A)
-#define STATUS_OBJECT_PATH_SYNTAX_BAD ((NTSTATUS)0xC000003B)
-#define STATUS_DATA_OVERRUN ((NTSTATUS)0xC000003C)
-#define STATUS_DATA_LATE_ERROR ((NTSTATUS)0xC000003D)
-#define STATUS_DATA_ERROR ((NTSTATUS)0xC000003E)
-#define STATUS_CRC_ERROR ((NTSTATUS)0xC000003F)
-#define STATUS_SECTION_TOO_BIG ((NTSTATUS)0xC0000040)
-#define STATUS_PORT_CONNECTION_REFUSED ((NTSTATUS)0xC0000041)
-#define STATUS_INVALID_PORT_HANDLE ((NTSTATUS)0xC0000042)
-#define STATUS_SHARING_VIOLATION ((NTSTATUS)0xC0000043)
-#define STATUS_QUOTA_EXCEEDED ((NTSTATUS)0xC0000044)
-#define STATUS_INVALID_PAGE_PROTECTION ((NTSTATUS)0xC0000045)
-#define STATUS_MUTANT_NOT_OWNED ((NTSTATUS)0xC0000046)
-#define STATUS_SEMAPHORE_LIMIT_EXCEEDED ((NTSTATUS)0xC0000047)
-#define STATUS_PORT_ALREADY_SET ((NTSTATUS)0xC0000048)
-#define STATUS_SECTION_NOT_IMAGE ((NTSTATUS)0xC0000049)
-#define STATUS_SUSPEND_COUNT_EXCEEDED ((NTSTATUS)0xC000004A)
-#define STATUS_THREAD_IS_TERMINATING ((NTSTATUS)0xC000004B)
-#define STATUS_BAD_WORKING_SET_LIMIT ((NTSTATUS)0xC000004C)
-#define STATUS_INCOMPATIBLE_FILE_MAP ((NTSTATUS)0xC000004D)
-#define STATUS_SECTION_PROTECTION ((NTSTATUS)0xC000004E)
-#define STATUS_EAS_NOT_SUPPORTED ((NTSTATUS)0xC000004F)
-#define STATUS_EA_TOO_LARGE ((NTSTATUS)0xC0000050)
-#define STATUS_NONEXISTENT_EA_ENTRY ((NTSTATUS)0xC0000051)
-#define STATUS_NO_EAS_ON_FILE ((NTSTATUS)0xC0000052)
-#define STATUS_EA_CORRUPT_ERROR ((NTSTATUS)0xC0000053)
-#define STATUS_FILE_LOCK_CONFLICT ((NTSTATUS)0xC0000054)
-#define STATUS_LOCK_NOT_GRANTED ((NTSTATUS)0xC0000055)
-#define STATUS_DELETE_PENDING ((NTSTATUS)0xC0000056)
-#define STATUS_CTL_FILE_NOT_SUPPORTED ((NTSTATUS)0xC0000057)
-#define STATUS_UNKNOWN_REVISION ((NTSTATUS)0xC0000058)
-#define STATUS_REVISION_MISMATCH ((NTSTATUS)0xC0000059)
-#define STATUS_INVALID_OWNER ((NTSTATUS)0xC000005A)
-#define STATUS_INVALID_PRIMARY_GROUP ((NTSTATUS)0xC000005B)
-#define STATUS_NO_IMPERSONATION_TOKEN ((NTSTATUS)0xC000005C)
-#define STATUS_CANT_DISABLE_MANDATORY ((NTSTATUS)0xC000005D)
-#define STATUS_NO_LOGON_SERVERS ((NTSTATUS)0xC000005E)
-#define STATUS_NO_SUCH_LOGON_SESSION ((NTSTATUS)0xC000005F)
-#define STATUS_NO_SUCH_PRIVILEGE ((NTSTATUS)0xC0000060)
-#define STATUS_PRIVILEGE_NOT_HELD ((NTSTATUS)0xC0000061)
-#define STATUS_INVALID_ACCOUNT_NAME ((NTSTATUS)0xC0000062)
-#define STATUS_USER_EXISTS ((NTSTATUS)0xC0000063)
-#define STATUS_NO_SUCH_USER ((NTSTATUS)0xC0000064)
-#define STATUS_GROUP_EXISTS ((NTSTATUS)0xC0000065)
-#define STATUS_NO_SUCH_GROUP ((NTSTATUS)0xC0000066)
-#define STATUS_MEMBER_IN_GROUP ((NTSTATUS)0xC0000067)
-#define STATUS_MEMBER_NOT_IN_GROUP ((NTSTATUS)0xC0000068)
-#define STATUS_LAST_ADMIN ((NTSTATUS)0xC0000069)
-#define STATUS_WRONG_PASSWORD ((NTSTATUS)0xC000006A)
-#define STATUS_ILL_FORMED_PASSWORD ((NTSTATUS)0xC000006B)
-#define STATUS_PASSWORD_RESTRICTION ((NTSTATUS)0xC000006C)
-#define STATUS_LOGON_FAILURE ((NTSTATUS)0xC000006D)
-#define STATUS_ACCOUNT_RESTRICTION ((NTSTATUS)0xC000006E)
-#define STATUS_INVALID_LOGON_HOURS ((NTSTATUS)0xC000006F)
-#define STATUS_INVALID_WORKSTATION ((NTSTATUS)0xC0000070)
-#define STATUS_PASSWORD_EXPIRED ((NTSTATUS)0xC0000071)
-#define STATUS_ACCOUNT_DISABLED ((NTSTATUS)0xC0000072)
-#define STATUS_NONE_MAPPED ((NTSTATUS)0xC0000073)
-#define STATUS_TOO_MANY_LUIDS_REQUESTED ((NTSTATUS)0xC0000074)
-#define STATUS_LUIDS_EXHAUSTED ((NTSTATUS)0xC0000075)
-#define STATUS_INVALID_SUB_AUTHORITY ((NTSTATUS)0xC0000076)
-#define STATUS_INVALID_ACL ((NTSTATUS)0xC0000077)
-#define STATUS_INVALID_SID ((NTSTATUS)0xC0000078)
-#define STATUS_INVALID_SECURITY_DESCR ((NTSTATUS)0xC0000079)
-#define STATUS_PROCEDURE_NOT_FOUND ((NTSTATUS)0xC000007A)
-#define STATUS_INVALID_IMAGE_FORMAT ((NTSTATUS)0xC000007B)
-#define STATUS_NO_TOKEN ((NTSTATUS)0xC000007C)
-#define STATUS_BAD_INHERITANCE_ACL ((NTSTATUS)0xC000007D)
-#define STATUS_RANGE_NOT_LOCKED ((NTSTATUS)0xC000007E)
-#define STATUS_DISK_FULL ((NTSTATUS)0xC000007F)
-#define STATUS_SERVER_DISABLED ((NTSTATUS)0xC0000080)
-#define STATUS_SERVER_NOT_DISABLED ((NTSTATUS)0xC0000081)
-#define STATUS_TOO_MANY_GUIDS_REQUESTED ((NTSTATUS)0xC0000082)
-#define STATUS_GUIDS_EXHAUSTED ((NTSTATUS)0xC0000083)
-#define STATUS_INVALID_ID_AUTHORITY ((NTSTATUS)0xC0000084)
-#define STATUS_AGENTS_EXHAUSTED ((NTSTATUS)0xC0000085)
-#define STATUS_INVALID_VOLUME_LABEL ((NTSTATUS)0xC0000086)
-#define STATUS_SECTION_NOT_EXTENDED ((NTSTATUS)0xC0000087)
-#define STATUS_NOT_MAPPED_DATA ((NTSTATUS)0xC0000088)
-#define STATUS_RESOURCE_DATA_NOT_FOUND ((NTSTATUS)0xC0000089)
-#define STATUS_RESOURCE_TYPE_NOT_FOUND ((NTSTATUS)0xC000008A)
-#define STATUS_RESOURCE_NAME_NOT_FOUND ((NTSTATUS)0xC000008B)
-#define STATUS_ARRAY_BOUNDS_EXCEEDED ((NTSTATUS)0xC000008C)
-#define STATUS_FLOAT_DENORMAL_OPERAND ((NTSTATUS)0xC000008D)
-#define STATUS_FLOAT_DIVIDE_BY_ZERO ((NTSTATUS)0xC000008E)
-#define STATUS_FLOAT_INEXACT_RESULT ((NTSTATUS)0xC000008F)
-#define STATUS_FLOAT_INVALID_OPERATION ((NTSTATUS)0xC0000090)
-#define STATUS_FLOAT_OVERFLOW ((NTSTATUS)0xC0000091)
-#define STATUS_FLOAT_STACK_CHECK ((NTSTATUS)0xC0000092)
-#define STATUS_FLOAT_UNDERFLOW ((NTSTATUS)0xC0000093)
-#define STATUS_INTEGER_DIVIDE_BY_ZERO ((NTSTATUS)0xC0000094)
-#define STATUS_INTEGER_OVERFLOW ((NTSTATUS)0xC0000095)
-#define STATUS_PRIVILEGED_INSTRUCTION ((NTSTATUS)0xC0000096)
-#define STATUS_TOO_MANY_PAGING_FILES ((NTSTATUS)0xC0000097)
-#define STATUS_FILE_INVALID ((NTSTATUS)0xC0000098)
-#define STATUS_ALLOTTED_SPACE_EXCEEDED ((NTSTATUS)0xC0000099)
-#define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A)
-#define STATUS_DFS_EXIT_PATH_FOUND ((NTSTATUS)0xC000009B)
-#define STATUS_DEVICE_DATA_ERROR ((NTSTATUS)0xC000009C)
-#define STATUS_DEVICE_NOT_CONNECTED ((NTSTATUS)0xC000009D)
-#define STATUS_DEVICE_POWER_FAILURE ((NTSTATUS)0xC000009E)
-#define STATUS_FREE_VM_NOT_AT_BASE ((NTSTATUS)0xC000009F)
-#define STATUS_MEMORY_NOT_ALLOCATED ((NTSTATUS)0xC00000A0)
-#define STATUS_WORKING_SET_QUOTA ((NTSTATUS)0xC00000A1)
-#define STATUS_MEDIA_WRITE_PROTECTED ((NTSTATUS)0xC00000A2)
-#define STATUS_DEVICE_NOT_READY ((NTSTATUS)0xC00000A3)
-#define STATUS_INVALID_GROUP_ATTRIBUTES ((NTSTATUS)0xC00000A4)
-#define STATUS_BAD_IMPERSONATION_LEVEL ((NTSTATUS)0xC00000A5)
-#define STATUS_CANT_OPEN_ANONYMOUS ((NTSTATUS)0xC00000A6)
-#define STATUS_BAD_VALIDATION_CLASS ((NTSTATUS)0xC00000A7)
-#define STATUS_BAD_TOKEN_TYPE ((NTSTATUS)0xC00000A8)
-#define STATUS_BAD_MASTER_BOOT_RECORD ((NTSTATUS)0xC00000A9)
-#define STATUS_INSTRUCTION_MISALIGNMENT ((NTSTATUS)0xC00000AA)
-#define STATUS_INSTANCE_NOT_AVAILABLE ((NTSTATUS)0xC00000AB)
-#define STATUS_PIPE_NOT_AVAILABLE ((NTSTATUS)0xC00000AC)
-#define STATUS_INVALID_PIPE_STATE ((NTSTATUS)0xC00000AD)
-#define STATUS_PIPE_BUSY ((NTSTATUS)0xC00000AE)
-#define STATUS_ILLEGAL_FUNCTION ((NTSTATUS)0xC00000AF)
-#define STATUS_PIPE_DISCONNECTED ((NTSTATUS)0xC00000B0)
-#define STATUS_PIPE_CLOSING ((NTSTATUS)0xC00000B1)
-#define STATUS_PIPE_CONNECTED ((NTSTATUS)0xC00000B2)
-#define STATUS_PIPE_LISTENING ((NTSTATUS)0xC00000B3)
-#define STATUS_INVALID_READ_MODE ((NTSTATUS)0xC00000B4)
-#define STATUS_IO_TIMEOUT ((NTSTATUS)0xC00000B5)
-#define STATUS_FILE_FORCED_CLOSED ((NTSTATUS)0xC00000B6)
-#define STATUS_PROFILING_NOT_STARTED ((NTSTATUS)0xC00000B7)
-#define STATUS_PROFILING_NOT_STOPPED ((NTSTATUS)0xC00000B8)
-#define STATUS_COULD_NOT_INTERPRET ((NTSTATUS)0xC00000B9)
-#define STATUS_FILE_IS_A_DIRECTORY ((NTSTATUS)0xC00000BA)
-#define STATUS_NOT_SUPPORTED ((NTSTATUS)0xC00000BB)
-#define STATUS_REMOTE_NOT_LISTENING ((NTSTATUS)0xC00000BC)
-#define STATUS_DUPLICATE_NAME ((NTSTATUS)0xC00000BD)
-#define STATUS_BAD_NETWORK_PATH ((NTSTATUS)0xC00000BE)
-#define STATUS_NETWORK_BUSY ((NTSTATUS)0xC00000BF)
-#define STATUS_DEVICE_DOES_NOT_EXIST ((NTSTATUS)0xC00000C0)
-#define STATUS_TOO_MANY_COMMANDS ((NTSTATUS)0xC00000C1)
-#define STATUS_ADAPTER_HARDWARE_ERROR ((NTSTATUS)0xC00000C2)
-#define STATUS_INVALID_NETWORK_RESPONSE ((NTSTATUS)0xC00000C3)
-#define STATUS_UNEXPECTED_NETWORK_ERROR ((NTSTATUS)0xC00000C4)
-#define STATUS_BAD_REMOTE_ADAPTER ((NTSTATUS)0xC00000C5)
-#define STATUS_PRINT_QUEUE_FULL ((NTSTATUS)0xC00000C6)
-#define STATUS_NO_SPOOL_SPACE ((NTSTATUS)0xC00000C7)
-#define STATUS_PRINT_CANCELLED ((NTSTATUS)0xC00000C8)
-#define STATUS_NETWORK_NAME_DELETED ((NTSTATUS)0xC00000C9)
-#define STATUS_NETWORK_ACCESS_DENIED ((NTSTATUS)0xC00000CA)
-#define STATUS_BAD_DEVICE_TYPE ((NTSTATUS)0xC00000CB)
-#define STATUS_BAD_NETWORK_NAME ((NTSTATUS)0xC00000CC)
-#define STATUS_TOO_MANY_NAMES ((NTSTATUS)0xC00000CD)
-#define STATUS_TOO_MANY_SESSIONS ((NTSTATUS)0xC00000CE)
-#define STATUS_SHARING_PAUSED ((NTSTATUS)0xC00000CF)
-#define STATUS_REQUEST_NOT_ACCEPTED ((NTSTATUS)0xC00000D0)
-#define STATUS_REDIRECTOR_PAUSED ((NTSTATUS)0xC00000D1)
-#define STATUS_NET_WRITE_FAULT ((NTSTATUS)0xC00000D2)
-#define STATUS_PROFILING_AT_LIMIT ((NTSTATUS)0xC00000D3)
-#define STATUS_NOT_SAME_DEVICE ((NTSTATUS)0xC00000D4)
-#define STATUS_FILE_RENAMED ((NTSTATUS)0xC00000D5)
-#define STATUS_VIRTUAL_CIRCUIT_CLOSED ((NTSTATUS)0xC00000D6)
-#define STATUS_NO_SECURITY_ON_OBJECT ((NTSTATUS)0xC00000D7)
-#define STATUS_CANT_WAIT ((NTSTATUS)0xC00000D8)
-#define STATUS_PIPE_EMPTY ((NTSTATUS)0xC00000D9)
-#define STATUS_CANT_ACCESS_DOMAIN_INFO ((NTSTATUS)0xC00000DA)
-#define STATUS_CANT_TERMINATE_SELF ((NTSTATUS)0xC00000DB)
-#define STATUS_INVALID_SERVER_STATE ((NTSTATUS)0xC00000DC)
-#define STATUS_INVALID_DOMAIN_STATE ((NTSTATUS)0xC00000DD)
-#define STATUS_INVALID_DOMAIN_ROLE ((NTSTATUS)0xC00000DE)
-#define STATUS_NO_SUCH_DOMAIN ((NTSTATUS)0xC00000DF)
-#define STATUS_DOMAIN_EXISTS ((NTSTATUS)0xC00000E0)
-#define STATUS_DOMAIN_LIMIT_EXCEEDED ((NTSTATUS)0xC00000E1)
-#define STATUS_OPLOCK_NOT_GRANTED ((NTSTATUS)0xC00000E2)
-#define STATUS_INVALID_OPLOCK_PROTOCOL ((NTSTATUS)0xC00000E3)
-#define STATUS_INTERNAL_DB_CORRUPTION ((NTSTATUS)0xC00000E4)
-#define STATUS_INTERNAL_ERROR ((NTSTATUS)0xC00000E5)
-#define STATUS_GENERIC_NOT_MAPPED ((NTSTATUS)0xC00000E6)
-#define STATUS_BAD_DESCRIPTOR_FORMAT ((NTSTATUS)0xC00000E7)
-#define STATUS_INVALID_USER_BUFFER ((NTSTATUS)0xC00000E8)
-#define STATUS_UNEXPECTED_IO_ERROR ((NTSTATUS)0xC00000E9)
-#define STATUS_UNEXPECTED_MM_CREATE_ERR ((NTSTATUS)0xC00000EA)
-#define STATUS_UNEXPECTED_MM_MAP_ERROR ((NTSTATUS)0xC00000EB)
-#define STATUS_UNEXPECTED_MM_EXTEND_ERR ((NTSTATUS)0xC00000EC)
-#define STATUS_NOT_LOGON_PROCESS ((NTSTATUS)0xC00000ED)
-#define STATUS_LOGON_SESSION_EXISTS ((NTSTATUS)0xC00000EE)
-#define STATUS_INVALID_PARAMETER_1 ((NTSTATUS)0xC00000EF)
-#define STATUS_INVALID_PARAMETER_2 ((NTSTATUS)0xC00000F0)
-#define STATUS_INVALID_PARAMETER_3 ((NTSTATUS)0xC00000F1)
-#define STATUS_INVALID_PARAMETER_4 ((NTSTATUS)0xC00000F2)
-#define STATUS_INVALID_PARAMETER_5 ((NTSTATUS)0xC00000F3)
-#define STATUS_INVALID_PARAMETER_6 ((NTSTATUS)0xC00000F4)
-#define STATUS_INVALID_PARAMETER_7 ((NTSTATUS)0xC00000F5)
-#define STATUS_INVALID_PARAMETER_8 ((NTSTATUS)0xC00000F6)
-#define STATUS_INVALID_PARAMETER_9 ((NTSTATUS)0xC00000F7)
-#define STATUS_INVALID_PARAMETER_10 ((NTSTATUS)0xC00000F8)
-#define STATUS_INVALID_PARAMETER_11 ((NTSTATUS)0xC00000F9)
-#define STATUS_INVALID_PARAMETER_12 ((NTSTATUS)0xC00000FA)
-#define STATUS_REDIRECTOR_NOT_STARTED ((NTSTATUS)0xC00000FB)
-#define STATUS_REDIRECTOR_STARTED ((NTSTATUS)0xC00000FC)
-#define STATUS_STACK_OVERFLOW ((NTSTATUS)0xC00000FD)
-#define STATUS_NO_SUCH_PACKAGE ((NTSTATUS)0xC00000FE)
-#define STATUS_BAD_FUNCTION_TABLE ((NTSTATUS)0xC00000FF)
-#define STATUS_VARIABLE_NOT_FOUND ((NTSTATUS)0xC0000100)
-#define STATUS_DIRECTORY_NOT_EMPTY ((NTSTATUS)0xC0000101)
-#define STATUS_FILE_CORRUPT_ERROR ((NTSTATUS)0xC0000102)
-#define STATUS_NOT_A_DIRECTORY ((NTSTATUS)0xC0000103)
-#define STATUS_BAD_LOGON_SESSION_STATE ((NTSTATUS)0xC0000104)
-#define STATUS_LOGON_SESSION_COLLISION ((NTSTATUS)0xC0000105)
-#define STATUS_NAME_TOO_LONG ((NTSTATUS)0xC0000106)
-#define STATUS_FILES_OPEN ((NTSTATUS)0xC0000107)
-#define STATUS_CONNECTION_IN_USE ((NTSTATUS)0xC0000108)
-#define STATUS_MESSAGE_NOT_FOUND ((NTSTATUS)0xC0000109)
-#define STATUS_PROCESS_IS_TERMINATING ((NTSTATUS)0xC000010A)
-#define STATUS_INVALID_LOGON_TYPE ((NTSTATUS)0xC000010B)
-#define STATUS_NO_GUID_TRANSLATION ((NTSTATUS)0xC000010C)
-#define STATUS_CANNOT_IMPERSONATE ((NTSTATUS)0xC000010D)
-#define STATUS_IMAGE_ALREADY_LOADED ((NTSTATUS)0xC000010E)
-#define STATUS_ABIOS_NOT_PRESENT ((NTSTATUS)0xC000010F)
-#define STATUS_ABIOS_LID_NOT_EXIST ((NTSTATUS)0xC0000110)
-#define STATUS_ABIOS_LID_ALREADY_OWNED ((NTSTATUS)0xC0000111)
-#define STATUS_ABIOS_NOT_LID_OWNER ((NTSTATUS)0xC0000112)
-#define STATUS_ABIOS_INVALID_COMMAND ((NTSTATUS)0xC0000113)
-#define STATUS_ABIOS_INVALID_LID ((NTSTATUS)0xC0000114)
-#define STATUS_ABIOS_SELECTOR_NOT_AVAILABLE ((NTSTATUS)0xC0000115)
-#define STATUS_ABIOS_INVALID_SELECTOR ((NTSTATUS)0xC0000116)
-#define STATUS_NO_LDT ((NTSTATUS)0xC0000117)
-#define STATUS_INVALID_LDT_SIZE ((NTSTATUS)0xC0000118)
-#define STATUS_INVALID_LDT_OFFSET ((NTSTATUS)0xC0000119)
-#define STATUS_INVALID_LDT_DESCRIPTOR ((NTSTATUS)0xC000011A)
-#define STATUS_INVALID_IMAGE_NE_FORMAT ((NTSTATUS)0xC000011B)
-#define STATUS_RXACT_INVALID_STATE ((NTSTATUS)0xC000011C)
-#define STATUS_RXACT_COMMIT_FAILURE ((NTSTATUS)0xC000011D)
-#define STATUS_MAPPED_FILE_SIZE_ZERO ((NTSTATUS)0xC000011E)
-#define STATUS_TOO_MANY_OPENED_FILES ((NTSTATUS)0xC000011F)
-#define STATUS_CANCELLED ((NTSTATUS)0xC0000120)
-#define STATUS_CANNOT_DELETE ((NTSTATUS)0xC0000121)
-#define STATUS_INVALID_COMPUTER_NAME ((NTSTATUS)0xC0000122)
-#define STATUS_FILE_DELETED ((NTSTATUS)0xC0000123)
-#define STATUS_SPECIAL_ACCOUNT ((NTSTATUS)0xC0000124)
-#define STATUS_SPECIAL_GROUP ((NTSTATUS)0xC0000125)
-#define STATUS_SPECIAL_USER ((NTSTATUS)0xC0000126)
-#define STATUS_MEMBERS_PRIMARY_GROUP ((NTSTATUS)0xC0000127)
-#define STATUS_FILE_CLOSED ((NTSTATUS)0xC0000128)
-#define STATUS_TOO_MANY_THREADS ((NTSTATUS)0xC0000129)
-#define STATUS_THREAD_NOT_IN_PROCESS ((NTSTATUS)0xC000012A)
-#define STATUS_TOKEN_ALREADY_IN_USE ((NTSTATUS)0xC000012B)
-#define STATUS_PAGEFILE_QUOTA_EXCEEDED ((NTSTATUS)0xC000012C)
-#define STATUS_COMMITMENT_LIMIT ((NTSTATUS)0xC000012D)
-#define STATUS_INVALID_IMAGE_LE_FORMAT ((NTSTATUS)0xC000012E)
-#define STATUS_INVALID_IMAGE_NOT_MZ ((NTSTATUS)0xC000012F)
-#define STATUS_INVALID_IMAGE_PROTECT ((NTSTATUS)0xC0000130)
-#define STATUS_INVALID_IMAGE_WIN_16 ((NTSTATUS)0xC0000131)
-#define STATUS_LOGON_SERVER_CONFLICT ((NTSTATUS)0xC0000132)
-#define STATUS_TIME_DIFFERENCE_AT_DC ((NTSTATUS)0xC0000133)
-#define STATUS_SYNCHRONIZATION_REQUIRED ((NTSTATUS)0xC0000134)
-#define STATUS_DLL_NOT_FOUND ((NTSTATUS)0xC0000135)
-#define STATUS_OPEN_FAILED ((NTSTATUS)0xC0000136)
-#define STATUS_IO_PRIVILEGE_FAILED ((NTSTATUS)0xC0000137)
-#define STATUS_ORDINAL_NOT_FOUND ((NTSTATUS)0xC0000138)
-#define STATUS_ENTRYPOINT_NOT_FOUND ((NTSTATUS)0xC0000139)
-#define STATUS_CONTROL_C_EXIT ((NTSTATUS)0xC000013A)
-#define STATUS_LOCAL_DISCONNECT ((NTSTATUS)0xC000013B)
-#define STATUS_REMOTE_DISCONNECT ((NTSTATUS)0xC000013C)
-#define STATUS_REMOTE_RESOURCES ((NTSTATUS)0xC000013D)
-#define STATUS_LINK_FAILED ((NTSTATUS)0xC000013E)
-#define STATUS_LINK_TIMEOUT ((NTSTATUS)0xC000013F)
-#define STATUS_INVALID_CONNECTION ((NTSTATUS)0xC0000140)
-#define STATUS_INVALID_ADDRESS ((NTSTATUS)0xC0000141)
-#define STATUS_DLL_INIT_FAILED ((NTSTATUS)0xC0000142)
-#define STATUS_MISSING_SYSTEMFILE ((NTSTATUS)0xC0000143)
-#define STATUS_UNHANDLED_EXCEPTION ((NTSTATUS)0xC0000144)
-#define STATUS_APP_INIT_FAILURE ((NTSTATUS)0xC0000145)
-#define STATUS_PAGEFILE_CREATE_FAILED ((NTSTATUS)0xC0000146)
-#define STATUS_NO_PAGEFILE ((NTSTATUS)0xC0000147)
-#define STATUS_INVALID_LEVEL ((NTSTATUS)0xC0000148)
-#define STATUS_WRONG_PASSWORD_CORE ((NTSTATUS)0xC0000149)
-#define STATUS_ILLEGAL_FLOAT_CONTEXT ((NTSTATUS)0xC000014A)
-#define STATUS_PIPE_BROKEN ((NTSTATUS)0xC000014B)
-#define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014C)
-#define STATUS_REGISTRY_IO_FAILED ((NTSTATUS)0xC000014D)
-#define STATUS_NO_EVENT_PAIR ((NTSTATUS)0xC000014E)
-#define STATUS_UNRECOGNIZED_VOLUME ((NTSTATUS)0xC000014F)
-#define STATUS_SERIAL_NO_DEVICE_INITED ((NTSTATUS)0xC0000150)
-#define STATUS_NO_SUCH_ALIAS ((NTSTATUS)0xC0000151)
-#define STATUS_MEMBER_NOT_IN_ALIAS ((NTSTATUS)0xC0000152)
-#define STATUS_MEMBER_IN_ALIAS ((NTSTATUS)0xC0000153)
-#define STATUS_ALIAS_EXISTS ((NTSTATUS)0xC0000154)
-#define STATUS_LOGON_NOT_GRANTED ((NTSTATUS)0xC0000155)
-#define STATUS_TOO_MANY_SECRETS ((NTSTATUS)0xC0000156)
-#define STATUS_SECRET_TOO_LONG ((NTSTATUS)0xC0000157)
-#define STATUS_INTERNAL_DB_ERROR ((NTSTATUS)0xC0000158)
-#define STATUS_FULLSCREEN_MODE ((NTSTATUS)0xC0000159)
-#define STATUS_TOO_MANY_CONTEXT_IDS ((NTSTATUS)0xC000015A)
-#define STATUS_LOGON_TYPE_NOT_GRANTED ((NTSTATUS)0xC000015B)
-#define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015C)
-#define STATUS_NT_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS)0xC000015D)
-#define STATUS_DOMAIN_CTRLR_CONFIG_ERROR ((NTSTATUS)0xC000015E)
-#define STATUS_FT_MISSING_MEMBER ((NTSTATUS)0xC000015F)
-#define STATUS_ILL_FORMED_SERVICE_ENTRY ((NTSTATUS)0xC0000160)
-#define STATUS_ILLEGAL_CHARACTER ((NTSTATUS)0xC0000161)
-#define STATUS_UNMAPPABLE_CHARACTER ((NTSTATUS)0xC0000162)
-#define STATUS_UNDEFINED_CHARACTER ((NTSTATUS)0xC0000163)
-#define STATUS_FLOPPY_VOLUME ((NTSTATUS)0xC0000164)
-#define STATUS_FLOPPY_ID_MARK_NOT_FOUND ((NTSTATUS)0xC0000165)
-#define STATUS_FLOPPY_WRONG_CYLINDER ((NTSTATUS)0xC0000166)
-#define STATUS_FLOPPY_UNKNOWN_ERROR ((NTSTATUS)0xC0000167)
-#define STATUS_FLOPPY_BAD_REGISTERS ((NTSTATUS)0xC0000168)
-#define STATUS_DISK_RECALIBRATE_FAILED ((NTSTATUS)0xC0000169)
-#define STATUS_DISK_OPERATION_FAILED ((NTSTATUS)0xC000016A)
-#define STATUS_DISK_RESET_FAILED ((NTSTATUS)0xC000016B)
-#define STATUS_SHARED_IRQ_BUSY ((NTSTATUS)0xC000016C)
-#define STATUS_FT_ORPHANING ((NTSTATUS)0xC000016D)
-#define STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT ((NTSTATUS)0xC000016E)
-
-#define STATUS_PARTITION_FAILURE ((NTSTATUS)0xC0000172)
-#define STATUS_INVALID_BLOCK_LENGTH ((NTSTATUS)0xC0000173)
-#define STATUS_DEVICE_NOT_PARTITIONED ((NTSTATUS)0xC0000174)
-#define STATUS_UNABLE_TO_LOCK_MEDIA ((NTSTATUS)0xC0000175)
-#define STATUS_UNABLE_TO_UNLOAD_MEDIA ((NTSTATUS)0xC0000176)
-#define STATUS_EOM_OVERFLOW ((NTSTATUS)0xC0000177)
-#define STATUS_NO_MEDIA ((NTSTATUS)0xC0000178)
-#define STATUS_NO_SUCH_MEMBER ((NTSTATUS)0xC000017A)
-#define STATUS_INVALID_MEMBER ((NTSTATUS)0xC000017B)
-#define STATUS_KEY_DELETED ((NTSTATUS)0xC000017C)
-#define STATUS_NO_LOG_SPACE ((NTSTATUS)0xC000017D)
-#define STATUS_TOO_MANY_SIDS ((NTSTATUS)0xC000017E)
-#define STATUS_LM_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS)0xC000017F)
-#define STATUS_KEY_HAS_CHILDREN ((NTSTATUS)0xC0000180)
-#define STATUS_CHILD_MUST_BE_VOLATILE ((NTSTATUS)0xC0000181)
-#define STATUS_DEVICE_CONFIGURATION_ERROR ((NTSTATUS)0xC0000182)
-#define STATUS_DRIVER_INTERNAL_ERROR ((NTSTATUS)0xC0000183)
-#define STATUS_INVALID_DEVICE_STATE ((NTSTATUS)0xC0000184)
-#define STATUS_IO_DEVICE_ERROR ((NTSTATUS)0xC0000185)
-#define STATUS_DEVICE_PROTOCOL_ERROR ((NTSTATUS)0xC0000186)
-#define STATUS_BACKUP_CONTROLLER ((NTSTATUS)0xC0000187)
-#define STATUS_LOG_FILE_FULL ((NTSTATUS)0xC0000188)
-#define STATUS_TOO_LATE ((NTSTATUS)0xC0000189)
-#define STATUS_NO_TRUST_LSA_SECRET ((NTSTATUS)0xC000018A)
-#define STATUS_NO_TRUST_SAM_ACCOUNT ((NTSTATUS)0xC000018B)
-#define STATUS_TRUSTED_DOMAIN_FAILURE ((NTSTATUS)0xC000018C)
-#define STATUS_TRUSTED_RELATIONSHIP_FAILURE ((NTSTATUS)0xC000018D)
-#define STATUS_EVENTLOG_FILE_CORRUPT ((NTSTATUS)0xC000018E)
-#define STATUS_EVENTLOG_CANT_START ((NTSTATUS)0xC000018F)
-#define STATUS_TRUST_FAILURE ((NTSTATUS)0xC0000190)
-#define STATUS_MUTANT_LIMIT_EXCEEDED ((NTSTATUS)0xC0000191)
-#define STATUS_NETLOGON_NOT_STARTED ((NTSTATUS)0xC0000192)
-#define STATUS_ACCOUNT_EXPIRED ((NTSTATUS)0xC0000193)
-#define STATUS_POSSIBLE_DEADLOCK ((NTSTATUS)0xC0000194)
-#define STATUS_NETWORK_CREDENTIAL_CONFLICT ((NTSTATUS)0xC0000195)
-#define STATUS_REMOTE_SESSION_LIMIT ((NTSTATUS)0xC0000196)
-#define STATUS_EVENTLOG_FILE_CHANGED ((NTSTATUS)0xC0000197)
-#define STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT ((NTSTATUS)0xC0000198)
-#define STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT ((NTSTATUS)0xC0000199)
-#define STATUS_NOLOGON_SERVER_TRUST_ACCOUNT ((NTSTATUS)0xC000019A)
-#define STATUS_DOMAIN_TRUST_INCONSISTENT ((NTSTATUS)0xC000019B)
-#define STATUS_FS_DRIVER_REQUIRED ((NTSTATUS)0xC000019C)
-#define STATUS_NO_USER_SESSION_KEY ((NTSTATUS)0xC0000202)
-#define STATUS_USER_SESSION_DELETED ((NTSTATUS)0xC0000203)
-#define STATUS_RESOURCE_LANG_NOT_FOUND ((NTSTATUS)0xC0000204)
-#define STATUS_INSUFF_SERVER_RESOURCES ((NTSTATUS)0xC0000205)
-#define STATUS_INVALID_BUFFER_SIZE ((NTSTATUS)0xC0000206)
-#define STATUS_INVALID_ADDRESS_COMPONENT ((NTSTATUS)0xC0000207)
-#define STATUS_INVALID_ADDRESS_WILDCARD ((NTSTATUS)0xC0000208)
-#define STATUS_TOO_MANY_ADDRESSES ((NTSTATUS)0xC0000209)
-#define STATUS_ADDRESS_ALREADY_EXISTS ((NTSTATUS)0xC000020A)
-#define STATUS_ADDRESS_CLOSED ((NTSTATUS)0xC000020B)
-#define STATUS_CONNECTION_DISCONNECTED ((NTSTATUS)0xC000020C)
-#define STATUS_CONNECTION_RESET ((NTSTATUS)0xC000020D)
-#define STATUS_TOO_MANY_NODES ((NTSTATUS)0xC000020E)
-#define STATUS_TRANSACTION_ABORTED ((NTSTATUS)0xC000020F)
-#define STATUS_TRANSACTION_TIMED_OUT ((NTSTATUS)0xC0000210)
-#define STATUS_TRANSACTION_NO_RELEASE ((NTSTATUS)0xC0000211)
-#define STATUS_TRANSACTION_NO_MATCH ((NTSTATUS)0xC0000212)
-#define STATUS_TRANSACTION_RESPONDED ((NTSTATUS)0xC0000213)
-#define STATUS_TRANSACTION_INVALID_ID ((NTSTATUS)0xC0000214)
-#define STATUS_TRANSACTION_INVALID_TYPE ((NTSTATUS)0xC0000215)
-#define STATUS_NOT_SERVER_SESSION ((NTSTATUS)0xC0000216)
-#define STATUS_NOT_CLIENT_SESSION ((NTSTATUS)0xC0000217)
-#define STATUS_CANNOT_LOAD_REGISTRY_FILE ((NTSTATUS)0xC0000218)
-#define STATUS_DEBUG_ATTACH_FAILED ((NTSTATUS)0xC0000219)
-#define STATUS_SYSTEM_PROCESS_TERMINATED ((NTSTATUS)0xC000021A)
-#define STATUS_DATA_NOT_ACCEPTED ((NTSTATUS)0xC000021B)
-#define STATUS_NO_BROWSER_SERVERS_FOUND ((NTSTATUS)0xC000021C)
-#define STATUS_VDM_HARD_ERROR ((NTSTATUS)0xC000021D)
-#define STATUS_DRIVER_CANCEL_TIMEOUT ((NTSTATUS)0xC000021E)
-#define STATUS_REPLY_MESSAGE_MISMATCH ((NTSTATUS)0xC000021F)
-#define STATUS_MAPPED_ALIGNMENT ((NTSTATUS)0xC0000220)
-#define STATUS_IMAGE_CHECKSUM_MISMATCH ((NTSTATUS)0xC0000221)
-#define STATUS_LOST_WRITEBEHIND_DATA ((NTSTATUS)0xC0000222)
-#define STATUS_CLIENT_SERVER_PARAMETERS_INVALID ((NTSTATUS)0xC0000223)
-#define STATUS_PASSWORD_MUST_CHANGE ((NTSTATUS)0xC0000224)
-#define STATUS_NOT_FOUND ((NTSTATUS)0xC0000225)
-#define STATUS_NOT_TINY_STREAM ((NTSTATUS)0xC0000226)
-#define STATUS_RECOVERY_FAILURE ((NTSTATUS)0xC0000227)
-#define STATUS_STACK_OVERFLOW_READ ((NTSTATUS)0xC0000228)
-#define STATUS_FAIL_CHECK ((NTSTATUS)0xC0000229)
-#define STATUS_DUPLICATE_OBJECTID ((NTSTATUS)0xC000022A)
-#define STATUS_OBJECTID_EXISTS ((NTSTATUS)0xC000022B)
-#define STATUS_CONVERT_TO_LARGE ((NTSTATUS)0xC000022C)
-#define STATUS_RETRY ((NTSTATUS)0xC000022D)
-#define STATUS_FOUND_OUT_OF_SCOPE ((NTSTATUS)0xC000022E)
-#define STATUS_ALLOCATE_BUCKET ((NTSTATUS)0xC000022F)
-#define STATUS_PROPSET_NOT_FOUND ((NTSTATUS)0xC0000230)
-#define STATUS_MARSHALL_OVERFLOW ((NTSTATUS)0xC0000231)
-#define STATUS_INVALID_VARIANT ((NTSTATUS)0xC0000232)
-#define STATUS_DOMAIN_CONTROLLER_NOT_FOUND ((NTSTATUS)0xC0000233)
-#define STATUS_ACCOUNT_LOCKED_OUT ((NTSTATUS)0xC0000234)
-#define STATUS_HANDLE_NOT_CLOSABLE ((NTSTATUS)0xC0000235)
-#define STATUS_CONNECTION_REFUSED ((NTSTATUS)0xC0000236)
-#define STATUS_GRACEFUL_DISCONNECT ((NTSTATUS)0xC0000237)
-#define STATUS_ADDRESS_ALREADY_ASSOCIATED ((NTSTATUS)0xC0000238)
-#define STATUS_ADDRESS_NOT_ASSOCIATED ((NTSTATUS)0xC0000239)
-#define STATUS_CONNECTION_INVALID ((NTSTATUS)0xC000023A)
-#define STATUS_CONNECTION_ACTIVE ((NTSTATUS)0xC000023B)
-#define STATUS_NETWORK_UNREACHABLE ((NTSTATUS)0xC000023C)
-#define STATUS_HOST_UNREACHABLE ((NTSTATUS)0xC000023D)
-#define STATUS_PROTOCOL_UNREACHABLE ((NTSTATUS)0xC000023E)
-#define STATUS_PORT_UNREACHABLE ((NTSTATUS)0xC000023F)
-#define STATUS_REQUEST_ABORTED ((NTSTATUS)0xC0000240)
-#define STATUS_CONNECTION_ABORTED ((NTSTATUS)0xC0000241)
-#define STATUS_BAD_COMPRESSION_BUFFER ((NTSTATUS)0xC0000242)
-#define STATUS_USER_MAPPED_FILE ((NTSTATUS)0xC0000243)
-#define STATUS_AUDIT_FAILED ((NTSTATUS)0xC0000244)
-#define STATUS_TIMER_RESOLUTION_NOT_SET ((NTSTATUS)0xC0000245)
-#define STATUS_CONNECTION_COUNT_LIMIT ((NTSTATUS)0xC0000246)
-#define STATUS_LOGIN_TIME_RESTRICTION ((NTSTATUS)0xC0000247)
-#define STATUS_LOGIN_WKSTA_RESTRICTION ((NTSTATUS)0xC0000248)
-#define STATUS_IMAGE_MP_UP_MISMATCH ((NTSTATUS)0xC0000249)
-#define STATUS_INSUFFICIENT_LOGON_INFO ((NTSTATUS)0xC0000250)
-#define STATUS_BAD_DLL_ENTRYPOINT ((NTSTATUS)0xC0000251)
-#define STATUS_BAD_SERVICE_ENTRYPOINT ((NTSTATUS)0xC0000252)
-#define STATUS_LPC_REPLY_LOST ((NTSTATUS)0xC0000253)
-#define STATUS_IP_ADDRESS_CONFLICT1 ((NTSTATUS)0xC0000254)
-#define STATUS_IP_ADDRESS_CONFLICT2 ((NTSTATUS)0xC0000255)
-#define STATUS_REGISTRY_QUOTA_LIMIT ((NTSTATUS)0xC0000256)
-#define STATUS_PATH_NOT_COVERED ((NTSTATUS)0xC0000257)
-#define STATUS_NO_CALLBACK_ACTIVE ((NTSTATUS)0xC0000258)
-#define STATUS_LICENSE_QUOTA_EXCEEDED ((NTSTATUS)0xC0000259)
-#define STATUS_PWD_TOO_SHORT ((NTSTATUS)0xC000025A)
-#define STATUS_PWD_TOO_RECENT ((NTSTATUS)0xC000025B)
-#define STATUS_PWD_HISTORY_CONFLICT ((NTSTATUS)0xC000025C)
-#define STATUS_PLUGPLAY_NO_DEVICE ((NTSTATUS)0xC000025E)
-#define STATUS_UNSUPPORTED_COMPRESSION ((NTSTATUS)0xC000025F)
-#define STATUS_INVALID_HW_PROFILE ((NTSTATUS)0xC0000260)
-#define STATUS_INVALID_PLUGPLAY_DEVICE_PATH ((NTSTATUS)0xC0000261)
-#define STATUS_DRIVER_ORDINAL_NOT_FOUND ((NTSTATUS)0xC0000262)
-#define STATUS_DRIVER_ENTRYPOINT_NOT_FOUND ((NTSTATUS)0xC0000263)
-#define STATUS_RESOURCE_NOT_OWNED ((NTSTATUS)0xC0000264)
-#define STATUS_TOO_MANY_LINKS ((NTSTATUS)0xC0000265)
-#define STATUS_QUOTA_LIST_INCONSISTENT ((NTSTATUS)0xC0000266)
-#define STATUS_FILE_IS_OFFLINE ((NTSTATUS)0xC0000267)
-#define STATUS_EVALUATION_EXPIRATION ((NTSTATUS)0xC0000268)
-#define STATUS_ILLEGAL_DLL_RELOCATION ((NTSTATUS)0xC0000269)
-#define STATUS_LICENSE_VIOLATION ((NTSTATUS)0xC000026A)
-#define STATUS_DLL_INIT_FAILED_LOGOFF ((NTSTATUS)0xC000026B)
-#define STATUS_DRIVER_UNABLE_TO_LOAD ((NTSTATUS)0xC000026C)
-#define STATUS_DFS_UNAVAILABLE ((NTSTATUS)0xC000026D)
-#define STATUS_VOLUME_DISMOUNTED ((NTSTATUS)0xC000026E)
-#define STATUS_WX86_INTERNAL_ERROR ((NTSTATUS)0xC000026F)
-#define STATUS_WX86_FLOAT_STACK_CHECK ((NTSTATUS)0xC0000270)
-#define STATUS_VALIDATE_CONTINUE ((NTSTATUS)0xC0000271)
-#define STATUS_NO_MATCH ((NTSTATUS)0xC0000272)
-#define STATUS_NO_MORE_MATCHES ((NTSTATUS)0xC0000273)
-#define STATUS_NOT_A_REPARSE_POINT ((NTSTATUS)0xC0000275)
-#define STATUS_IO_REPARSE_TAG_INVALID ((NTSTATUS)0xC0000276)
-#define STATUS_IO_REPARSE_TAG_MISMATCH ((NTSTATUS)0xC0000277)
-#define STATUS_IO_REPARSE_DATA_INVALID ((NTSTATUS)0xC0000278)
-#define STATUS_IO_REPARSE_TAG_NOT_HANDLED ((NTSTATUS)0xC0000279)
-#define STATUS_REPARSE_POINT_NOT_RESOLVED ((NTSTATUS)0xC0000280)
-#define STATUS_DIRECTORY_IS_A_REPARSE_POINT ((NTSTATUS)0xC0000281)
-#define STATUS_RANGE_LIST_CONFLICT ((NTSTATUS)0xC0000282)
-#define STATUS_SOURCE_ELEMENT_EMPTY ((NTSTATUS)0xC0000283)
-#define STATUS_DESTINATION_ELEMENT_FULL ((NTSTATUS)0xC0000284)
-#define STATUS_ILLEGAL_ELEMENT_ADDRESS ((NTSTATUS)0xC0000285)
-#define STATUS_MAGAZINE_NOT_PRESENT ((NTSTATUS)0xC0000286)
-#define STATUS_REINITIALIZATION_NEEDED ((NTSTATUS)0xC0000287)
-#define STATUS_ENCRYPTION_FAILED ((NTSTATUS)0xC000028A)
-#define STATUS_DECRYPTION_FAILED ((NTSTATUS)0xC000028B)
-#define STATUS_RANGE_NOT_FOUND ((NTSTATUS)0xC000028C)
-#define STATUS_NO_RECOVERY_POLICY ((NTSTATUS)0xC000028D)
-#define STATUS_NO_EFS ((NTSTATUS)0xC000028E)
-#define STATUS_WRONG_EFS ((NTSTATUS)0xC000028F)
-#define STATUS_NO_USER_KEYS ((NTSTATUS)0xC0000290)
-#define STATUS_FILE_NOT_ENCRYPTED ((NTSTATUS)0xC0000291)
-#define STATUS_NOT_EXPORT_FORMAT ((NTSTATUS)0xC0000292)
-#define STATUS_FILE_ENCRYPTED ((NTSTATUS)0xC0000293)
-#define STATUS_WMI_GUID_NOT_FOUND ((NTSTATUS)0xC0000295)
-#define STATUS_WMI_INSTANCE_NOT_FOUND ((NTSTATUS)0xC0000296)
-#define STATUS_WMI_ITEMID_NOT_FOUND ((NTSTATUS)0xC0000297)
-#define STATUS_WMI_TRY_AGAIN ((NTSTATUS)0xC0000298)
-#define STATUS_SHARED_POLICY ((NTSTATUS)0xC0000299)
-#define STATUS_POLICY_OBJECT_NOT_FOUND ((NTSTATUS)0xC000029A)
-#define STATUS_POLICY_ONLY_IN_DS ((NTSTATUS)0xC000029B)
-#define STATUS_VOLUME_NOT_UPGRADED ((NTSTATUS)0xC000029C)
-#define STATUS_REMOTE_STORAGE_NOT_ACTIVE ((NTSTATUS)0xC000029D)
-#define STATUS_REMOTE_STORAGE_MEDIA_ERROR ((NTSTATUS)0xC000029E)
-#define STATUS_NO_TRACKING_SERVICE ((NTSTATUS)0xC000029F)
-#define STATUS_SERVER_SID_MISMATCH ((NTSTATUS)0xC00002A0)
-#define STATUS_DS_NO_ATTRIBUTE_OR_VALUE ((NTSTATUS)0xC00002A1)
-#define STATUS_DS_INVALID_ATTRIBUTE_SYNTAX ((NTSTATUS)0xC00002A2)
-#define STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED ((NTSTATUS)0xC00002A3)
-#define STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS ((NTSTATUS)0xC00002A4)
-#define STATUS_DS_BUSY ((NTSTATUS)0xC00002A5)
-#define STATUS_DS_UNAVAILABLE ((NTSTATUS)0xC00002A6)
-#define STATUS_DS_NO_RIDS_ALLOCATED ((NTSTATUS)0xC00002A7)
-#define STATUS_DS_NO_MORE_RIDS ((NTSTATUS)0xC00002A8)
-#define STATUS_DS_INCORRECT_ROLE_OWNER ((NTSTATUS)0xC00002A9)
-#define STATUS_DS_RIDMGR_INIT_ERROR ((NTSTATUS)0xC00002AA)
-#define STATUS_DS_OBJ_CLASS_VIOLATION ((NTSTATUS)0xC00002AB)
-#define STATUS_DS_CANT_ON_NON_LEAF ((NTSTATUS)0xC00002AC)
-#define STATUS_DS_CANT_ON_RDN ((NTSTATUS)0xC00002AD)
-#define STATUS_DS_CANT_MOD_OBJ_CLASS ((NTSTATUS)0xC00002AE)
-#define STATUS_DS_CROSS_DOM_MOVE_FAILED ((NTSTATUS)0xC00002AF)
-#define STATUS_DS_GC_NOT_AVAILABLE ((NTSTATUS)0xC00002B0)
-#define STATUS_DIRECTORY_SERVICE_REQUIRED ((NTSTATUS)0xC00002B1)
-#define STATUS_REPARSE_ATTRIBUTE_CONFLICT ((NTSTATUS)0xC00002B2)
-#define STATUS_CANT_ENABLE_DENY_ONLY ((NTSTATUS)0xC00002B3)
-#define STATUS_FLOAT_MULTIPLE_FAULTS ((NTSTATUS)0xC00002B4)
-#define STATUS_FLOAT_MULTIPLE_TRAPS ((NTSTATUS)0xC00002B5)
-#define STATUS_DEVICE_REMOVED ((NTSTATUS)0xC00002B6)
-#define STATUS_JOURNAL_DELETE_IN_PROGRESS ((NTSTATUS)0xC00002B7)
-#define STATUS_JOURNAL_NOT_ACTIVE ((NTSTATUS)0xC00002B8)
-#define STATUS_NOINTERFACE ((NTSTATUS)0xC00002B9)
-#define STATUS_DS_ADMIN_LIMIT_EXCEEDED ((NTSTATUS)0xC00002C1)
-#define STATUS_DRIVER_FAILED_SLEEP ((NTSTATUS)0xC00002C2)
-#define STATUS_MUTUAL_AUTHENTICATION_FAILED ((NTSTATUS)0xC00002C3)
-#define STATUS_CORRUPT_SYSTEM_FILE ((NTSTATUS)0xC00002C4)
-#define STATUS_DATATYPE_MISALIGNMENT_ERROR ((NTSTATUS)0xC00002C5)
-#define STATUS_WMI_READ_ONLY ((NTSTATUS)0xC00002C6)
-#define STATUS_WMI_SET_FAILURE ((NTSTATUS)0xC00002C7)
-#define STATUS_COMMITMENT_MINIMUM ((NTSTATUS)0xC00002C8)
-#define STATUS_REG_NAT_CONSUMPTION ((NTSTATUS)0xC00002C9)
-#define STATUS_TRANSPORT_FULL ((NTSTATUS)0xC00002CA)
-#define STATUS_DS_SAM_INIT_FAILURE ((NTSTATUS)0xC00002CB)
-#define STATUS_ONLY_IF_CONNECTED ((NTSTATUS)0xC00002CC)
-#define STATUS_DS_SENSITIVE_GROUP_VIOLATION ((NTSTATUS)0xC00002CD)
-#define STATUS_PNP_RESTART_ENUMERATION ((NTSTATUS)0xC00002CE)
-#define STATUS_JOURNAL_ENTRY_DELETED ((NTSTATUS)0xC00002CF)
-#define STATUS_DS_CANT_MOD_PRIMARYGROUPID ((NTSTATUS)0xC00002D0)
-#define STATUS_SYSTEM_IMAGE_BAD_SIGNATURE ((NTSTATUS)0xC00002D1)
-#define STATUS_PNP_REBOOT_REQUIRED ((NTSTATUS)0xC00002D2)
-#define STATUS_POWER_STATE_INVALID ((NTSTATUS)0xC00002D3)
-#define STATUS_DS_INVALID_GROUP_TYPE ((NTSTATUS)0xC00002D4)
-#define STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN ((NTSTATUS)0xC00002D5)
-#define STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN ((NTSTATUS)0xC00002D6)
-#define STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS)0xC00002D7)
-#define STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS)0xC00002D8)
-#define STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS)0xC00002D9)
-#define STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER ((NTSTATUS)0xC00002DA)
-#define STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER ((NTSTATUS)0xC00002DB)
-#define STATUS_DS_HAVE_PRIMARY_MEMBERS ((NTSTATUS)0xC00002DC)
-#define STATUS_WMI_NOT_SUPPORTED ((NTSTATUS)0xC00002DD)
-#define STATUS_INSUFFICIENT_POWER ((NTSTATUS)0xC00002DE)
-#define STATUS_SAM_NEED_BOOTKEY_PASSWORD ((NTSTATUS)0xC00002DF)
-#define STATUS_SAM_NEED_BOOTKEY_FLOPPY ((NTSTATUS)0xC00002E0)
-#define STATUS_DS_CANT_START ((NTSTATUS)0xC00002E1)
-#define STATUS_DS_INIT_FAILURE ((NTSTATUS)0xC00002E2)
-#define STATUS_SAM_INIT_FAILURE ((NTSTATUS)0xC00002E3)
-#define STATUS_DS_GC_REQUIRED ((NTSTATUS)0xC00002E4)
-#define STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY ((NTSTATUS)0xC00002E5)
-#define STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS ((NTSTATUS)0xC00002E6)
-#define STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED ((NTSTATUS)0xC00002E7)
-#define STATUS_MULTIPLE_FAULT_VIOLATION ((NTSTATUS)0xC00002E8)
-#define STATUS_CURRENT_DOMAIN_NOT_ALLOWED ((NTSTATUS)0xC00002E9)
-#define STATUS_CANNOT_MAKE ((NTSTATUS)0xC00002EA)
-#define STATUS_SYSTEM_SHUTDOWN ((NTSTATUS)0xC00002EB)
-#define STATUS_DS_INIT_FAILURE_CONSOLE ((NTSTATUS)0xC00002EC)
-#define STATUS_DS_SAM_INIT_FAILURE_CONSOLE ((NTSTATUS)0xC00002ED)
-#define STATUS_UNFINISHED_CONTEXT_DELETED ((NTSTATUS)0xC00002EE)
-#define STATUS_NO_TGT_REPLY ((NTSTATUS)0xC00002EF)
-#define STATUS_OBJECTID_NOT_FOUND ((NTSTATUS)0xC00002F0)
-#define STATUS_NO_IP_ADDRESSES ((NTSTATUS)0xC00002F1)
-#define STATUS_WRONG_CREDENTIAL_HANDLE ((NTSTATUS)0xC00002F2)
-#define STATUS_CRYPTO_SYSTEM_INVALID ((NTSTATUS)0xC00002F3)
-#define STATUS_MAX_REFERRALS_EXCEEDED ((NTSTATUS)0xC00002F4)
-#define STATUS_MUST_BE_KDC ((NTSTATUS)0xC00002F5)
-#define STATUS_STRONG_CRYPTO_NOT_SUPPORTED ((NTSTATUS)0xC00002F6)
-#define STATUS_TOO_MANY_PRINCIPALS ((NTSTATUS)0xC00002F7)
-#define STATUS_NO_PA_DATA ((NTSTATUS)0xC00002F8)
-#define STATUS_PKINIT_NAME_MISMATCH ((NTSTATUS)0xC00002F9)
-#define STATUS_SMARTCARD_LOGON_REQUIRED ((NTSTATUS)0xC00002FA)
-#define STATUS_KDC_INVALID_REQUEST ((NTSTATUS)0xC00002FB)
-#define STATUS_KDC_UNABLE_TO_REFER ((NTSTATUS)0xC00002FC)
-#define STATUS_KDC_UNKNOWN_ETYPE ((NTSTATUS)0xC00002FD)
-#define STATUS_SHUTDOWN_IN_PROGRESS ((NTSTATUS)0xC00002FE)
-#define STATUS_SERVER_SHUTDOWN_IN_PROGRESS ((NTSTATUS)0xC00002FF)
-#define STATUS_NOT_SUPPORTED_ON_SBS ((NTSTATUS)0xC0000300)
-#define STATUS_WMI_GUID_DISCONNECTED ((NTSTATUS)0xC0000301)
-#define STATUS_WMI_ALREADY_DISABLED ((NTSTATUS)0xC0000302)
-#define STATUS_WMI_ALREADY_ENABLED ((NTSTATUS)0xC0000303)
-#define STATUS_MFT_TOO_FRAGMENTED ((NTSTATUS)0xC0000304)
-#define STATUS_COPY_PROTECTION_FAILURE ((NTSTATUS)0xC0000305)
-#define STATUS_CSS_AUTHENTICATION_FAILURE ((NTSTATUS)0xC0000306)
-#define STATUS_CSS_KEY_NOT_PRESENT ((NTSTATUS)0xC0000307)
-#define STATUS_CSS_KEY_NOT_ESTABLISHED ((NTSTATUS)0xC0000308)
-#define STATUS_CSS_SCRAMBLED_SECTOR ((NTSTATUS)0xC0000309)
-#define STATUS_CSS_REGION_MISMATCH ((NTSTATUS)0xC000030A)
-#define STATUS_CSS_RESETS_EXHAUSTED ((NTSTATUS)0xC000030B)
-#define STATUS_PKINIT_FAILURE ((NTSTATUS)0xC0000320)
-#define STATUS_SMARTCARD_SUBSYSTEM_FAILURE ((NTSTATUS)0xC0000321)
-#define STATUS_NO_KERB_KEY ((NTSTATUS)0xC0000322)
-#define STATUS_HOST_DOWN ((NTSTATUS)0xC0000350)
-#define STATUS_UNSUPPORTED_PREAUTH ((NTSTATUS)0xC0000351)
-#define STATUS_EFS_ALG_BLOB_TOO_BIG ((NTSTATUS)0xC0000352)
-#define STATUS_PORT_NOT_SET ((NTSTATUS)0xC0000353)
-#define STATUS_DEBUGGER_INACTIVE ((NTSTATUS)0xC0000354)
-#define STATUS_DS_VERSION_CHECK_FAILURE ((NTSTATUS)0xC0000355)
-#define STATUS_AUDITING_DISABLED ((NTSTATUS)0xC0000356)
-#define STATUS_PRENT4_MACHINE_ACCOUNT ((NTSTATUS)0xC0000357)
-#define STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS)0xC0000358)
-#define STATUS_INVALID_IMAGE_WIN_32 ((NTSTATUS)0xC0000359)
-#define STATUS_INVALID_IMAGE_WIN_64 ((NTSTATUS)0xC000035A)
-#define STATUS_BAD_BINDINGS ((NTSTATUS)0xC000035B)
-#define STATUS_NETWORK_SESSION_EXPIRED ((NTSTATUS)0xC000035C)
-#define STATUS_APPHELP_BLOCK ((NTSTATUS)0xC000035D)
-#define STATUS_ALL_SIDS_FILTERED ((NTSTATUS)0xC000035E)
-#define STATUS_NOT_SAFE_MODE_DRIVER ((NTSTATUS)0xC000035F)
-#define STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT ((NTSTATUS)0xC0000361)
-#define STATUS_ACCESS_DISABLED_BY_POLICY_PATH ((NTSTATUS)0xC0000362)
-#define STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER ((NTSTATUS)0xC0000363)
-#define STATUS_ACCESS_DISABLED_BY_POLICY_OTHER ((NTSTATUS)0xC0000364)
-#define STATUS_FAILED_DRIVER_ENTRY ((NTSTATUS)0xC0000365)
-#define STATUS_DEVICE_ENUMERATION_ERROR ((NTSTATUS)0xC0000366)
-#define STATUS_WAIT_FOR_OPLOCK ((NTSTATUS)0x00000367)
-#define STATUS_MOUNT_POINT_NOT_RESOLVED ((NTSTATUS)0xC0000368)
-#define STATUS_INVALID_DEVICE_OBJECT_PARAMETER ((NTSTATUS)0xC0000369)
-#define STATUS_MCA_OCCURED ((NTSTATUS)0xC000036A)
-#define STATUS_DRIVER_BLOCKED_CRITICAL ((NTSTATUS)0xC000036B)
-#define STATUS_DRIVER_BLOCKED ((NTSTATUS)0xC000036C)
-#define STATUS_DRIVER_DATABASE_ERROR ((NTSTATUS)0xC000036D)
-#define STATUS_SYSTEM_HIVE_TOO_LARGE ((NTSTATUS)0xC000036E)
-#define STATUS_INVALID_IMPORT_OF_NON_DLL ((NTSTATUS)0xC000036F)
-#define STATUS_SMARTCARD_WRONG_PIN ((NTSTATUS)0xC0000380)
-#define STATUS_SMARTCARD_CARD_BLOCKED ((NTSTATUS)0xC0000381)
-#define STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED ((NTSTATUS)0xC0000382)
-#define STATUS_SMARTCARD_NO_CARD ((NTSTATUS)0xC0000383)
-#define STATUS_SMARTCARD_NO_KEY_CONTAINER ((NTSTATUS)0xC0000384)
-#define STATUS_SMARTCARD_NO_CERTIFICATE ((NTSTATUS)0xC0000385)
-#define STATUS_SMARTCARD_NO_KEYSET ((NTSTATUS)0xC0000386)
-#define STATUS_SMARTCARD_IO_ERROR ((NTSTATUS)0xC0000387)
-#define STATUS_DOWNGRADE_DETECTED ((NTSTATUS)0xC0000388)
-#define STATUS_SMARTCARD_CERT_REVOKED ((NTSTATUS)0xC0000389)
-#define STATUS_ISSUING_CA_UNTRUSTED ((NTSTATUS)0xC000038A)
-#define STATUS_REVOCATION_OFFLINE_C ((NTSTATUS)0xC000038B)
-#define STATUS_PKINIT_CLIENT_FAILURE ((NTSTATUS)0xC000038C)
-#define STATUS_SMARTCARD_CERT_EXPIRED ((NTSTATUS)0xC000038D)
-#define STATUS_DRIVER_FAILED_PRIOR_UNLOAD ((NTSTATUS)0xC000038E)
-#define STATUS_SMARTCARD_SILENT_CONTEXT ((NTSTATUS)0xC000038F)
-#define STATUS_PER_USER_TRUST_QUOTA_EXCEEDED ((NTSTATUS)0xC0000401)
-#define STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED ((NTSTATUS)0xC0000402)
-#define STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED ((NTSTATUS)0xC0000403)
-#define STATUS_DS_NAME_NOT_UNIQUE ((NTSTATUS)0xC0000404)
-#define STATUS_DS_DUPLICATE_ID_FOUND ((NTSTATUS)0xC0000405)
-#define STATUS_DS_GROUP_CONVERSION_ERROR ((NTSTATUS)0xC0000406)
-#define STATUS_VOLSNAP_PREPARE_HIBERNATE ((NTSTATUS)0xC0000407)
-#define STATUS_USER2USER_REQUIRED ((NTSTATUS)0xC0000408)
-#define STATUS_STACK_BUFFER_OVERRUN ((NTSTATUS)0xC0000409)
-#define STATUS_NO_S4U_PROT_SUPPORT ((NTSTATUS)0xC000040A)
-#define STATUS_CROSSREALM_DELEGATION_FAILURE ((NTSTATUS)0xC000040B)
-#define STATUS_REVOCATION_OFFLINE_KDC ((NTSTATUS)0xC000040C)
-#define STATUS_ISSUING_CA_UNTRUSTED_KDC ((NTSTATUS)0xC000040D)
-#define STATUS_KDC_CERT_EXPIRED ((NTSTATUS)0xC000040E)
-#define STATUS_KDC_CERT_REVOKED ((NTSTATUS)0xC000040F)
-#define STATUS_PARAMETER_QUOTA_EXCEEDED ((NTSTATUS)0xC0000410)
-#define STATUS_HIBERNATION_FAILURE ((NTSTATUS)0xC0000411)
-#define STATUS_DELAY_LOAD_FAILED ((NTSTATUS)0xC0000412)
-#define STATUS_AUTHENTICATION_FIREWALL_FAILED ((NTSTATUS)0xC0000413)
-#define STATUS_VDM_DISALLOWED ((NTSTATUS)0xC0000414)
-#define STATUS_HUNG_DISPLAY_DRIVER_THREAD ((NTSTATUS)0xC0000415)
-#define STATUS_ASSERTION_FAILURE ((NTSTATUS)0xC0000420L)
-#define STATUS_CALLBACK_POP_STACK ((NTSTATUS)0xC0000423)
-#define STATUS_WOW_ASSERTION ((NTSTATUS)0xC0009898)
-
-#define RPC_NT_INVALID_STRING_BINDING ((NTSTATUS)0xC0020001)
-#define RPC_NT_WRONG_KIND_OF_BINDING ((NTSTATUS)0xC0020002)
-#define RPC_NT_INVALID_BINDING ((NTSTATUS)0xC0020003)
-#define RPC_NT_PROTSEQ_NOT_SUPPORTED ((NTSTATUS)0xC0020004)
-#define RPC_NT_INVALID_RPC_PROTSEQ ((NTSTATUS)0xC0020005)
-#define RPC_NT_INVALID_STRING_UUID ((NTSTATUS)0xC0020006)
-#define RPC_NT_INVALID_ENDPOINT_FORMAT ((NTSTATUS)0xC0020007)
-#define RPC_NT_INVALID_NET_ADDR ((NTSTATUS)0xC0020008)
-#define RPC_NT_NO_ENDPOINT_FOUND ((NTSTATUS)0xC0020009)
-#define RPC_NT_INVALID_TIMEOUT ((NTSTATUS)0xC002000A)
-#define RPC_NT_OBJECT_NOT_FOUND ((NTSTATUS)0xC002000B)
-#define RPC_NT_ALREADY_REGISTERED ((NTSTATUS)0xC002000C)
-#define RPC_NT_TYPE_ALREADY_REGISTERED ((NTSTATUS)0xC002000D)
-#define RPC_NT_ALREADY_LISTENING ((NTSTATUS)0xC002000E)
-#define RPC_NT_NO_PROTSEQS_REGISTERED ((NTSTATUS)0xC002000F)
-#define RPC_NT_NOT_LISTENING ((NTSTATUS)0xC0020010)
-#define RPC_NT_UNKNOWN_MGR_TYPE ((NTSTATUS)0xC0020011)
-#define RPC_NT_UNKNOWN_IF ((NTSTATUS)0xC0020012)
-#define RPC_NT_NO_BINDINGS ((NTSTATUS)0xC0020013)
-#define RPC_NT_NO_PROTSEQS ((NTSTATUS)0xC0020014)
-#define RPC_NT_CANT_CREATE_ENDPOINT ((NTSTATUS)0xC0020015)
-#define RPC_NT_OUT_OF_RESOURCES ((NTSTATUS)0xC0020016)
-#define RPC_NT_SERVER_UNAVAILABLE ((NTSTATUS)0xC0020017)
-#define RPC_NT_SERVER_TOO_BUSY ((NTSTATUS)0xC0020018)
-#define RPC_NT_INVALID_NETWORK_OPTIONS ((NTSTATUS)0xC0020019)
-#define RPC_NT_NO_CALL_ACTIVE ((NTSTATUS)0xC002001A)
-#define RPC_NT_CALL_FAILED ((NTSTATUS)0xC002001B)
-#define RPC_NT_CALL_FAILED_DNE ((NTSTATUS)0xC002001C)
-#define RPC_NT_PROTOCOL_ERROR ((NTSTATUS)0xC002001D)
-#define RPC_NT_UNSUPPORTED_TRANS_SYN ((NTSTATUS)0xC002001F)
-#define RPC_NT_UNSUPPORTED_TYPE ((NTSTATUS)0xC0020021)
-#define RPC_NT_INVALID_TAG ((NTSTATUS)0xC0020022)
-#define RPC_NT_INVALID_BOUND ((NTSTATUS)0xC0020023)
-#define RPC_NT_NO_ENTRY_NAME ((NTSTATUS)0xC0020024)
-#define RPC_NT_INVALID_NAME_SYNTAX ((NTSTATUS)0xC0020025)
-#define RPC_NT_UNSUPPORTED_NAME_SYNTAX ((NTSTATUS)0xC0020026)
-#define RPC_NT_UUID_NO_ADDRESS ((NTSTATUS)0xC0020028)
-#define RPC_NT_DUPLICATE_ENDPOINT ((NTSTATUS)0xC0020029)
-#define RPC_NT_UNKNOWN_AUTHN_TYPE ((NTSTATUS)0xC002002A)
-#define RPC_NT_MAX_CALLS_TOO_SMALL ((NTSTATUS)0xC002002B)
-#define RPC_NT_STRING_TOO_LONG ((NTSTATUS)0xC002002C)
-#define RPC_NT_PROTSEQ_NOT_FOUND ((NTSTATUS)0xC002002D)
-#define RPC_NT_PROCNUM_OUT_OF_RANGE ((NTSTATUS)0xC002002E)
-#define RPC_NT_BINDING_HAS_NO_AUTH ((NTSTATUS)0xC002002F)
-#define RPC_NT_UNKNOWN_AUTHN_SERVICE ((NTSTATUS)0xC0020030)
-#define RPC_NT_UNKNOWN_AUTHN_LEVEL ((NTSTATUS)0xC0020031)
-#define RPC_NT_INVALID_AUTH_IDENTITY ((NTSTATUS)0xC0020032)
-#define RPC_NT_UNKNOWN_AUTHZ_SERVICE ((NTSTATUS)0xC0020033)
-#define EPT_NT_INVALID_ENTRY ((NTSTATUS)0xC0020034)
-#define EPT_NT_CANT_PERFORM_OP ((NTSTATUS)0xC0020035)
-#define EPT_NT_NOT_REGISTERED ((NTSTATUS)0xC0020036)
-#define RPC_NT_NOTHING_TO_EXPORT ((NTSTATUS)0xC0020037)
-#define RPC_NT_INCOMPLETE_NAME ((NTSTATUS)0xC0020038)
-#define RPC_NT_INVALID_VERS_OPTION ((NTSTATUS)0xC0020039)
-#define RPC_NT_NO_MORE_MEMBERS ((NTSTATUS)0xC002003A)
-#define RPC_NT_NOT_ALL_OBJS_UNEXPORTED ((NTSTATUS)0xC002003B)
-#define RPC_NT_INTERFACE_NOT_FOUND ((NTSTATUS)0xC002003C)
-#define RPC_NT_ENTRY_ALREADY_EXISTS ((NTSTATUS)0xC002003D)
-#define RPC_NT_ENTRY_NOT_FOUND ((NTSTATUS)0xC002003E)
-#define RPC_NT_NAME_SERVICE_UNAVAILABLE ((NTSTATUS)0xC002003F)
-#define RPC_NT_INVALID_NAF_ID ((NTSTATUS)0xC0020040)
-#define RPC_NT_CANNOT_SUPPORT ((NTSTATUS)0xC0020041)
-#define RPC_NT_NO_CONTEXT_AVAILABLE ((NTSTATUS)0xC0020042)
-#define RPC_NT_INTERNAL_ERROR ((NTSTATUS)0xC0020043)
-#define RPC_NT_ZERO_DIVIDE ((NTSTATUS)0xC0020044)
-#define RPC_NT_ADDRESS_ERROR ((NTSTATUS)0xC0020045)
-#define RPC_NT_FP_DIV_ZERO ((NTSTATUS)0xC0020046)
-#define RPC_NT_FP_UNDERFLOW ((NTSTATUS)0xC0020047)
-#define RPC_NT_FP_OVERFLOW ((NTSTATUS)0xC0020048)
-#define RPC_NT_CALL_IN_PROGRESS ((NTSTATUS)0xC0020049)
-#define RPC_NT_NO_MORE_BINDINGS ((NTSTATUS)0xC002004A)
-#define RPC_NT_GROUP_MEMBER_NOT_FOUND ((NTSTATUS)0xC002004B)
-#define EPT_NT_CANT_CREATE ((NTSTATUS)0xC002004C)
-#define RPC_NT_INVALID_OBJECT ((NTSTATUS)0xC002004D)
-#define RPC_NT_NO_INTERFACES ((NTSTATUS)0xC002004F)
-#define RPC_NT_CALL_CANCELLED ((NTSTATUS)0xC0020050)
-#define RPC_NT_BINDING_INCOMPLETE ((NTSTATUS)0xC0020051)
-#define RPC_NT_COMM_FAILURE ((NTSTATUS)0xC0020052)
-#define RPC_NT_UNSUPPORTED_AUTHN_LEVEL ((NTSTATUS)0xC0020053)
-#define RPC_NT_NO_PRINC_NAME ((NTSTATUS)0xC0020054)
-#define RPC_NT_NOT_RPC_ERROR ((NTSTATUS)0xC0020055)
-#define RPC_NT_SEC_PKG_ERROR ((NTSTATUS)0xC0020057)
-#define RPC_NT_NOT_CANCELLED ((NTSTATUS)0xC0020058)
-#define RPC_NT_INVALID_ASYNC_HANDLE ((NTSTATUS)0xC0020062)
-#define RPC_NT_INVALID_ASYNC_CALL ((NTSTATUS)0xC0020063)
-
-#define RPC_NT_NO_MORE_ENTRIES ((NTSTATUS)0xC0030001)
-#define RPC_NT_SS_CHAR_TRANS_OPEN_FAIL ((NTSTATUS)0xC0030002)
-#define RPC_NT_SS_CHAR_TRANS_SHORT_FILE ((NTSTATUS)0xC0030003)
-#define RPC_NT_SS_IN_NULL_CONTEXT ((NTSTATUS)0xC0030004)
-#define RPC_NT_SS_CONTEXT_MISMATCH ((NTSTATUS)0xC0030005)
-#define RPC_NT_SS_CONTEXT_DAMAGED ((NTSTATUS)0xC0030006)
-#define RPC_NT_SS_HANDLES_MISMATCH ((NTSTATUS)0xC0030007)
-#define RPC_NT_SS_CANNOT_GET_CALL_HANDLE ((NTSTATUS)0xC0030008)
-#define RPC_NT_NULL_REF_POINTER ((NTSTATUS)0xC0030009)
-#define RPC_NT_ENUM_VALUE_OUT_OF_RANGE ((NTSTATUS)0xC003000A)
-#define RPC_NT_BYTE_COUNT_TOO_SMALL ((NTSTATUS)0xC003000B)
-#define RPC_NT_BAD_STUB_DATA ((NTSTATUS)0xC003000C)
-#define RPC_NT_INVALID_ES_ACTION ((NTSTATUS)0xC0030059)
-#define RPC_NT_WRONG_ES_VERSION ((NTSTATUS)0xC003005A)
-#define RPC_NT_WRONG_STUB_VERSION ((NTSTATUS)0xC003005B)
-#define RPC_NT_INVALID_PIPE_OBJECT ((NTSTATUS)0xC003005C)
-#define RPC_NT_INVALID_PIPE_OPERATION ((NTSTATUS)0xC003005D)
-#define RPC_NT_WRONG_PIPE_VERSION ((NTSTATUS)0xC003005E)
-#define RPC_NT_PIPE_CLOSED ((NTSTATUS)0xC003005F)
-#define RPC_NT_PIPE_DISCIPLINE_ERROR ((NTSTATUS)0xC0030060)
-#define RPC_NT_PIPE_EMPTY ((NTSTATUS)0xC0030061)
-
-#define STATUS_PNP_BAD_MPS_TABLE ((NTSTATUS)0xC0040035)
-#define STATUS_PNP_TRANSLATION_FAILED ((NTSTATUS)0xC0040036)
-#define STATUS_PNP_IRQ_TRANSLATION_FAILED ((NTSTATUS)0xC0040037)
-#define STATUS_PNP_INVALID_ID ((NTSTATUS)0xC0040038)
-
-#define STATUS_CTX_WINSTATION_NAME_INVALID ((NTSTATUS)0xC00A0001)
-#define STATUS_CTX_INVALID_PD ((NTSTATUS)0xC00A0002)
-#define STATUS_CTX_PD_NOT_FOUND ((NTSTATUS)0xC00A0003)
-#define STATUS_CTX_CLOSE_PENDING ((NTSTATUS)0xC00A0006)
-#define STATUS_CTX_NO_OUTBUF ((NTSTATUS)0xC00A0007)
-#define STATUS_CTX_MODEM_INF_NOT_FOUND ((NTSTATUS)0xC00A0008)
-#define STATUS_CTX_INVALID_MODEMNAME ((NTSTATUS)0xC00A0009)
-#define STATUS_CTX_RESPONSE_ERROR ((NTSTATUS)0xC00A000A)
-#define STATUS_CTX_MODEM_RESPONSE_TIMEOUT ((NTSTATUS)0xC00A000B)
-#define STATUS_CTX_MODEM_RESPONSE_NO_CARRIER ((NTSTATUS)0xC00A000C)
-#define STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE ((NTSTATUS)0xC00A000D)
-#define STATUS_CTX_MODEM_RESPONSE_BUSY ((NTSTATUS)0xC00A000E)
-#define STATUS_CTX_MODEM_RESPONSE_VOICE ((NTSTATUS)0xC00A000F)
-#define STATUS_CTX_TD_ERROR ((NTSTATUS)0xC00A0010)
-#define STATUS_CTX_LICENSE_CLIENT_INVALID ((NTSTATUS)0xC00A0012)
-#define STATUS_CTX_LICENSE_NOT_AVAILABLE ((NTSTATUS)0xC00A0013)
-#define STATUS_CTX_LICENSE_EXPIRED ((NTSTATUS)0xC00A0014)
-#define STATUS_CTX_WINSTATION_NOT_FOUND ((NTSTATUS)0xC00A0015)
-#define STATUS_CTX_WINSTATION_NAME_COLLISION ((NTSTATUS)0xC00A0016)
-#define STATUS_CTX_WINSTATION_BUSY ((NTSTATUS)0xC00A0017)
-#define STATUS_CTX_BAD_VIDEO_MODE ((NTSTATUS)0xC00A0018)
-#define STATUS_CTX_GRAPHICS_INVALID ((NTSTATUS)0xC00A0022)
-#define STATUS_CTX_NOT_CONSOLE ((NTSTATUS)0xC00A0024)
-#define STATUS_CTX_CLIENT_QUERY_TIMEOUT ((NTSTATUS)0xC00A0026)
-#define STATUS_CTX_CONSOLE_DISCONNECT ((NTSTATUS)0xC00A0027)
-#define STATUS_CTX_CONSOLE_CONNECT ((NTSTATUS)0xC00A0028)
-#define STATUS_CTX_SHADOW_DENIED ((NTSTATUS)0xC00A002A)
-#define STATUS_CTX_WINSTATION_ACCESS_DENIED ((NTSTATUS)0xC00A002B)
-#define STATUS_CTX_INVALID_WD ((NTSTATUS)0xC00A002E)
-#define STATUS_CTX_WD_NOT_FOUND ((NTSTATUS)0xC00A002F)
-#define STATUS_CTX_SHADOW_INVALID ((NTSTATUS)0xC00A0030)
-#define STATUS_CTX_SHADOW_DISABLED ((NTSTATUS)0xC00A0031)
-#define STATUS_RDP_PROTOCOL_ERROR ((NTSTATUS)0xC00A0032)
-#define STATUS_CTX_CLIENT_LICENSE_NOT_SET ((NTSTATUS)0xC00A0033)
-#define STATUS_CTX_CLIENT_LICENSE_IN_USE ((NTSTATUS)0xC00A0034)
-#define STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE ((NTSTATUS)0xC00A0035)
-#define STATUS_CTX_SHADOW_NOT_RUNNING ((NTSTATUS)0xC00A0036)
-
-#define STATUS_CLUSTER_INVALID_NODE ((NTSTATUS)0xC0130001)
-#define STATUS_CLUSTER_NODE_EXISTS ((NTSTATUS)0xC0130002)
-#define STATUS_CLUSTER_JOIN_IN_PROGRESS ((NTSTATUS)0xC0130003)
-#define STATUS_CLUSTER_NODE_NOT_FOUND ((NTSTATUS)0xC0130004)
-#define STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND ((NTSTATUS)0xC0130005)
-#define STATUS_CLUSTER_NETWORK_EXISTS ((NTSTATUS)0xC0130006)
-#define STATUS_CLUSTER_NETWORK_NOT_FOUND ((NTSTATUS)0xC0130007)
-#define STATUS_CLUSTER_NETINTERFACE_EXISTS ((NTSTATUS)0xC0130008)
-#define STATUS_CLUSTER_NETINTERFACE_NOT_FOUND ((NTSTATUS)0xC0130009)
-#define STATUS_CLUSTER_INVALID_REQUEST ((NTSTATUS)0xC013000A)
-#define STATUS_CLUSTER_INVALID_NETWORK_PROVIDER ((NTSTATUS)0xC013000B)
-#define STATUS_CLUSTER_NODE_DOWN ((NTSTATUS)0xC013000C)
-#define STATUS_CLUSTER_NODE_UNREACHABLE ((NTSTATUS)0xC013000D)
-#define STATUS_CLUSTER_NODE_NOT_MEMBER ((NTSTATUS)0xC013000E)
-#define STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS ((NTSTATUS)0xC013000F)
-#define STATUS_CLUSTER_INVALID_NETWORK ((NTSTATUS)0xC0130010)
-#define STATUS_CLUSTER_NO_NET_ADAPTERS ((NTSTATUS)0xC0130011)
-#define STATUS_CLUSTER_NODE_UP ((NTSTATUS)0xC0130012)
-#define STATUS_CLUSTER_NODE_PAUSED ((NTSTATUS)0xC0130013)
-#define STATUS_CLUSTER_NODE_NOT_PAUSED ((NTSTATUS)0xC0130014)
-#define STATUS_CLUSTER_NO_SECURITY_CONTEXT ((NTSTATUS)0xC0130015)
-#define STATUS_CLUSTER_NETWORK_NOT_INTERNAL ((NTSTATUS)0xC0130016)
-#define STATUS_CLUSTER_POISONED ((NTSTATUS)0xC0130017)
-
-#define STATUS_SXS_SECTION_NOT_FOUND ((NTSTATUS)0xC0150001)
-#define STATUS_SXS_CANT_GEN_ACTCTX ((NTSTATUS)0xC0150002)
-#define STATUS_SXS_INVALID_ACTCTXDATA_FORMAT ((NTSTATUS)0xC0150003)
-#define STATUS_SXS_ASSEMBLY_NOT_FOUND ((NTSTATUS)0xC0150004)
-#define STATUS_SXS_MANIFEST_FORMAT_ERROR ((NTSTATUS)0xC0150005)
-#define STATUS_SXS_MANIFEST_PARSE_ERROR ((NTSTATUS)0xC0150006)
-#define STATUS_SXS_ACTIVATION_CONTEXT_DISABLED ((NTSTATUS)0xC0150007)
-#define STATUS_SXS_KEY_NOT_FOUND ((NTSTATUS)0xC0150008)
-#define STATUS_SXS_VERSION_CONFLICT ((NTSTATUS)0xC0150009)
-#define STATUS_SXS_WRONG_SECTION_TYPE ((NTSTATUS)0xC015000A)
-#define STATUS_SXS_THREAD_QUERIES_DISABLED ((NTSTATUS)0xC015000B)
-#define STATUS_SXS_ASSEMBLY_MISSING ((NTSTATUS)0xC015000C)
-#define STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET ((NTSTATUS)0xC015000E)
-#define STATUS_SXS_EARLY_DEACTIVATION ((NTSTATUS)0xC015000F)
-#define STATUS_SXS_INVALID_DEACTIVATION ((NTSTATUS)0xC0150010)
-#define STATUS_SXS_MULTIPLE_DEACTIVATION ((NTSTATUS)0xC0150011)
-#define STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY ((NTSTATUS)0xC0150012)
-#define STATUS_SXS_PROCESS_TERMINATION_REQUESTED ((NTSTATUS)0xC0150013)
-#define STATUS_SXS_CORRUPT_ACTIVATION_STACK ((NTSTATUS)0xC0150014)
-#define STATUS_SXS_CORRUPTION ((NTSTATUS)0xC0150015)
-
-#endif /* WIN32_NO_STATUS */
-
-#endif /* _NTSTATUS_ */
+#endif
diff --git a/include/psdk/urlmon.idl b/include/psdk/urlmon.idl
index d16a3b5d7ec..2ab3b2b021d 100644
--- a/include/psdk/urlmon.idl
+++ b/include/psdk/urlmon.idl
@@ -24,6 +24,7 @@ import "msxml.idl";
cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef GetUserName")
+cpp_quote("#undef SetPort")
cpp_quote("#endif")
interface IInternetProtocolSink;
@@ -1716,6 +1717,105 @@ interface IUriContainer : IUnknown
HRESULT GetIUri([out] IUri **ppIUri);
}
+/*****************************************************************************
+ * IUriBuilder interface
+ */
+[
+ local,
+ object,
+ uuid(4221b2e1-8955-46c0-bd5b-de9897565de7),
+ pointer_default(unique)
+]
+interface IUriBuilder: IUnknown
+{
+ HRESULT CreateUriSimple(
+ [in] DWORD dwAllowEncodingPropertyMask,
+ [in] DWORD_PTR dwReserved,
+ [out] IUri **ppIUri);
+
+ HRESULT CreateUri(
+ [in] DWORD dwCreateFlags,
+ [in] DWORD dwAllowEncodingPropertyMask,
+ [in] DWORD_PTR dwReserved,
+ [out] IUri **ppIUri);
+
+ HRESULT CreateUriWithFlags(
+ [in] DWORD dwCreateFlags,
+ [in] DWORD dwUriBuilderFlags,
+ [in] DWORD dwAllowEncodingPropertyMask,
+ [in] DWORD_PTR dwReserved,
+ [out] IUri **ppIUri);
+
+ HRESULT GetIUri(
+ [out] IUri **ppIUri);
+
+ HRESULT SetIUri(
+ [in, unique] IUri *pIUri);
+
+ HRESULT GetFragment(
+ [out] DWORD *pcchFragment,
+ [out] LPCWSTR *ppwzFragment);
+
+ HRESULT GetHost(
+ [out] DWORD *pcchHost,
+ [out] LPCWSTR *ppwzHost);
+
+ HRESULT GetPassword(
+ [out] DWORD *pcchPassword,
+ [out] LPCWSTR *ppwzPassword);
+
+ HRESULT GetPath(
+ [out] DWORD *pcchPath,
+ [out] LPCWSTR *ppwzPath);
+
+ HRESULT GetPort(
+ [out] BOOL *pfHasPort,
+ [out] DWORD *pdwPort);
+
+ HRESULT GetQuery(
+ [out] DWORD *pcchQuery,
+ [out] LPCWSTR *ppwzQuery);
+
+ HRESULT GetSchemeName(
+ [out] DWORD *pcchSchemeName,
+ [out] LPCWSTR *ppwzSchemeName);
+
+ HRESULT GetUserName(
+ [out] DWORD *pcchUserName,
+ [out] LPCWSTR *ppwzUserName);
+
+ HRESULT SetFragment(
+ [in] LPCWSTR pwzNewValue);
+
+ HRESULT SetHost(
+ [in] LPCWSTR pwzNewValue);
+
+ HRESULT SetPassword(
+ [in] LPCWSTR pwzNewValue);
+
+ HRESULT SetPath(
+ [in] LPCWSTR pwzNewValue);
+
+ HRESULT SetPort(
+ [in] BOOL fHasPort,
+ [in] DWORD dwNewValue);
+
+ HRESULT SetQuery(
+ [in] LPCWSTR pwzNewValue);
+
+ HRESULT SetSchemeName(
+ [in] LPCWSTR pwzNewValue);
+
+ HRESULT SetUserName(
+ [in] LPCWSTR pwzNewValue);
+
+ HRESULT RemoveProperties(
+ [in] DWORD dwPropertyMask);
+
+ HRESULT HasBeenModified(
+ [out] BOOL *pfModified);
+};
+
/*****************************************************************************
* IInternetProtocolEx interface
*/
diff --git a/include/psdk/wincodec.idl b/include/psdk/wincodec.idl
index 8e8dfe60475..1bcb2cd1bad 100644
--- a/include/psdk/wincodec.idl
+++ b/include/psdk/wincodec.idl
@@ -72,6 +72,14 @@ typedef enum WICBitmapEncoderCacheOption {
WICBITMAPENCODERCACHEOPTION_FORCE_DWORD = CODEC_FORCE_DWORD
} WICBitmapEncoderCacheOption;
+typedef enum WICBitmapInterpolationMode {
+ WICBitmapInterpolationModeNearestNeighbor = 0x00000000,
+ WICBitmapInterpolationModeLinear = 0x00000001,
+ WICBitmapInterpolationModeCubic = 0x00000002,
+ WICBitmapInterpolationModeFaint = 0x00000003,
+ WICBITMAPINTERPOLATIONMODE_FORCE_DWORD = CODEC_FORCE_DWORD
+} WICBitmapInterpolationMode;
+
typedef enum WICBitmapPaletteType {
WICBitmapPaletteTypeCustom = 0x00000000,
WICBitmapPaletteTypeMedianCut = 0x00000001,
@@ -169,9 +177,7 @@ cpp_quote("#define WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT 0x88982f80")
cpp_quote("#define WINCODEC_ERR_UNSUPPORTEDOPERATION 0x88982f81")
cpp_quote("#define WINCODEC_ERR_INSUFFICIENTBUFFER 0x88982f8c")
-interface IWICBitmap;
interface IWICPalette;
-interface IWICBitmapScaler;
interface IWICBitmapClipper;
interface IWICBitmapFlipRotator;
interface IWICColorContext;
@@ -207,6 +213,46 @@ interface IWICBitmapSource : IUnknown
[out, size_is(cbBufferSize)] BYTE *pbBuffer);
}
+[
+ object,
+ uuid(00000123-a8f2-4877-ba0a-fd2b6645fb94)
+]
+interface IWICBitmapLock : IUnknown
+{
+ HRESULT GetSize(
+ [out] UINT *pWidth,
+ [out] UINT *pHeight);
+
+ HRESULT GetStride(
+ [out] UINT *pcbStride);
+
+ HRESULT GetDataPointer(
+ [out] UINT *pcbBufferSize,
+ [out, size_is(,*pcbBufferSize)] BYTE **ppbData);
+
+ HRESULT GetPixelFormat(
+ [out] WICPixelFormatGUID *pPixelFormat);
+}
+
+[
+ object,
+ uuid(00000121-a8f2-4877-ba0a-fd2b6645fb94)
+]
+interface IWICBitmap : IWICBitmapSource
+{
+ HRESULT Lock(
+ [in] const WICRect *prcLock,
+ [in] DWORD flags,
+ [out] IWICBitmapLock **ppILock);
+
+ HRESULT SetPalette(
+ [in] IWICPalette *pIPalette);
+
+ HRESULT SetResolution(
+ [in] double dpiX,
+ [in] double dpiY);
+}
+
[
object,
uuid(00000040-a8f2-4877-ba0a-fd2b6645fb94)
@@ -586,6 +632,19 @@ interface IWICStream : IStream
[in] ULARGE_INTEGER ulMaxSize);
}
+[
+ object,
+ uuid(00000302-a8f2-4877-ba0a-fd2b6645fb94)
+]
+interface IWICBitmapScaler : IWICBitmapSource
+{
+ HRESULT Initialize(
+ [in] IWICBitmapSource *pISource,
+ [in] UINT uiWidth,
+ [in] UINT uiHeight,
+ [in] WICBitmapInterpolationMode mode);
+}
+
cpp_quote("DEFINE_GUID(CLSID_WICImagingFactory, 0xcacaf262,0x9370,0x4615,0xa1,0x3b,0x9f,0x55,0x39,0xda,0x4c,0x0a);")
[
diff --git a/include/psdk/wincrypt.h b/include/psdk/wincrypt.h
index af79c64240d..3f7f4ed6e5b 100644
--- a/include/psdk/wincrypt.h
+++ b/include/psdk/wincrypt.h
@@ -1339,14 +1339,18 @@ typedef struct _CRYPT_URL_INFO {
DWORD *rgcGroupEntry;
} CRYPT_URL_INFO, *PCRYPT_URL_INFO;
-#define URL_OID_CERTIFICATE_ISSUER ((LPCSTR)1)
-#define URL_OID_CERTIFICATE_CRL_DIST_POINT ((LPCSTR)2)
-#define URL_OID_CTL_ISSUER ((LPCSTR)3)
-#define URL_OID_CTL_NEXT_UPDATE ((LPCSTR)4)
-#define URL_OID_CRL_ISSUER ((LPCSTR)5)
-#define URL_OID_CERTIFICATE_FRESHEST_CRL ((LPCSTR)6)
-#define URL_OID_CRL_FRESHEST_CRL ((LPCSTR)7)
-#define URL_OID_CROSS_CERT_DIST_POINT ((LPCSTR)8)
+#define URL_OID_CERTIFICATE_ISSUER ((LPCSTR)1)
+#define URL_OID_CERTIFICATE_CRL_DIST_POINT ((LPCSTR)2)
+#define URL_OID_CTL_ISSUER ((LPCSTR)3)
+#define URL_OID_CTL_NEXT_UPDATE ((LPCSTR)4)
+#define URL_OID_CRL_ISSUER ((LPCSTR)5)
+#define URL_OID_CERTIFICATE_FRESHEST_CRL ((LPCSTR)6)
+#define URL_OID_CRL_FRESHEST_CRL ((LPCSTR)7)
+#define URL_OID_CROSS_CERT_DIST_POINT ((LPCSTR)8)
+#define URL_OID_CERTIFICATE_OCSP ((LPCSTR)9)
+#define URL_OID_CERTIFICATE_OCSP_AND_CRL_DIST_POINT ((LPCSTR)10)
+#define URL_OID_CERTIFICATE_CRL_DIST_POINT_AND_OCSP ((LPCSTR)11)
+#define URL_OID_CROSS_CERT_SUBJECT_INFO_ACCESS ((LPCSTR)12)
#define URL_OID_GET_OBJECT_URL_FUNC "UrlDllGetObjectUrl"
@@ -2778,6 +2782,9 @@ typedef struct _CTL_FIND_SUBJECT_PARA
#define szOID_RSA_MD5RSA "1.2.840.113549.1.1.4"
#define szOID_RSA_SHA1RSA "1.2.840.113549.1.1.5"
#define szOID_RSA_SET0AEP_RSA "1.2.840.113549.1.1.6"
+#define szOID_RSA_SHA256RSA "1.2.840.113549.1.1.11"
+#define szOID_RSA_SHA384RSA "1.2.840.113549.1.1.12"
+#define szOID_RSA_SHA512RSA "1.2.840.113549.1.1.13"
#define szOID_RSA_DH "1.2.840.113549.1.3.1"
#define szOID_RSA_data "1.2.840.113549.1.7.1"
#define szOID_RSA_signedData "1.2.840.113549.1.7.2"
diff --git a/include/reactos/win32k/ntuser.h b/include/reactos/win32k/ntuser.h
index 8e59d26b4cc..53a8f6a3311 100644
--- a/include/reactos/win32k/ntuser.h
+++ b/include/reactos/win32k/ntuser.h
@@ -2977,7 +2977,7 @@ BOOL
NTAPI
NtUserTranslateMessage(
LPMSG lpMsg,
- HKL dwhkl );
+ UINT flags );
BOOL
NTAPI
@@ -3279,8 +3279,8 @@ typedef struct tagROSMENUITEMINFO
HBITMAP hbmpItem;
/* ----------- Extra ----------- */
RECT Rect; /* Item area (relative to menu window) */
- UINT XTab; /* X position of text after Tab */
- LPWSTR Text; /* Copy of the text pointer in MenuItem->Text */
+ UINT dxTab; /* X position of text after Tab */
+ LPWSTR lpstr; /* Copy of the text pointer in MenuItem->Text */
} ROSMENUITEMINFO, *PROSMENUITEMINFO;
BOOL
diff --git a/include/reactos/wine/config.h b/include/reactos/wine/config.h
index b677544aa1b..406b5fb895d 100644
--- a/include/reactos/wine/config.h
+++ b/include/reactos/wine/config.h
@@ -979,17 +979,28 @@
#define YYTEXT_POINTER 1
/* Define to a macro to output a .cfi assembly pseudo-op */
-#define __ASM_CFI(x)
+#define __ASM_CFI(str) str
+
+/* Define to a macro to define an assembly function */
+#define __ASM_DEFINE_FUNC(name,suffix,code) asm(".text\n\t.align 4\n\t.globl _" #name suffix "\n\t.def _" #name suffix "; .scl 2; .type 32; .endef\n_" #name suffix ":\n\t.cfi_startproc\n\t" code "\n\t.cfi_endproc");
/* Define to a macro to generate an assembly function directive */
#define __ASM_FUNC(name) ".def " __ASM_NAME(name) "; .scl 2; .type 32; .endef"
+/* Define to a macro to generate an assembly function with C calling
+ convention */
+#define __ASM_GLOBAL_FUNC(name,code) __ASM_DEFINE_FUNC(name,"",code)
+
/* Define to a macro to generate an assembly name from a C symbol */
#define __ASM_NAME(name) "_" name
/* Define to a macro to generate an stdcall suffix */
#define __ASM_STDCALL(args) "@" #args
+/* Define to a macro to generate an assembly function with stdcall calling
+ convention */
+#define __ASM_STDCALL_FUNC(name,args,code) __ASM_DEFINE_FUNC(name,__ASM_STDCALL(args),code)
+
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
diff --git a/include/reactos/wine/port.h b/include/reactos/wine/port.h
index 3b1b1c06d3c..6b293173ec2 100644
--- a/include/reactos/wine/port.h
+++ b/include/reactos/wine/port.h
@@ -148,29 +148,6 @@ struct statfs;
#endif
-/* Macros to define assembler functions somewhat portably */
-
-#if defined(__GNUC__) && !defined(__INTERIX) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(__APPLE__)
-# define __ASM_GLOBAL_FUNC(name,code) \
- __asm__( ".text\n\t" \
- ".align 4\n\t" \
- ".globl " __ASM_NAME(#name) "\n\t" \
- __ASM_FUNC(#name) "\n" \
- __ASM_NAME(#name) ":\n\t" \
- code \
- "\n\t.previous" );
-#else /* defined(__GNUC__) && !defined(__MINGW32__) && !defined(__APPLE__) */
-# define __ASM_GLOBAL_FUNC(name,code) \
- void __asm_dummy_##name(void) { \
- asm( ".align 4\n\t" \
- ".globl " __ASM_NAME(#name) "\n\t" \
- __ASM_FUNC(#name) "\n" \
- __ASM_NAME(#name) ":\n\t" \
- code ); \
- }
-#endif /* __GNUC__ */
-
-
/* Constructor functions */
#ifdef __GNUC__
diff --git a/lib/sdk/crt/math/i386/pow_asm.s b/lib/sdk/crt/math/i386/pow_asm.s
index 6b722fef068..0b79aa5883e 100644
--- a/lib/sdk/crt/math/i386/pow_asm.s
+++ b/lib/sdk/crt/math/i386/pow_asm.s
@@ -1,121 +1,368 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * PURPOSE: Run-Time Library
- * FILE: lib/rtl/i386/pow.S
- * PROGRAMER: Alex Ionescu (alex@relsoft.net)
- *
- * Copyright (C) 2002 Michael Ringgaard.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
+/* ix87 specific implementation of pow function.
+ Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2005, 2007
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper , 1996.
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES// LOSS OF USE, DATA, OR PROFITS// OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-.globl _pow
-
- /* DATA ********************************************************************/
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
-fzero:
- .long 0 // Floating point zero
- .long 0 // Floating point zero
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
-.intel_syntax noprefix
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
-/* FUNCTIONS ***************************************************************/
+/* Reacros modifications */
+#define ALIGNARG(log2) log2
+#define ASM_TYPE_DIRECTIVE(name,typearg)
+#define ASM_SIZE_DIRECTIVE(name)
+#define cfi_adjust_cfa_offset(x)
+#define ENTRY(x)
+#define END(x)
+.global _pow
+ .text
+
+ .align ALIGNARG(4)
+ ASM_TYPE_DIRECTIVE(infinity,@object)
+inf_zero:
+infinity:
+ .byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f
+ ASM_SIZE_DIRECTIVE(infinity)
+ ASM_TYPE_DIRECTIVE(zero,@object)
+zero: .double 0.0
+ ASM_SIZE_DIRECTIVE(zero)
+ ASM_TYPE_DIRECTIVE(minf_mzero,@object)
+minf_mzero:
+minfinity:
+ .byte 0, 0, 0, 0, 0, 0, 0xf0, 0xff
+mzero:
+ .byte 0, 0, 0, 0, 0, 0, 0, 0x80
+ ASM_SIZE_DIRECTIVE(minf_mzero)
+ ASM_TYPE_DIRECTIVE(one,@object)
+one: .double 1.0
+ ASM_SIZE_DIRECTIVE(one)
+ ASM_TYPE_DIRECTIVE(limit,@object)
+limit: .double 0.29
+ ASM_SIZE_DIRECTIVE(limit)
+ ASM_TYPE_DIRECTIVE(p63,@object)
+p63: .byte 0, 0, 0, 0, 0, 0, 0xe0, 0x43
+ ASM_SIZE_DIRECTIVE(p63)
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+ .text
_pow:
- push ebp
- mov ebp,esp
- sub esp,12 // Allocate temporary space
- push edi // Save register edi
- push eax // Save register eax
- mov dword ptr [ebp-12],0 // Set negation flag to zero
- fld qword ptr [ebp+16] // Load real from stack
- fld qword ptr [ebp+8] // Load real from stack
- mov edi,offset flat:fzero // Point to real zero
- fcom qword ptr [edi] // Compare x with zero
- fstsw ax // Get the FPU status word
- mov al,ah // Move condition flags to AL
- lahf // Load Flags into AH
- and al, 0b01000101 // Isolate C0, C2 and C3
- and ah, 0b10111010 // Turn off CF, PF and ZF
- or ah,al // Set new CF, PF and ZF
- sahf // Store AH into Flags
- jb __fpow1 // Re-direct if x < 0
- ja __fpow2 // Re-direct if x > 0
- fxch // Swap st, st(1)
- fcom qword ptr [edi] // Compare y with zero
- fxch // Restore x as top of stack
- fstsw ax // Get the FPU status word
- mov al,ah // Move condition flags to AL
- lahf // Load Flags into AH
- and al, 0b01000101 // Isolate C0, C2 and C3
- and ah, 0b10111010 // Turn off CF, PF and ZF
- or ah,al // Set new CF, PF and ZF
- sahf // Store AH into Flags
- jmp __fpow2 // Re-direct
-__fpow1: fxch // Put y on top of stack
- fld st // Duplicate y as st(1)
- frndint // Round to integer
- fxch // Put y on top of stack
- fcomp // y = int(y) ?
- fstsw ax // Get the FPU status word
- mov al,ah // Move condition flags to AL
- lahf // Load Flags into AH
- and al, 0b01000101 // Isolate C0, C2 and C3
- and ah, 0b10111010 // Turn off CF, PF and ZF
- or ah,al // Set new CF, PF and ZF
- sahf // Store AH into Flags
- jne __fpow4 // Proceed if y = int(y)
- fist dword ptr [ebp-12] // Store y as integer
- and dword ptr [ebp-12],1 // Set bit if y is odd
- fxch // Put x on top of stack
- fabs // x = |x|
-__fpow2: fldln2 // Load log base e of 2
- fxch st(1) // Exchange st, st(1)
- fyl2x // Compute the natural log(x)
- fmulp // Compute y * ln(x)
- fldl2e // Load log base 2(e)
- fmulp st(1),st // Multiply x * log base 2(e)
- fst st(1) // Push result
- frndint // Round to integer
- fsub st(1),st // Subtract
- fxch // Exchange st, st(1)
- f2xm1 // Compute 2 to the (x - 1)
- fld1 // Load real number 1
- faddp // 2 to the x
- fscale // Scale by power of 2
- fstp st(1) // Set new stack top and pop
- test dword ptr [ebp-12],1 // Negation required ?
- jz __fpow3 // No, re-direct
- fchs // Negate the result
-__fpow3: fstp qword ptr [ebp-8] // Save (double)pow(x, y)
- fld qword ptr [ebp-8] // Load (double)pow(x, y)
-__fpow4: pop eax // Restore register eax
- pop edi // Restore register edi
- mov esp,ebp // Deallocate temporary space
- pop ebp
- ret
+ENTRY(__ieee754_pow)
+ fldl 12(%esp) // y
+ fxam
+
+#ifdef PIC
+ LOAD_PIC_REG (cx)
+#endif
+
+ fnstsw
+ movb %ah, %dl
+ andb $0x45, %ah
+ cmpb $0x40, %ah // is y == 0 ?
+ je 11f
+
+ cmpb $0x05, %ah // is y == inf ?
+ je 12f
+
+ cmpb $0x01, %ah // is y == NaN ?
+ je 30f
+
+ fldl 4(%esp) // x : y
+
+ subl $8,%esp
+ cfi_adjust_cfa_offset (8)
+
+ fxam
+ fnstsw
+ movb %ah, %dh
+ andb $0x45, %ah
+ cmpb $0x40, %ah
+ je 20f // x is 0
+
+ cmpb $0x05, %ah
+ je 15f // x is inf
+
+ fxch // y : x
+
+ /* fistpll raises invalid exception for |y| >= 1L<<63. */
+ fld %st // y : y : x
+ fabs // |y| : y : x
+ fcompl MO(p63) // y : x
+ fnstsw
+ sahf
+ jnc 2f
+
+ /* First see whether `y' is a natural number. In this case we
+ can use a more precise algorithm. */
+ fld %st // y : y : x
+ fistpll (%esp) // y : x
+ fildll (%esp) // int(y) : y : x
+ fucomp %st(1) // y : x
+ fnstsw
+ sahf
+ jne 2f
+
+ /* OK, we have an integer value for y. */
+ popl %eax
+ cfi_adjust_cfa_offset (-4)
+ popl %edx
+ cfi_adjust_cfa_offset (-4)
+ orl $0, %edx
+ fstp %st(0) // x
+ jns 4f // y >= 0, jump
+ fdivrl MO(one) // 1/x (now referred to as x)
+ negl %eax
+ adcl $0, %edx
+ negl %edx
+4: fldl MO(one) // 1 : x
+ fxch
+
+6: shrdl $1, %edx, %eax
+ jnc 5f
+ fxch
+ fmul %st(1) // x : ST*x
+ fxch
+5: fmul %st(0), %st // x*x : ST*x
+ shrl $1, %edx
+ movl %eax, %ecx
+ orl %edx, %ecx
+ jnz 6b
+ fstp %st(0) // ST*x
+ ret
+
+ /* y is NAN */
+30: fldl 4(%esp) // x : y
+ fldl MO(one) // 1.0 : x : y
+ fucomp %st(1) // x : y
+ fnstsw
+ sahf
+ je 31f
+ fxch // y : x
+31: fstp %st(1)
+ ret
+
+ cfi_adjust_cfa_offset (8)
+ .align ALIGNARG(4)
+2: /* y is a real number. */
+ fxch // x : y
+ fldl MO(one) // 1.0 : x : y
+ fldl MO(limit) // 0.29 : 1.0 : x : y
+ fld %st(2) // x : 0.29 : 1.0 : x : y
+ fsub %st(2) // x-1 : 0.29 : 1.0 : x : y
+ fabs // |x-1| : 0.29 : 1.0 : x : y
+ fucompp // 1.0 : x : y
+ fnstsw
+ fxch // x : 1.0 : y
+ sahf
+ ja 7f
+ fsub %st(1) // x-1 : 1.0 : y
+ fyl2xp1 // log2(x) : y
+ jmp 8f
+
+7: fyl2x // log2(x) : y
+8: fmul %st(1) // y*log2(x) : y
+ fst %st(1) // y*log2(x) : y*log2(x)
+ frndint // int(y*log2(x)) : y*log2(x)
+ fsubr %st, %st(1) // int(y*log2(x)) : fract(y*log2(x))
+ fxch // fract(y*log2(x)) : int(y*log2(x))
+ f2xm1 // 2^fract(y*log2(x))-1 : int(y*log2(x))
+ faddl MO(one) // 2^fract(y*log2(x)) : int(y*log2(x))
+ fscale // 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x))
+ addl $8, %esp
+ cfi_adjust_cfa_offset (-8)
+ fstp %st(1) // 2^fract(y*log2(x))*2^int(y*log2(x))
+ ret
+
+
+ // pow(x,0) = 1
+ .align ALIGNARG(4)
+11: fstp %st(0) // pop y
+ fldl MO(one)
+ ret
+
+ // y == inf
+ .align ALIGNARG(4)
+12: fstp %st(0) // pop y
+ fldl MO(one) // 1
+ fldl 4(%esp) // x : 1
+ fabs // abs(x) : 1
+ fucompp // < 1, == 1, or > 1
+ fnstsw
+ andb $0x45, %ah
+ cmpb $0x45, %ah
+ je 13f // jump if x is NaN
+
+ cmpb $0x40, %ah
+ je 14f // jump if |x| == 1
+
+ shlb $1, %ah
+ xorb %ah, %dl
+ andl $2, %edx
+ fldl MOX(inf_zero, %edx, 4)
+ ret
+
+ .align ALIGNARG(4)
+14: fldl MO(one)
+ ret
+
+ .align ALIGNARG(4)
+13: fldl 4(%esp) // load x == NaN
+ ret
+
+ cfi_adjust_cfa_offset (8)
+ .align ALIGNARG(4)
+ // x is inf
+15: fstp %st(0) // y
+ testb $2, %dh
+ jz 16f // jump if x == +inf
+
+ // We must find out whether y is an odd integer.
+ fld %st // y : y
+ fistpll (%esp) // y
+ fildll (%esp) // int(y) : y
+ fucompp //
+ fnstsw
+ sahf
+ jne 17f
+
+ // OK, the value is an integer, but is the number of bits small
+ // enough so that all are coming from the mantissa?
+ popl %eax
+ cfi_adjust_cfa_offset (-4)
+ popl %edx
+ cfi_adjust_cfa_offset (-4)
+ andb $1, %al
+ jz 18f // jump if not odd
+ movl %edx, %eax
+ orl %edx, %edx
+ jns 155f
+ negl %eax
+155: cmpl $0x00200000, %eax
+ ja 18f // does not fit in mantissa bits
+ // It's an odd integer.
+ shrl $31, %edx
+ fldl MOX(minf_mzero, %edx, 8)
+ ret
+
+ cfi_adjust_cfa_offset (8)
+ .align ALIGNARG(4)
+16: fcompl MO(zero)
+ addl $8, %esp
+ cfi_adjust_cfa_offset (-8)
+ fnstsw
+ shrl $5, %eax
+ andl $8, %eax
+ fldl MOX(inf_zero, %eax, 1)
+ ret
+
+ cfi_adjust_cfa_offset (8)
+ .align ALIGNARG(4)
+17: shll $30, %edx // sign bit for y in right position
+ addl $8, %esp
+ cfi_adjust_cfa_offset (-8)
+18: shrl $31, %edx
+ fldl MOX(inf_zero, %edx, 8)
+ ret
+
+ cfi_adjust_cfa_offset (8)
+ .align ALIGNARG(4)
+ // x is 0
+20: fstp %st(0) // y
+ testb $2, %dl
+ jz 21f // y > 0
+
+ // x is 0 and y is < 0. We must find out whether y is an odd integer.
+ testb $2, %dh
+ jz 25f
+
+ fld %st // y : y
+ fistpll (%esp) // y
+ fildll (%esp) // int(y) : y
+ fucompp //
+ fnstsw
+ sahf
+ jne 26f
+
+ // OK, the value is an integer, but is the number of bits small
+ // enough so that all are coming from the mantissa?
+ popl %eax
+ cfi_adjust_cfa_offset (-4)
+ popl %edx
+ cfi_adjust_cfa_offset (-4)
+ andb $1, %al
+ jz 27f // jump if not odd
+ cmpl $0xffe00000, %edx
+ jbe 27f // does not fit in mantissa bits
+ // It's an odd integer.
+ // Raise divide-by-zero exception and get minus infinity value.
+ fldl MO(one)
+ fdivl MO(zero)
+ fchs
+ ret
+
+ cfi_adjust_cfa_offset (8)
+25: fstp %st(0)
+26: addl $8, %esp
+ cfi_adjust_cfa_offset (-8)
+27: // Raise divide-by-zero exception and get infinity value.
+ fldl MO(one)
+ fdivl MO(zero)
+ ret
+
+ cfi_adjust_cfa_offset (8)
+ .align ALIGNARG(4)
+ // x is 0 and y is > 0. We must find out whether y is an odd integer.
+21: testb $2, %dh
+ jz 22f
+
+ fld %st // y : y
+ fistpll (%esp) // y
+ fildll (%esp) // int(y) : y
+ fucompp //
+ fnstsw
+ sahf
+ jne 23f
+
+ // OK, the value is an integer, but is the number of bits small
+ // enough so that all are coming from the mantissa?
+ popl %eax
+ cfi_adjust_cfa_offset (-4)
+ popl %edx
+ cfi_adjust_cfa_offset (-4)
+ andb $1, %al
+ jz 24f // jump if not odd
+ cmpl $0xffe00000, %edx
+ jae 24f // does not fit in mantissa bits
+ // It's an odd integer.
+ fldl MO(mzero)
+ ret
+
+ cfi_adjust_cfa_offset (8)
+22: fstp %st(0)
+23: addl $8, %esp // Don't use 2 x pop
+ cfi_adjust_cfa_offset (-8)
+24: fldl MO(zero)
+ ret
+
+END(__ieee754_pow)
+
+
diff --git a/media/doc/README.WINE b/media/doc/README.WINE
index a588c563353..828e413dbc1 100644
--- a/media/doc/README.WINE
+++ b/media/doc/README.WINE
@@ -22,7 +22,7 @@ When porting a new DLL from Wine to ReactOS, please do the following steps
The following build tools are shared with Wine.
reactos/tools/unicode # Synced to Wine-20081105 (~Wine-1.1.7)
-reactos/tools/widl # Synced to Wine-1_1_39
+reactos/tools/widl # Synced to Wine-1_1_41
reactos/tools/winebuild # Synced to Wine-1_1_13
reactos/tools/wmc # Synced to Wine-20081105 (~Wine-1.1.7)
reactos/tools/wpp # Synced to Wine-20081105 (~Wine-1.1.7)
@@ -137,7 +137,7 @@ reactos/dll/win32/pstorec # Autosync
reactos/dll/win32/query # Autosync
reactos/dll/win32/rasapi32 # Autosync
reactos/dll/win32/resutils # Autosync
-reactos/dll/win32/riched20 # Autosync ??
+reactos/dll/win32/riched20 # Autosync
reactos/dll/win32/riched32 # Autosync
reactos/dll/win32/rpcrt4 # Synced to Wine-0_9_55
reactos/dll/win32/rsabase # Autosync
diff --git a/media/inf/battery.inf b/media/inf/battery.inf
index 33a8fb887a2..70583c10f03 100644
Binary files a/media/inf/battery.inf and b/media/inf/battery.inf differ
diff --git a/media/inf/cpu.inf b/media/inf/cpu.inf
index 12416a0d2b6..bc2517dcaa0 100644
Binary files a/media/inf/cpu.inf and b/media/inf/cpu.inf differ
diff --git a/media/inf/inf.rbuild b/media/inf/inf.rbuild
index 44ea108fd6e..34d024bee2b 100644
--- a/media/inf/inf.rbuild
+++ b/media/inf/inf.rbuild
@@ -5,6 +5,7 @@
audio.inf
battery.inf
cdrom.inf
+ cpu.inf
display.inf
fdc.inf
font.inf
@@ -23,6 +24,7 @@
ports.inf
scsi.inf
syssetup.inf
+ usb.inf
usbport.inf
usbstor.inf
xboxdisp.inf
diff --git a/ntoskrnl/config/cmalloc.c b/ntoskrnl/config/cmalloc.c
index 37da97ea44b..97dfc1a6e26 100644
--- a/ntoskrnl/config/cmalloc.c
+++ b/ntoskrnl/config/cmalloc.c
@@ -70,14 +70,13 @@ CmpFreeKeyControlBlock(IN PCM_KEY_CONTROL_BLOCK Kcb)
KeAcquireGuardedMutex(&CmpAllocBucketLock);
/* Sanity check on lock ownership */
- //ASSERT((CmpIsKcbLockedExclusive(Kcb) == TRUE) ||
- // (CmpTestRegistryLockExclusive() == TRUE));
+ CMP_ASSERT_HASH_ENTRY_LOCK(Kcb->ConvKey);
/* Add us to the free list */
InsertTailList(&CmpFreeKCBListHead, &Kcb->FreeListEntry);
/* Get the allocation page */
- AllocPage = (PCM_ALLOC_PAGE)((ULONG_PTR)Kcb & 0xFFFFF000);
+ AllocPage = CmpGetAllocPageFromKcb(Kcb);
/* Sanity check */
ASSERT(AllocPage->FreeCount != CM_KCBS_PER_PAGE);
@@ -134,7 +133,7 @@ SearchKcbList:
FreeListEntry);
/* Get the allocation page */
- AllocPage = (PCM_ALLOC_PAGE)((ULONG_PTR)CurrentKcb & 0xFFFFF000);
+ AllocPage = CmpGetAllocPageFromKcb(CurrentKcb);
/* Decrease the free count */
ASSERT(AllocPage->FreeCount != 0);
@@ -168,7 +167,7 @@ SearchKcbList:
/* Set it up */
CurrentKcb->PrivateAlloc = TRUE;
CurrentKcb->DelayCloseEntry = NULL;
- InsertHeadList(&CmpFreeKCBListHead,
+ InsertTailList(&CmpFreeKCBListHead,
&CurrentKcb->FreeListEntry);
}
@@ -178,9 +177,7 @@ SearchKcbList:
}
/* Allocate a KCB only */
- CurrentKcb = CmpAllocate(sizeof(CM_KEY_CONTROL_BLOCK),
- TRUE,
- TAG_CM);
+ CurrentKcb = CmpAllocate(sizeof(CM_KEY_CONTROL_BLOCK), TRUE, TAG_CM);
if (CurrentKcb)
{
/* Set it up */
@@ -219,7 +216,7 @@ SearchList:
Entry->ListEntry.Flink = Entry->ListEntry.Blink = NULL;
/* Grab the alloc page */
- AllocPage = (PCM_ALLOC_PAGE)((ULONG_PTR)Entry & 0xFFFFF000);
+ AllocPage = CmpGetAllocPageFromDelayAlloc(Entry);
/* Decrease free entries */
ASSERT(AllocPage->FreeCount != 0);
@@ -278,7 +275,7 @@ CmpFreeDelayItem(PVOID Entry)
InsertTailList(&CmpFreeDelayItemsListHead, &AllocEntry->ListEntry);
/* Get the alloc page */
- AllocPage = (PCM_ALLOC_PAGE)((ULONG_PTR)Entry & 0xFFFFF000);
+ AllocPage = CmpGetAllocPageFromDelayAlloc(Entry);
ASSERT(AllocPage->FreeCount != CM_DELAYS_PER_PAGE);
/* Increase the number of free items */
diff --git a/ntoskrnl/dbgk/dbgkutil.c b/ntoskrnl/dbgk/dbgkutil.c
index 0d5d5713c09..2937d35c4cb 100644
--- a/ntoskrnl/dbgk/dbgkutil.c
+++ b/ntoskrnl/dbgk/dbgkutil.c
@@ -243,10 +243,10 @@ DbgkCreateThread(IN PETHREAD Thread,
wcsncpy(Teb->StaticUnicodeBuffer,
L"ntdll.dll",
sizeof(Teb->StaticUnicodeBuffer) / sizeof(WCHAR));
- Teb->Tib.ArbitraryUserPointer = Teb->StaticUnicodeBuffer;
+ Teb->NtTib.ArbitraryUserPointer = Teb->StaticUnicodeBuffer;
/* Return it in the debug event as well */
- LoadDll->NamePointer = &Teb->Tib.ArbitraryUserPointer;
+ LoadDll->NamePointer = &Teb->NtTib.ArbitraryUserPointer;
}
/* Get a handle */
diff --git a/ntoskrnl/include/internal/cm_x.h b/ntoskrnl/include/internal/cm_x.h
index ed3f3bff629..581a336d636 100644
--- a/ntoskrnl/include/internal/cm_x.h
+++ b/ntoskrnl/include/internal/cm_x.h
@@ -254,3 +254,25 @@ CmpConvertKcbSharedToExclusive(IN PCM_KEY_CONTROL_BLOCK k)
ExReleasePushLock(&GET_HASH_ENTRY(CmpNameCacheTable, \
(k)).Lock); \
}
+
+//
+// Asserts that either the registry or the KCB is locked
+//
+#define CMP_ASSERT_HASH_ENTRY_LOCK(k) \
+{ \
+ ASSERT(((GET_HASH_ENTRY(CmpCacheTable, k).Owner == \
+ KeGetCurrentThread())) || \
+ (CmpTestRegistryLockExclusive() == TRUE)); \
+}
+
+//
+// Gets the page attached to the KCB
+//
+#define CmpGetAllocPageFromKcb(k) \
+ (PCM_ALLOC_PAGE)(((ULONG_PTR)(k)) & ~(PAGE_SIZE - 1))
+
+//
+// Gets the page attached to the delayed allocation
+//
+#define CmpGetAllocPageFromDelayAlloc(a) \
+ (PCM_ALLOC_PAGE)(((ULONG_PTR)(a)) & ~(PAGE_SIZE - 1))
diff --git a/ntoskrnl/io/pnpmgr/pnpmgr.c b/ntoskrnl/io/pnpmgr/pnpmgr.c
index e6346378566..9cd6347e957 100644
--- a/ntoskrnl/io/pnpmgr/pnpmgr.c
+++ b/ntoskrnl/io/pnpmgr/pnpmgr.c
@@ -1847,6 +1847,7 @@ IopActionConfigureChildServices(PDEVICE_NODE DeviceNode,
PUNICODE_STRING Service;
UNICODE_STRING ClassGUID;
NTSTATUS Status;
+ DEVICE_CAPABILITIES DeviceCaps;
DPRINT("IopActionConfigureChildServices(%p, %p)\n", DeviceNode, Context);
@@ -1920,9 +1921,22 @@ IopActionConfigureChildServices(PDEVICE_NODE DeviceNode,
if (Service->Buffer == NULL)
{
- IopDeviceNodeSetFlag(DeviceNode, DNF_DISABLED);
+ if (NT_SUCCESS(IopQueryDeviceCapabilities(DeviceNode, &DeviceCaps)) &&
+ DeviceCaps.RawDeviceOK)
+ {
+ DPRINT1("%wZ is using parent bus driver (%wZ)\n", &DeviceNode->InstancePath, &ParentDeviceNode->ServiceName);
- if (ClassGUID.Length != 0)
+ DeviceNode->ServiceName.Length = 0;
+ DeviceNode->ServiceName.MaximumLength = ParentDeviceNode->ServiceName.MaximumLength;
+ DeviceNode->ServiceName.Buffer = ExAllocatePool(PagedPool, DeviceNode->ServiceName.MaximumLength);
+ if (!DeviceNode->ServiceName.Buffer)
+ return STATUS_SUCCESS;
+
+ RtlCopyUnicodeString(&DeviceNode->ServiceName, &ParentDeviceNode->ServiceName);
+
+ IopDeviceNodeSetFlag(DeviceNode, DNF_LEGACY_DRIVER);
+ }
+ else if (ClassGUID.Length != 0)
{
/* Device has a ClassGUID value, but no Service value.
* Suppose it is using the NULL driver, so state the
@@ -1930,6 +1944,10 @@ IopActionConfigureChildServices(PDEVICE_NODE DeviceNode,
DPRINT1("%wZ is using NULL driver\n", &DeviceNode->InstancePath);
IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED);
}
+ else
+ {
+ IopDeviceNodeSetFlag(DeviceNode, DNF_DISABLED);
+ }
return STATUS_SUCCESS;
}
diff --git a/ntoskrnl/ke/i386/usercall.c b/ntoskrnl/ke/i386/usercall.c
index a07a0550e01..07ce4442df4 100644
--- a/ntoskrnl/ke/i386/usercall.c
+++ b/ntoskrnl/ke/i386/usercall.c
@@ -169,7 +169,7 @@ KeUserModeCallback(IN ULONG RoutineIndex,
/* Save the exception list */
Teb = KeGetCurrentThread()->Teb;
- ExceptionList = Teb->Tib.ExceptionList;
+ ExceptionList = Teb->NtTib.ExceptionList;
/* Jump to user mode */
*UserEsp = NewStack;
@@ -177,7 +177,7 @@ KeUserModeCallback(IN ULONG RoutineIndex,
if (CallbackStatus != STATUS_CALLBACK_POP_STACK)
{
/* Only restore the exception list if we didn't crash in ring 3 */
- Teb->Tib.ExceptionList = ExceptionList;
+ Teb->NtTib.ExceptionList = ExceptionList;
CallbackStatus = STATUS_SUCCESS;
}
else
diff --git a/ntoskrnl/mm/ARM3/procsup.c b/ntoskrnl/mm/ARM3/procsup.c
index e12ad48fe59..24bd11a2586 100644
--- a/ntoskrnl/mm/ARM3/procsup.c
+++ b/ntoskrnl/mm/ARM3/procsup.c
@@ -517,9 +517,9 @@ MmCreatePeb(IN PEPROCESS Process,
//
// Write subsystem data
//
- Peb->ImageSubSystem = NtHeaders->OptionalHeader.Subsystem;
- Peb->ImageSubSystemMajorVersion = NtHeaders->OptionalHeader.MajorSubsystemVersion;
- Peb->ImageSubSystemMinorVersion = NtHeaders->OptionalHeader.MinorSubsystemVersion;
+ Peb->ImageSubsystem = NtHeaders->OptionalHeader.Subsystem;
+ Peb->ImageSubsystemMajorVersion = NtHeaders->OptionalHeader.MajorSubsystemVersion;
+ Peb->ImageSubsystemMinorVersion = NtHeaders->OptionalHeader.MinorSubsystemVersion;
//
// Check for version data
@@ -635,13 +635,13 @@ MmCreateTeb(IN PEPROCESS Process,
//
// Set TIB Data
//
- Teb->Tib.ExceptionList = EXCEPTION_CHAIN_END;
- Teb->Tib.Self = (PNT_TIB)Teb;
+ Teb->NtTib.ExceptionList = EXCEPTION_CHAIN_END;
+ Teb->NtTib.Self = (PNT_TIB)Teb;
//
// Identify this as an OS/2 V3.0 ("Cruiser") TIB
//
- Teb->Tib.Version = 30 << 8;
+ Teb->NtTib.Version = 30 << 8;
//
// Set TEB Data
@@ -660,8 +660,8 @@ MmCreateTeb(IN PEPROCESS Process,
//
// Use initial TEB values
//
- Teb->Tib.StackBase = InitialTeb->StackBase;
- Teb->Tib.StackLimit = InitialTeb->StackLimit;
+ Teb->NtTib.StackBase = InitialTeb->StackBase;
+ Teb->NtTib.StackLimit = InitialTeb->StackLimit;
Teb->DeallocationStack = InitialTeb->AllocatedStackBase;
}
else
@@ -669,8 +669,8 @@ MmCreateTeb(IN PEPROCESS Process,
//
// Use grandparent TEB values
//
- Teb->Tib.StackBase = InitialTeb->PreviousStackBase;
- Teb->Tib.StackLimit = InitialTeb->PreviousStackLimit;
+ Teb->NtTib.StackBase = InitialTeb->PreviousStackBase;
+ Teb->NtTib.StackLimit = InitialTeb->PreviousStackLimit;
}
//
diff --git a/ntoskrnl/po/events.c b/ntoskrnl/po/events.c
index 0cd97405a47..8417f2760cc 100644
--- a/ntoskrnl/po/events.c
+++ b/ntoskrnl/po/events.c
@@ -157,6 +157,8 @@ PopAddRemoveSysCapsCallback(IN PVOID NotificationStructure,
BOOLEAN Arrival;
ULONG Caps;
NTSTATUS Status;
+ UNICODE_STRING DeviceName;
+ UNICODE_STRING DeviceNamePrefix = RTL_CONSTANT_STRING(L"\\??\\");
DPRINT("PopAddRemoveSysCapsCallback(%p %p)\n",
NotificationStructure, Context);
@@ -177,10 +179,20 @@ PopAddRemoveSysCapsCallback(IN PVOID NotificationStructure,
{
DPRINT("Arrival of %wZ\n", Notification->SymbolicLinkName);
+ DeviceName.Length = 0;
+ DeviceName.MaximumLength = Notification->SymbolicLinkName->MaximumLength + DeviceNamePrefix.MaximumLength;
+ DeviceName.Buffer = ExAllocatePool(PagedPool, DeviceName.MaximumLength);
+ if (!DeviceName.Buffer) return STATUS_INSUFFICIENT_RESOURCES;
+
+ RtlCopyUnicodeString(&DeviceName, &DeviceNamePrefix);
+ RtlAppendUnicodeStringToString(&DeviceName, Notification->SymbolicLinkName);
+
+ DPRINT("Opening handle to %wZ\n", &DeviceName);
+
/* Open the device */
InitializeObjectAttributes(
&ObjectAttributes,
- Notification->SymbolicLinkName,
+ &DeviceName,
OBJ_KERNEL_HANDLE,
NULL,
NULL);
diff --git a/ntoskrnl/po/power.c b/ntoskrnl/po/power.c
index 96a211b5680..e8d37b855fd 100644
--- a/ntoskrnl/po/power.c
+++ b/ntoskrnl/po/power.c
@@ -47,10 +47,11 @@ PopRequestPowerIrpCompletion(IN PDEVICE_OBJECT DeviceObject,
RequestPowerItem->PowerState,
RequestPowerItem->Context,
&Irp->IoStatus);
-
- ExFreePool(&Irp->IoStatus);
+
ExFreePool(Context);
+ IoFreeIrp(Irp);
+
return STATUS_SUCCESS;
}
@@ -137,7 +138,7 @@ PoInitSystem(IN ULONG BootPhase)
{
/* Registry power button notification */
IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange,
- 0, /* The registry has not been initialized yet */
+ PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES,
(PVOID)&GUID_DEVICE_SYS_BUTTON,
IopRootDeviceNode->
PhysicalDeviceObject->DriverObject,
@@ -358,7 +359,6 @@ PoRequestPowerIrp(IN PDEVICE_OBJECT DeviceObject,
PDEVICE_OBJECT TopDeviceObject;
PIO_STACK_LOCATION Stack;
PIRP Irp;
- PIO_STATUS_BLOCK IoStatusBlock;
PREQUEST_POWER_ITEM RequestPowerItem;
NTSTATUS Status;
@@ -370,27 +370,19 @@ PoRequestPowerIrp(IN PDEVICE_OBJECT DeviceObject,
RequestPowerItem = ExAllocatePool(NonPagedPool, sizeof(REQUEST_POWER_ITEM));
if (!RequestPowerItem)
return STATUS_INSUFFICIENT_RESOURCES;
- IoStatusBlock = ExAllocatePool(NonPagedPool, sizeof(IO_STATUS_BLOCK));
- if (!IoStatusBlock)
- {
- ExFreePool(RequestPowerItem);
- return STATUS_INSUFFICIENT_RESOURCES;
- }
/* Always call the top of the device stack */
TopDeviceObject = IoGetAttachedDeviceReference(DeviceObject);
- Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
- TopDeviceObject,
- NULL,
- 0,
- NULL,
- NULL,
- IoStatusBlock);
+ Irp = IoBuildAsynchronousFsdRequest(IRP_MJ_POWER,
+ TopDeviceObject,
+ NULL,
+ 0,
+ NULL,
+ NULL);
if (!Irp)
{
ExFreePool(RequestPowerItem);
- ExFreePool(IoStatusBlock);
return STATUS_INSUFFICIENT_RESOURCES;
}
@@ -404,7 +396,10 @@ PoRequestPowerIrp(IN PDEVICE_OBJECT DeviceObject,
if (MinorFunction == IRP_MN_WAIT_WAKE)
Stack->Parameters.WaitWake.PowerState = PowerState.SystemState;
else
- Stack->Parameters.WaitWake.PowerState = PowerState.DeviceState;
+ {
+ Stack->Parameters.Power.Type = DevicePowerState;
+ Stack->Parameters.Power.State = PowerState;
+ }
RequestPowerItem->CompletionRoutine = CompletionFunction;
RequestPowerItem->PowerState = PowerState;
diff --git a/ntoskrnl/rtl/libsupp.c b/ntoskrnl/rtl/libsupp.c
index ae87fc53d32..27f78952c72 100644
--- a/ntoskrnl/rtl/libsupp.c
+++ b/ntoskrnl/rtl/libsupp.c
@@ -340,8 +340,8 @@ RtlWalkFrameChain(OUT PVOID *Callers,
}
/* Get the stack limits */
- StackBegin = (ULONG_PTR)Teb->Tib.StackLimit;
- StackEnd = (ULONG_PTR)Teb->Tib.StackBase;
+ StackBegin = (ULONG_PTR)Teb->NtTib.StackLimit;
+ StackEnd = (ULONG_PTR)Teb->NtTib.StackBase;
#ifdef _M_IX86
Stack = TrapFrame->Ebp;
#elif defined(_M_PPC)
diff --git a/ntoskrnl/se/semgr.c b/ntoskrnl/se/semgr.c
index 8ed056becb8..4d5739efcc8 100644
--- a/ntoskrnl/se/semgr.c
+++ b/ntoskrnl/se/semgr.c
@@ -630,6 +630,37 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor,
}
}
+static PSID
+SepGetSDOwner(IN PSECURITY_DESCRIPTOR _SecurityDescriptor)
+{
+ PISECURITY_DESCRIPTOR SecurityDescriptor = _SecurityDescriptor;
+ PSID Owner;
+
+ if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
+ Owner = (PSID)((ULONG_PTR)SecurityDescriptor->Owner +
+ (ULONG_PTR)SecurityDescriptor);
+ else
+ Owner = (PSID)SecurityDescriptor->Owner;
+
+ return Owner;
+}
+
+static PSID
+SepGetSDGroup(IN PSECURITY_DESCRIPTOR _SecurityDescriptor)
+{
+ PISECURITY_DESCRIPTOR SecurityDescriptor = _SecurityDescriptor;
+ PSID Group;
+
+ if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
+ Group = (PSID)((ULONG_PTR)SecurityDescriptor->Group +
+ (ULONG_PTR)SecurityDescriptor);
+ else
+ Group = (PSID)SecurityDescriptor->Group;
+
+ return Group;
+}
+
+
/* PUBLIC FUNCTIONS ***********************************************************/
/*
@@ -704,6 +735,27 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor,
return STATUS_SUCCESS;
}
+ /* Protect probe in SEH */
+ _SEH2_TRY
+ {
+ /* Probe all pointers */
+ ProbeForRead(GenericMapping, sizeof(GENERIC_MAPPING), sizeof(ULONG));
+ ProbeForRead(PrivilegeSetLength, sizeof(ULONG), sizeof(ULONG));
+ ProbeForWrite(PrivilegeSet, *PrivilegeSetLength, sizeof(ULONG));
+ ProbeForWrite(GrantedAccess, sizeof(ACCESS_MASK), sizeof(ULONG));
+ ProbeForWrite(AccessStatus, sizeof(NTSTATUS), sizeof(ULONG));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ /* Return the exception code */
+ _SEH2_YIELD(return _SEH2_GetExceptionCode());
+ }
+ _SEH2_END;
+
+ /* Check for unmapped access rights */
+ if (DesiredAccess & (GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL))
+ return STATUS_GENERIC_NOT_MAPPED;
+
/* Reference the token */
Status = ObReferenceObjectByHandle(TokenHandle,
TOKEN_QUERY,
@@ -713,16 +765,33 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor,
NULL);
if (!NT_SUCCESS(Status))
{
- DPRINT1("Failed to reference token (Status %lx)\n", Status);
+ DPRINT("Failed to reference token (Status %lx)\n", Status);
return Status;
}
/* Check token type */
if (Token->TokenType != TokenImpersonation)
{
- DPRINT1("No impersonation token\n");
+ DPRINT("No impersonation token\n");
ObDereferenceObject(Token);
- return STATUS_ACCESS_DENIED;
+ return STATUS_NO_IMPERSONATION_TOKEN;
+ }
+
+ /* Check the impersonation level */
+ if (Token->ImpersonationLevel < SecurityIdentification)
+ {
+ DPRINT("Impersonation level < SecurityIdentification\n");
+ ObDereferenceObject(Token);
+ return STATUS_BAD_IMPERSONATION_LEVEL;
+ }
+
+ /* Check security descriptor for valid owner and group */
+ if (SepGetSDOwner(SecurityDescriptor)== NULL ||
+ SepGetSDGroup(SecurityDescriptor) == NULL)
+ {
+ DPRINT("Security Descriptor does not have a valid group or owner\n");
+ ObDereferenceObject(Token);
+ return STATUS_INVALID_SECURITY_DESCR;
}
/* Set up the subject context, and lock it */
@@ -745,8 +814,10 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor,
AccessStatus,
SecurityIdentification);
- /* Unlock subject context and dereference the token */
+ /* Unlock subject context */
SeUnlockSubjectContext(&SubjectSecurityContext);
+
+ /* Dereference the token */
ObDereferenceObject(Token);
/* Check succeeded */
diff --git a/ntoskrnl/se/token.c b/ntoskrnl/se/token.c
index c27d7f8c40a..8f73312fde4 100644
--- a/ntoskrnl/se/token.c
+++ b/ntoskrnl/se/token.c
@@ -1347,6 +1347,14 @@ NtQueryInformationToken(IN HANDLE TokenHandle,
PSECURITY_IMPERSONATION_LEVEL sil = (PSECURITY_IMPERSONATION_LEVEL)TokenInformation;
DPRINT("NtQueryInformationToken(TokenImpersonationLevel)\n");
+
+ /* Fail if the token is not an impersonation token */
+ if (Token->TokenType != TokenImpersonation)
+ {
+ Status = STATUS_INVALID_INFO_CLASS;
+ break;
+ }
+
RequiredLength = sizeof(SECURITY_IMPERSONATION_LEVEL);
_SEH2_TRY
@@ -2187,7 +2195,7 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
{
PETHREAD Thread, NewThread;
HANDLE hToken;
- PTOKEN Token, NewToken, PrimaryToken;
+ PTOKEN Token, NewToken = NULL, PrimaryToken;
BOOLEAN CopyOnOpen, EffectiveOnly;
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
SE_IMPERSONATION_STATE ImpersonationState;
@@ -2313,9 +2321,9 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
}
if (NewToken) ObDereferenceObject(NewToken);
-
+
if (CopyOnOpen && NewThread) ObDereferenceObject(NewThread);
-
+
if(NT_SUCCESS(Status))
{
_SEH2_TRY
diff --git a/subsystems/subsystems.rbuild b/subsystems/subsystems.rbuild
index 49a9029d4da..8dc879444d4 100644
--- a/subsystems/subsystems.rbuild
+++ b/subsystems/subsystems.rbuild
@@ -1,9 +1,11 @@
-
-
-
+
+
+
+
+
diff --git a/subsystems/win32/win32k/include/menu.h b/subsystems/win32/win32k/include/menu.h
index a9ad71eb3a2..94d7106baa3 100644
--- a/subsystems/win32/win32k/include/menu.h
+++ b/subsystems/win32/win32k/include/menu.h
@@ -23,7 +23,7 @@ typedef struct _MENU_ITEM
UNICODE_STRING Text;
HBITMAP hbmpItem;
RECTL Rect;
- UINT XTab;
+ UINT dxTab;
} MENU_ITEM, *PMENU_ITEM;
typedef struct _MENU_OBJECT
diff --git a/subsystems/win32/win32k/include/msgqueue.h b/subsystems/win32/win32k/include/msgqueue.h
index eadc3ab1ecf..5752481c9d4 100644
--- a/subsystems/win32/win32k/include/msgqueue.h
+++ b/subsystems/win32/win32k/include/msgqueue.h
@@ -187,7 +187,7 @@ co_IntSendMessageTimeout(HWND hWnd,
LRESULT FASTCALL
IntDispatchMessage(MSG* Msg);
BOOL FASTCALL
-IntTranslateKbdMessage(LPMSG lpMsg, HKL dwhkl);
+IntTranslateKbdMessage(LPMSG lpMsg, UINT flags);
VOID FASTCALL
co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
diff --git a/subsystems/win32/win32k/ntuser/keyboard.c b/subsystems/win32/win32k/ntuser/keyboard.c
index 443919cbb99..0c935a478e0 100644
--- a/subsystems/win32/win32k/ntuser/keyboard.c
+++ b/subsystems/win32/win32k/ntuser/keyboard.c
@@ -419,7 +419,7 @@ CLEANUP:
BOOL FASTCALL
IntTranslateKbdMessage(LPMSG lpMsg,
- HKL dwhkl)
+ UINT flags)
{
PTHREADINFO pti;
static INT dead_char = 0;
diff --git a/subsystems/win32/win32k/ntuser/menu.c b/subsystems/win32/win32k/ntuser/menu.c
index f030481a636..9bdbe026cf8 100644
--- a/subsystems/win32/win32k/ntuser/menu.c
+++ b/subsystems/win32/win32k/ntuser/menu.c
@@ -690,8 +690,8 @@ IntGetMenuItemInfo(PMENU_OBJECT Menu, /* UNUSED PARAM!! */
if (sizeof(ROSMENUITEMINFO) == lpmii->cbSize)
{
lpmii->Rect = MenuItem->Rect;
- lpmii->XTab = MenuItem->XTab;
- lpmii->Text = MenuItem->Text.Buffer;
+ lpmii->dxTab = MenuItem->dxTab;
+ lpmii->lpstr = MenuItem->Text.Buffer; // Use DesktopHeap!
}
return TRUE;
@@ -842,8 +842,8 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF
if (sizeof(ROSMENUITEMINFO) == lpmii->cbSize)
{
MenuItem->Rect = lpmii->Rect;
- MenuItem->XTab = lpmii->XTab;
- lpmii->Text = MenuItem->Text.Buffer; /* Send back new allocated string or zero */
+ MenuItem->dxTab = lpmii->dxTab;
+ lpmii->lpstr = MenuItem->Text.Buffer; /* Use DesktopHeap! Send back new allocated string or zero */
}
return TRUE;
@@ -1002,8 +1002,8 @@ IntBuildMenuItemList(PMENU_OBJECT MenuObject, PVOID Buffer, ULONG nMax)
mii.hbmpUnchecked = CurItem->hbmpUnchecked;
mii.hSubMenu = CurItem->hSubMenu;
mii.Rect = CurItem->Rect;
- mii.XTab = CurItem->XTab;
- mii.Text = CurItem->Text.Buffer;
+ mii.dxTab = CurItem->dxTab;
+ mii.lpstr = CurItem->Text.Buffer; // Use DesktopHeap!
Status = MmCopyToCaller(Buf, &mii, sizeof(ROSMENUITEMINFO));
if (! NT_SUCCESS(Status))
diff --git a/subsystems/win32/win32k/ntuser/message.c b/subsystems/win32/win32k/ntuser/message.c
index e7265c06220..1b244b0e038 100644
--- a/subsystems/win32/win32k/ntuser/message.c
+++ b/subsystems/win32/win32k/ntuser/message.c
@@ -2285,7 +2285,7 @@ NtUserDispatchMessage(PMSG UnsafeMsgInfo)
BOOL APIENTRY
NtUserTranslateMessage(LPMSG lpMsg,
- HKL dwhkl)
+ UINT flags)
{
NTSTATUS Status;
MSG SafeMsg;
@@ -2301,7 +2301,7 @@ NtUserTranslateMessage(LPMSG lpMsg,
RETURN( FALSE);
}
- RETURN( IntTranslateKbdMessage(&SafeMsg, dwhkl));
+ RETURN( IntTranslateKbdMessage(&SafeMsg, flags));
CLEANUP:
DPRINT("Leave NtUserTranslateMessage: ret=%i\n",_ret_);
diff --git a/subsystems/win32/win32k/ntuser/windc.c b/subsystems/win32/win32k/ntuser/windc.c
index 608ba2f75d1..b870b499a4f 100644
--- a/subsystems/win32/win32k/ntuser/windc.c
+++ b/subsystems/win32/win32k/ntuser/windc.c
@@ -646,6 +646,11 @@ DceFreeDCE(PDCE pdce, BOOLEAN Force)
Hit = TRUE;
}
}
+ else
+ {
+ if (!GreGetObjectOwner(pdce->hDC, GDIObjType_DC_TYPE))
+ DC_SetOwnership( pdce->hDC, PsGetCurrentProcess());
+ }
if (!Hit) IntGdiDeleteDC(pdce->hDC, TRUE);
diff --git a/subsystems/win32/win32k/objects/gdibatch.c b/subsystems/win32/win32k/objects/gdibatch.c
index 6bb56851c55..c2b5434a6ae 100644
--- a/subsystems/win32/win32k/objects/gdibatch.c
+++ b/subsystems/win32/win32k/objects/gdibatch.c
@@ -67,14 +67,34 @@ ULONG
FASTCALL
GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
{
+ BOOL Hit = FALSE;
+ ULONG Cmd = 0, Size = 0;
PDC_ATTR pdcattr = NULL;
if (dc)
{
- pdcattr = dc->pdcattr;
+ pdcattr = dc->pdcattr;
}
- // The thread is approaching the end of sunset.
- switch(pHdr->Cmd)
+
+ _SEH2_TRY
+ {
+ Cmd = pHdr->Cmd;
+ Size = pHdr->Size; // Return the full size of the structure.
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Hit = TRUE;
+ }
+ _SEH2_END;
+
+ if (Hit)
+ {
+ DPRINT1("WARNING! GdiBatch Fault!\n");
+ return 0;
+ }
+
+ // FYI! The thread is approaching the end of sunset.
+ switch(Cmd)
{
case GdiBCPatBlt: // Highest pri first!
break;
@@ -114,7 +134,7 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
break;
}
- return pHdr->Size; // Return the full size of the structure.
+ return Size;
}
/*
@@ -163,8 +183,11 @@ NtGdiFlushUserBatch(VOID)
// No need to init anything, just go!
for (; GdiBatchCount > 0; GdiBatchCount--)
{
+ ULONG Size;
// Process Gdi Batch!
- pHdr += GdiFlushUserBatch(pDC, (PGDIBATCHHDR) pHdr);
+ Size = GdiFlushUserBatch(pDC, (PGDIBATCHHDR) pHdr);
+ if (!Size) break;
+ pHdr += Size;
}
if (pDC)