#include "dkcSemiRealRandom.h"
#include "dkcOS.h"
#include "dkcStdio.h"
dkcSemiRealRandom.cのインクルード依存関係図
マクロ定義 | |
#define | dkcdSRR_PATH_SIZE (sizeof(wchar_t) * dkcdMAXPATH_BUFFER) |
型定義 | |
typedef DWORD(WINAPI * | GetTempPathA_FT )(DWORD nBufferLength, LPSTR lpBuffer) |
typedef DWORD(WINAPI * | GetTempPathW_FT )(DWORD nBufferLength, LPWSTR lpBuffer) |
typedef UINT(WINAPI * | GetTempFileNameA_FT )(LPCSTR lpPathName, LPCSTR lpPrefixString, UINT uUnique, LPSTR lpTempFileName) |
typedef UINT(WINAPI * | GetTempFileNameW_FT )(LPCWSTR lpPathName, LPCWSTR lpPrefixString, UINT uUnique, LPWSTR lpTempFileName) |
関数 | |
static DKC_INLINE int | load_dll (DKC_SEMI_REAL_RANDOM *p, BOOL isNT) |
DKC_SEMI_REAL_RANDOM *WINAPI | dkcAllocSemiRealRandomWin32 () |
DKC_SEMI_REAL_RANDOM *WINAPI | dkcAllocSemiRealRandomFromGFS (DKC_GENERIC_FILESYSTEM *pa) |
int WINAPI | dkcFreeSemiRealRandom (DKC_SEMI_REAL_RANDOM **pp) |
static DKC_INLINE int | process (DKC_GENERIC_FILESYSTEM *gfs, const void *filename) |
static BOOL | generate (DKC_SEMI_REAL_RANDOM *ptr, uint32 *value32) |
static uint32 | test (DKC_SEMI_REAL_RANDOM *ptr, size_t test_count, size_t min_, size_t max_) |
int WINAPI | dkcSemiRealRandomInit (DKC_SEMI_REAL_RANDOM *ptr) |
BOOL WINAPI | dkcSemiRealRandomGet32 (DKC_SEMI_REAL_RANDOM *ptr, uint32 *value32) |
uint8 WINAPI | dkcSemiRealRandomGet1 (DKC_SEMI_REAL_RANDOM *ptr) |
dkcSemiRealRandom.c で定義されています。
|
dkcSemiRealRandom.c の 20 行で定義されています。 参照元 dkcAllocSemiRealRandomWin32(), と dkcSemiRealRandomInit(). |
|
dkcSemiRealRandom.c の 36 行で定義されています。 |
|
dkcSemiRealRandom.c の 44 行で定義されています。 |
|
dkcSemiRealRandom.c の 23 行で定義されています。 |
|
dkcSemiRealRandom.c の 29 行で定義されています。 |
|
dkcSemiRealRandom.c の 122 行で定義されています。 参照先 dkcAllocate(), dkc_SemiRealRandom::mpObj, と NULL. 参照元 dkcAllocSemiRealRandomWin32(). 00123 { 00124 DKC_SEMI_REAL_RANDOM *p; 00125 if(NULL==pa){ 00126 return NULL; 00127 } 00128 p = dkcAllocate(sizeof(DKC_SEMI_REAL_RANDOM)); 00129 if(NULL==p){ 00130 return NULL; 00131 } 00132 p->mpObj = pa; 00133 return p; 00134 }
|
|
dkcSemiRealRandom.c の 74 行で定義されています。 参照先 dkcAlloc_SJIS_FileSystem(), dkcAlloc_UNICODE_FileSystem(), dkcAllocate(), dkcAllocSemiRealRandomFromGFS(), dkcdSRR_PATH_SIZE, dkcFreeGenericFileSystem(), dkcFreeSemiRealRandom(), load_dll(), と NULL. 00075 { 00076 DKC_SEMI_REAL_RANDOM *ptr; 00077 DKC_GENERIC_FILESYSTEM *pfs; 00078 BOOL isNT = dkcIsOSNT(); 00079 if(isNT) 00080 {//Windows NT 00081 pfs = dkcAlloc_UNICODE_FileSystem(); 00082 }else{ 00083 pfs = dkcAlloc_SJIS_FileSystem(); 00084 } 00085 00086 ptr = dkcAllocSemiRealRandomFromGFS(pfs); 00087 if(NULL==ptr){ 00088 dkcFreeGenericFileSystem(&pfs); 00089 return NULL; 00090 } 00091 //余分に確保しておく・・・ 00092 ptr->pPath = dkcAllocate(dkcdSRR_PATH_SIZE); 00093 if(NULL==ptr->pPath){ 00094 goto End; 00095 } 00096 00097 if(DKUTIL_FAILED(load_dll(ptr,isNT))){ 00098 goto End; 00099 } 00100 00101 ptr->mIsNT = isNT; 00102 //successful 00103 return ptr; 00104 End: 00105 dkcFreeSemiRealRandom(&ptr); 00106 return NULL; 00107 00108 /* 00109 DKC_SEMI_REAL_RANDOM *ptr; 00110 pfs = dkcAlloc_SJIS_FileSystem(); 00111 00112 ptr = dkcAllocSemiRealRandomFromGFS(pfs); 00113 if(NULL==ptr){ 00114 dkcFreeGenericFileSystem(&pfs); 00115 return NULL; 00116 } 00117 //successful 00118 return ptr;*/ 00119 }
|
|
dkcSemiRealRandom.c の 137 行で定義されています。 参照先 dkcFree(), dkcFreeGenericFileSystem(), dkc_SemiRealRandom::mpObj, と NULL. 参照元 dkcAllocSemiRealRandomWin32(). 00138 { 00139 DKC_SEMI_REAL_RANDOM *p = *pp; 00140 if(NULL==pp || NULL==p) 00141 return edk_FAILED; 00142 00143 dkcFreeGenericFileSystem(&(p->mpObj)); 00144 return dkcFree(pp); 00145 }
|
|
dkcSemiRealRandom.c の 326 行で定義されています。 参照先 generate(). 00327 { 00328 #ifdef WIN32 00329 uint32 val; 00330 generate(ptr,&val); 00331 return (uint8) ( (val >> ptr->mRightShift ) & 1) ; 00332 00333 #else 00334 00335 00336 #endif 00337 00338 00339 00340 }
|
|
dkcSemiRealRandom.c の 293 行で定義されています。 参照先 dkcdSEMI_REAL_RANDOM_TRIAL_AND_ERROR_LIMIT, FALSE, generate(), tmp, と TRUE. 00294 { 00295 uint32 tmp=0; 00296 uint32 val; 00297 int totalbit=0; 00298 size_t i,j; 00299 for(j=0;j<dkcdSEMI_REAL_RANDOM_TRIAL_AND_ERROR_LIMIT;j++) 00300 { 00301 if(FALSE==generate(ptr,&val)) 00302 return FALSE; 00303 00304 val = val >> ptr->mRightShift; 00305 for(i=0;i<ptr->mLeftShift;i++) 00306 { 00307 tmp+=val & 1; 00308 val=val >> 1; 00309 totalbit++; 00310 if(totalbit>=32){ 00311 *value32 = tmp; 00312 goto End; 00313 } 00314 tmp=tmp<<1; 00315 } 00316 } 00317 00318 End: 00319 if(!(j<dkcdSEMI_REAL_RANDOM_TRIAL_AND_ERROR_LIMIT)) 00320 { 00321 return FALSE; 00322 } 00323 return TRUE; 00324 }
|
|
dkcSemiRealRandom.c の 231 行で定義されています。 参照先 dkc_strcat2(), dkc_wcscat2(), dkcdMAXPATH, dkcdSEMI_REAL_RANDOM_TRIAL_AND_ERROR_LIMIT, dkcdSRR_PATH_SIZE, dkcdSRR_TEMP_FILE_NAME, dkcdSRR_TEMP_FILE_NAME_W, dkcmFORCE_NOT_ASSERT, と test(). 00232 { 00233 #ifdef WIN32 00234 00235 GetTempPathA_FT pGTPA; 00236 //char *pstr; 00237 00238 GetTempPathW_FT pGTPW; 00239 //wchar_t *pwstr; 00240 00241 if(ptr->mIsNT){ 00242 pGTPW = (GetTempPathW_FT)ptr->fpGetTempPath; 00243 dkcmFORCE_NOT_ASSERT(dkcdMAXPATH < pGTPW(0,ptr->pPath)); 00244 00245 if(pGTPW(dkcdMAXPATH,ptr->pPath)==0) 00246 return edk_FAILED; //テンポラリファイルフォルダを取得 00247 00248 //仮のテンポラリファイル。ちゃんとやるならGetTempFileNameで。 00249 if(DKUTIL_FAILED(dkc_wcscat2(ptr->pPath,dkcdSRR_PATH_SIZE,dkcdSRR_TEMP_FILE_NAME_W))) 00250 { 00251 return edk_FAILED; 00252 } 00253 00254 }else{//Win9x 00255 pGTPA = (GetTempPathA_FT)ptr->fpGetTempPath; 00256 dkcmFORCE_NOT_ASSERT(dkcdMAXPATH < pGTPA(0,ptr->pPath)); 00257 00258 if(pGTPA(dkcdMAXPATH,ptr->pPath)==0) 00259 return edk_FAILED; //テンポラリファイルフォルダを取得 00260 00261 //仮のテンポラリファイル。ちゃんとやるならGetTempFileNameで。 00262 if(DKUTIL_FAILED(dkc_strcat2(ptr->pPath,dkcdSRR_PATH_SIZE,dkcdSRR_TEMP_FILE_NAME))) 00263 { 00264 return edk_FAILED; 00265 } 00266 } 00267 { 00268 int i; 00269 for(i=0;i<dkcdSEMI_REAL_RANDOM_TRIAL_AND_ERROR_LIMIT;)//64回も行って成功しないは無いだろう・・・ 00270 { 00271 if(0xFFFFFFFF==test(ptr,128,40,60)){ 00272 i++; 00273 }else{ 00274 break; 00275 } 00276 } 00277 if(!(i<64)) 00278 { 00279 return edk_FAILED; 00280 } 00281 } 00282 00283 return edk_SUCCEEDED; 00284 #else 00285 00286 00287 #endif 00288 00289 }
|
|
dkcSemiRealRandom.c の 161 行で定義されています。 参照先 FALSE, dkc_SemiRealRandom::mpObj, process(), と TRUE. 参照元 dkcSemiRealRandomGet1(), dkcSemiRealRandomGet32(), と test(). 00161 { 00162 #ifdef WIN32 00163 DKC_INT64_STRUCT hd; 00164 uint32 temp; 00165 QueryPerformanceCounter(&hd); 00166 temp = hd.u.LowPart; 00167 00168 if(DKUTIL_FAILED(process(ptr->mpObj,ptr->pPath))){ 00169 return FALSE; 00170 } 00171 00172 QueryPerformanceCounter(&hd); 00173 *value32 = (hd.LowPart ^ temp); 00174 return TRUE; 00175 #else 00176 00177 00178 #endif 00179 }
|
|
dkcSemiRealRandom.c の 52 行で定義されています。 参照先 dkcGetProcAddress(), dkcLoadLibrary(), dkcmFORCE_NOT_ASSERT, と NULL. 参照元 dkcAllocSemiRealRandomWin32(). 00052 { 00053 DKC_DLL *pdll = dkcLoadLibrary("kernel32.dll"); 00054 if(NULL==pdll) 00055 return edk_FAILED; 00056 00057 if(isNT){ 00058 p->fpGetTempFileName = dkcGetProcAddress(pdll,"GetTempFileNameW"); 00059 p->fpGetTempPath = dkcGetProcAddress(pdll,"GetTempPathW"); 00060 }else{ 00061 p->fpGetTempFileName = dkcGetProcAddress(pdll,"GetTempFileNameA"); 00062 p->fpGetTempPath = dkcGetProcAddress(pdll,"GetTempPathA"); 00063 } 00064 //p->fpQueryPerformanceCounter = dkcGetProcAddress(pdll,"QueryPerformanceCounter"); 00065 dkcmFORCE_NOT_ASSERT( 00066 p->fpGetTempFileName == NULL || 00067 p->fpGetTempPath == NULL 00068 ); 00069 00070 p->pDLL = pdll; 00071 return edk_SUCCEEDED; 00072 }
|
|
dkcSemiRealRandom.c の 147 行で定義されています。 参照先 dkcGenericFileSystemClose(), dkcGenericFileSystemDeleteFile(), dkcGenericFileSystemOpen(), dkcGenericFileSystemWrite(), edkcBinaryMode, と edkcWriteMode. 参照元 generate(). 00147 { 00148 size_t ws; 00149 char buff[1]; 00150 int r = dkcGenericFileSystemOpen(gfs,edkcBinaryMode | edkcWriteMode,filename); 00151 if(DKUTIL_FAILED(r)) return r; 00152 00153 dkcGenericFileSystemWrite(gfs,buff,sizeof(buff),&ws); 00154 00155 dkcGenericFileSystemClose(gfs); 00156 00157 dkcGenericFileSystemDeleteFile(gfs,filename); 00158 return edk_SUCCEEDED; 00159 }
|
|
dkcSemiRealRandom.c の 182 行で定義されています。 参照先 dkcdSEMI_REAL_RANDOM_BITS, FALSE, と generate(). 00183 { 00184 uint8 bits[dkcdSEMI_REAL_RANDOM_BITS]; 00185 uint8 prior_bits[dkcdSEMI_REAL_RANDOM_BITS]; 00186 uint32 various[dkcdSEMI_REAL_RANDOM_BITS]; 00187 uint32 val; 00188 int randRshift,randLshift; 00189 int i; 00190 size_t j; 00191 00192 memset(various,0,sizeof(uint32) * dkcdSEMI_REAL_RANDOM_BITS); 00193 00194 for(j=0;j<test_count;j++) 00195 { 00196 if(FALSE==generate(ptr,&val)) 00197 return 0xFFFFFFFF; 00198 00199 for(i=0;i<dkcdSEMI_REAL_RANDOM_BITS;i++) 00200 { 00201 bits[i]=(uint8)(val & 1); 00202 val = val >> 1; 00203 various[i] += ( bits[i] != prior_bits[i] ); 00204 prior_bits[i]=bits[i]; 00205 } 00206 } 00207 00208 randRshift=255; 00209 randLshift=-1; 00210 for(i=0;i<dkcdSEMI_REAL_RANDOM_BITS;i++) 00211 { 00212 if((various[i]>=min_)&&(various[i]<=max_)) 00213 { 00214 if(i < randRshift) 00215 randRshift=i; 00216 00217 if(i >= randLshift) 00218 randLshift=i-randRshift+1; 00219 } 00220 else break; 00221 } 00222 if(randRshift==255) return 0xFFFFFFFF; 00223 if(randLshift<=0) return 0xFFFFFFFF; 00224 00225 ptr->mLeftShift = randLshift; 00226 ptr->mRightShift = randRshift; 00227 00228 return (uint32)randLshift; 00229 }
|