Extraño error, puedo imprimir el texto pero no copiarlo.

Iniciado por kworld, 29 Mayo 2010, 10:39 AM

0 Miembros y 1 Visitante están viendo este tema.

kworld

Quisiera que por favor alguien me ayudara con este código, logró obtener el texto que se necesita, pero no logro copiarlo a otro buffer.


#include <windows.h>

UCHAR* getUserSid();

int main(int argc, char *argv[])
{
   UCHAR* userSid;
   userSid = getUserSid();
   printf("%s",userSid);
   
   return 0;
 
}

UCHAR* getUserSid()
{
  HANDLE token = NULL;
  DWORD dwBufferSize = 0;
  PTOKEN_USER pTokenUser = NULL;
  HANDLE currentProcess = NULL;
  UCHAR* userSid = NULL;
 
  currentProcess = GetCurrentProcess();
  if (OpenProcessToken(currentProcess, TOKEN_QUERY, &token))
  {
     GetTokenInformation(token, TokenUser, NULL, 0, &dwBufferSize);
     pTokenUser = (PTOKEN_USER)malloc(dwBufferSize);
     memset(pTokenUser, 0, dwBufferSize);
     if (GetTokenInformation(token, TokenUser, pTokenUser, dwBufferSize, &dwBufferSize))
     {
         if (IsValidSid(pTokenUser->User.Sid))
         {
             UCHAR* localSID = NULL;
             size_t len;
             
             if (ConvertSidToStringSidA(pTokenUser->User.Sid, &localSID))
             {
                printf("%s\n",localSID); //esto se imprime bien
               
                len = strlen(localSID);
                printf("Len:%d\n",len); //esto se imprime bien
               
                userSid = (UCHAR*) malloc(len+1, sizeof(UCHAR));
                if (userSid != NULL)
                {
                  printf("memoria dinamica bien\n"); //esto se imprime bien
                  strncpy(userSid, localSID, len);
                  userSid[len] = 0;
                }
                printf("%s\n",userSid); //esto NO SE IMPRIME BIEN
                LocalFree(localSID);
             }
         }                         
     }
     free(pTokenUser);
     CloseHandle(token);
  }
  CloseHandle(currentProcess);
  return userSid;
}


nicolas_cof

#1
Mmmmm porque estas usando malloc como si fuera un calloc

userSid = (UCHAR*) malloc(len+1, sizeof(UCHAR));

tendria que quedar asi...

userSid = (UCHAR*) malloc((len+1) * sizeof(UCHAR));

No te dio ningun error al compilar?

Otra pregunta windows.h sirve para las funciones printf(), malloc() y free(), porque de no ser asi te estarias olvidando de poner las librerias..
#include <stdio.h>
#include <stdlib.h>


Salu10.

kworld

#2
gracias. Haciendo pruebas lo solucioné así:


#include <windows.h>

UCHAR* getUserSid();

int main(int argc, char *argv[])
{
   UCHAR* userSid;
   userSid = getUserSid();
   if (userSid != NULL)
   {
     printf("%s",userSid);
     free(userSid);
   }
   return 0;
}

UCHAR* getUserSid()
{
  HANDLE token = NULL;
  DWORD dwBufferSize = 0;
  PTOKEN_USER pTokenUser = NULL;
  HANDLE currentProcess = NULL;
  UCHAR* userSid = NULL;
 
  currentProcess = GetCurrentProcess();
  if (OpenProcessToken(currentProcess, TOKEN_QUERY, &token)) {
     GetTokenInformation(token, TokenUser, NULL, 0, &dwBufferSize);
     pTokenUser = (PTOKEN_USER)malloc(dwBufferSize);
     memset(pTokenUser, 0, dwBufferSize);
     if (GetTokenInformation(token, TokenUser, pTokenUser, dwBufferSize, &dwBufferSize)) {
        if (IsValidSid(pTokenUser->User.Sid)) {
           BOOL WINAPI ConvertSidToStringSidA(PSID, UCHAR*);
           ConvertSidToStringSidA(pTokenUser->User.Sid, (UCHAR*)&userSid);
        }
     }
     free(pTokenUser);
     CloseHandle(token);
  }
  CloseHandle(currentProcess);
  return userSid;
}