You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
243 lines
7.1 KiB
243 lines
7.1 KiB
/*++
|
|
|
|
Copyright (c) 2000-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
assign.cpp
|
|
|
|
Abstract:
|
|
|
|
WinDbg Extension Api
|
|
|
|
Environment:
|
|
|
|
User Mode.
|
|
|
|
Revision History:
|
|
|
|
Andre Vachon (andreva)
|
|
|
|
bugcheck analyzer.
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#include "mapistuff.h"
|
|
|
|
ULONG (FAR PASCAL *lpfnMAPILogon)(ULONG_PTR, LPSTR, LPSTR, FLAGS, ULONG, LPLHANDLE);
|
|
ULONG (PASCAL *lpfnMAPISendMail)(LHANDLE, ULONG_PTR, MapiMessage*, FLAGS, ULONG);
|
|
ULONG (PASCAL *lpfnMAPIResolveName)(LHANDLE, ULONG_PTR, LPTSTR, FLAGS, ULONG, MapiRecipDesc **);
|
|
ULONG (FAR PASCAL *lpfnMAPILogoff)(LHANDLE, ULONG_PTR, FLAGS, ULONG);
|
|
ULONG (FAR PASCAL *lpfnMAPIFreeBuffer)(LPVOID);
|
|
HINSTANCE hInstMapi = NULL;
|
|
|
|
BOOL SendOffFailure(
|
|
TCHAR *pszToList,
|
|
TCHAR *pszTitle,
|
|
TCHAR *pszMessage)
|
|
{
|
|
LHANDLE lhSession;
|
|
ULONG lResult = 0;
|
|
MapiMessage mmmessage;
|
|
lpMapiRecipDesc rdList = NULL;
|
|
DWORD i = 0;
|
|
|
|
memset(&mmmessage, 0, sizeof(mmmessage));
|
|
|
|
hInstMapi = LoadLibrary("Mapi32.dll");
|
|
if(hInstMapi == NULL)
|
|
{
|
|
dprintf("Unable to Load MAPI32.dll!!!\n");
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Find the addresses of functions
|
|
//
|
|
|
|
(FARPROC)lpfnMAPILogon = GetProcAddress(hInstMapi, "MAPILogon");
|
|
(FARPROC)lpfnMAPILogoff = GetProcAddress(hInstMapi, "MAPILogoff");
|
|
(FARPROC)lpfnMAPIFreeBuffer = GetProcAddress(hInstMapi, "MAPIFreeBuffer");
|
|
(FARPROC)lpfnMAPIResolveName = GetProcAddress(hInstMapi, "MAPIResolveName");
|
|
(FARPROC)lpfnMAPISendMail = GetProcAddress(hInstMapi, "MAPISendMail");
|
|
|
|
if ((lpfnMAPILogon == NULL) ||
|
|
(lpfnMAPILogoff == NULL) ||
|
|
(lpfnMAPIFreeBuffer == NULL) ||
|
|
(lpfnMAPIResolveName == NULL) ||
|
|
(lpfnMAPISendMail == NULL))
|
|
{
|
|
dprintf("Unable to Load MAPI32 entry points!!!\n");
|
|
FreeLibrary(hInstMapi);
|
|
return FALSE;
|
|
}
|
|
|
|
// Log on to existing session
|
|
lResult = lpfnMAPILogon(0, NULL, NULL, 0, 0, &lhSession);
|
|
if (lResult != SUCCESS_SUCCESS)
|
|
{
|
|
// We need outlook up and running to send mail
|
|
// Maybe I write the code to do the connect when I get some time
|
|
dprintf("Unable to Logon to an existing MAPI session. Make sure you have Outlook started!!!\n");
|
|
}
|
|
else
|
|
{
|
|
mmmessage.ulReserved = 0;
|
|
mmmessage.lpszMessageType = NULL;
|
|
mmmessage.lpszSubject = pszTitle;
|
|
mmmessage.lpszNoteText = pszMessage;
|
|
mmmessage.lpRecips = NULL;
|
|
mmmessage.flFlags = MAPI_SENT;
|
|
mmmessage.lpOriginator = NULL;
|
|
mmmessage.nFileCount = 0;
|
|
mmmessage.nRecipCount = CountRecips(pszToList);
|
|
|
|
if (mmmessage.nRecipCount == 0)
|
|
{
|
|
dprintf("No receipients in string %s\n", pszToList);
|
|
}
|
|
else
|
|
{
|
|
TCHAR *token = NULL;
|
|
DWORD index = 0;
|
|
|
|
rdList = (lpMapiRecipDesc) calloc(mmmessage.nRecipCount, sizeof (MapiRecipDesc));
|
|
if (rdList)
|
|
{
|
|
token = _tcstok(pszToList, _T(";"));
|
|
while( token != NULL )
|
|
{
|
|
lResult = lpfnMAPIResolveName(lhSession,
|
|
0,
|
|
token,
|
|
0,
|
|
0,
|
|
&mmmessage.lpRecips);
|
|
if (lResult != SUCCESS_SUCCESS)
|
|
{
|
|
dprintf("Unable to resolve %s properly! Failing Send\n", token);
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if (mmmessage.lpRecips->lpEntryID)
|
|
{
|
|
rdList[index].lpEntryID = malloc(mmmessage.lpRecips->ulEIDSize);
|
|
}
|
|
if (mmmessage.lpRecips->lpszAddress)
|
|
{
|
|
rdList[index].lpszAddress = _tcsdup(mmmessage.lpRecips->lpszAddress);
|
|
}
|
|
if (mmmessage.lpRecips->lpszName)
|
|
{
|
|
rdList[index].lpszName = _tcsdup(mmmessage.lpRecips->lpszName);
|
|
}
|
|
|
|
memcpy(rdList[index].lpEntryID, mmmessage.lpRecips->lpEntryID, mmmessage.lpRecips->ulEIDSize);
|
|
rdList[index].ulEIDSize = mmmessage.lpRecips->ulEIDSize;
|
|
rdList[index].ulRecipClass = MAPI_TO;
|
|
rdList[index].ulReserved = mmmessage.lpRecips->ulReserved;
|
|
lpfnMAPIFreeBuffer(mmmessage.lpRecips);
|
|
}
|
|
|
|
index++;
|
|
token = _tcstok(NULL, _T(";"));
|
|
}
|
|
|
|
if (token == NULL)
|
|
{
|
|
// Send the message
|
|
mmmessage.lpRecips = rdList;
|
|
lResult = lpfnMAPISendMail(lhSession, 0, &mmmessage, 0, 0);
|
|
}
|
|
|
|
// free up allocated memory.
|
|
for (i = 0; i < mmmessage.nRecipCount; i++)
|
|
{
|
|
if (rdList[i].lpEntryID)
|
|
free(rdList[i].lpEntryID);
|
|
if (rdList[i].lpszAddress)
|
|
free(rdList[i].lpszAddress);
|
|
if (rdList[i].lpszName)
|
|
free(rdList[i].lpszName);
|
|
}
|
|
|
|
free(rdList);
|
|
}
|
|
}
|
|
|
|
lpfnMAPILogoff(lhSession, 0, 0, 0);
|
|
lpfnMAPILogoff(0, lhSession, 0, 0);
|
|
}
|
|
|
|
FreeLibrary(hInstMapi);
|
|
|
|
if (lResult != SUCCESS_SUCCESS)
|
|
{
|
|
dprintf("SendMail to %s failed\n", pszToList);
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
dprintf("SendMail to %s succeeded\n", pszToList);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
DWORD CountRecips(PTCHAR pszToList)
|
|
{
|
|
DWORD i = 0;
|
|
PTCHAR ptr = pszToList;
|
|
|
|
if ((!ptr)||(ptr[0] == TEXT('\0')))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
ptr = pszToList + _tcslen(pszToList) - 1;
|
|
// rear trim
|
|
while ((ptr >= pszToList) &&
|
|
((ptr[0] == TEXT(';')) ||
|
|
(ptr[0] == TEXT(' ')) ||
|
|
(ptr[0] == TEXT('/r')) ||
|
|
(ptr[0] == TEXT('/n')) ||
|
|
(ptr[0] == TEXT('/t')) ||
|
|
(ptr[0] == TEXT(':'))))
|
|
{
|
|
ptr[0] = TEXT('\0');
|
|
ptr--;
|
|
}
|
|
|
|
ptr = pszToList;
|
|
// front trim
|
|
while ((ptr[0] == TEXT(';')) ||
|
|
(ptr[0] == TEXT(' ')) ||
|
|
(ptr[0] == TEXT('/r')) ||
|
|
(ptr[0] == TEXT('/n')) ||
|
|
(ptr[0] == TEXT('/t')) ||
|
|
(ptr[0] == TEXT(':')))
|
|
{
|
|
_tcscpy(ptr, ptr + 1);
|
|
}
|
|
|
|
// remove spaces
|
|
while (ptr = _tcschr(pszToList, TEXT(' ')))
|
|
{
|
|
_tcscpy(ptr, ptr + 1);
|
|
}
|
|
|
|
ptr = pszToList;
|
|
while (ptr = _tcschr(ptr, TEXT(';')))
|
|
{
|
|
i++;
|
|
ptr++;
|
|
}
|
|
|
|
if (!_tcslen(pszToList))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return i + 1;
|
|
}
|