mirror of
https://github.com/reactos/reactos.git
synced 2025-05-28 05:28:14 +00:00
Sync with trunk (r47116), hopefully without breaking anything.
svn path=/branches/reactos-yarotows/; revision=47117
This commit is contained in:
commit
88c9e7c6e8
453 changed files with 18983 additions and 11086 deletions
|
@ -1,3 +1,5 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
|
||||
<module name="reg" type="win32cui" installbase="system32" installname="reg.exe" unicode="true">
|
||||
<include base="reg">.</include>
|
||||
<redefine name="_WIN32_WINNT">0x600</redefine>
|
||||
|
|
|
@ -1,25 +1,26 @@
|
|||
<?xml version="1.0"?>
|
||||
<group xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<installfile installbase="system32">downloader.xml</installfile>
|
||||
<module name="downloader" type="win32gui" installbase="system32" installname="downloader.exe" unicode="yes">
|
||||
<include base="downloader">.</include>
|
||||
<include base="expat">.</include>
|
||||
<!DOCTYPE group SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<group>
|
||||
<installfile installbase="system32">downloader.xml</installfile>
|
||||
<module name="downloader" type="win32gui" installbase="system32" installname="downloader.exe" unicode="yes">
|
||||
<include base="downloader">.</include>
|
||||
<include base="expat">.</include>
|
||||
|
||||
<library>advapi32</library>
|
||||
<library>ntdll</library>
|
||||
<library>user32</library>
|
||||
<library>gdi32</library>
|
||||
<library>shell32</library>
|
||||
<library>comctl32</library>
|
||||
<library>msimg32</library>
|
||||
<library>shlwapi</library>
|
||||
<library>urlmon</library>
|
||||
<library>uuid</library>
|
||||
<library>expat</library>
|
||||
<library>advapi32</library>
|
||||
<library>ntdll</library>
|
||||
<library>user32</library>
|
||||
<library>gdi32</library>
|
||||
<library>shell32</library>
|
||||
<library>comctl32</library>
|
||||
<library>msimg32</library>
|
||||
<library>shlwapi</library>
|
||||
<library>urlmon</library>
|
||||
<library>uuid</library>
|
||||
<library>expat</library>
|
||||
|
||||
<file>main.c</file>
|
||||
<file>xml.c</file>
|
||||
<file>download.c</file>
|
||||
<file>downloader.rc</file>
|
||||
</module>
|
||||
<file>main.c</file>
|
||||
<file>xml.c</file>
|
||||
<file>download.c</file>
|
||||
<file>downloader.rc</file>
|
||||
</module>
|
||||
</group>
|
||||
|
|
|
@ -204,7 +204,7 @@ Display_SetString(HWND hwnd, LPARAM lParam)
|
|||
pData = (DISPLAYDATA*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
|
||||
_snwprintf(pData->szString, MAX_STRING, (WCHAR*)lParam);
|
||||
|
||||
// FIXME: redraw the window
|
||||
InvalidateRect(hwnd, NULL, TRUE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<module name="fontview" type="win32gui" installbase="system32" installname="fontview.exe">
|
||||
<include base="fontview">.</include>
|
||||
<library>gdi32</library>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE group SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<group xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<module name="kbswitch" type="win32gui" installbase="system32" installname="kbswitch.exe" unicode="yes">
|
||||
<include base="kbswitch">.</include>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE project SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<module name="magnify" type="win32gui" installbase="system32" installname="magnify.exe">
|
||||
<include base="magnify">.</include>
|
||||
<library>user32</library>
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<module name="mplay32" type="win32gui" installbase="system32" installname="mplay32.exe" unicode="yes">
|
||||
<include base="mplay32">.</include>
|
||||
<library>advapi32</library>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0"?>
|
||||
<rbuild xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
|
||||
<module name="eventvwr" type="win32gui" installbase="system32" installname="eventvwr.exe" unicode="yes">
|
||||
<include base="eventvwr">.</include>
|
||||
<library>user32</library>
|
||||
|
@ -8,4 +8,3 @@
|
|||
<file>eventvwr.c</file>
|
||||
<file>eventvwr.rc</file>
|
||||
</module>
|
||||
</rbuild>
|
||||
|
|
|
@ -21,13 +21,6 @@
|
|||
#include <winsock2.h> /* winsock2.h first */
|
||||
#include <precomp.h>
|
||||
|
||||
//FIXME: remove eventually
|
||||
#ifndef _UNICODE
|
||||
#define _UNICODE
|
||||
#endif
|
||||
#include <tchar.h>
|
||||
|
||||
|
||||
extern char g_username[];
|
||||
extern char g_hostname[];
|
||||
extern char g_servername[];
|
||||
|
@ -89,7 +82,7 @@ uni_to_str(char * sizex, TCHAR * size1)
|
|||
int len;
|
||||
int i;
|
||||
|
||||
len = _tcslen(size1);
|
||||
len = lstrlen(size1);
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
sizex[i] = (char)size1[i];
|
||||
|
|
|
@ -143,6 +143,7 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument
|
|||
HBITMAP tempBm;
|
||||
int i;
|
||||
TCHAR tooltips[16][30];
|
||||
HDC hDC;
|
||||
|
||||
TCHAR *c;
|
||||
TCHAR sfnFilename[1000];
|
||||
|
@ -152,7 +153,7 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument
|
|||
TCHAR ofnFiletitle[256];
|
||||
TCHAR ofnFilter[1000];
|
||||
TCHAR miniaturetitle[100];
|
||||
int custColors[16] = { 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
|
||||
static int custColors[16] = { 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
|
||||
0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff
|
||||
};
|
||||
|
||||
|
@ -371,8 +372,10 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument
|
|||
CreateWindowEx(0, _T("Scrollbox"), _T(""), WS_CHILD | WS_VISIBLE, 3, 3, imgXRes, imgYRes, hScrlClient,
|
||||
NULL, hThisInstance, NULL);
|
||||
|
||||
hDrawingDC = CreateCompatibleDC(GetDC(hImageArea));
|
||||
hSelDC = CreateCompatibleDC(GetDC(hImageArea));
|
||||
hDC = GetDC(hImageArea);
|
||||
hDrawingDC = CreateCompatibleDC(hDC);
|
||||
hSelDC = CreateCompatibleDC(hDC);
|
||||
ReleaseDC(hImageArea, hDC);
|
||||
SelectObject(hDrawingDC, CreatePen(PS_SOLID, 0, fgColor));
|
||||
SelectObject(hDrawingDC, CreateSolidBrush(bgColor));
|
||||
|
||||
|
|
|
@ -25,6 +25,34 @@ placeSelWin()
|
|||
//SendMessage(hSelection, WM_PAINT, 0, 0);
|
||||
}
|
||||
|
||||
void
|
||||
regularize(short x0, short y0, short *x1, short *y1)
|
||||
{
|
||||
if (abs(*x1 - x0) >= abs(*y1 - y0))
|
||||
*y1 = y0 + (*y1 > y0 ? abs(*x1 - x0) : -abs(*x1 - x0));
|
||||
else
|
||||
*x1 = x0 + (*x1 > x0 ? abs(*y1 - y0) : -abs(*y1 - y0));
|
||||
}
|
||||
|
||||
void
|
||||
roundTo8Directions(short x0, short y0, short *x1, short *y1)
|
||||
{
|
||||
if (abs(*x1 - x0) >= abs(*y1 - y0))
|
||||
{
|
||||
if (abs(*y1 - y0) * 5 < abs(*x1 - x0) * 2)
|
||||
*y1 = y0;
|
||||
else
|
||||
*y1 = y0 + (*y1 > y0 ? abs(*x1 - x0) : -abs(*x1 - x0));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (abs(*x1 - x0) * 5 < abs(*y1 - y0) * 2)
|
||||
*x1 = x0;
|
||||
else
|
||||
*x1 = x0 + (*x1 > x0 ? abs(*y1 - y0) : -abs(*y1 - y0));
|
||||
}
|
||||
}
|
||||
|
||||
POINT pointStack[256];
|
||||
short pointSP;
|
||||
POINT *ptStack = NULL;
|
||||
|
@ -147,6 +175,8 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg)
|
|||
break;
|
||||
case 11:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
roundTo8Directions(startX, startY, &x, &y);
|
||||
Line(hdc, startX, startY, x, y, fg, lineWidth);
|
||||
break;
|
||||
case 12:
|
||||
|
@ -169,21 +199,30 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg)
|
|||
break;
|
||||
case 13:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
regularize(startX, startY, &x, &y);
|
||||
Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
|
||||
break;
|
||||
case 14:
|
||||
resetToU1();
|
||||
pointStack[pointSP].x = x;
|
||||
pointStack[pointSP].y = y;
|
||||
if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0))
|
||||
roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y,
|
||||
(short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y);
|
||||
if (pointSP + 1 >= 2)
|
||||
Poly(hdc, pointStack, pointSP + 1, fg, bg, lineWidth, shapeStyle, FALSE);
|
||||
break;
|
||||
case 15:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
regularize(startX, startY, &x, &y);
|
||||
Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
|
||||
break;
|
||||
case 16:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
regularize(startX, startY, &x, &y);
|
||||
RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
|
||||
break;
|
||||
}
|
||||
|
@ -276,6 +315,8 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
|
|||
break;
|
||||
case 11:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
roundTo8Directions(startX, startY, &x, &y);
|
||||
Line(hdc, startX, startY, x, y, fg, lineWidth);
|
||||
break;
|
||||
case 12:
|
||||
|
@ -285,12 +326,17 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
|
|||
break;
|
||||
case 13:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
regularize(startX, startY, &x, &y);
|
||||
Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
|
||||
break;
|
||||
case 14:
|
||||
resetToU1();
|
||||
pointStack[pointSP].x = x;
|
||||
pointStack[pointSP].y = y;
|
||||
if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0))
|
||||
roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y,
|
||||
(short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y);
|
||||
pointSP++;
|
||||
if (pointSP >= 2)
|
||||
{
|
||||
|
@ -310,10 +356,14 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
|
|||
break;
|
||||
case 15:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
regularize(startX, startY, &x, &y);
|
||||
Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
|
||||
break;
|
||||
case 16:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
regularize(startX, startY, &x, &y);
|
||||
RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
|
||||
break;
|
||||
}
|
||||
|
@ -398,6 +448,8 @@ whilePaintingR(HDC hdc, short x, short y, int fg, int bg)
|
|||
break;
|
||||
case 11:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
roundTo8Directions(startX, startY, &x, &y);
|
||||
Line(hdc, startX, startY, x, y, bg, lineWidth);
|
||||
break;
|
||||
case 12:
|
||||
|
@ -420,21 +472,30 @@ whilePaintingR(HDC hdc, short x, short y, int fg, int bg)
|
|||
break;
|
||||
case 13:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
regularize(startX, startY, &x, &y);
|
||||
Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
|
||||
break;
|
||||
case 14:
|
||||
resetToU1();
|
||||
pointStack[pointSP].x = x;
|
||||
pointStack[pointSP].y = y;
|
||||
if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0))
|
||||
roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y,
|
||||
(short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y);
|
||||
if (pointSP + 1 >= 2)
|
||||
Poly(hdc, pointStack, pointSP + 1, bg, fg, lineWidth, shapeStyle, FALSE);
|
||||
break;
|
||||
case 15:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
regularize(startX, startY, &x, &y);
|
||||
Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
|
||||
break;
|
||||
case 16:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
regularize(startX, startY, &x, &y);
|
||||
RRect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
|
||||
break;
|
||||
}
|
||||
|
@ -457,6 +518,8 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg)
|
|||
break;
|
||||
case 11:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
roundTo8Directions(startX, startY, &x, &y);
|
||||
Line(hdc, startX, startY, x, y, bg, lineWidth);
|
||||
break;
|
||||
case 12:
|
||||
|
@ -466,12 +529,17 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg)
|
|||
break;
|
||||
case 13:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
regularize(startX, startY, &x, &y);
|
||||
Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
|
||||
break;
|
||||
case 14:
|
||||
resetToU1();
|
||||
pointStack[pointSP].x = x;
|
||||
pointStack[pointSP].y = y;
|
||||
if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0))
|
||||
roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y,
|
||||
(short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y);
|
||||
pointSP++;
|
||||
if (pointSP >= 2)
|
||||
{
|
||||
|
@ -491,10 +559,14 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg)
|
|||
break;
|
||||
case 15:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
regularize(startX, startY, &x, &y);
|
||||
Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
|
||||
break;
|
||||
case 16:
|
||||
resetToU1();
|
||||
if (GetAsyncKeyState(VK_SHIFT) < 0)
|
||||
regularize(startX, startY, &x, &y);
|
||||
RRect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE group SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<group>
|
||||
<module name="rapps" type="win32gui" installbase="system32" installname="rapps.exe" unicode="yes">
|
||||
<include base="ReactOS">include/reactos</include>
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
[Section]
|
||||
Name = Miranda IM
|
||||
Version = 0.8.19
|
||||
Version = 0.8.21
|
||||
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.19-unicode.exe
|
||||
URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.21-unicode.exe
|
||||
CDPath = none
|
||||
|
||||
[Section.0407]
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
[Section]
|
||||
Name = Opera
|
||||
Version = 10.51
|
||||
Version = 10.52
|
||||
Licence = Freeware
|
||||
Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client.
|
||||
Size = 11.0M
|
||||
Size = 12.0M
|
||||
Category = 5
|
||||
URLSite = http://www.opera.com/
|
||||
URLDownload = http://get4.opera.com/pub/opera/win/1051/int/Opera_1051_int_Setup.exe
|
||||
URLDownload = http://get4.opera.com/pub/opera/win/1052/int/Opera_1052_int_Setup.exe
|
||||
CDPath = none
|
||||
|
||||
[Section.0407]
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
[Section]
|
||||
Name = SciTE
|
||||
Version = 2.10
|
||||
Version = 2.11
|
||||
Licence = Freeware
|
||||
Description = SciTE is a SCIntilla based Text Editor. Originally built to demonstrate Scintilla, it has grown to be a generally useful editor with facilities for building and running programs.
|
||||
Size = 0.6M
|
||||
Category = 7
|
||||
URLSite = http://www.scintilla.org/
|
||||
URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc210.exe
|
||||
URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc211.exe
|
||||
CDPath = none
|
||||
|
||||
[Section.0407]
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
[Section]
|
||||
Name = µTorrent
|
||||
Version = 2.0
|
||||
Version = 2.0.1
|
||||
Licence = Freeware for non-commercial uses
|
||||
Description = Small and fast BitTorrent Client.
|
||||
Size = 312K
|
||||
Size = 314K
|
||||
Category = 5
|
||||
URLSite = http://www.utorrent.com/
|
||||
URLDownload = http://download.utorrent.com/2.0/utorrent.exe
|
||||
URLDownload = http://download.utorrent.com/2.0.1/utorrent.exe
|
||||
CDPath = none
|
||||
|
||||
|
||||
|
|
|
@ -228,8 +228,6 @@ static BOOL CheckCommDlgError(HWND hWnd)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
#define MAX_CUSTOM_FILTER_SIZE 50
|
||||
TCHAR CustomFilterBuffer[MAX_CUSTOM_FILTER_SIZE];
|
||||
TCHAR FileNameBuffer[_MAX_PATH];
|
||||
TCHAR FileTitleBuffer[_MAX_PATH];
|
||||
|
||||
|
@ -275,25 +273,11 @@ static BOOL InitOpenFileName(HWND hWnd, OPENFILENAME* pofn)
|
|||
BuildFilterStrings(Filter, FilterPairs, sizeof(FilterPairs) / sizeof(FILTERPAIR));
|
||||
|
||||
pofn->lpstrFilter = Filter;
|
||||
pofn->lpstrCustomFilter = CustomFilterBuffer;
|
||||
pofn->nMaxCustFilter = MAX_CUSTOM_FILTER_SIZE;
|
||||
pofn->nFilterIndex = 0;
|
||||
pofn->lpstrFile = FileNameBuffer;
|
||||
pofn->nMaxFile = _MAX_PATH;
|
||||
pofn->lpstrFileTitle = FileTitleBuffer;
|
||||
pofn->nMaxFileTitle = _MAX_PATH;
|
||||
/* pofn->lpstrInitialDir = _T("");*/
|
||||
/* pofn->lpstrTitle = _T("Import Registry File");*/
|
||||
/* pofn->Flags = OFN_ENABLETEMPLATE + OFN_EXPLORER + OFN_ENABLESIZING;*/
|
||||
pofn->Flags = OFN_HIDEREADONLY;
|
||||
/* pofn->nFileOffset = ;*/
|
||||
/* pofn->nFileExtension = ;*/
|
||||
/* pofn->lpstrDefExt = _T("");*/
|
||||
/* pofn->lCustData = ;*/
|
||||
/* pofn->lpfnHook = ImportRegistryFile_OFNHookProc;*/
|
||||
/* pofn->lpTemplateName = _T("ID_DLG_IMPORT_REGFILE");*/
|
||||
/* pofn->lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG1);*/
|
||||
/* pofn->FlagsEx = ;*/
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -356,11 +340,11 @@ static UINT_PTR CALLBACK ExportRegistryFile_OFNHookProc(HWND hdlg, UINT uiMsg, W
|
|||
|
||||
hwndExportAll = GetDlgItem(hdlg, IDC_EXPORT_ALL);
|
||||
if (hwndExportAll)
|
||||
SendMessage(hwndExportAll, BM_SETCHECK, pszSelectedKey[0] ? BST_UNCHECKED : BST_CHECKED, 0);
|
||||
SendMessage(hwndExportAll, BM_SETCHECK, pszSelectedKey ? BST_UNCHECKED : BST_CHECKED, 0);
|
||||
|
||||
hwndExportBranch = GetDlgItem(hdlg, IDC_EXPORT_BRANCH);
|
||||
if (hwndExportBranch)
|
||||
SendMessage(hwndExportBranch, BM_SETCHECK, pszSelectedKey[0] ? BST_CHECKED : BST_UNCHECKED, 0);
|
||||
SendMessage(hwndExportBranch, BM_SETCHECK, pszSelectedKey ? BST_CHECKED : BST_UNCHECKED, 0);
|
||||
|
||||
hwndExportBranchText = GetDlgItem(hdlg, IDC_EXPORT_BRANCH_TEXT);
|
||||
if (hwndExportBranchText)
|
||||
|
@ -406,7 +390,12 @@ BOOL ExportRegistryFile(HWND hWnd)
|
|||
InitOpenFileName(hWnd, &ofn);
|
||||
LoadString(hInst, IDS_EXPORT_REG_FILE, Caption, sizeof(Caption)/sizeof(TCHAR));
|
||||
ofn.lpstrTitle = Caption;
|
||||
ofn.lCustData = (LPARAM) ExportKeyPath;
|
||||
|
||||
/* Only set the path if a key (not the root node) is selected */
|
||||
if (hKeyRoot != 0)
|
||||
{
|
||||
ofn.lCustData = (LPARAM) ExportKeyPath;
|
||||
}
|
||||
ofn.Flags = OFN_ENABLETEMPLATE | OFN_EXPLORER | OFN_ENABLEHOOK;
|
||||
ofn.lpfnHook = ExportRegistryFile_OFNHookProc;
|
||||
ofn.lpTemplateName = MAKEINTRESOURCE(IDD_EXPORTRANGE);
|
||||
|
|
|
@ -492,7 +492,7 @@ static int comp_FindSubFile(void *p, const void *key,
|
|||
int leaf, void** next)
|
||||
{
|
||||
*next = (char *)p+strlen(p)+(leaf?5:3);
|
||||
WINE_TRACE("Comparing '%s' with '%s'\n", (char *)p, (char *)key);
|
||||
WINE_TRACE("Comparing '%s' with '%s'\n", (char *)p, (const char *)key);
|
||||
return strcmp(p, key);
|
||||
}
|
||||
|
||||
|
@ -1601,7 +1601,7 @@ static BOOL HLPFILE_BrowseParagraph(HLPFILE_PAGE* page, struct RtfData* rd,
|
|||
case 0xEE:
|
||||
case 0xEF:
|
||||
{
|
||||
char* ptr = (char*) format + 8;
|
||||
const char* ptr = (const char*) format + 8;
|
||||
BYTE type = format[3];
|
||||
int wnd = -1;
|
||||
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<module name="winver" type="win32gui" installbase="system32" installname="winver.exe" unicode="yes">
|
||||
<include base="winver">.</include>
|
||||
<library>shell32</library>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<!DOCTYPE group SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<group>
|
||||
<module name="rpcss" type="win32cui" installbase="system32" installname="rpcss.exe" unicode="yes">
|
||||
<include base="rpcss">.</include>
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<module name="telnetd" type="win32cui" installbase="system32" installname="telnetd.exe" unicode="no">
|
||||
<include base="reactos"></include>
|
||||
<include base="telnetd">..</include>
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<module name="tftpd" type="win32cui" installbase="system32" installname="tftpd.exe" allowwarnings="true" unicode="no">
|
||||
<include base="reactos"></include>
|
||||
<include base="telnetd">..</include>
|
||||
|
||||
<library>ntdll</library>
|
||||
<library>advapi32</library>
|
||||
<library>ws2_32</library>
|
||||
<library>wine</library>
|
||||
|
||||
<file>tftpd.cpp</file>
|
||||
</module>
|
||||
|
|
|
@ -60,9 +60,6 @@ RunNewSetup (HINSTANCE hInstance)
|
|||
HMODULE hDll;
|
||||
PINSTALL_REACTOS InstallReactOS;
|
||||
|
||||
/* some dlls (loaded by syssetup) need a valid user profile */
|
||||
InitializeProfiles();
|
||||
|
||||
hDll = LoadLibrary (TEXT("syssetup"));
|
||||
if (hDll == NULL)
|
||||
{
|
||||
|
|
|
@ -132,6 +132,7 @@ InfpOpenInfFileW(
|
|||
IN PCWSTR FileName,
|
||||
IN PCWSTR InfClass,
|
||||
IN DWORD InfStyle,
|
||||
IN LCID LocaleId,
|
||||
OUT PUINT ErrorLine)
|
||||
{
|
||||
HINF hInf = NULL;
|
||||
|
@ -143,6 +144,7 @@ InfpOpenInfFileW(
|
|||
Status = InfOpenFile(
|
||||
&hInf,
|
||||
&FileNameU,
|
||||
LocaleId,
|
||||
&ErrorLineUL);
|
||||
*ErrorLine = (UINT)ErrorLineUL;
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
@ -252,6 +254,7 @@ INF_OpenBufferedFileA(
|
|||
IN ULONG FileSize,
|
||||
IN PCSTR InfClass,
|
||||
IN DWORD InfStyle,
|
||||
IN LCID LocaleId,
|
||||
OUT PUINT ErrorLine)
|
||||
{
|
||||
#ifdef __REACTOS__
|
||||
|
@ -263,6 +266,7 @@ INF_OpenBufferedFileA(
|
|||
&hInf,
|
||||
FileBuffer,
|
||||
FileSize,
|
||||
LocaleId,
|
||||
&ErrorLineUL);
|
||||
*ErrorLine = (UINT)ErrorLineUL;
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
|
|
@ -110,6 +110,7 @@ InfpOpenInfFileW(
|
|||
IN PCWSTR FileName,
|
||||
IN PCWSTR InfClass,
|
||||
IN DWORD InfStyle,
|
||||
IN LCID LocaleId,
|
||||
OUT PUINT ErrorLine);
|
||||
|
||||
#endif /* __REACTOS__ */
|
||||
|
@ -132,6 +133,7 @@ INF_OpenBufferedFileA(
|
|||
IN ULONG FileSize,
|
||||
IN PCSTR InfClass,
|
||||
IN DWORD InfStyle,
|
||||
IN LCID LocaleId,
|
||||
OUT PUINT ErrorLine);
|
||||
|
||||
VOID INF_SetHeap(
|
||||
|
|
|
@ -79,6 +79,8 @@ static PGENERIC_LIST KeyboardList = NULL;
|
|||
static PGENERIC_LIST LayoutList = NULL;
|
||||
static PGENERIC_LIST LanguageList = NULL;
|
||||
|
||||
static LANGID LanguageId = 0;
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
static VOID
|
||||
|
@ -422,6 +424,7 @@ CheckUnattendedSetup(VOID)
|
|||
UnattendInf = SetupOpenInfFileW(UnattendInfPath,
|
||||
NULL,
|
||||
INF_STYLE_WIN4,
|
||||
LanguageId,
|
||||
&ErrorLine);
|
||||
|
||||
if (UnattendInf == INVALID_HANDLE_VALUE)
|
||||
|
@ -678,6 +681,8 @@ LanguagePage(PINPUT_RECORD Ir)
|
|||
{
|
||||
SelectedLanguageId = (PWCHAR)GetListEntryUserData(GetCurrentListEntry(LanguageList));
|
||||
|
||||
LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF);
|
||||
|
||||
if (wcscmp(SelectedLanguageId, DefaultLanguage))
|
||||
{
|
||||
UpdateKBLayout();
|
||||
|
@ -765,6 +770,7 @@ SetupStartPage(PINPUT_RECORD Ir)
|
|||
SetupInf = SetupOpenInfFileW(FileNameBuffer,
|
||||
NULL,
|
||||
INF_STYLE_WIN4,
|
||||
LanguageId,
|
||||
&ErrorLine);
|
||||
|
||||
if (SetupInf == INVALID_HANDLE_VALUE)
|
||||
|
@ -3045,6 +3051,7 @@ PrepareCopyPage(PINPUT_RECORD Ir)
|
|||
InfFileSize,
|
||||
(const CHAR*) NULL,
|
||||
INF_STYLE_WIN4,
|
||||
LanguageId,
|
||||
&ErrorLine);
|
||||
|
||||
if (InfHandle == INVALID_HANDLE_VALUE)
|
||||
|
@ -3259,6 +3266,8 @@ RegistryPage(PINPUT_RECORD Ir)
|
|||
|
||||
DPRINT("Action: %S File: %S Section %S\n", Action, File, Section);
|
||||
|
||||
if (Action == NULL) break; // Hackfix
|
||||
|
||||
if (!_wcsicmp (Action, L"AddReg"))
|
||||
{
|
||||
Delete = FALSE;
|
||||
|
@ -3274,7 +3283,7 @@ RegistryPage(PINPUT_RECORD Ir)
|
|||
|
||||
CONSOLE_SetStatusText(MUIGetString(STRING_IMPORTFILE), File);
|
||||
|
||||
if (!ImportRegistryFile(File, Section, Delete))
|
||||
if (!ImportRegistryFile(File, Section, LanguageId, Delete))
|
||||
{
|
||||
DPRINT("Importing %S failed\n", File);
|
||||
|
||||
|
|
|
@ -617,6 +617,7 @@ registry_callback (HINF hInf, PCWSTR Section, BOOLEAN Delete)
|
|||
BOOLEAN
|
||||
ImportRegistryFile(PWSTR Filename,
|
||||
PWSTR Section,
|
||||
LCID LocaleId,
|
||||
BOOLEAN Delete)
|
||||
{
|
||||
WCHAR FileNameBuffer[MAX_PATH];
|
||||
|
@ -632,6 +633,7 @@ ImportRegistryFile(PWSTR Filename,
|
|||
FileNameBuffer,
|
||||
NULL,
|
||||
INF_STYLE_WIN4,
|
||||
LocaleId,
|
||||
&ErrorLine);
|
||||
if (hInf == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
BOOLEAN
|
||||
ImportRegistryFile(PWSTR Filename,
|
||||
PWSTR Section,
|
||||
LCID LocaleId,
|
||||
BOOLEAN Delete);
|
||||
|
||||
BOOLEAN
|
||||
|
|
|
@ -4,10 +4,10 @@
|
|||
<bootstrap installbase="$(CDOUTPUT)/system32" nameoncd="smss.exe" />
|
||||
<include base="usetup">.</include>
|
||||
<include base="zlib">.</include>
|
||||
<include base="inflib">.</include>
|
||||
<include base="newinflib">.</include>
|
||||
<include base="ReactOS">include/reactos/drivers</include>
|
||||
<library>zlib</library>
|
||||
<library>inflib</library>
|
||||
<library>newinflib</library>
|
||||
<library>ext2lib</library>
|
||||
<library>vfatlib</library>
|
||||
<library>ntdll</library>
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 36 KiB |
|
@ -1,3 +1,5 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<module name="runonce" type="win32gui" installbase="system32" installname="runonce.exe" unicode="yes">
|
||||
<include base="runonce">.</include>
|
||||
<library>advapi32</library>
|
||||
|
|
|
@ -212,7 +212,6 @@ StartAutoApplications(
|
|||
WARN("FindFirstFile(%s) failed with error %lu\n", debugstr_w(szPath), GetLastError());
|
||||
return;
|
||||
}
|
||||
szPath[len] = L'\0';
|
||||
|
||||
do
|
||||
{
|
||||
|
@ -220,9 +219,10 @@ StartAutoApplications(
|
|||
{
|
||||
memset(&ExecInfo, 0x0, sizeof(SHELLEXECUTEINFOW));
|
||||
ExecInfo.cbSize = sizeof(ExecInfo);
|
||||
wcscpy(&szPath[len+1], findData.cFileName);
|
||||
ExecInfo.lpVerb = L"open";
|
||||
ExecInfo.lpFile = findData.cFileName;
|
||||
ExecInfo.lpDirectory = szPath;
|
||||
ExecInfo.lpFile = szPath;
|
||||
ExecInfo.lpDirectory = NULL;
|
||||
TRACE("Executing %s in directory %s\n",
|
||||
debugstr_w(findData.cFileName), debugstr_w(szPath));
|
||||
ShellExecuteExW(&ExecInfo);
|
||||
|
|
|
@ -1,12 +1,14 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<if property="ARCH" value="i386>
|
||||
<group xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<if property="ARCH" value="i386">
|
||||
<module name="bootcd" type="iso" output="ReactOS.iso">
|
||||
<bootsector>isoboot</bootsector>
|
||||
</module>
|
||||
</if>
|
||||
<ifnot property="ARCH" value="i386>
|
||||
<ifnot property="ARCH" value="i386">
|
||||
<module name="bootcd" type="iso" output="ReactOS-$(ARCH).iso">
|
||||
<bootsector>isoboot</bootsector>
|
||||
</module>
|
||||
</ifnot>
|
||||
</group>
|
||||
|
|
|
@ -41,7 +41,7 @@ HKCR,"rtffile\shell\open\command","",0x00020000,"%SystemRoot%\system32\wordpad.e
|
|||
HKCR,".386","",0x00000000,"vxdfile"
|
||||
HKCR,".vxd","",0x00000000,"vxdfile"
|
||||
HKCR,"vxdfile","",0x00000000,"Virtual Device Driver"
|
||||
HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-156"
|
||||
HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-157"
|
||||
|
||||
; Animated Cursors
|
||||
HKCR,".ani","",0x00000000,"anifile"
|
||||
|
|
|
@ -41,7 +41,7 @@ HKCR,"rtffile\shell\open\command","",0x00020000,"%SystemRoot%\system32\wordpad.e
|
|||
HKCR,".386","",0x00000000,"vxdfile"
|
||||
HKCR,".vxd","",0x00000000,"vxdfile"
|
||||
HKCR,"vxdfile","",0x00000000,"Virtual Device Driver"
|
||||
HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-156"
|
||||
HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-157"
|
||||
|
||||
; Animated Cursors
|
||||
HKCR,".ani","",0x00000000,"anifile"
|
||||
|
|
|
@ -1530,7 +1530,8 @@ HKCU,"Control Panel\Accessibility\Keyboard Preference","On",2,"0"
|
|||
; Internet Explorer
|
||||
|
||||
HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php"
|
||||
HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\"
|
||||
;HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\"
|
||||
HKCU,Software\Wine\MSHTML,"GeckoCabDir",,"C:\ReactOS\"
|
||||
|
||||
; Sound Schemes
|
||||
HKCU,"AppEvents",,0x00000012
|
||||
|
|
Binary file not shown.
|
@ -1,12 +1,14 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<if property="ARCH" value="i386>
|
||||
<group xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<if property="ARCH" value="i386">
|
||||
<module name="livecd" type="liveiso" output="ReactOS-LiveCD.iso">
|
||||
<bootsector>isoboot</bootsector>
|
||||
</module>
|
||||
</if>
|
||||
<ifnot property="ARCH" value="i386>
|
||||
<ifnot property="ARCH" value="i386">
|
||||
<module name="livecd" type="liveiso" output="ReactOS-LiveCD-$(ARCH).iso">
|
||||
<bootsector>isoboot</bootsector>
|
||||
</module>
|
||||
</ifnot>
|
||||
</group>
|
||||
|
|
|
@ -636,6 +636,7 @@ media\nls\c_28603.nls 1
|
|||
media\nls\c_28604.nls 1
|
||||
media\nls\c_28605.nls 1
|
||||
media\nls\c_28606.nls 1
|
||||
media\drivers\etc\hosts 5
|
||||
media\drivers\etc\services 5
|
||||
media\inf\audio.inf 6
|
||||
media\inf\acpi.inf 6
|
||||
|
|
|
@ -452,7 +452,23 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
|
|||
SectorCount = Geometry.Sectors;
|
||||
}
|
||||
else
|
||||
return EINVAL;
|
||||
{
|
||||
DPRINTM(DPRINT_HWDETECT, "Using legacy sector size detection\n");
|
||||
|
||||
/* Fall back to legacy detection */
|
||||
if (DrivePartition == 0xff)
|
||||
{
|
||||
/* This is a CD-ROM device */
|
||||
SectorSize = 2048;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* This is either a floppy disk device (DrivePartition == 0) or
|
||||
* a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF) but
|
||||
* it doesn't matter which one because they both have 512 bytes per sector */
|
||||
SectorSize = 512;
|
||||
}
|
||||
}
|
||||
|
||||
if (DrivePartition != 0xff && DrivePartition != 0)
|
||||
{
|
||||
|
|
|
@ -45,7 +45,6 @@ PcMachInit(const char *CmdLine)
|
|||
MachVtbl.PrepareForReactOS = PcPrepareForReactOS;
|
||||
MachVtbl.GetMemoryMap = PcMemGetMemoryMap;
|
||||
MachVtbl.DiskGetBootPath = DiskGetBootPath;
|
||||
MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath;
|
||||
MachVtbl.DiskReadLogicalSectors = PcDiskReadLogicalSectors;
|
||||
MachVtbl.DiskGetDriveGeometry = PcDiskGetDriveGeometry;
|
||||
MachVtbl.DiskGetCacheableBlockCount = PcDiskGetCacheableBlockCount;
|
||||
|
|
|
@ -48,7 +48,6 @@ XboxMachInit(const char *CmdLine)
|
|||
MachVtbl.PrepareForReactOS = XboxPrepareForReactOS;
|
||||
MachVtbl.GetMemoryMap = XboxMemGetMemoryMap;
|
||||
MachVtbl.DiskGetBootPath = DiskGetBootPath;
|
||||
MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath;
|
||||
MachVtbl.DiskReadLogicalSectors = XboxDiskReadLogicalSectors;
|
||||
MachVtbl.DiskGetDriveGeometry = XboxDiskGetDriveGeometry;
|
||||
MachVtbl.DiskGetCacheableBlockCount = XboxDiskGetCacheableBlockCount;
|
||||
|
|
|
@ -44,12 +44,6 @@ VOID LoadAndBootBootSector(PCSTR OperatingSystemName)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!MachDiskNormalizeSystemPath(FileName, sizeof(FileName)))
|
||||
{
|
||||
UiMessageBox("Invalid path to boot sector file");
|
||||
return;
|
||||
}
|
||||
|
||||
FilePointer = FsOpenFile(FileName);
|
||||
if (!FilePointer)
|
||||
{
|
||||
|
|
|
@ -138,7 +138,20 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
|
|||
|
||||
if (!DissectArcPath(Path, FileName, &DriveNumber, &DrivePartition))
|
||||
return EINVAL;
|
||||
SectorSize = (DrivePartition == 0xff ? 2048 : 512);
|
||||
|
||||
if (DrivePartition == 0xff)
|
||||
{
|
||||
/* This is a CD-ROM device */
|
||||
SectorSize = 2048;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* This is either a floppy disk device (DrivePartition == 0) or
|
||||
* a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF) but
|
||||
* it doesn't matter which one because they both have 512 bytes per sector */
|
||||
SectorSize = 512;
|
||||
}
|
||||
|
||||
if (DrivePartition != 0xff && DrivePartition != 0)
|
||||
{
|
||||
if (!XboxDiskGetPartitionEntry(DriveNumber, DrivePartition, &PartitionTableEntry))
|
||||
|
|
|
@ -440,7 +440,6 @@ void PpcDefaultMachVtbl()
|
|||
|
||||
MachVtbl.GetMemoryMap = PpcGetMemoryMap;
|
||||
|
||||
MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath;
|
||||
MachVtbl.DiskGetBootPath = PpcDiskGetBootPath;
|
||||
MachVtbl.DiskReadLogicalSectors = PpcDiskReadLogicalSectors;
|
||||
MachVtbl.DiskGetDriveGeometry = PpcDiskGetDriveGeometry;
|
||||
|
|
|
@ -107,62 +107,80 @@ DiskGetBootPath(char *BootPath, unsigned Size)
|
|||
{
|
||||
static char Path[] = "multi(0)disk(0)";
|
||||
char Device[4];
|
||||
|
||||
_itoa(BootDrive, Device, 10);
|
||||
if (Size <= sizeof(Path) + 6 + strlen(Device))
|
||||
char Partition[4];
|
||||
PARTITION_TABLE_ENTRY PartitionEntry;
|
||||
MASTER_BOOT_RECORD MasterBootRecord;
|
||||
|
||||
if (BootDrive < 0x80)
|
||||
{
|
||||
return FALSE;
|
||||
/* This is a floppy */
|
||||
|
||||
if (Size <= sizeof(Path) + 7 + strlen(Device))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
strcpy(BootPath, Path);
|
||||
|
||||
strcat(BootPath, "fdisk");
|
||||
|
||||
_itoa(BootDrive, Device, 10);
|
||||
strcat(BootPath, "(");
|
||||
strcat(BootPath, Device);
|
||||
strcat(BootPath, ")");
|
||||
}
|
||||
strcpy(BootPath, Path);
|
||||
strcat(BootPath, BootDrive < 0x80 ? "fdisk" : "cdrom");
|
||||
strcat(strcat(strcat(BootPath, "("), Device), ")");
|
||||
|
||||
if (strcmp(BootPath, "multi(0)disk(0)cdrom(128)") == 0)
|
||||
strcpy(BootPath, "multi(0)disk(0)rdisk(0)partition(1)");
|
||||
/* FIXME */
|
||||
else if (DiskReadBootRecord(BootDrive, 0, &MasterBootRecord))
|
||||
{
|
||||
/* This is a hard disk */
|
||||
|
||||
if (!DiskGetActivePartitionEntry(BootDrive, &PartitionEntry, &BootPartition))
|
||||
{
|
||||
DbgPrint("Invalid active partition information\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (Size <= sizeof(Path) + 18 + strlen(Device) + strlen(Partition))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
strcpy(BootPath, Path);
|
||||
|
||||
strcat(BootPath, "rdisk");
|
||||
|
||||
_itoa(BootDrive - 0x80, Device, 10);
|
||||
strcat(BootPath, "(");
|
||||
strcat(BootPath, Device);
|
||||
strcat(BootPath, ")");
|
||||
|
||||
_itoa(BootPartition, Partition, 10);
|
||||
strcat(BootPath, "partition(");
|
||||
strcat(BootPath, Partition);
|
||||
strcat(BootPath, ")");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* This is a CD-ROM drive */
|
||||
|
||||
if (Size <= sizeof(Path) + 7 + strlen(Device))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
strcpy(BootPath, Path);
|
||||
|
||||
strcat(BootPath, "cdrom");
|
||||
|
||||
_itoa(BootDrive - 0x80, Device, 10);
|
||||
strcat(BootPath, "(");
|
||||
strcat(BootPath, Device);
|
||||
strcat(BootPath, ")");
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
DiskNormalizeSystemPath(char *SystemPath, unsigned Size)
|
||||
{
|
||||
CHAR BootPath[256];
|
||||
ULONG PartitionNumber;
|
||||
ULONG DriveNumber;
|
||||
PARTITION_TABLE_ENTRY PartEntry;
|
||||
char *p;
|
||||
|
||||
if (!DissectArcPath(SystemPath, BootPath, &DriveNumber, &PartitionNumber))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (0 != PartitionNumber)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (! DiskGetActivePartitionEntry(DriveNumber,
|
||||
&PartEntry,
|
||||
&PartitionNumber) ||
|
||||
PartitionNumber < 1 || 9 < PartitionNumber)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
p = SystemPath;
|
||||
while ('\0' != *p && 0 != _strnicmp(p, "partition(", 10)) {
|
||||
p++;
|
||||
}
|
||||
p = strchr(p, ')');
|
||||
if (NULL == p || '0' != *(p - 1)) {
|
||||
return FALSE;
|
||||
}
|
||||
*(p - 1) = '0' + PartitionNumber;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
// This function is in arch/i386/i386disk.c
|
||||
//VOID DiskStopFloppyMotor(VOID)
|
||||
|
||||
|
|
|
@ -197,7 +197,6 @@ BOOLEAN DiskGetFirstExtendedPartitionEntry(PMASTER_BOOT_RECORD MasterBootRecord,
|
|||
|
||||
BOOLEAN DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMASTER_BOOT_RECORD BootRecord)
|
||||
{
|
||||
char ErrMsg[64];
|
||||
ULONG Index;
|
||||
|
||||
// Read master boot record
|
||||
|
@ -231,9 +230,6 @@ BOOLEAN DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMA
|
|||
// Check the partition table magic value
|
||||
if (BootRecord->MasterBootRecordMagic != 0xaa55)
|
||||
{
|
||||
sprintf(ErrMsg, "Invalid partition table magic 0x%x found on drive 0x%lx",
|
||||
BootRecord->MasterBootRecordMagic, DriveNumber);
|
||||
DiskError(ErrMsg, 0);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE directory SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<module name="freeldr_arch" type="objectlibrary" crt="static">
|
||||
<include base="freeldr_base">include</include>
|
||||
<include base="freeldr_base">cache</include>
|
||||
|
|
|
@ -127,7 +127,6 @@ extern ULONG BootDrive;
|
|||
extern ULONG BootPartition;
|
||||
|
||||
BOOLEAN DiskGetBootPath(char *BootPath, unsigned Size);
|
||||
BOOLEAN DiskNormalizeSystemPath(char *SystemPath, unsigned Size);
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -62,7 +62,6 @@ typedef struct tagMACHVTBL
|
|||
ULONG (*GetMemoryMap)(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MaxMemoryMapSize);
|
||||
|
||||
BOOLEAN (*DiskGetBootPath)(char *BootPath, unsigned Size);
|
||||
BOOLEAN (*DiskNormalizeSystemPath)(char *SystemPath, unsigned Size);
|
||||
BOOLEAN (*DiskReadLogicalSectors)(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer);
|
||||
BOOLEAN (*DiskGetDriveGeometry)(ULONG DriveNumber, PGEOMETRY DriveGeometry);
|
||||
ULONG (*DiskGetCacheableBlockCount)(ULONG DriveNumber);
|
||||
|
|
|
@ -97,13 +97,6 @@ VOID LoadAndBootLinux(PCSTR OperatingSystemName, PCSTR Description)
|
|||
goto LinuxBootFailed;
|
||||
}
|
||||
|
||||
// Open the boot volume
|
||||
if (!MachDiskNormalizeSystemPath(LinuxBootPath, sizeof(LinuxBootPath)))
|
||||
{
|
||||
UiMessageBox("Invalid boot path");
|
||||
goto LinuxBootFailed;
|
||||
}
|
||||
|
||||
// Open the kernel
|
||||
LinuxKernel = FsOpenFile(LinuxKernelName);
|
||||
if (!LinuxKernel)
|
||||
|
|
|
@ -37,7 +37,6 @@
|
|||
#undef MachBeep
|
||||
#undef MachPrepareForReactOS
|
||||
#undef MachDiskGetBootPath
|
||||
#undef MachDiskNormalizeSystemPath
|
||||
#undef MachDiskReadLogicalSectors
|
||||
#undef MachDiskGetDriveGeometry
|
||||
#undef MachDiskGetCacheableBlockCount
|
||||
|
@ -152,12 +151,6 @@ MachDiskGetBootPath(char *BootPath, unsigned Size)
|
|||
return MachVtbl.DiskGetBootPath(BootPath, Size);
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
MachDiskNormalizeSystemPath(char *SystemPath, unsigned Size)
|
||||
{
|
||||
return MachVtbl.DiskNormalizeSystemPath(SystemPath, Size);
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
MachDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer)
|
||||
{
|
||||
|
|
|
@ -60,7 +60,7 @@ BOOLEAN DissectArcPath(CHAR *ArcPath, CHAR *BootPath, ULONG* BootDrive, ULONG* B
|
|||
if (p == NULL)
|
||||
return FALSE;
|
||||
p++;
|
||||
*BootPartition = 0xff;
|
||||
*BootPartition = 0;
|
||||
}
|
||||
else if (_strnicmp(p, "cdrom(", 6) == 0)
|
||||
{
|
||||
|
@ -69,7 +69,7 @@ BOOLEAN DissectArcPath(CHAR *ArcPath, CHAR *BootPath, ULONG* BootDrive, ULONG* B
|
|||
* multi(0)disk(0)cdrom(x)\path
|
||||
*/
|
||||
p = p + 6;
|
||||
*BootDrive = atoi(p);
|
||||
*BootDrive = atoi(p) + 0x80;
|
||||
p = strchr(p, ')');
|
||||
if (p == NULL)
|
||||
return FALSE;
|
||||
|
|
|
@ -718,12 +718,6 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (! MachDiskNormalizeSystemPath(SystemPath,
|
||||
sizeof(SystemPath)))
|
||||
{
|
||||
UiMessageBox("Invalid system path");
|
||||
return;
|
||||
}
|
||||
/* copy system path into kernel command line */
|
||||
strcpy(reactos_kernel_cmdline, SystemPath);
|
||||
}
|
||||
|
|
|
@ -58,7 +58,6 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x1
|
|||
BEGIN
|
||||
GROUPBOX "²íôîðìàö³ÿ ïðî âåðñ³þ",IDC_STATIC,6,3,210,73
|
||||
CONTROL "Ïîçíà÷èòè ÿê ðîáî÷ó ñòàíö³þ",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,88,10
|
||||
CONTROL "Ïîçíà÷èòè ÿê ðîáî÷ó ñòàíö³þ",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,88,10
|
||||
LTEXT "ReactOS áóäóºòüñÿ ÿê ñåðâåðíà ÎÑ. Îáðàòè ïðàïîðåöü, ùîá çì³íèòè ëèøå öåé äîäàòîê.",IDC_STATIC,15,15,183,41
|
||||
PUSHBUTTON "OK",IDOK,166,83,50,14
|
||||
END
|
||||
|
|
|
@ -1518,7 +1518,7 @@ LdrpGetOrLoadModule(PWCHAR SearchPath,
|
|||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ULONG ErrorResponse;
|
||||
ULONG_PTR ErrorParameter = (ULONG_PTR)&DllName;
|
||||
ULONG_PTR ErrorParameter = (ULONG_PTR)&AnsiDllName;
|
||||
|
||||
DPRINT1("failed to load %wZ\n", &DllName);
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
8 stub ADsBuildVarArrayInt
|
||||
9 stdcall ADsOpenObject(wstr wstr wstr long ptr ptr)
|
||||
12 stub ADsSetLastError
|
||||
13 stub ADsGetLastError
|
||||
13 stdcall ADsGetLastError(ptr ptr long ptr long)
|
||||
14 stub AllocADsMem
|
||||
15 stdcall FreeADsMem(ptr)
|
||||
16 stub ReallocADsMem
|
||||
|
|
|
@ -94,6 +94,15 @@ HRESULT WINAPI ADsOpenObject(LPCWSTR lpszPathName, LPCWSTR lpszUserName, LPCWSTR
|
|||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
/*****************************************************
|
||||
* ADsGetLastError [ACTIVEDS.13]
|
||||
*/
|
||||
HRESULT WINAPI ADsGetLastError(LPDWORD perror, LPWSTR errorbuf, DWORD errorbuflen, LPWSTR namebuf, DWORD namebuflen)
|
||||
{
|
||||
FIXME("(%p,%p,%d,%p,%d)!stub\n", perror, errorbuf, errorbuflen, namebuf, namebuflen);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
/*****************************************************
|
||||
* FreeADsMem [ACTIVEDS.15]
|
||||
*/
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
<file>actxprxy_ocmm.idl</file>
|
||||
<file>actxprxy_servprov.idl</file>
|
||||
<!-- file>actxprxy_shobjidl.idl</file -->
|
||||
<file>actxprxy_urlhist.idl
|
||||
</file>
|
||||
<file>actxprxy_urlhist.idl</file>
|
||||
</module>
|
||||
</group>
|
||||
|
|
|
@ -1,15 +1,14 @@
|
|||
/* $Id$
|
||||
*
|
||||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS system libraries
|
||||
* FILE: lib/advapi32/misc/hwprofiles.c
|
||||
* FILE: dll/win32/advapi32/misc/hwprofiles.c
|
||||
* PURPOSE: advapi32.dll Hardware Functions
|
||||
* PROGRAMMER: Steven Edwards
|
||||
* UPDATE HISTORY:
|
||||
* 20042502
|
||||
* Eric Kohl
|
||||
*/
|
||||
|
||||
#include <advapi32.h>
|
||||
#include <rpc.h>
|
||||
#include <wine/debug.h>
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(advapi);
|
||||
|
||||
|
@ -91,6 +90,7 @@ GetCurrentHwProfileW(LPHW_PROFILE_INFOW lpHwProfileInfo)
|
|||
HKEY hProfileKey;
|
||||
DWORD dwLength;
|
||||
DWORD dwConfigId;
|
||||
UUID uuid;
|
||||
|
||||
TRACE("GetCurrentHwProfileW() called\n");
|
||||
|
||||
|
@ -158,9 +158,17 @@ GetCurrentHwProfileW(LPHW_PROFILE_INFOW lpHwProfileInfo)
|
|||
(LPBYTE)&lpHwProfileInfo->szHwProfileGuid,
|
||||
&dwLength))
|
||||
{
|
||||
/* FIXME: Create a new GUID */
|
||||
wcscpy(lpHwProfileInfo->szHwProfileGuid,
|
||||
L"{00000000-0000-0000-0000-000000000000}");
|
||||
/* Create a new GUID */
|
||||
UuidCreate(&uuid);
|
||||
swprintf(
|
||||
lpHwProfileInfo->szHwProfileGuid,
|
||||
L"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
|
||||
uuid.Data1,
|
||||
uuid.Data2,
|
||||
uuid.Data3,
|
||||
uuid.Data4[0], uuid.Data4[1],
|
||||
uuid.Data4[2], uuid.Data4[3], uuid.Data4[4], uuid.Data4[5],
|
||||
uuid.Data4[6], uuid.Data4[7]);
|
||||
|
||||
dwLength = (wcslen(lpHwProfileInfo->szHwProfileGuid) + 1) * sizeof(WCHAR);
|
||||
RegSetValueExW(hProfileKey,
|
||||
|
|
|
@ -945,6 +945,8 @@ ReportEventA(IN HANDLE hEventLog,
|
|||
ANSI_STRING *Strings;
|
||||
ANSI_STRING ComputerName;
|
||||
WORD i;
|
||||
CHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1];
|
||||
DWORD dwSize;
|
||||
|
||||
TRACE("%p, %u, %u, %lu, %p, %u, %lu, %p, %p\n",
|
||||
hEventLog, wType, wCategory, dwEventID, lpUserSid,
|
||||
|
@ -962,8 +964,9 @@ ReportEventA(IN HANDLE hEventLog,
|
|||
for (i = 0; i < wNumStrings; i++)
|
||||
RtlInitAnsiString(&Strings[i], lpStrings[i]);
|
||||
|
||||
/*FIXME: ComputerName */
|
||||
RtlInitAnsiString(&ComputerName, "");
|
||||
dwSize = MAX_COMPUTERNAME_LENGTH + 1;
|
||||
GetComputerNameA(szComputerName, &dwSize);
|
||||
RtlInitAnsiString(&ComputerName, szComputerName);
|
||||
|
||||
RpcTryExcept
|
||||
{
|
||||
|
@ -1029,6 +1032,8 @@ ReportEventW(IN HANDLE hEventLog,
|
|||
UNICODE_STRING *Strings;
|
||||
UNICODE_STRING ComputerName;
|
||||
WORD i;
|
||||
WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1];
|
||||
DWORD dwSize;
|
||||
|
||||
TRACE("%p, %u, %u, %lu, %p, %u, %lu, %p, %p\n",
|
||||
hEventLog, wType, wCategory, dwEventID, lpUserSid,
|
||||
|
@ -1046,8 +1051,9 @@ ReportEventW(IN HANDLE hEventLog,
|
|||
for (i = 0; i < wNumStrings; i++)
|
||||
RtlInitUnicodeString(&Strings[i], lpStrings[i]);
|
||||
|
||||
/*FIXME: ComputerName */
|
||||
RtlInitUnicodeString(&ComputerName, L"");
|
||||
dwSize = MAX_COMPUTERNAME_LENGTH + 1;
|
||||
GetComputerNameW(szComputerName, &dwSize);
|
||||
RtlInitUnicodeString(&ComputerName, szComputerName);
|
||||
|
||||
RpcTryExcept
|
||||
{
|
||||
|
|
|
@ -950,7 +950,7 @@ HRESULT WINAPI AtlAxCreateControlEx(LPCOLESTR lpszName, HWND hWnd,
|
|||
TRACE("(%s %p %p %p %p %p %p)\n", debugstr_w(lpszName), hWnd, pStream,
|
||||
ppUnkContainer, ppUnkControl, iidSink, punkSink);
|
||||
|
||||
hRes = CLSIDFromString( (LPOLESTR) lpszName, &controlId );
|
||||
hRes = CLSIDFromString( lpszName, &controlId );
|
||||
if ( FAILED(hRes) )
|
||||
hRes = CLSIDFromProgID( lpszName, &controlId );
|
||||
if ( SUCCEEDED( hRes ) )
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Top level resource file for avifil32.dll
|
||||
*
|
||||
* Copyright 2002 Michael Günnewig
|
||||
* Copyright 2002 Michael Günnewig
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -18,10 +18,6 @@
|
|||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
#include "winuser.h"
|
||||
#include "winver.h"
|
||||
#include "avifile_private.h"
|
||||
|
||||
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||
|
|
|
@ -77,7 +77,7 @@ THOSE_ZIP_CONSTS;
|
|||
|
||||
struct fdi_file {
|
||||
struct fdi_file *next; /* next file in sequence */
|
||||
LPCSTR filename; /* output name of file */
|
||||
LPSTR filename; /* output name of file */
|
||||
int fh; /* open file handle or NULL */
|
||||
cab_ULONG length; /* uncompressed length of file */
|
||||
cab_ULONG offset; /* uncompressed offset in folder */
|
||||
|
@ -2301,7 +2301,7 @@ static void free_decompression_mem(HFDI hfdi,
|
|||
}
|
||||
while (CAB(firstfile)) {
|
||||
file = CAB(firstfile);
|
||||
if (file->filename) PFDI_FREE(hfdi, (void *)file->filename);
|
||||
if (file->filename) PFDI_FREE(hfdi, file->filename);
|
||||
CAB(firstfile) = CAB(firstfile)->next;
|
||||
PFDI_FREE(hfdi, file);
|
||||
}
|
||||
|
|
|
@ -176,7 +176,7 @@ static SIZE MemDialogSize = { 0, 0}; /* keep size of the (resizable) dialog */
|
|||
/* Internal functions used by the dialog */
|
||||
static LRESULT FILEDLG95_ResizeControls(HWND hwnd, WPARAM wParam, LPARAM lParam);
|
||||
static LRESULT FILEDLG95_FillControls(HWND hwnd, WPARAM wParam, LPARAM lParam);
|
||||
static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam);
|
||||
static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam);
|
||||
static LRESULT FILEDLG95_OnWMGetIShellBrowser(HWND hwnd);
|
||||
static BOOL FILEDLG95_OnOpen(HWND hwnd);
|
||||
static LRESULT FILEDLG95_InitControls(HWND hwnd);
|
||||
|
@ -240,7 +240,7 @@ static BOOL GetFileName95(FileOpenDlgInfos *fodInfos)
|
|||
{
|
||||
|
||||
LRESULT lRes;
|
||||
LPCVOID template;
|
||||
LPVOID template;
|
||||
HRSRC hRes;
|
||||
HANDLE hDlgTmpl = 0;
|
||||
HRESULT hr;
|
||||
|
@ -991,7 +991,7 @@ static LRESULT FILEDLG95_OnWMGetMMI( HWND hwnd, LPMINMAXINFO mmiptr)
|
|||
* vertically or horizontally to get out of the way. Only the "grip"
|
||||
* is moved in both directions to stay in the corner.
|
||||
*/
|
||||
static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||
static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam)
|
||||
{
|
||||
RECT rc, rcview;
|
||||
int chgx, chgy;
|
||||
|
@ -1223,11 +1223,11 @@ INT_PTR CALLBACK FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l
|
|||
return 0;
|
||||
}
|
||||
case WM_SIZE:
|
||||
return FILEDLG95_OnWMSize(hwnd, wParam, lParam);
|
||||
return FILEDLG95_OnWMSize(hwnd, wParam);
|
||||
case WM_GETMINMAXINFO:
|
||||
return FILEDLG95_OnWMGetMMI( hwnd, (LPMINMAXINFO)lParam);
|
||||
case WM_COMMAND:
|
||||
return FILEDLG95_OnWMCommand(hwnd, wParam, lParam);
|
||||
return FILEDLG95_OnWMCommand(hwnd, wParam);
|
||||
case WM_DRAWITEM:
|
||||
{
|
||||
switch(((LPDRAWITEMSTRUCT)lParam)->CtlID)
|
||||
|
@ -1733,7 +1733,7 @@ void FILEDLG95_Clean(HWND hwnd)
|
|||
*
|
||||
* WM_COMMAND message handler
|
||||
*/
|
||||
static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||
static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam)
|
||||
{
|
||||
WORD wNotifyCode = HIWORD(wParam); /* notification code */
|
||||
WORD wID = LOWORD(wParam); /* item, control, or accelerator identifier */
|
||||
|
@ -3799,7 +3799,7 @@ BOOL FD32_GetTemplate(PFD31_DATA lfs)
|
|||
/***********************************************************************
|
||||
* FD32_WMMeasureItem [internal]
|
||||
*/
|
||||
static LONG FD32_WMMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
||||
static LONG FD32_WMMeasureItem(LPARAM lParam)
|
||||
{
|
||||
LPMEASUREITEMSTRUCT lpmeasure;
|
||||
|
||||
|
@ -3832,7 +3832,7 @@ static INT_PTR CALLBACK FD32_FileOpenDlgProc(HWND hWnd, UINT wMsg,
|
|||
return FD31_WMInitDialog(hWnd, wParam, lParam);
|
||||
|
||||
case WM_MEASUREITEM:
|
||||
return FD32_WMMeasureItem(hWnd, wParam, lParam);
|
||||
return FD32_WMMeasureItem(lParam);
|
||||
|
||||
case WM_DRAWITEM:
|
||||
return FD31_WMDrawItem(hWnd, wParam, lParam, !lfs->open, (DRAWITEMSTRUCT *)lParam);
|
||||
|
|
|
@ -766,7 +766,7 @@ static LRESULT CFn_WMInitDialog(HWND hDlg, LPARAM lParam, LPCHOOSEFONTW lpcf)
|
|||
/***********************************************************************
|
||||
* CFn_WMMeasureItem [internal]
|
||||
*/
|
||||
static LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
||||
static LRESULT CFn_WMMeasureItem(HWND hDlg, LPARAM lParam)
|
||||
{
|
||||
HDC hdc;
|
||||
HFONT hfontprev;
|
||||
|
@ -794,7 +794,7 @@ static LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
|||
/***********************************************************************
|
||||
* CFn_WMDrawItem [internal]
|
||||
*/
|
||||
static LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
|
||||
static LRESULT CFn_WMDrawItem(LPARAM lParam)
|
||||
{
|
||||
HBRUSH hBrush;
|
||||
WCHAR buffer[40];
|
||||
|
@ -1190,9 +1190,9 @@ static INT_PTR CALLBACK FormatCharDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam,
|
|||
switch (uMsg)
|
||||
{
|
||||
case WM_MEASUREITEM:
|
||||
return CFn_WMMeasureItem(hDlg, wParam, lParam);
|
||||
return CFn_WMMeasureItem(hDlg,lParam);
|
||||
case WM_DRAWITEM:
|
||||
return CFn_WMDrawItem(hDlg, wParam, lParam);
|
||||
return CFn_WMDrawItem(lParam);
|
||||
case WM_COMMAND:
|
||||
return CFn_WMCommand(hDlg, wParam, lParam, lpcfw);
|
||||
case WM_DESTROY:
|
||||
|
@ -1239,9 +1239,9 @@ static INT_PTR CALLBACK FormatCharDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam,
|
|||
switch (uMsg)
|
||||
{
|
||||
case WM_MEASUREITEM:
|
||||
return CFn_WMMeasureItem(hDlg, wParam, lParam);
|
||||
return CFn_WMMeasureItem(hDlg, lParam);
|
||||
case WM_DRAWITEM:
|
||||
return CFn_WMDrawItem(hDlg, wParam, lParam);
|
||||
return CFn_WMDrawItem(lParam);
|
||||
case WM_COMMAND:
|
||||
return CFn_WMCommand(hDlg, wParam, lParam, lpcf);
|
||||
case WM_DESTROY:
|
||||
|
|
|
@ -1504,7 +1504,7 @@ static LRESULT PRINTDLG_WMInitDialogW(HWND hDlg,
|
|||
* PRINTDLG_WMCommand [internal]
|
||||
*/
|
||||
static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam,
|
||||
LPARAM lParam, PRINT_PTRA* PrintStructures)
|
||||
PRINT_PTRA* PrintStructures)
|
||||
{
|
||||
LPPRINTDLGA lppd = PrintStructures->lpPrintDlg;
|
||||
UINT PrinterComboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4;
|
||||
|
@ -1658,7 +1658,7 @@ static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam,
|
|||
}
|
||||
|
||||
static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam,
|
||||
LPARAM lParam, PRINT_PTRW* PrintStructures)
|
||||
PRINT_PTRW* PrintStructures)
|
||||
{
|
||||
LPPRINTDLGW lppd = PrintStructures->lpPrintDlg;
|
||||
UINT PrinterComboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4;
|
||||
|
@ -1846,7 +1846,7 @@ static INT_PTR CALLBACK PrintDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam,
|
|||
|
||||
switch (uMsg) {
|
||||
case WM_COMMAND:
|
||||
return PRINTDLG_WMCommandA(hDlg, wParam, lParam, PrintStructures);
|
||||
return PRINTDLG_WMCommandA(hDlg, wParam, PrintStructures);
|
||||
|
||||
case WM_DESTROY:
|
||||
DestroyIcon(PrintStructures->hCollateIcon);
|
||||
|
@ -1892,7 +1892,7 @@ static INT_PTR CALLBACK PrintDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam,
|
|||
|
||||
switch (uMsg) {
|
||||
case WM_COMMAND:
|
||||
return PRINTDLG_WMCommandW(hDlg, wParam, lParam, PrintStructures);
|
||||
return PRINTDLG_WMCommandW(hDlg, wParam, PrintStructures);
|
||||
|
||||
case WM_DESTROY:
|
||||
DestroyIcon(PrintStructures->hCollateIcon);
|
||||
|
|
|
@ -523,9 +523,11 @@ static BOOL CRYPT_AsnDecodeSequence(struct AsnDecodeSequenceItem items[],
|
|||
|
||||
for (i = 0; i < cItem; i++)
|
||||
{
|
||||
bytesNeeded += items[i].size;
|
||||
if (items[i].size > items[i].minSize)
|
||||
bytesNeeded += items[i].size - items[i].minSize;
|
||||
structSize = max( structSize, items[i].offset + items[i].minSize );
|
||||
}
|
||||
bytesNeeded += structSize;
|
||||
if (pcbDecoded)
|
||||
*pcbDecoded = 1 + lenBytes + cbDecoded;
|
||||
if (!pvStructInfo)
|
||||
|
|
|
@ -292,4 +292,91 @@ int FASTCALL DocumentEventEx(PVOID,HANDLE,HDC,int,ULONG,PVOID,ULONG,PVOID);
|
|||
BOOL FASTCALL EndPagePrinterEx(PVOID,HANDLE);
|
||||
BOOL FASTCALL LoadTheSpoolerDrv(VOID);
|
||||
|
||||
|
||||
FORCEINLINE
|
||||
PVOID
|
||||
GdiAllocBatchCommand(
|
||||
HDC hdc,
|
||||
USHORT Cmd)
|
||||
{
|
||||
PTEB pTeb;
|
||||
ULONG ulSize;
|
||||
PGDIBATCHHDR pHdr;
|
||||
|
||||
/* Get a pointer to the TEB */
|
||||
pTeb = NtCurrentTeb();
|
||||
|
||||
/* Check if we have a valid environment */
|
||||
if (!pTeb || !pTeb->Win32ThreadInfo) return NULL;
|
||||
|
||||
/* Do we use a DC? */
|
||||
if (hdc)
|
||||
{
|
||||
/* If the batch DC is NULL, we set this one as the new one */
|
||||
if (!pTeb->GdiTebBatch.HDC) pTeb->GdiTebBatch.HDC = hdc;
|
||||
|
||||
/* If not, check if the batch DC equal to our DC */
|
||||
else if (pTeb->GdiTebBatch.HDC != hdc) return NULL;
|
||||
}
|
||||
|
||||
/* Get the size of the entry */
|
||||
switch(Cmd)
|
||||
{
|
||||
case GdiBCPatBlt:
|
||||
ulSize = 0;
|
||||
break;
|
||||
case GdiBCPolyPatBlt:
|
||||
ulSize = 0;
|
||||
break;
|
||||
case GdiBCTextOut:
|
||||
ulSize = 0;
|
||||
break;
|
||||
case GdiBCExtTextOut:
|
||||
ulSize = 0;
|
||||
break;
|
||||
case GdiBCSetBrushOrg:
|
||||
ulSize = 0;
|
||||
break;
|
||||
case GdiBCExtSelClipRgn:
|
||||
ulSize = 0;
|
||||
break;
|
||||
case GdiBCSelObj:
|
||||
ulSize = sizeof(GDIBSOBJECT);
|
||||
break;
|
||||
case GdiBCDelRgn:
|
||||
ulSize = sizeof(GDIBSOBJECT);
|
||||
break;
|
||||
case GdiBCDelObj:
|
||||
ulSize = sizeof(GDIBSOBJECT);
|
||||
break;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Unsupported operation */
|
||||
if (ulSize == 0) return NULL;
|
||||
|
||||
/* Check if the buffer is full */
|
||||
if ((pTeb->GdiBatchCount >= GDI_BatchLimit) ||
|
||||
((pTeb->GdiTebBatch.Offset + ulSize) > GDIBATCHBUFSIZE))
|
||||
{
|
||||
/* Call win32k, the kernel will call NtGdiFlushUserBatch to flush
|
||||
the current batch */
|
||||
NtGdiFlush();
|
||||
}
|
||||
|
||||
/* Get the head of the entry */
|
||||
pHdr = (PVOID)((PUCHAR)pTeb->GdiTebBatch.Buffer + pTeb->GdiTebBatch.Offset);
|
||||
|
||||
/* Update Offset and batch count */
|
||||
pTeb->GdiTebBatch.Offset += ulSize;
|
||||
pTeb->GdiBatchCount++;
|
||||
|
||||
/* Fill in the core fields */
|
||||
pHdr->Cmd = Cmd;
|
||||
pHdr->Size = ulSize;
|
||||
|
||||
return pHdr;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -1540,7 +1540,6 @@ SelectObject(HDC hDC,
|
|||
PDC_ATTR pDc_Attr;
|
||||
HGDIOBJ hOldObj = NULL;
|
||||
UINT uType;
|
||||
PTEB pTeb;
|
||||
|
||||
if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
|
||||
{
|
||||
|
@ -1582,27 +1581,23 @@ SelectObject(HDC hDC,
|
|||
case GDI_OBJECT_TYPE_FONT:
|
||||
hOldObj = pDc_Attr->hlfntNew;
|
||||
if (hOldObj == hGdiObj) return hOldObj;
|
||||
|
||||
pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS;
|
||||
pDc_Attr->ulDirty_ |= DIRTY_CHARSET;
|
||||
pDc_Attr->hlfntNew = hGdiObj;
|
||||
pTeb = NtCurrentTeb();
|
||||
if (((pTeb->GdiTebBatch.HDC == 0) ||
|
||||
(pTeb->GdiTebBatch.HDC == hDC)) &&
|
||||
((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE) &&
|
||||
(!(pDc_Attr->ulDirty_ & DC_DIBSECTION)))
|
||||
{
|
||||
PGDIBSOBJECT pgO = (PGDIBSOBJECT)(&pTeb->GdiTebBatch.Buffer[0] +
|
||||
pTeb->GdiTebBatch.Offset);
|
||||
pgO->gbHdr.Cmd = GdiBCSelObj;
|
||||
pgO->gbHdr.Size = sizeof(GDIBSOBJECT);
|
||||
pgO->hgdiobj = hGdiObj;
|
||||
|
||||
pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT);
|
||||
pTeb->GdiTebBatch.HDC = hDC;
|
||||
pTeb->GdiBatchCount++;
|
||||
if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
|
||||
return hOldObj;
|
||||
if (!(pDc_Attr->ulDirty_ & DC_DIBSECTION))
|
||||
{
|
||||
PGDIBSOBJECT pgO;
|
||||
|
||||
pgO = GdiAllocBatchCommand(hDC, GdiBCSelObj);
|
||||
if (pgO)
|
||||
{
|
||||
pgO->hgdiobj = hGdiObj;
|
||||
return hOldObj;
|
||||
}
|
||||
}
|
||||
|
||||
// default for select object font
|
||||
return NtGdiSelectFont(hDC, hGdiObj);
|
||||
|
||||
|
|
|
@ -109,23 +109,14 @@ DeleteRegion( HRGN hRgn )
|
|||
if ((GdiGetHandleUserData((HGDIOBJ) hRgn, GDI_OBJECT_TYPE_REGION, (PVOID) &Rgn_Attr)) &&
|
||||
( Rgn_Attr != NULL ))
|
||||
{
|
||||
PTEB pTeb = NtCurrentTeb();
|
||||
if (pTeb->Win32ThreadInfo != NULL)
|
||||
{
|
||||
if ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE)
|
||||
{
|
||||
PGDIBSOBJECT pgO = (PGDIBSOBJECT)(&pTeb->GdiTebBatch.Buffer[0] +
|
||||
pTeb->GdiTebBatch.Offset);
|
||||
pgO->gbHdr.Cmd = GdiBCDelRgn;
|
||||
pgO->gbHdr.Size = sizeof(GDIBSOBJECT);
|
||||
pgO->hgdiobj = (HGDIOBJ)hRgn;
|
||||
|
||||
pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT);
|
||||
pTeb->GdiBatchCount++;
|
||||
if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
PGDIBSOBJECT pgO;
|
||||
|
||||
pgO = GdiAllocBatchCommand(NULL, GdiBCDelRgn);
|
||||
if (pgO)
|
||||
{
|
||||
pgO->hgdiobj = (HGDIOBJ)hRgn;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return NtGdiDeleteObjectApp((HGDIOBJ) hRgn);
|
||||
}
|
||||
|
|
|
@ -1194,6 +1194,16 @@ GpStatus WINGDIPAPI GdipGetPathGradientSurroundColorsWithCount(GpPathGradient
|
|||
return NotImplemented;
|
||||
}
|
||||
|
||||
GpStatus WINGDIPAPI GdipGetPathGradientSurroundColorCount(GpPathGradient *brush, INT *count)
|
||||
{
|
||||
TRACE("(%p, %p)\n", brush, count);
|
||||
|
||||
if (!brush || !count)
|
||||
return InvalidParameter;
|
||||
|
||||
return NotImplemented;
|
||||
}
|
||||
|
||||
GpStatus WINGDIPAPI GdipGetPathGradientWrapMode(GpPathGradient *brush,
|
||||
GpWrapMode *wrapmode)
|
||||
{
|
||||
|
@ -1559,7 +1569,7 @@ GpStatus WINGDIPAPI GdipSetPathGradientSigmaBlend(GpPathGradient *grad,
|
|||
}
|
||||
|
||||
GpStatus WINGDIPAPI GdipSetPathGradientSurroundColorsWithCount(GpPathGradient
|
||||
*grad, ARGB *argb, INT *count)
|
||||
*grad, GDIPCONST ARGB *argb, INT *count)
|
||||
{
|
||||
static int calls;
|
||||
|
||||
|
|
|
@ -489,6 +489,7 @@ GpStatus WINGDIPAPI GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi,
|
|||
switch (font->unit)
|
||||
{
|
||||
case UnitPixel:
|
||||
case UnitWorld:
|
||||
*height = font_height;
|
||||
break;
|
||||
case UnitPoint:
|
||||
|
@ -520,7 +521,7 @@ GpStatus WINGDIPAPI GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi,
|
|||
static INT CALLBACK is_font_installed_proc(const LOGFONTW *elf,
|
||||
const TEXTMETRICW *ntm, DWORD type, LPARAM lParam)
|
||||
{
|
||||
if (!ntm)
|
||||
if (!ntm || type == RASTER_FONTTYPE)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
@ -642,12 +643,14 @@ GpStatus WINGDIPAPI GdipCloneFontFamily(GpFontFamily* FontFamily, GpFontFamily**
|
|||
GpStatus WINGDIPAPI GdipGetFamilyName (GDIPCONST GpFontFamily *family,
|
||||
WCHAR *name, LANGID language)
|
||||
{
|
||||
static int lang_fixme;
|
||||
|
||||
if (family == NULL)
|
||||
return InvalidParameter;
|
||||
|
||||
TRACE("%p, %p, %d\n", family, name, language);
|
||||
|
||||
if (language != LANG_NEUTRAL)
|
||||
if (language != LANG_NEUTRAL && !lang_fixme++)
|
||||
FIXME("No support for handling of multiple languages!\n");
|
||||
|
||||
lstrcpynW (name, family->FamilyName, LF_FACESIZE);
|
||||
|
@ -826,15 +829,21 @@ GpStatus WINGDIPAPI GdipGetGenericFontFamilySerif(GpFontFamily **nativeFamily)
|
|||
*/
|
||||
GpStatus WINGDIPAPI GdipGetGenericFontFamilySansSerif(GpFontFamily **nativeFamily)
|
||||
{
|
||||
/* FIXME: On Windows this is called Microsoft Sans Serif, this shouldn't
|
||||
* affect anything */
|
||||
static const WCHAR MSSansSerif[] = {'M','S',' ','S','a','n','s',' ','S','e','r','i','f','\0'};
|
||||
GpStatus stat;
|
||||
static const WCHAR MicrosoftSansSerif[] = {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f','\0'};
|
||||
static const WCHAR Tahoma[] = {'T','a','h','o','m','a','\0'};
|
||||
|
||||
TRACE("(%p)\n", nativeFamily);
|
||||
|
||||
if (nativeFamily == NULL) return InvalidParameter;
|
||||
|
||||
return GdipCreateFontFamilyFromName(MSSansSerif, NULL, nativeFamily);
|
||||
stat = GdipCreateFontFamilyFromName(MicrosoftSansSerif, NULL, nativeFamily);
|
||||
|
||||
if (stat == FontFamilyNotFound)
|
||||
/* FIXME: Microsoft Sans Serif is not installed on Wine. */
|
||||
stat = GdipCreateFontFamilyFromName(Tahoma, NULL, nativeFamily);
|
||||
|
||||
return stat;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -957,6 +966,9 @@ static INT CALLBACK add_font_proc(const LOGFONTW *lfw, const TEXTMETRICW *ntm,
|
|||
GpFontCollection* fonts = (GpFontCollection*)lParam;
|
||||
int i;
|
||||
|
||||
if (type == RASTER_FONTTYPE)
|
||||
return 1;
|
||||
|
||||
/* skip duplicates */
|
||||
for (i=0; i<fonts->count; i++)
|
||||
if (strcmpiW(lfw->lfFaceName, fonts->FontFamilies[i]->FamilyName) == 0)
|
||||
|
|
|
@ -338,7 +338,7 @@
|
|||
@ stub GdipGetPathGradientPresetBlendCount
|
||||
@ stdcall GdipGetPathGradientRect(ptr ptr)
|
||||
@ stdcall GdipGetPathGradientRectI(ptr ptr)
|
||||
@ stub GdipGetPathGradientSurroundColorCount
|
||||
@ stdcall GdipGetPathGradientSurroundColorCount(ptr ptr)
|
||||
@ stdcall GdipGetPathGradientSurroundColorsWithCount(ptr ptr ptr)
|
||||
@ stub GdipGetPathGradientTransform
|
||||
@ stdcall GdipGetPathGradientWrapMode(ptr ptr)
|
||||
|
|
|
@ -78,6 +78,29 @@ static inline REAL deg2rad(REAL degrees)
|
|||
return M_PI * degrees / 180.0;
|
||||
}
|
||||
|
||||
static inline ARGB color_over(ARGB bg, ARGB fg)
|
||||
{
|
||||
BYTE b, g, r, a;
|
||||
BYTE bg_alpha, fg_alpha;
|
||||
|
||||
fg_alpha = (fg>>24)&0xff;
|
||||
|
||||
if (fg_alpha == 0xff) return fg;
|
||||
|
||||
if (fg_alpha == 0) return bg;
|
||||
|
||||
bg_alpha = (((bg>>24)&0xff) * (0xff-fg_alpha)) / 0xff;
|
||||
|
||||
if (bg_alpha == 0) return fg;
|
||||
|
||||
a = bg_alpha + fg_alpha;
|
||||
b = ((bg&0xff)*bg_alpha + (fg&0xff)*fg_alpha)*0xff/a;
|
||||
g = (((bg>>8)&0xff)*bg_alpha + ((fg>>8)&0xff)*fg_alpha)*0xff/a;
|
||||
r = (((bg>>16)&0xff)*bg_alpha + ((fg>>16)&0xff)*fg_alpha)*0xff/a;
|
||||
|
||||
return (a<<24)|(r<<16)|(g<<8)|b;
|
||||
}
|
||||
|
||||
extern const char *debugstr_rectf(CONST RectF* rc);
|
||||
|
||||
extern const char *debugstr_pointf(CONST PointF* pt);
|
||||
|
@ -112,6 +135,7 @@ struct GpGraphics{
|
|||
HDC hdc;
|
||||
HWND hwnd;
|
||||
BOOL owndc;
|
||||
GpImage *image;
|
||||
SmoothingMode smoothing;
|
||||
CompositingQuality compqual;
|
||||
InterpolationMode interpolation;
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -122,7 +122,7 @@ static inline void getpixel_16bppGrayScale(BYTE *r, BYTE *g, BYTE *b, BYTE *a,
|
|||
static inline void getpixel_16bppRGB555(BYTE *r, BYTE *g, BYTE *b, BYTE *a,
|
||||
const BYTE *row, UINT x)
|
||||
{
|
||||
WORD pixel = *((WORD*)(row)+x);
|
||||
WORD pixel = *((const WORD*)(row)+x);
|
||||
*r = (pixel>>7&0xf8)|(pixel>>12&0x7);
|
||||
*g = (pixel>>2&0xf8)|(pixel>>6&0x7);
|
||||
*b = (pixel<<3&0xf8)|(pixel>>2&0x7);
|
||||
|
@ -132,7 +132,7 @@ static inline void getpixel_16bppRGB555(BYTE *r, BYTE *g, BYTE *b, BYTE *a,
|
|||
static inline void getpixel_16bppRGB565(BYTE *r, BYTE *g, BYTE *b, BYTE *a,
|
||||
const BYTE *row, UINT x)
|
||||
{
|
||||
WORD pixel = *((WORD*)(row)+x);
|
||||
WORD pixel = *((const WORD*)(row)+x);
|
||||
*r = (pixel>>8&0xf8)|(pixel>>13&0x7);
|
||||
*g = (pixel>>3&0xfc)|(pixel>>9&0x3);
|
||||
*b = (pixel<<3&0xf8)|(pixel>>2&0x7);
|
||||
|
@ -142,7 +142,7 @@ static inline void getpixel_16bppRGB565(BYTE *r, BYTE *g, BYTE *b, BYTE *a,
|
|||
static inline void getpixel_16bppARGB1555(BYTE *r, BYTE *g, BYTE *b, BYTE *a,
|
||||
const BYTE *row, UINT x)
|
||||
{
|
||||
WORD pixel = *((WORD*)(row)+x);
|
||||
WORD pixel = *((const WORD*)(row)+x);
|
||||
*r = (pixel>>7&0xf8)|(pixel>>12&0x7);
|
||||
*g = (pixel>>2&0xf8)|(pixel>>6&0x7);
|
||||
*b = (pixel<<3&0xf8)|(pixel>>2&0x7);
|
||||
|
@ -1831,6 +1831,37 @@ GpStatus WINGDIPAPI GdipEmfToWmfBits(HENHMETAFILE hemf, UINT cbData16,
|
|||
return NotImplemented;
|
||||
}
|
||||
|
||||
/* Internal utility function: Replace the image data of dst with that of src,
|
||||
* and free src. */
|
||||
static void move_bitmap(GpBitmap *dst, GpBitmap *src, BOOL clobber_palette)
|
||||
{
|
||||
GdipFree(dst->bitmapbits);
|
||||
DeleteDC(dst->hdc);
|
||||
DeleteObject(dst->hbitmap);
|
||||
|
||||
if (clobber_palette)
|
||||
{
|
||||
GdipFree(dst->image.palette_entries);
|
||||
dst->image.palette_flags = src->image.palette_flags;
|
||||
dst->image.palette_count = src->image.palette_count;
|
||||
dst->image.palette_entries = src->image.palette_entries;
|
||||
}
|
||||
else
|
||||
GdipFree(src->image.palette_entries);
|
||||
|
||||
dst->image.xres = src->image.xres;
|
||||
dst->image.yres = src->image.yres;
|
||||
dst->width = src->width;
|
||||
dst->height = src->height;
|
||||
dst->format = src->format;
|
||||
dst->hbitmap = src->hbitmap;
|
||||
dst->hdc = src->hdc;
|
||||
dst->bits = src->bits;
|
||||
dst->stride = src->stride;
|
||||
|
||||
GdipFree(src);
|
||||
}
|
||||
|
||||
GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image)
|
||||
{
|
||||
TRACE("%p\n", image);
|
||||
|
@ -1946,6 +1977,7 @@ GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage *image,
|
|||
GpGraphics **graphics)
|
||||
{
|
||||
HDC hdc;
|
||||
GpStatus stat;
|
||||
|
||||
TRACE("%p %p\n", image, graphics);
|
||||
|
||||
|
@ -1965,7 +1997,12 @@ GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage *image,
|
|||
((GpBitmap*)image)->hdc = hdc;
|
||||
}
|
||||
|
||||
return GdipCreateFromHDC(hdc, graphics);
|
||||
stat = GdipCreateFromHDC(hdc, graphics);
|
||||
|
||||
if (stat == Ok)
|
||||
(*graphics)->image = image;
|
||||
|
||||
return stat;
|
||||
}
|
||||
|
||||
GpStatus WINGDIPAPI GdipGetImageHeight(GpImage *image, UINT *height)
|
||||
|
@ -2459,6 +2496,11 @@ static GpStatus decode_image_gif(IStream* stream, REFCLSID clsid, GpImage **imag
|
|||
return decode_image_wic(stream, &CLSID_WICGifDecoder, image);
|
||||
}
|
||||
|
||||
static GpStatus decode_image_tiff(IStream* stream, REFCLSID clsid, GpImage **image)
|
||||
{
|
||||
return decode_image_wic(stream, &CLSID_WICTiffDecoder, image);
|
||||
}
|
||||
|
||||
static GpStatus decode_image_olepicture_metafile(IStream* stream, REFCLSID clsid, GpImage **image)
|
||||
{
|
||||
IPicture *pic;
|
||||
|
@ -2505,6 +2547,7 @@ typedef enum {
|
|||
BMP,
|
||||
JPEG,
|
||||
GIF,
|
||||
TIFF,
|
||||
EMF,
|
||||
WMF,
|
||||
PNG,
|
||||
|
@ -2517,10 +2560,11 @@ static const struct image_codec codecs[NUM_CODECS];
|
|||
static GpStatus get_decoder_info(IStream* stream, const struct image_codec **result)
|
||||
{
|
||||
BYTE signature[8];
|
||||
const BYTE *pattern, *mask;
|
||||
LARGE_INTEGER seek;
|
||||
HRESULT hr;
|
||||
UINT bytesread;
|
||||
int i, j;
|
||||
int i, j, sig;
|
||||
|
||||
/* seek to the start of the stream */
|
||||
seek.QuadPart = 0;
|
||||
|
@ -2528,7 +2572,7 @@ static GpStatus get_decoder_info(IStream* stream, const struct image_codec **res
|
|||
if (FAILED(hr)) return hresult_to_status(hr);
|
||||
|
||||
/* read the first 8 bytes */
|
||||
/* FIXME: This assumes all codecs have one signature <= 8 bytes in length */
|
||||
/* FIXME: This assumes all codecs have signatures <= 8 bytes in length */
|
||||
hr = IStream_Read(stream, signature, 8, &bytesread);
|
||||
if (FAILED(hr)) return hresult_to_status(hr);
|
||||
if (hr == S_FALSE || bytesread == 0) return GenericError;
|
||||
|
@ -2537,13 +2581,18 @@ static GpStatus get_decoder_info(IStream* stream, const struct image_codec **res
|
|||
if ((codecs[i].info.Flags & ImageCodecFlagsDecoder) &&
|
||||
bytesread >= codecs[i].info.SigSize)
|
||||
{
|
||||
for (j=0; j<codecs[i].info.SigSize; j++)
|
||||
if ((signature[j] & codecs[i].info.SigMask[j]) != codecs[i].info.SigPattern[j])
|
||||
break;
|
||||
if (j == codecs[i].info.SigSize)
|
||||
for (sig=0; sig<codecs[i].info.SigCount; sig++)
|
||||
{
|
||||
*result = &codecs[i];
|
||||
return Ok;
|
||||
pattern = &codecs[i].info.SigPattern[codecs[i].info.SigSize*sig];
|
||||
mask = &codecs[i].info.SigMask[codecs[i].info.SigSize*sig];
|
||||
for (j=0; j<codecs[i].info.SigSize; j++)
|
||||
if ((signature[j] & mask[j]) != pattern[j])
|
||||
break;
|
||||
if (j == codecs[i].info.SigSize)
|
||||
{
|
||||
*result = &codecs[i];
|
||||
return Ok;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2900,6 +2949,13 @@ static const WCHAR gif_format[] = {'G','I','F',0};
|
|||
static const BYTE gif_sig_pattern[4] = "GIF8";
|
||||
static const BYTE gif_sig_mask[] = { 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
|
||||
static const WCHAR tiff_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'T','I','F','F', 0};
|
||||
static const WCHAR tiff_extension[] = {'*','.','T','I','F','F',';','*','.','T','I','F',0};
|
||||
static const WCHAR tiff_mimetype[] = {'i','m','a','g','e','/','t','i','f','f', 0};
|
||||
static const WCHAR tiff_format[] = {'T','I','F','F',0};
|
||||
static const BYTE tiff_sig_pattern[] = {0x49,0x49,42,0,0x4d,0x4d,0,42};
|
||||
static const BYTE tiff_sig_mask[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
|
||||
static const WCHAR emf_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'E','M','F', 0};
|
||||
static const WCHAR emf_extension[] = {'*','.','E','M','F',0};
|
||||
static const WCHAR emf_mimetype[] = {'i','m','a','g','e','/','x','-','e','m','f', 0};
|
||||
|
@ -2986,6 +3042,25 @@ static const struct image_codec codecs[NUM_CODECS] = {
|
|||
NULL,
|
||||
decode_image_gif
|
||||
},
|
||||
{
|
||||
{ /* TIFF */
|
||||
/* Clsid */ { 0x557cf405, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } },
|
||||
/* FormatID */ { 0xb96b3cb1U, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e} },
|
||||
/* CodecName */ tiff_codecname,
|
||||
/* DllName */ NULL,
|
||||
/* FormatDescription */ tiff_format,
|
||||
/* FilenameExtension */ tiff_extension,
|
||||
/* MimeType */ tiff_mimetype,
|
||||
/* Flags */ ImageCodecFlagsDecoder | ImageCodecFlagsSupportBitmap | ImageCodecFlagsBuiltin,
|
||||
/* Version */ 1,
|
||||
/* SigCount */ 2,
|
||||
/* SigSize */ 4,
|
||||
/* SigPattern */ tiff_sig_pattern,
|
||||
/* SigMask */ tiff_sig_mask,
|
||||
},
|
||||
NULL,
|
||||
decode_image_tiff
|
||||
},
|
||||
{
|
||||
{ /* EMF */
|
||||
/* Clsid */ { 0x557cf403, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } },
|
||||
|
@ -3394,6 +3469,112 @@ GpStatus WINGDIPAPI GdipGetImageThumbnail(GpImage *image, UINT width, UINT heigh
|
|||
*/
|
||||
GpStatus WINGDIPAPI GdipImageRotateFlip(GpImage *image, RotateFlipType type)
|
||||
{
|
||||
FIXME("(%p %u) stub\n", image, type);
|
||||
return NotImplemented;
|
||||
GpBitmap *new_bitmap;
|
||||
GpBitmap *bitmap;
|
||||
int bpp, bytesperpixel;
|
||||
int rotate_90, flip_x, flip_y;
|
||||
int src_x_offset, src_y_offset;
|
||||
LPBYTE src_origin;
|
||||
UINT x, y, width, height;
|
||||
BitmapData src_lock, dst_lock;
|
||||
GpStatus stat;
|
||||
|
||||
TRACE("(%p, %u)\n", image, type);
|
||||
|
||||
rotate_90 = type&1;
|
||||
flip_x = (type&6) == 2 || (type&6) == 4;
|
||||
flip_y = (type&3) == 1 || (type&3) == 2;
|
||||
|
||||
if (image->type != ImageTypeBitmap)
|
||||
{
|
||||
FIXME("Not implemented for type %i\n", image->type);
|
||||
return NotImplemented;
|
||||
}
|
||||
|
||||
bitmap = (GpBitmap*)image;
|
||||
bpp = PIXELFORMATBPP(bitmap->format);
|
||||
|
||||
if (bpp < 8)
|
||||
{
|
||||
FIXME("Not implemented for %i bit images\n", bpp);
|
||||
return NotImplemented;
|
||||
}
|
||||
|
||||
if (rotate_90)
|
||||
{
|
||||
width = bitmap->height;
|
||||
height = bitmap->width;
|
||||
}
|
||||
else
|
||||
{
|
||||
width = bitmap->width;
|
||||
height = bitmap->height;
|
||||
}
|
||||
|
||||
bytesperpixel = bpp/8;
|
||||
|
||||
stat = GdipCreateBitmapFromScan0(width, height, 0, bitmap->format, NULL, &new_bitmap);
|
||||
|
||||
if (stat != Ok)
|
||||
return stat;
|
||||
|
||||
stat = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, bitmap->format, &src_lock);
|
||||
|
||||
if (stat == Ok)
|
||||
{
|
||||
stat = GdipBitmapLockBits(new_bitmap, NULL, ImageLockModeWrite, bitmap->format, &dst_lock);
|
||||
|
||||
if (stat == Ok)
|
||||
{
|
||||
LPBYTE src_row, src_pixel;
|
||||
LPBYTE dst_row, dst_pixel;
|
||||
|
||||
src_origin = src_lock.Scan0;
|
||||
if (flip_x) src_origin += bytesperpixel * (bitmap->width - 1);
|
||||
if (flip_y) src_origin += src_lock.Stride * (bitmap->height - 1);
|
||||
|
||||
if (rotate_90)
|
||||
{
|
||||
if (flip_y) src_x_offset = -src_lock.Stride;
|
||||
else src_x_offset = src_lock.Stride;
|
||||
if (flip_x) src_y_offset = -bytesperpixel;
|
||||
else src_y_offset = bytesperpixel;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (flip_x) src_x_offset = -bytesperpixel;
|
||||
else src_x_offset = bytesperpixel;
|
||||
if (flip_y) src_y_offset = -src_lock.Stride;
|
||||
else src_y_offset = src_lock.Stride;
|
||||
}
|
||||
|
||||
src_row = src_origin;
|
||||
dst_row = dst_lock.Scan0;
|
||||
for (y=0; y<height; y++)
|
||||
{
|
||||
src_pixel = src_row;
|
||||
dst_pixel = dst_row;
|
||||
for (x=0; x<width; x++)
|
||||
{
|
||||
/* FIXME: This could probably be faster without memcpy. */
|
||||
memcpy(dst_pixel, src_pixel, bytesperpixel);
|
||||
dst_pixel += bytesperpixel;
|
||||
src_pixel += src_x_offset;
|
||||
}
|
||||
src_row += src_y_offset;
|
||||
dst_row += dst_lock.Stride;
|
||||
}
|
||||
|
||||
GdipBitmapUnlockBits(new_bitmap, &dst_lock);
|
||||
}
|
||||
|
||||
GdipBitmapUnlockBits(bitmap, &src_lock);
|
||||
}
|
||||
|
||||
if (stat == Ok)
|
||||
move_bitmap(bitmap, new_bitmap, FALSE);
|
||||
else
|
||||
GdipDisposeImage((GpImage*)new_bitmap);
|
||||
|
||||
return stat;
|
||||
}
|
||||
|
|
|
@ -302,7 +302,7 @@ int WINAPI doWinMain(HINSTANCE hInstance, LPSTR szCmdLine)
|
|||
}
|
||||
else
|
||||
{
|
||||
FIXME("Unhandled HTML Help command line parameter! (%.*s)\n", space-szCmdLine, szCmdLine);
|
||||
FIXME("Unhandled HTML Help command line parameter! (%.*s)\n", (int)(space-szCmdLine), szCmdLine);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -268,7 +268,7 @@ static HRESULT WINAPI MimeInternat_FindCharset(IMimeInternational *iface, LPCSTR
|
|||
|
||||
if(SUCCEEDED(hr))
|
||||
*phCharset = add_charset(&This->charsets, &mlang_info,
|
||||
(HCHARSET)InterlockedIncrement(&This->next_charset_handle));
|
||||
UlongToHandle(InterlockedIncrement(&This->next_charset_handle)));
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&This->cs);
|
||||
|
|
|
@ -1419,7 +1419,7 @@ static HRESULT create_sub_stream(IStream *stream, ULARGE_INTEGER start, ULARGE_I
|
|||
typedef struct body_t
|
||||
{
|
||||
struct list entry;
|
||||
HBODY hbody;
|
||||
DWORD index;
|
||||
IMimeBody *mime_body;
|
||||
|
||||
struct body_t *parent;
|
||||
|
@ -1434,7 +1434,7 @@ typedef struct MimeMessage
|
|||
IStream *stream;
|
||||
|
||||
struct list body_tree;
|
||||
HBODY next_hbody;
|
||||
DWORD next_index;
|
||||
} MimeMessage;
|
||||
|
||||
static HRESULT WINAPI MimeMessage_QueryInterface(IMimeMessage *iface, REFIID riid, void **ppv)
|
||||
|
@ -1512,13 +1512,13 @@ static HRESULT WINAPI MimeMessage_IsDirty(
|
|||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static body_t *new_body_entry(IMimeBody *mime_body, HBODY hbody, body_t *parent)
|
||||
static body_t *new_body_entry(IMimeBody *mime_body, DWORD index, body_t *parent)
|
||||
{
|
||||
body_t *body = HeapAlloc(GetProcessHeap(), 0, sizeof(*body));
|
||||
if(body)
|
||||
{
|
||||
body->mime_body = mime_body;
|
||||
body->hbody = hbody;
|
||||
body->index = index;
|
||||
list_init(&body->children);
|
||||
body->parent = parent;
|
||||
}
|
||||
|
@ -1630,8 +1630,7 @@ static body_t *create_sub_body(MimeMessage *msg, IStream *pStm, BODYOFFSETS *off
|
|||
offset->cbBodyStart = cur.u.LowPart + offset->cbHeaderStart;
|
||||
if(parent) MimeBody_set_offsets(impl_from_IMimeBody(mime_body), offset);
|
||||
IMimeBody_SetData(mime_body, IET_BINARY, NULL, NULL, &IID_IStream, pStm);
|
||||
body = new_body_entry(mime_body, msg->next_hbody, parent);
|
||||
msg->next_hbody = (HBODY)((DWORD)msg->next_hbody + 1);
|
||||
body = new_body_entry(mime_body, msg->next_index++, parent);
|
||||
|
||||
if(IMimeBody_IsContentType(mime_body, "multipart", NULL) == S_OK)
|
||||
{
|
||||
|
@ -1812,7 +1811,7 @@ static HRESULT find_body(struct list *list, HBODY hbody, body_t **body)
|
|||
|
||||
LIST_FOR_EACH_ENTRY(cur, list, body_t, entry)
|
||||
{
|
||||
if(cur->hbody == hbody)
|
||||
if(cur->index == HandleToUlong(hbody))
|
||||
{
|
||||
*body = cur;
|
||||
return S_OK;
|
||||
|
@ -1948,7 +1947,7 @@ static HRESULT WINAPI MimeMessage_GetBody(
|
|||
|
||||
hr = get_body(This, location, hPivot, &body);
|
||||
|
||||
if(hr == S_OK) *phBody = body->hbody;
|
||||
if(hr == S_OK) *phBody = UlongToHandle(body->index);
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
@ -2003,38 +2002,35 @@ static HRESULT WINAPI MimeMessage_CountBodies(
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT find_next(IMimeMessage *msg, LPFINDBODY find_body, HBODY *out)
|
||||
static HRESULT find_next(IMimeMessage *msg, body_t *body, LPFINDBODY find, HBODY *out)
|
||||
{
|
||||
HRESULT hr;
|
||||
IMimeBody *mime_body;
|
||||
MimeMessage *This = (MimeMessage *)msg;
|
||||
struct list *ptr;
|
||||
HBODY next;
|
||||
|
||||
if(find_body->dwReserved == 0)
|
||||
find_body->dwReserved = (DWORD)HBODY_ROOT;
|
||||
else
|
||||
for (;;)
|
||||
{
|
||||
hr = IMimeMessage_GetBody(msg, IBL_FIRST, (HBODY)find_body->dwReserved, &next);
|
||||
if(hr == S_OK)
|
||||
find_body->dwReserved = (DWORD)next;
|
||||
if (!body) ptr = list_head( &This->body_tree );
|
||||
else
|
||||
{
|
||||
hr = IMimeMessage_GetBody(msg, IBL_NEXT, (HBODY)find_body->dwReserved, &next);
|
||||
if(hr == S_OK)
|
||||
find_body->dwReserved = (DWORD)next;
|
||||
else
|
||||
return MIME_E_NOT_FOUND;
|
||||
ptr = list_head( &body->children );
|
||||
while (!ptr)
|
||||
{
|
||||
if (!body->parent) return MIME_E_NOT_FOUND;
|
||||
if (!(ptr = list_next( &body->parent->children, &body->entry ))) body = body->parent;
|
||||
}
|
||||
}
|
||||
|
||||
body = LIST_ENTRY( ptr, body_t, entry );
|
||||
next = UlongToHandle( body->index );
|
||||
find->dwReserved = body->index;
|
||||
if (IMimeBody_IsContentType(body->mime_body, find->pszPriType, find->pszSubType) == S_OK)
|
||||
{
|
||||
*out = next;
|
||||
return S_OK;
|
||||
}
|
||||
}
|
||||
|
||||
hr = IMimeMessage_BindToObject(msg, (HBODY)find_body->dwReserved, &IID_IMimeBody, (void**)&mime_body);
|
||||
if(IMimeBody_IsContentType(mime_body, find_body->pszPriType, find_body->pszSubType) == S_OK)
|
||||
{
|
||||
IMimeBody_Release(mime_body);
|
||||
*out = (HBODY)find_body->dwReserved;
|
||||
return S_OK;
|
||||
}
|
||||
IMimeBody_Release(mime_body);
|
||||
return find_next(msg, find_body, out);
|
||||
return MIME_E_NOT_FOUND;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI MimeMessage_FindFirst(
|
||||
|
@ -2045,7 +2041,7 @@ static HRESULT WINAPI MimeMessage_FindFirst(
|
|||
TRACE("(%p)->(%p, %p)\n", iface, pFindBody, phBody);
|
||||
|
||||
pFindBody->dwReserved = 0;
|
||||
return find_next(iface, pFindBody, phBody);
|
||||
return find_next( iface, NULL, pFindBody, phBody );
|
||||
}
|
||||
|
||||
static HRESULT WINAPI MimeMessage_FindNext(
|
||||
|
@ -2053,9 +2049,15 @@ static HRESULT WINAPI MimeMessage_FindNext(
|
|||
LPFINDBODY pFindBody,
|
||||
LPHBODY phBody)
|
||||
{
|
||||
MimeMessage *This = (MimeMessage *)iface;
|
||||
body_t *body;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("(%p)->(%p, %p)\n", iface, pFindBody, phBody);
|
||||
|
||||
return find_next(iface, pFindBody, phBody);
|
||||
hr = find_body( &This->body_tree, UlongToHandle( pFindBody->dwReserved ), &body );
|
||||
if (hr != S_OK) return MIME_E_NOT_FOUND;
|
||||
return find_next( iface, body, pFindBody, phBody );
|
||||
}
|
||||
|
||||
static HRESULT WINAPI MimeMessage_ResolveURL(
|
||||
|
@ -2562,7 +2564,7 @@ HRESULT MimeMessage_create(IUnknown *outer, void **obj)
|
|||
This->refs = 1;
|
||||
This->stream = NULL;
|
||||
list_init(&This->body_tree);
|
||||
This->next_hbody = (HBODY)1;
|
||||
This->next_index = 1;
|
||||
|
||||
*obj = &This->lpVtbl;
|
||||
return S_OK;
|
||||
|
|
|
@ -61,7 +61,6 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
|
|||
|
||||
HRESULT WINAPI DllCanUnloadNow(void)
|
||||
{
|
||||
FIXME("\n");
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
|
|
|
@ -324,6 +324,7 @@ HRESULT regexp_match_next(script_ctx_t*,DispatchEx*,DWORD,const WCHAR*,DWORD,con
|
|||
DWORD*,DWORD*,match_result_t*);
|
||||
HRESULT regexp_match(script_ctx_t*,DispatchEx*,const WCHAR*,DWORD,BOOL,match_result_t**,DWORD*);
|
||||
HRESULT parse_regexp_flags(const WCHAR*,DWORD,DWORD*);
|
||||
HRESULT regexp_string_match(script_ctx_t*,DispatchEx*,BSTR,VARIANT*,jsexcept_t*);
|
||||
|
||||
static inline VARIANT *get_arg(DISPPARAMS *dp, DWORD i)
|
||||
{
|
||||
|
|
|
@ -2384,7 +2384,7 @@ SimpleMatch(REGlobalData *gData, REMatchState *x, REOp op,
|
|||
RECharSet *charSet;
|
||||
|
||||
const char *opname = reop_names[op];
|
||||
TRACE("\n%06d: %*s%s\n", pc - gData->regexp->program,
|
||||
TRACE("\n%06d: %*s%s\n", (int)(pc - gData->regexp->program),
|
||||
(int)gData->stateStackTop * 2, "", opname);
|
||||
|
||||
switch (op) {
|
||||
|
@ -2623,7 +2623,7 @@ ExecuteREBytecode(REGlobalData *gData, REMatchState *x)
|
|||
|
||||
for (;;) {
|
||||
const char *opname = reop_names[op];
|
||||
TRACE("\n%06d: %*s%s\n", pc - gData->regexp->program,
|
||||
TRACE("\n%06d: %*s%s\n", (int)(pc - gData->regexp->program),
|
||||
(int)gData->stateStackTop * 2, "", opname);
|
||||
|
||||
if (REOP_IS_SIMPLE(op)) {
|
||||
|
@ -3637,25 +3637,25 @@ static HRESULT run_exec(script_ctx_t *ctx, vdisp_t *jsthis, VARIANT *arg, jsexce
|
|||
hres = to_string(ctx, arg, ei, &string);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
length = SysStringLen(string);
|
||||
}else {
|
||||
string = SysAllocStringLen(NULL, 0);
|
||||
if(!string)
|
||||
return E_OUTOFMEMORY;
|
||||
string = NULL;
|
||||
length = 0;
|
||||
}
|
||||
|
||||
if(regexp->last_index < 0) {
|
||||
SysFreeString(string);
|
||||
set_last_index(regexp, 0);
|
||||
*ret = VARIANT_FALSE;
|
||||
if(input) {
|
||||
*input = NULL;
|
||||
if(regexp->jsregexp->flags & JSREG_GLOB) {
|
||||
if(regexp->last_index < 0) {
|
||||
SysFreeString(string);
|
||||
set_last_index(regexp, 0);
|
||||
*ret = VARIANT_FALSE;
|
||||
if(input) {
|
||||
*input = NULL;
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
length = SysStringLen(string);
|
||||
if(regexp->jsregexp->flags & JSREG_GLOB)
|
||||
last_index = regexp->last_index;
|
||||
}
|
||||
|
||||
cp = string + last_index;
|
||||
hres = regexp_match_next(ctx, ®exp->dispex, REM_RESET_INDEX, string, length, &cp, parens,
|
||||
|
@ -3878,6 +3878,87 @@ HRESULT create_regexp_var(script_ctx_t *ctx, VARIANT *src_arg, VARIANT *flags_ar
|
|||
return create_regexp(ctx, src, -1, flags, ret);
|
||||
}
|
||||
|
||||
HRESULT regexp_string_match(script_ctx_t *ctx, DispatchEx *re, BSTR str,
|
||||
VARIANT *retv, jsexcept_t *ei)
|
||||
{
|
||||
RegExpInstance *regexp = (RegExpInstance*)re;
|
||||
match_result_t *match_result;
|
||||
DWORD match_cnt, i, length;
|
||||
DispatchEx *array;
|
||||
VARIANT var;
|
||||
HRESULT hres;
|
||||
|
||||
length = SysStringLen(str);
|
||||
|
||||
if(!(regexp->jsregexp->flags & JSREG_GLOB)) {
|
||||
match_result_t match, *parens = NULL;
|
||||
DWORD parens_cnt, parens_size = 0;
|
||||
const WCHAR *cp = str;
|
||||
|
||||
hres = regexp_match_next(ctx, ®exp->dispex, 0, str, length, &cp, &parens, &parens_size, &parens_cnt, &match);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(retv) {
|
||||
if(hres == S_OK) {
|
||||
IDispatch *ret;
|
||||
|
||||
hres = create_match_array(ctx, str, &match, parens, parens_cnt, ei, &ret);
|
||||
if(SUCCEEDED(hres)) {
|
||||
V_VT(retv) = VT_DISPATCH;
|
||||
V_DISPATCH(retv) = ret;
|
||||
}
|
||||
}else {
|
||||
V_VT(retv) = VT_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
heap_free(parens);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
hres = regexp_match(ctx, ®exp->dispex, str, length, FALSE, &match_result, &match_cnt);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
if(!match_cnt) {
|
||||
TRACE("no match\n");
|
||||
|
||||
if(retv)
|
||||
V_VT(retv) = VT_NULL;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
hres = create_array(ctx, match_cnt, &array);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
V_VT(&var) = VT_BSTR;
|
||||
|
||||
for(i=0; i < match_cnt; i++) {
|
||||
V_BSTR(&var) = SysAllocStringLen(match_result[i].str, match_result[i].len);
|
||||
if(!V_BSTR(&var)) {
|
||||
hres = E_OUTOFMEMORY;
|
||||
break;
|
||||
}
|
||||
|
||||
hres = jsdisp_propput_idx(array, i, &var, ei, NULL/*FIXME*/);
|
||||
SysFreeString(V_BSTR(&var));
|
||||
if(FAILED(hres))
|
||||
break;
|
||||
}
|
||||
|
||||
heap_free(match_result);
|
||||
|
||||
if(SUCCEEDED(hres) && retv) {
|
||||
V_VT(retv) = VT_DISPATCH;
|
||||
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array);
|
||||
}else {
|
||||
jsdisp_release(array);
|
||||
}
|
||||
return hres;
|
||||
}
|
||||
|
||||
static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
|
||||
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
|
||||
{
|
||||
|
|
|
@ -622,11 +622,9 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
|
|||
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
|
||||
{
|
||||
const WCHAR *str;
|
||||
match_result_t *match_result;
|
||||
DispatchEx *regexp;
|
||||
DispatchEx *array;
|
||||
VARIANT var, *arg_var;
|
||||
DWORD length, match_cnt, i;
|
||||
VARIANT *arg_var;
|
||||
DWORD length;
|
||||
BSTR val_str = NULL;
|
||||
HRESULT hres = S_OK;
|
||||
|
||||
|
@ -645,7 +643,7 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
|
|||
case VT_DISPATCH:
|
||||
regexp = iface_to_jsdisp((IUnknown*)V_DISPATCH(arg_var));
|
||||
if(regexp) {
|
||||
if(regexp->builtin_info->class == JSCLASS_REGEXP)
|
||||
if(is_class(regexp, JSCLASS_REGEXP))
|
||||
break;
|
||||
jsdisp_release(regexp);
|
||||
}
|
||||
|
@ -664,54 +662,17 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
|
|||
}
|
||||
|
||||
hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
|
||||
if(SUCCEEDED(hres))
|
||||
hres = regexp_match(ctx, regexp, str, length, FALSE, &match_result, &match_cnt);
|
||||
jsdisp_release(regexp);
|
||||
if(FAILED(hres)) {
|
||||
SysFreeString(val_str);
|
||||
return hres;
|
||||
}
|
||||
|
||||
if(!match_cnt) {
|
||||
TRACE("no match\n");
|
||||
|
||||
if(retv)
|
||||
V_VT(retv) = VT_NULL;
|
||||
|
||||
SysFreeString(val_str);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
hres = create_array(ctx, match_cnt, &array);
|
||||
if(FAILED(hres)) {
|
||||
SysFreeString(val_str);
|
||||
return hres;
|
||||
}
|
||||
|
||||
V_VT(&var) = VT_BSTR;
|
||||
|
||||
for(i=0; i < match_cnt; i++) {
|
||||
V_BSTR(&var) = SysAllocStringLen(match_result[i].str, match_result[i].len);
|
||||
if(!V_BSTR(&var)) {
|
||||
if(SUCCEEDED(hres)) {
|
||||
if(!val_str)
|
||||
val_str = SysAllocStringLen(str, length);
|
||||
if(val_str)
|
||||
hres = regexp_string_match(ctx, regexp, val_str, retv, ei);
|
||||
else
|
||||
hres = E_OUTOFMEMORY;
|
||||
break;
|
||||
}
|
||||
|
||||
hres = jsdisp_propput_idx(array, i, &var, ei, NULL/*FIXME*/);
|
||||
SysFreeString(V_BSTR(&var));
|
||||
if(FAILED(hres))
|
||||
break;
|
||||
}
|
||||
|
||||
heap_free(match_result);
|
||||
jsdisp_release(regexp);
|
||||
SysFreeString(val_str);
|
||||
|
||||
if(SUCCEEDED(hres) && retv) {
|
||||
V_VT(retv) = VT_DISPATCH;
|
||||
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array);
|
||||
}else {
|
||||
jsdisp_release(array);
|
||||
}
|
||||
return hres;
|
||||
}
|
||||
|
||||
|
|
|
@ -190,3 +190,7 @@ IntGetCodePageEntry(UINT CodePage);
|
|||
|
||||
LPWSTR
|
||||
GetDllLoadPath(LPCWSTR lpModule);
|
||||
|
||||
VOID
|
||||
WINAPI
|
||||
InitCommandLines(VOID);
|
||||
|
|
|
@ -966,11 +966,9 @@
|
|||
@ stdcall WaitNamedPipeW (wstr long)
|
||||
@ stdcall WideCharToMultiByte(long long wstr long ptr long ptr ptr)
|
||||
@ stdcall WinExec(str long)
|
||||
#ifdef _M_AMD64
|
||||
@ stdcall Wow64EnableWow64FsRedirection(long)
|
||||
@ stdcall Wow64DisableWow64FsRedirection(long)
|
||||
@ stdcall Wow64RevertWow64FsRedirection(long)
|
||||
#endif
|
||||
@ stdcall WriteConsoleA(long ptr long ptr ptr)
|
||||
@ stdcall WriteConsoleInputA(long ptr long ptr)
|
||||
@ stdcall WriteConsoleInputVDMA(long long long long)
|
||||
|
|
|
@ -330,6 +330,9 @@ DllMain(HANDLE hDll,
|
|||
wcscpy(SystemDirectory.Buffer, WindowsDirectory.Buffer);
|
||||
wcscat(SystemDirectory.Buffer, L"\\System32");
|
||||
|
||||
/* Initialize command line */
|
||||
InitCommandLines();
|
||||
|
||||
/* Open object base directory */
|
||||
Status = OpenBaseDirectory(&hBaseDir);
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
|
|
@ -885,9 +885,9 @@ NlsGetCacheUpdateCount(VOID)
|
|||
return 0;
|
||||
}
|
||||
|
||||
BOOL
|
||||
BOOLEAN
|
||||
WINAPI
|
||||
Wow64EnableWow64FsRedirection (BOOL Wow64EnableWow64FsRedirection)
|
||||
Wow64EnableWow64FsRedirection (BOOLEAN Wow64EnableWow64FsRedirection)
|
||||
{
|
||||
STUB;
|
||||
return FALSE;
|
||||
|
|
|
@ -27,19 +27,17 @@ static BOOL bCommandLineInitialized = FALSE;
|
|||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
static
|
||||
VOID
|
||||
WINAPI
|
||||
InitCommandLines(VOID)
|
||||
{
|
||||
PRTL_USER_PROCESS_PARAMETERS Params;
|
||||
|
||||
/* FIXME - not thread-safe! */
|
||||
|
||||
// get command line
|
||||
/* get command line */
|
||||
Params = NtCurrentPeb()->ProcessParameters;
|
||||
RtlNormalizeProcessParams (Params);
|
||||
|
||||
// initialize command line buffers
|
||||
/* initialize command line buffers */
|
||||
CommandLineStringW.Length = Params->CommandLine.Length;
|
||||
CommandLineStringW.MaximumLength = CommandLineStringW.Length + sizeof(WCHAR);
|
||||
CommandLineStringW.Buffer = RtlAllocateHeap(GetProcessHeap(),
|
||||
|
@ -80,13 +78,7 @@ LPSTR
|
|||
WINAPI
|
||||
GetCommandLineA(VOID)
|
||||
{
|
||||
if (bCommandLineInitialized == FALSE)
|
||||
{
|
||||
InitCommandLines();
|
||||
}
|
||||
|
||||
DPRINT("CommandLine \'%s\'\n", CommandLineStringA.Buffer);
|
||||
|
||||
return CommandLineStringA.Buffer;
|
||||
}
|
||||
|
||||
|
@ -98,13 +90,7 @@ LPWSTR
|
|||
WINAPI
|
||||
GetCommandLineW(VOID)
|
||||
{
|
||||
if (bCommandLineInitialized == FALSE)
|
||||
{
|
||||
InitCommandLines();
|
||||
}
|
||||
|
||||
DPRINT("CommandLine \'%S\'\n", CommandLineStringW.Buffer);
|
||||
|
||||
return CommandLineStringW.Buffer;
|
||||
}
|
||||
|
||||
|
|
|
@ -1375,7 +1375,7 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo
|
|||
}
|
||||
|
||||
/* Verified with the Adobe PS Driver, that w2k does not use di.Version */
|
||||
RegSetValueExW(hdrv, versionW, 0, REG_DWORD, (LPBYTE) &env->driverversion,
|
||||
RegSetValueExW(hdrv, versionW, 0, REG_DWORD, (const BYTE*) &env->driverversion,
|
||||
sizeof(DWORD));
|
||||
|
||||
RegSetValueExW(hdrv, driverW, 0, REG_SZ, (LPBYTE) di.pDriverPath,
|
||||
|
@ -1395,7 +1395,7 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo
|
|||
RegSetValueExW(hdrv, help_fileW, 0, REG_SZ, (LPBYTE) di.pHelpFile,
|
||||
(lstrlenW(di.pHelpFile)+1)* sizeof(WCHAR));
|
||||
else
|
||||
RegSetValueExW(hdrv, help_fileW, 0, REG_SZ, (LPBYTE)emptyW, sizeof(emptyW));
|
||||
RegSetValueExW(hdrv, help_fileW, 0, REG_SZ, (const BYTE*)emptyW, sizeof(emptyW));
|
||||
apd_copyfile(di.pHelpFile, &apd);
|
||||
|
||||
|
||||
|
@ -1404,7 +1404,7 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo
|
|||
RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (LPBYTE) di.pDependentFiles,
|
||||
multi_sz_lenW(di.pDependentFiles));
|
||||
else
|
||||
RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (LPBYTE)emptyW, sizeof(emptyW));
|
||||
RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (const BYTE*)emptyW, sizeof(emptyW));
|
||||
while ((ptr != NULL) && (ptr[0])) {
|
||||
if (apd_copyfile(ptr, &apd)) {
|
||||
ptr += lstrlenW(ptr) + 1;
|
||||
|
@ -1420,20 +1420,20 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo
|
|||
RegSetValueExW(hdrv, monitorW, 0, REG_SZ, (LPBYTE) di.pMonitorName,
|
||||
(lstrlenW(di.pMonitorName)+1)* sizeof(WCHAR));
|
||||
else
|
||||
RegSetValueExW(hdrv, monitorW, 0, REG_SZ, (LPBYTE)emptyW, sizeof(emptyW));
|
||||
RegSetValueExW(hdrv, monitorW, 0, REG_SZ, (const BYTE*)emptyW, sizeof(emptyW));
|
||||
|
||||
if (di.pDefaultDataType)
|
||||
RegSetValueExW(hdrv, datatypeW, 0, REG_SZ, (LPBYTE) di.pDefaultDataType,
|
||||
(lstrlenW(di.pDefaultDataType)+1)* sizeof(WCHAR));
|
||||
else
|
||||
RegSetValueExW(hdrv, datatypeW, 0, REG_SZ, (LPBYTE)emptyW, sizeof(emptyW));
|
||||
RegSetValueExW(hdrv, datatypeW, 0, REG_SZ, (const BYTE*)emptyW, sizeof(emptyW));
|
||||
|
||||
/* settings for level 4 */
|
||||
if (di.pszzPreviousNames)
|
||||
RegSetValueExW(hdrv, previous_namesW, 0, REG_MULTI_SZ, (LPBYTE) di.pszzPreviousNames,
|
||||
multi_sz_lenW(di.pszzPreviousNames));
|
||||
else
|
||||
RegSetValueExW(hdrv, previous_namesW, 0, REG_MULTI_SZ, (LPBYTE)emptyW, sizeof(emptyW));
|
||||
RegSetValueExW(hdrv, previous_namesW, 0, REG_MULTI_SZ, (const BYTE*)emptyW, sizeof(emptyW));
|
||||
|
||||
if (level > 5) TRACE("level %u for Driver %s is incomplete\n", level, debugstr_w(di.pName));
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ LpkDllInitialize (
|
|||
case DLL_PROCESS_ATTACH:
|
||||
DisableThreadLibraryCalls(hDll);
|
||||
/* Tell usp10 it is activated usp10 */
|
||||
LpkPresent();
|
||||
//LpkPresent();
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -89,6 +89,7 @@ static DWORD MCIAVI_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp)
|
|||
wma->hStopEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
|
||||
wma->wDevID = modp->wDeviceID;
|
||||
wma->wCommandTable = mciLoadCommandResource(MCIAVI_hInstance, mciAviWStr, 0);
|
||||
wma->dwStatus = MCI_MODE_NOT_READY;
|
||||
modp->wCustomCommandTable = wma->wCommandTable;
|
||||
modp->wType = MCI_DEVTYPE_DIGITAL_VIDEO;
|
||||
mciSetDriverData(wma->wDevID, (DWORD_PTR)wma);
|
||||
|
@ -301,11 +302,11 @@ DWORD MCIAVI_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
|
|||
wma = MCIAVI_mciGetOpenDev(wDevID);
|
||||
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
|
||||
|
||||
MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
|
||||
|
||||
EnterCriticalSection(&wma->cs);
|
||||
|
||||
if (wma->nUseCount == 1) {
|
||||
if (wma->dwStatus != MCI_MODE_STOP)
|
||||
dwRet = MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
|
||||
MCIAVI_CleanUp(wma);
|
||||
|
||||
if ((dwFlags & MCI_NOTIFY) && lpParms) {
|
||||
|
@ -836,14 +837,14 @@ static DWORD MCIAVI_mciSetAudio(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETAUDIO_P
|
|||
{
|
||||
WINE_MCIAVI *wma;
|
||||
|
||||
FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
|
||||
|
||||
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
|
||||
|
||||
FIXME("(%04x, %08x, %p) Item %04x: stub\n", wDevID, dwFlags, lpParms, dwFlags & MCI_DGV_SETAUDIO_ITEM ? lpParms->dwItem : 0);
|
||||
|
||||
wma = MCIAVI_mciGetOpenDev(wDevID);
|
||||
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
|
||||
|
||||
return MCIERR_UNSUPPORTED_FUNCTION; /* like w2k */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
@ -870,14 +871,14 @@ static DWORD MCIAVI_mciSetVideo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETVIDEO_P
|
|||
{
|
||||
WINE_MCIAVI *wma;
|
||||
|
||||
FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
|
||||
|
||||
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
|
||||
|
||||
FIXME("(%04x, %08x, %p) Item %04x: stub\n", wDevID, dwFlags, lpParms, dwFlags & MCI_DGV_SETVIDEO_ITEM ? lpParms->dwItem : 0);
|
||||
|
||||
wma = MCIAVI_mciGetOpenDev(wDevID);
|
||||
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
|
||||
|
||||
return MCIERR_UNSUPPORTED_FUNCTION; /* like w2k */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
|
@ -420,7 +420,8 @@ static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenPar
|
|||
if (dwFlags & MCI_OPEN_ELEMENT) {
|
||||
if (dwFlags & MCI_OPEN_ELEMENT_ID) {
|
||||
WARN("MCI_OPEN_ELEMENT_ID %p! Abort\n", lpOpenParms->lpstrElementName);
|
||||
return MCIERR_NO_ELEMENT_ALLOWED;
|
||||
ret = MCIERR_NO_ELEMENT_ALLOWED;
|
||||
goto the_error;
|
||||
}
|
||||
TRACE("MCI_OPEN_ELEMENT element name: %s\n", debugstr_w(lpOpenParms->lpstrElementName));
|
||||
if (!isalpha(lpOpenParms->lpstrElementName[0]) || lpOpenParms->lpstrElementName[1] != ':' ||
|
||||
|
@ -483,6 +484,8 @@ static DWORD MCICDA_Close(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParm
|
|||
|
||||
if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID;
|
||||
|
||||
MCICDA_Stop(wDevID, MCI_WAIT, NULL);
|
||||
|
||||
if (--wmcda->nUseCount == 0) {
|
||||
CloseHandle(wmcda->handle);
|
||||
}
|
||||
|
|
|
@ -153,7 +153,8 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags,
|
|||
|
||||
MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL);
|
||||
|
||||
CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
||||
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
||||
wma->uninit = SUCCEEDED(hr);
|
||||
|
||||
hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, (LPVOID*)&wma->pgraph);
|
||||
if (FAILED(hr)) {
|
||||
|
@ -197,7 +198,8 @@ err:
|
|||
IMediaControl_Release(wma->pmctrl);
|
||||
wma->pmctrl = NULL;
|
||||
|
||||
CoUninitialize();
|
||||
if (wma->uninit)
|
||||
CoUninitialize();
|
||||
|
||||
return MCIERR_INTERNAL;
|
||||
}
|
||||
|
@ -220,7 +222,8 @@ static DWORD MCIQTZ_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpP
|
|||
if (wma->opened) {
|
||||
IGraphBuilder_Release(wma->pgraph);
|
||||
IMediaControl_Release(wma->pmctrl);
|
||||
CoUninitialize();
|
||||
if (wma->uninit)
|
||||
CoUninitialize();
|
||||
wma->opened = FALSE;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
typedef struct {
|
||||
MCIDEVICEID wDevID;
|
||||
BOOL opened;
|
||||
BOOL uninit;
|
||||
IGraphBuilder* pgraph;
|
||||
IMediaControl* pmctrl;
|
||||
BOOL started;
|
||||
|
|
|
@ -62,6 +62,7 @@ typedef struct tagWINE_MCIMIDI {
|
|||
UINT wDevID; /* the MCI one */
|
||||
HMIDI hMidi;
|
||||
int nUseCount; /* Incremented for each shared open */
|
||||
WORD wPort; /* the WINMM device unit */
|
||||
WORD wNotifyDeviceID; /* MCI device ID with a pending notification */
|
||||
HANDLE hCallback; /* Callback handle for pending notification */
|
||||
HMMIO hFile; /* mmio file handle open as Element */
|
||||
|
@ -726,6 +727,7 @@ static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpParms)
|
|||
|
||||
wmm->hFile = 0;
|
||||
wmm->hMidi = 0;
|
||||
wmm->wPort = MIDI_MAPPER;
|
||||
wmm->lpstrElementName = NULL;
|
||||
dwDeviceID = lpParms->wDeviceID;
|
||||
|
||||
|
@ -962,8 +964,8 @@ static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
|
|||
MIDI_mciReadNextEvent(wmm, mmt); /* FIXME == 0 */
|
||||
}
|
||||
|
||||
dwRet = midiOutOpen((LPHMIDIOUT)&wmm->hMidi, MIDIMAPPER, 0L, 0L, CALLBACK_NULL);
|
||||
/* dwRet = midiInOpen(&wmm->hMidi, MIDIMAPPER, 0L, 0L, CALLBACK_NULL);*/
|
||||
dwRet = midiOutOpen((LPHMIDIOUT)&wmm->hMidi, wmm->wPort, 0L, 0L, CALLBACK_NULL);
|
||||
/* dwRet = midiInOpen(&wmm->hMidi, wmm->wPort, 0L, 0L, CALLBACK_NULL);*/
|
||||
if (dwRet != MMSYSERR_NOERROR) {
|
||||
return dwRet;
|
||||
}
|
||||
|
@ -1290,7 +1292,7 @@ static DWORD MIDI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPa
|
|||
/**************************************************************************
|
||||
* MIDI_mciSet [internal]
|
||||
*/
|
||||
static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
|
||||
static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SEQ_SET_PARMS lpParms)
|
||||
{
|
||||
WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID);
|
||||
|
||||
|
@ -1359,8 +1361,15 @@ static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
|
|||
TRACE("MCI_SEQ_SET_SLAVE !\n");
|
||||
if (dwFlags & MCI_SEQ_SET_OFFSET)
|
||||
TRACE("MCI_SEQ_SET_OFFSET !\n");
|
||||
if (dwFlags & MCI_SEQ_SET_PORT)
|
||||
TRACE("MCI_SEQ_SET_PORT !\n");
|
||||
if (dwFlags & MCI_SEQ_SET_PORT) {
|
||||
TRACE("MCI_SEQ_SET_PORT = %d\n", lpParms->dwPort);
|
||||
if ((UINT16)lpParms->dwPort != (UINT16)MIDI_MAPPER &&
|
||||
(UINT16)lpParms->dwPort >= midiOutGetNumDevs())
|
||||
/* FIXME: input/output port distinction? */
|
||||
return MCIERR_SEQ_PORT_NONEXISTENT;
|
||||
/* FIXME: Native manages to swap the device while playing! */
|
||||
wmm->wPort = lpParms->dwPort;
|
||||
}
|
||||
if (dwFlags & MCI_SEQ_SET_TEMPO)
|
||||
TRACE("MCI_SEQ_SET_TEMPO !\n");
|
||||
return 0;
|
||||
|
@ -1459,8 +1468,13 @@ static DWORD MIDI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpPar
|
|||
lpParms->dwReturn = 0;
|
||||
break;
|
||||
case MCI_SEQ_STATUS_PORT:
|
||||
TRACE("MCI_SEQ_STATUS_PORT (%u)!\n", wmm->wDevID);
|
||||
lpParms->dwReturn = MIDI_MAPPER;
|
||||
if (wmm->wPort != (UINT16)MIDI_MAPPER)
|
||||
lpParms->dwReturn = wmm->wPort;
|
||||
else {
|
||||
lpParms->dwReturn = MAKEMCIRESOURCE(MIDI_MAPPER, MCI_SEQ_MAPPER_S);
|
||||
ret = MCI_RESOURCE_RETURNED;
|
||||
}
|
||||
TRACE("MCI_SEQ_STATUS_PORT (%u) => %d\n", wmm->wDevID, wmm->wPort);
|
||||
break;
|
||||
case MCI_SEQ_STATUS_TEMPO:
|
||||
TRACE("MCI_SEQ_STATUS_TEMPO !\n");
|
||||
|
@ -1664,7 +1678,7 @@ LRESULT CALLBACK MCIMIDI_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
|
|||
case MCI_PLAY: return MIDI_mciPlay (dwDevID, dwParam1, (LPMCI_PLAY_PARMS) dwParam2);
|
||||
case MCI_RECORD: return MIDI_mciRecord (dwDevID, dwParam1, (LPMCI_RECORD_PARMS) dwParam2);
|
||||
case MCI_STOP: return MIDI_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
|
||||
case MCI_SET: return MIDI_mciSet (dwDevID, dwParam1, (LPMCI_SET_PARMS) dwParam2);
|
||||
case MCI_SET: return MIDI_mciSet (dwDevID, dwParam1, (LPMCI_SEQ_SET_PARMS) dwParam2);
|
||||
case MCI_PAUSE: return MIDI_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
|
||||
case MCI_RESUME: return MIDI_mciResume (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
|
||||
case MCI_STATUS: return MIDI_mciStatus (dwDevID, dwParam1, (LPMCI_STATUS_PARMS) dwParam2);
|
||||
|
|
|
@ -47,6 +47,8 @@ typedef struct {
|
|||
WAVEFORMATEX wfxRef;
|
||||
LPWAVEFORMATEX lpWaveFormat; /* Points to wfxRef until set by OPEN or RECORD */
|
||||
BOOL fInput; /* FALSE = Output, TRUE = Input */
|
||||
WORD wInput; /* wave input device */
|
||||
WORD wOutput; /* wave output device */
|
||||
volatile WORD dwStatus; /* one from MCI_MODE_xxxx */
|
||||
DWORD dwMciTimeFormat;/* One of the supported MCI_FORMAT_xxxx */
|
||||
DWORD dwPosition; /* position in bytes in chunk */
|
||||
|
@ -529,6 +531,7 @@ static LRESULT WAVE_mciOpen(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_P
|
|||
|
||||
wmw->nUseCount++;
|
||||
|
||||
wmw->wInput = wmw->wOutput = WAVE_MAPPER;
|
||||
wmw->fInput = FALSE;
|
||||
wmw->hWave = 0;
|
||||
wmw->dwStatus = MCI_MODE_NOT_READY;
|
||||
|
@ -831,8 +834,7 @@ static DWORD WAVE_mciPlay(MCIDEVICEID wDevID, DWORD_PTR dwFlags, DWORD_PTR pmt,
|
|||
*/
|
||||
mmioSeek(wmw->hFile, wmw->ckWaveData.dwDataOffset + wmw->dwPosition, SEEK_SET); /* >= 0 */
|
||||
|
||||
/* FIXME: how to choose between several output channels ? here mapper is forced */
|
||||
dwRet = waveOutOpen((HWAVEOUT *)&wmw->hWave, WAVE_MAPPER, wmw->lpWaveFormat,
|
||||
dwRet = waveOutOpen((HWAVEOUT *)&wmw->hWave, wmw->wOutput, wmw->lpWaveFormat,
|
||||
(DWORD_PTR)WAVE_mciPlayCallback, (DWORD_PTR)wmw, CALLBACK_FUNCTION);
|
||||
|
||||
if (dwRet != 0) {
|
||||
|
@ -1064,11 +1066,7 @@ static DWORD WAVE_mciRecord(MCIDEVICEID wDevID, DWORD_PTR dwFlags, DWORD_PTR pmt
|
|||
*/
|
||||
mmioSeek(wmw->hFile, wmw->ckWaveData.dwDataOffset + wmw->dwPosition, SEEK_SET); /* >= 0 */
|
||||
|
||||
/* By default the device will be opened for output, the MCI_CUE function is there to
|
||||
* change from output to input and back
|
||||
*/
|
||||
/* FIXME: how to choose between several output channels ? here mapper is forced */
|
||||
dwRet = waveInOpen((HWAVEIN*)&wmw->hWave, WAVE_MAPPER, wmw->lpWaveFormat,
|
||||
dwRet = waveInOpen((HWAVEIN*)&wmw->hWave, wmw->wInput, wmw->lpWaveFormat,
|
||||
(DWORD_PTR)WAVE_mciRecordCallback, (DWORD_PTR)wmw, CALLBACK_FUNCTION);
|
||||
|
||||
if (dwRet != MMSYSERR_NOERROR) {
|
||||
|
@ -1279,7 +1277,7 @@ static DWORD WAVE_mciSeek(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lp
|
|||
/**************************************************************************
|
||||
* WAVE_mciSet [internal]
|
||||
*/
|
||||
static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
|
||||
static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_WAVE_SET_PARMS lpParms)
|
||||
{
|
||||
WINE_MCIWAVE* wmw = WAVE_mciGetOpenDev(wDevID);
|
||||
|
||||
|
@ -1337,44 +1335,64 @@ static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpPa
|
|||
default: WARN("Unknown audio channel %u\n", lpParms->dwAudio); break;
|
||||
}
|
||||
}
|
||||
if (dwFlags & MCI_WAVE_INPUT)
|
||||
TRACE("MCI_WAVE_INPUT !\n");
|
||||
if (dwFlags & MCI_WAVE_OUTPUT)
|
||||
TRACE("MCI_WAVE_OUTPUT !\n");
|
||||
if (dwFlags & MCI_WAVE_SET_ANYINPUT)
|
||||
TRACE("MCI_WAVE_SET_ANYINPUT !\n");
|
||||
if (dwFlags & MCI_WAVE_SET_ANYOUTPUT)
|
||||
TRACE("MCI_WAVE_SET_ANYOUTPUT !\n");
|
||||
if (dwFlags & MCI_WAVE_INPUT) {
|
||||
TRACE("MCI_WAVE_INPUT = %d\n", lpParms->wInput);
|
||||
if (lpParms->wInput >= waveInGetNumDevs())
|
||||
return MCIERR_OUTOFRANGE;
|
||||
if (wmw->wInput != (WORD)lpParms->wInput)
|
||||
WAVE_mciStop(wDevID, MCI_WAIT, NULL);
|
||||
wmw->wInput = lpParms->wInput;
|
||||
}
|
||||
if (dwFlags & MCI_WAVE_OUTPUT) {
|
||||
TRACE("MCI_WAVE_OUTPUT = %d\n", lpParms->wOutput);
|
||||
if (lpParms->wOutput >= waveOutGetNumDevs())
|
||||
return MCIERR_OUTOFRANGE;
|
||||
if (wmw->wOutput != (WORD)lpParms->wOutput)
|
||||
WAVE_mciStop(wDevID, MCI_WAIT, NULL);
|
||||
wmw->wOutput = lpParms->wOutput;
|
||||
}
|
||||
if (dwFlags & MCI_WAVE_SET_ANYINPUT) {
|
||||
TRACE("MCI_WAVE_SET_ANYINPUT\n");
|
||||
if (wmw->wInput != (WORD)lpParms->wInput)
|
||||
WAVE_mciStop(wDevID, MCI_WAIT, NULL);
|
||||
wmw->wInput = WAVE_MAPPER;
|
||||
}
|
||||
if (dwFlags & MCI_WAVE_SET_ANYOUTPUT) {
|
||||
TRACE("MCI_WAVE_SET_ANYOUTPUT\n");
|
||||
if (wmw->wOutput != (WORD)lpParms->wOutput)
|
||||
WAVE_mciStop(wDevID, MCI_WAIT, NULL);
|
||||
wmw->wOutput = WAVE_MAPPER;
|
||||
}
|
||||
/* Set wave format parameters is refused after Open or Record.*/
|
||||
if (dwFlags & MCI_WAVE_SET_FORMATTAG) {
|
||||
TRACE("MCI_WAVE_SET_FORMATTAG = %d\n", ((LPMCI_WAVE_SET_PARMS)lpParms)->wFormatTag);
|
||||
TRACE("MCI_WAVE_SET_FORMATTAG = %d\n", lpParms->wFormatTag);
|
||||
if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION;
|
||||
if (((LPMCI_WAVE_SET_PARMS)lpParms)->wFormatTag != WAVE_FORMAT_PCM)
|
||||
if (lpParms->wFormatTag != WAVE_FORMAT_PCM)
|
||||
return MCIERR_OUTOFRANGE;
|
||||
}
|
||||
if (dwFlags & MCI_WAVE_SET_AVGBYTESPERSEC) {
|
||||
if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION;
|
||||
wmw->wfxRef.nAvgBytesPerSec = ((LPMCI_WAVE_SET_PARMS)lpParms)->nAvgBytesPerSec;
|
||||
wmw->wfxRef.nAvgBytesPerSec = lpParms->nAvgBytesPerSec;
|
||||
TRACE("MCI_WAVE_SET_AVGBYTESPERSEC = %d\n", wmw->wfxRef.nAvgBytesPerSec);
|
||||
}
|
||||
if (dwFlags & MCI_WAVE_SET_BITSPERSAMPLE) {
|
||||
if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION;
|
||||
wmw->wfxRef.wBitsPerSample = ((LPMCI_WAVE_SET_PARMS)lpParms)->wBitsPerSample;
|
||||
wmw->wfxRef.wBitsPerSample = lpParms->wBitsPerSample;
|
||||
TRACE("MCI_WAVE_SET_BITSPERSAMPLE = %d\n", wmw->wfxRef.wBitsPerSample);
|
||||
}
|
||||
if (dwFlags & MCI_WAVE_SET_BLOCKALIGN) {
|
||||
if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION;
|
||||
wmw->wfxRef.nBlockAlign = ((LPMCI_WAVE_SET_PARMS)lpParms)->nBlockAlign;
|
||||
wmw->wfxRef.nBlockAlign = lpParms->nBlockAlign;
|
||||
TRACE("MCI_WAVE_SET_BLOCKALIGN = %d\n", wmw->wfxRef.nBlockAlign);
|
||||
}
|
||||
if (dwFlags & MCI_WAVE_SET_CHANNELS) {
|
||||
if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION;
|
||||
wmw->wfxRef.nChannels = ((LPMCI_WAVE_SET_PARMS)lpParms)->nChannels;
|
||||
wmw->wfxRef.nChannels = lpParms->nChannels;
|
||||
TRACE("MCI_WAVE_SET_CHANNELS = %d\n", wmw->wfxRef.nChannels);
|
||||
}
|
||||
if (dwFlags & MCI_WAVE_SET_SAMPLESPERSEC) {
|
||||
if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION;
|
||||
wmw->wfxRef.nSamplesPerSec = ((LPMCI_WAVE_SET_PARMS)lpParms)->nSamplesPerSec;
|
||||
wmw->wfxRef.nSamplesPerSec = lpParms->nSamplesPerSec;
|
||||
TRACE("MCI_WAVE_SET_SAMPLESPERSEC = %d\n", wmw->wfxRef.nSamplesPerSec);
|
||||
}
|
||||
if (dwFlags & MCI_NOTIFY)
|
||||
|
@ -1500,24 +1518,34 @@ static DWORD WAVE_mciStatus(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_STATUS_PARM
|
|||
ret = MCI_RESOURCE_RETURNED;
|
||||
break;
|
||||
case MCI_WAVE_INPUT:
|
||||
TRACE("MCI_WAVE_INPUT !\n");
|
||||
lpParms->dwReturn = 0;
|
||||
ret = MCIERR_WAVE_INPUTUNSPECIFIED;
|
||||
if (wmw->wInput != (WORD)WAVE_MAPPER)
|
||||
lpParms->dwReturn = wmw->wInput;
|
||||
else {
|
||||
lpParms->dwReturn = MAKEMCIRESOURCE(WAVE_MAPPER, WAVE_MAPPER_S);
|
||||
ret = MCI_RESOURCE_RETURNED;
|
||||
}
|
||||
TRACE("MCI_WAVE_INPUT => %d\n", (signed)wmw->wInput);
|
||||
break;
|
||||
case MCI_WAVE_OUTPUT:
|
||||
TRACE("MCI_WAVE_OUTPUT !\n");
|
||||
{
|
||||
UINT id;
|
||||
if (waveOutGetID(wmw->hWave, &id) == MMSYSERR_NOERROR) {
|
||||
lpParms->dwReturn = id;
|
||||
} else {
|
||||
lpParms->dwReturn = 0;
|
||||
ret = MCIERR_WAVE_OUTPUTUNSPECIFIED;
|
||||
}
|
||||
if (wmw->wOutput != (WORD)WAVE_MAPPER)
|
||||
lpParms->dwReturn = wmw->wOutput;
|
||||
else {
|
||||
lpParms->dwReturn = MAKEMCIRESOURCE(WAVE_MAPPER, WAVE_MAPPER_S);
|
||||
ret = MCI_RESOURCE_RETURNED;
|
||||
}
|
||||
TRACE("MCI_WAVE_OUTPUT => %d\n", (signed)wmw->wOutput);
|
||||
break;
|
||||
/* It is always ok to query wave format parameters,
|
||||
* except on auto-open yield MCIERR_UNSUPPORTED_FUNCTION. */
|
||||
case MCI_WAVE_STATUS_FORMATTAG:
|
||||
if (wmw->lpWaveFormat->wFormatTag != WAVE_FORMAT_PCM)
|
||||
lpParms->dwReturn = wmw->lpWaveFormat->wFormatTag;
|
||||
else {
|
||||
lpParms->dwReturn = MAKEMCIRESOURCE(WAVE_FORMAT_PCM, WAVE_FORMAT_PCM_S);
|
||||
ret = MCI_RESOURCE_RETURNED;
|
||||
}
|
||||
TRACE("MCI_WAVE_FORMATTAG => %lu\n", lpParms->dwReturn);
|
||||
break;
|
||||
case MCI_WAVE_STATUS_AVGBYTESPERSEC:
|
||||
lpParms->dwReturn = wmw->lpWaveFormat->nAvgBytesPerSec;
|
||||
TRACE("MCI_WAVE_STATUS_AVGBYTESPERSEC => %lu\n", lpParms->dwReturn);
|
||||
|
@ -1534,10 +1562,6 @@ static DWORD WAVE_mciStatus(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_STATUS_PARM
|
|||
lpParms->dwReturn = wmw->lpWaveFormat->nChannels;
|
||||
TRACE("MCI_WAVE_STATUS_CHANNELS => %lu\n", lpParms->dwReturn);
|
||||
break;
|
||||
case MCI_WAVE_STATUS_FORMATTAG:
|
||||
lpParms->dwReturn = wmw->lpWaveFormat->wFormatTag;
|
||||
TRACE("MCI_WAVE_FORMATTAG => %lu\n", lpParms->dwReturn);
|
||||
break;
|
||||
case MCI_WAVE_STATUS_SAMPLESPERSEC:
|
||||
lpParms->dwReturn = wmw->lpWaveFormat->nSamplesPerSec;
|
||||
TRACE("MCI_WAVE_STATUS_SAMPLESPERSEC => %lu\n", lpParms->dwReturn);
|
||||
|
@ -1705,7 +1729,7 @@ LRESULT CALLBACK MCIWAVE_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
|
|||
case MCI_PLAY: return WAVE_mciPlay (dwDevID, dwParam1, dwParam2, NULL);
|
||||
case MCI_RECORD: return WAVE_mciRecord (dwDevID, dwParam1, dwParam2, NULL);
|
||||
case MCI_STOP: return WAVE_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
|
||||
case MCI_SET: return WAVE_mciSet (dwDevID, dwParam1, (LPMCI_SET_PARMS) dwParam2);
|
||||
case MCI_SET: return WAVE_mciSet (dwDevID, dwParam1, (LPMCI_WAVE_SET_PARMS) dwParam2);
|
||||
case MCI_PAUSE: return WAVE_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
|
||||
case MCI_RESUME: return WAVE_mciResume (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
|
||||
case MCI_STATUS: return WAVE_mciStatus (dwDevID, dwParam1, (LPMCI_STATUS_PARMS) dwParam2);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<group>
|
||||
<group xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<module name="msacm32" type="win32dll" baseaddress="${BASEADDRESS_MSACM32}" installbase="system32" installname="msacm32.dll" unicode="yes">
|
||||
<importlibrary definition="msacm32.spec" />
|
||||
<include base="msacm32">.</include>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<define name="__WINESRC__" />
|
||||
<library>wine</library>
|
||||
<library>advapi32</library>
|
||||
<library>shell32</library>
|
||||
<library>uuid</library>
|
||||
<file>corruntimehost.c</file>
|
||||
<file>mscoree_main.c</file>
|
||||
|
|
|
@ -21,11 +21,14 @@
|
|||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "wine/unicode.h"
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
#include "winuser.h"
|
||||
#include "winnls.h"
|
||||
#include "winreg.h"
|
||||
#include "ole2.h"
|
||||
#include "shellapi.h"
|
||||
|
||||
#include "initguid.h"
|
||||
#include "cor.h"
|
||||
|
@ -36,26 +39,25 @@
|
|||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL( mscoree );
|
||||
|
||||
static LPWSTR get_mono_exe(void)
|
||||
static BOOL get_mono_path(LPWSTR path)
|
||||
{
|
||||
static const WCHAR mono_exe[] = {'b','i','n','\\','m','o','n','o','.','e','x','e',' ',0};
|
||||
static const WCHAR mono_key[] = {'S','o','f','t','w','a','r','e','\\','N','o','v','e','l','l','\\','M','o','n','o',0};
|
||||
static const WCHAR defaul_clr[] = {'D','e','f','a','u','l','t','C','L','R',0};
|
||||
static const WCHAR install_root[] = {'S','d','k','I','n','s','t','a','l','l','R','o','o','t',0};
|
||||
static const WCHAR slash[] = {'\\',0};
|
||||
|
||||
WCHAR version[64], version_key[MAX_PATH], root[MAX_PATH], *ret;
|
||||
DWORD len, size;
|
||||
WCHAR version[64], version_key[MAX_PATH];
|
||||
DWORD len;
|
||||
HKEY key;
|
||||
|
||||
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, mono_key, 0, KEY_READ, &key))
|
||||
return NULL;
|
||||
return FALSE;
|
||||
|
||||
len = sizeof(version);
|
||||
if (RegQueryValueExW(key, defaul_clr, 0, NULL, (LPBYTE)version, &len))
|
||||
{
|
||||
RegCloseKey(key);
|
||||
return NULL;
|
||||
return FALSE;
|
||||
}
|
||||
RegCloseKey(key);
|
||||
|
||||
|
@ -64,24 +66,129 @@ static LPWSTR get_mono_exe(void)
|
|||
lstrcatW(version_key, version);
|
||||
|
||||
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, version_key, 0, KEY_READ, &key))
|
||||
return NULL;
|
||||
return FALSE;
|
||||
|
||||
len = sizeof(root);
|
||||
if (RegQueryValueExW(key, install_root, 0, NULL, (LPBYTE)root, &len))
|
||||
len = sizeof(WCHAR) * MAX_PATH;
|
||||
if (RegQueryValueExW(key, install_root, 0, NULL, (LPBYTE)path, &len))
|
||||
{
|
||||
RegCloseKey(key);
|
||||
return NULL;
|
||||
return FALSE;
|
||||
}
|
||||
RegCloseKey(key);
|
||||
|
||||
size = len + sizeof(slash) + sizeof(mono_exe);
|
||||
if (!(ret = HeapAlloc(GetProcessHeap(), 0, size))) return NULL;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
lstrcpyW(ret, root);
|
||||
lstrcatW(ret, slash);
|
||||
lstrcatW(ret, mono_exe);
|
||||
static CRITICAL_SECTION mono_lib_cs;
|
||||
static CRITICAL_SECTION_DEBUG mono_lib_cs_debug =
|
||||
{
|
||||
0, 0, &mono_lib_cs,
|
||||
{ &mono_lib_cs_debug.ProcessLocksList,
|
||||
&mono_lib_cs_debug.ProcessLocksList },
|
||||
0, 0, { (DWORD_PTR)(__FILE__ ": mono_lib_cs") }
|
||||
};
|
||||
static CRITICAL_SECTION mono_lib_cs = { &mono_lib_cs_debug, -1, 0, 0, 0, 0 };
|
||||
|
||||
return ret;
|
||||
HMODULE mono_handle;
|
||||
|
||||
void (*mono_config_parse)(const char *filename);
|
||||
MonoAssembly* (*mono_domain_assembly_open) (MonoDomain *domain, const char *name);
|
||||
void (*mono_jit_cleanup)(MonoDomain *domain);
|
||||
int (*mono_jit_exec)(MonoDomain *domain, MonoAssembly *assembly, int argc, char *argv[]);
|
||||
MonoDomain* (*mono_jit_init)(const char *file);
|
||||
int (*mono_jit_set_trace_options)(const char* options);
|
||||
void (*mono_set_dirs)(const char *assembly_dir, const char *config_dir);
|
||||
|
||||
static void set_environment(LPCWSTR bin_path)
|
||||
{
|
||||
WCHAR path_env[MAX_PATH];
|
||||
int len;
|
||||
|
||||
static const WCHAR pathW[] = {'P','A','T','H',0};
|
||||
|
||||
/* We have to modify PATH as Mono loads other DLLs from this directory. */
|
||||
GetEnvironmentVariableW(pathW, path_env, sizeof(path_env)/sizeof(WCHAR));
|
||||
len = strlenW(path_env);
|
||||
path_env[len++] = ';';
|
||||
strcpyW(path_env+len, bin_path);
|
||||
SetEnvironmentVariableW(pathW, path_env);
|
||||
}
|
||||
|
||||
static HMODULE load_mono(void)
|
||||
{
|
||||
static const WCHAR mono_dll[] = {'\\','b','i','n','\\','m','o','n','o','.','d','l','l',0};
|
||||
static const WCHAR libmono_dll[] = {'\\','b','i','n','\\','l','i','b','m','o','n','o','.','d','l','l',0};
|
||||
static const WCHAR bin[] = {'\\','b','i','n',0};
|
||||
static const WCHAR lib[] = {'\\','l','i','b',0};
|
||||
static const WCHAR etc[] = {'\\','e','t','c',0};
|
||||
HMODULE result;
|
||||
WCHAR mono_path[MAX_PATH], mono_dll_path[MAX_PATH+16], mono_bin_path[MAX_PATH+4];
|
||||
WCHAR mono_lib_path[MAX_PATH+4], mono_etc_path[MAX_PATH+4];
|
||||
char mono_lib_path_a[MAX_PATH], mono_etc_path_a[MAX_PATH];
|
||||
|
||||
EnterCriticalSection(&mono_lib_cs);
|
||||
|
||||
if (!mono_handle)
|
||||
{
|
||||
if (!get_mono_path(mono_path)) goto end;
|
||||
|
||||
strcpyW(mono_bin_path, mono_path);
|
||||
strcatW(mono_bin_path, bin);
|
||||
set_environment(mono_bin_path);
|
||||
|
||||
strcpyW(mono_lib_path, mono_path);
|
||||
strcatW(mono_lib_path, lib);
|
||||
WideCharToMultiByte(CP_UTF8, 0, mono_lib_path, -1, mono_lib_path_a, MAX_PATH, NULL, NULL);
|
||||
|
||||
strcpyW(mono_etc_path, mono_path);
|
||||
strcatW(mono_etc_path, etc);
|
||||
WideCharToMultiByte(CP_UTF8, 0, mono_etc_path, -1, mono_etc_path_a, MAX_PATH, NULL, NULL);
|
||||
|
||||
strcpyW(mono_dll_path, mono_path);
|
||||
strcatW(mono_dll_path, mono_dll);
|
||||
mono_handle = LoadLibraryW(mono_dll_path);
|
||||
|
||||
if (!mono_handle)
|
||||
{
|
||||
strcpyW(mono_dll_path, mono_path);
|
||||
strcatW(mono_dll_path, libmono_dll);
|
||||
mono_handle = LoadLibraryW(mono_dll_path);
|
||||
}
|
||||
|
||||
if (!mono_handle) goto end;
|
||||
|
||||
#define LOAD_MONO_FUNCTION(x) do { \
|
||||
x = (void*)GetProcAddress(mono_handle, #x); \
|
||||
if (!x) { \
|
||||
mono_handle = NULL; \
|
||||
goto end; \
|
||||
} \
|
||||
} while (0);
|
||||
|
||||
LOAD_MONO_FUNCTION(mono_config_parse);
|
||||
LOAD_MONO_FUNCTION(mono_domain_assembly_open);
|
||||
LOAD_MONO_FUNCTION(mono_jit_cleanup);
|
||||
LOAD_MONO_FUNCTION(mono_jit_exec);
|
||||
LOAD_MONO_FUNCTION(mono_jit_init);
|
||||
LOAD_MONO_FUNCTION(mono_jit_set_trace_options);
|
||||
LOAD_MONO_FUNCTION(mono_set_dirs);
|
||||
|
||||
#undef LOAD_MONO_FUNCTION
|
||||
|
||||
mono_set_dirs(mono_lib_path_a, mono_etc_path_a);
|
||||
|
||||
mono_config_parse(NULL);
|
||||
}
|
||||
|
||||
end:
|
||||
result = mono_handle;
|
||||
|
||||
LeaveCriticalSection(&mono_lib_cs);
|
||||
|
||||
if (!result)
|
||||
MESSAGE("wine: Install the Windows version of Mono to run .NET executables\n");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
HRESULT WINAPI CorBindToRuntimeHost(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor,
|
||||
|
@ -89,20 +196,16 @@ HRESULT WINAPI CorBindToRuntimeHost(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor
|
|||
DWORD startupFlags, REFCLSID rclsid,
|
||||
REFIID riid, LPVOID *ppv)
|
||||
{
|
||||
WCHAR *mono_exe;
|
||||
|
||||
FIXME("(%s, %s, %s, %p, %d, %s, %s, %p): semi-stub!\n", debugstr_w(pwszVersion),
|
||||
debugstr_w(pwszBuildFlavor), debugstr_w(pwszHostConfigFile), pReserved,
|
||||
startupFlags, debugstr_guid(rclsid), debugstr_guid(riid), ppv);
|
||||
|
||||
if (!(mono_exe = get_mono_exe()))
|
||||
if (!get_mono_path(NULL))
|
||||
{
|
||||
MESSAGE("wine: Install the Windows version of Mono to run .NET executables\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, mono_exe);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -138,68 +241,73 @@ BOOL WINAPI _CorDllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static void get_utf8_args(int *argc, char ***argv)
|
||||
{
|
||||
WCHAR **argvw;
|
||||
int size=0, i;
|
||||
char *current_arg;
|
||||
|
||||
argvw = CommandLineToArgvW(GetCommandLineW(), argc);
|
||||
|
||||
for (i=0; i<*argc; i++)
|
||||
{
|
||||
size += sizeof(char*);
|
||||
size += WideCharToMultiByte(CP_UTF8, 0, argvw[i], -1, NULL, 0, NULL, NULL);
|
||||
}
|
||||
size += sizeof(char*);
|
||||
|
||||
*argv = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
current_arg = (char*)(*argv + *argc + 1);
|
||||
|
||||
for (i=0; i<*argc; i++)
|
||||
{
|
||||
(*argv)[i] = current_arg;
|
||||
current_arg += WideCharToMultiByte(CP_UTF8, 0, argvw[i], -1, current_arg, size, NULL, NULL);
|
||||
}
|
||||
|
||||
(*argv)[*argc] = NULL;
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, argvw);
|
||||
}
|
||||
|
||||
__int32 WINAPI _CorExeMain(void)
|
||||
{
|
||||
STARTUPINFOW si;
|
||||
PROCESS_INFORMATION pi;
|
||||
WCHAR *mono_exe, *cmd_line;
|
||||
DWORD size, exit_code;
|
||||
static const WCHAR WINE_MONO_TRACE[]={'W','I','N','E','_','M','O','N','O','_','T','R','A','C','E',0};
|
||||
static const WCHAR trace_switch_start[]={'"','-','-','t','r','a','c','e','=',0};
|
||||
static const WCHAR trace_switch_end[]={'"',' ',0};
|
||||
int exit_code;
|
||||
int trace_size;
|
||||
WCHAR trace_setting[256];
|
||||
char trace_setting[256];
|
||||
int argc;
|
||||
char **argv;
|
||||
MonoDomain *domain;
|
||||
MonoAssembly *assembly;
|
||||
char filename[MAX_PATH];
|
||||
|
||||
if (!(mono_exe = get_mono_exe()))
|
||||
if (!load_mono())
|
||||
{
|
||||
MESSAGE("install the Windows version of Mono to run .NET executables\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
trace_size = GetEnvironmentVariableW(WINE_MONO_TRACE, trace_setting, sizeof(trace_setting)/sizeof(WCHAR));
|
||||
get_utf8_args(&argc, &argv);
|
||||
|
||||
size = (lstrlenW(mono_exe) + lstrlenW(GetCommandLineW()) + 1) * sizeof(WCHAR);
|
||||
|
||||
if (trace_size)
|
||||
size += (trace_size + lstrlenW(trace_switch_start) + lstrlenW(trace_switch_end)) * sizeof(WCHAR);
|
||||
|
||||
if (!(cmd_line = HeapAlloc(GetProcessHeap(), 0, size)))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, mono_exe);
|
||||
return -1;
|
||||
}
|
||||
|
||||
lstrcpyW(cmd_line, mono_exe);
|
||||
HeapFree(GetProcessHeap(), 0, mono_exe);
|
||||
trace_size = GetEnvironmentVariableA("WINE_MONO_TRACE", trace_setting, sizeof(trace_setting));
|
||||
|
||||
if (trace_size)
|
||||
{
|
||||
lstrcatW(cmd_line, trace_switch_start);
|
||||
lstrcatW(cmd_line, trace_setting);
|
||||
lstrcatW(cmd_line, trace_switch_end);
|
||||
mono_jit_set_trace_options(trace_setting);
|
||||
}
|
||||
|
||||
lstrcatW(cmd_line, GetCommandLineW());
|
||||
GetModuleFileNameA(NULL, filename, MAX_PATH);
|
||||
|
||||
TRACE("new command line: %s\n", debugstr_w(cmd_line));
|
||||
domain = mono_jit_init(filename);
|
||||
|
||||
memset(&si, 0, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
if (!CreateProcessW(NULL, cmd_line, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, cmd_line);
|
||||
return -1;
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, cmd_line);
|
||||
assembly = mono_domain_assembly_open(domain, filename);
|
||||
|
||||
/* wait for the process to exit */
|
||||
WaitForSingleObject(pi.hProcess, INFINITE);
|
||||
GetExitCodeProcess(pi.hProcess, &exit_code);
|
||||
exit_code = mono_jit_exec(domain, assembly, argc, argv);
|
||||
|
||||
CloseHandle(pi.hThread);
|
||||
CloseHandle(pi.hProcess);
|
||||
mono_jit_cleanup(domain);
|
||||
|
||||
return (int)exit_code;
|
||||
HeapFree(GetProcessHeap(), 0, argv);
|
||||
|
||||
return exit_code;
|
||||
}
|
||||
|
||||
__int32 WINAPI _CorExeMain2(PBYTE ptrMemory, DWORD cntMemory, LPWSTR imageName, LPWSTR loaderName, LPWSTR cmdLine)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue